diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE index d200c54488..414985237d 100644 --- a/.github/ISSUE_TEMPLATE +++ b/.github/ISSUE_TEMPLATE @@ -10,6 +10,7 @@ If you're creating a bug/problem report, please include followings: * Your **ABP Framework version**. * Your **User Interface** type (Angular/MVC/React... etc.) if the issue is related to a specific UI +* Your database provider(EF Core/MongoDB) * Exception message and **stack trace** if available (check the logs). * Steps needed to **reproduce** the problem. @@ -21,4 +22,4 @@ Please use Stack Overflow for your questions about using the framework, template https://stackoverflow.com/questions/tagged/abp -Use **abp** tag in your questions. \ No newline at end of file +Use **abp** tag in your questions. diff --git a/.github/workflows/auto-pr.yml b/.github/workflows/auto-pr.yml index a657bf1a3e..c8e8663069 100644 --- a/.github/workflows/auto-pr.yml +++ b/.github/workflows/auto-pr.yml @@ -1,24 +1,24 @@ -name: Merge branch rel-4.1 with rel-4.0 +name: Merge branch dev with rel-4.1 on: push: branches: - - rel-4.0 + - rel-4.1 jobs: - merge-rel-4-1-with-rel-4-0: + merge-dev-with-rel-4-1: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: - ref: rel-4.1 + ref: dev - name: Reset promotion branch run: | - git fetch origin rel-4.0:rel-4.0 - git reset --hard rel-4.0 + git fetch origin $GITHUB_REF:$GITHUB_REF + git reset --hard $GITHUB_REF - name: Create Pull Request uses: peter-evans/create-pull-request@v3 with: - branch: auto-merge/rel-4-0/${{github.run_number}} - title: Merge branch rel-4.1 with ${{github.ref}} - body: This PR generated automatically to merge rel-4.1 with rel-4.0. Please review the changed files before merging to prevent any errors that may occur. + branch: auto-merge/rel-4-1/${{github.run_number}} + title: Merge branch dev with rel-4.1 + body: This PR generated automatically to merge dev with rel-4.1. Please review the changed files before merging to prevent any errors that may occur. reviewers: ${{github.actor}} token: ${{ github.token }} diff --git a/.gitignore b/.gitignore index b9576fda4c..407241c7fc 100644 --- a/.gitignore +++ b/.gitignore @@ -153,6 +153,7 @@ PublishScripts/ # NuGet Packages *.nupkg +*.snupkg # The packages folder can be ignored because of Package Restore **/packages/* # except build/, which is used as an MSBuild target. diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000000..d888f2a60a --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,29 @@ + + + + + 5.0.* + + + 16.8.3 + + + 4.2.2 + + + 4.0.1 + + + 2.4.1 + + + 2.4.1 + + + 2.4.3 + + + 2.2.14 + + + \ No newline at end of file diff --git a/README.md b/README.md index 0e252d936d..cd27da8fe0 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ ABP Framework is a complete **infrastructure** based on the **ASP.NET Core** to ## Getting Started -- [Getting Started Guide](https://docs.abp.io/en/abp/4.0/Getting-Started) is the easiest way to start a new web application with the ABP Framework. -- [Web Application Development Tutorial](https://docs.abp.io/en/abp/4.0/Tutorials/Part-1) is a complete tutorial to develop a full stack web application. +- [Getting Started Guide](https://docs.abp.io/en/abp/latest/Getting-Started) is the easiest way to start a new web application with the ABP Framework. +- [Web Application Development Tutorial](https://docs.abp.io/en/abp/latest/Tutorials/Part-1) is a complete tutorial to develop a full stack web application. ### Quick Start @@ -44,32 +44,32 @@ ABP provides a **full stack developer experience**. -ABP offers a complete, **modular** and **layered** software architecture based on **[Domain Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design)** principles and patterns. It also provides the necessary infrastructure and guiding to [implement this architecture](https://docs.abp.io/en/abp/4.0/Domain-Driven-Design-Implementation-Guide). +ABP offers a complete, **modular** and **layered** software architecture based on **[Domain Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design)** principles and patterns. It also provides the necessary infrastructure and guiding to [implement this architecture](https://docs.abp.io/en/abp/latest/Domain-Driven-Design-Implementation-Guide). ABP Framework is suitable for **[microservice solutions](https://docs.abp.io/en/abp/latest/Microservice-Architecture)** as well as monolithic applications. ### Infrastructure -There are a lot of features provided by the ABP Framework to achieve real world scenarios easier, like [Event Bus](https://docs.abp.io/en/abp/4.0/Event-Bus), [Background Job System](https://docs.abp.io/en/abp/4.0/Background-Jobs), [Audit Logging](https://docs.abp.io/en/abp/4.0/Audit-Logging), [BLOB Storing](https://docs.abp.io/en/abp/4.0/Blob-Storing), [Data Seeding](https://docs.abp.io/en/abp/4.0/Data-Seeding), [Data Filtering](https://docs.abp.io/en/abp/4.0/Data-Filtering), etc. +There are a lot of features provided by the ABP Framework to achieve real world scenarios easier, like [Event Bus](https://docs.abp.io/en/abp/latest/Event-Bus), [Background Job System](https://docs.abp.io/en/abp/latest/Background-Jobs), [Audit Logging](https://docs.abp.io/en/abp/latest/Audit-Logging), [BLOB Storing](https://docs.abp.io/en/abp/latest/Blob-Storing), [Data Seeding](https://docs.abp.io/en/abp/latest/Data-Seeding), [Data Filtering](https://docs.abp.io/en/abp/latest/Data-Filtering), etc. ### Cross Cutting Concerns -ABP also simplifies (and even automates wherever possible) cross cutting concerns and common non-functional requirements like [Exception Handling](https://docs.abp.io/en/abp/4.0/Exception-Handling), [Validation](https://docs.abp.io/en/abp/4.0/Validation), [Authorization](https://docs.abp.io/en/abp/4.0/Authorization), [Localization](https://docs.abp.io/en/abp/4.0/Localization), [Caching](https://docs.abp.io/en/abp/4.0/Caching), [Dependency Injection](https://docs.abp.io/en/abp/4.0/Dependency-Injection), [Setting Management](https://docs.abp.io/en/abp/4.0/Settings), etc. +ABP also simplifies (and even automates wherever possible) cross cutting concerns and common non-functional requirements like [Exception Handling](https://docs.abp.io/en/abp/latest/Exception-Handling), [Validation](https://docs.abp.io/en/abp/latest/Validation), [Authorization](https://docs.abp.io/en/abp/latest/Authorization), [Localization](https://docs.abp.io/en/abp/latest/Localization), [Caching](https://docs.abp.io/en/abp/latest/Caching), [Dependency Injection](https://docs.abp.io/en/abp/latest/Dependency-Injection), [Setting Management](https://docs.abp.io/en/abp/latest/Settings), etc. ### Application Modules ABP is a modular framework and the Application Modules provide **pre-built application functionalities**; -- [**Account**](https://docs.abp.io/en/abp/4.0/Modules/Account): Provides UI for the account management and allows user to login/register to the application. -- **[Identity](https://docs.abp.io/en/abp/4.0/Modules/Identity)**: Manages organization units, roles, users and their permissions, based on the Microsoft Identity library. -- [**IdentityServer**](https://docs.abp.io/en/abp/4.0/Modules/IdentityServer): Integrates to IdentityServer4. -- [**Tenant Management**](https://docs.abp.io/en/abp/4.0/Modules/Tenant-Management): Manages tenants for a [multi-tenant](https://docs.abp.io/en/abp/4.0/Multi-Tenancy) (SaaS) application. +- [**Account**](https://docs.abp.io/en/abp/latest/Modules/Account): Provides UI for the account management and allows user to login/register to the application. +- **[Identity](https://docs.abp.io/en/abp/latest/Modules/Identity)**: Manages organization units, roles, users and their permissions, based on the Microsoft Identity library. +- [**IdentityServer**](https://docs.abp.io/en/abp/latest/Modules/IdentityServer): Integrates to IdentityServer4. +- [**Tenant Management**](https://docs.abp.io/en/abp/latest/Modules/Tenant-Management): Manages tenants for a [multi-tenant](https://docs.abp.io/en/abp/latest/Multi-Tenancy) (SaaS) application. -See the [Application Modules](https://docs.abp.io/en/abp/4.0/Modules/Index) document for all pre-built modules. +See the [Application Modules](https://docs.abp.io/en/abp/latest/Modules/Index) document for all pre-built modules. ### Startup Templates -The [Startup templates](https://docs.abp.io/en/abp/4.0/Startup-Templates/Index) are pre-built Visual Studio solution templates. You can create your own solution based on these templates to **immediately start your development**. +The [Startup templates](https://docs.abp.io/en/abp/latest/Startup-Templates/Index) are pre-built Visual Studio solution templates. You can create your own solution based on these templates to **immediately start your development**. ## ABP Community @@ -83,11 +83,11 @@ Follow the [ABP Blog](https://blog.abp.io/) to learn the latest happenings in th ### Samples -See the [sample projects](https://docs.abp.io/en/abp/4.0/Samples/Index) built with the ABP Framework. +See the [sample projects](https://docs.abp.io/en/abp/latest/Samples/Index) built with the ABP Framework. ### Want to Contribute? -ABP is a community-driven open source project. See [the contribution guide](https://docs.abp.io/en/abp/4.0/Contribution/Index) if you want to be a part of this project. +ABP is a community-driven open source project. See [the contribution guide](https://docs.abp.io/en/abp/latest/Contribution/Index) if you want to be a part of this project. ## Official Links diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 6e3c1df3ce..32d3c16a01 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -194,6 +194,9 @@ "CoverImage": "Cover Image", "RemoveCacheConfirmationMessage": "Are you sure you remove the cache for \"{0}\" article?", "SuccessfullyRemoved": "Successfully cleared", - "RemoveCache": "Remove Cache" + "RemoveCache": "Remove Cache", + "Language": "Language", + "Optional": "Optional", + "CreateArticleLanguageInfo": "The language in which the article is written" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/es.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/es.json index 1cf2e4f365..89ef8706e0 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/es.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/es.json @@ -116,84 +116,84 @@ "UsernameOrEmailPlaceholder": "Usuario o email...", "Member": "Miembro", "PurchaseOrderNo": "Número de orden de compra", - "QuotationDate": "", - "CompanyName": "", - "CompanyAddress": "", - "Price": "", - "DiscountText": "", - "DiscountQuantity": "", - "DiscountPrice": "", - "Quotation": "", - "ExtraText": "", - "ExtraAmount": "", - "DownloadQuotation": "", - "Invoice": "", - "TaxNumber": "", - "InvoiceNumber": "", - "InvoiceDate": "", - "InvoiceNote": "", - "Quantity": "", - "AddProduct": "", - "AddProductWarning": "", - "TotalPrice": "", - "Generate": "", - "MissingQuantityField": "", - "MissingPriceField": "", - "CodeUsageStatus": "", - "Country": "", - "DeveloperCount": "", - "RequestCode": "", - "WebSite": "", - "GithubUsername": "", - "PhoneNumber": "", - "ProjectDescription": "", - "Referrer": "", - "DiscountRequests": "", - "Copylink": "", - "Disable": "", - "Enable": "", - "EnableSendEmail": "", - "SendEmail": "", - "SuccessfullyDisabled": "", - "SuccessfullyEnabled": "", - "EmailSent": "", - "SuccessfullySent": "", - "SuccessfullyDeleted": "", - "DiscountRequestDeletionWarningMessage": "", - "BusinessType": "", - "TotalQuestionCount": "", - "RemainingQuestionCount": "", - "TotalQuestionMustBeGreaterWarningMessage": "", - "QuestionCountsMustBeGreaterThanZero": "", - "UnlimitedQuestionCount": "", - "Notes": "", - "Menu:Community": "", - "Menu:Articles": "", - "Wait": "", - "Approve": "", - "Reject": "", - "Details": "", - "Url": "", - "Title": "", - "ContentSource": "", - "Status": "", - "ReadArticle": "", - "ArticleHasBeenWaiting": "", - "ArticleHasBeenApproved": "", - "ArticleHasBeenRejected": "", - "Permission:Community": "", - "Permission:CommunityArticle": "", - "Link": "", - "Enum:ContentSource:0": "", - "Enum:ContentSource:1": "", - "Enum:Status:0": "", - "Enum:Status:1": "", - "Enum:Status:2": "", - "Summary": "", - "AuthorName": "", - "CoverImage": "", - "RemoveCacheConfirmationMessage": "", - "SuccessfullyRemoved": "", + "QuotationDate": "Fecha de presupuesto", + "CompanyName": "Nombre de empresa", + "CompanyAddress": "Dirección de empresa", + "Price": "Precio", + "DiscountText": "Texto de descuento", + "DiscountQuantity": "Cantidad de descuento", + "DiscountPrice": "Precio de descuento", + "Quotation": "Presupuesto", + "ExtraText": "Texto extra", + "ExtraAmount": "Cantidad extra", + "DownloadQuotation": "Descarga el presupuesto", + "Invoice": "Factura", + "TaxNumber": "Identificación fiscal", + "InvoiceNumber": "Número de factura", + "InvoiceDate": "Fecha de factura", + "InvoiceNote": "Nota de factura", + "Quantity": "Cantidad", + "AddProduct": "Añadir producto", + "AddProductWarning": "Tu necesitas añadir un producto!", + "TotalPrice": "Precio total", + "Generate": "Generar", + "MissingQuantityField": "El campo cantidad es requerido!", + "MissingPriceField": "El campo precio es requerido!", + "CodeUsageStatus": "Estado", + "Country": "País", + "DeveloperCount": "Cuentas de desarrollo", + "RequestCode": "Solicitud de código", + "WebSite": "Sitio web", + "GithubUsername": "Nombre de usuario Github", + "PhoneNumber": "Número de teléfono", + "ProjectDescription": "Descripción del proyecto", + "Referrer": "Referente", + "DiscountRequests": "Solicitud de descuento", + "Copylink": "Copiar Link", + "Disable": "Deshabilitar", + "Enable": "Habilitar", + "EnableSendEmail": "Habilitar el envío de Email", + "SendEmail": "Enviar Email", + "SuccessfullyDisabled": "Deshabilitado correctamente", + "SuccessfullyEnabled": "Habilitado correctamente", + "EmailSent": "Email enviado", + "SuccessfullySent": "Enviado correctamente", + "SuccessfullyDeleted": "Borrado correctamente", + "DiscountRequestDeletionWarningMessage": "La solicitud de descuento será borrada", + "BusinessType": "Tipo de negocio", + "TotalQuestionCount": "Número total de preguntas", + "RemainingQuestionCount": "Número de preguntas restantes", + "TotalQuestionMustBeGreaterWarningMessage": "TotalQuestionCount debe ser mayor que RemainingQuestionCount !", + "QuestionCountsMustBeGreaterThanZero": "TotalQuestionCount y RemainingQuestionCount debe ser cero o más grande que cero !", + "UnlimitedQuestionCount": "Número de preguntas ilimitadas", + "Notes": "Notas", + "Menu:Community": "Comunidad", + "Menu:Articles": "Artículos", + "Wait": "Esperar", + "Approve": "Aprobar", + "Reject": "Rechazar", + "Details": "Detalles", + "Url": "Url", + "Title": "Título", + "ContentSource": "Fuente de contenido", + "Status": "Estado", + "ReadArticle": "Leer artículo", + "ArticleHasBeenWaiting": "El artículo ha sido puesto en espera", + "ArticleHasBeenApproved": "El artículo ha sido aprobado", + "ArticleHasBeenRejected": "El artículo ha sido rechazado", + "Permission:Community": "Comunidad", + "Permission:CommunityArticle": "Artículo", + "Link": "Link", + "Enum:ContentSource:0": "Github", + "Enum:ContentSource:1": "Externo", + "Enum:Status:0": "En espera", + "Enum:Status:1": "Rechazado", + "Enum:Status:2": "Aprobado", + "Summary": "Resumen", + "AuthorName": "Nombre del autor", + "CoverImage": "Imagen de portada", + "RemoveCacheConfirmationMessage": "¿Estás seguro que quieres borrar la caché para \"{0}\" artículo?", + "SuccessfullyRemoved": "Borrada correctamente", "RemoveCache": "" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json index b7f7cb41a5..9ac7e39b9e 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json @@ -156,6 +156,9 @@ "RemainingQuestionCount": "Kalan soru sayısı", "TotalQuestionMustBeGreaterWarningMessage": "Toplam soru sayısı kalan soru sayısından büyük olmalıdır!", "QuestionCountsMustBeGreaterThanZero": "Toplam soru sayısı ve kalan soru sayısı sıfır veya sıfırdan daha büyük olmalıdır!", - "UnlimitedQuestionCount": "Sınırsız soru sayısı" + "UnlimitedQuestionCount": "Sınırsız soru sayısı", + "Language": "Dil", + "Optional": "Opsiyonel", + "CreateArticleLanguageInfo": "Makalenin yazıldığı dil" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json index a916cd82d9..71dc425dc6 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -27,6 +27,8 @@ "Blog": "Blog", "Commercial": "Commercial", "MyAccount": "My account", + "Permission:License": "License", + "Permission:UserInfo": "Usere info", "SeeDocuments": "See Documents", "Samples": "Samples" } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/es.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/es.json index 2b210888c5..9974232511 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/es.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/es.json @@ -1,33 +1,33 @@ { "culture": "es", "texts": { - "Volo.AbpIo.Domain:010004": "", - "Volo.AbpIo.Domain:010005": "", - "Volo.AbpIo.Domain:010006": "", - "Volo.AbpIo.Domain:010007": "", - "Volo.AbpIo.Domain:010008": "", - "Volo.AbpIo.Domain:010009": "", - "Volo.AbpIo.Domain:010010": "", - "Volo.AbpIo.Domain:010011": "", - "Volo.AbpIo.Domain:010012": "", - "Volo.AbpIo.Domain:020001": "", - "Volo.AbpIo.Domain:020002": "", - "Volo.AbpIo.Domain:020003": "", - "Volo.AbpIo.Domain:020004": "", - "WantToLearn?": "", - "ReadyToGetStarted?": "", - "JoinOurCommunity": "", - "GetStartedUpper": "", - "ForkMeOnGitHub": "", - "Features": "", - "GetStarted": "", - "Documents": "", - "Community": "", - "ContributionGuide": "", - "Blog": "", - "Commercial": "", - "MyAccount": "", - "SeeDocuments": "", - "Samples": "" + "Volo.AbpIo.Domain:010004": "Número máximo de miembros alcanzado!", + "Volo.AbpIo.Domain:010005": "Número máximo de propietarios alcanzado!", + "Volo.AbpIo.Domain:010006": "Este usuario ya es un propietario de esta organización!", + "Volo.AbpIo.Domain:010007": "Este usuario ya es un desarrollador en este organización!", + "Volo.AbpIo.Domain:010008": "Número de desarrolladores permitido no puede ser menor que el número actual de desarrolladores!", + "Volo.AbpIo.Domain:010009": "El número de desarrolladores no puede ser menor que cero!", + "Volo.AbpIo.Domain:010010": "Número máximo de dirección mac excedido!", + "Volo.AbpIo.Domain:010011": "Una licencia personal no puede tener más de un desarrollador!", + "Volo.AbpIo.Domain:010012": "La licencia no puede ser extendida un mes despues de que expire!", + "Volo.AbpIo.Domain:020001": "Este paquete NPM no pudo ser borrado porque \"{NugetPackages}\" paquetes Nuget son dependientes de este paquete.", + "Volo.AbpIo.Domain:020002": "Este paquete NPM no pudo ser borrado porque \"{Modules}\" modulos están usando este paquete.", + "Volo.AbpIo.Domain:020003": "Este paquete NPM no pudo ser borrado porque \"{Modules}\" modulos están usando este paquete.y \"{NugetPackages}\" paquetes Nuget son dependientes de este paquete.", + "Volo.AbpIo.Domain:020004": "Este paquete Nuget no pudo ser borrado porque \"{Modules}\" modulos están usando este paquete.", + "WantToLearn?": "¿Quieres aprender?", + "ReadyToGetStarted?": "¿Preparado para comenzar?", + "JoinOurCommunity": "Unete a nuestra comunidad", + "GetStartedUpper": "COMENZAR", + "ForkMeOnGitHub": "Fork en GitHub", + "Features": "Características", + "GetStarted": "Comenzar", + "Documents": "Documentos", + "Community": "Comunidad", + "ContributionGuide": "Guia de contribución", + "Blog": "Blog", + "Commercial": "Comercial", + "MyAccount": "Mi cuenta", + "SeeDocuments": "Ver documentos", + "Samples": "Ejemplos" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index e029499b06..c6eb1ad645 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -32,6 +32,8 @@ "MyProfile": "My profile", "EmailNotValid": "Please enter a valid email address.", "JoinOurMarketingNewsletter": "Join our marketing newsletter", - "WouldLikeToReceiveMarketingMaterials": "I would like to receive marketing materials like product deals & special offers." + "WouldLikeToReceiveMarketingMaterials": "I would like to receive marketing materials like product deals & special offers.", + "StartUsingYourLicenseNow": "Start using your license now!", + "WelcomePage": "Welcome Page" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json index 7aa24608d4..80647e85e9 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json @@ -1,35 +1,35 @@ { "culture": "es", "texts": { - "OrganizationManagement": "", - "OrganizationList": "", - "Volo.AbpIo.Commercial:010003": "", - "OrganizationNotFoundMessage": "", - "DeveloperCount": "", - "QuestionCount": "", - "Unlimited": "", - "Owners": "", - "AddMember": "", - "AddOwner": "", - "AddDeveloper": "", - "UserName": "", - "Name": "", - "EmailAddress": "", - "Developers": "", + "OrganizationManagement": "Gestión de la organización", + "OrganizationList": "Lista organización", + "Volo.AbpIo.Commercial:010003": "Tu no eres el propietario de esta organización!", + "OrganizationNotFoundMessage": "Organización no encontrada!", + "DeveloperCount": "Total desarrolladores asignados", + "QuestionCount": "Total de preguntas restantes", + "Unlimited": "Ilimitado", + "Owners": "Propietarios", + "AddMember": "Añadir miembro", + "AddOwner": "Añadir propietario", + "AddDeveloper": "Añadir desarrollador", + "UserName": "Nombre de usuario", + "Name": "Nombre", + "EmailAddress": "Dirección de Email", + "Developers": "Desarrolladores", "LicenseType": "Tipo de licencia", - "Manage": "", - "StartDate": "", - "EndDate": "", + "Manage": "Gestionar", + "StartDate": "Fecha de inicio", + "EndDate": "Fecha de fin", "Modules": "Módulos", - "LicenseExtendMessage": "", - "LicenseUpgradeMessage": "", - "LicenseAddDeveloperMessage": "", - "Volo.AbpIo.Commercial:010004": "", - "MyOrganizations": "", - "ApiKey": "", - "UserNameNotFound": "", - "SuccessfullyAddedToNewsletter": "", - "MyProfile": "", - "EmailNotValid": "" + "LicenseExtendMessage": "Tu fecha de finalización de tu licencia ha sido extendido a {0}", + "LicenseUpgradeMessage": "Tu licencia esta actualizada a {0}", + "LicenseAddDeveloperMessage": "{0} desarrolladores añadidos a tu licencia", + "Volo.AbpIo.Commercial:010004": "No se pudo encontrar el usuario especificado. El usuario debe estar ya registrado.", + "MyOrganizations": "Mis organizaciones", + "ApiKey": "API Key", + "UserNameNotFound": "No hay un usuario con el nombre de usuario {0}", + "SuccessfullyAddedToNewsletter": "Gracias por suscribirte a nuestro boletín de noticias!", + "MyProfile": "Mi perfil", + "EmailNotValid": "Por favor, introduce una dirección de email válida." } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/de-DE.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/de-DE.json index cc8d76012c..0db3c9b29b 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/de-DE.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/de-DE.json @@ -43,13 +43,13 @@ "GoToTheArticle": "Gehe zum Beitrag", "Contribute": "Beitragen", "OverallProgress": "Gesamtfortschritt", - "Done": "Ferig", + "Done": "Fertig", "Open": "Offen", "Closed": "Geschlossen", "LatestQuestionOnThe": "Letzte Frage zum", "Stackoverflow": "Stackoverflow", "Votes": "Stimmen", - "Answer": "Antworten", + "Answer": "Antwort", "Views": "Ansichten", "Answered": "Beantwortet", "WaitingForYourAnswer": "Warten auf Ihre Antwort", @@ -60,9 +60,9 @@ "QuestionItemErrorMessage": "Die neuesten Fragendetails konnten von Stackoverflow nicht abgerufen werden.", "Oops": "Hoppla!", "CreateArticleSuccessMessage": "Der Beitrag wurde erfolgreich eingereicht. Er wird nach einer Überprüfung durch den Site-Administrator veröffentlicht.", - "ChooseCoverImage": "Wählen Sie ein Titelbild ...", + "ChooseCoverImage": "Ein Titelbild auswählen...", "CoverImage": "Titelbild", - "ShareYourExperiencesWithTheABPFramework": "Teilen Sie Ihre Erfahrungen mit dem ABP Framework!", + "ShareYourExperiencesWithTheABPFramework": "Ihre Erfahrungen mit dem ABP Framework teilen!", "Optional": "Optional", "UpdateUserWebSiteInfo": "Beispiel: https://johndoe.com", "UpdateUserTwitterInfo": "Beispiel: johndoe", @@ -83,8 +83,8 @@ "LatestBlogPost": "Letzter Blog-Beitrag", "Edit": "Bearbeiten", "ProfileImageChange": "Ändern Sie das Profilbild", - "BlogItemErrorMessage": "Die neuesten Blogpost-Details konnten von ABP nicht abgerufen werden.", + "BlogItemErrorMessage": "Die neuesten Blogpost-Details konnten nicht abgerufen werden.", "PlannedReleaseDate": "Geplantes Erscheinungsdatum", "CommunityArticleRequestErrorMessage": "Die Anfrage nach den neuesten Beiträgen von Github konnte nicht abgerufen werden." } -} \ No newline at end of file +} diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json index c570e6fb1e..a29355b401 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/en.json @@ -99,6 +99,8 @@ "Marketing": "Marketing", "CommunityPrivacyPolicyConfirmation": "I agree to the Terms & Conditions and Privacy Policy.", "ArticleRequestMessageTitle": "Open an issue on the GitHub to request an article/tutorial you want to see on this web site.", - "ArticleRequestMessageBody": "Here, the list of the requested articles by the community. Do you want to write a requested article? Please click to the request and join to the discussion." + "ArticleRequestMessageBody": "Here, the list of the requested articles by the community. Do you want to write a requested article? Please click to the request and join to the discussion.", + "Language": "Language", + "CreateArticleLanguageInfo": "The language in which the article is written" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/es.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/es.json index d495720a93..433de31852 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/es.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/es.json @@ -1,90 +1,90 @@ { "culture": "es", "texts": { - "Permission:CommunityArticle": "", - "Permission:Edit": "", - "Waiting": "", - "Approved": "", - "Rejected": "", - "Wait": "", - "Approve": "", - "Reject": "", - "ReadArticle": "", - "Status": "", - "ContentSource": "", - "Details": "", - "Url": "", - "Title": "", - "CreationTime": "", + "Permission:CommunityArticle": "Artículo de comunidad", + "Permission:Edit": "Editar", + "Waiting": "Esperando", + "Approved": "Aprobado", + "Rejected": "Rechazado", + "Wait": "Esperar", + "Approve": "Aprobar", + "Reject": "Rechazar", + "ReadArticle": "Leer artículo", + "Status": "Estado", + "ContentSource": "Fuente de contenido", + "Details": "Detalles", + "Url": "Url", + "Title": "Título", + "CreationTime": "Fecha de creación", "Save": "Guardar", - "SameUrlAlreadyExist": "", - "UrlIsNotValid": "", - "UrlNotFound": "", - "UrlContentNotFound": "", - "Summary": "", - "MostRead": "", - "Latest": "", - "ContributeAbpCommunity": "", - "SubmitYourArticle": "", - "ContributionGuide": "", - "BugReport": "", - "SeeAllArticles": "", - "WelcomeToABPCommunity!": "", - "MyProfile": "", - "MyOrganizations": "", - "EmailNotValid": "", - "FeatureRequest": "", - "CreateArticleTitleInfo": "", - "CreateArticleUrlInfo": "", - "CreateArticleSummaryInfo": "", - "CreateArticleCoverInfo": "", - "ThisExtensionIsNotAllowed": "", - "TheFileIsTooLarge": "", - "GoToTheArticle": "", - "Contribute": "", - "OverallProgress": "", - "Done": "", - "Open": "", - "Closed": "", - "LatestQuestionOnThe": "", - "Stackoverflow": "", - "Votes": "", - "Answer": "", - "Views": "", - "Answered": "", - "WaitingForYourAnswer": "", - "Asked": "", - "AllQuestions": "", - "NextVersion": "", - "MilestoneErrorMessage": "", - "QuestionItemErrorMessage": "", - "Oops": "", - "CreateArticleSuccessMessage": "", - "ChooseCoverImage": "", - "CoverImage": "", - "ShareYourExperiencesWithTheABPFramework": "", - "Optional": "", - "UpdateUserWebSiteInfo": "", - "UpdateUserTwitterInfo": "", - "UpdateUserGithubInfo": "", - "UpdateUserLinkedinInfo": "", - "UpdateUserCompanyInfo": "", - "UpdateUserJobTitleInfo": "", - "UserName": "", - "Company": "", - "PersonalWebsite": "", - "RegistrationDate": "", - "Social": "", - "Biography": "", - "HasNoPublishedArticlesYet": "", - "Author": "", - "LatestGithubAnnouncements": "", - "SeeAllAnnouncements": "", + "SameUrlAlreadyExist": "La url ya existe si tu quieres añadir este artículo, tu debes cambiar la url!", + "UrlIsNotValid": "Url no es valida", + "UrlNotFound": "Url no encontrada", + "UrlContentNotFound": "Contenido de la Url no encontrado", + "Summary": "Resumen", + "MostRead": "Más leído", + "Latest": "Últimos", + "ContributeAbpCommunity": "Contribuye a la comunidad ABP", + "SubmitYourArticle": "Envía tu artículo", + "ContributionGuide": "Guía de contribución", + "BugReport": "Informe de errores", + "SeeAllArticles": "Ver todos los artículos", + "WelcomeToABPCommunity!": "Bienvenido a la comunidad ABP", + "MyProfile": "Mi perfil", + "MyOrganizations": "Mis organizaciones", + "EmailNotValid": "Por favor entra una dirección de email válida.", + "FeatureRequest": "Solucitud de característica", + "CreateArticleTitleInfo": "Título del artículo para ser mostrado en la lista de artículos.", + "CreateArticleUrlInfo": "Url original del artículo GitHub/ Externo", + "CreateArticleSummaryInfo": "Un pequeño resumen del artículo para ser mostrado en la lista de artículos.", + "CreateArticleCoverInfo": "Para crear un artículo eficaz, agregue una foto de portada. Cargue imágenes con una relación de aspecto de 16: 9 para obtener la mejor vista.", + "ThisExtensionIsNotAllowed": "Esta extensión no está permitida.", + "TheFileIsTooLarge": "El fichero es demasiado grande.", + "GoToTheArticle": "Ir a el artículo", + "Contribute": "Contribuir", + "OverallProgress": "Progreso general", + "Done": "Hecho", + "Open": "Abrir", + "Closed": "Cerrado", + "LatestQuestionOnThe": "Última pregunta en la", + "Stackoverflow": "Stackoverflow", + "Votes": "Votos", + "Answer": "Respuesta", + "Views": "Vistas", + "Answered": "Respondido", + "WaitingForYourAnswer": "Esperando tu respuesta", + "Asked": "Preguntado", + "AllQuestions": "Todas las preguntas", + "NextVersion": "Siguiente versión", + "MilestoneErrorMessage": "No se pudieron obtener los detalles del hito actual en Github.", + "QuestionItemErrorMessage": "no se pudieron obtener los detalles de pregunta actual en Stackoverflow.", + "Oops": "Oops!", + "CreateArticleSuccessMessage": "El artículo se ha enviado correctamente. Se publicará después de una revisión del administrador del sitio.", + "ChooseCoverImage": "Elige una imagen de portada...", + "CoverImage": "Imagen de portada", + "ShareYourExperiencesWithTheABPFramework": "Comparte tus experiencias con el ABP Framework!", + "Optional": "Opcional", + "UpdateUserWebSiteInfo": "Ejemplo: https://johndoe.com", + "UpdateUserTwitterInfo": "Ejemplo: johndoe", + "UpdateUserGithubInfo": "Ejemplo: johndoe", + "UpdateUserLinkedinInfo": "Ejemplo: https://www.linkedin.com/...", + "UpdateUserCompanyInfo": "Ejemplo: Volosoft", + "UpdateUserJobTitleInfo": "Ejemplo: desarrollador de software", + "UserName": "Nombre de usuario", + "Company": "Empresa", + "PersonalWebsite": "Sitio web personal", + "RegistrationDate": "Fecha de registro", + "Social": "Social", + "Biography": "Biografía", + "HasNoPublishedArticlesYet": "No has publicado articules todavía", + "Author": "Autor", + "LatestGithubAnnouncements": "Últimas notificaciones de Github", + "SeeAllAnnouncements": "Ver todos las notificaciones", "LatestBlogPost": "", - "Edit": "", - "ProfileImageChange": "", - "BlogItemErrorMessage": "", - "PlannedReleaseDate": "", - "CommunityArticleRequestErrorMessage": "" + "Edit": "Editar", + "ProfileImageChange": "Cambiar la imagen de perfil", + "BlogItemErrorMessage": "No se pudo obtener los detalles del último blog desde ABP.", + "PlannedReleaseDate": "Fecha de entrega planificada", + "CommunityArticleRequestErrorMessage": "No se pudo obtener la última petición de artículo desde Github" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json index 492229d6bb..e1dd405851 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json @@ -184,6 +184,14 @@ "ABPCLIExamplesInfo": "new command creates a layered MVC application with Entity Framework Core as the database provider. However, it has additional options. Examples:", "SeeCliDocumentForMoreInformation": "See the ABP CLI document for more options or select the \"Direct Download\" tab above.", "Optional": "Optional", - "LocalFrameworkRef": "Keep local project reference for the framework packages." + "LocalFrameworkRef": "Keep local project reference for the framework packages.", + "BlobStoring": "BLOB Storing", + "BlobStoringExplanation": "BLOB Storing system provides an abstraction to work with BLOBs. ABP provides some pre-built storage provider integrations (Azure, AWS, File System, Database, etc.) that you can easily use in your applications.", + "TextTemplating": "Text Templating", + "TextTemplatingExplanation": "Text templating is used to dynamically render contents based on a template and a model (a data object). For example, you can use it to create dynamic email contents with a pre-built template.", + "MultipleUIOptions": "Multiple UI Options", + "MultipleDBOptions": "Multiple Database Providers", + "MultipleUIOptionsExplanation": "The core framework is designed as UI independent and can work with any type of UI system, while there are multiple pre-built and integrated options are provided out of the box.", + "MultipleDBOptionsExplanation": "The framework can work with any data source, while the following providers are officially developed and supported;" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/es.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/es.json index 76132f71ba..3c36634f56 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/es.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/es.json @@ -1,189 +1,189 @@ { "culture": "es", "texts": { - "GetStarted": "", - "Create": "", - "NewProject": "", - "DirectDownload": "", - "ProjectName": "", - "ProjectType": "", - "DatabaseProvider": "", - "NTier": "", - "IncludeUserInterface": "", - "CreateNow": "", - "TheStartupProject": "", - "Tutorial": "", - "UsingCLI": "", - "SeeDetails": "", - "AbpShortDescription": "", - "SourceCodeUpper": "", - "LatestReleaseLogs": "", - "Infrastructure": "", - "Architecture": "", - "Modular": "", - "DontRepeatYourself": "", - "DeveloperFocused": "", - "FullStackApplicationInfrastructure": "", + "GetStarted": "Comencemos - Plantillas de inicio", + "Create": "Crear", + "NewProject": "Nuevo proyecto", + "DirectDownload": "Descarga directa", + "ProjectName": "Nombre de proyecto", + "ProjectType": "Tipo de proyecto", + "DatabaseProvider": "Proveedor de base de datos", + "NTier": "N-Capas", + "IncludeUserInterface": "Incluir interface de usuario", + "CreateNow": "Crear ahora", + "TheStartupProject": "El proyecto de inicio", + "Tutorial": "Tutorial", + "UsingCLI": "Usando CLI", + "SeeDetails": "Ver detalles", + "AbpShortDescription": "ABP Framework es una completa infraestructure para crear modernas aplicaciones web que sigue las mejores prácticas y convenciones de desarrollo de software.", + "SourceCodeUpper": "CÓDIGO FUENTE", + "LatestReleaseLogs": "Últimos registros de lanzamiento", + "Infrastructure": "infraestructura", + "Architecture": "Arquitectura", + "Modular": "Modular", + "DontRepeatYourself": "No te repitas tu mismo", + "DeveloperFocused": "Pensado para el desarrollador", + "FullStackApplicationInfrastructure": "infraestructura de aplicación Full stack", "DomainDrivenDesign": "", - "DomainDrivenDesignExplanation": "", - "Authorization": "", - "AuthorizationExplanation": "", - "MultiTenancy": "", - "MultiTenancyExplanationShort": "", - "CrossCuttingConcerns": "", - "CrossCuttingConcernsExplanationShort": "", - "BuiltInBundlingMinification": "", - "BuiltInBundlingMinificationExplanation": "", - "VirtualFileSystem": "", - "VirtualFileSystemExplanation": "", - "Theming": "", - "ThemingExplanationShort": "", - "BootstrapTagHelpersDynamicForms": "", + "DomainDrivenDesignExplanation": "Diseñado y desarrollado basandose en los patrones y principios de DDD. Promorciona una capa de modelo para tus aplicaciones.", + "Authorization": "Autorización", + "AuthorizationExplanation": "Sistema de autorización avanzado con usuarios, roles y permisos de granularidad-fina. Construido sobre la librería Microsoft Identity.", + "MultiTenancy": "Multi-inquilino", + "MultiTenancyExplanationShort": "Aplicaciones SaaS sencillas!, integradas con multi-inquilino desde la base de datos hasta la UI.", + "CrossCuttingConcerns": "Requerimientos comunes", + "CrossCuttingConcernsExplanationShort": "Completa infraestructura de autorización, validación, manejo de excepciones, caching, auditoría, gestión de transacciones y más.", + "BuiltInBundlingMinification": "Empaquetado y minificado integrado", + "BuiltInBundlingMinificationExplanation": "No se necesitan usar herramientas externas para el empaquetado y minificado. ABP ofrece un camino simple, dinámico, potente, modular e integrado.", + "VirtualFileSystem": "Sistema de ficheros virtual", + "VirtualFileSystemExplanation": "Incrusta vistas, scripts, estilos, imágenes en paquetes/ librerias y reusalos en diferentes aplicaciones.", + "Theming": "Temas", + "ThemingExplanationShort": "Usa y personaliza la UI estandar basada en bootstrap o crea tu propio tema.", + "BootstrapTagHelpersDynamicForms": "Boostrap Tag Helpers y formularios dinámicos", "BootstrapTagHelpersDynamicFormsExplanation": "", - "HTTPAPIsDynamicProxies": "", - "HTTPAPIsDynamicProxiesExplanation": "", - "CompleteArchitectureInfo": "", - "DomainDrivenDesignBasedLayeringModelExplanation": "", - "DomainDrivenDesignBasedLayeringModelExplanationCont": "", - "MicroserviceCompatibleModelExplanation": "", - "MicroserviceCompatibleModelExplanationCont": "", - "ModularInfo": "", - "PreBuiltModulesThemes": "", - "PreBuiltModulesThemesExplanation": "", - "NuGetNPMPackages": "", - "NuGetNPMPackagesExplanation": "", - "ExtensibleReplaceable": "", - "ExtensibleReplaceableExplanation": "", - "CrossCuttingConcernsExplanation2": "", - "CrossCuttingConcernsExplanation3": "", - "AuthenticationAuthorization": "", - "ExceptionHandling": "", - "Validation": "", - "DatabaseConnection": "", - "TransactionManagement": "", - "AuditLogging": "", - "Caching": "", - "Multitenancy": "", - "DataFiltering": "", - "ConventionOverConfiguration": "", - "ConventionOverConfigurationExplanation": "", - "ConventionOverConfigurationExplanationList1": "", - "ConventionOverConfigurationExplanationList2": "", - "ConventionOverConfigurationExplanationList3": "", - "ConventionOverConfigurationExplanationList4": "", - "ConventionOverConfigurationExplanationList5": "", - "ConventionOverConfigurationExplanationList6": "", - "BaseClasses": "", - "BaseClassesExplanation": "", - "DeveloperFocusedExplanation": "", - "DeveloperFocusedExplanationCont": "", - "SeeAllFeatures": "", - "CLI_CommandLineInterface": "", - "CLI_CommandLineInterfaceExplanation": "", - "StartupTemplates": "", - "StartupTemplatesExplanation": "", - "BasedOnFamiliarTools": "", - "BasedOnFamiliarToolsExplanation": "", - "ORMIndependent": "", - "ORMIndependentExplanation": "", - "Features": "", - "ABPCLI": "", - "Modularity": "", - "BootstrapTagHelpers": "", - "DynamicForms": "", - "BundlingMinification": "", + "HTTPAPIsDynamicProxies": "HTTP APIs y proxies dinámicos", + "HTTPAPIsDynamicProxiesExplanation": "Expon servicios de aplicación como REST HTPP APIs y consumelos dinámicamente desde proxies JavaScript y C#.", + "CompleteArchitectureInfo": "Arquitectura moderna para crear soluciones software sostenibles.", + "DomainDrivenDesignBasedLayeringModelExplanation": "Ayuda a implementar ", + "DomainDrivenDesignBasedLayeringModelExplanationCont": "Promorciona plantillas de inicio, clases base, servicios, documentación y guías de ayuda para desarrollar tu aplicación basada en patrones y principios DDD.", + "MicroserviceCompatibleModelExplanation": "El núcleo del framework y los modules pre-construidos están diseñados con una arquitectura microservicios en mente.", + "MicroserviceCompatibleModelExplanationCont": "Proporciona la infraestructura, integraciones, ejemplos y documentación para implementar soluciones microservicios más facilmente, mientras no trae complejidad adicional si quieres una aplicación monolítica.", + "ModularInfo": "ABP proporciona un sistema de modulos que te permite desarrollar modulos de aplicacion resusables. Conectado en el ciclo de eventos de aplicación y mínimas dependencias entre las partes principales de tu sistema.", + "PreBuiltModulesThemes": "Modulos y temas integrados", + "PreBuiltModulesThemesExplanation": "Módulos y temas de código abierto y comerciales preparados para usar en tu aplicación de negocio.", + "NuGetNPMPackages": "Paquetes Nuget y NPM", + "NuGetNPMPackagesExplanation": "Paquetes distribuidos a través de Nuget y NPM para instalar y actualizar.", + "ExtensibleReplaceable": "Extensible/ Reemplazable", + "ExtensibleReplaceableExplanation": "Todos los serivios y módulos están diseñados para ser extensibles. Tu puedes reemplazar servicios, páginas, estilos y componentes.", + "CrossCuttingConcernsExplanation2": "Mantiene tu código base más pequeño y te permite enforcate en el código que es especifico en tu negocio.", + "CrossCuttingConcernsExplanation3": "No pierdas tiempo implementando requerimientos comunes de aplicación en múltiples proyectos.", + "AuthenticationAuthorization": "Autenticación y autorización", + "ExceptionHandling": "Manejo de excepciones.", + "Validation": "Validación", + "DatabaseConnection": "Conexión a la base de datos", + "TransactionManagement": "Gestión de transacciones", + "AuditLogging": "Registro de auditoría", + "Caching": "Caché", + "Multitenancy": "Multi-inquilino", + "DataFiltering": "Filtrado de datos", + "ConventionOverConfiguration": "Convención sobre la configuración", + "ConventionOverConfigurationExplanation": "ABP implementa comunes convenciones de aplicación por defecto con una mínima o nula configuración.", + "ConventionOverConfigurationExplanationList1": "Los registradores conocen los servicios para la inyección de dependencias.", + "ConventionOverConfigurationExplanationList2": "Expone servicios de aplicación como APIs HTTP mediante convenciones de nomenclatura.", + "ConventionOverConfigurationExplanationList3": "Crea clientes proxies HTTP dinámicos para C# y JavaScript.", + "ConventionOverConfigurationExplanationList4": "Proporciona repositorios por defecto para tus entidades.", + "ConventionOverConfigurationExplanationList5": "Maneja Unit of Work por cada petición web o metodo de servicio de aplicación.", + "ConventionOverConfigurationExplanationList6": "Publica, crea, actualiza y borra eventos para tus entidades.", + "BaseClasses": "Clase base", + "BaseClassesExplanation": "Clases base integradas para patrones comunes de aplicación.", + "DeveloperFocusedExplanation": "ABP es para desarrolladores.", + "DeveloperFocusedExplanationCont": "Su objetivo es simplificar su desarrollo diario de software sin restringirle la escritura de código de bajo nivel.", + "SeeAllFeatures": "Ver todas las características", + "CLI_CommandLineInterface": "CLI (Command Line Interface)", + "CLI_CommandLineInterfaceExplanation": "Incluye un CLI que te ayuda a automatizar la creación de nuevos proyectos y añadir nuevos módulos.", + "StartupTemplates": "Plantillas de inicio", + "StartupTemplatesExplanation": "Varias plantillas de inicio proporcionan una solución completamente configurada lista para comenzar el desarrollo.", + "BasedOnFamiliarTools": "Basado en herramientas familiares", + "BasedOnFamiliarToolsExplanation": "Construido y diseñado con herramientas populares que tu ya conoces. Baja curva de aprendizaje, facil adaptación y desarrollo confortable.", + "ORMIndependent": "Independiente del ORM", + "ORMIndependentExplanation": "El núcleo del core es independiente del ORM/ base de datos y puedes trabajar con cualquier fuente de datos. Entity Framework Core y MongoDB están actualmente disponibles.", + "Features": "Explora las características de ABP Framework", + "ABPCLI": "ABP CLI", + "Modularity": "Modularidad", + "BootstrapTagHelpers": "Bootstrap Tag Helpers", + "DynamicForms": "Formularios dinámicos", + "BundlingMinification": "Empaquetado y Minimificación", "BackgroundJobs": "", - "BackgroundJobsExplanation": "", - "DDDInfrastructure": "", - "DomainDrivenDesignInfrastructure": "", - "AutoRESTAPIs": "", - "DynamicClientProxies": "", - "DistributedEventBus": "", - "DistributedEventBusWithRabbitMQIntegration": "", - "TestInfrastructure": "", - "AuditLoggingEntityHistories": "", - "ObjectToObjectMapping": "", - "ObjectToObjectMappingExplanation": "", - "EmailSMSAbstractions": "", - "EmailSMSAbstractionsWithTemplatingSupport": "", - "Localization": "", - "SettingManagement": "", - "ExtensionMethods": "", - "ExtensionMethodsHelpers": "", - "AspectOrientedProgramming": "", - "DependencyInjection": "", - "DependencyInjectionByConventions": "", - "ABPCLIExplanation": "", - "ModularityExplanation": "", - "MultiTenancyExplanation": "", - "MultiTenancyExplanation2": "", - "MultiTenancyExplanation3": "", - "MultiTenancyExplanation4": "", - "BootstrapTagHelpersExplanation": "", - "DynamicFormsExplanation": "", - "AuthenticationAuthorizationExplanation": "", - "CrossCuttingConcernsExplanation": "", - "DatabaseConnectionTransactionManagement": "", - "CorrelationIdTracking": "", - "BundlingMinificationExplanation": "", - "VirtualFileSystemnExplanation": "", - "ThemingExplanation": "", - "DomainDrivenDesignInfrastructureExplanation": "", - "Specification": "", - "Repository": "", - "DomainService": "", - "ValueObject": "", - "ApplicationService": "", - "DataTransferObject": "", - "AggregateRootEntity": "", - "AutoRESTAPIsExplanation": "", - "DynamicClientProxiesExplanation": "", - "DistributedEventBusWithRabbitMQIntegrationExplanation": "", - "TestInfrastructureExplanation": "", - "AuditLoggingEntityHistoriesExplanation": "", - "EmailSMSAbstractionsWithTemplatingSupportExplanation": "", - "LocalizationExplanation": "", - "SettingManagementExplanation": "", - "ExtensionMethodsHelpersExplanation": "", - "AspectOrientedProgrammingExplanation": "", - "DependencyInjectionByConventionsExplanation": "", - "DataFilteringExplanation": "", - "PublishEvents": "", - "HandleEvents": "", - "AndMore": "", - "Code": "", - "Result": "", - "SeeTheDocumentForMoreInformation": "", - "IndexPageHeroSection": "", - "UiFramework": "", - "EmailAddress": "", - "Mobile": "", - "ReactNative": "", - "Strong": "", - "Complete": "", - "BasedLayeringModel": "", - "Microservice": "", - "Compatible": "", - "MeeTTheABPCommunityInfo": "", - "JoinTheABPCommunityInfo": "", - "AllArticles": "", - "SubmitYourArticle": "", - "DynamicClientProxyDocument": "", - "EmailSMSAbstractionsDocument": "", - "CreateProjectWizard": "", - "TieredOption": "", - "SeparateIdentityServerOption": "", - "UseslatestPreVersion": "", - "ReadTheDocumentation": "", - "Documentation": "", - "GettingStartedTutorial": "", - "ApplicationDevelopmentTutorial": "", - "TheStartupTemplate": "", - "InstallABPCLIInfo": "", - "DifferentLevelOfNamespaces": "", - "ABPCLIExamplesInfo": "", - "SeeCliDocumentForMoreInformation": "", - "Optional": "", - "LocalFrameworkRef": "" + "BackgroundJobsExplanation": "Defina clases simples para ejecutar trabajos en segundo plano como en cola. Utilice el administrador de trabajos integrado o integre el suyo propio. Hangfire & RabbitMQ integraciones están actualmente disponibles.", + "DDDInfrastructure": "infraestructura DSS", + "DomainDrivenDesignInfrastructure": "infraestructura Domain Driven Design", + "AutoRESTAPIs": "Auto REST APIs", + "DynamicClientProxies": "Clientes proxies dinámicos", + "DistributedEventBus": "Bus de eventos distribuido", + "DistributedEventBusWithRabbitMQIntegration": "Bus de eventos distribuido con la integración RabbitMQ ", + "TestInfrastructure": "infraestructura de Test", + "AuditLoggingEntityHistories": "Registro de auditoría y historial de entidades", + "ObjectToObjectMapping": "Mapeado objeto a objeto", + "ObjectToObjectMappingExplanation": "Mapeado objeto a objeto abstracción integrada con AutoMapper.", + "EmailSMSAbstractions": "Abstracciones para Email y SMS", + "EmailSMSAbstractionsWithTemplatingSupport": "Abstracciones para Email y SMS con soporte para plantillas", + "Localization": "Localización", + "SettingManagement": "Gestión de la configuración", + "ExtensionMethods": "Extension Methods", + "ExtensionMethodsHelpers": "Extension Methods & Helpers", + "AspectOrientedProgramming": "Programación orientada a aspectos", + "DependencyInjection": "Inyección de dependencias", + "DependencyInjectionByConventions": "Inyección de dependencias por convenciones", + "ABPCLIExplanation": "ABP CLI (Command Line Interface) es una herramienta en línea de comandos que proporciona ciertas tareas comunes para soluciones basadas en ABP.", + "ModularityExplanation": "ABP proporciona una infraestructura completa para construir tu propios módulos de aplicación que pueden contener entidades, servicios, base de datos integradas, APIs, componentes de UI y otros...", + "MultiTenancyExplanation": "ABP framework no sólo soporta el desarrollo de aplicaciones multi-inquilino, si no también hace que tu código no tenga que preocuparse de multi-inquilino.", + "MultiTenancyExplanation2": "Puedes determinar automaticamente el inquilino actual, y aislar los datos de diferentes inquilinos entre sí. ", + "MultiTenancyExplanation3": "Soporta base de datos única, base de datos por inquilino y enfoques híbridos.", + "MultiTenancyExplanation4": "Enfocate en tu código y deja al framework que maneje multi-inquilino en tu nombre.", + "BootstrapTagHelpersExplanation": "En vez de escribir repetidamente los detalle de componentes bootstrap, usa ABP's tag helpers para simplificarlo y obtener ventaja de intellisence. Tu puedes definitivamente usar Bootstrp cuando tu lo necesites.", + "DynamicFormsExplanation": "Los formularios dinámicos y tag helpers de entrada pueden crear el formulario completo a partir de una clase de C# como modelo. ", + "AuthenticationAuthorizationExplanation": "Autenticación enriquecidad y opciones de autorización integradas con ASP.NET Core Identity & IdentityServer4. Proporciona un extensible y detallado sistema de permisos.", + "CrossCuttingConcernsExplanation": "No te repitas tu mismo al implementar todas esas cosas comunes una y otra vez. Enfocate en tu negocio y permite a ABP automatizarlos por convención.", + "DatabaseConnectionTransactionManagement": "Conexión de base de datos y gestión de transacciones", + "CorrelationIdTracking": "Correlation-Id de seguimiento", + "BundlingMinificationExplanation": "ABP ofrece un sistema simple, dinámico, potente, modular y empaquetado & minificación ", + "VirtualFileSystemnExplanation": "El sistema de archivos virtuales permite administrar archivos que no existen físicamente en el sistema de archivos (disco). Se utiliza principalmente para incrustar (js, css, image, cshtml...) en ensamblados y utilizarlos como archivos físicos en tiempo de ejecución.", + "ThemingExplanation": "El sistema de temas permite desarrollar el tema de su aplicación y módulos independiente mediante la definición de un conjunto de bibliotecas y diseños base comunes, basado en el último marco de Trabajo bootstrap.", + "DomainDrivenDesignInfrastructureExplanation": "Una infraestructura completa para crear aplicaciones en capas basadas en los patrones y principios DDD", + "Specification": "Especificación", + "Repository": "Repositorios", + "DomainService": "Servicio de dominio", + "ValueObject": "Objetos de valor", + "ApplicationService": "Servicio de aplicación", + "DataTransferObject": "Objetos de transferencia de datos", + "AggregateRootEntity": "Agregado ráiz, Entidad", + "AutoRESTAPIsExplanation": "ABP puede configurar automáticamente los servicios de aplicación como controladores de API por convención.", + "DynamicClientProxiesExplanation": "Consuma fácilmente sus API de clientes de JavaScript y C#", + "DistributedEventBusWithRabbitMQIntegrationExplanation": "Publique y consuma eventos distribuidos fácilmente mediante el bus de eventos distribuido integrado con la integración RabbitMQ disponible.", + "TestInfrastructureExplanation": "El framework se ha desarrollado unitariamente y pruebas de integración. Proporciona clases base para que sea más fácil. Las plantillas de inicio vienen preconfiguradas para las pruebas.", + "AuditLoggingEntityHistoriesExplanation": "Registro de auditoría integrado para aplicaciones críticas para el negocio. Registro de auditorías de solicitud, servicio, nivel de método e historiales de entidades con detalles de nivel de propiedad.", + "EmailSMSAbstractionsWithTemplatingSupportExplanation": "Las abstracciones IEmailSender e ISmsSender desacoplan la lógica de la aplicación de la infraestructura. El sistema avanzado de plantillas de correo electrónico permite crear y localizar plantillas de correo electrónico y utilizarlas fácilmente cuando sea necesario.", + "LocalizationExplanation": "El sistema de localización permite crear recursos en archivos JSON sin formato y utilizarlos para localizar la interfaz de usuario. Admite escenarios avanzados como herencia, extensiones e integración de JavaScript, mientras que es totalmente compatible con el sistema de localización de AspNet Core.", + "SettingManagementExplanation": "Defina la configuración de la aplicación y obtenga valores en tiempo de ejecución en función de la configuración actual, el inquilino y el usuario.", + "ExtensionMethodsHelpersExplanation": "No te repitas ni siquiera para partes de código triviales. Extensiones y ayudantes para tipos estándar hace que su código sea mucho más limpio y fácil de escribir.", + "AspectOrientedProgrammingExplanation": "Proporciona una infraestructura cómoda para crear servidores proxy dinámicos e implementar la programación orientada a aspectos. Interceptar cualquier clase y ejecutar el código antes y después de cada ejecución del método.", + "DependencyInjectionByConventionsExplanation": "No es necesario registrar las clases en la inserción de dependencias manualmente. Registra automáticamente los tipos de servicio comunes por convención. Para otro tipo de servicios, puede utilizar interfaces y atributos para que sea más fácil y in situ.", + "DataFilteringExplanation": "Definir y usar filtros de datos que se aplican automáticamente al consultar entidades desde la base de datos. Los filtros Soft Delete & MultiTenant se proporcionan de fábrica cuando se implementan interfaces sencillas.", + "PublishEvents": "Publicar eventos", + "HandleEvents": "Manejar eventos", + "AndMore": "y más...", + "Code": "Código", + "Result": "Resultado", + "SeeTheDocumentForMoreInformation": "Ver el {0} documento para más información.", + "IndexPageHeroSection": "Código fuente abiertoWeb Application
Framework
para asp.net core", + "UiFramework": "UI Framework", + "EmailAddress": "Dirección de correo", + "Mobile": "Móvil", + "ReactNative": "React Nativo", + "Strong": "Fuerte", + "Complete": "Completar", + "BasedLayeringModel": "Módelo basado en capas", + "Microservice": "Microservicio", + "Compatible": "Compatible", + "MeeTTheABPCommunityInfo": "Nuestra misión es crear un entorno en el que los desarrolladores puedan ayudarse entre sí con artículos, tutoriales, estudios de casos, etc. y conocer personas de ideas afines.", + "JoinTheABPCommunityInfo": "¡Participe en una comunidad vibrante y conviértase en colaborador del Marco ABP!", + "AllArticles": "Todos los artículos", + "SubmitYourArticle": "Envía tu artículo", + "DynamicClientProxyDocument": "Ver la documentación del cliente proxy dinámico para JavaScript & C#.", + "EmailSMSAbstractionsDocument": "Ver los documentos de emailing y envío SMS para más información.", + "CreateProjectWizard": "Este asistente crea un nuevo proyecto a partir de la plantilla de inicio que está correctamente configurado para comenzar con su proyecto.", + "TieredOption": "Crea una solución por niveles en la que las capas de API Web y HTTP están separadas físicamente. Si no se marca, crea una solución en capas que es menos compleja y adecuada para la mayoría de los escenarios.", + "SeparateIdentityServerOption": "Separa el lado del servidor en dos aplicaciones: la primera es para el servidor de identidad y la segunda es para la API HTTP del lado del servidor.", + "UseslatestPreVersion": "Usar la última versión pre-release", + "ReadTheDocumentation": "LeerLa Documentación", + "Documentation": "Documentación", + "GettingStartedTutorial": "Tutorial para iniciarse", + "ApplicationDevelopmentTutorial": "Tutorial de desarrollo de aplicación", + "TheStartupTemplate": "La Plantilla de Inicio", + "InstallABPCLIInfo": "ABP CLI es la forma más rápida de iniciar una nueva solución con el marco ABP. Instale la CLI de ABP mediante una ventana de línea de comandos:", + "DifferentLevelOfNamespaces": "Tu puedes usar diferentes niveles de espacio de nombres; ej. BookStore, Acme.BookStore or Acme.Retail.BookStore.", + "ABPCLIExamplesInfo": "nuevo comando crea una aplicación MVC por capas con Entity Framework Core como proveedor de base de datos. Sin embargo, tiene distintas opciones. Ejemplos:", + "SeeCliDocumentForMoreInformation": "Ver el documento ABP CLI para más opciones o selecciona la \"Direct Download\" pestaña de arriba.", + "Optional": "Opcional", + "LocalFrameworkRef": "Mantén la referencia al proyecto local para los paquetes del framework." } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json index 4dcb0cad51..6e9d9bf0da 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/zh-Hans.json @@ -184,6 +184,13 @@ "ABPCLIExamplesInfo": "new命令创建一个 分层的MVC应用程序 使用 Entity Framework Core 做为数据库提供程序. 它还有其他选项. 示例:", "SeeCliDocumentForMoreInformation": "参阅 ABP CLI 文档 获得更多选项或选择上方的 \"直接下载\" 标签.", "Optional": "可选的", - "LocalFrameworkRef": "保留框架包的本地项目引用." + "LocalFrameworkRef": "保留框架包的本地项目引用.", + "BlobStoring": "BLOB存储", + "BlobStoringExplanation": "BLOB存储系统提供了BLOB的抽象. ABP提供了一些预构建的存储提供程序集成(Azure,AWS,文件系统,数据库等),你可以轻松的在你的应用程序中使用它们.", + "TextTemplating": "文本模板", + "TextTemplatingExplanation": "文本模板是基于模板和模型(数据对象)使用动态渲染内容. 例如你可以使用预构建的模板来创建动态的电子邮件内容.", + "MultipleUIOptions": "多个UI选项", + "MultipleDBOptions": "多个数据库提供程序", + "MultipleUIOptionsExplanation": "核心框架设计为独立与UI,可以和任何类型的UI系统一起使用. 同时提供了多个开箱即用的预构建集成选项." } } \ No newline at end of file diff --git a/common.DotSettings b/common.DotSettings index 7edbd05e75..5c1cda48fd 100644 --- a/common.DotSettings +++ b/common.DotSettings @@ -29,6 +29,7 @@ Never Never Never + True True True False diff --git a/common.props b/common.props index cc8cf10402..39ce965ec0 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ latest - 4.0.2 + 4.1.0-rc.2 $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ @@ -9,8 +9,16 @@ git https://github.com/abpframework/abp/ true + + + true + snupkg + - + + all + runtime; build; native; contentfiles; analyzers + diff --git a/docs/en/Blob-Storing.md b/docs/en/Blob-Storing.md index f477e6178a..63281a5ee6 100644 --- a/docs/en/Blob-Storing.md +++ b/docs/en/Blob-Storing.md @@ -21,7 +21,7 @@ The ABP Framework has already the following storage provider implementations; * [Azure](Blob-Storing-Azure.md): Stores BLOBs on the [Azure BLOB storage](https://azure.microsoft.com/en-us/services/storage/blobs/). * [Aliyun](Blob-Storing-Aliyun.md): Stores BLOBs on the [Aliyun Storage Service](https://help.aliyun.com/product/31815.html). * [Minio](Blob-Storing-Minio.md): Stores BLOBs on the [MinIO Object storage](https://min.io/). -* [Aws](Blob-Storing-Aws.md): Stores BLOBs on the[Amazon Simple Storage Service](https://min.io/). +* [Aws](Blob-Storing-Aws.md): Stores BLOBs on the[Amazon Simple Storage Service](https://aws.amazon.com/s3/). More providers will be implemented by the time. You can [request](https://github.com/abpframework/abp/issues/new) it for your favorite provider or [create it yourself](Blob-Storing-Custom-Provider.md) and [contribute](Contribution/Index.md) to the ABP Framework. diff --git a/docs/en/Blog-Posts/2020-11-12 v4_0_Preview/POST.md b/docs/en/Blog-Posts/2020-11-12 v4_0_Preview/POST.md index acd3c70b2f..03e3d31f97 100644 --- a/docs/en/Blog-Posts/2020-11-12 v4_0_Preview/POST.md +++ b/docs/en/Blog-Posts/2020-11-12 v4_0_Preview/POST.md @@ -1,23 +1,23 @@ # ABP Framework 4.0 RC Has Been Published based on .NET 5.0! -Today, we have released the [ABP Framework](https://abp.io/) (and the [ABP Commercial](https://commercial.abp.io/)) `4.0.0-rc.1` that is based on the **.NET 5.0**. This blog post introduces the new features and important changes in the new version. +Today, we have released the [ABP Framework](https://abp.io/) (and the [ABP Commercial](https://commercial.abp.io/)) 4.0.0 RC that is based on the **.NET 5.0**. This blog post introduces the new features and important changes in the new version. > **The planned release date for the [4.0.0 final](https://github.com/abpframework/abp/milestone/45) version is November 26, 2020**. -## Get Started with the 4.0 RC.1 +## Get Started with the 4.0 RC -If you want to try the version `4.0.0-rc.1` today, follow the steps below; +If you want to try the version `4.0.0` today, follow the steps below; -1) **Upgrade** the ABP CLI to the version `4.0.0-rc.1` using a command line terminal: +1) **Upgrade** the ABP CLI to the version `4.0.0-rc.3` using a command line terminal: ````bash -dotnet tool update Volo.Abp.Cli -g --version 4.0.0-rc.1 +dotnet tool update Volo.Abp.Cli -g --version 4.0.0-rc.3 ```` **or install** if you haven't installed before: ````bash -dotnet tool install Volo.Abp.Cli -g --version 4.0.0-rc.1 +dotnet tool install Volo.Abp.Cli -g --version 4.0.0-rc.3 ```` 2) Create a **new application** with the `--preview` option: diff --git a/docs/en/Blog-Posts/2020-12-04 v4_0_Release_Stable/POST.md b/docs/en/Blog-Posts/2020-12-04 v4_0_Release_Stable/POST.md new file mode 100644 index 0000000000..840b5585fd --- /dev/null +++ b/docs/en/Blog-Posts/2020-12-04 v4_0_Release_Stable/POST.md @@ -0,0 +1,87 @@ +# ABP.IO Platform 4.0 with .NET 5.0 in the 4th Year! + +Today, we are extremely happy to release ABP Framework 4.0 with **.NET 5.0 support**! + +## 4 Years of Work + +As a nice coincidence, today is the **4th year** since the first commit made in the [abp repository](https://github.com/abpframework/abp)! So, we can say "*Happy Birthday ABP Framework!*". + +![abp-contribution-graph-4-years](abp-contribution-graph-4-years.png) + +### Some Statistics + +ABP.IO Platform and the ABP Community is growing. Here, a summary of these 4 years. + +From GitHub, only from the main [abp repository](https://github.com/abpframework/abp); + +* **15,297 commits** done. +* **3,764 issues** are closed. +* **2,133 pull requests** are merged. +* **158 contributors**. +* **88 releases** published. +* **5.2K stars** on GitHub. + +From NuGet & NPM; + +* **220 NuGet** packages & **52 NPM** packages. +* **1,000,000 downloads** only for the core NuGet package. + +From Website; + +* **200,000 visitors**. +* **1,000,000+ sessions**. + +## What's New With 4.0? + +Since all the new features are already explained in details with the [4.0 RC Announcement Post](https://blog.abp.io/abp/ABP.IO-Platform-v4.0-RC-Has-Been-Released-based-on-.NET-5.0), I will not repeat all the details again. Please read [the RC post](https://blog.abp.io/abp/ABP.IO-Platform-v4.0-RC-Has-Been-Released-based-on-.NET-5.0) for **new feature and changes** you may need to do for your solution while upgrading to the version 4.0. + +Here, a brief list of major features and changes; + +* Migrated to **.NET 5.0**. +* Stable **Blazor** UI. +* Moved to **System.Text.Json**. +* Upgraded to **IdentityServer** version 4.0. +* **WPF** startup template. + +## Creating New Solutions + +You can create a new solution with the ABP Framework version 4.0 by either using the `abp new` command or using the **direct download** tab on the [get started page](https://abp.io/get-started). + +> See the [getting started document](https://docs.abp.io/en/abp/latest/Getting-Started) for details. + +## How to Upgrade an Existing Solution + +This is a **major version** and requires some **manual work**, especially related to **.NET 5.0** and **IdentityServer** 4.0 upgrades. + +* See the [MIGRATION GUIDE](https://docs.abp.io/en/abp/latest/Migration-Guides/Abp-4_0) that covers all the details about the upgrade progress. + +* You can also see the [upgrading document](https://docs.abp.io/en/abp/latest/Upgrading). + +## New Guides / Documents + +We are constantly improving the documentation. Our purpose is not only document the ABP Framework, but also write architectural and practical guides for developers. + +### Implementing Domain Driven Design + +[Implementing Domain Driven Design](https://docs.abp.io/en/abp/latest/Domain-Driven-Design-Implementation-Guide) is a practical guide for they want to implement the DDD principles in their solutions. While the implementation details rely on the ABP Framework infrastructure, core concepts, principles and patterns are applicable in any kind of solution, even if it is not a .NET solution. + +![ddd-implementation-guide-sample](ddd-implementation-guide-sample.png) + +### Testing + +The new [Testing document](https://docs.abp.io/en/abp/latest/Testing) discusses different kind of automated tests and explains how you can write tests for your ABP based solutions. + +### UI Documents + +We've created a lot of documents for the [MVC](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Overall), [Blazor](https://docs.abp.io/en/abp/latest/UI/Blazor/Overall) and the [Angular](https://docs.abp.io/en/abp/latest/UI/Angular/Quick-Start) UI. + +## About the Next Version + +The next versions 4.1 will mostly focus on; + +* Improving current features. +* Complete module features for the Blazor UI. +* Improve developer experience and productivity. +* More documentation and examples. + +Planned preview date for the version **4.1 is December 17, 2020**. See the [Road Map](https://docs.abp.io/en/abp/latest/Road-Map) document and [GitHub Milestones](https://github.com/abpframework/abp/milestones) to learn what's planned for the next versions. We are trying to be clear about the coming features and the next release dates. \ No newline at end of file diff --git a/docs/en/Blog-Posts/2020-12-04 v4_0_Release_Stable/abp-contribution-graph-4-years.png b/docs/en/Blog-Posts/2020-12-04 v4_0_Release_Stable/abp-contribution-graph-4-years.png new file mode 100644 index 0000000000..cb778d8dfe Binary files /dev/null and b/docs/en/Blog-Posts/2020-12-04 v4_0_Release_Stable/abp-contribution-graph-4-years.png differ diff --git a/docs/en/Blog-Posts/2020-12-04 v4_0_Release_Stable/ddd-implementation-guide-sample.png b/docs/en/Blog-Posts/2020-12-04 v4_0_Release_Stable/ddd-implementation-guide-sample.png new file mode 100644 index 0000000000..3aab36e979 Binary files /dev/null and b/docs/en/Blog-Posts/2020-12-04 v4_0_Release_Stable/ddd-implementation-guide-sample.png differ diff --git a/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/POST.md b/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/POST.md new file mode 100644 index 0000000000..4154bf7241 --- /dev/null +++ b/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/POST.md @@ -0,0 +1,202 @@ +# ABP Framework 4.1 RC Has Been Published + +Today, we have released the [ABP Framework](https://abp.io/) (and the [ABP Commercial](https://commercial.abp.io/)) 4.1.0 RC. This blog post introduces the new features and important changes in this new version. + +> **The planned release date for the [4.1.0 final](https://github.com/abpframework/abp/milestone/47) version is January 4, 2021**. + +## Get Started with the 4.1 RC + +If you want to try the version `4.1.0` today, follow the steps below; + +1) **Upgrade** the ABP CLI to the version `4.1.0-rc.1` using a command line terminal: + +````bash +dotnet tool update Volo.Abp.Cli -g --version 4.1.0-rc.1 +```` + +**or install** if you haven't installed before: + +````bash +dotnet tool install Volo.Abp.Cli -g --version 4.1.0-rc.1 +```` + +2) Create a **new application** with the `--preview` option: + +````bash +abp new BookStore --preview +```` + +See the [ABP CLI documentation](https://docs.abp.io/en/abp/latest/CLI) for all the available options. + +> You can also use the *Direct Download* tab on the [Get Started](https://abp.io/get-started) page by selecting the **Preview checkbox**. + +## Breaking Changes + +This version has a minor breaking change if you'd injected a repository by class. This is not a problem for 99% of the applications. However, see [#6677](https://github.com/abpframework/abp/issues/6677) for the solution if that's a breaking change for you. + +## What's new with the ABP Framework 4.1 + +### Module Entity Extensions + +Module Entity Extension system provides a simple way of adding new properties to an existing entity defined by a module that is used by your application. This feature is now available also for the open source modules (identity and tenant-management). [The documentation](https://docs.abp.io/en/abp/latest/Module-Entity-Extensions) has been moved into the ABP Framework's documentation. + +**Example: Add "SocialSecurityNumber" property to the `IdentityUser` entity** + +````csharp +ObjectExtensionManager.Instance.Modules() + .ConfigureIdentity(identity => + { + identity.ConfigureUser(user => + { + user.AddOrUpdateProperty( //property type: string + "SocialSecurityNumber", //property name + property => + { + //validation rules + property.Attributes.Add(new RequiredAttribute()); + property.Attributes.Add( + new StringLengthAttribute(64) { + MinimumLength = 4 + } + ); + + //...other configurations for this property + } + ); + }); + }); +```` + +The new property becomes available on the UI, API and the database. You can even define navigation properties. This provides an easy way to extend existing modules while using them as NuGet packages. See [the document](https://docs.abp.io/en/abp/latest/Module-Entity-Extensions) for details. + +### Blazor UI Improvements + +Since the Blazor UI is relatively new in the ABP Framework, we continue to add features and make enhancements to fill the gap between other supported UI types. + +#### Bundling & Minification + +In the version 4.1, we had introduced the `abp bundle` command for the Blazor UI to add global script and style files of the depended modules into the `index.html`. It was a preparation for a real bundling & minification system. With the version 4.2, this command has been completed. + +Whenever you add a new module to your Blazor application, just type the `abp bundle` command in a command line terminal; + +* It finds all the global script/style files in your application and the modules your application directly or indirectly depends on, ordered by the module dependencies. +* Bundles all the scripts into a single file and minified the file (same for the styles). +* Add the single bundle file to the `index.html` file. + +Added a configuration into the `appsettings.json` file in the Blazor application in the application startup template to control the bundling mode: + +````js +{ + "AbpCli": { + "Bundle": { + "Mode": "BundleAndMinify" + } + } +} +```` + +Possible values are; + +* `BundleAndMinify`: Bundle all the files into a single file and minify the content. +* `Bundle`: Bundle all files into a single file, but not minify. +* `None`: Add files individually, do not bundle. + +See the [Global Scripts & Styles](https://docs.abp.io/en/abp/4.1/UI/Blazor/Global-Scripts-Styles) document for details. + +#### SubmitButton + +`SubmitButton` is a new component that simplifies to save a form: + +````html + +```` + +The main advantages of using this component instead of a standard `Button` with submit type is; It automatically blocks the submit button until the save operation has fully completed. This prevents multiple clicks by user. And it is shorter than doing all manually. See the [document](https://docs.abp.io/en/abp/4.1/UI/Blazor/SubmitButton). + +#### Other Blazor UI highlights + +* Implemented some **animations** (like opening/closing modals and dropdowns). +* Automatically **focus** to the first input when you open a modal form. + +Module extensibility system (mentioned above) for the Blazor UI is under development and not available yet. + +## What's new with the ABP Commercial 4.1 + +### Blazor UI Improvements + +We continue to complete missing modules and functionalities for the Blazor UI. + +#### Organization Unit Management + +Organization Management UI has been implemented for the Blazor UI. Example screenshot: + +![blazor-organization-units](blazor-organization-units.png) + +#### IdentityServer UI + +IdentityServer Management UI is also available for the Blazor UI now: + +![blazor-identityserver-ui](blazor-identityserver-ui.png) + +### Suite: Navigation Property Selection with Typeahead + +We had introduced auto-complete select style navigation property selection. With this release, it is fully supported by all the UI options. So, when you create an CRUD page with ABP Suite for entity that has 1 to Many relation to another entity, you can simply select the target entity with a typeahead style select component. Example screenshot: + +![type-ahead](type-ahead.png) + +### Spanish Language Translation + +We continue to add new language supports for the UI. In this version, translated the UI to **Spanish** language. + +![spanish-commercial-translation](spanish-commercial-translation.png) + +### Coming: Public Website with Integrated CMS Features + +In the next version, the application startup template will come with a public website application option. CMS Kit module will be installed in the website by default, that means newsletter, contact form, comments and some other new features will be directly usable in your applications. + +An early screenshot from the public website application home page: + +![abp-commercial-public-website](abp-commercial-public-website.png) + +## Other News + +### ABP Community Contents + +A lot of new contents have been published in the ABP Community Web Site in the last two weeks: + +* [How to Integrate the Telerik Blazor Components to the ABP Blazor UI](https://community.abp.io/articles/how-to-integrate-the-telerik-blazor-components-to-the-abp-blazor-ui-q8g31abb) by [EngincanV](https://github.com/EngincanV) +* [Using DevExpress Blazor UI Components With the ABP Framework](https://community.abp.io/articles/using-devexpress-blazor-ui-components-with-the-abp-framework-wrpoa8rw) by [@berkansasmaz](https://github.com/berkansasmaz) +* [Creating a new UI theme by copying the Basic Theme (for MVC UI)](https://community.abp.io/articles/creating-a-new-ui-theme-by-copying-the-basic-theme-for-mvc-ui-yt9b18io) by [@ebubekirdinc](https://github.com/ebubekirdinc) +* [Using Angular Material Components With the ABP Framework](https://community.abp.io/members/muhammedaltug) by [@muhammedaltug](https://github.com/muhammedaltug) +* [How to export Excel files from the ABP framework](https://community.abp.io/articles/how-to-export-excel-files-from-the-abp-framework-wm7nnw3n) by [bartvanhoey](https://github.com/bartvanhoey) +* [Creating an Event Organizer Application with the ABP Framework & Blazor UI](https://community.abp.io/articles/creating-an-event-organizer-application-with-the-blazor-ui-wbe0sf2z) by [@hikalkan](https://github.com/hikalkan) + +Thanks to all of the contributors. We are waiting for your contributions too. If you want to create content for the ABP Community, please visit [community.abp.io](https://community.abp.io/) website and submit your article. + +#### Be a Superhero on Day 1 with ABP.IO + +Thanks to [@lprichar](http://github.com/lprichar) prepared an awesome introduction video for the ABP.IO Platform: "[Be a Superhero on Day 1 with ABP.IO](https://www.youtube.com/watch?v=ea0Zx9DLcGA)". + +#### New Sample Application: Event Organizer + +This is a new example application developed using the ABP Framework and the Blazor UI. See [this article](https://community.abp.io/articles/creating-an-event-organizer-application-with-the-blazor-ui-wbe0sf2z) for a step by step implementation guide. + +![event-list-ui](event-list-ui.png) + +### Github Discussions + +We enabled the [GitHub Discussions for the abp repository](https://github.com/abpframework/abp/discussions) as another place to discuss ideas or get help for the ABP Framework. The ABP core team is spending time participating in discussions and answering to questions as much as possible. + +## About the Next Release(s) + +Beginning from the next version (4.2.0), we are starting to spend more effort on the **CMS Kit module**. The purpose of this module is to provide CMS primitives (e.g. **comments, tags, reactions, contents**...) and features (e.g. **blog, pages, surveys**) as pre-built and reusable components. Current blog module will be a part of the CMS Kit module. + +We will continue to prepare documents, guides, tutorials and examples. And surely, we will continue to make enhancements and optimizations on the current features. + +> The planned preview release date for the version 4.2.0 is January 14, 2021 and the final (stable) version release date is January 28, 2021. + +Follow the [GitHub milestones](https://github.com/abpframework/abp/milestones) for all the planned ABP Framework version release dates. + +## Feedback + +Please check out the ABP Framework 4.1.0 RC and [provide feedback](https://github.com/abpframework/abp/issues/new) to help us to release a more stable version. **The planned release date for the [4.1.0 final](https://github.com/abpframework/abp/milestone/45) version is January 4, 2021**. diff --git a/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/abp-commercial-public-website.png b/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/abp-commercial-public-website.png new file mode 100644 index 0000000000..8f01a9b385 Binary files /dev/null and b/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/abp-commercial-public-website.png differ diff --git a/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/blazor-identityserver-ui.png b/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/blazor-identityserver-ui.png new file mode 100644 index 0000000000..8bb53d5d6b Binary files /dev/null and b/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/blazor-identityserver-ui.png differ diff --git a/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/blazor-organization-units.png b/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/blazor-organization-units.png new file mode 100644 index 0000000000..5db13d61a2 Binary files /dev/null and b/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/blazor-organization-units.png differ diff --git a/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/event-list-ui.png b/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/event-list-ui.png new file mode 100644 index 0000000000..4f049c2339 Binary files /dev/null and b/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/event-list-ui.png differ diff --git a/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/spanish-commercial-translation.png b/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/spanish-commercial-translation.png new file mode 100644 index 0000000000..ab6ca06719 Binary files /dev/null and b/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/spanish-commercial-translation.png differ diff --git a/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/type-ahead.png b/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/type-ahead.png new file mode 100644 index 0000000000..7eabb748fd Binary files /dev/null and b/docs/en/Blog-Posts/2020-12-18 v4_1_Preview/type-ahead.png differ diff --git a/docs/en/CLI.md b/docs/en/CLI.md index d51dd91b5d..2e7b117799 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -129,6 +129,7 @@ abp update [options] * `--solution-path` or `-sp`: Specify the solution path. Use the current directory by default * `--solution-name` or `-sn`: Specify the solution name. Search `*.sln` files in the directory by default. * `--check-all`: Check the new version of each package separately. Default is `false`. +* `--version` or `-v`: Specifies the version to use for update. If not specified, latest version is used. ### add-package @@ -418,4 +419,4 @@ abp bundle [options] * ```--working-directory``` or ```-wd```: Specifies the working directory. This option is useful when executing directory doesn't contain a Blazor project file. * ```--force``` or ```-f```: Forces to build project before generating references. -For more details about managing style and script references in Blazor apps, see [Managing Global Scripts & Styles](UI/Blazor/Global-Scripts-Styles.md) \ No newline at end of file +`bundle` command reads the `appsettings.json` file inside the Blazor project for bundling options. For more details about managing style and script references in Blazor apps, see [Managing Global Scripts & Styles](UI/Blazor/Global-Scripts-Styles.md) \ No newline at end of file diff --git a/docs/en/Community-Articles/2020-04-19-Customize-the-SignIn-Manager/POST.md b/docs/en/Community-Articles/2020-04-19-Customize-the-SignIn-Manager/POST.md index 1342407880..9ae426624f 100644 --- a/docs/en/Community-Articles/2020-04-19-Customize-the-SignIn-Manager/POST.md +++ b/docs/en/Community-Articles/2020-04-19-Customize-the-SignIn-Manager/POST.md @@ -71,7 +71,8 @@ public async override Task GetE ?? provider; return new Microsoft.AspNetCore.Identity.ExternalLoginInfo(auth.Principal, provider, providerKey, providerDisplayName) { - AuthenticationTokens = auth.Properties.GetTokens() + AuthenticationTokens = auth.Properties.GetTokens(), + AuthenticationProperties = auth.Properties }; } ```` diff --git a/docs/en/Community-Articles/2020-04-27-Use-Azure-Active-Directory-Authentication-for-MVC-Razor-Page-Applications/POST.md b/docs/en/Community-Articles/2020-04-27-Use-Azure-Active-Directory-Authentication-for-MVC-Razor-Page-Applications/POST.md index c7b0258d55..146d250d1f 100644 --- a/docs/en/Community-Articles/2020-04-27-Use-Azure-Active-Directory-Authentication-for-MVC-Razor-Page-Applications/POST.md +++ b/docs/en/Community-Articles/2020-04-27-Use-Azure-Active-Directory-Authentication-for-MVC-Razor-Page-Applications/POST.md @@ -6,9 +6,9 @@ Adding Azure Active Directory is pretty straightforward in ABP framework. Couple Two different **alternative approaches** for AzureAD integration will be demonstrated for better coverage. -1. **AddAzureAD**: This approach uses Microsoft [AzureAD UI nuget package](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.AzureAD.UI/) which is very popular when users search the web about how to integrate AzureAD to their web application. - +1. ~~**AddAzureAD**: This approach uses Microsoft [AzureAD UI nuget package](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.AzureAD.UI/) which is very popular when users search the web about how to integrate AzureAD to their web application.~~ Now marked **Obsolete** (see https://github.com/aspnet/Announcements/issues/439). 2. **AddOpenIdConnect**: This approach uses default [OpenIdConnect](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.OpenIdConnect/) which can be used for not only AzureAD but for all OpenId connections. +3. **AddMicrosoftIdentityWebAppAuthentication:** This approach uses newly introduced [Microsoft.Identity.Web nuget package](https://www.nuget.org/packages/Microsoft.Identity.Web/) to replace AddAzureAD. > There is **no difference** in functionality between these approaches. AddAzureAD is an abstracted way of OpenIdConnection ([source](https://github.com/dotnet/aspnetcore/blob/c56aa320c32ee5429d60647782c91d53ac765865/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADAuthenticationBuilderExtensions.cs#L122)) with predefined cookie settings. > @@ -134,13 +134,50 @@ private void ConfigureAuthentication(ServiceConfigurationContext context, IConfi And that's it, integration is completed. Keep on mind that you can connect any other external authentication providers. +## 3. AddMicrosoftIdentityWebAppAuthentication + +With .Net 5.0, AzureAd is marked [obsolete](https://github.com/dotnet/aspnetcore/issues/25807) and will not be supported in the near future. However its expanded functionality is available in [microsoft-identity-web](https://github.com/AzureAD/microsoft-identity-web/wiki) packages. + +Add (or replace with) the new nuget package Microsoft.Identity.Web nuget package](https://www.nuget.org/packages/Microsoft.Identity.Web/). + +In your **.Web** project; you update the `ConfigureAuthentication` method located in your **ApplicationWebModule** with the following while having the AzureAd appsettings section as defined before: + +````csharp +private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration) + { + JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); + JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Add("sub", ClaimTypes.NameIdentifier); + context.Services.AddAuthentication() + .AddIdentityServerAuthentication(options => + { + options.Authority = configuration["AuthServer:Authority"]; + options.RequireHttpsMetadata = false; + options.ApiName = "Acme.BookStore"; + }); + + context.Services.AddMicrosoftIdentityWebAppAuthentication( + configuration: configuration, + configSectionName: "AzureAd", + openIdConnectScheme:"AzureAD", + cookieScheme:null); + } +```` + +And that's all to add new Microsoft-Identity-Web. + +> **Don't forget to:** +> +> * Pass **cookieScheme** parameter as **null** or your [*GetExternalLoginInfoAsync* method will always return null](https://github.com/AzureAD/microsoft-identity-web/issues/133#). + +Keep in mind that [Microsoft-Identity-Web](https://github.com/AzureAD/microsoft-identity-web) is relatively new and keeps getting new enhancements, features and documentation. + ## The Source Code You can find the source code of the completed example [here](https://github.com/abpframework/abp-samples/tree/master/Authentication-Customization). # FAQ -* Help! `GetExternalLoginInfoAsync` returns `null`! +* Help! `GetExternalLoginInfoAsync` returns `null`! (Using obsolute **AddAzureAD**) * There can be 2 reasons for this; @@ -158,6 +195,11 @@ You can find the source code of the completed example [here](https://github.com/ ```` +* Help! `GetExternalLoginInfoAsync` returns `null`! (Using **AddMicrosoftIdentityWebAppAuthentication**) + + + * Pass cookieScheme parameter as **null**. (See [this issue](https://github.com/AzureAD/microsoft-identity-web/issues/133)). + * Help! I am getting ***System.ArgumentNullException: Value cannot be null. (Parameter 'userName')*** error! diff --git a/docs/en/Community-Articles/2020-08-31-Adding-User-Navigation-In-Suite/POST.md b/docs/en/Community-Articles/2020-08-31-Adding-User-Navigation-In-Suite/POST.md index 7bfd20637f..3fd6b845a9 100644 --- a/docs/en/Community-Articles/2020-08-31-Adding-User-Navigation-In-Suite/POST.md +++ b/docs/en/Community-Articles/2020-08-31-Adding-User-Navigation-In-Suite/POST.md @@ -22,6 +22,8 @@ Then add a string property called `Title`, as an example property. ### Create AppUserDto +_Note that, creating `AppUserDto` is not necessary after ABP v4.X_ + ABP Suite needs a DTO for the target entity (user, in this case) in order to define a navigation property. To do this, create a new folder called "Users" in `*.Application.Contracts` then add a new class called `AppUserDto` inherited from `IdentityUserDto`. diff --git a/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md b/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md index b286bb509d..c7f4f40917 100644 --- a/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md +++ b/docs/en/Community-Articles/2020-09-16-How-to-Setup-Azure-Active-Directory-and-Integrate-Abp-Angular-Application/POST.md @@ -1,22 +1,22 @@ -# How to Setup Azure Active Directory and Integrate Abp Angular Application +# How to Setup Azure Active Directory and Integrate ABP Angular Application -This guide demonstrates how to register an application to Azure Active Directory and integrate AzureAD to an ABP angular application that enables users to sign in using OAuth 2.0 with credentials from **Azure Active Directory**. +This guide demonstrates how to register an application to Azure Active Directory and integrate AzureAD to an ABP Angular application that enables users to sign in using OAuth 2.0 with credentials from **Azure Active Directory**. ## Authentication Flow -Abp angular applications use **Authentication Code with PKCE** (specs [here](https://tools.ietf.org/html/rfc7636)) which is the most suitable flow for spa applications by the time this article is written since implicit flow is deprecated. +ABP Angular application uses **Authentication Code with PKCE** (specs [here](https://tools.ietf.org/html/rfc7636)) which is the most suitable flow for SPA applications by the time this article is written since implicit flow is deprecated. The most common question is; -> Where to put OpenId connection code in angular project? +> Where to put OpenId connection code in the Angular project? -The answer is, **you don't**. Abp angular application is integrated with backend code (HttpApi.Host project) where it loads the configurations, **permissions** etc. For none-tiered angular applications, **HttpApi.Host** project also has IdentityServer4 embedded; also serving as **Authorization Server**. Angular application authentication flow is shown below. +The answer is, **you don't**. ABP Angular application is integrated with the backend (HttpApi.Host project) where it loads the configurations, **permissions** etc. For none-tiered angular applications, **HttpApi.Host** project also has IdentityServer4 embedded; also serving as **Authorization Server**. Angular application authentication flow is shown below. auth-diagram > What if I want Azure AD as my authorization server and not IdentityServer? -This means your application will be using AzureAD user store for authentication. By registering both angular app and HttpApi to AzureAD, authentication might work but **authorization won't**. Users need to be registered to Abp identity system for auditing, permissions etc. So the flow should be 3rd party registration. +This means your application will be using AzureAD user store for authentication. By registering both Angular app and HttpApi to AzureAD, authentication might work but **authorization won't**. Users need to be registered to ABP identity system for auditing, permissions etc. So the flow should be 3rd party registration. ## Setting up OpenId Connection diff --git a/docs/en/Community-Articles/2020-12-04-Event-Organizer/Post.md b/docs/en/Community-Articles/2020-12-04-Event-Organizer/Post.md new file mode 100644 index 0000000000..b36d83d0ba --- /dev/null +++ b/docs/en/Community-Articles/2020-12-04-Event-Organizer/Post.md @@ -0,0 +1,936 @@ +# Creating an Event Organizer Application with the ABP Framework & Blazor UI. + +## Introduction + +In this article, we will create an example application that is a simple **meeting/event organizer**: People create events and other people registers to the event. + +The application has been developed with **Blazor** as the UI framework and **MongoDB** as the database provider. + +> This tutorial is based on my notes that I'd created to implement this application in a workshop. It shows the necessary steps to build the application rather than detailed explanations. + +### Source Code + +Source code of the completed application is [available on GitHub](https://github.com/abpframework/abp-samples/tree/master/EventOrganizer). + +### Screenshots + +Here, the pages of the final application. + +**Home Page - Event List** + +![event-list-ui](images/event-list-ui.png) + +**Creating a new Event** + +![event-create-ui](images/event-create-ui.png) + +**Event Detail Page** + +![event-detail-ui](images/event-detail-ui.png) + +## Requirements + +The following tools are needed to be able to run the solution. + +* .NET 5.0 SDK +* Visual Studio 2019 16.8.0+ or another compatible IDE +* MongoDB Server (with MongoDB Compass) + +## Development + +### Creating a new Application + +* Use the following ABP CLI command: + +````bash +abp new EventOrganizer -u blazor -d mongodb +```` + +### Open & Run the Application + +* Open the solution in Visual Studio (or your favorite IDE). +* Run the `EventOrganizer.DbMigrator` application to seed the initial data. +* Run the `EventOrganizer.HttpApi.Host` application that starts the server side. +* Run the `EventOrganizer.Blazor` application to start the UI. + +### Apply the Custom Styles + +* Add styles to `wwwroot/main.css`: + +````css +body.abp-application-layout { + background-color: #222 !important; + font-size: 18px; +} +nav#main-navbar.bg-dark { + background-color: #222 !important; + box-shadow: none !important; +} +.event-pic { + width: 100%; + border-radius: 12px; + box-shadow: 5px 5px 0px 0px rgba(0,0,0,.5); + margin-bottom: 10px; +} +.event-link:hover, .event-link:hover *{ + text-decoration: none; +} +.event-link:hover .event-pic { + box-shadow: 5px 5px 0px 0px #ffd800; +} +.event-form { + background-color: #333 !important; + box-shadow: 5px 5px 0px 0px rgba(0,0,0,.5); + border-radius: 12px; +} +.table { + background: #fff; + border-radius: 12px; + box-shadow: 5px 5px 0px 0px rgba(0,0,0,.5); +} +.table th{ + border: 0 !important; +} +.modal { + color: #333; +} +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 12px; + border-bottom-left-radius: 12px; +} +.page-item:last-child .page-link { + border-top-right-radius: 12px; + border-bottom-right-radius: 12px; +} +.btn { + border-radius: 8px; +} +.att-list { + list-style: none; + padding: 0; +} +.att-list li { + padding: 4px 0 0 0; +} +```` + +* `wwwroot/index.html`: Remove `bg-light` class from the `body` tag and add `bg-dark text-light`. + +### Domain Layer + +* Add the following `Event` aggregate (with `EventAttendee`) to the solution: + +**Event** + +````csharp +using System; +using System.Collections.Generic; +using Volo.Abp.Domain.Entities.Auditing; + +namespace EventOrganizer.Events +{ + public class Event : FullAuditedAggregateRoot + { + public string Title { get; set; } + + public string Description { get; set; } + + public bool IsFree { get; set; } + + public DateTime StartTime { get; set; } + + public ICollection Attendees { get; set; } + + public Event() + { + Attendees = new List(); + } + } +} +```` + +**EventAttendee** + +```csharp +using System; +using Volo.Abp.Auditing; + +namespace EventOrganizer.Events +{ + public class EventAttendee : IHasCreationTime + { + public Guid UserId { get; set; } + + public DateTime CreationTime { get; set; } + } +} +``` + +### MongoDB Mapping + +* Add the following property to the `EventOrganizerMongoDbContext`: + +````csharp +public IMongoCollection Events => Collection(); +```` + +### Clean Index.razor & Add the Header & "Create Event" button + +* Clean the `Index.razor` file. +* Replace the content with the following code: + +````html +@page "/" +@inherits EventOrganizerComponentBase + + +

Upcoming Events

+
+ + @if (CurrentUser.IsAuthenticated) + { + + @L["CreateEvent"] + + } + +
+```` + +* Open `Localization/EventOrganizer/en.json` in the `EventOrganizer.Domain.Shared` project and add the following entry: + +````json +"CreateEvent": "Create a new event!" +```` + +The Result (run the `EventOrganizer.Blazor` application to see): + +![index-title](images/index-title.png) + +### Event Creation + +* Create the Initial `IEventAppService` with the `CreateAsync` method: + +````csharp +using System; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; + +namespace EventOrganizer.Events +{ + public interface IEventAppService : IApplicationService + { + Task CreateAsync(EventCreationDto input); + } +} +```` + +* Add `EventCreationDto` class: + +````csharp +using System; +using System.ComponentModel.DataAnnotations; + +namespace EventOrganizer.Events +{ + public class EventCreationDto + { + [Required] + [StringLength(100)] + public string Title { get; set; } + + [Required] + [StringLength(2000)] + public string Description { get; set; } + + public bool IsFree { get; set; } + + public DateTime StartTime { get; set; } + } +} +```` + +* Implement the `EventAppService`: + +````csharp +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.Domain.Repositories; + +namespace EventOrganizer.Events +{ + public class EventAppService : EventOrganizerAppService, IEventAppService + { + private readonly IRepository _eventRepository; + + public EventAppService(IRepository eventRepository) + { + _eventRepository = eventRepository; + } + + [Authorize] + public async Task CreateAsync(EventCreationDto input) + { + var eventEntity = ObjectMapper.Map(input); + await _eventRepository.InsertAsync(eventEntity); + return eventEntity.Id; + } + } +} +```` + +* Add AutoMapper mapping to the `EventOrganizerApplicationAutoMapperProfile` class: + +````csharp +using AutoMapper; +using EventOrganizer.Events; + +namespace EventOrganizer +{ + public class EventOrganizerApplicationAutoMapperProfile : Profile + { + public EventOrganizerApplicationAutoMapperProfile() + { + CreateMap(); + } + } +} +```` + +This will automatically create the HTTP (REST) API for the application service (run the `EventOrganizer.HttpApi.Host` application to see it on the Swagger UI): + +![swagger-event-create](images/swagger-event-create.png) + +* Create the `CreateEvent.razor` file: + +````csharp +@page "/create-event" +@inherits EventOrganizerComponentBase +Create Event + + +
+ + + @L["Title"] + + + + @L["Description"] + + + + @L["Free"] + + + @L["StartTime"] + + + + +
+
+
+```` + +* Create a partial `CreateEvent` class in the same folder, with the `CreateEvent.razor.cs` as the file name: + +````csharp +using System.Threading.Tasks; +using EventOrganizer.Events; +using Microsoft.AspNetCore.Components; + +namespace EventOrganizer.Blazor.Pages +{ + public partial class CreateEvent + { + private EventCreationDto Event { get; set; } = new EventCreationDto(); + + private readonly IEventAppService _eventAppService; + private readonly NavigationManager _navigationManager; + + public CreateEvent( + IEventAppService eventAppService, + NavigationManager navigationManager) + { + _eventAppService = eventAppService; + _navigationManager = navigationManager; + } + + private async Task Create() + { + var eventId = await _eventAppService.CreateAsync(Event); + _navigationManager.NavigateTo("/events/" + eventId); + } + } +} +```` + +The final UI is (run the `EventOrganizer.Blazor` application and click to the "Create Event" button): + +![event-create-ui](images/event-create-ui.png) + +### Upcoming Events (Home Page) + +* Open the `IEventAppService` and add a `GetUpcomingAsync` method to get the list of upcoming events: + +````csharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; + +namespace EventOrganizer.Events +{ + public interface IEventAppService : IApplicationService + { + Task CreateAsync(EventCreationDto input); + + Task> GetUpcomingAsync(); + } +} +```` + +* Add a `EventDto` class: + +````csharp +using System; +using Volo.Abp.Application.Dtos; + +namespace EventOrganizer.Events +{ + public class EventDto : EntityDto + { + public string Title { get; set; } + + public string Description { get; set; } + + public bool IsFree { get; set; } + + public DateTime StartTime { get; set; } + + public int AttendeesCount { get; set; } + } +} +```` + +* Implement the `GetUpcomingAsync` in the `EventAppService` class: + +````csharp +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.Domain.Repositories; + +namespace EventOrganizer.Events +{ + public class EventAppService : EventOrganizerAppService, IEventAppService + { + private readonly IRepository _eventRepository; + + public EventAppService(IRepository eventRepository) + { + _eventRepository = eventRepository; + } + + [Authorize] + public async Task CreateAsync(EventCreationDto input) + { + var eventEntity = ObjectMapper.Map(input); + await _eventRepository.InsertAsync(eventEntity); + return eventEntity.Id; + } + + public async Task> GetUpcomingAsync() + { + var events = await AsyncExecuter.ToListAsync( + _eventRepository + .Where(x => x.StartTime > Clock.Now) + .OrderBy(x => x.StartTime) + ); + + return ObjectMapper.Map, List>(events); + } + } +} +```` + +* Add the following line into the `EventOrganizerApplicationAutoMapperProfile` constructor: + +````csharp +CreateMap(); +```` + +Run the `EventOrganizer.HttpApi.Host` application to see the new `upcoming` endpoint on the Swagger UI: + +![swagger-event-upcoming](images/swagger-event-upcoming.png) + +* Change the `Pages/Index.razor.cs` content in the `EventOrganizer.Blazor` project as shown below: + +```csharp +using System.Collections.Generic; +using System.Threading.Tasks; +using EventOrganizer.Events; + +namespace EventOrganizer.Blazor.Pages +{ + public partial class Index + { + private List UpcomingEvents { get; set; } = new List(); + + private readonly IEventAppService _eventAppService; + + public Index(IEventAppService eventAppService) + { + _eventAppService = eventAppService; + } + + protected override async Task OnInitializedAsync() + { + UpcomingEvents = await _eventAppService.GetUpcomingAsync(); + } + } +} +``` + +* Change the `Pages/Index.razor` content in the `EventOrganizer.Blazor` project as shown below: + +````html +@page "/" +@inherits EventOrganizerComponentBase + + +

Upcoming Events

+
+ + @if (CurrentUser.IsAuthenticated) + { + + @L["CreateEvent"] + + } + +
+ + @foreach (var upcomingEvent in UpcomingEvents) + { + + +
+ @if (upcomingEvent.IsFree) + { + FREE + } + + + @upcomingEvent.AttendeesCount + +
+ +
+ @upcomingEvent.StartTime.ToLongDateString() +

@upcomingEvent.Title

+

@upcomingEvent.Description.TruncateWithPostfix(150)

+
+
+
+ } +
+```` + +The new home page is shown below: + +![event-list-ui](images/event-list-ui.png) + +### Event Detail Page + +* Add `GetAsync`, `RegisterAsync`, `UnregisterAsync` and `DeleteAsync` methods to the `IEventAppService`: + +````csharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; + +namespace EventOrganizer.Events +{ + public interface IEventAppService : IApplicationService + { + Task CreateAsync(EventCreationDto input); + + Task> GetUpcomingAsync(); + + Task GetAsync(Guid id); + + Task RegisterAsync(Guid id); + + Task UnregisterAsync(Guid id); + + Task DeleteAsync(Guid id); + } +} +```` + +* Add `EventDetailDto` class: + +````csharp +using System; +using System.Collections.Generic; +using Volo.Abp.Application.Dtos; + +namespace EventOrganizer.Events +{ + public class EventDetailDto : CreationAuditedEntityDto + { + public string Title { get; set; } + + public string Description { get; set; } + + public bool IsFree { get; set; } + + public DateTime StartTime { get; set; } + + public List Attendees { get; set; } + } +} +```` + +* Add `EventAttendeeDto` class: + +````csharp +using System; + +namespace EventOrganizer.Events +{ + public class EventAttendeeDto + { + public Guid UserId { get; set; } + + public string UserName { get; set; } + + public DateTime CreationTime { get; set; } + } +} +```` + +* Implement the new methods in the `EventAppService`: + +````csharp +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using EventOrganizer.Users; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Users; + +namespace EventOrganizer.Events +{ + public class EventAppService : EventOrganizerAppService, IEventAppService + { + private readonly IRepository _eventRepository; + private readonly IRepository _userRepository; + + public EventAppService(IRepository eventRepository, IRepository userRepository) + { + _eventRepository = eventRepository; + _userRepository = userRepository; + } + + [Authorize] + public async Task CreateAsync(EventCreationDto input) + { + var eventEntity = ObjectMapper.Map(input); + await _eventRepository.InsertAsync(eventEntity); + return eventEntity.Id; + } + + public async Task> GetUpcomingAsync() + { + var events = await AsyncExecuter.ToListAsync( + _eventRepository + .Where(x => x.StartTime > Clock.Now) + .OrderBy(x => x.StartTime) + ); + + return ObjectMapper.Map, List>(events); + } + + public async Task GetAsync(Guid id) + { + var @event = await _eventRepository.GetAsync(id); + var attendeeIds = @event.Attendees.Select(a => a.UserId).ToList(); + var attendees = (await AsyncExecuter.ToListAsync(_userRepository.Where(u => attendeeIds.Contains(u.Id)))) + .ToDictionary(x => x.Id); + + var result = ObjectMapper.Map(@event); + + foreach (var attendeeDto in result.Attendees) + { + attendeeDto.UserName = attendees[attendeeDto.UserId].UserName; + } + + return result; + } + + [Authorize] + public async Task RegisterAsync(Guid id) + { + var @event = await _eventRepository.GetAsync(id); + if (@event.Attendees.Any(a => a.UserId == CurrentUser.Id)) + { + return; + } + + @event.Attendees.Add(new EventAttendee {UserId = CurrentUser.GetId(), CreationTime = Clock.Now}); + await _eventRepository.UpdateAsync(@event); + } + + [Authorize] + public async Task UnregisterAsync(Guid id) + { + var @event = await _eventRepository.GetAsync(id); + var removedItems = @event.Attendees.RemoveAll(x => x.UserId == CurrentUser.Id); + if (removedItems.Any()) + { + await _eventRepository.UpdateAsync(@event); + } + } + + [Authorize] + public async Task DeleteAsync(Guid id) + { + var @event = await _eventRepository.GetAsync(id); + + if (CurrentUser.Id != @event.CreatorId) + { + throw new UserFriendlyException("You don't have the necessary permission to delete this event!"); + } + + await _eventRepository.DeleteAsync(id); + } + } +} +```` + +* Add the following mappings into the `EventOrganizerApplicationAutoMapperProfile`: + +````csharp +CreateMap(); +CreateMap(); +```` + +Run the `EventOrganizer.HttpApi.Host` application to see the complete Event HTTP API in the Swagger UI: + +![swagger-event-all](images/swagger-event-all.png) + +* Create `EventDetail.razor` component with the following content: + +````html +@page "/events/{id}" +@inherits EventOrganizerComponentBase +@if (Event != null) +{ + + +

@Event.Title

+
+ + Back + @if (CurrentUser.IsAuthenticated && CurrentUser.Id == Event.CreatorId) + { + + } + +
+ + +
+
+ @if (Event.IsFree) + { + FREE + } + + + @Event.Attendees.Count + +
+ + Start time: @Event.StartTime.ToLongDateString() +

@Event.Description

+
+
+ +
+ @if (CurrentUser.IsAuthenticated) + { +
+ @if (!IsRegistered) + { + + } + else + { +

You are registered in this event

+ + } +
+ } + else + { + + Login to attend! + + } +
+
+ Attendees (@Event.Attendees.Count) +
    + @foreach (var attendee in Event.Attendees) + { +
  • @attendee.UserName
  • + } +
+
+
+
+} +```` + +* Create `EventDetail.razor.cs` file with the following content: + +````csharp +using System; +using System.Linq; +using System.Threading.Tasks; +using EventOrganizer.Events; +using Microsoft.AspNetCore.Components; + +namespace EventOrganizer.Blazor.Pages +{ + public partial class EventDetail + { + [Parameter] + public string Id { get; set; } + + private EventDetailDto Event { get; set; } + private bool IsRegistered { get; set; } + + private readonly IEventAppService _eventAppService; + private readonly NavigationManager _navigationManager; + + public EventDetail( + IEventAppService eventAppService, + NavigationManager navigationManager) + { + _eventAppService = eventAppService; + _navigationManager = navigationManager; + } + + protected override async Task OnInitializedAsync() + { + await GetEventAsync(); + } + + private async Task GetEventAsync() + { + Event = await _eventAppService.GetAsync(Guid.Parse(Id)); + if (CurrentUser.IsAuthenticated) + { + IsRegistered = Event.Attendees.Any(a => a.UserId == CurrentUser.Id); + } + } + + private async Task Register() + { + await _eventAppService.RegisterAsync(Guid.Parse(Id)); + await GetEventAsync(); + } + + private async Task UnRegister() + { + await _eventAppService.UnregisterAsync(Guid.Parse(Id)); + await GetEventAsync(); + } + + private async Task Delete() + { + if (!await Message.Confirm("This event will be deleted: " + Event.Title)) + { + return; + } + + await _eventAppService.DeleteAsync(Guid.Parse(Id)); + _navigationManager.NavigateTo("/"); + } + } +} +```` + +The resulting page is shown below: + +![event-detail-ui](images/event-detail-ui.png) + +### Integration Tests + +Create an `EventAppService_Tests` class in the `EventOrganizer.Application.Tests` project: + +````csharp +using System; +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace EventOrganizer.Events +{ + [Collection(EventOrganizerTestConsts.CollectionDefinitionName)] + public class EventAppService_Tests : EventOrganizerApplicationTestBase + { + private readonly IEventAppService _eventAppService; + + public EventAppService_Tests() + { + _eventAppService = GetRequiredService(); + } + + [Fact] + public async Task Should_Create_A_Valid_Event() + { + // Create an event + + var eventId = await _eventAppService.CreateAsync( + new EventCreationDto + { + Title = "My test event 1", + Description = "My test event description 1", + IsFree = true, + StartTime = DateTime.Now.AddDays(2) + } + ); + + eventId.ShouldNotBe(Guid.Empty); + + // Get the event + + var @event = await _eventAppService.GetAsync(eventId); + @event.Title.ShouldBe("My test event 1"); + + // Get upcoming events + + var events = await _eventAppService.GetUpcomingAsync(); + events.ShouldContain(x => x.Title == "My test event 1"); + } + } +} +```` + +## Source Code + +Source code of the completed application is [available on GitHub](https://github.com/abpframework/abp-samples/tree/master/EventOrganizer). \ No newline at end of file diff --git a/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/event-create-ui.png b/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/event-create-ui.png new file mode 100644 index 0000000000..c4b0c68a31 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/event-create-ui.png differ diff --git a/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/event-detail-ui.png b/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/event-detail-ui.png new file mode 100644 index 0000000000..f916a129dc Binary files /dev/null and b/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/event-detail-ui.png differ diff --git a/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/event-list-ui.png b/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/event-list-ui.png new file mode 100644 index 0000000000..4f049c2339 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/event-list-ui.png differ diff --git a/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/index-title.png b/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/index-title.png new file mode 100644 index 0000000000..c06b8f5d80 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/index-title.png differ diff --git a/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/swagger-event-all.png b/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/swagger-event-all.png new file mode 100644 index 0000000000..3b0fb24a7d Binary files /dev/null and b/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/swagger-event-all.png differ diff --git a/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/swagger-event-create.png b/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/swagger-event-create.png new file mode 100644 index 0000000000..5c7e1d0204 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/swagger-event-create.png differ diff --git a/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/swagger-event-upcoming.png b/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/swagger-event-upcoming.png new file mode 100644 index 0000000000..48d0244797 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-04-Event-Organizer/images/swagger-event-upcoming.png differ diff --git a/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/POST.md b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/POST.md new file mode 100644 index 0000000000..4f2f5556eb --- /dev/null +++ b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/POST.md @@ -0,0 +1,110 @@ +## Using DevExpress Blazor UI Components With the ABP Framework + +Hi, in this step by step article, I will show you how to integrate [DevExpress](https://demos.devexpress.com/blazor/) blazor UI components into ABP Framework-based applications. + +![both-example-result](both-example-result.png) + +*(A screenshot from the example application developed in this article)* + +## Create the Project + +> ABP Framework offers startup templates to get into business faster. + +In this article, I will create a new startup template with EF Core as a database provider and Blazor for UI framework. But if you already have a project with Blazor UI, you don't need to create a new startup template, you can directly implement the following steps to your existing project. + +> If you already have a project with the Blazor UI, you can skip this section. + +* Before starting to development, we will create a solution named `DevExpressSample` (or whatever you want). We will create a new startup template with EF Core as a database provider and Blazor for UI framework by using [ABP CLI](https://docs.abp.io/en/abp/latest/CLI): + +````bash +abp new DevExpressSample -u blazor +```` + +![initial-project](initial-project.png) + +* Our project boilerplate will be ready after the download is finished. Then, we can open the solution in the Visual Studio (or any other IDE) and run the `DevExpressSample.DbMigrator` to create the database and seed initial data (which creates the admin user, admin role, permissions etc.) + +* After database and initial data created, +* Run the `DevExpressSample.HttpApi.Host` to see our server side working and +* Run the `DevExpressSample.Blazor` to see our UI working properly. + +> _Default login credentials for admin: username is **admin** and password is **1q2w3E\***_ + +## Install DevExpress + +You can follow [this documentation](https://docs.devexpress.com/Blazor/401986/getting-started/install-components-and-create-an-application/without-devexpress-installer/microsoft-templates) to install DevExpress packages into your computer. + +> Don't forget to add _"DevExpress NuGet Feed"_ to your **Nuget Package Sources**. + +### Adding DevExpress NuGet Packages + +Add the `DevExpress.Blazor` NuGet package to the `DevExpressSample.Blazor` project. + +``` +Install-Package DevExpress.Blazor +``` + +### Register DevExpress Resources + +1. Add the following line to the HEAD section of the `wwwroot/index.html` file within the `DevExpressSample.Blazor` project: + + ```Razor + + + + + ``` + +2. In the `DevExpressSampleBlazorModule` class, call the `AddDevExpressBlazor()` method from your project's `ConfigureServices()` method: + + ```csharp + public override void ConfigureServices(ServiceConfigurationContext context) + { + var environment = context.Services.GetSingletonInstance(); + var builder = context.Services.GetSingletonInstance(); + // ... + builder.Services.AddDevExpressBlazor(); + } + ``` + +3. Register the **DevExpressSample.Blazor** namespace in the `_Imports.razor` file: + + ```Razor + @using DevExpress.Blazor + ``` + +### Result + +The installation step was done. You can use any DevExpress Blazor UI component in your application: + +Example: A Scheduler: + +![sample-appointment](sample-appointment.gif) + +This example has been created by following [this documentation](https://demos.devexpress.com/blazor/SchedulerViewTypes). + +## The Sample Application + +We have created a sample application with [Data Grid](https://docs.devexpress.com/Blazor/DevExpress.Blazor.DxDataGrid-1) example. + +### The Source Code + +You can download the source code from [here](https://github.com/abpframework/abp-samples/tree/master/DevExpress-Blazor). + +The related files for this example are marked in the following screenshots. + +![data-grid-app-contract](data-grid-app-contract.png) + +![data-grid-application](data-grid-application.png) + +![data-grid-web](data-grid-blazor.png) + +### Additional Notes + +#### Data Storage + +I've used an in-memory list to store data for this example, instead of a real database. Because it is not related to DevExpress usage. There is a `SampleDataService.cs` file in `Data` folder at `DevExpressSample.Application.Contracts` project. All the data is stored here. + +## Conclusion + +In this article, I've explained how to use [DevExpress](https://www.devexpress.com/blazor/) components in your application. ABP Framework is designed so that it can work with any UI library/framework. diff --git a/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/both-example-result.png b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/both-example-result.png new file mode 100644 index 0000000000..cc437ed6e7 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/both-example-result.png differ diff --git a/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/cover-image.png b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/cover-image.png new file mode 100644 index 0000000000..2dc0aed011 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/cover-image.png differ diff --git a/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/data-grid-app-contract.png b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/data-grid-app-contract.png new file mode 100644 index 0000000000..536251b7b9 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/data-grid-app-contract.png differ diff --git a/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/data-grid-application.png b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/data-grid-application.png new file mode 100644 index 0000000000..a169b9f9f7 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/data-grid-application.png differ diff --git a/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/data-grid-blazor.png b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/data-grid-blazor.png new file mode 100644 index 0000000000..af1857a4e0 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/data-grid-blazor.png differ diff --git a/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/initial-project.png b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/initial-project.png new file mode 100644 index 0000000000..c2a2af265e Binary files /dev/null and b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/initial-project.png differ diff --git a/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/sample-appointment.gif b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/sample-appointment.gif new file mode 100644 index 0000000000..cde15e8f74 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-DevExpress-Blazor-Component/sample-appointment.gif differ diff --git a/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/POST.md b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/POST.md new file mode 100644 index 0000000000..4bdebb6234 --- /dev/null +++ b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/POST.md @@ -0,0 +1,534 @@ +# How to Integrate the Telerik Blazor Components to the ABP Blazor UI? + +## Introduction + +Hi, in this step by step article, we will see how we can integrate the Telerik Blazor Components to our Blazor UI. + +## Creating the Solution + +> ABP Framework offers startup templates to get into business faster. + +In this article, I will create a new startup template with EF Core as a database provider and Blazor for UI framework. But if you already have a project with Blazor UI, you don't need to create a new startup template, you can directly implement the following steps to your existing project. + +> If you already have a project with the Blazor UI, you can skip this section. + +* Before starting to development, we will create a solution named `TelerikComponents` (or whatever you want). We will create a new startup template with EF Core as a database provider and Blazor for UI framework by using [ABP CLI](https://docs.abp.io/en/abp/latest/CLI): + +```bash +abp new TelerikComponents --ui blazor --database-provider ef +``` + +* Our project boilerplate will be ready after the download is finished. Then, we can open the solution in the Visual Studio (or any other IDE) and run the `TelerikComponents.DbMigrator` to create the database and seed initial data (which creates the admin user, admin role, permissions, etc.) + +* After the database and initial data created, +* Run the `TelerikComponents.HttpApi.Host` to see our server-side working and +* Run the `TelerikComponents.Blazor` to see our UI working. + +> _Default login credentials for admin: username is **admin** and password is **1q2w3E\***_ + +## Starting the Development + +### Pre-requisite + +* First thing we need to do is downloading the [Progress Control Panel](https://www.telerik.com/download-trial-file/v2/control-panel?_ga=2.212029332.1667119438.1607582144-1944255175.1605161949) to get Telerik Blazor Components on our development machine. + +* If you will use the Telerik Blazor Components for the first time or you don't have an active license you can click [here](https://www.telerik.com/login/v2/download-b?ReturnUrl=https%3a%2f%2fwww.telerik.com%2fdownload-trial-file%2fv2-b%2fui-for-blazor%3f_ga%3d2.212029332.1667119438.1607582144-1944255175.1605161949#register) to download free trial. + +> You can find the more installation details from [here](https://docs.telerik.com/blazor-ui/getting-started/client-blazor?_ga=2.55603115.1667119438.1607582144-1944255175.1605161949&_gac=1.261851647.1607669357.CjwKCAiAq8f-BRBtEiwAGr3DgUDhBT25rs7hU0EQ8K-AfeUVxs3hSoIuIAuBOZ17CNPI4ZEArORPExoCyd4QAvD_BwE#step-0---download-the-components). + +>**Notes:** To download Telerik Blazor packages via NuGet, we need to setup Telerik NuGet package source. We can state it in the installer as below. In this way, we can download the required Telerik Blazor packages via NuGet. + +![setup-nuget-package-source](./automated-nuget-feed-setup.png) + +### Step 1 (Configurations) + +* We need to install the `Telerik.UI.for.Blazor` Nuget package to our Blazor project (`*.Blazor`). We need to choose package source to **telerik.com** for Visual Studio to see this package. + +* If you use trial version of Telerik, you can download **Telerik.UI.for.Blazor.Trial** package via NuGet. + +* After the installation finished, we need to open **index.html** (it's under *wwwroot* folder) to add css and js files in our application. + +* Add the following lines just before the closing head tag (**/head**). + +```html + ... + + + + +``` + +* After that, we need to add the Telerik Blazor Components to our application's service collection. So just open the `TelerikComponentsBlazorModule` and update the `ConfigureServices` method with the following content. + +```csharp +public override void ConfigureServices(ServiceConfigurationContext context) +{ + var environment = context.Services.GetSingletonInstance(); + var builder = context.Services.GetSingletonInstance(); + + ConfigureAuthentication(builder); + ConfigureHttpClient(context, environment); + ConfigureBlazorise(context); + ConfigureRouter(context); + ConfigureUI(builder); + ConfigureMenu(context); + ConfigureAutoMapper(context); + + //add this line to be able to use the components + builder.Services.AddTelerikBlazor(); +} +``` + +* After the service added we will continue by opening **_Imports.razor** file and add the global using statements as below. This will bring our Telerik components into scope throughout the application. + +![telerik-blazor-component-1](./telerik-blazor-component-1.jpg) + +* After all of these steps, the Telerik UI Components are ready to be used anywhere in our application. We can use the Telerik Blazor Components by wrapping our components or pages between `` and `` tags. + +### Step 2 - Checking Configurations + +* We should check, have we done the right configurations or not. For that, we can open the **Index.razor** file and we can update the component with the following content. + +```razor +@page "/" +@using Volo.Abp.MultiTenancy +@inherits TelerikComponentsComponentBase +@inject ICurrentTenant CurrentTenant +@inject AuthenticationStateProvider AuthenticationStateProvider +@using System.Timers + +@implements IDisposable + + +
+
Telerik Progress Bar Component
+ +
+
+ +@code { + private const int TimerInterval = 1000; + private const int TotalTime = 10 * TimerInterval; + private double ProgressValue = 0; + private int ProgressStep = 100 / (TotalTime / TimerInterval); + private Timer Timer { get; set; } = new Timer(); + + private void Dispose() + { + StopProgress(); + Timer?.Close(); + } + + protected override void OnAfterRender(bool firstRender) + { + if (Timer.Enabled == false) + { + Timer.Interval = TimerInterval; + Timer.Elapsed -= OnTimerElapsed; + Timer.Elapsed += OnTimerElapsed; + Timer.AutoReset = true; + Timer.Start(); + } + } + + private void OnTimerElapsed(Object source, ElapsedEventArgs e) + { + if (ProgressValue < 100) + { + UpdateProgress(); + } + else + { + StopProgress(); + } + } + + private void UpdateProgress() + { + ProgressValue += ProgressStep; + + InvokeAsync(StateHasChanged); + } + + private void StopProgress() + { + Timer?.Stop(); + } +} + + +``` + +* In here, we've just added the `TelerikProgressBar` component to check the integration configured properly. + +* When we run `*.HttpApi.Host` and `*.Blazor` projects, we should see that the `TelerikProgressBar` component works and has similar view as the below gif. + +![telerik-progress-bar](./telerik-progress-bar.gif) + +* If you haven't seen this component like above, you should check the above configurations and be assure every step done as stated. + +### Step 3 - Using The Telerik Blazor Components (Sample Application) + +* Let's create a sample application for use other Telerik Blazor Components (like DataGrid). + +* We will use [jsonplaceholder](https://jsonplaceholder.typicode.com/) as **mock data** to the listing, adding, updating and deleting posts. + +* Firstly, we can create a folder named `Posts` and inside this folder, we can create the classes which are highlighted in the following screenshot. + +![sample-application](./sample-application.jpg) + +* After classes created we can fill the classes with the following contents. + +**Post.cs** +```csharp +using System; + +namespace TelerikComponents.Posts +{ + [Serializable] + public class Post + { + public int Id { get; set; } + + public string Title { get; set; } + + public string Body { get; set; } + + public int UserId { get; set; } + } +} +``` + +**Comment.cs** +```csharp +using System; + +namespace TelerikComponents.Posts +{ + [Serializable] + public class Comment + { + public int PostId { get; set; } + + public int Id { get; set; } + + public string Name { get; set; } + + public string Email { get; set; } + + public string Body { get; set; } + } +} +``` + +**IPostAppService.cs** +```csharp +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; + +namespace TelerikComponents.Posts +{ + public interface IPostAppService : IApplicationService + { + Task> GetPostsAsync(); + + Task AddPostAsync(Post post); + + Task UpdatePostAsync(int postId, Post post); + + Task DeletePostAsync(int postId); + + Task GetFirstCommentByPostIdAsync(int postId); + } +} +``` +* In here, we basically created two class (which are **Post** and **Comment**). These classes are used to hold data returned as JSON. + +* After that, we need to implement `IPostAppService`. For achieve this, we can create a folder named `Posts` in **\*.Application** layer and inside this folder we can create a class named `PostAppService` with the following content. + +**PostAppService.cs** +```csharp +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; + +namespace TelerikComponents.Posts +{ + public class PostAppService : ApplicationService, IPostAppService + { + private JsonSerializerOptions _options = new JsonSerializerOptions + { + IncludeFields = true, + PropertyNameCaseInsensitive = true + }; + + public async Task> GetPostsAsync() + { + var url = "https://jsonplaceholder.typicode.com/posts"; + List _posts = new List(); + + using (var client = new HttpClient()) + { + var result = await client.GetAsync(url); + + if (result.IsSuccessStatusCode) + { + var content = await result.Content.ReadAsStringAsync(); + var deserializedPosts = JsonSerializer.Deserialize>(content, _options); + + _posts = deserializedPosts; + } + } + + return _posts; + } + + public async Task AddPostAsync(Post post) + { + var url = "https://jsonplaceholder.typicode.com/posts"; + Post addedPost = null; + + using (var client = new HttpClient()) + { + var serializePost = JsonSerializer.Serialize(post); + var content = new StringContent(serializePost, Encoding.UTF8, "application/json"); + var result = await client.PostAsync(url, content); + + if (result.IsSuccessStatusCode) + { + var response = await result.Content.ReadAsStringAsync(); + addedPost = JsonSerializer.Deserialize(response); + } + } + + return addedPost; + } + + public async Task UpdatePostAsync(int postId, Post post) + { + var url = $"https://jsonplaceholder.typicode.com/posts/{postId}"; + Post updatedPost = null; + + using (var client = new HttpClient()) + { + var serializePost = JsonSerializer.Serialize(post); + var content = new StringContent(serializePost, Encoding.UTF8, "application/json"); + var result = await client.PutAsync(url, content); + + if (result.IsSuccessStatusCode) + { + var response = await result.Content.ReadAsStringAsync(); + updatedPost = JsonSerializer.Deserialize(response); + } + } + + return updatedPost; + } + + public async Task DeletePostAsync(int postId) + { + var url = $"https://jsonplaceholder.typicode.com/posts/{postId}"; + + using (var client = new HttpClient()) + { + await client.DeleteAsync(url); + } + } + + public async Task GetFirstCommentByPostIdAsync(int postId) + { + var url = $"https://jsonplaceholder.typicode.com/posts/{postId}/comments"; + + List _comments = new List(); + + using (var client = new HttpClient()) + { + var result = await client.GetAsync(url); + + if (result.IsSuccessStatusCode) + { + var content = await result.Content.ReadAsStringAsync(); + var deserializedPosts = JsonSerializer.Deserialize>(content, _options); + + _comments = deserializedPosts; + } + } + + return _comments[0]; + } + } +} +``` + +* In here, we've implemented `IPostAppService` methods by using [jsonplaceholder](https://jsonplaceholder.typicode.co) API. These endpoints provide us basic crud functionallity. + +* After the implemenation, we can start to create the user interface. + +#### Blazor UI + +* We can create **/Posts** page for listing, updating, deleting and creating our posts. So, create a razor page named `Posts.razor` under **Pages** folder in `*.Blazor` project. + +**Posts.razor** +```razor +@page "/Posts" +@using TelerikComponents.Posts +@using IconName = Telerik.Blazor.IconName +@inject IPostAppService PostAppService + +

Posts

+ + + + + + + + Update + Edit + Delete + Display Comment + Cancel + + + + Add Post + + + + @* Modal *@ + + + Comment + + + + + +

Email: @Comment.Email

+

+ Message: @Comment.Body +

+
+
+
+``` + +**Post.razor.cs** +```csharp +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Telerik.Blazor.Components; +using TelerikComponents.Posts; + +namespace TelerikComponents.Blazor.Pages +{ + public partial class Posts + { + private List GridData { get; set; } + private TelerikGrid Grid { get; set; } + private bool ModalVisible { get; set; } = false; + private Comment Comment { get; set; } + + public Posts() + { + Comment = new Comment(); + } + + protected override async Task OnInitializedAsync() + { + await LoadDataAsync(); + } + + private async Task LoadDataAsync() + { + GridData = await PostAppService.GetPostsAsync(); + } + + private async Task UpdateHandler(GridCommandEventArgs args) + { + var post = (Post) args.Item; + + await PostAppService.UpdatePostAsync(post.Id, post); + + var matchingPost = GridData.FirstOrDefault(x => x.Id == post.Id); + + if (matchingPost != null) + { + matchingPost.Body = post.Body; + matchingPost.Title = post.Title; + } + } + + private async Task DeleteHandler(GridCommandEventArgs args) + { + var post = (Post) args.Item; + + GridData.Remove(post); + } + + private async Task CreateHandler(GridCommandEventArgs args) + { + var post = (Post) args.Item; + + var addedPost = await PostAppService.AddPostAsync(post); + + GridData.Insert(0, addedPost); + } + + private async Task PostDetailAsync(GridCommandEventArgs args) + { + var post = (Post) args.Item; + + Comment = await PostAppService.GetFirstCommentByPostIdAsync(post.Id); + + ModalVisible = true; + } + } +} +``` + +* In here, we've used `TelerikGrid` component. + +* The `Telerik Grid` is a powerful component, which allows you to visualize and edit data via its table representation. It provides a variety of options about how to present and perform operations over the underlying data, such as paging, sorting, filtering and editing. + +* The Blazor UI Grid allows flexible customization of its items exposing rows, columns and edit templates for this purpose. + +### Final Result + +* After all of these steps, we can finally run our application. + * Run `*.HttpApi.Host` project for use the required endpoints, + * Run `*.Blazor` project for see the Blazor UI. + +* When we navigate to `Posts` route, we should see the following screenshot in this page. + +![final-result](./final-result.jpg) + +## Conclusion + +In this article, I've tried to explain how we can integrate [Telerik Blazor Component](https://www.telerik.com/blazor-ui) to our Blazor UI. ABP Framework designed as modular, so that it can work with any UI library/framework. \ No newline at end of file diff --git a/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/automated-nuget-feed-setup.png b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/automated-nuget-feed-setup.png new file mode 100644 index 0000000000..236135b30f Binary files /dev/null and b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/automated-nuget-feed-setup.png differ diff --git a/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/final-result.jpg b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/final-result.jpg new file mode 100644 index 0000000000..244711a962 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/final-result.jpg differ diff --git a/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/sample-application.jpg b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/sample-application.jpg new file mode 100644 index 0000000000..27e9dbe9fc Binary files /dev/null and b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/sample-application.jpg differ diff --git a/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/telerik-blazor-component-1.jpg b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/telerik-blazor-component-1.jpg new file mode 100644 index 0000000000..7a204d97f3 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/telerik-blazor-component-1.jpg differ diff --git a/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/telerik-progress-bar.gif b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/telerik-progress-bar.gif new file mode 100644 index 0000000000..e1eff85986 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-10-How-to-Integrate-the-Telerik-Blazor-Component/telerik-progress-bar.gif differ diff --git a/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/POST.md b/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/POST.md new file mode 100644 index 0000000000..7b1ae846af --- /dev/null +++ b/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/POST.md @@ -0,0 +1,1581 @@ +# Using Angular Material Components With the ABP Framework + +## Introduction + +Angular Material library is a popular and well-known library in the community. We will implement Angular Material components with the ABP framework in this article. We will follow the Book Store tutorial which documented in [ABP Documentation](https://docs.abp.io/en/abp/latest/Tutorials/Part-1) + +> This article doesn't include server-side parts except the **Author With Books Form** +> section. Please follow the tutorial for server-side parts. + +## Installation + +Create a project with ABP CLI. Run following command in terminal: + +```bash + abp new Acme.BookStore.AngularMaterial -u angular -o AcmeBookStoreAngularMaterial +``` + +Add Angular Material package to the created project. Run this command in the terminal at the `angular` directory: + +``` + ng add @angular/material +``` + +## Book CRUD Actions + +> Please complete the following steps before starting this section: +> +> - Follow the server-side steps at [Web Application Development Tutorial - Part 1: Creating the Server Side](https://docs.abp.io/en/abp/latest/Tutorials/Part-1) with remembering our application name is **Acme.BookStore.AngularMaterial** +> - Follow the localization part of [Web Application Development Tutorial - Part 2: The Book List Page](https://docs.abp.io/en/abp/latest/Tutorials/Part-2?UI=NG&DB=EF#localization) +> - Run following command in terminal at `angular` directory  +> `abp generate-proxy` + +In this section, we will create the book list page, book create and update dialog using the Angular Material Modules. + +Add material modules to `SharedModule`'s imports and exports arrays which placed in `angular/src/app/shared/shared.module.ts`: + +```typescript +import { MatCardModule } from "@angular/material/card"; +import { MatTableModule } from "@angular/material/table"; +import { MatPaginatorModule } from "@angular/material/paginator"; +import { MatSortModule } from "@angular/material/sort"; +import { MatButtonModule } from "@angular/material/button"; + +@NgModule({ + imports: [ + CoreModule, + ThemeSharedModule, + ThemeBasicModule, + NgbDropdownModule, + NgxValidateCoreModule, + + MatCardModule, // added this line + MatTableModule, // added this line + MatPaginatorModule, // added this line + MatSortModule, // added this line + MatButtonModule, // added this line + ], + exports: [ + CoreModule, + ThemeSharedModule, + ThemeBasicModule, + NgbDropdownModule, + NgxValidateCoreModule, + + MatCardModule, // added this line + MatTableModule, // added this line + MatPaginatorModule, // added this line + MatSortModule, // added this line + MatButtonModule, // added this line + ], +}) +export class SharedModule {} +``` + +Run the following command in the terminal at the `angular` directory to create the book module: + +``` +yarn ng generate module book --module app --routing --route books +``` + +Remove `CommonModule` form and import `SharedModule` from imports array at `book.module.ts`: + +```typescript +import { NgModule } from "@angular/core"; +import { BookRoutingModule } from "./book-routing.module"; +import { BookComponent } from "./book.component"; +import { SharedModule } from "../shared/shared.module"; + +@NgModule({ + declarations: [BookComponent], + imports: [ + BookRoutingModule, + SharedModule, // this line added + ], +}) +export class BookModule {} +``` + +> We deleted the `CommonModule` because `CommonModule` in `CoreModule`'s exports array and `CoreModule` in `SharedModule`'s exports array. + +We will add routes by adding items to the return array of the `routesProvider` created when creating a project for adding navigation elements for books route. For more information, see the [`RoutesService` document](https://docs.abp.io/en/abp/latest/UI/Angular/Modifying-the-Menu#via-routesservice). + +Open the `src/app/route.provider.ts` file replace the `configureRoutes` function declaration as shown below: + +```typescript +import { eLayoutType, RoutesService } from "@abp/ng.core"; + +function configureRoutes(routes: RoutesService) { + return () => { + routes.add([ + { + path: "/", + name: "::Menu:Home", + iconClass: "fas fa-home", + order: 1, + layout: eLayoutType.application, + }, + { + path: "/book-store", + name: "::Menu:BookStore", + iconClass: "fas fa-book", + order: 2, + layout: eLayoutType.application, + }, + { + path: "/books", + name: "::Menu:Books", + parentName: "::Menu:BookStore", + layout: eLayoutType.application, + }, + ]); + }; +} +``` + +### Book List + +Replace `BookComponent` with the following code placed at `angular/src/book/book.component.ts` : + +```typescript +import { Component, OnInit } from "@angular/core"; +import { ListService, PagedResultDto } from "@abp/ng.core"; +import { BookDto, BookService } from "@proxy/books"; +import { PageEvent } from "@angular/material/paginator"; +import { Sort } from "@angular/material/sort"; + +@Component({ + selector: "app-book", + templateUrl: "./book.component.html", + styleUrls: ["./book.component.scss"], + providers: [ListService], +}) +export class BookComponent implements OnInit { + book = { items: [], totalCount: 0 } as PagedResultDto; + columns: string[] = ["name", "type", "price"]; + + constructor( + public readonly list: ListService, + private bookService: BookService + ) { + this.list.maxResultCount = 2; + } + + ngOnInit() { + const bookStreamCreator = (query) => this.bookService.getList(query); + + this.list.hookToQuery(bookStreamCreator).subscribe((response) => { + this.book = response; + }); + } + + changePage(pageEvent: PageEvent) { + this.list.page = pageEvent.pageIndex; + } + + changeSort(sort: Sort) { + this.list.sortKey = sort.active; + this.list.sortOrder = sort.direction; + } +} +``` + +- We imported and injected the generated `BookService`. +- We used the [ListService](https://docs.abp.io/en/abp/latest/UI/Angular/List-Service), a utility service of the ABP Framework which provides easy pagination, sorting and searching. +- We set `this.list.maxResultCount` to 2 in the constructor, it can be changed programmatically for example changing value with the dropdown in the template + +Replace the `book.component.html` in the `angular/src/book/` with following code: + +```html + + + + {{ '::Menu:Books' | abpLocalization }} + + + + + + + + + + + + + + + +
+ {{'::Name' | abpLocalization}} + {{element.name}} + {{'::Type' | abpLocalization}} + + {{ '::Enum:BookType:' + element.type | abpLocalization }} +
+ +
+
+``` + +- We used the [Material Card](https://material.angular.io/components/card/overview) component as a container +- We used [Material Table](https://material.angular.io/components/table/overview) and we made `name` and `type` columns sortable. `changeSort` method executes when sorting change. +- We used the [Material Pagination](https://material.angular.io/components/paginator/overview). `changePage` method executes when the page changed + +![Book List](book-list.gif) + +### Book Create + +In this section, we will create `BookDialogComponent` and we will display this component via [`Material Dialog`](https://material.angular.io/components/dialog/overview). We will use also [Material Input](https://material.angular.io/components/input/overview), [Material Select](https://material.angular.io/components/select/overview), [Material DatePicker](https://material.angular.io/components/datepicker/overview) modules in this component for book form. + +Create a new component named `BookDialogComponent` in the `angular/src/book/components` folder with the following command: + +``` +yarn ng generate component book/components/BookDialog --module book +``` + +> We used --module option for declaring in the component to a specific module. + +Add Material modules to `SharedModule`'s imports and exports arrays: + +```typescript +import { MatDialogModule } from "@angular/material/dialog"; +import { MatDatepickerModule } from "@angular/material/datepicker"; +import { MatFormFieldModule } from "@angular/material/form-field"; +import { MatInputModule } from "@angular/material/input"; +import { MatSelectModule } from "@angular/material/select"; +import { MatIconModule } from "@angular/material/icon"; +import { MatNativeDateModule } from '@angular/material/core'; + +@NgModule({ + imports: [ + // other imports + MatDialogModule, + MatDatepickerModule, + MatNativeDateModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatIconModule, + ], + exports: [ + // other exports + MatDialogModule, + MatDatepickerModule, + MatFormFieldModule, + MatInputModule, + MatSelectModule, + MatIconModule, + ], +}) +export class SharedModule {} +``` + +Replace `book-dialog.component.ts` in `angular/src/book/` with following code: + +```typescript +import { Component, Inject, OnInit } from "@angular/core"; +import { + MAT_DIALOG_DATA, + MAT_DIALOG_DEFAULT_OPTIONS, +} from "@angular/material/dialog"; +import { FormBuilder, FormGroup, Validators } from "@angular/forms"; +import { bookTypeOptions } from "@proxy/books"; + +@Component({ + selector: "app-book-dialog", + templateUrl: "./book-dialog.component.html", + styleUrls: ["./book-dialog.component.scss"], + providers: [ + { + provide: MAT_DIALOG_DEFAULT_OPTIONS, + useValue: { hasBackdrop: true, width: "50vw" }, + }, + ], +}) +export class BookDialogComponent implements OnInit { + form: FormGroup; + + bookTypes = bookTypeOptions; + + constructor(private fb: FormBuilder) {} + + ngOnInit(): void { + this.buildForm(); + } + + buildForm() { + this.form = this.fb.group({ + name: [null, Validators.required], + type: [null, Validators.required], + publishDate: [null, Validators.required], + price: [null, Validators.required], + }); + } + + getFormValue() { + const { publishDate } = this.form.value; + return { + ...this.form.value, + publishDate: `${publishDate?.getFullYear()}-${ + publishDate?.getMonth() + 1 + }-${publishDate?.getDate()}`, + }; + } +} +``` + +- We made a form which form controls' names are the same as BookDto +- We provided the `MAT_DIALOG_DEFAULT_OPTIONS` token to change Material Dialog options for this component. Provided options are only available for this component. + +Replace the `book-dialog.component.html` with following code: + +```html +

{{ '::NewBook' | abpLocalization }}

+ +
+ + {{'::Name' | abpLocalization}} * + + + + + {{'::Price' | abpLocalization}} * + + + + + {{'::Type' | abpLocalization}} * + + {{ '::Enum:BookType:' + type.value | abpLocalization }} + + + + + {{'::PublishDate' | abpLocalization}} * + + + + +
+
+ + + + +``` + +- We created a form with material form field components. +- We added 2 buttons for closing dialog and saving form in the `mat-dialog-actions` element. + +Create the `createBook` method and inject `MatDialog` in `book.component.ts`. Then use the material dialog's `open` method inside the `createBook` method: + +```typescript +import { BookDialogComponent } from "./components/book-dialog"; + +export class BookComponent { + constructor( + // ... + // inject dialog + public dialog: MatDialog + ) { + //... + } + //... other methods + createBook() { + const dialogRef = this.dialog.open(BookDialogComponent); + dialogRef.afterClosed().subscribe((result) => { + if (result) { + this.bookService.create(result).subscribe(() => { + this.list.get(); + }); + } + }); + } +} +``` + +- We displayed BookDialogComponent via Material Dialog. If the result has data after the dialog closes we made 2 HTTP requests for creating a book and refreshing the book list. + +Add create book button near the `mat-card-title` element in `book.component.html`: + +```html +{{ '::Menu:Books' | abpLocalization }} + +``` + +The final UI looks like below: + +![Book Create](./book-create.gif) + +### Edit Book + +We will use the same dialog component for editing the book. And we will add the `actions` column to the book list table. The actions column is a simple dropdown. We will use [Material Menu](https://material.angular.io/components/menu/overview) for creating dropdown + +Add `MatMenuModule` to `SharedModule` metadata's imports and exports array like this: + +```typescript +import { MatMenuModule } from "@angular/material/menu"; + +@NgModule({ + imports: [ + // other imports + MatMenuModule, + ], + exports: [ + // other exports + MatMenuModule, + ], +}) +export class SharedModule {} +``` + +Edit `columns` array and add `editBook` method in `book.component.ts` as shown below: + +```typescript +columns: string[] = ['actions', /* ... other columns*/]; + +editBook(id: string) { + this.bookService.get(id).subscribe((book) => { + const dialogRef = this.dialog.open(BookDialogComponent, { + data: book + }); + dialogRef.afterClosed().subscribe(result => { + if (result) { + this.bookService.update(id, result).subscribe(() => { + this.list.get(); + }); + } + }); + }); +} +``` + +- We passed the data to `BookDialogComponent` with passing the data property `open` method of the material dialog. +- We checked data after closing the dialog for sending HTTP requests as in the `Create Book` section. + +Add actions column before name column and add `mat-menu` end of file in the `book.component.html` as shown below: + +```html + + + + {{'::Actions' | abpLocalization}} + + + + + + + + + + + + + + +``` + +Get passed data which passed with material dialog's `open` method and use this data to create a form with initial values in `book-dialog.component.ts` as shown below: + +```typescript + constructor( + //inject data + @Inject(MAT_DIALOG_DATA) public data: BookDto, + ) { + } + + buildForm() { + this.form = this.fb.group({ + name: [this.data?.name /*modified*/, Validators.required], + type: [this.data?.type /*modified*/, Validators.required], + publishDate: [this.data?.publishDate ? new Date(this.data.publishDate) : null, /*modified*/, Validators.required], + price: [this.data?.price /*modified*/, Validators.required], + }); + } +``` + +Edit the dialog title if component has data, display **Edit Book** text otherwise **New Book** in `book-dialog.component.html`: + +```html +

+ {{ (data ? '::EditBook' : '::NewBook' )| abpLocalization }} +

+``` + +![Book Edit](book-edit.gif) + +### Delete Book + +In the ABP Framework, a confirmation popup displays when the delete button is clicked. We will create a Confirmation Dialog and display this dialog with Material Dialog. + +Create `ConfirmationDialogComponent` in `angular/src/shared/components` directory with following command: + +``` +yarn ng generate component shared/components/ConfirmationDialog --module shared +``` + +Replace `ConfirmationDialogComponent` with following code: + +```typescript +import { Component, Inject } from "@angular/core"; +import { + MAT_DIALOG_DATA, + MAT_DIALOG_DEFAULT_OPTIONS, +} from "@angular/material/dialog"; + +export interface ConfirmationDialogData { + title: string; + description: string; +} +@Component({ + selector: "app-confirmation-dialog", + templateUrl: "./confirmation-dialog.component.html", + styleUrls: ["./confirmation-dialog.component.scss"], + providers: [ + { + provide: MAT_DIALOG_DEFAULT_OPTIONS, + useValue: { hasBackdrop: true, width: "450px" }, + }, + ], +}) +export class ConfirmationDialogComponent { + constructor(@Inject(MAT_DIALOG_DATA) public data: ConfirmationDialogData) {} +} +``` + +Replace `confirmation-dialog.component.html` with the following code: + +```html + +
+ warning +

{{ data.title | abpLocalization }}

+

{{ data.description | abpLocalization }}

+
+
+ + + + +``` + +Replace `confirmation-dialog.component.scss` with following code: + +```scss +:host { + .dialog-container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + } + mat-icon.warn-icon { + font-size: 100px; + height: 100px; + width: 100px; + line-height: 100px; + } + p { + color: #777; + font-size: 16px; + } +} +``` + +Add `deleteBook` method to `BookComponent`: + +```typescript +import { BookDialogComponent } from './components/book-dialog/book-dialog.component'; +import { ConfirmationDialogComponent } from '../shared/components/confirmation-dialog/confirmation-dialog.component'; + +deleteBook(id: string) { + const confirmationDialogRef = this.dialog.open(ConfirmationDialogComponent, { + data: { + title: '::AreYouSure', + description: '::AreYouSureToDelete' + } + }); + confirmationDialogRef.afterClosed().subscribe(confirmationResult => { + if (confirmationResult) { + this.bookService.delete(id).subscribe(() => this.list.get()); + } + }); +} +``` + +Add delete button to actions' button menu template in `book.component.html`: + +```html + + + + + + + + +``` + +![Book Delete](./book-delete.gif) + +## Authorization + +You can follow steps for authorization at the [Web Application Development Tutorial - Part 5: Authorization](https://docs.abp.io/en/abp/latest/Tutorials/Part-5?UI=NG&DB=EF) + +## Author CRUD Actions + +> Please complete the following steps before starting this section +> +> - [Web Application Development Tutorial - Part 6: Authors: Domain Layer](https://docs.abp.io/en/abp/latest/Tutorials/Part-6) +> - [Web Application Development Tutorial - Part 7: Authors: Database Integration](https://docs.abp.io/en/abp/latest/Tutorials/Part-7) +> - [Web Application Development Tutorial - Part 8: Authors: Application Layer](https://docs.abp.io/en/abp/latest/Tutorials/Part-8) +> - Run following command in terminal at `angular` directory: +> `abp generate-proxy` + +In this section, we will create an author list page and author create/update dialog by following the same steps in the `Book CRUD Actions` section + +Run the following command in the terminal for creating author module and components: + +``` +yarn ng generate module author --module app --routing --route authors +``` + +Create `AuthorDialogComponent` in `angular/src/app/author/components` directory with following command: + +``` +yarn ng generate component author/components/AuthorDialog -m author +``` + +Add `SharedModule` to `AuthorModule`'s imports array: + +```typescript +import { NgModule } from "@angular/core"; +import { AuthorWithBooksRoutingModule } from "./author-with-books-routing.module"; +import { AuthorWithBooksComponent } from "./author-with-books.component"; +import { SharedModule } from "../shared/shared.module"; + +@NgModule({ + declarations: [AuthorComponent, AuthorDialogComponent], + imports: [SharedModule, AuthorRoutingModule], +}) +export class AuthorModule {} +``` + +Open the `src/app/route.provider.ts` file replace the `configureRoutes` function declaration as shown below: + +```typescript +function configureRoutes(routes: RoutesService) { + return () => { + routes.add([ + // other routes + { + path: "/authors", + name: "::Menu:Authors", + parentName: "::Menu:BookStore", + layout: eLayoutType.application, + }, + ]); + }; +} +``` + +Replace `AuthorDialogComponent` with following code below: + +```typescript +import { Component, Inject, OnInit } from "@angular/core"; +import { + MAT_DIALOG_DATA, + MAT_DIALOG_DEFAULT_OPTIONS, +} from "@angular/material/dialog"; +import { AuthorDto } from "@proxy/authors"; +import { FormBuilder, FormGroup, Validators } from "@angular/forms"; + +@Component({ + selector: "app-author-dialog", + templateUrl: "./author-dialog.component.html", + styleUrls: ["./author-dialog.component.scss"], + providers: [ + { + provide: MAT_DIALOG_DEFAULT_OPTIONS, + useValue: { hasBackdrop: true, width: "50vw" }, + }, + ], +}) +export class AuthorDialogComponent implements OnInit { + form: FormGroup; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: AuthorDto, + private fb: FormBuilder + ) {} + ngOnInit(): void { + this.buildForm(); + } + + buildForm() { + this.form = this.fb.group({ + name: [this.data?.name, Validators.required], + birthDate: [ + this.data?.birthDate ? new Date(this.data.birthDate) : null, + Validators.required, + ], + }); + } + + getFormValue() { + const { birthDate } = this.form.value; + return { + ...this.form.value, + publishDate: `${birthDate?.getFullYear()}-${ + birthDate?.getMonth() + 1 + }-${birthDate?.getDate()}`, + }; + } +} +``` + +Replace `author-dialog.component.html` with the following code below: + +```html +

+ {{ (data ? '::EditAuthor' : '::NewAuthor' )| abpLocalization }} +

+ +
+ + {{'::Name' | abpLocalization}} * + + + + + {{'::BirthDate' | abpLocalization}} * + + + + +
+
+ + + + +``` + +Replace `author.component.ts` with following code below: + +```typescript +import { Component, OnInit } from "@angular/core"; +import { ListService, PagedResultDto } from "@abp/ng.core"; +import { AuthorDto, AuthorService } from "@proxy/authors"; +import { FormGroup } from "@angular/forms"; +import { PageEvent } from "@angular/material/paginator"; +import { Sort } from "@angular/material/sort"; +import { MatDialog } from "@angular/material/dialog"; +import { AuthorDialogComponent } from "./components/author-dialog/author-dialog.component"; +import { ConfirmationDialogComponent } from "../shared/components/confirmation-dialog/confirmation-dialog.component"; + +@Component({ + selector: "app-author", + templateUrl: "./author.component.html", + styleUrls: ["./author.component.scss"], + providers: [ListService], +}) +export class AuthorComponent implements OnInit { + author = { items: [], totalCount: 0 } as PagedResultDto; + + form: FormGroup; + + columns = ["actions", "name", "birthDate"]; + + constructor( + public readonly list: ListService, + private authorService: AuthorService, + public dialog: MatDialog + ) {} + + ngOnInit(): void { + const authorStreamCreator = (query) => this.authorService.getList(query); + + this.list.hookToQuery(authorStreamCreator).subscribe((response) => { + this.author = response; + }); + } + + changePage(pageEvent: PageEvent) { + this.list.page = pageEvent.pageIndex; + } + + changeSort(sort: Sort) { + this.list.sortKey = sort.active; + this.list.sortOrder = sort.direction; + } + + createAuthor() { + const dialogRef = this.dialog.open(AuthorDialogComponent); + dialogRef.afterClosed().subscribe((result) => { + if (result) { + this.authorService.create(result).subscribe(() => { + this.list.get(); + }); + } + }); + } + + editAuthor(id: any) { + this.authorService.get(id).subscribe((author) => { + const dialogRef = this.dialog.open(AuthorDialogComponent, { + data: author, + }); + dialogRef.afterClosed().subscribe((result) => { + if (result) { + this.authorService.update(id, result).subscribe(() => { + this.list.get(); + }); + } + }); + }); + } + + deleteAuthor(id: string) { + const confirmationDialogRef = this.dialog.open( + ConfirmationDialogComponent, + { + data: { + title: "::AreYouSure", + description: "::AreYouSureToDelete", + }, + } + ); + confirmationDialogRef.afterClosed().subscribe((confirmationResult) => { + if (confirmationResult) { + this.authorService.delete(id).subscribe(() => this.list.get()); + } + }); + } +} +``` + +Replace `author.component.html` with the following code: + +```html + + + + {{ '::Menu:Authors' | abpLocalization }} +
+ +
+
+
+ + + + + + + + + + + + + + +
+ {{'::Actions' | abpLocalization}} + + + + {{'::Name' | abpLocalization}} + {{element.name}} + {{'::BirthDate' | abpLocalization}} + + {{ element.birthDate | date }} +
+ +
+
+ + + + + + +``` + +Open the `en.json` file under the `Localization/BookStore` folder of the `Acme.BookStore.AngularMaterial.Domain.Shared project` and add the following entries: + +```json + "Menu:Authors": "Authors", + "Authors": "Authors", + "AuthorDeletionConfirmationMessage": "Are you sure to delete the author '{0}'?", + "BirthDate": "Birth date", + "NewAuthor": "New author", + "EditAuthor": "Edit Author" +``` + +![Author](./author-crud.gif) + +## Author And Book Relation + +> Please complete the following steps before starting this section +> +> - Complete server-side parts [Web Application Development Tutorial - Part 10: Book to Author Relation](https://docs.abp.io/en/abp/latest/Tutorials/Part-10) until [The User Interface](https://docs.abp.io/en/abp/latest/Tutorials/Part-10?UI=NG&DB=EF#the-user-interface) section +> - Run following command in terminal at `angular` directory: +> `abp generate-proxy` + +In this section, we will add author selection to the book creation form, create one form for adding an author with books using Material Stepper and display the author's name in the book list page. + +### Author Selection + +We will add the author select box using Material Select and we will get authors from the server in `BookDialogComponent`. + +Replace `book-dialog.component.ts` in `app/src/book/components/book-dialog` with following code: + +```typescript +import { Component, Inject, OnInit } from "@angular/core"; +import { + MAT_DIALOG_DATA, + MAT_DIALOG_DEFAULT_OPTIONS, +} from "@angular/material/dialog"; +import { FormBuilder, FormGroup, Validators } from "@angular/forms"; +import { + AuthorLookupDto, + BookDto, + BookService, + bookTypeOptions, +} from "@proxy/books"; +import { Observable } from "rxjs"; +import { map } from "rxjs/operators"; + +@Component({ + selector: "app-book-dialog", + templateUrl: "./book-dialog.component.html", + styleUrls: ["./book-dialog.component.scss"], + providers: [ + { + provide: MAT_DIALOG_DEFAULT_OPTIONS, + useValue: { hasBackdrop: true, width: "50vw" }, + }, + ], +}) +export class BookDialogComponent implements OnInit { + form: FormGroup; + + bookTypes = bookTypeOptions; + + authors$: Observable; // this line added + + constructor( + private fb: FormBuilder, + @Inject(MAT_DIALOG_DATA) public data: BookDto, + bookService: BookService // inject bookService + ) { + this.authors$ = bookService.getAuthorLookup().pipe(map((r) => r.items)); // this line added + } + + ngOnInit(): void { + this.buildForm(); + } + + buildForm() { + this.form = this.fb.group({ + name: [this.data?.name, Validators.required], + type: [this.data?.type, Validators.required], + publishDate: [this.data?.publishDate, Validators.required], + price: [this.data?.price, Validators.required], + authorId: [this.data?.authorId, Validators.required], // this line added + }); + } +} +``` + +Add author select box before name field in `book-dialog.component.html` as shown below: + +```html + + + {{'::Author' | abpLocalization}} * + + {{ author.name }} + + + + + {{'::Name' | abpLocalization}} * + + +``` + +### Author Name Column + +Add the `authorName` item to columns array in `BookComponent`: + +```typescript +columns: string[] = [/* ...other columns*/, 'authorName']; +``` + +Add the `authorName` column after price column in `book.component.html`: + +```html + + + + +``` + +### Author With Books Form + +In this section, we will create an endpoint that takes author information and book list in the request body for creating an author and books by one request. + +Create a class named `CreateBookDto` in `Application.Contracts/Books` folder: + +```csharp +using System; +using System.ComponentModel.DataAnnotations; +using Acme.BookStore.Books; +using Volo.Abp.Application.Dtos; + +namespace Acme.BookStore.AngularMaterial.Books +{ + public class CreateBookDto: AuditedEntityDto + { + [Required] + [StringLength(128)] + public string Name { get; set; } + + [Required] + public BookType Type { get; set; } = BookType.Undefined; + + [Required] + [DataType(DataType.Date)] + public DateTime PublishDate { get; set; } = DateTime.Now; + + [Required] + public float Price { get; set; } + } +} +``` + +Create a class named `CreateAuthorWithBookDto` in `Application.Contracts/Books` folder: + +```csharp +using System.Collections.Generic; +using Acme.BookStore.AngularMaterial.Authors; + +namespace Acme.BookStore.AngularMaterial.Books +{ + public class CreateAuthorWithBookDto: CreateAuthorDto + { + public List Books { get; set; } + + public CreateAuthorWithBookDto() + { + Books = new List(); + } + } +} +``` + +Create a class named `AuthorWithDetailsDto` in `Application.Contracts/Books` folder: + +```csharp +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using Acme.BookStore.AngularMaterial.Authors; + +namespace Acme.BookStore.AngularMaterial.Books +{ + public class AuthorWithDetailsDto: AuthorDto + { + [Required] + public List Books { get; set; } + + public AuthorWithDetailsDto() + { + Books = new List(); + } + } +} +``` + +Add following line to `IBookAppService` interface which placed in `Application.Contracts/Books`: + +```csharp +Task CreateAuthorWithBooksAsync(CreateAuthorWithBookDto input); +``` + +Add mappings for the above DTO's lines to `AngularMaterialApplicationAutoMapperProfile.cs` + +```csharp +CreateMap(); +CreateMap(); +CreateMap(); +``` + +Inject `AuthorManager` and add `CreateAuthorWithBooksAsync` method to `BookAppService.cs`: + +```csharp +namespace Acme.BookStore.AngularMaterial.Books +{ + [Authorize(AngularMaterialPermissions.Books.Default)] + public class BookAppService: + CrudAppService< + Book, + BookDto, + Guid, + PagedAndSortedResultRequestDto, + CreateUpdateBookDto>, + IBookAppService + { + private readonly IAuthorRepository _authorRepository; + private readonly AuthorManager _authorManager; // this line added + public BookAppService( + IRepository repository, + IAuthorRepository authorRepository, + // inject AuthorManager + AuthorManager authorManager) + : base(repository) + { + _authorRepository = authorRepository; + _authorManager = authorManager;// this line added + GetPolicyName = AngularMaterialPermissions.Books.Default; + GetListPolicyName = AngularMaterialPermissions.Books.Default; + CreatePolicyName = AngularMaterialPermissions.Books.Create; + UpdatePolicyName = AngularMaterialPermissions.Books.Edit; + DeletePolicyName = AngularMaterialPermissions.Books.Delete; + } + + // Other class methods + + // This method added + public async Task CreateAuthorWithBooksAsync(CreateAuthorWithBookDto input) + { + var author = await _authorManager.CreateAsync( + input.Name, + input.BirthDate, + input.ShortBio + ); + + var createdAuthor = await _authorRepository.InsertAsync(author); + var authorWithBooks = ObjectMapper.Map(createdAuthor); + foreach (var book in input.Books) + { + var bookEntity = ObjectMapper.Map(book); + bookEntity.AuthorId = author.Id; + var createdBook = await Repository.InsertAsync(bookEntity); + var bookDto = ObjectMapper.Map(createdBook); + bookDto.AuthorName = author.Name; + authorWithBooks.Books.Add(bookDto); + } + + return authorWithBooks; + } + } +} +``` + +Open the `en.json` file under the `Localization/BookStore` folder of the `Acme.BookStore.AngularMaterial.Domain.Shared project` and add the following entries: + +```json + "AuthorInfo": "Author Info", + "BookInfo": "Book Info", + "AddBook": "Add Book", + "NewAuthorWithBook": "New Author With Book", + "AuthorWithBook:Success": "{0} added with books successfully" +``` + +Run generate-proxy command in the terminal at `angular` directory: + +``` +abp generate-proxy +``` + +We will create `AuthorWithBooksModule` with components and we will use Material Stepper inside the component. + +Run the following command for creating `AuthorWithBooksModule`: + +``` +yarn ng generate module author-with-books --module app --routing --route author-with-books +``` + +Add `SharedModule` to `AuthorWithBooksModule`'s imports array as shown below: + +```typescript +import { SharedModule } from "../shared/shared.module"; + +@NgModule({ + declarations: [AuthorWithBooksComponent], + imports: [ + SharedModule, // this line added + AuthorWithBooksRoutingModule, + ], +}) +export class AuthorWithBooksModule {} +``` + +Add `MatStepperModule` to `SharedModule`'s imports array as shown below: + +```typescript +import { MatStepperModule } from "@angular/material/stepper"; + +@NgModule({ + imports: [ + // other imports + MatStepperModule, + ], + exports: [ + // other exports + MatStepperModule, + ], +}) +export class SharedModule {} +``` + +We will create one form which includes author form group and book form array. We will use these form elements at the [Material Stepper](https://material.angular.io/components/stepper/overview) integration. + +Replace `author-with-books.component.ts` with the following code: + +```typescript +import { Component, OnInit } from "@angular/core"; +import { bookTypeOptions } from "@proxy/books"; +import { FormArray, FormBuilder, FormGroup, Validators } from "@angular/forms"; +import { STEPPER_GLOBAL_OPTIONS } from "@angular/cdk/stepper"; + +@Component({ + selector: "app-author-with-book", + templateUrl: "./author-with-book.component.html", + styleUrls: ["./author-with-book.component.scss"], + providers: [ + { + provide: STEPPER_GLOBAL_OPTIONS, + useValue: { displayDefaultIndicatorType: false }, + }, + ], +}) +export class AuthorWithBooksComponent implements OnInit { + form: FormGroup; + + bookTypes = bookTypeOptions; + + get bookFormArray(): FormArray { + return this.form.get("books") as FormArray; + } + + constructor( + private fb: FormBuilder, + private bookService: BookService, + private toasterService: ToasterService + ) {} + + ngOnInit(): void { + this.form = this.fb.group({ + author: this.fb.group({ + name: [null, Validators.required], + birthDate: [null, Validators.required], + }), + books: this.fb.array([this.getBookForm()]), + }); + } + + getBookForm() { + return this.fb.group({ + name: [null, Validators.required], + type: [null, Validators.required], + publishDate: [null, Validators.required], + price: [null, Validators.required], + }); + } + + addBook() { + this.bookFormArray.push(this.getBookForm()); + } + + deleteBook(i: number) { + this.bookFormArray.removeAt(i); + } + + save() { + if (this.form.invalid) { + return; + } + const authorWithBook: CreateAuthorWithBookDto = { + ...this.form.value.author, + books: this.form.value.books, + }; + this.bookService.createAuthorWithBooks(authorWithBook).subscribe((res) => { + this.toasterService.success("::AuthorWithBook:Success", "", { + messageLocalizationParams: [res.name], + }); + }); + } +} +``` + +- We created form until component initialization in the `ngOnInit` method +- In the `getBookForm` method, returned +- In the `addBook` method, we pushed a form group instance created in the `getBookForm` method to the book form array. We will execute this method when clicked on the **Add Book** button +- We deleted a form group instance by index from the book form array in the `deleteBook` method +- In the `save` method, we send an HTTP request for creating author and books if creation will be successful toaster message will be display + +Replace the `author-with-books.component.html` content with following code: + +```html + + +
+ + {{'::Name' | abpLocalization}} * + + + + + {{'::BirthDate' | abpLocalization}} * + + + + +
+
+ + +
+ + {{'::Name' | abpLocalization}} * + + + + + {{'::Price' | abpLocalization}} * + + + + + {{'::Type' | abpLocalization}} * + + {{'::SelectBookType' | abpLocalization}} + {{ '::Enum:BookType:' + type.value | abpLocalization + }} + + + + + {{'::PublishDate' | abpLocalization}} * + + + + +
+ +
+
+ + +
+
+ + person + + + book + +
+``` + +- We created the same author form where we created in `AuthorDialogComponent` and we gave the author form group to mat-step's stepConrol input +- We created the same book form which we created at `BookDialogComponent` except the author selection + +Replace `author-with-books.component.scss` content with following code: + +```scss +.book-form { + margin-top: 20px; +} +.button-container { + display: flex; + width: 100%; + justify-content: space-between; + margin-top: 25px; +} +``` + +Finally add Create Author With Books button near the Create Author button in `author.component.html`: + +```html +
+ + +
+``` + +Final UI looks as shown below: + +![Author With Books](./author-with-books.gif) + +## Conclusion + +We implemented Angular Material Components to our angular application which was created with ABP Framework. There is no blocker case of using angular libraries with the ABP framework. diff --git a/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/author-crud.gif b/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/author-crud.gif new file mode 100644 index 0000000000..be7e2246ed Binary files /dev/null and b/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/author-crud.gif differ diff --git a/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/author-with-books.gif b/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/author-with-books.gif new file mode 100644 index 0000000000..698507f780 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/author-with-books.gif differ diff --git a/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/book-create.gif b/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/book-create.gif new file mode 100644 index 0000000000..613ccf4a45 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/book-create.gif differ diff --git a/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/book-delete.gif b/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/book-delete.gif new file mode 100644 index 0000000000..a10d8a3536 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/book-delete.gif differ diff --git a/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/book-edit.gif b/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/book-edit.gif new file mode 100644 index 0000000000..387274aa38 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/book-edit.gif differ diff --git a/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/book-list.gif b/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/book-list.gif new file mode 100644 index 0000000000..1a88413e40 Binary files /dev/null and b/docs/en/Community-Articles/2020-12-11-Using-Angular-Material-Components-With-ABP-Framework/book-list.gif differ diff --git a/docs/en/Road-Map.md b/docs/en/Road-Map.md index 3a45ca1767..6f4213a6bd 100644 --- a/docs/en/Road-Map.md +++ b/docs/en/Road-Map.md @@ -2,6 +2,7 @@ You can always check the milestone planning and the prioritized backlog issues on [the GitHub repository](https://github.com/abpframework/abp/milestones) for a detailed road map. Here, a list of some major items in the backlog; +* CMS Kit: A set of reusable, extensible and composable Content Management System features. * [#2882](https://github.com/abpframework/abp/issues/2882) / Providing a gRPC integration infrastructure (while it is [already possible](https://github.com/abpframework/abp-samples/tree/master/GrpcDemo) to create or consume gRPC endpoints for your application, we plan to create endpoints for the [standard application modules](https://docs.abp.io/en/abp/latest/Modules/Index)) * [#236](https://github.com/abpframework/abp/issues/236) Resource based authorization system * [#6132](https://github.com/abpframework/abp/issues/6132) A New Theme alternative to the Basic Theme diff --git a/docs/en/Samples/Index.md b/docs/en/Samples/Index.md index f298ea49f5..b5dd0fab29 100644 --- a/docs/en/Samples/Index.md +++ b/docs/en/Samples/Index.md @@ -27,6 +27,9 @@ While there is no Razor Pages & MongoDB combination, you can check both document ### Other Samples +* **Event Organizer**: A sample application to create events (meetups) and allow others to register the events. Developed using EF Core and Blazor UI. + * [Source code](https://github.com/abpframework/abp-samples/tree/master/EventOrganizer) + * [Article](https://community.abp.io/articles/creating-an-event-organizer-application-with-the-blazor-ui-wbe0sf2z) * **Entity Framework Migrations**: A solution to demonstrate how to split your application into multiple databases each database contains different modules. * [Source code](https://github.com/abpframework/abp-samples/tree/master/EfCoreMigrationDemo) * [EF Core database migrations document](../Entity-Framework-Core-Migrations.md) @@ -59,6 +62,17 @@ While there is no Razor Pages & MongoDB combination, you can check both document * [Customize the SignIn Manager](https://community.abp.io/articles/how-to-customize-the-signin-manager-3e858753) * **GRPC Demo**: Shows how to add a gRPC service to an ABP Framework based web application and consume it from a console application. * [Source code](https://github.com/abpframework/abp-samples/tree/master/GrpcDemo) +* **Telerik Blazor Integration**: Shows how to install and use Telerik Blazor components with the ABP Framework. + * [Article](https://community.abp.io/articles/how-to-integrate-the-telerik-blazor-components-to-the-abp-blazor-ui-q8g31abb) +* **Angular Material Integration**: Implemented the web application tutorial using the Angular Material library. + * [Source code](https://github.com/abpframework/abp-samples/tree/master/AcmeBookStoreAngularMaterial) + * [Article](https://community.abp.io/articles/using-angular-material-components-with-the-abp-framework-af8ft6t9) +* **DevExtreme Angular Component Integration**: How to install and use DevExtreme components in the ABP Framework Angular UI. + * [Source code](https://github.com/abpframework/abp-samples/tree/master/DevExtreme-Angular) + * [Article](https://community.abp.io/articles/using-devextreme-angular-components-with-the-abp-framework-x5nyvj3i) +* **DevExtreme MVC / Razor Pages Component Integration**: How to install and use DevExtreme components in the ABP Framework MVC / Razor Pages UI. + * [Source code](https://github.com/abpframework/abp-samples/tree/master/DevExtreme-Mvc) + * [Article](https://community.abp.io/articles/using-devextreme-components-with-the-abp-framework-zb8z7yqv) * **Empty ASP.NET Core Application**: The most basic ASP.NET Core application with the ABP Framework installed. * [Source code](https://github.com/abpframework/abp-samples/tree/master/BasicAspNetCoreApplication) * [Documentation](../Getting-Started-AspNetCore-Application.md) \ No newline at end of file diff --git a/docs/en/Text-Templating.md b/docs/en/Text-Templating.md index 07f3b141ab..b080087ba8 100644 --- a/docs/en/Text-Templating.md +++ b/docs/en/Text-Templating.md @@ -187,9 +187,9 @@ var result = await _templateRenderer.RenderAsync( In this case, we haven't created a model class, but created an anonymous object as the model. -### PascalCase vs camelCase +### PascalCase vs snake_case -PascalCase property names (like `UserName`) is used as camelCase (like `userName`) in the templates. +PascalCase property names (like `UserName`) is used as snake_case (like `user_name`) in the templates. ## Localization diff --git a/docs/en/Tutorials/Part-7.md b/docs/en/Tutorials/Part-7.md index 5cae52a4b1..97d28691ae 100644 --- a/docs/en/Tutorials/Part-7.md +++ b/docs/en/Tutorials/Part-7.md @@ -150,7 +150,7 @@ namespace Acme.BookStore.Authors } ```` -* Inherited from the `EfCoreAuthorRepository`, so it inherits the standard repository method implementations. +* Inherited from the `EfCoreRepository`, so it inherits the standard repository method implementations. * `WhereIf` is a shortcut extension method of the ABP Framework. It adds the `Where` condition only if the first condition meets (it filters by name, only if the filter was provided). You could do the same yourself, but these type of shortcut methods makes our life easier. * `sorting` can be a string like `Name`, `Name ASC` or `Name DESC`. It is possible by using the [System.Linq.Dynamic.Core](https://www.nuget.org/packages/System.Linq.Dynamic.Core) NuGet package. @@ -211,7 +211,7 @@ namespace Acme.BookStore.Authors } ``` -* Inherited from the `MongoDbAuthorRepository`, so it inherits the standard repository method implementations. +* Inherited from the `MongoDbRepository`, so it inherits the standard repository method implementations. * `WhereIf` is a shortcut extension method of the ABP Framework. It adds the `Where` condition only if the first condition meets (it filters by name, only if the filter was provided). You could do the same yourself, but these type of shortcut methods makes our life easier. * `sorting` can be a string like `Name`, `Name ASC` or `Name DESC`. It is possible by using the [System.Linq.Dynamic.Core](https://www.nuget.org/packages/System.Linq.Dynamic.Core) NuGet package. @@ -221,4 +221,4 @@ namespace Acme.BookStore.Authors ## The Next Part -See the [next part](Part-8.md) of this tutorial. \ No newline at end of file +See the [next part](Part-8.md) of this tutorial. diff --git a/docs/en/UI/Angular/List-Service.md b/docs/en/UI/Angular/List-Service.md index 016b891159..03e2b5341a 100644 --- a/docs/en/UI/Angular/List-Service.md +++ b/docs/en/UI/Angular/List-Service.md @@ -1,6 +1,6 @@ # Working with Lists -`ListService` is a utility service to provide an easy pagination, sorting, and search implementation. +`ListService` is a utility service to provide easy pagination, sorting, and search implementation. @@ -35,7 +35,10 @@ class BookComponent { constructor( public readonly list: ListService, private bookService: BookService, - ) {} + ) { + // change ListService defaults here + this.list.maxResultCount = 20; + } ngOnInit() { // A function that gets query and returns an observable @@ -164,7 +167,7 @@ You may use observables in combination with [AsyncPipe](https://angular.io/guide ``` -> We do not recommend using NGXS store for CRUD pages, unless your application needs to share list information between components or use it later on in another page. +> We do not recommend using the NGXS store for CRUD pages unless your application needs to share list information between components or use it later on in another page. ## How to Refresh Table on Create/Update/Delete @@ -186,7 +189,7 @@ You may use observables in combination with [AsyncPipe](https://angular.io/guide this.store.dispatch(new DeleteBook(id)).subscribe(this.list.get); ``` -> We donot recommend using NGXS store for CRUD pages, unless your application needs to share list information between components or use it later on in another page. +> We do not recommend using the NGXS store for CRUD pages unless your application needs to share list information between components or use it later on in another page. ## How to Implement Server-Side Search in a Table @@ -210,7 +213,7 @@ We had to modify the `ListService` to make it work with `ngx-datatable`. Previou > ``` -As of v3.0, with ngx-datatable, the `page` property has to be set as `0` for inital page. Therefore, if you used `ListService` on your tables before and are going to keep `abp-table`, you need to make the following change: +As of v3.0, with ngx-datatable, the `page` property has to be set as `0` for the initial page. Therefore, if you used `ListService` on your tables before and are going to keep `abp-table`, you need to make the following change: ```html diff --git a/docs/en/UI/AspNetCore/Data-Tables.md b/docs/en/UI/AspNetCore/Data-Tables.md index a9dbf1eecf..b97d49d562 100644 --- a/docs/en/UI/AspNetCore/Data-Tables.md +++ b/docs/en/UI/AspNetCore/Data-Tables.md @@ -105,6 +105,32 @@ The `abp.libs.datatables.createAjax` method (used in the example above) adapts r This works automatically, so most of the times you don't need to know how it works. See the [DTO document](../../Data-Transfer-Objects.md) if you want to learn more about `IPagedAndSortedResultRequest`, `IPagedResult` and other standard interfaces and base DTO classes those are used in client to server communication. +The `createAjax` also supports you to customize request parameters and handle the responses. + +**Example:** + +````csharp +var inputAction = function () { + return { + id: $('#Id').val(), + name: $('#Name').val(), + }; +}; + +var responseCallback = function(result) { + + // your custom code. + + return { + recordsTotal: result.totalCount, + recordsFiltered: result.totalCount, + data: result.items + }; +}; + +ajax: abp.libs.datatables.createAjax(acme.bookStore.books.book.getList, inputAction, responseCallback) +```` + ### Row Actions `rowAction` is an option defined by the ABP Framework to the column definitions to show a drop down button to take actions for a row in the table. @@ -260,4 +286,4 @@ Assuming that the possible values for a column data is `f` and `m`, the `gender` ## Other Data Grids -You can use any library you like. For example, [see this article](https://community.abp.io/articles/using-devextreme-components-with-the-abp-framework-zb8z7yqv) to learn how to use DevExtreme Data Grid in your applications. \ No newline at end of file +You can use any library you like. For example, [see this article](https://community.abp.io/articles/using-devextreme-components-with-the-abp-framework-zb8z7yqv) to learn how to use DevExtreme Data Grid in your applications. diff --git a/docs/en/UI/AspNetCore/Tag-Helpers/Modals.md b/docs/en/UI/AspNetCore/Tag-Helpers/Modals.md index c811dee0bc..508d434671 100644 --- a/docs/en/UI/AspNetCore/Tag-Helpers/Modals.md +++ b/docs/en/UI/AspNetCore/Tag-Helpers/Modals.md @@ -11,7 +11,7 @@ Basic usage: ````xml Launch modal - + Woohoo, you're reading this text in a modal! @@ -33,6 +33,13 @@ A value indicates the positioning of the modal. Should be one of the following v * `false` (default value) * `true` +### Scrollable + +A value indicates the scrolling of the modal. Should be one of the following values: + +* `false` (default value) +* `true` + ### size A value indicates the size of the modal. Should be one of the following values: @@ -78,4 +85,4 @@ A value indicates the positioning of your modal footer buttons. Should be one of * `Center` * `Around` * `Between` -* `End` \ No newline at end of file +* `End` diff --git a/docs/en/UI/Blazor/Components/SubmitButton.md b/docs/en/UI/Blazor/Components/SubmitButton.md new file mode 100644 index 0000000000..1caec28c81 --- /dev/null +++ b/docs/en/UI/Blazor/Components/SubmitButton.md @@ -0,0 +1,25 @@ +# Blazor UI: SubmitButton component + +`SubmitButton` is a simple wrapper around `Button` component. It is used to be placed inside of page Form or Modal dialogs where it can response to user actions and to be activated as a default button by pressing an ENTER key. Once clicked it will go into the `disabled` state and also it will show a small loading indicator until clicked event is finished. + +## Quick Example + +```html + +``` + +Notice that we didn't specify any text, like `Save Changes`. This is because `SubmitButton` will by default pull text from the localization. If you want to change that you either specify a localization key or you can add custom content. + +### With localization key + +```html + +``` + +### With custom content + +```html + + @L["Save"] + +``` \ No newline at end of file diff --git a/docs/en/UI/Blazor/Global-Scripts-Styles.md b/docs/en/UI/Blazor/Global-Scripts-Styles.md index a9a69c76d0..68628d200a 100644 --- a/docs/en/UI/Blazor/Global-Scripts-Styles.md +++ b/docs/en/UI/Blazor/Global-Scripts-Styles.md @@ -35,4 +35,49 @@ namespace MyProject.Blazor > There is a BundleContributor class implementing `IBundleContributor` interface coming by default with the startup templates. So, most of the time, you don't need to add it manually. -> Bundle command adds style and script references individually. Bundling and minification support will be added to incoming releases. \ No newline at end of file +## Bundling And Minification +`abp bundle` command offers bundling and minification support for client-side resources(JavaScript and CSS files). `abp bundle` command reads the `appsettings.json` file inside the Blazor project and bundles the resources according to the configuration. You can find the bundle configurations inside `AbpCli.Bundle` element. + +Here are the options that you can control inside the `appsettings.json` file. + +`Mode`: Bundling and minification mode. Possible values are +* `BundleAndMinify`: Bundle all the files into a single file and minify the content. +* `Bundle`: Bundle all files into a single file, but not minify. +* `None`: Add files individually, do not bundle. + +`Name`: Bundle file name. Default value is `global`. + +`Parameters`: You can define additional key/value pair parameters inside this section. `abp bundle` command automatically sends these parameters to the bundle contributors, and you can check these parameters inside the bundle contributor, take some actions according to these values. + +Let's say that you want to exclude some resources from the bundle and control this action using the bundle parameters. You can add a parameter to the bundle section like below. + +```json +"AbpCli": { + "Bundle": { + "Mode": "BundleAndMinify", /* Options: None, Bundle, BundleAndMinify */ + "Name": "global", + "Parameters": { + "ExcludeThemeFromBundle":"true" + } + } + } +``` + +You can check this parameter and take action like below. + +```csharp +public class MyProjectNameBundleContributor : IBundleContributor +{ + public void AddScripts(BundleContext context) + { + } + + public void AddStyles(BundleContext context) + { + var excludeThemeFromBundle = bool.Parse(context.Parameters.GetValueOrDefault("ExcludeThemeFromBundle")); + context.Add("mytheme.css", excludeFromBundle: excludeThemeFromBundle); + context.Add("main.css"); + } +} +``` + diff --git a/docs/en/_resources/ddd-microservice-simple.psd b/docs/en/_resources/ddd-microservice-simple.psd new file mode 100644 index 0000000000..ad0946f132 Binary files /dev/null and b/docs/en/_resources/ddd-microservice-simple.psd differ diff --git a/docs/en/_resources/ui-db-options.psd b/docs/en/_resources/ui-db-options.psd new file mode 100644 index 0000000000..2c98b76a07 Binary files /dev/null and b/docs/en/_resources/ui-db-options.psd differ diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index be24432203..edfebc9544 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -698,6 +698,15 @@ } ] }, + { + "text": "Other Components", + "items": [ + { + "text": "SubmitButton", + "path": "UI/Blazor/SubmitButton.md" + } + ] + }, { "text": "Settings", "path": "UI/Blazor/Settings.md" diff --git a/docs/zh-Hans/Blob-Storing.md b/docs/zh-Hans/Blob-Storing.md index 99688ca47a..c233f3359e 100644 --- a/docs/zh-Hans/Blob-Storing.md +++ b/docs/zh-Hans/Blob-Storing.md @@ -21,7 +21,7 @@ ABP框架已经有以下存储提供程序的实现; * [Azure](Blob-Storing-Azure.md): 将BLOG存储在 [Azure BLOB storage](https://azure.microsoft.com/en-us/services/storage/blobs/)中. * [Aliyun](Blob-Storing-Aliyun.md): 将BLOB存储在[Aliyun Storage Service](https://help.aliyun.com/product/31815.html)中. * [Ninio](Blob-Storing-Minio.md): 将BLOB存储在[MinIO Object storage](https://min.io/)中. -* [Aws](Blob-Storing-Aws.md): 将BLOB存储在[Amazon Simple Storage Service](https://min.io/)中. +* [Aws](Blob-Storing-Aws.md): 将BLOB存储在[Amazon Simple Storage Service](https://aws.amazon.com/s3/)中. 以后会实现更多的提供程序,你可以为自己喜欢的提供程序创建[请求](https://github.com/abpframework/abp/issues/new),或者你也可以[自己实现](Blob-Storing-Custom-Provider.md)它并[贡献](Contribution/Index.md)到ABP框架. @@ -306,4 +306,4 @@ Configure(options => ## 另请参阅 -* [创建自定义BLOB存储提供程序](Blob-Storing-Custom-Provider.md) \ No newline at end of file +* [创建自定义BLOB存储提供程序](Blob-Storing-Custom-Provider.md) diff --git a/docs/zh-Hans/CLI.md b/docs/zh-Hans/CLI.md index 11f9964279..4c63dcd818 100644 --- a/docs/zh-Hans/CLI.md +++ b/docs/zh-Hans/CLI.md @@ -34,7 +34,7 @@ dotnet tool update -g Volo.Abp.Cli * **`generate-proxy`**: 生成客户端代理以使用HTTP API端点. * **`remove-proxy`**: 移除以前生成的客户端代理. * **`switch-to-preview`**: 切换到ABP框架的最新预览版本。 -* **`switch-to-preview`**: 切换解决方案所有ABP相关包为[夜间构建](Nightly-Builds.md)版本. +* **`switch-to-nightly`**: 切换解决方案所有ABP相关包为[夜间构建](Nightly-Builds.md)版本. * **`switch-to-stable`**: 切换解决方案所有ABP相关包为最新的稳定版本. * **`translate`**: 当源代码控制存储库中有多个JSON[本地化](Localization.md文件时,可简化翻译本地化文件的过程. * **`login`**: 使用你在[abp.io](https://abp.io/)的用户名和密码在你的计算机上认证. @@ -125,7 +125,8 @@ abp update [options] * `--nuget`: 仅更新的NuGet包 * `--solution-path` 或 `-sp`: 指定解决方案路径/目录. 默认使用当前目录 * `--solution-name` 或 `-sn`: 指定解决方案名称. 默认在目录中搜索`*.sln`文件. -*`--check-all`: 分别检查每个包的新版本. 默认是 `false`. +* `--check-all`: 分别检查每个包的新版本. 默认是 `false`. +* `--version` or `-v`: 指定用于升级的版本. 如果没有指定,则使用最新版本. ### add-package diff --git a/docs/zh-Hans/Domain-Driven-Design-Implementation-Guide.md b/docs/zh-Hans/Domain-Driven-Design-Implementation-Guide.md new file mode 100644 index 0000000000..8a6ec1de9b --- /dev/null +++ b/docs/zh-Hans/Domain-Driven-Design-Implementation-Guide.md @@ -0,0 +1,1979 @@ +# 实现领域驱动设计 + +## 总述 + +本文是实现领域驱动设计(DDD)的**实用指南**.虽然在实现中依赖了ABP框架,但是本文中的概念,理论和设计模式同样适用于其它类型的项目,不仅限于.Net项目. + +### 目标 + +本文的目标是: + +* **介绍并解释**DDD的架构,概念,原理及构建. +* **解释**ABP框架的分层架构及解决方案结构. +* 通过**案例**,介绍实现DDD的一些**规则**及最佳实践. +* 展示**ABP框架**为DDD的实现提供了哪些基础设施. +* 最后,基于软件开发**最佳实践**和我们的经验提供**建议**来创建一个**可维护的代码库**. + +### 简单的代码 + +> **踢足球**非常**简单**,但是**踢简单的足球**却**非常难**.— 约翰·克鲁伊夫(Johan Cruyff) + +在编码的世界中,引用此名言: + +> **写代码**非常**简单**,但是**写简单的代码**却**非常难** — ??? + +在本文中,我们将介绍一些容易实现的规则. + +随着**应用程序的变化**,有时候,为了节省开发时间会**违反一些本应遵守的规则**,使得代码变得**复杂**且难以维护.短期来看确实节省了开发时间,但是后期可能需要花费更多的时间为之前的偷懒而**买单**.**无法对原有的代码进行维护**,导致大量的逻辑都需要进行**重写**. + +如果你**遵循规则并按最佳实践的方式**进行编码,那么你的代码将易于维护,你的业务逻辑将**更快的满足**需求的变化. + +## 什么是领域驱动设计? + +领域驱动设计(DDD)是一种将实现与**持续进化**的模型连接在一起来满足**复杂**需求的软件开发方法. + +DDD适用于**复杂领域**或**较大规模**的系统,而不是简单的CRUD程序.它着重与**核心领域逻辑**,而不是基础架构.这样有助于构建一个**灵活**,模块化,**可维护**的代码库. + +### OOP & SOLID + +实现DDD高度依赖面对对象编程思想(OOP)和[SOLID](https://zh.wikipedia.org/wiki/SOLID_(%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%AE%BE%E8%AE%A1))原则.事实上,DDD已经**实现**并**延伸**了这些原则,因此,**深入了解**OOP和SOLID对实施DDD十分有利. + +### DDD分层与整洁架构 + +基于DDD的架构分为四个基础层 + +![domain-driven-design-layers](images/domain-driven-design-layers.png) + +**业务逻辑**分为两层,分别为 *领域(Domain)* 层和 *应用(Application)* 层,它们包含不同类型的业务逻辑. + +* **领域层**:只实现领域业务逻辑,与用例无关. +* **应用层**:基于领域层来实现满足用例的业务逻辑.用例可以看作是用户界面(UI)或外部应用程序的交互. +* **展现层**:包含应用程序的UI元素. +* **基础设施层**:通过对第三方库的集成或抽象,来满足其它层的非核心业务逻辑的实现. + +同样的分层架构也可以如下图所示:被称为 **整洁架构**, 又或者称为 **洋葱架构**: + +![domain-driven-design-clean-architecture](images/domain-driven-design-clean-architecture.png) + +在整洁架构中,**每层只依赖内部的层**,独立的层在圆圈的最中心,也就是领域层. + +### 核心构建组成 + +DDD的关注点在**领域层**和**应用层**上,而展现层和基础设施层则视为*细节*(这个词原文太抽象,自己体会吧),业务层不应依赖它们. + +这并不意味着展现层和基础设施层不重要.它们非常重要,但*UI框架* 和 *数据库提供程序* 需要你自己定义规则和总结最佳实践.这些不在DDD的讨论范围中. + +本节将介绍领域层和应用层的基本构建组件. + +#### 领域层构建组成 + +* **实体(Entity)**: [实体](Entities.md)是种领域对象,它有自己的属性(状态,数据)和执行业务逻辑的方法.实体由唯一标识符(Id)表示,不同ID的两个实体被视为不同的实体. +* **值对象(Value Object)**: [值对象](Value-Objects.md)是另外一种类型的领域对象,使用值对象的属性来判断两个值对象是否相同,而非使用ID判断.如果两个值对象的属性值全部相同就被视为同一对象.值对象通常是不可变的,大多数情况下它比实体简单. +* **聚合(Aggregate) 和 聚合根(Aggregate Root)**: [聚合](Entities.md)是由**聚合根**包裹在一起的一组对象(实体和值对象).聚合根是一种具有特定职责的实体. +* **仓储(Repository)** (接口): [仓储](Repositories.md)是被领域层或应用层调用的数据库持久化接口.它隐藏了DBMS的复杂性,领域层中只定义仓储接口,而非实现. +* **领域服务(Domain Service)**: [领域服务](Domain-Services.md)是一种无状态的服务,它依赖多个聚合(实体)或外部服务来实现该领域的核心业务逻辑. +* **规约(Specification)**: [规约](Specifications.md)是一种**强命名**,**可重用**,**可组合**,**可测试**的实体过滤器. +* **领域事件(Domain Event)**: [领域事件](Event-Bus.md)是当领域某个事件发生时,通知其它领域服务的方式,为了解耦领域服务间的依赖. + +#### 应用层构建组成 + +* **应用服务(Application Service)**: [应用服务](Application-Services.md)是为实现用例的无状态服务.展现层调用应用服务获取DTO.应用服务调用多个领域服务实现用例.用例通常被视为一个工作单元. +* **数据传输对象(DTO)**: [DTO](Data-Transfer-Objects.md)是一个不含业务逻辑的简单对象,用于应用服务层与展现层间的数据传输. +* **工作单元(UOW)**: [工作单元](Unit-Of-Work.md)是事务的原子操作.UOW内所有操作,当成功时全部提交,失败时全部回滚. + +## 实现领域驱动:重点 + +### .NET解决方案分层 + +下图是使用[ABP的启动模板](Startup-Templates/Application.md)创建的解决方案: + +![domain-driven-design-vs-solution](images/domain-driven-design-vs-solution.png) + +解决方案名为 `IssueTracking` ,它包含多个项目.该解决方案出于**DDD原则**及**开发**和**部署**的实践来进行分层.后面会在各小节中介绍解决方案中的项目. + +> 在使用启动模板时,如果选择了其它类型的UI或*数据库提供程序*,解决方案的结构会略有不同.但是领域层和应用层是一样的,这才是DDD的重点.如果你想了解有关解决方案的更多信息,请参见[启动模板](Startup-Templates/Application.md). + +#### 领域层 + +领域层分为两个项目: + +* `IssueTracking.Domain`是**领域层中必需**的,它包含之前介绍的**构建组成**(实体,值对象,领域服务,规约,仓储接口等). +* `IssueTracking.Domain.Shared`是领域层中**很薄的项目**,它只包含领域层与其它层共享的数据类型的定义.例如,枚举,常量等. + +#### 应用层 + +应用层也被分为了两个项目: + +* `IssueTracking.Application.Contracts`包含**接口**的定义及接口依赖的**DTO**,此项目可以被展现层或其它客户端应用程序引用. +* `IssueTracking.Application`是**应用层中必需**的,它实现了`IssueTracking.Application.Contracts`项目中定义的接口. + +#### 展现层 + +* `IssueTracking.Web`是一个ASP.NET Core MVC / Razor Pages应用程序.它是提供UI元素及API服务的可执行程序. + +> ABP框架还支持其它类型的UI框架,包括[Angular](UI/Angular/Quick-Start.md)和[Blazor](UI/Blazor/Overall.md).当选择*Angular*或*Blazor*时,解决方案不会有`IssueTracking.Web`项目.但是会添加`IssueTracking.HttpApi.Host`在解决方案中,此项目会提供HTTP API供UI调用. + +#### 远程服务层 + +* `IssueTracking.HttpApi`包含了HTTP API的定义.它通常包含*MVC Controller* 和 *Model*(如果有).因此,你可以在此项目中提供HTTP API. + +> 大多数情况下,通过使用*API Controller* 包装应用服务,供客户端远程调用.ABP框架的[API自发现系统](API/Auto-API-Controllers.md)可以自动将应用服务公开为API,因此,通常不需要在此项目中再创建Controller.出于需要手动添加额外Controller的情况,也包含在模板解决方案中. + +* `IssueTracking.HttpApi.Client`当C#客户端应用程序需要调用`IssueTracking.HttpApi`的API时,这个项目非常有用.客户端程序仅需引用此项目就可以通过依赖注入方式,远程调用应用服务.它是通过ABP框架的[动态C#客户端API代理系统](API/Dynamic-CSharp-API-Clients.md)来实现的. + +> 在解决方案文件夹`test`下,有一个名为`IssueTracking.HttpApi.Client.ConsoleTestApp`的控制台程序.它演示了如何使用`IssueTracking.HttpApi.Client`项目来远程调用应用程序公开的API.因为只是演示,你可以删除此项目,再或者你认为`IssueTracking.HttpApi`不需要,同样可以删除. + +#### 基础设施层 + +你可能只创建一个基础设施项目来完成所有抽象类的定义及外部类的集成,又或者为不同的依赖创建多个不同的项目. + +我们建议采用一种平衡的方法:为主要的依赖的库(例如 Entity Framework Core)创建一个独立的项目,为其它的依赖库创建一个公共的基础设施项目. + +ABP的启动解决方案中包含两个用于集成Entity Framework Core的项目: + +* `IssueTracking.EntityFrameworkCore`是必需的,因为需要集成*EF Core*.应用程序的`数据库上下文(DbContext)`,数据库对象映射,仓储接口的实现,以及其它与*EF Core*相关的内容都位于此项目中. +* `IssueTracking.EntityFrameworkCore.DbMigrations`是管理Code First方式数据库迁移记录的特殊项目.此项目定义了一个独立的`DbContext`来追踪迁移记录.只有当添加一个新的数据库迁移记录或添加一个新的[应用模块](Modules/Index.md)时,才会使用此项目,否则,其它情况无需修改此项目内容. + +> 你可能想知道为什么会有两个EF Core项目,主要是因为[模块化](Module-Development-Basics.md).每个应用模块都有自己独立的`DbContext`,你的应用程序也有自己`DbContext`.`DbMigrations`项目包含**合并**所有模块迁移记录的**单个迁移路径**.虽然大多数情况下你无需过多了解,但也可以查看[EF Core迁移](Entity-Framework-Core-Migrations.md)了解更多信息. + +#### 其它项目 + +另外还有一个项目`IssueTracking.DbMigrator`,它是一个简单的控制台程序,用来执行数据库迁移,包括**初始化**数据库及创建**种子数据**.这是一个非常实用的应用程序,你可以在开发环境或生产环境中使用它. + +### 项目间的依赖关系 + +下图展示了解决方案中项目间的依赖关系(有些项目比较简单就未展示): + +![domain-driven-design-project-relations](images/domain-driven-design-project-relations.png) + +之前已介绍了这些项目.现在,我们来解释依赖的原因: + +* `Domain.Shared` 所有项目直接或间接依赖此项目.此项目中的所有类型都可以被其它项目所引用. +* `Domain` 仅依赖`Domain.Shared`项目,因为`Domain.Shared`本就属于领域层的一部分.例如,`Domain.Shared`项目中的枚举类型 `IssueType` 被`Domain`项目中的`Issue`实体所引用. +* `Application.Contracts` 依赖`Domain.Shared`项目,可以在DTO中重用`Domain.Shared`中的类型.例如,`Domain.Shared`项目中的枚举类型 `IssueType` 同样被`Contracts`项目中的`CreateIssueDto`DTO所引用. +* `Application` 依赖`Application.Contracts`项目,因为此项目需要实现应用服务的接口及接口使用的DTO.另外也依赖`Domain`项目,因为应用服务的实现必须依赖领域层中的对象. +* `EntityFrameworkCore` 依赖`Domain`项目,因为此项目需要将领域对象(实体或值对象)映射到数据库的表,另外还需要实现`Domain`项目中的仓储接口. +* `HttpApi` 依赖`Application.Contacts`项目,因为Controllers需要注入应用服务. +* `HttpApi.Client` 依赖`Application.Contacts`项目,因为此项目需要是使用应用服务. +* `Web` 依赖`HttpApi`项目,因为此项目对外提供HTTP APIs.另外Pages或Components 需要使用应用服务,所以还间接依赖了`Application.Contacts`项目 + +#### 虚线依赖 + +你在上图中会发现用虚线表示了另外两个依赖.`Web`项目依赖了 `Application` and `EntityFrameworkCore`,理论上`Web`不应该依赖这两个项目,但实际上依赖了.原因如下: + +`Web`是最终的运行程序,是负责托管Web的宿主,它在运行时需要**应用服务和仓储的实现类**. + +这种依赖关系的设计,可能会让你有机会在展现层直接使用到EF Core的对象,**应该严格禁止这样的做法**.如果想在解决方案分层上规避这种问题,有下面两种方式,相对复杂一些: + +* 将`Web`项目类型改为razor类库,并创建一个新项目,比如`Web.Host`,`Web.Host`依赖`Web`,`Application`,`EntityFrameworkCore`三个项目,并作为Web宿主程序运行.注意,不要写任何与UI相关的代码,只是作为**宿主运行**. +* 在`Web`项目中移除对`Application`和`EntityFrameworkCore`的引用,`Web`在启动时,再动态加载程序集``IssueTracking.Application.dll`和`IssueTracking.EntityFrameworkCore.dll`.可以使用ABP框架的[插件模块](PlugIn-Modules.md)来动态加载程序集. + +### DDD模式的应用程序执行顺序 + +下图展示了基于DDD模式下的Web应用程序执行顺序: + +![](images/domain-driven-design-web-request-flow.png) + +* 通常由UI(用例)发起一个HTTP请求到服务器. +* 由展现层(或分布式服务层)中的一个*MVC Controller*或*Razor Page Handler*处理请求,在这个阶段可以执行一些AOP逻辑([授权](Authorization.md),[验证](Validation.md),[异常处理](Exception-Handling.md)等),*MVC Controller*或*Razor Page Handler*调用注入的应用服务接口,并返回其调用后的结果(DTO).. +* 应用服务使用领域层的对象(实体,仓储接口,领域服务等)来实现UI(用例)交互.此阶段同样可以执行一些AOP逻辑(授权,验证等).应用服务中的每个方法应该是一个[工作单元](Unit-Of-Work.md),代表它是一次原子性操作. + +跨域问题大多数由**ABP框架自动实现**,通常不需要为此额外编码. + +### 通用原则 + +在详细介绍之前,我们先来看一些DDD的总体原则. + +#### 数据库提供程序 / ORM 独立原则 + +领域层和应用层应该与*数据库提供程序 / ORM*无关.领域层和应用层仅依赖仓储接口,并且仓储接口不依赖特定的ORM对象. + +原因如下: + +1. 未来领域层或应用层的基础设施会发生改变,例如,需要支持另外一种数据库类型,因此需要保持**领域层或应用层的基础设施是独立的**. +2. 将基础设施的实现隐藏在仓储中,使得领域层或应用层更**专注于业务逻辑代码**. +3. 可以通过模拟仓储接口,使得自动化测试更为方便. + +> 关于此原则, `EntityFrameworkCore`项目只被启动程序项目所引用,解决方案中其它项目均未引用. + +##### 关于数据库独立原则的讨论 + +**原因1**会非常影响你**领域对象的建模**(特别是实体间的关系)及**应用程序的代码**.假如,开始选择了关系型数据库,并使用了[Entity Framework Core](Entity-Framework-Core.md),后面尝试切换到[MongoDB](MongoDB.md),那么 **EF Core 中一些非常用的特性**你就不能使用了,例如: + +* 无法使用[变更追踪](https://docs.microsoft.com/zh-cn/ef/core/querying/tracking) ,因为*MongoDB provider*没有提供此功能,因此,你始终需要显式的更新已变更的实体. +* 无法在不同的聚合间使用[导航属性](https://docs.microsoft.com/zh-cn/ef/core/modeling/relationships),因为文档型数据库是不支持的.有关更多信息,请参见"规则:聚合间仅通过Id关联". + +如果你认为这些功能对你很**重要**,并且你永远都不会**离开** *EF Core*,那么我们认为你可以忽略这一原则.假如你在设计实体关系时使用了*EF Core*,你甚至可以在应用层引用*EF Core Nuget*包,并直接使用异步的LINQ扩展方法,例如 `ToListAsync()`(有关更多信息,请参见[仓储](Repositories.md)文档中的*IQueryable*和*Async Operations*). + +但是我们仍然建议采用仓储模式来隐藏基础设施中实现过程. + +#### 展现层技术无关原则 + +展现层技术(UI框架)时现代应用程序中最多变的部分之一.**领域层和应用层**应该对展现层所采用的技术或框架**一无所知**.使用ABP启动模板就非常容易实现此原则. + +在某些情况下,你可能需要在应用层和展现层中写重复的逻辑,例如,参数验证和授权检查.展现层检查出于**用户体验**,应用层或领域层检查出于**数据安全性**和**数据完整性**. + +#### 关注状态的变化,而不是报表/查询 + +DDD关注领域对象的**变化和相互作用**,如何创建或修改一个具有数据**完整性,有效性**,符合**业务规则**的实体对象. + +DDD忽略**领域对象的数据展示**,这并不意味着它们并不重要,如果应用程序没有精美的看板和报表,谁会愿意用呢?但是报表是另外一个讨论话题,你可以通过使用SQL Server报表功能或ElasticSearch来提供数据展示,又或者使用优化后的SQL查询语句,创建数据库索引或存储过程.唯一的原则是不要将这些内容混入领域的业务逻辑中. + +## 实现领域驱动:构建组成 + +这是本指南的重要部分,我们将通过示例介绍并解释一些**明确的规则**,在实现领域驱动设计时,你可以遵循这些规则并将其应用于解决方案中. + +### 领域 + +示例中会使用一些概念,这些概念在Github中被使用,例如, `Issue`(问题), `Repository`(仓库), `Label`(标签) 和`User`(用户).下图中展示了一些聚合,聚合根,实体,值对象以及它们之间的关系: + +![domain driven design example schema](images/domain-driven-design-example-domain-schema.png) + +**问题聚合** 由`Issue` 聚合根,及其包含的 `Comment` 和`IssueLabel` 集合组成.我们将重要讨论 `Issue` 聚合根: + +![domain-driven-design-issue-aggregate-diagram](images/domain-driven-design-issue-aggregate-diagram.png) + +### Aggregates + +如前所述, [聚合](Entities.md)是由**聚合根**包裹在一起的一组对象(实体和值对象).本节将介绍于聚合的有关原理和规则. + +> 后面的文档中,我们将使用 *实体* 替代 *聚合根* 或 *子集合实体* ,除非我们明确指明使用 *聚合根* 或 *子集合实体* . + +#### 聚合 / 聚合根 原则 + +##### 业务规则 + +实体负责实现与其自身属性相关的业务规则.同时*聚合根实体*还负责它们的子集合实体. + +聚合应该通过领域规则和约束来保证自身的**完整性**和**有效性**.这意味着,实体与DTO是不同的,实体应该比DTO多了些**实现业务逻辑的方法**.我们应该尽可能地在实体上实现业务规则. + +##### 独立单元 + +应该在一个独立的单元中完成**一个聚合的获取及保存**,包括自身属性及其子集合.假如我们需要在`Issue`中添加一个新的`Comment`,步骤如下: + +* 从数据库中获取一个 `Issue` 对象,包括所有子集合(`Comments`和`IssueLabels`). +* 使用 `Issue` 实体上的添加新`Comment`的方法,例如 `Issue.AddComment(...);`. +* 在数据库的单次操作中完成整个 `Issue`对象(包括子集合)的保存. + +对于在关系型数据库上用过 **EF Core** 的开发人员会认为,获取`Issue`的同时加载子集合没有必要并且还影响性能.为什么不使用SQL语句`Insert`来直接插入记录呢? + +这样做的原因是我们需要执行业务规则来保证数据的一致性和完整性.假如有一个业务规则:"用户不能对已锁定的问题进行评论".那如何在不查询数据库的情况下,获取问题是否已被锁定?所以,只有关联的对象都被加载了的时候,我们才可以执行业务规则. + +另外,使用**MongoDB**的开发人员就认为此原则很好理解.在MongoDB中,聚合对象(包含子集合)会被保存到一个`collection`中.因而,无需任何其它配置,就可以实现查询一个聚合,同时所有子对象. + +ABP框架有助于你实现这一原则 + +**例子: 问题追加评论** + +````csharp +public class IssueAppService : ApplicationService, IIssueAppService +{ + private readonly IRepository _issueRepository; + + public IssueAppService(IRepository issueRepository) + { + _issueRepository = issueRepository; + } + + [Authorize] + public async Task CreateCommentAsync(CreateCommentDto input) + { + var issue = await _issueRepository.GetAsync(input.IssueId); + issue.AddComment(CurrentUser.GetId(), input.Text); + await _issueRepository.UpdateAsync(issue); + } +} +```` + +通过`_issueRepository.GetAsync`方法来获取`Issue`对象时,默认就已经加载了所有子集合.对于MongoDB很简单,EF Core 则需要额外配置,一旦配置,ABP仓储类会自动处理.`_issueRepository.GetAsync`方法还有个可选参数`includeDetails`,可以传`false`,手动禁止加载子集合. + +> 如何配置及替代方案,请参考[EF Core document](Entity-Framework-Core.md)的*加载关联实体* 章节. + +`Issue.AddComment`接收两个参数,分别是`userId`和`text`,再执行自己的业务规则,最终将评论添加到`Issue`的评论集合中. + +最后,我们使用`_issueRepository.UpdateAsync`方法,将对象保存到数据库中. + +> EF Core 具有**变更追踪**的功能,因此,不需要调用`_issueRepository.UpdateAsync`方法.ABP的工作单元会再方法结束时,自动执行`DbContext.SaveChanges()`的.如果使用MongoDB则需要显式手动调用. +> +> 因此,当需要额外编写仓储层的实现,应该在实体变化时始终调用 `UpdateAsync` 方法. + +##### 事务边界 + +通常认为一个聚合就是一个事务边界.如果用例只涉及单个聚合,那么读取及修改就是一个操作单元.对聚合内所有对象的修改都将作为原子操作一起保存,无需显式创建数据库事务. + +但是,实际上,可能需要在一个用例中更改**多个聚合对象的实例**,并且还要求创建事务来保证**原子更新**和**数据一致性**.因此,ABP框架提供了为每个用例(应用服务中的方法),可以创建显式事务的功能.有关更多信息,请参见文档[工作单元](Unit-Of-Work.md). + +##### 序列化 + +一个聚合(包含聚合根及子集合)可以被序列化或反序列化.例如,MongoDB在保存对象到数据库时,会将聚合序列化为JSON文件,读取时再进行反序列化. + +> 使用关系型数据库+ORM时,这个原则不是必须的,但是,这是领域驱动设计的重要实践. + +以下规则遵循序列化原则 + +#### 聚合/聚合根规则及最佳实践 + +以下规则是遵循上述原则. + +##### 聚合间只通过ID相互引用 + +聚合应该只引用其它聚合的ID,也就是说,不允许定义导航属性关联至其它聚合. + +* 该规则遵循了可序列化原则. +* 该规则还可以避免不同聚合彼此间的相互操作以及业务逻辑的暴露. + +下图中,可以看到两个聚合根,`GitRepository` 和`Issue` : + +![domain-driven-design-reference-by-id-sample](images/domain-driven-design-reference-by-id-sample.png) + +* `GitRepository` 不应该包含 `Issue`的集合,因为`Issue`属于不同的聚合. +* `Issue` 不应该包含导航属性至 `GitRepository` .因为 `GitRepository`属于不同的聚合. +* `Issue` 可以有 `RepositoryId` 的引用. + +因此,若要获取`Issue`关联的 `GitRepository`对象,需要使用`Issue`的`RepositoryId`在数据库中进行一次查询. + +###### 对于EF Core和关系型数据库 + +MongoDB中不适合使用导航属性或集合的,原因是:当前源聚合对象会被序列化为JSON,其中会保存导航目标聚合的副本. + +在使用EF Core在关系型数据库上进行操作时,开发者可能认为此规则没必要.但是我们认为这是一条非常重要的规则,有助于降**低领域的复杂性**减少风险.我们强烈建议遵守此规则.如果你确定要忽略此规则,请参见上面的"关于数据库独立原理的讨论"章节. + +##### 保持聚合尽量的小 + +保持聚合简单而小巧是一个比较好的做法.因为聚合的读取与保存是一个整体,当处理较大对象时会出现性能问题,如下所示: + +![domain-driven-design-aggregate-keep-small](images/domain-driven-design-aggregate-keep-small.png) + +角色聚合包含`UserRole`值对象集合,方便查询该角色下有哪些用户.注意,`UserRole`不是聚合,并且也遵守了*聚合间只通过ID相互引用*的规则.但是在现实场景中,一个角色可能被给成千上万个用户,当从数据库中加载一个角色时,会关联加载数千个用户对象,这里会有 严重的性能问题. + +反过来看,`User`也可以有`Roles` 集合,现实中一个用户不会具有太多的角色,因此采用`User`关联`Roles`这种方式比较合适. + +当使用**非关系型数据库时**,`User`和`Role` 同时都有关联子集合,会出现另外一个问题.相同的记录会被重复记录在不同的集合中,并且难以保证数据一致性(需要添加记录到`User.Roles`和`Role.Users`中) + +因此,请根据以下注意事项来确定聚合的边界: + +* 同时被使用的对象. +* 查询(读取/保存)性能和内存消耗. +* 数据完整性,有效性,一致性. + +现实情况: + +* 大多数聚合根**没有子集合**. +* 子集合的数量控制在**100-150个**.如果集合数量超过150个,考虑将子对象改成聚合根. + +##### 聚合根 / 实体的主键 + +* 聚合根通常具有唯一的标识符ID (主键: PK).我们建议使用 `Guid`作为聚合根的主键类型. (原因请参见[Guid生成文档](Guid-Generation.md)). +* 聚合中的实体(非聚合根)可以使用联合主键. + +如图所示: + +![domain-driven-design-entity-primary-keys](images/domain-driven-design-entity-primary-keys.png) + +* `Organization`有一个`Guid`的标识符 (`Id`). +* `OrganizationUser`是一个子集合,使用 `OrganizationId` 和`UserId`作为联合主键. + +并不是所有的子集合的主键都是联合主键,有些情况下,可以使用单独的`Id`作为主键. + +> 联合主键实际上时关系型数据库中的概念,因为子集合对象有与之对应的数据库表,而表也要有主键.但是在非关系型数据库中,无需为子集合实体定义主键,因为它们本身就已属于一个聚合根. + +##### 聚合根 / 实体的构造函数 + +构造函数是实体生命周期的开始被执行.以下是构造函数的编写建议: + +* 将实体的**必填属性**作为构造函数参数,这样可以创建一个**有效(符合规则)的实体**.另外,将非必填属性作为构造函数的可选参数. +* 参数必须**检查有效性**. +* 所有**子集合**对象必须被初始化. + +**示例: `Issue` (聚合根) 构造函数** + +````csharp +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Volo.Abp; +using Volo.Abp.Domain.Entities; + +namespace IssueTracking.Issues +{ + public class Issue : AggregateRoot + { + public Guid RepositoryId { get; set; } + public string Title { get; set; } + public string Text { get; set; } + public Guid? AssignedUserId { get; set; } + public bool IsClosed { get; set; } + public IssueCloseReason? CloseReason { get; set; } //enum + + public ICollection Labels { get; set; } + + public Issue( + Guid id, + Guid repositoryId, + string title, + string text = null, + Guid? assignedUserId = null + ) : base(id) + { + RepositoryId = repositoryId; + Title = Check.NotNullOrWhiteSpace(title, nameof(title)); + + Text = text; + AssignedUserId = assignedUserId; + + Labels = new Collection(); + } + + private Issue() { /* for deserialization & ORMs */ } + } +} +```` + +* `Issue` 通过构造函数的参数,对必填属性进行赋值,而从创建一个有效的实体对象. +* 构造函数对参数进行**验证**(`Check.NotNullOrWhiteSpace(...)`必填项为空,抛出异常). +* 初始化子集合.在实例化`Issue`对象后,访问 `Labels` ,不会出现空指针异常. +* 构造函数还将 `id`传递给父类,不要在构造函数内生成 `Guid`(参阅 [Guid生成](Guid-Generation.md)). +* 为ORM保留**私有的无参构造函数**.防止编写代码时,意外使用了无参构造函数. + +> 参见 [实体](Entities.md) 文档,了解更多使用ABP框架创建实体的信息. + +##### 实体属性访问器和方法 + +上面的示例中,我们在构造函数中对 `Title` 进行了非空检查.但是开发人员可以再次对`Title`进行赋值. + +如果我们使用**公开的属性**,则无法在实体控制数据的**有效性**和**完整性**.建议: + +* 如果某个属性具有业务逻辑,则将该属性的**setter**改为私有. +* 定义公开的方法来修改属性. + +**示例:提供方法修改属性** + +````csharp +using System; +using Volo.Abp; +using Volo.Abp.Domain.Entities; + +namespace IssueTracking.Issues +{ + public class Issue : AggregateRoot + { + public Guid RepositoryId { get; private set; } //Never changes + public string Title { get; private set; } //Needs validation + public string Text { get; set; } //No validation + public Guid? AssignedUserId { get; set; } //No validation + public bool IsClosed { get; private set; } //Should change with CloseReason + public IssueCloseReason? CloseReason { get; private set; } //Should change with IsClosed + + //... + + public void SetTitle(string title) + { + Title = Check.NotNullOrWhiteSpace(title, nameof(title)); + } + + public void Close(IssueCloseReason reason) + { + IsClosed = true; + CloseReason = reason; + } + + public void ReOpen() + { + IsClosed = false; + CloseReason = null; + } + } +} +```` + +* `RepositoryId` setter是私有的.创建后无法变更,业务规则不允许将已有的问题移到其它仓库. +* `Title` setter是私有的.它的修改时需要加以验证. +* `Text` 和 `AssignedUserId` setter 是公开的.因为业务规则允许它们为空或任意值.我们认为没必要将它们改为私有的,如果将来业务发生变化,再将setter改为私有,并提供公开的方法进行修改.另外实体属于领域层,不会直接暴露属性给应用层(或其它层),目前将其公开不是什么大问题. +* `IsClosed` 和 `IssueCloseReason` 它们是一组属性.定义 `Close` 和 `ReOpen` 方法来同时对这两个属性进行赋值.这样可以防止问题被无故关闭. + +##### 业务逻辑与实体异常 + +对实体进行验证,或执行业务逻辑时,通常需要抛出异常: + +* 领域中定义的**特定的异常**. +* 实体方法中**抛出的异常**. + +**示例** + +````csharp +public class Issue : AggregateRoot +{ + //... + + public bool IsLocked { get; private set; } + public bool IsClosed { get; private set; } + public IssueCloseReason? CloseReason { get; private set; } + + public void Close(IssueCloseReason reason) + { + IsClosed = true; + CloseReason = reason; + } + + public void ReOpen() + { + if (IsLocked) + { + throw new IssueStateException( + "Can not open a locked issue! Unlock it first." + ); + } + + IsClosed = false; + CloseReason = null; + } + + public void Lock() + { + if (!IsClosed) + { + throw new IssueStateException( + "Can not open a locked issue! Unlock it first." + ); + } + + IsLocked = true; + } + + public void Unlock() + { + IsLocked = false; + } +} +```` + +这里有两个业务规则: + +* 已锁定的问题无法重新开启. +* 无法锁定已开打的问题. + +当违反业务规则时,`Issue` 会抛出 `IssueStateException` 异常: + +````csharp +using System; + +namespace IssueTracking.Issues +{ + public class IssueStateException : Exception + { + public IssueStateException(string message) + : base(message) + { + + } + } +} +```` + +抛出异常会引发两个问题: + +1. 当异常发生时,**用户**应该看到异常(错误)信息吗?如果需要看到,异常消息如何实现本地化? user** see the exception (error) message? If so, how do you **localize** the exception message? 实体中无法注入[本地化](Localization.md)的 `IStringLocalizer` 接口. +2. 对于Web应用或HTTP API,应向客户端返回什么**HTTP状态代码**. + +ABP框架的 [异常处理](Exception-Handling.md) 可以解决上述问题. + +**示例:使用异常编码** + +````csharp +using Volo.Abp; + +namespace IssueTracking.Issues +{ + public class IssueStateException : BusinessException + { + public IssueStateException(string code) + : base(code) + { + + } + } +} +```` + +* `IssueStateException` 继承至 `BusinessException` .对于`BusinessException`的派生类,ABP框架默认返回的HTTP状态码是403 (默认是服务器内部错误 状态码 500) +* 将`code` 作为Key,在本地化资源中查找对应的文字. + +现在,我们修 `ReOpen` 方法: + +````csharp +public void ReOpen() +{ + if (IsLocked) + { + throw new IssueStateException("IssueTracking:CanNotOpenLockedIssue"); + } + + IsClosed = false; + CloseReason = null; +} +```` + +> 使用常量而不是魔法字符串. + +在本地化资源文件中添加对应的记录: + +````json +"IssueTracking:CanNotOpenLockedIssue": "Can not open a locked issue! Unlock it first." +```` + +* 异常发生时,ABP将自动使用本地化消息(基于当前语言). +* 异常编码 (`IssueTracking:CanNotOpenLockedIssue` )会被发送到客户端.同样可以以编程方式处理此异常. + +> 你可以无需定义 `IssueStateException`,直接抛出`BusinessException`异常.详细信息,参见[异常处理文档](Exception-Handling.md) + +##### 实体中业务逻辑依赖外部服务时 + +仅依赖实体本身的属性执行的业务规非常简单.但是有时候,复杂的业务逻辑会**查询数据库**或使用[依赖注入](Dependency-Injection.md)中的其它服务,这该怎么办?注意:**实体是无法注入服务的**. + +实现这种业务逻辑有两种方式: + +* 将依赖的服务以**方法的参数**,传递到实体的业务逻辑方法中. +* 定义一个**领域服务**. + +领域服务我们后面再说.我们先看看在实体类中如何实现: + +**示例:业务规则: 不允许将3个以上未解决的问题关联到一个用户** + +````csharp +public class Issue : AggregateRoot +{ + //... + public Guid? AssignedUserId { get; private set; } + + public async Task AssignToAsync(AppUser user, IUserIssueService userIssueService) + { + var openIssueCount = await userIssueService.GetOpenIssueCountAsync(user.Id); + + if (openIssueCount >= 3) + { + throw new BusinessException("IssueTracking:ConcurrentOpenIssueLimit"); + } + + AssignedUserId = user.Id; + } + + public void CleanAssignment() + { + AssignedUserId = null; + } +} +```` + +* `AssignedUserId` 私有的属性setter.此属性只能通过`AssignToAsync` 和`CleanAssignment` 方法来修改. +* `AssignToAsync` 通过 `user.Id` 属性获取一个 `AppUser` 实体. +* `IUserIssueService` 是获取用户未解决问题的服务. +* `AssignToAsync` 当不满足业务规则时抛出异常. +* 最后,符合规则,就对属性`AssignedUserId` 进行赋值. + +这样就解决了将问题关联到用户时,需要调用外部服务的问题,但是它也存在几个问题: + +* 实体**依赖了外部服务**,实体变得**复杂**. +* 实体调用变的复杂.在调用`AssignToAsync` 方法时还需要传递 `IUserIssueService` 服务. + +实现这种业务逻辑另外一种方案,使用领域服务,后面将详细说明. + +### 仓储 + +[仓储](Repositories.md)是一个类集合的接口,它通常被领域层或应用层调用,负责访问持久化系统(数据库),读取写入业务对象(聚合). + +仓储的原则: + +* 在**领域层**中定义仓储接口,因为仓储会被领域层或应用层调用,在**基础设施层中实现**(*EntityFrameworkCore* 项目). +* 仓储中**不要写任何业务逻辑**. +* 仓储接口不依赖 **数据库提供程序 / ORM**.例如,不要在仓储中返回 `DbSet` 类型,因为 `DbSet`是EF Core中的对象. +* **仅为聚合根定义仓储**,非聚合根对象不要提供仓储,因为子集合可以通过聚合根来进行持久化. + +#### 仓储中不要写任何业务逻辑 + +我们经常不小心把业务逻辑编写到了仓储层. + +**示例:从仓储中获取非活动的问题** + +````csharp +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace IssueTracking.Issues +{ + public interface IIssueRepository : IRepository + { + Task> GetInActiveIssuesAsync(); + } +} +```` + +`IIssueRepository`继承至`IRepository<...>`接口,并新增一个新接口`GetInActiveIssuesAsync`.此仓储为聚合根`Issue`提供查询的实现. + +````csharp +public class Issue : AggregateRoot, IHasCreationTime +{ + public bool IsClosed { get; private set; } + public Guid? AssignedUserId { get; private set; } + public DateTime CreationTime { get; private set; } + public DateTime? LastCommentTime { get; private set; } + //... +} +```` + +(上面的属性仅为了演示此示例) + +原则要求仓储不包含业务逻辑,上面的示例"**什么是非活动的问题?**"这个属于业务规则吗? + +````csharp +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using IssueTracking.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; + +namespace IssueTracking.Issues +{ + public class EfCoreIssueRepository : + EfCoreRepository, + IIssueRepository + { + public EfCoreIssueRepository( + IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public async Task> GetInActiveIssuesAsync() + { + var daysAgo30 = DateTime.Now.Subtract(TimeSpan.FromDays(30)); + + return await DbSet.Where(i => + + //Open + !i.IsClosed && + + //Assigned to nobody + i.AssignedUserId == null && + + //Created 30+ days ago + i.CreationTime < daysAgo30 && + + //No comment or the last comment was 30+ days ago + (i.LastCommentTime == null || i.LastCommentTime < daysAgo30) + + ).ToListAsync(); + } + } +} +```` + +(使用EF Core来实现. 如何使用EF Core实现仓储,请参见[EF Core集成文档](Entity-Framework-Core.md) ) + +来看一下`GetInActiveIssuesAsync`的实现,可以看到定义了一个**非活动问题的业务规则**: + +- 是*open*的(非*IsClosed* ) +- 没有关联到任何人 +- 创建时间大于30天 +- 最近30天没有评论 + +这个业务逻辑就被实现再了仓储内部,当我们需要重用这个业务规则时就会出现问题. + +例如:我们需要再实体`Issue`上添加一个方法来判断是否非活动`bool IsInActive()`,以方便我们在`Issue`实例上获取. + +代码如下: + +````csharp +public class Issue : AggregateRoot, IHasCreationTime +{ + public bool IsClosed { get; private set; } + public Guid? AssignedUserId { get; private set; } + public DateTime CreationTime { get; private set; } + public DateTime? LastCommentTime { get; private set; } + //... + + public bool IsInActive() + { + var daysAgo30 = DateTime.Now.Subtract(TimeSpan.FromDays(30)); + return + //Open + !IsClosed && + + //Assigned to nobody + AssignedUserId == null && + + //Created 30+ days ago + CreationTime < daysAgo30 && + + //No comment or the last comment was 30+ days ago + (LastCommentTime == null || LastCommentTime < daysAgo30); + } +} +```` + +我们需要拷贝代码来实现,如果将来业务规则发送变化,我们就必须修改这两处的代码,这样做非常危险. + +这里有一个很好的解决方案,就是使用*规约模式*. + +### 规约模式 + +[规约](Specifications.md)是一种**强命名**,**可重用**,**可组合**,**可测试**的实体过滤器. + +ABP框架提供了基础设施来轻松定义规约类,你可以在代码中方便使用.我们来将非活动问题使用规约方式实现: + +````csharp +using System; +using System.Linq.Expressions; +using Volo.Abp.Specifications; + +namespace IssueTracking.Issues +{ + public class InActiveIssueSpecification : Specification + { + public override Expression> ToExpression() + { + var daysAgo30 = DateTime.Now.Subtract(TimeSpan.FromDays(30)); + return i => + + //Open + !i.IsClosed && + + //Assigned to nobody + i.AssignedUserId == null && + + //Created 30+ days ago + i.CreationTime < daysAgo30 && + + //No comment or the last comment was 30+ days ago + (i.LastCommentTime == null || i.LastCommentTime < daysAgo30); + } + } +} +```` + +基类`Specification`通过表达式简化了创建规约的过程,仅需要将仓储中的表达式迁移至规约中. + +现在,我们可以在`Issue` 和 `EfCoreIssueRepository`中重用规约`InActiveIssueSpecification`了. + +#### 在实体内使用规约 + +`Specification` 类提供了一个`IsSatisfiedBy`方法,在实例对象上应用规约检查,判断是否满足规约的要求.代码如下: + +````csharp +public class Issue : AggregateRoot, IHasCreationTime +{ + public bool IsClosed { get; private set; } + public Guid? AssignedUserId { get; private set; } + public DateTime CreationTime { get; private set; } + public DateTime? LastCommentTime { get; private set; } + //... + + public bool IsInActive() + { + return new InActiveIssueSpecification().IsSatisfiedBy(this); + } +} +```` + +实例化一个新的规约`InActiveIssueSpecification`实例,并通过`IsSatisfiedBy` 方法进行规约检查. + +#### 在仓储内使用规约 + +首先,我们先修改一下仓储接口: + +````csharp +public interface IIssueRepository : IRepository +{ + Task> GetIssuesAsync(ISpecification spec); +} +```` + +先将`GetInActiveIssuesAsync` 方法改名为`GetIssuesAsync` ,因为我们改为使用规约方式,现在就无需为不同的查询条件创建不同的接口方法(例如:`GetAssignedIssues(...)`,`GetLockedIssues(...)`) + +再修改下仓储实现: + +````csharp +public class EfCoreIssueRepository : + EfCoreRepository, + IIssueRepository +{ + public EfCoreIssueRepository( + IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public async Task> GetIssuesAsync(ISpecification spec) + { + return await DbSet + .Where(spec.ToExpression()) + .ToListAsync(); + } +} +```` + +由于`ToExpression()`方法返回一个表达式,因此可以直接将其传递给`Where`方法来过滤实体. + +我们可以在调用`GetIssuesAsync`方法时,传递任何规约的实例. + +````csharp +public class IssueAppService : ApplicationService, IIssueAppService +{ + private readonly IIssueRepository _issueRepository; + + public IssueAppService(IIssueRepository issueRepository) + { + _issueRepository = issueRepository; + } + + public async Task DoItAsync() + { + var issues = await _issueRepository.GetIssuesAsync( + new InActiveIssueSpecification() + ); + } +} +```` + +##### 默认仓储使用规约 + +实际上,我们不必非要创建一个自定义仓储来使用规约方式,泛型仓储`IRepository`同样可以使用规约,因为`IRepository`已扩展了`IQueryable`对象,因此可以在泛型仓储上使用,代码如下: + +````csharp +public class IssueAppService : ApplicationService, IIssueAppService +{ + private readonly IRepository _issueRepository; + + public IssueAppService(IRepository issueRepository) + { + _issueRepository = issueRepository; + } + + public async Task DoItAsync() + { + var issues = AsyncExecuter.ToListAsync( + _issueRepository.Where(new InActiveIssueSpecification()) + ); + } +} +```` + +`AsyncExecuter`是ABP框架提供的一个异步LINQ扩展方法(与`ToListAsync`类似),这个方法不依赖依赖EF Core,请参见[仓储文档](Repositories.md). + +#### 组合规约 + +规约强大的能力就是可组合.假设我们还有一个业务规则:`Issue` 仅在里程碑中才返回`true`: + +````csharp +public class MilestoneSpecification : Specification +{ + public Guid MilestoneId { get; } + + public MilestoneSpecification(Guid milestoneId) + { + MilestoneId = milestoneId; + } + + public override Expression> ToExpression() + { + return i => i.MilestoneId == MilestoneId; + } +} +```` + +此规约与`InActiveIssueSpecification`的区别,它是有参数的.我们可以组合两种规约来实现获取指定里程碑下的非活动问题列表 + +````csharp +public class IssueAppService : ApplicationService, IIssueAppService +{ + private readonly IRepository _issueRepository; + + public IssueAppService(IRepository issueRepository) + { + _issueRepository = issueRepository; + } + + public async Task DoItAsync(Guid milestoneId) + { + var issues = AsyncExecuter.ToListAsync( + _issueRepository + .Where( + new InActiveIssueSpecification() + .And(new MilestoneSpecification(milestoneId)) + .ToExpression() + ) + ); + } +} +```` + +上面的示例使用了`And`扩展方法来组合规约.还有更多的组合方法,如:`Or(...)`和`AndNot(...)`. + +> 有关ABP框架提供的规约更多信息,请参见[规约文档](Specifications.md). + +### 领域服务 + +领域服务主要来实现本领域的逻辑: + +* 依赖**服务和仓储**. +* 需要使用多个聚合. + +领域服务和领域对象一起使用.领域服务可以获取并返回**实体**,**值对象**等,它们不返回**DTO**.DTO属于应用层的一部分. + +**示例:用户关联一个问题** + +需要在`Issue`实体中实现问题的关联: + +````csharp +public class Issue : AggregateRoot +{ + //... + public Guid? AssignedUserId { get; private set; } + + public async Task AssignToAsync(AppUser user, IUserIssueService userIssueService) + { + var openIssueCount = await userIssueService.GetOpenIssueCountAsync(user.Id); + + if (openIssueCount >= 3) + { + throw new BusinessException("IssueTracking:ConcurrentOpenIssueLimit"); + } + + AssignedUserId = user.Id; + } + + public void CleanAssignment() + { + AssignedUserId = null; + } +} +```` + +现在我们把逻辑迁移到领域服务中实现. + +首先,修改一下 `Issue` 类: + +````csharp +public class Issue : AggregateRoot +{ + //... + public Guid? AssignedUserId { get; internal set; } +} +```` + +* 删除关联的相关方法. +* 修改属性 `AssignedUserId` 的 setter 为 `internal`,以允许领域服务可以修改. + +下一步是创建一个名为`IssueManager`的领域服务,此领域服务的`AssignToAsync`方法负责将问题关联至指定的用户. + +````csharp +public class IssueManager : DomainService +{ + private readonly IRepository _issueRepository; + + public IssueManager(IRepository issueRepository) + { + _issueRepository = issueRepository; + } + + public async Task AssignToAsync(Issue issue, AppUser user) + { + var openIssueCount = await _issueRepository.CountAsync( + i => i.AssignedUserId == user.Id && !i.IsClosed + ); + + if (openIssueCount >= 3) + { + throw new BusinessException("IssueTracking:ConcurrentOpenIssueLimit"); + } + + issue.AssignedUserId = user.Id; + } +} +```` + +`IssueManager`可以注入其它服务,来查询指定用户已经关联的未解决问题数量. + +> 我们建议使用 `Manager` 后缀来命名领域服务. + +这种设计的唯一缺陷是可以在类`Issue`外部修改`Issue.AssignedUserId`属性.但是它的访问级别是`internal`而非`public`,在`IssueTracking.Domain`项目内部才能被修改,我们认为这样是合理的: + +* 开发人员清楚领域层的开发规则,他们会使用`IssueManager`来执行业务逻辑. +* 应用层开发人员只能使用`IssueManager`,因此他们无法直接修改实体属性. + +尽管两种方式有各自的优势,但我们更喜欢创建领域服务并注入其它服务来执行业务逻辑这种方式. + +### 应用服务 + +应用服务是实现**用例**的无状态服务.应用服务通常**获取并返回DTO**.应用服务被展现层所使用,应用服务**调用领域对象**(实体,仓储等)来实现用例. + +应用服务的通用原则: + +* 实现特定用例的**应用程序逻辑**,不要在应用服务内实现核心领域的逻辑. +* 应用服务的方法**不要返回实体**.始终只返回DTO. + +**示例:用户关联一个问题** + +````csharp +using System; +using System.Threading.Tasks; +using IssueTracking.Users; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.Application.Services; +using Volo.Abp.Domain.Repositories; + +namespace IssueTracking.Issues +{ + public class IssueAppService : ApplicationService, IIssueAppService + { + private readonly IssueManager _issueManager; + private readonly IRepository _issueRepository; + private readonly IRepository _userRepository; + + public IssueAppService( + IssueManager issueManager, + IRepository issueRepository, + IRepository userRepository) + { + _issueManager = issueManager; + _issueRepository = issueRepository; + _userRepository = userRepository; + } + + [Authorize] + public async Task AssignAsync(IssueAssignDto input) + { + var issue = await _issueRepository.GetAsync(input.IssueId); + var user = await _userRepository.GetAsync(input.UserId); + + await _issueManager.AssignToAsync(issue, user); + + await _issueRepository.UpdateAsync(issue); + } + } +} +```` + +应用服务的方法通常包含三个步骤: + +1. 从数据库获取用例所需的领域对象. +2. 使用领域对象(领域服务,实体等)执行业务逻辑. +3. 将实体的变更持久化至数据库. + +> 如果使用的是EF Core,第三步不是必须的,因为EF Core有追踪实体变化的功能.如果要利用此功能,请参阅上面的"关于数据库独立原则的讨论"章节. + +`IssueAssignDto` 是本示例中一个简单的DTO对象: + +````csharp +using System; + +namespace IssueTracking.Issues +{ + public class IssueAssignDto + { + public Guid IssueId { get; set; } + public Guid UserId { get; set; } + } +} +```` + +### 数据传输对象 + +[DTO](Data-Transfer-Objects.md)是应用层与展现层间传输数据的简单对象.应用服务方法获取并返回Dto. + +#### DTO通用原则和最佳实践 + +* DTO应该是**可被序列化**的.因为大所数情况下,DTO是通过网络传输的,因此它应该具有**无参的构造函数**. +* 不应该包含任何**业务逻辑**. +* **切勿**继承或引用**实体**. + +**输入DTO**(应用服务方法的参数)与 **输出DTO** (应用服务方法的返回对象)具有不同的作用,因此,它们应该区别对待. + +#### 输入DTO 最佳实践 + +##### 不要在输入DTO中定义不使用的属性 + +**仅**在输入DTO中定义用例**所需要的属性**!否则,会造成调用应用服务的客户端产生困惑. + +这个规则好像没什么必要,因为没人会在方法参数(输入DTO)中添加无用的属性.但是,有时候,特别是在重用DTO时,输入DTO会包含无用的属性. + +##### 不要重用输入DTO + +**为每个用例**(应用服务的方法)单独定义一个**专属的输入DTO**.否则,在一些情况下,会添加一些不被使用的属性,这样就违反上面的规则:不要在输入DTO中定义不使用的属性. + +在两个用例中重用相同的DTO似乎很有吸引力,因为它们的属性是一模一样的.现阶段它们是一样的,但是随着业务变化,可能它们会产生差异,届时你可能还是需要进行拆分.**和用例间的耦合相比,代码的复制可能是更好的做法**. + +重用输入DTO的另外一种方式是**继承**DTO,这同样会产生上面描述的问题. + +**示例:用户应用服务** + +````csharp +public interface IUserAppService : IApplicationService +{ + Task CreateAsync(UserDto input); + Task UpdateAsync(UserDto input); + Task ChangePasswordAsync(UserDto input); +} +```` + +`UserDto`作为`IUserAppService`所有方法的输入DTO,代码如下: + +````csharp +public class UserDto +{ + public Guid Id { get; set; } + public string UserName { get; set; } + public string Email { get; set; } + public string Password { get; set; } + public DateTime CreationTime { get; set; } +} +```` + +对于上面的示例: + +* `Id` 属性在 *Create* 方法中,没有被使用,因为`Id`由服务器生成. +* `Password` 属性在 *Update* 方法中,没有被使用.因为有修改密码的单独方法. +* `CreationTime` 属性未被使用,因为不允许客户端发送创建时间属性,这个应该由服务器生成. + +较好的做法应该这样: + +````csharp +public interface IUserAppService : IApplicationService +{ + Task CreateAsync(UserCreationDto input); + Task UpdateAsync(UserUpdateDto input); + Task ChangePasswordAsync(UserChangePasswordDto input); +} +```` + +下面是输入DTO的定义: + +````csharp +public class UserCreationDto +{ + public string UserName { get; set; } + public string Email { get; set; } + public string Password { get; set; } +} + +public class UserUpdateDto +{ + public Guid Id { get; set; } + public string UserName { get; set; } + public string Email { get; set; } +} + +public class UserChangePasswordDto +{ + public Guid Id { get; set; } + public string Password { get; set; } +} +```` + +虽然编写了更多的代码,但是这样可维护性更高. + +**例外情况:**该规则有一些例外的情况,例如,你想开发两个方法,它们共用相同的输入DTO(通过继承或重用),有一个报表页面有多个过滤条件,多个应用服务使用相同的输入参数返回不同的结果(如,大屏展示数据,Excel报表,csv报表).这种情况下,你是需要修改一个参数,多个应用服务都应该一起被修改. + +##### 输入DTO中验证逻辑 + +- 仅在DTO内执行**简单验证**.使用数据注解验证属性或通过`IValidatableObject` 方式. +- **不要执行领域验证**.例如,不要在DTO中检查用户名是否唯一的验证. + +**示例:使用注解方式** + +````csharp +using System.ComponentModel.DataAnnotations; + +namespace IssueTracking.Users +{ + public class UserCreationDto + { + [Required] + [StringLength(UserConsts.MaxUserNameLength)] + public string UserName { get; set; } + + [Required] + [EmailAddress] + [StringLength(UserConsts.MaxEmailLength)] + public string Email { get; set; } + + [Required] + [StringLength(UserConsts.MaxEmailLength, + MinimumLength = UserConsts.MinPasswordLength)] + public string Password { get; set; } + } +} +```` + +当输入无效时,ABP框架会自动验证输入DTO,抛出`AbpValidationException`异常,并向客户返回`400`的HTTP状态码. + +> 一些开发人员认为最好将验证规则和DTO分离.我们认为声明性(数据注解)方式是比较实用的,不会引起任何设计问题.如果你喜欢其它方式,ABP还支持[FluentValidation继承](FluentValidation.md).有关所有验证的详细文档,请参见[验证文档](Validation.md). + +#### 输出DTO最佳实践 + +* 保持**数量较少**的输出DTO,尽可能**重用输入DTO**(例外:不要将输入DTO作为输出DTO). +* 输出DTO可以包含比用例需要的属性**更多**的属性. +* 针对 **Create** 和 **Update** 方法,返回实体的DTO. + +以上建议的原因是: + +* 使客户端代码易于开发和扩展: + * 客户端处理**相似但不相同**的DTO是有问题的. + * 将来UI或客户端通常会使用到DTO上的**其它属性**.返回实体的所有属性,可以在无需修改服务端代码的情况下,只修改客户端代码. + * 在开放API给**第三方客户端**时,避免不同需求的返回不同的DTO. +* 使服务器端代码易于开发和扩展: + * 你需要**维护**的类的数量较少. + * 你可以重用Entity->DTO**对象映射**的代码. + * 不同的方法返回相同的类型,可以使得在**添加新方法**时变的简单明了. + +**示例:不同的方法返回不同的DTO** + +````csharp +public interface IUserAppService : IApplicationService +{ + UserDto Get(Guid id); + List GetUserNameAndEmail(Guid id); + List GetRoles(Guid id); + List GetList(); + UserCreateResultDto Create(UserCreationDto input); + UserUpdateResultDto Update(UserUpdateDto input); +} +```` + +> 这里我们没有使用异步方式,是为了示例更清晰,你实际代码中应该使用异步方式) + +上面的示例代码中,每个方法都返回了不同的DTO类型,这样处理,会导致查询数据,映射对象都会有很多重复的代码. + +应用服务`IUserAppService` 可以简化成如下代码: + +````csharp +public interface IUserAppService : IApplicationService +{ + UserDto Get(Guid id); + List GetList(); + UserDto Create(UserCreationDto input); + UserDto Update(UserUpdateDto input); +} +```` + +只需使用一个DTO对象 + +````csharp +public class UserDto +{ + public Guid Id { get; set; } + public string UserName { get; set; } + public string Email { get; set; } + public DateTime CreationTime { get; set; } + public List Roles { get; set; } +} +```` + +* 删除 `GetUserNameAndEmail`和`GetRoles` 方法,因为,返回的DTO中已经包含了对应的信息. +* `GetList`方法的返回的泛型类型与`Get`方法的返回类型一致. +* `Create` 与 `Update`的返回类型都是 `UserDto`. + +如上所述,使用相同的DTO有很多优点.例如,我们在UI上使用**表格**展现用户集合,再用户数据更新后,我们可以获取到返回对象,并对**表格数据源进行更新**.因此,我们无需再次调用`GetList`来获取全部数据.这就是我们为什么建议`Create` 与 `Update`方法都返回相同`UserDto`的原因. + +##### 讨论 + +输出DTO的建议并不适用于所有情况.出于**性能**原因,我们可以忽略这些建议,尤其是在返回**大量数据**,为UI定制,**并发量较高**时. + +在这些情况下,你可以定制仅包含**必要信息的DTO**.上面的建议只适用于额外多些属性并**不会损失太多性能**,并关注代码**可维护**的应用系统. + +#### 对象映射到对象 + +当两个对象具有相同或相似的属性,自动将[对象映射到对象](Object-To-Object-Mapping.md)是一种将值从一个对象复制到另外一个对象非常有用的方法. + +DTO和实体通常具有相同或相似的属性,你经常需要从一个实体创建一个DTO对象.相较于手动映射,基于[AutoMapper](http://automapper.org/)的ABP[对象映射系统](Object-To-Object-Mapping.md),更加方便简单. + +* **仅**在**实体=>输出DTO**的时候使用自动映射. +* 不要在**输入DTO=>Entity**的时候使用自动映射. + +因为以下原因,你不应该在输入DTO=>Entity的时候使用自动映射: + +1. 实体类通常具有一个**构造函数**,该构造函数带有参数,确保创建有效的对象,而自动对象映射通常需要一个无参构造函数. +2. 大多数实体中的属性setter是**私有的**,你只能调用实体上的方法来修改属性. +3. 另外,需要进行对用户或客户端的**输入参数进行验证**,而不是盲目映射到实体属性上. + +尽管其中一些问题可以额外配置映射来解决(如,AutoMapper允许自定义映射规则),但这样会使业务逻辑被**耦合到基础设施代码中**.我们认为业务代码应该明确,清晰且易于理解. + +有关此部分的建议,请参加下面的"*实体创建*"部分 + +## 用例 + +本节将演示一些用例,并讨论替代方案 + +### 实体创建 + +实体或聚合根的创建,是实体生命周期的开始."*聚合/聚合根规则及最佳实践*"章节中建议为Entity类定义**一个主构造函数**,以确保创建一个**有效的实体**.因此,需要创建该实体对象实例时,都应该**使用该构造函数**. + + `Issue` 聚合根的代码如下: + +````csharp +public class Issue : AggregateRoot +{ + public Guid RepositoryId { get; private set; } + public string Title { get; private set; } + public string Text { get; set; } + public Guid? AssignedUserId { get; internal set; } + + public Issue( + Guid id, + Guid repositoryId, + string title, + string text = null + ) : base(id) + { + RepositoryId = repositoryId; + Title = Check.NotNullOrWhiteSpace(title, nameof(title)); + Text = text; //Allow empty/null + } + + private Issue() { /* Empty constructor is for ORMs */ } + + public void SetTitle(string title) + { + Title = Check.NotNullOrWhiteSpace(title, nameof(title)); + } + + //... +} +```` + +* 通过其非空参数的构造函数创建有效的实体. +* 如需修改 `Title` 属性,必须通过`SetTitle` 方法,来确保被设置值的有效性. +* 如需将此问题关联至用户,则需要使用`IssueManager`(关联前需要执行一些业务逻辑,相关逻辑参见上面的"*领域服务*"部分) +* `Text` 属性setter是公开的,因为它可以为null,并且本示例中也没有验证规则,它在构造函数中也是可选的. + +创建问题的应用服务代码: + +````csharp +public class IssueAppService : ApplicationService, IIssueAppService +{ + private readonly IssueManager _issueManager; + private readonly IRepository _issueRepository; + private readonly IRepository _userRepository; + + public IssueAppService( + IssueManager issueManager, + IRepository issueRepository, + IRepository userRepository) + { + _issueManager = issueManager; + _issueRepository = issueRepository; + _userRepository = userRepository; + } + + public async Task CreateAsync(IssueCreationDto input) + { + // Create a valid entity + var issue = new Issue( + GuidGenerator.Create(), + input.RepositoryId, + input.Title, + input.Text + ); + + // Apply additional domain actions + if (input.AssignedUserId.HasValue) + { + var user = await _userRepository.GetAsync(input.AssignedUserId.Value); + await _issueManager.AssignToAsync(issue, user); + } + + // Save + await _issueRepository.InsertAsync(issue); + + // Return a DTO represents the new Issue + return ObjectMapper.Map(issue); + } +} +```` + +`CreateAsync` 方法; + +* 使用 `Issue` **构造函数** 创建一个有效的问题.`Id` 属性通过[IGuidGenerator](Guid-Generation.md)服务生成.此处没有使用对象自动映射. +* 如果需要将**问题关联至用户**,则通过 `IssueManager`来执行关联逻辑. +* **保存** 实体至数据库. +* 最后,使用 `IObjectMapper` 将`Issue`实体**映射**为 `IssueDto` 并返回. + +#### 在创建实体时执行领域规则 + +`Issue`除了在构造函数中进行了一些简单验证外,示例中没其它业务验证.在有些情况下,在创建实体时会有一些其它业务规则. + +假如,已经存在一个完全相同的问题,那么就不要再创建问题.这个规则应该在哪里执行?在**应用服务中执行是不对的**,因为它是**核心业务(领域)的规则**,应该将此规则在领域服务中执行.在这种情况下,我们应该在`IssueManager`中执行此规则,因此应该强制应用服务调用领域服务`IssueManager`来新建`Issue`. + +首先修改 `Issue` 构造函数的访问级别为 `internal`: + +````csharp +public class Issue : AggregateRoot +{ + //... + + internal Issue( + Guid id, + Guid repositoryId, + string title, + string text = null + ) : base(id) + { + RepositoryId = repositoryId; + Title = Check.NotNullOrWhiteSpace(title, nameof(title)); + Text = text; //Allow empty/null + } + + //... +} +```` + +这样可以防止,应用服务直接使用`Issue` 的构造函数去创建`Issue` 实例,必须使用 `IssueManager`来创建.然后我们再添加一个`CreateAsync`方法: + +````csharp +using System; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Domain.Services; + +namespace IssueTracking.Issues +{ + public class IssueManager : DomainService + { + private readonly IRepository _issueRepository; + + public IssueManager(IRepository issueRepository) + { + _issueRepository = issueRepository; + } + + public async Task CreateAsync( + Guid repositoryId, + string title, + string text = null) + { + if (await _issueRepository.AnyAsync(i => i.Title == title)) + { + throw new BusinessException("IssueTracking:IssueWithSameTitleExists"); + } + + return new Issue( + GuidGenerator.Create(), + repositoryId, + title, + text + ); + } + } +} +```` + +* `CreateAsync` 方法会检查标题是否已经存在,当有相同标题的问题时,会抛出业务异常. +* 如果标题没有重复的,则创建并返回一个新的 `Issue`对象. + +再修改`IssueAppService` 的代码,来调用 `IssueManager`的 `CreateAsync` 方法: + +````csharp +public class IssueAppService : ApplicationService, IIssueAppService +{ + private readonly IssueManager _issueManager; + private readonly IRepository _issueRepository; + private readonly IRepository _userRepository; + + public IssueAppService( + IssueManager issueManager, + IRepository issueRepository, + IRepository userRepository) + { + _issueManager = issueManager; + _issueRepository = issueRepository; + _userRepository = userRepository; + } + + public async Task CreateAsync(IssueCreationDto input) + { + // Create a valid entity using the IssueManager + var issue = await _issueManager.CreateAsync( + input.RepositoryId, + input.Title, + input.Text + ); + + // Apply additional domain actions + if (input.AssignedUserId.HasValue) + { + var user = await _userRepository.GetAsync(input.AssignedUserId.Value); + await _issueManager.AssignToAsync(issue, user); + } + + // Save + await _issueRepository.InsertAsync(issue); + + // Return a DTO represents the new Issue + return ObjectMapper.Map(issue); + } +} + +// *** IssueCreationDto class *** +public class IssueCreationDto +{ + public Guid RepositoryId { get; set; } + [Required] + public string Title { get; set; } + public Guid? AssignedUserId { get; set; } + public string Text { get; set; } +} +```` + +##### 讨论:为什么`IssueManager`中没有执行`Issue`的保存? + +你可能会问"**为什么`IssueManager`中没有执行`Issue`的保存?**".我们认为这是应用服务的职责. + +因为,应用服务可能在保存`Issue`对象之前,需要对其它对象进行修改.如果领域服务执行了保存,那么*保存*操作就是重复的. + +* 会触发两次数据库会交互,这会导致性能损失. +* 需要额外添加显式的事务来包含这两个操作,才能保证数据一致性. +* 如果因为业务规则取消了实体的创建,则应该在数据库事务中回滚事务,取消所有操作. + +假如在`IssueManager.CreateAsync`中先保存一次数据,那么数据会先执行一次*Insert*操作,后面关联用户的逻辑执行后,又会再执行一次*Update*操作. + +如果不在`IssueManager.CreateAsync`中保存数据,那么,新建`Issue`和关联用户,只会执行一次*Insert*操作. + +##### 讨论:为什么没有在应用服务中执行标题是否重复的检查? + +简单地说"因为它是**核心领域逻辑**,应该在领域层实现".这又带来一个新问题,"**如何确定**是领域层逻辑,还是应用层逻辑"?(这个我们后面再详细讨论) + +对于此示例,可以用一个简单的问题来判断到底是领域逻辑还是应用逻辑:"如果还有另外一种创建`Issue`的方式(用例),我们是否还需要执行?如果需要执行,就属于领域层逻辑,不需要执行就是应用层逻辑".你可能认为为什么还有别的用例来创建`Issue`呢? + +* 应用程序的**最终用户**可能会在UI上创建`Issue`. +* 系统内部人员,可以在**后台管理**端采用另外一种方式创建`Issue`(这种情况下,可能使用不同的业务规则). +* 对**第三方客户端**开放的API,它们的规则又有所不同. +* 还有**后台作业系统**会执行某些操作时创建`Issue`,这样,它是在没有任何用户交互情况下创建`Issue`. +* 还有可能是UI上某个按钮,可以将某些内容(例如,讨论)转为`Issue`. + +我们还可以举更多例子.所有这些都应该通过**不同的应用服务方法来实现**(请参见下面的"*多个应用服务层*"部分),但是它们**始终遵循**以下的规则: + +新的问题标题不能与任何已有的问题标题相同.这就是为什么说的"*标题是否重复的检查*"属于核心领域逻辑的原因,这个逻辑应该在领域层,而**不应该**在应用层的所有方法中**去重复**定义. + +### 修改实体 + +创建实体后,将根据用例对实体进行修改,直到将其从系统中删除.可以有不同的用例直接或间接的修改实体. + +在本节中,我们将讨论一种典型的修改操作,该操作会修改`Issue`的多个属性. + +从*Update* DTO开始: + +````csharp +public class UpdateIssueDto +{ + [Required] + public string Title { get; set; } + public string Text { get; set; } + public Guid? AssignedUserId { get; set; } +} +```` + +对比`IssueCreationDto`,可以发现,缺少了`RepositoryId`属性,因为我们不允许跨仓库移动`Issue`.仅`Title`属性是必填的. + +`IssueAppService`中*Update*的实现如下:: + +````csharp +public class IssueAppService : ApplicationService, IIssueAppService +{ + private readonly IssueManager _issueManager; + private readonly IRepository _issueRepository; + private readonly IRepository _userRepository; + + public IssueAppService( + IssueManager issueManager, + IRepository issueRepository, + IRepository userRepository) + { + _issueManager = issueManager; + _issueRepository = issueRepository; + _userRepository = userRepository; + } + + public async Task UpdateAsync(Guid id, UpdateIssueDto input) + { + // Get entity from database + var issue = await _issueRepository.GetAsync(id); + + // Change Title + await _issueManager.ChangeTitleAsync(issue, input.Title); + + // Change Assigned User + if (input.AssignedUserId.HasValue) + { + var user = await _userRepository.GetAsync(input.AssignedUserId.Value); + await _issueManager.AssignToAsync(issue, user); + } + + // Change Text (no business rule, all values accepted) + issue.Text = input.Text; + + // Update entity in the database + await _issueRepository.UpdateAsync(issue); + + // Return a DTO represents the new Issue + return ObjectMapper.Map(issue); + } +} +```` + +* `UpdateAsync` 方法参数 `id`被作为独立参数,放置在`UpdateIssueDto`之外.这是一项设计决策,当你将此应用服务[自动导出](API/Auto-API-Controllers.md)为HTTP API时,API端点时帮助ABP正确定义HTTP路由,这与DDD无关. +* 首先从数据库中**获取** `Issue` 实体. +* 通过 `IssueManager`的 `ChangeTitleAsync`方法修改标题,而非直接通过 `Issue.SetTitle(...)`直接修改.因为我们需要像创建时那样,**执行标题的重复检查逻辑**.这需要对`Issue`类和`IssueManager`类进行一些调整(将在下面说明). +* 通过 `IssueManager`的 `AssignToAsync` 方法来**关联用户**. +* 直接设置 `Issue.Text`属性,因为它本身没有任何业务逻辑需要执行.如果以后需要可以再进行重构. +* **保存修改**至数据库.同样,保存修改后的实体属于应用服务的职责,它可以协调业务对象和事务.如果在`IssueManager`内部的 `ChangeTitleAsync` 和 `AssignToAsync` 方法中进行保存,则会导致两次数据库操作(请参见上面的*讨论:为什么`IssueManager`中没有执行`Issue`的保存?*) +* 最后,使用 `IObjectMapper` 将`Issue`实体**映射**为 `IssueDto` 并返回. + +如前所述,我们需要对`Issue`类和`IssueManager`类进行一些调整: + +首先,修改 `SetTitle`方法的访问级别为internal: + +````csharp +internal void SetTitle(string title) +{ + Title = Check.NotNullOrWhiteSpace(title, nameof(title)); +} +```` + +再在`IssueManager`中添加一个新方法来修改标题: + +````csharp +public async Task ChangeTitleAsync(Issue issue, string title) +{ + if (issue.Title == title) + { + return; + } + + if (await _issueRepository.AnyAsync(i => i.Title == title)) + { + throw new BusinessException("IssueTracking:IssueWithSameTitleExists"); + } + + issue.SetTitle(title); +} +```` + +## 领域逻辑和应用逻辑 + +如前所述,领域驱动设计中的*业务逻辑*分为两部分(各层):领域逻辑和应用逻辑 + +![domain-driven-design-domain-vs-application-logic](../../../abpframework.abp/docs/en/images/domain-driven-design-domain-vs-application-logic.png) + +领域逻辑是系统的*核心领域规则*组成,而应用逻辑则满足特定的*用例*. + +虽然定义很明确,但是实施起来缺并不容器.你可能无法确定哪些代码应该属于领域层,哪些代码应该属于应用层,本节会尝试解释差异. + +### 多应用层 + +当你的系统很大时,DDD有助于**处理复杂问题**.尤其是,**单个领域**需要多个**应用程序运行**,那么**领域逻辑与应用逻辑分离**就变的非常重要. + +假设你正字构建一个具有多个应用程序的系统: + +* 一个**公开的应用网站**,使用ASP.NET Core MVC构建,展示商品给来访者.这样的网站不选哟身份验证即可查看商品.来访者只有执行了某些操作(例如,将商品添加到购物车)后,才需要登录网站. +* 一个**后台管理系统**,UI使用Angular,通过REST API请求数据.内部员工使用这个系统来维护数据(例如,编辑商品说明). +* 一个**移动端应用程序**,它比公开的网站UI上更加简洁.它通过REST API或其它技术(例如,TCP sockets)请求数据. + +![domain-driven-design-multiple-applications](../../../abpframework.abp/docs/en/images/domain-driven-design-multiple-applications.png) + +每个应用程序都有不同的**需求**,不同的**用例**(应用服务方法),不同的DTO,不同的**验证**和**授权**规则等. + +将所有这些逻辑都集中到一个应用层中,会使你的服务包含太多的`if`条件分支及**复杂的业务逻辑**,从而使你的代码难道开发,**维护**,测试,引发各种问题. + +如果你在一个领域中有多个应用程序 + +- 为每种应用程序或客户端创建独立的应用层,并在这些单独层中执行特定于应用业务逻辑. +- 使用共享的核心领域逻辑 + +为了实现这样的设计,首先我们需要区分领域逻辑和应用逻辑. + +为了更清楚的实现,你可以为不同的应用类型创建不同的项目(`.csproj`): + +* `IssueTracker.Admin.Application` 和 `IssueTracker.Admin.Application.Contacts` 为后台管理系统提供服务. +* `IssueTracker.Public.Application` 和 `IssueTracker.Public.Application.Contracts` 为公开网站提供服务. +* `IssueTracker.Mobile.Application` 和 `IssueTracker.Mobile.Application.Contracts` 为移动端应用提供服务. + +### 示例 + +本节包含一些应用服务及领域服务的示例,讨论业务逻辑应该放置在哪一层 + +**示例:在领域服务中创建`Organization`** + +````csharp +public class OrganizationManager : DomainService +{ + private readonly IRepository _organizationRepository; + private readonly ICurrentUser _currentUser; + private readonly IAuthorizationService _authorizationService; + private readonly IEmailSender _emailSender; + + public OrganizationManager( + IRepository organizationRepository, + ICurrentUser currentUser, + IAuthorizationService authorizationService, + IEmailSender emailSender) + { + _organizationRepository = organizationRepository; + _currentUser = currentUser; + _authorizationService = authorizationService; + _emailSender = emailSender; + } + + public async Task CreateAsync(string name) + { + if (await _organizationRepository.AnyAsync(x => x.Name == name)) + { + throw new BusinessException("IssueTracking:DuplicateOrganizationName"); + } + + await _authorizationService.CheckAsync("OrganizationCreationPermission"); + + Logger.LogDebug($"Creating organization {name} by {_currentUser.UserName}"); + + var organization = new Organization(); + + await _emailSender.SendAsync( + "systemadmin@issuetracking.com", + "New Organization", + "A new organization created with name: " + name + ); + + return organization; + } +} +```` + +我们来逐个检查`CreateAsync`方法中的代码,讨论是否应该在领域服务中 + +* **正确**:首先检查有**无重复的组织名称**,并抛出异常.这与核心领域规则有关,因为我们绝对不允许重复的名称. +* **错误**:领域服务不应该执行**授权检查**,[授权](Authorization.md)应该在应用层处理. +* **错误**:它记录了日志,包括[当前用户](CurrentUser.md)的`UserName`.领域服务不应该依赖当前用户,即便系统中没有用户,领域服务也应可用.当前用户应该是与展现层或应用层有关的概念. +* **错误**:它发送了有关新组织被创建的[邮件](Emailing.md),我们认为这也是特定用例的业务逻辑,你可能像在不同的用例中创建不同的邮件,又或者某些情况无需发送邮件. + +**示例:应用服务中创建`Organization`** + +````csharp +public class OrganizationAppService : ApplicationService +{ + private readonly OrganizationManager _organizationManager; + private readonly IPaymentService _paymentService; + private readonly IEmailSender _emailSender; + + public OrganizationAppService( + OrganizationManager organizationManager, + IPaymentService paymentService, + IEmailSender emailSender) + { + _organizationManager = organizationManager; + _paymentService = paymentService; + _emailSender = emailSender; + } + + [UnitOfWork] + [Authorize("OrganizationCreationPermission")] + public async Task CreateAsync(CreateOrganizationDto input) + { + await _paymentService.ChargeAsync( + CurrentUser.Id, + GetOrganizationPrice() + ); + + var organization = await _organizationManager.CreateAsync(input.Name); + + await _organizationManager.InsertAsync(organization); + + await _emailSender.SendAsync( + "systemadmin@issuetracking.com", + "New Organization", + "A new organization created with name: " + input.Name + ); + + return organization; // !!! + } + + private double GetOrganizationPrice() + { + return 42; //Gets from somewhere else... + } +} +```` + +我们来逐个检查`CreateAsync`方法中的代码,讨论是否应该在应用服务中 + +* **正确**:应用服务的方法应该是一个工作单元(事务).ABP的[工作单元](Unit-Of-Work.md)系统可以使得此工作自动进行(甚至无需`[UnitOfWork]`注解). +* **正确**: [授权](Authorization.md)应该在应用层处理.这里通过使用`[Authorize]`来完成. +* **正确**:调用付款(基础设施服务)为此操作收取费用(创建组织是我们业务中的付费服务). +* **正确**:应用服务负责将变更的数据保存到数据库. +* **正确**:我们可以将[邮件](Emailing.md)作为通知发送给管理员. +* **错误**:请勿从应用服务中返回实体,应该返回DTO. + +**讨论:为什么不将支付逻辑移到领域服务中?** + +你可能想知道为什么付款逻辑代码不在`OrganizationManager`中.付款是非常**重要的事情**,我们不能**遗漏任何一次付款**. + +它确实非常重要,但是,它不能放到领域服务中.我们可能还又**其它用例**来创建组织但不收取任何费用.例如: + +* 管理员可以在后台管理系统创建新组织,而无需支付任何费用. +* 后台作业系统导入,集成,同步组织而无需支付费用. + +如你所见,**付款不是创建有效组织的必要操作**.它是特定的应用服务逻辑. + +**示例:CRUD操作** + +````csharp +public class IssueAppService +{ + private readonly IssueManager _issueManager; + + public IssueAppService(IssueManager issueManager) + { + _issueManager = issueManager; + } + + public async Task GetAsync(Guid id) + { + return await _issueManager.GetAsync(id); + } + + public async Task CreateAsync(IssueCreationDto input) + { + await _issueManager.CreateAsync(input); + } + + public async Task UpdateAsync(UpdateIssueDto input) + { + await _issueManager.UpdateAsync(input); + } + + public async Task DeleteAsync(Guid id) + { + await _issueManager.DeleteAsync(id); + } +} +```` + +该应用服务本身**不执行任何操作**,并将所有**操作转发给** *领域服务*.它甚至将DTO传递给`IssueManager` + +* 如果没有**任何业务逻辑**,只有简单的**CRUD**操作,**请勿**创建领域服务. +* **切勿**将**DTO**传递给领域服务,或从领域服务返回**DTO**. + +可以在应用服务中直接注入仓储,实现查询,创建,更新及删除操作.除非在这些操作过程中需要执行某些业务逻辑,在这种情况下,请创建领域服务. + +> 不要创建"将来可能需要"这种CRUD领域服务方法([YAGNI](https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it)),在需要时重构它并重构现有代码. 由于应用层优雅地抽象了领域层,因此重构过程不会影响UI层和其他客户端. + +## 相关书籍 + +如果你对领域驱动设计和构建大型系统有兴趣,建议将以下书籍作为参考书籍: + +* "*Domain Driven Design*" by Eric Evans +* "*Implementing Domain Driven Design*" by Vaughn Vernon +* "*Clean Architecture*" by Robert C. Martin \ No newline at end of file diff --git a/docs/zh-Hans/Samples/Microservice-Demo.md b/docs/zh-Hans/Samples/Microservice-Demo.md index 59977908a1..59fa98e057 100644 --- a/docs/zh-Hans/Samples/Microservice-Demo.md +++ b/docs/zh-Hans/Samples/Microservice-Demo.md @@ -1118,7 +1118,7 @@ internal Product( 默认(**无参数**)构造函数是私有的,不在应用程序代码中使用. 这是必需的,因为大多数ORM在从数据库获取时需要在反序列化实体时使用无参数构造函数. -第二个构造函数是**internal**,这意味着它只能在域层内使用. 这强制在创建新的`Product`时使用`ProductManager`. 因为``ProductManager`应该在新产品创建上实现业务规则. 此构造函数仅需要最少的必需参数来创建具有一些可选参数的新产品. 它会检查一些简单的业务规则,以确保将实体创建为有效产品. +第二个构造函数是**internal**,这意味着它只能在域层内使用. 这强制在创建新的`Product`时使用`ProductManager`. 因为`ProductManager`应该在新产品创建上实现业务规则. 此构造函数仅需要最少的必需参数来创建具有一些可选参数的新产品. 它会检查一些简单的业务规则,以确保将实体创建为有效产品. 该类的其余部分具有操纵实体属性的方法. 例: @@ -1418,4 +1418,4 @@ ABP提供自动审计日志记录,详细保存每个请求(当前用户,浏览 ### 多租户 -该解决方案已配置提供[多租户](../Multi-Tenancy.md)系统,其中每个租户可以拥有其隔离的用户,角色,权限和其他数据. \ No newline at end of file +该解决方案已配置提供[多租户](../Multi-Tenancy.md)系统,其中每个租户可以拥有其隔离的用户,角色,权限和其他数据. diff --git a/docs/zh-Hans/UI/AspNetCore/Tag-Helpers/Modals.md b/docs/zh-Hans/UI/AspNetCore/Tag-Helpers/Modals.md index 28b92254bd..3abebdde0c 100644 --- a/docs/zh-Hans/UI/AspNetCore/Tag-Helpers/Modals.md +++ b/docs/zh-Hans/UI/AspNetCore/Tag-Helpers/Modals.md @@ -9,7 +9,7 @@ ````xml Launch modal - + Woohoo, you're reading this text in a modal! @@ -31,6 +31,13 @@ * `false` (默认值) * `true` +### Scrollable + +指定模态框滚动. 应为以下值之一: + +* `false` (默认值) +* `true` + ### size 指定模态框的大小. 应为以下值之一: @@ -76,4 +83,4 @@ * `Center` * `Around` * `Between` -* `End` \ No newline at end of file +* `End` diff --git a/docs/zh-Hans/docs-nav.json b/docs/zh-Hans/docs-nav.json index 5ed50aebce..5d231099c9 100644 --- a/docs/zh-Hans/docs-nav.json +++ b/docs/zh-Hans/docs-nav.json @@ -338,53 +338,57 @@ "path": "Best-Practices/Index.md" } ] - } - ] - }, - { - "text": "领域驱动设计", - "items": [ - { - "text": "概述", - "path": "Domain-Driven-Design.md" }, { - "text": "领域层", + "text": "领域驱动设计", "items": [ { - "text": "实体&聚合根", - "path": "Entities.md" - }, - { - "text": "值对象" - }, - { - "text": "仓储", - "path": "Repositories.md" - }, - { - "text": "领域服务" + "text": "概述", + "path": "Domain-Driven-Design.md" }, { - "text": "规约", - "path": "Specifications.md" - } - ] - }, - { - "text": "应用服务层", - "items": [ - { - "text": "应用服务", - "path": "Application-Services.md" + "text": "领域层", + "items": [ + { + "text": "实体&聚合根", + "path": "Entities.md" + }, + { + "text": "值对象" + }, + { + "text": "仓储", + "path": "Repositories.md" + }, + { + "text": "领域服务" + }, + { + "text": "规约", + "path": "Specifications.md" + } + ] }, { - "text": "数据传输对象(DTO)", - "path": "Data-Transfer-Objects.md" + "text": "应用服务层", + "items": [ + { + "text": "应用服务", + "path": "Application-Services.md" + }, + { + "text": "数据传输对象(DTO)", + "path": "Data-Transfer-Objects.md" + }, + { + "text": "工作单元", + "path": "Unit-Of-Work.md" + } + ] }, { - "text": "工作单元", - "path": "Unit-Of-Work.md" + "text": "指南: 实现DDD", + "path": "Domain-Driven-Design-Implementation-Guide.md" } ] }, diff --git a/docs/zh-Hans/images/abp-dynamic-form-result.png b/docs/zh-Hans/images/abp-dynamic-form-result.png new file mode 100644 index 0000000000..f9ecf14bd0 Binary files /dev/null and b/docs/zh-Hans/images/abp-dynamic-form-result.png differ diff --git a/docs/zh-Hans/images/abp-form-input-validation-error-french-name.png b/docs/zh-Hans/images/abp-form-input-validation-error-french-name.png new file mode 100644 index 0000000000..5112cd2597 Binary files /dev/null and b/docs/zh-Hans/images/abp-form-input-validation-error-french-name.png differ diff --git a/docs/zh-Hans/images/abp-form-input-validation-error-french.png b/docs/zh-Hans/images/abp-form-input-validation-error-french.png new file mode 100644 index 0000000000..cb8316d04b Binary files /dev/null and b/docs/zh-Hans/images/abp-form-input-validation-error-french.png differ diff --git a/docs/zh-Hans/images/abp-form-input-validation-error.png b/docs/zh-Hans/images/abp-form-input-validation-error.png new file mode 100644 index 0000000000..2c60adc343 Binary files /dev/null and b/docs/zh-Hans/images/abp-form-input-validation-error.png differ diff --git a/docs/zh-Hans/images/ajax-error.png b/docs/zh-Hans/images/ajax-error.png new file mode 100644 index 0000000000..2b9bc2bb37 Binary files /dev/null and b/docs/zh-Hans/images/ajax-error.png differ diff --git a/docs/zh-Hans/images/aspnetcore-web-tests-in-solution.png b/docs/zh-Hans/images/aspnetcore-web-tests-in-solution.png new file mode 100644 index 0000000000..12fca58139 Binary files /dev/null and b/docs/zh-Hans/images/aspnetcore-web-tests-in-solution.png differ diff --git a/docs/zh-Hans/images/basic-theme-account-layout.png b/docs/zh-Hans/images/basic-theme-account-layout.png new file mode 100644 index 0000000000..bccd0e20cc Binary files /dev/null and b/docs/zh-Hans/images/basic-theme-account-layout.png differ diff --git a/docs/zh-Hans/images/basic-theme-application-layout-blazor.png b/docs/zh-Hans/images/basic-theme-application-layout-blazor.png new file mode 100644 index 0000000000..f01becad07 Binary files /dev/null and b/docs/zh-Hans/images/basic-theme-application-layout-blazor.png differ diff --git a/docs/zh-Hans/images/basic-theme-application-layout-parts.png b/docs/zh-Hans/images/basic-theme-application-layout-parts.png new file mode 100644 index 0000000000..5e8f9147a9 Binary files /dev/null and b/docs/zh-Hans/images/basic-theme-application-layout-parts.png differ diff --git a/docs/zh-Hans/images/basic-theme-application-layout.png b/docs/zh-Hans/images/basic-theme-application-layout.png new file mode 100644 index 0000000000..353e294056 Binary files /dev/null and b/docs/zh-Hans/images/basic-theme-application-layout.png differ diff --git a/docs/zh-Hans/images/blazor-message-confirm.png b/docs/zh-Hans/images/blazor-message-confirm.png new file mode 100644 index 0000000000..fe03620283 Binary files /dev/null and b/docs/zh-Hans/images/blazor-message-confirm.png differ diff --git a/docs/zh-Hans/images/blazor-message-error.png b/docs/zh-Hans/images/blazor-message-error.png new file mode 100644 index 0000000000..5192eae1e9 Binary files /dev/null and b/docs/zh-Hans/images/blazor-message-error.png differ diff --git a/docs/zh-Hans/images/blazor-message-success.png b/docs/zh-Hans/images/blazor-message-success.png new file mode 100644 index 0000000000..592fac8b7d Binary files /dev/null and b/docs/zh-Hans/images/blazor-message-success.png differ diff --git a/docs/zh-Hans/images/blazor-notification-bell-component.png b/docs/zh-Hans/images/blazor-notification-bell-component.png new file mode 100644 index 0000000000..65934ec24b Binary files /dev/null and b/docs/zh-Hans/images/blazor-notification-bell-component.png differ diff --git a/docs/zh-Hans/images/blazor-notification-success.png b/docs/zh-Hans/images/blazor-notification-success.png new file mode 100644 index 0000000000..d68dcf47d8 Binary files /dev/null and b/docs/zh-Hans/images/blazor-notification-success.png differ diff --git a/docs/zh-Hans/images/blazor-page-alert-example.png b/docs/zh-Hans/images/blazor-page-alert-example.png new file mode 100644 index 0000000000..799826e57f Binary files /dev/null and b/docs/zh-Hans/images/blazor-page-alert-example.png differ diff --git a/docs/zh-Hans/images/bookstore-branding-blazor.png b/docs/zh-Hans/images/bookstore-branding-blazor.png new file mode 100644 index 0000000000..74ddf35f0f Binary files /dev/null and b/docs/zh-Hans/images/bookstore-branding-blazor.png differ diff --git a/docs/zh-Hans/images/bookstore-logo-blazor.png b/docs/zh-Hans/images/bookstore-logo-blazor.png new file mode 100644 index 0000000000..4e01569813 Binary files /dev/null and b/docs/zh-Hans/images/bookstore-logo-blazor.png differ diff --git a/docs/zh-Hans/images/branding-appname.png b/docs/zh-Hans/images/branding-appname.png new file mode 100644 index 0000000000..9300ad2c7f Binary files /dev/null and b/docs/zh-Hans/images/branding-appname.png differ diff --git a/docs/zh-Hans/images/branding-nobrand.png b/docs/zh-Hans/images/branding-nobrand.png new file mode 100644 index 0000000000..1fdf78472b Binary files /dev/null and b/docs/zh-Hans/images/branding-nobrand.png differ diff --git a/docs/zh-Hans/images/breadcrumbs-example.png b/docs/zh-Hans/images/breadcrumbs-example.png new file mode 100644 index 0000000000..17ae5f8ba5 Binary files /dev/null and b/docs/zh-Hans/images/breadcrumbs-example.png differ diff --git a/docs/zh-Hans/images/datatables-custom-render-date.png b/docs/zh-Hans/images/datatables-custom-render-date.png new file mode 100644 index 0000000000..344237aea7 Binary files /dev/null and b/docs/zh-Hans/images/datatables-custom-render-date.png differ diff --git a/docs/zh-Hans/images/datatables-default-render-date.png b/docs/zh-Hans/images/datatables-default-render-date.png new file mode 100644 index 0000000000..430c889d2f Binary files /dev/null and b/docs/zh-Hans/images/datatables-default-render-date.png differ diff --git a/docs/zh-Hans/images/datatables-example.png b/docs/zh-Hans/images/datatables-example.png new file mode 100644 index 0000000000..ef3e74576b Binary files /dev/null and b/docs/zh-Hans/images/datatables-example.png differ diff --git a/docs/zh-Hans/images/datatables-row-actions-confirmation.png b/docs/zh-Hans/images/datatables-row-actions-confirmation.png new file mode 100644 index 0000000000..9be8433f9c Binary files /dev/null and b/docs/zh-Hans/images/datatables-row-actions-confirmation.png differ diff --git a/docs/zh-Hans/images/datatables-row-actions-icon.png b/docs/zh-Hans/images/datatables-row-actions-icon.png new file mode 100644 index 0000000000..70111fc1ac Binary files /dev/null and b/docs/zh-Hans/images/datatables-row-actions-icon.png differ diff --git a/docs/zh-Hans/images/datatables-row-actions.png b/docs/zh-Hans/images/datatables-row-actions.png new file mode 100644 index 0000000000..4eae0f098a Binary files /dev/null and b/docs/zh-Hans/images/datatables-row-actions.png differ diff --git a/docs/zh-Hans/images/db-options.png b/docs/zh-Hans/images/db-options.png new file mode 100644 index 0000000000..d9dc2ed0f4 Binary files /dev/null and b/docs/zh-Hans/images/db-options.png differ diff --git a/docs/zh-Hans/images/ddd-microservice-simple.png b/docs/zh-Hans/images/ddd-microservice-simple.png new file mode 100644 index 0000000000..1217b243c8 Binary files /dev/null and b/docs/zh-Hans/images/ddd-microservice-simple.png differ diff --git a/docs/zh-Hans/images/domain-driven-design-aggregate-keep-small.png b/docs/zh-Hans/images/domain-driven-design-aggregate-keep-small.png new file mode 100644 index 0000000000..56f805ebbe Binary files /dev/null and b/docs/zh-Hans/images/domain-driven-design-aggregate-keep-small.png differ diff --git a/docs/zh-Hans/images/domain-driven-design-clean-architecture.png b/docs/zh-Hans/images/domain-driven-design-clean-architecture.png new file mode 100644 index 0000000000..4ab6d2c93b Binary files /dev/null and b/docs/zh-Hans/images/domain-driven-design-clean-architecture.png differ diff --git a/docs/zh-Hans/images/domain-driven-design-domain-vs-application-logic.png b/docs/zh-Hans/images/domain-driven-design-domain-vs-application-logic.png new file mode 100644 index 0000000000..e370cba71e Binary files /dev/null and b/docs/zh-Hans/images/domain-driven-design-domain-vs-application-logic.png differ diff --git a/docs/zh-Hans/images/domain-driven-design-entity-primary-keys.png b/docs/zh-Hans/images/domain-driven-design-entity-primary-keys.png new file mode 100644 index 0000000000..7ee0096222 Binary files /dev/null and b/docs/zh-Hans/images/domain-driven-design-entity-primary-keys.png differ diff --git a/docs/zh-Hans/images/domain-driven-design-example-domain-schema.png b/docs/zh-Hans/images/domain-driven-design-example-domain-schema.png new file mode 100644 index 0000000000..fe3075b141 Binary files /dev/null and b/docs/zh-Hans/images/domain-driven-design-example-domain-schema.png differ diff --git a/docs/zh-Hans/images/domain-driven-design-issue-aggregate-diagram.png b/docs/zh-Hans/images/domain-driven-design-issue-aggregate-diagram.png new file mode 100644 index 0000000000..244564126a Binary files /dev/null and b/docs/zh-Hans/images/domain-driven-design-issue-aggregate-diagram.png differ diff --git a/docs/zh-Hans/images/domain-driven-design-layers.png b/docs/zh-Hans/images/domain-driven-design-layers.png new file mode 100644 index 0000000000..f2fc9af097 Binary files /dev/null and b/docs/zh-Hans/images/domain-driven-design-layers.png differ diff --git a/docs/zh-Hans/images/domain-driven-design-multiple-applications.png b/docs/zh-Hans/images/domain-driven-design-multiple-applications.png new file mode 100644 index 0000000000..6db4fc6443 Binary files /dev/null and b/docs/zh-Hans/images/domain-driven-design-multiple-applications.png differ diff --git a/docs/zh-Hans/images/domain-driven-design-project-relations.png b/docs/zh-Hans/images/domain-driven-design-project-relations.png new file mode 100644 index 0000000000..b7878d1385 Binary files /dev/null and b/docs/zh-Hans/images/domain-driven-design-project-relations.png differ diff --git a/docs/zh-Hans/images/domain-driven-design-reference-by-id-sample.png b/docs/zh-Hans/images/domain-driven-design-reference-by-id-sample.png new file mode 100644 index 0000000000..48a1913654 Binary files /dev/null and b/docs/zh-Hans/images/domain-driven-design-reference-by-id-sample.png differ diff --git a/docs/zh-Hans/images/domain-driven-design-vs-solution.png b/docs/zh-Hans/images/domain-driven-design-vs-solution.png new file mode 100644 index 0000000000..ef0f51a418 Binary files /dev/null and b/docs/zh-Hans/images/domain-driven-design-vs-solution.png differ diff --git a/docs/zh-Hans/images/domain-driven-design-web-request-flow.png b/docs/zh-Hans/images/domain-driven-design-web-request-flow.png new file mode 100644 index 0000000000..a9cb98e01f Binary files /dev/null and b/docs/zh-Hans/images/domain-driven-design-web-request-flow.png differ diff --git a/docs/zh-Hans/images/example-global-styles.png b/docs/zh-Hans/images/example-global-styles.png new file mode 100644 index 0000000000..04232aa62d Binary files /dev/null and b/docs/zh-Hans/images/example-global-styles.png differ diff --git a/docs/zh-Hans/images/features-action.png b/docs/zh-Hans/images/features-action.png new file mode 100644 index 0000000000..8283a95be9 Binary files /dev/null and b/docs/zh-Hans/images/features-action.png differ diff --git a/docs/zh-Hans/images/features-modal.png b/docs/zh-Hans/images/features-modal.png new file mode 100644 index 0000000000..74ee8aabc3 Binary files /dev/null and b/docs/zh-Hans/images/features-modal.png differ diff --git a/docs/zh-Hans/images/issue-first-test.png b/docs/zh-Hans/images/issue-first-test.png new file mode 100644 index 0000000000..b2be1aa8eb Binary files /dev/null and b/docs/zh-Hans/images/issue-first-test.png differ diff --git a/docs/zh-Hans/images/issue-list.png b/docs/zh-Hans/images/issue-list.png new file mode 100644 index 0000000000..96e9010ed6 Binary files /dev/null and b/docs/zh-Hans/images/issue-list.png differ diff --git a/docs/zh-Hans/images/js-message-confirm.png b/docs/zh-Hans/images/js-message-confirm.png new file mode 100644 index 0000000000..876ae8d98e Binary files /dev/null and b/docs/zh-Hans/images/js-message-confirm.png differ diff --git a/docs/zh-Hans/images/js-message-error.png b/docs/zh-Hans/images/js-message-error.png new file mode 100644 index 0000000000..fd8abb1d7e Binary files /dev/null and b/docs/zh-Hans/images/js-message-error.png differ diff --git a/docs/zh-Hans/images/js-message-success.png b/docs/zh-Hans/images/js-message-success.png new file mode 100644 index 0000000000..bbf418a37c Binary files /dev/null and b/docs/zh-Hans/images/js-message-success.png differ diff --git a/docs/zh-Hans/images/js-notify-success.png b/docs/zh-Hans/images/js-notify-success.png new file mode 100644 index 0000000000..04489bc7ce Binary files /dev/null and b/docs/zh-Hans/images/js-notify-success.png differ diff --git a/docs/zh-Hans/images/lepton-theme-account-layout.png b/docs/zh-Hans/images/lepton-theme-account-layout.png new file mode 100644 index 0000000000..e627ba3eae Binary files /dev/null and b/docs/zh-Hans/images/lepton-theme-account-layout.png differ diff --git a/docs/zh-Hans/images/lepton-theme-application-layout.png b/docs/zh-Hans/images/lepton-theme-application-layout.png new file mode 100644 index 0000000000..3d89929abc Binary files /dev/null and b/docs/zh-Hans/images/lepton-theme-application-layout.png differ diff --git a/docs/zh-Hans/images/lepton-theme-blazor-layout.png b/docs/zh-Hans/images/lepton-theme-blazor-layout.png new file mode 100644 index 0000000000..e4211b367e Binary files /dev/null and b/docs/zh-Hans/images/lepton-theme-blazor-layout.png differ diff --git a/docs/zh-Hans/images/modal-example-product-create.png b/docs/zh-Hans/images/modal-example-product-create.png new file mode 100644 index 0000000000..89ea0226ef Binary files /dev/null and b/docs/zh-Hans/images/modal-example-product-create.png differ diff --git a/docs/zh-Hans/images/modal-example-product-info.png b/docs/zh-Hans/images/modal-example-product-info.png new file mode 100644 index 0000000000..5d037c1125 Binary files /dev/null and b/docs/zh-Hans/images/modal-example-product-info.png differ diff --git a/docs/zh-Hans/images/modal-manager-cancel-warning.png b/docs/zh-Hans/images/modal-manager-cancel-warning.png new file mode 100644 index 0000000000..fc00902e0f Binary files /dev/null and b/docs/zh-Hans/images/modal-manager-cancel-warning.png differ diff --git a/docs/zh-Hans/images/modal-manager-example-modal.png b/docs/zh-Hans/images/modal-manager-example-modal.png new file mode 100644 index 0000000000..867c6d410e Binary files /dev/null and b/docs/zh-Hans/images/modal-manager-example-modal.png differ diff --git a/docs/zh-Hans/images/modal-manager-validation.png b/docs/zh-Hans/images/modal-manager-validation.png new file mode 100644 index 0000000000..516a178e66 Binary files /dev/null and b/docs/zh-Hans/images/modal-manager-validation.png differ diff --git a/docs/zh-Hans/images/modal-page-on-rider.png b/docs/zh-Hans/images/modal-page-on-rider.png new file mode 100644 index 0000000000..522885489d Binary files /dev/null and b/docs/zh-Hans/images/modal-page-on-rider.png differ diff --git a/docs/zh-Hans/images/nav-main-menu-administration.png b/docs/zh-Hans/images/nav-main-menu-administration.png new file mode 100644 index 0000000000..21ad977264 Binary files /dev/null and b/docs/zh-Hans/images/nav-main-menu-administration.png differ diff --git a/docs/zh-Hans/images/nav-main-menu.png b/docs/zh-Hans/images/nav-main-menu.png new file mode 100644 index 0000000000..2784c035c2 Binary files /dev/null and b/docs/zh-Hans/images/nav-main-menu.png differ diff --git a/docs/zh-Hans/images/page-alert-account-layout.png b/docs/zh-Hans/images/page-alert-account-layout.png new file mode 100644 index 0000000000..2442cb5d14 Binary files /dev/null and b/docs/zh-Hans/images/page-alert-account-layout.png differ diff --git a/docs/zh-Hans/images/page-alert-example.png b/docs/zh-Hans/images/page-alert-example.png new file mode 100644 index 0000000000..266671757a Binary files /dev/null and b/docs/zh-Hans/images/page-alert-example.png differ diff --git a/docs/zh-Hans/images/product-create-modal-page-on-rider.png b/docs/zh-Hans/images/product-create-modal-page-on-rider.png new file mode 100644 index 0000000000..01cf93eaf0 Binary files /dev/null and b/docs/zh-Hans/images/product-create-modal-page-on-rider.png differ diff --git a/docs/zh-Hans/images/react-native-introduction.gif b/docs/zh-Hans/images/react-native-introduction.gif new file mode 100644 index 0000000000..15963556aa Binary files /dev/null and b/docs/zh-Hans/images/react-native-introduction.gif differ diff --git a/docs/zh-Hans/images/solution-test-projects.png b/docs/zh-Hans/images/solution-test-projects.png new file mode 100644 index 0000000000..e51c368e9f Binary files /dev/null and b/docs/zh-Hans/images/solution-test-projects.png differ diff --git a/docs/zh-Hans/images/ui-busy.png b/docs/zh-Hans/images/ui-busy.png new file mode 100644 index 0000000000..63a1d7d74a Binary files /dev/null and b/docs/zh-Hans/images/ui-busy.png differ diff --git a/docs/zh-Hans/images/ui-options.png b/docs/zh-Hans/images/ui-options.png new file mode 100644 index 0000000000..bd211a8914 Binary files /dev/null and b/docs/zh-Hans/images/ui-options.png differ diff --git a/docs/zh-Hans/images/user-menu.png b/docs/zh-Hans/images/user-menu.png new file mode 100644 index 0000000000..af0671dbdc Binary files /dev/null and b/docs/zh-Hans/images/user-menu.png differ diff --git a/docs/zh-Hans/images/vs-run-tests-in-parallel.png b/docs/zh-Hans/images/vs-run-tests-in-parallel.png new file mode 100644 index 0000000000..765cba5100 Binary files /dev/null and b/docs/zh-Hans/images/vs-run-tests-in-parallel.png differ diff --git a/docs/zh-Hans/images/vs-startup-template-tests.png b/docs/zh-Hans/images/vs-startup-template-tests.png new file mode 100644 index 0000000000..f16d79a4c7 Binary files /dev/null and b/docs/zh-Hans/images/vs-startup-template-tests.png differ diff --git a/docs/zh-Hans/images/vs-test-explorer.png b/docs/zh-Hans/images/vs-test-explorer.png new file mode 100644 index 0000000000..e225ee5e92 Binary files /dev/null and b/docs/zh-Hans/images/vs-test-explorer.png differ diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj index f138f313c2..64f2ef9f99 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj @@ -19,7 +19,7 @@ - + diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj index 84ecc6a1bf..b0aa11f206 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OpenIdConnect/Volo.Abp.AspNetCore.Authentication.OpenIdConnect.csproj @@ -9,7 +9,7 @@ - + diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/Branding.razor b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/Branding.razor index 4810320664..ac629423ce 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/Branding.razor +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/Branding.razor @@ -1,3 +1,3 @@ @using Volo.Abp.Ui.Branding @inject IBrandingProvider BrandingProvider -@BrandingProvider.AppName +@BrandingProvider.AppName diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor index 31090ac092..cf6703ade9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/FirstLevelNavMenuItem.razor @@ -3,7 +3,7 @@ var elementId = MenuItem.ElementId ?? "MenuItem_" + MenuItem.Name.Replace(".", "_"); var cssClass = string.IsNullOrEmpty(MenuItem.CssClass) ? string.Empty : MenuItem.CssClass; var disabled = MenuItem.IsDisabled ? "disabled" : string.Empty; - var url = string.IsNullOrEmpty(MenuItem.Url) ? "#" : MenuItem.Url; + var url = MenuItem.Url == null ? "#" : MenuItem.Url.TrimStart('/'); } @if (MenuItem.IsLeaf) { diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor index 4e75e26b50..1bcafa97bd 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/SecondLevelNavMenuItem.razor @@ -3,7 +3,7 @@ var elementId = MenuItem.ElementId ?? "MenuItem_" + MenuItem.Name.Replace(".", "_"); var cssClass = string.IsNullOrEmpty(MenuItem.CssClass) ? string.Empty : MenuItem.CssClass; var disabled = MenuItem.IsDisabled ? "disabled" : string.Empty; - var url = string.IsNullOrEmpty(MenuItem.Url) ? "#" : MenuItem.Url; + var url = MenuItem.Url == null ? "#" : MenuItem.Url.TrimStart('/'); } @if (MenuItem.IsLeaf) { diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/wwwroot/libs/abp/css/theme.css b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/wwwroot/libs/abp/css/theme.css index fc47596044..ac9aabb57f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/wwwroot/libs/abp/css/theme.css +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/wwwroot/libs/abp/css/theme.css @@ -103,3 +103,8 @@ div.dataTables_wrapper div.dataTables_length label { .navbar-nav>.nav-item>div>button{ color:#fff; } + +.btn span.spinner-border { + margin-right: .5rem; +} + diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj index 508991e6bc..608025f352 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo.Abp.AspNetCore.Components.WebAssembly.csproj @@ -21,8 +21,8 @@ - - + + diff --git a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs index 1b5c5893d5..84f9743a1e 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.WebAssembly/Volo/Abp/AspNetCore/Components/WebAssembly/AbpBlazorClientHttpMessageHandler.cs @@ -3,6 +3,8 @@ using System.Net.Http; using System.Net.Http.Headers; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Configuration; using Microsoft.JSInterop; using Volo.Abp.DependencyInjection; @@ -12,14 +14,28 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly { private readonly IJSRuntime _jsRuntime; - public AbpBlazorClientHttpMessageHandler(IJSRuntime jsRuntime) + private readonly ICookieService _cookieService; + + private readonly NavigationManager _navigationManager; + + private const string AntiForgeryCookieName = "XSRF-TOKEN"; + + private const string AntiForgeryHeaderName = "RequestVerificationToken"; + + public AbpBlazorClientHttpMessageHandler( + IJSRuntime jsRuntime, + ICookieService cookieService, + NavigationManager navigationManager) { _jsRuntime = jsRuntime; + _cookieService = cookieService; + _navigationManager = navigationManager; } protected async override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { await SetLanguageAsync(request, cancellationToken); + await SetAntiForgeryTokenAsync(request); return await base.SendAsync(request, cancellationToken); } @@ -38,5 +54,28 @@ namespace Volo.Abp.AspNetCore.Components.WebAssembly request.Headers.AcceptLanguage.Add(new StringWithQualityHeaderValue(selectedLanguage)); } } + + private async Task SetAntiForgeryTokenAsync(HttpRequestMessage request) + { + if (request.Method == HttpMethod.Get || request.Method == HttpMethod.Head || + request.Method == HttpMethod.Trace || request.Method == HttpMethod.Options) + { + return; + } + + var selfUri = new Uri(_navigationManager.Uri); + + if (request.RequestUri.Host != selfUri.Host || request.RequestUri.Port != selfUri.Port) + { + return; + } + + var token = await _cookieService.GetAsync(AntiForgeryCookieName); + + if (!token.IsNullOrWhiteSpace()) + { + request.Headers.Add(AntiForgeryHeaderName, token); + } + } } } diff --git a/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj b/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj index 407a9141f0..2023908431 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Components/Volo.Abp.AspNetCore.Components.csproj @@ -21,7 +21,7 @@ - + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs index adb50d7382..246c611533 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpInputTagHelperService.cs @@ -317,6 +317,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form var small = new TagBuilder("small"); small.Attributes.Add("id", idAttr?.Value?.ToString() + "InfoText"); small.AddCssClass("form-text text-muted"); + small.InnerHtml.Append(localizedText); return small.ToHtmlString(); } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs index e24aa6d37b..dde58ed3e4 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs @@ -233,6 +233,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form var small = new TagBuilder("small"); small.Attributes.Add("id", idAttr?.Value?.ToString() + "InfoText"); small.AddCssClass("form-text text-muted"); + small.InnerHtml.Append(localizedText); return small.ToHtmlString(); } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalTagHelper.cs index 51688afceb..ece8916dc9 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalTagHelper.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalTagHelper.cs @@ -6,6 +6,8 @@ public bool? Centered { get; set; } = false; + public bool? Scrollable { get; set; } = false; + public bool? Static { get; set; } = false; public AbpModalTagHelper(AbpModalTagHelperService tagHelperService) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalTagHelperService.cs index 9086d8def4..aa83265e94 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Modal/AbpModalTagHelperService.cs @@ -1,112 +1,118 @@ -using Microsoft.AspNetCore.Html; -using Microsoft.AspNetCore.Mvc.Rendering; -using Microsoft.AspNetCore.Razor.TagHelpers; -using System.Text; -using System.Threading.Tasks; - -namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal -{ - public class AbpModalTagHelperService : AbpTagHelperService - { - public async override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) - { - output.TagName = null; - - var childContent = await output.GetChildContentAsync(); - - SetContent(context, output, childContent); - } - - protected virtual void SetContent(TagHelperContext context, TagHelperOutput output, TagHelperContent childContent) - { - var modalContent = GetModalContentElement(context, output, childContent); - var modalDialog = GetModalDialogElement(context, output, modalContent); - var modal = GetModal(context, output, modalDialog); - - output.Content.SetHtmlContent(modal); - } - - protected virtual TagBuilder GetModalContentElement(TagHelperContext context, TagHelperOutput output, TagHelperContent childContent) - { - var element = new TagBuilder("div"); - element.AddCssClass(GetModalContentClasses()); - element.InnerHtml.SetHtmlContent(childContent); - return element; - } - - protected virtual TagBuilder GetModalDialogElement(TagHelperContext context, TagHelperOutput output, IHtmlContent innerHtml) - { - var element = new TagBuilder("div"); - element.AddCssClass(GetModalDialogClasses()); - element.Attributes.Add("role", "document"); - element.InnerHtml.SetHtmlContent(innerHtml); - return element; - } - - protected virtual TagBuilder GetModal(TagHelperContext context, TagHelperOutput output, IHtmlContent innerHtml) - { - var element = new TagBuilder("div"); - element.AddCssClass(GetModalClasses()); - element.Attributes.Add("tabindex", "-1"); - element.Attributes.Add("role", "dialog"); - element.Attributes.Add("aria-hidden", "true"); - - foreach (var attr in output.Attributes) - { - element.Attributes.Add(attr.Name, attr.Value.ToString()); - } - - SetDataAttributes(element); - - element.InnerHtml.SetHtmlContent(innerHtml); - - return element; - } - - protected virtual string GetModalClasses() - { - return "modal fade"; - } - - protected virtual string GetModalDialogClasses() - { - var classNames = new StringBuilder("modal-dialog"); - - if (TagHelper.Centered ?? false) - { - classNames.Append(" "); - classNames.Append("modal-dialog-centered"); - } - - if (TagHelper.Size != AbpModalSize.Default) - { - classNames.Append(" "); - classNames.Append(TagHelper.Size.ToClassName()); - } - - return classNames.ToString(); - } - - protected virtual string GetModalContentClasses() - { - return "modal-content"; - } - - protected virtual string GetDataAttributes() - { - if (TagHelper.Static == true) - { - return "data-backdrop=\"static\" "; - } - return string.Empty; - } - - protected virtual void SetDataAttributes(TagBuilder builder) - { - if (TagHelper.Static == true) - { - builder.Attributes.Add("data-backdrop", "static"); - } - } - } -} +using Microsoft.AspNetCore.Html; +using Microsoft.AspNetCore.Mvc.Rendering; +using Microsoft.AspNetCore.Razor.TagHelpers; +using System.Text; +using System.Threading.Tasks; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal +{ + public class AbpModalTagHelperService : AbpTagHelperService + { + public async override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) + { + output.TagName = null; + + var childContent = await output.GetChildContentAsync(); + + SetContent(context, output, childContent); + } + + protected virtual void SetContent(TagHelperContext context, TagHelperOutput output, TagHelperContent childContent) + { + var modalContent = GetModalContentElement(context, output, childContent); + var modalDialog = GetModalDialogElement(context, output, modalContent); + var modal = GetModal(context, output, modalDialog); + + output.Content.SetHtmlContent(modal); + } + + protected virtual TagBuilder GetModalContentElement(TagHelperContext context, TagHelperOutput output, TagHelperContent childContent) + { + var element = new TagBuilder("div"); + element.AddCssClass(GetModalContentClasses()); + element.InnerHtml.SetHtmlContent(childContent); + return element; + } + + protected virtual TagBuilder GetModalDialogElement(TagHelperContext context, TagHelperOutput output, IHtmlContent innerHtml) + { + var element = new TagBuilder("div"); + element.AddCssClass(GetModalDialogClasses()); + element.Attributes.Add("role", "document"); + element.InnerHtml.SetHtmlContent(innerHtml); + return element; + } + + protected virtual TagBuilder GetModal(TagHelperContext context, TagHelperOutput output, IHtmlContent innerHtml) + { + var element = new TagBuilder("div"); + element.AddCssClass(GetModalClasses()); + element.Attributes.Add("tabindex", "-1"); + element.Attributes.Add("role", "dialog"); + element.Attributes.Add("aria-hidden", "true"); + + foreach (var attr in output.Attributes) + { + element.Attributes.Add(attr.Name, attr.Value.ToString()); + } + + SetDataAttributes(element); + + element.InnerHtml.SetHtmlContent(innerHtml); + + return element; + } + + protected virtual string GetModalClasses() + { + return "modal fade"; + } + + protected virtual string GetModalDialogClasses() + { + var classNames = new StringBuilder("modal-dialog"); + + if (TagHelper.Centered ?? false) + { + classNames.Append(" "); + classNames.Append("modal-dialog-centered"); + } + + if (TagHelper.Scrollable ?? false) + { + classNames.Append(" "); + classNames.Append("modal-dialog-scrollable"); + } + + if (TagHelper.Size != AbpModalSize.Default) + { + classNames.Append(" "); + classNames.Append(TagHelper.Size.ToClassName()); + } + + return classNames.ToString(); + } + + protected virtual string GetModalContentClasses() + { + return "modal-content"; + } + + protected virtual string GetDataAttributes() + { + if (TagHelper.Static == true) + { + return "data-backdrop=\"static\" "; + } + return string.Empty; + } + + protected virtual void SetDataAttributes(TagBuilder builder) + { + if (TagHelper.Static == true) + { + builder.Attributes.Add("data-backdrop", "static"); + } + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/tenant-switch.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/tenant-switch.js index 6b9e348f1d..63b9d577d1 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/tenant-switch.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy/Pages/Abp/MultiTenancy/tenant-switch.js @@ -9,7 +9,7 @@ }); tenantSwitchModal.onResult(function() { - location.reload(); + location.assign(location.href); }); }); diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/CmsKit/CmsKitScriptContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/CmsKit/CmsKitScriptContributor.cs new file mode 100644 index 0000000000..9d022fb85e --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/CmsKit/CmsKitScriptContributor.cs @@ -0,0 +1,11 @@ +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Packages.StarRatingSvg; +using Volo.Abp.Modularity; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.CmsKit +{ + [DependsOn(typeof(StarRatingSvgScriptContributor))] + public class CmsKitScriptContributor : BundleContributor + { + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/CmsKit/CmsKitStyleContributor.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/CmsKit/CmsKitStyleContributor.cs new file mode 100644 index 0000000000..e2654827e4 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages/Volo/Abp/AspNetCore/Mvc/UI/Packages/CmsKit/CmsKitStyleContributor.cs @@ -0,0 +1,11 @@ +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; +using Volo.Abp.AspNetCore.Mvc.UI.Packages.StarRatingSvg; +using Volo.Abp.Modularity; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Packages.CmsKit +{ + [DependsOn(typeof(StarRatingSvgStyleContributor))] + public class CmsKitStyleContributor : BundleContributor + { + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj index a6e7d3d9ae..4bba8a7222 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Demo.csproj @@ -26,7 +26,7 @@ - + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js index 2bbd1aa7a3..b0c4873b59 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/datatables/datatables-extensions.js @@ -325,7 +325,14 @@ * AJAX extension for datatables * *************************************************************************/ (function () { - datatables.createAjax = function (serverMethod, inputAction) { + datatables.createAjax = function (serverMethod, inputAction, responseCallback) { + responseCallback = responseCallback || function(result) { + return { + recordsTotal: result.totalCount, + recordsFiltered: result.totalCount, + data: result.items + }; + } return function (requestData, callback, settings) { var input = inputAction ? inputAction(requestData, settings) : {}; @@ -359,11 +366,7 @@ if (callback) { serverMethod(input).then(function (result) { - callback({ - recordsTotal: result.totalCount, - recordsFiltered: result.totalCount, - data: result.items - }); + callback(responseCallback(result)); }); } }; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.csproj index 208cfa1376..ad0066db55 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo.Abp.AspNetCore.Mvc.UI.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Theming/StandardLayouts.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Theming/StandardLayouts.cs index 3e1b751262..338d12f531 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Theming/StandardLayouts.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Theming/StandardLayouts.cs @@ -4,6 +4,7 @@ { public const string Application = "Application"; public const string Account = "Account"; + public const string Public = "Public"; public const string Empty = "Empty"; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Theming/ThemeExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Theming/ThemeExtensions.cs index ad6e5f49d1..9583fd57cf 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Theming/ThemeExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Theming/ThemeExtensions.cs @@ -12,9 +12,14 @@ return theme.GetLayout(StandardLayouts.Account, fallbackToDefault); } + public static string GetPublicLayout(this ITheme theme, bool fallbackToDefault = true) + { + return theme.GetLayout(StandardLayouts.Public, fallbackToDefault); + } + public static string GetEmptyLayout(this ITheme theme, bool fallbackToDefault = true) { return theme.GetLayout(StandardLayouts.Empty, fallbackToDefault); } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj index be27355fde..53e3c7f503 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj @@ -27,9 +27,9 @@ - - - + + + diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.csproj b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.csproj index 1525a2f798..a73f2c6245 100644 --- a/framework/src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.csproj +++ b/framework/src/Volo.Abp.AspNetCore.TestBase/Volo.Abp.AspNetCore.TestBase.csproj @@ -24,7 +24,7 @@ - + diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs index 24713651f5..93ced35c45 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/RequestLocalization/DefaultAbpRequestLocalizationOptionsProvider.cs @@ -7,10 +7,10 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Localization; using Microsoft.Extensions.DependencyInjection; -using Nito.AsyncEx; using Volo.Abp.DependencyInjection; using Volo.Abp.Localization; using Volo.Abp.Settings; +using Volo.Abp.Threading; namespace Microsoft.AspNetCore.RequestLocalization { @@ -36,7 +36,7 @@ namespace Microsoft.AspNetCore.RequestLocalization { if (_requestLocalizationOptions == null) { - using (await _syncSemaphore.LockAsync().ConfigureAwait(false)) + using (await _syncSemaphore.LockAsync()) { if (_requestLocalizationOptions == null) { diff --git a/framework/src/Volo.Abp.Authorization/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions.cs b/framework/src/Volo.Abp.Authorization/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions.cs index 45650b06a4..bb820c3a83 100644 --- a/framework/src/Volo.Abp.Authorization/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions.cs +++ b/framework/src/Volo.Abp.Authorization/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions.cs @@ -95,7 +95,8 @@ namespace Microsoft.AspNetCore.Authorization { if (!await authorizationService.IsGrantedAsync(policyName)) { - throw new AbpAuthorizationException("Authorization failed! Given policy has not granted: " + policyName); + throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedWithPolicyName) + .WithData("PolicyName", policyName); } } @@ -103,7 +104,8 @@ namespace Microsoft.AspNetCore.Authorization { if (!await authorizationService.IsGrantedAsync(resource, requirement)) { - throw new AbpAuthorizationException("Authorization failed! Given requirement has not granted for given resource: " + resource); + throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementHasNotGrantedForGivenResource) + .WithData("ResourceName", resource); } } @@ -111,7 +113,8 @@ namespace Microsoft.AspNetCore.Authorization { if (!await authorizationService.IsGrantedAsync(resource, policy)) { - throw new AbpAuthorizationException("Authorization failed! Given policy has not granted for given resource: " + resource); + throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedForGivenResource) + .WithData("ResourceName", resource); } } @@ -119,7 +122,7 @@ namespace Microsoft.AspNetCore.Authorization { if (!await authorizationService.IsGrantedAsync(policy)) { - throw new AbpAuthorizationException("Authorization failed! Given policy has not granted."); + throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGranted); } } @@ -127,7 +130,8 @@ namespace Microsoft.AspNetCore.Authorization { if (!await authorizationService.IsGrantedAsync(resource, requirements)) { - throw new AbpAuthorizationException("Authorization failed! Given requirements have not granted for given resource: " + resource); + throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementsHasNotGrantedForGivenResource) + .WithData("ResourceName", resource); } } @@ -135,7 +139,8 @@ namespace Microsoft.AspNetCore.Authorization { if (!await authorizationService.IsGrantedAsync(resource, policyName)) { - throw new AbpAuthorizationException("Authorization failed! Given polist has not granted for given resource: " + resource); + throw new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedForGivenResource) + .WithData("ResourceName", resource); } } @@ -149,4 +154,4 @@ namespace Microsoft.AspNetCore.Authorization return abpAuthorizationService; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Authorization/Volo.Abp.Authorization.csproj b/framework/src/Volo.Abp.Authorization/Volo.Abp.Authorization.csproj index f7f1940c0f..66dd574322 100644 --- a/framework/src/Volo.Abp.Authorization/Volo.Abp.Authorization.csproj +++ b/framework/src/Volo.Abp.Authorization/Volo.Abp.Authorization.csproj @@ -15,11 +15,16 @@ - + - + + + + + + diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationErrorCodes.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationErrorCodes.cs new file mode 100644 index 0000000000..0d4562eba3 --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationErrorCodes.cs @@ -0,0 +1,15 @@ +namespace Volo.Abp.Authorization +{ + public static class AbpAuthorizationErrorCodes + { + public const string GivenPolicyHasNotGranted = "Volo.Authorization:010001"; + + public const string GivenPolicyHasNotGrantedWithPolicyName = "Volo.Authorization:010002"; + + public const string GivenPolicyHasNotGrantedForGivenResource = "Volo.Authorization:010003"; + + public const string GivenRequirementHasNotGrantedForGivenResource = "Volo.Authorization:010004"; + + public const string GivenRequirementsHasNotGrantedForGivenResource = "Volo.Authorization:010005"; + } +} diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs index b16e08a214..b4d5795b9c 100644 --- a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AbpAuthorizationModule.cs @@ -3,17 +3,20 @@ using System.Collections.Generic; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; +using Volo.Abp.Authorization.Localization; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Localization; +using Volo.Abp.Localization.ExceptionHandling; using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; using Volo.Abp.Security; +using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.Authorization { [DependsOn( typeof(AbpSecurityModule), - typeof(AbpLocalizationAbstractionsModule), + typeof(AbpLocalizationModule), typeof(AbpMultiTenancyModule) )] public class AbpAuthorizationModule : AbpModule @@ -38,6 +41,23 @@ namespace Volo.Abp.Authorization options.ValueProviders.Add(); options.ValueProviders.Add(); }); + + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + + Configure(options => + { + options.Resources + .Add("en") + .AddVirtualJson("/Volo/Abp/Authorization/Localization"); + }); + + Configure(options => + { + options.MapCodeNamespace("Volo.Authorization", typeof(AbpAuthorizationResource)); + }); } private static void AutoAddDefinitionProviders(IServiceCollection services) diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/AbpAuthorizationResource.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/AbpAuthorizationResource.cs new file mode 100644 index 0000000000..2888509915 --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/AbpAuthorizationResource.cs @@ -0,0 +1,10 @@ +using Volo.Abp.Localization; + +namespace Volo.Abp.Authorization.Localization +{ + [LocalizationResourceName("AbpAuthorization")] + public class AbpAuthorizationResource + { + + } +} diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/en.json b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/en.json new file mode 100644 index 0000000000..e7bc77c341 --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/en.json @@ -0,0 +1,10 @@ +{ + "culture": "en", + "texts": { + "Volo.Authorization:010001": "Authorization failed! Given policy has not granted.", + "Volo.Authorization:010002": "Authorization failed! Given policy has not granted: {PolicyName}", + "Volo.Authorization:010003": "Authorization failed! Given policy has not granted for given resource: {ResourceName}", + "Volo.Authorization:010004": "Authorization failed! Given requirement has not granted for given resource: {ResourceName}", + "Volo.Authorization:010005": "Authorization failed! Given requirements has not granted for given resource: {ResourceName}" + } +} diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/tr.json b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/tr.json new file mode 100644 index 0000000000..b2d79bd949 --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/tr.json @@ -0,0 +1,10 @@ +{ + "culture": "tr", + "texts": { + "Volo.Authorization:010001": "Yetkilendirme başarısız! Belirtilen izin sağlanmamış.", + "Volo.Authorization:010002": "Yetkilendirme başarısız! Bu izin sağlanmamış: {PolicyName}", + "Volo.Authorization:010003": "Yetkilendirme başarısız! Bu izin, bu kaynak için sağlanmamış: {ResourceName}", + "Volo.Authorization:010004": "Yetkilendirme başarısız! Bu kaynak belirtilen gerekliliği sağlamamış: {ResourceName}", + "Volo.Authorization:010005": "Yetkilendirme başarısız! Bu kaynak belirtilen gereklilikleri sağlamamış: {ResourceName}" + } +} diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/zh-Hans.json b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/zh-Hans.json new file mode 100644 index 0000000000..d0946ef6a5 --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/Localization/zh-Hans.json @@ -0,0 +1,10 @@ +{ + "culture": "zh-Hans", + "texts": { + "Volo.Authorization:010001": "授权失败! 提供的策略尚未授予.", + "Volo.Authorization:010002": "授权失败! 提供的策略尚未授予: {PolicyName}", + "Volo.Authorization:010003": "授权失败! 提供的策略未授予提供的资源: {ResourceName}", + "Volo.Authorization:010004": "授权失败! 提供的要求未授予提供的资源: {ResourceName}", + "Volo.Authorization:010005": "授权失败! 提供的要求未授予提供的资源: {ResourceName}" + } +} diff --git a/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj b/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj index bd5cffe848..9f028d31ee 100644 --- a/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj +++ b/framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj @@ -21,7 +21,7 @@ - + diff --git a/framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs b/framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs index 024fc3a258..e0f7ec50ad 100644 --- a/framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs +++ b/framework/src/Volo.Abp.Autofac/Autofac/Extensions/DependencyInjection/AutofacRegistration.cs @@ -27,6 +27,7 @@ using System; using System.Reflection; using Autofac.Builder; using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Autofac; using Volo.Abp.Modularity; namespace Autofac.Extensions.DependencyInjection @@ -116,6 +117,7 @@ namespace Autofac.Extensions.DependencyInjection .RegisterGeneric(service.ImplementationType) .As(service.ServiceType) .ConfigureLifecycle(service.Lifetime) + .FindConstructorsWith(new AbpAutofacConstructorFinder()) .ConfigureAbpConventions(moduleContainer, registrationActionList); } else @@ -124,6 +126,7 @@ namespace Autofac.Extensions.DependencyInjection .RegisterType(service.ImplementationType) .As(service.ServiceType) .ConfigureLifecycle(service.Lifetime) + .FindConstructorsWith(new AbpAutofacConstructorFinder()) .ConfigureAbpConventions(moduleContainer, registrationActionList); } } diff --git a/framework/src/Volo.Abp.Autofac/Volo.Abp.Autofac.csproj b/framework/src/Volo.Abp.Autofac/Volo.Abp.Autofac.csproj index ac294593a7..ec9e4c0364 100644 --- a/framework/src/Volo.Abp.Autofac/Volo.Abp.Autofac.csproj +++ b/framework/src/Volo.Abp.Autofac/Volo.Abp.Autofac.csproj @@ -15,9 +15,9 @@ - - - + + + diff --git a/framework/src/Volo.Abp.Autofac/Volo/Abp/Autofac/AbpAutofacConstructorFinder.cs b/framework/src/Volo.Abp.Autofac/Volo/Abp/Autofac/AbpAutofacConstructorFinder.cs new file mode 100644 index 0000000000..a9d0b736a2 --- /dev/null +++ b/framework/src/Volo.Abp.Autofac/Volo/Abp/Autofac/AbpAutofacConstructorFinder.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Concurrent; +using System.Reflection; +using Autofac.Core.Activators.Reflection; + +namespace Volo.Abp.Autofac +{ + public class AbpAutofacConstructorFinder : IConstructorFinder + { + private const BindingFlags DeclaredOnlyPublicFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly; //Remove static constructor, BindingFlags.Static + + private readonly Func _finder; + + private static readonly ConcurrentDictionary DefaultPublicConstructorsCache = new ConcurrentDictionary(); + + public AbpAutofacConstructorFinder() + : this(GetDefaultPublicConstructors) + { + } + + public AbpAutofacConstructorFinder(Func finder) + { + _finder = finder ?? throw new ArgumentNullException(nameof(finder)); + } + + public ConstructorInfo[] FindConstructors(Type targetType) + { + return _finder(targetType); + } + + private static ConstructorInfo[] GetDefaultPublicConstructors(Type type) + { + var retval = DefaultPublicConstructorsCache.GetOrAdd(type, t => t.GetConstructors(DeclaredOnlyPublicFlags)); + + if (retval.Length == 0) + { + throw new NoConstructorsFoundException(type); + } + + return retval; + } + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs index 8b6c6f89f7..2aceb52c49 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs @@ -11,23 +11,14 @@ namespace Volo.Abp.BackgroundJobs.Hangfire public virtual Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { - if (!delay.HasValue) - { - return Task.FromResult( - BackgroundJob.Enqueue>( - adapter => adapter.Execute(args) - ) - ); - } - else - { - return Task.FromResult( - BackgroundJob.Schedule>( - adapter => adapter.Execute(args), - delay.Value - ) - ); - } + return Task.FromResult(delay.HasValue + ? BackgroundJob.Schedule>( + adapter => adapter.ExecuteAsync(args), + delay.Value + ) + : BackgroundJob.Enqueue>( + adapter => adapter.ExecuteAsync(args) + )); } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs index 9c0acf98d9..cd596a3823 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs @@ -1,8 +1,6 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using Volo.Abp.Threading; namespace Volo.Abp.BackgroundJobs.Hangfire { @@ -22,7 +20,7 @@ namespace Volo.Abp.BackgroundJobs.Hangfire Options = options.Value; } - public void Execute(TArgs args) + public async Task ExecuteAsync(TArgs args) { if (!Options.IsJobExecutionEnabled) { @@ -39,8 +37,8 @@ namespace Volo.Abp.BackgroundJobs.Hangfire { var jobType = Options.GetJob(typeof(TArgs)).JobType; var context = new JobExecutionContext(scope.ServiceProvider, jobType, args); - AsyncHelper.RunSync(() => JobExecuter.ExecuteAsync(context)); + await JobExecuter.ExecuteAsync(context); } } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs index 217584ab5f..3d7e8c05ff 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs @@ -6,7 +6,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; -using Nito.AsyncEx; using RabbitMQ.Client; using RabbitMQ.Client.Events; using Volo.Abp.ExceptionHandling; @@ -22,7 +21,7 @@ namespace Volo.Abp.BackgroundJobs.RabbitMQ protected BackgroundJobConfiguration JobConfiguration { get; } protected JobQueueConfiguration QueueConfiguration { get; } protected IChannelAccessor ChannelAccessor { get; private set; } - protected EventingBasicConsumer Consumer { get; private set; } + protected AsyncEventingBasicConsumer Consumer { get; private set; } public ILogger> Logger { get; set; } @@ -76,7 +75,7 @@ namespace Volo.Abp.BackgroundJobs.RabbitMQ { CheckDisposed(); - using (await SyncObj.LockAsync().ConfigureAwait(false)) + using (await SyncObj.LockAsync()) { await EnsureInitializedAsync(); @@ -95,7 +94,7 @@ namespace Volo.Abp.BackgroundJobs.RabbitMQ return; } - using (await SyncObj.LockAsync().ConfigureAwait(false)) + using (await SyncObj.LockAsync(cancellationToken)) { await EnsureInitializedAsync(); } @@ -136,7 +135,7 @@ namespace Volo.Abp.BackgroundJobs.RabbitMQ if (AbpBackgroundJobOptions.IsJobExecutionEnabled) { - Consumer = new EventingBasicConsumer(ChannelAccessor.Channel); + Consumer = new AsyncEventingBasicConsumer(ChannelAccessor.Channel); Consumer.Received += MessageReceived; //TODO: What BasicConsume returns? @@ -174,7 +173,7 @@ namespace Volo.Abp.BackgroundJobs.RabbitMQ return properties; } - protected virtual void MessageReceived(object sender, BasicDeliverEventArgs ea) + protected virtual async Task MessageReceived(object sender, BasicDeliverEventArgs ea) { using (var scope = ServiceScopeFactory.CreateScope()) { @@ -186,7 +185,7 @@ namespace Volo.Abp.BackgroundJobs.RabbitMQ try { - AsyncHelper.RunSync(() => JobExecuter.ExecuteAsync(context)); + await JobExecuter.ExecuteAsync(context); ChannelAccessor.Channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false); } catch (BackgroundJobExecutionException) diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs index 1660b471d2..d902b330f0 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs @@ -4,7 +4,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using Nito.AsyncEx; using Volo.Abp.DependencyInjection; using Volo.Abp.Threading; @@ -64,7 +63,7 @@ namespace Volo.Abp.BackgroundJobs.RabbitMQ return (IJobQueue)jobQueue; } - using (await SyncSemaphore.LockAsync().ConfigureAwait(false)) + using (await SyncSemaphore.LockAsync()) { if (JobQueues.TryGetValue(jobConfiguration.JobName, out jobQueue)) { diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs index 62e79010cc..2635294323 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.BackgroundJobs protected AbpBackgroundJobWorkerOptions WorkerOptions { get; } public BackgroundJobWorker( - AbpTimer timer, + AbpAsyncTimer timer, IOptions jobOptions, IOptions workerOptions, IServiceScopeFactory serviceScopeFactory) @@ -113,4 +113,4 @@ namespace Volo.Abp.BackgroundJobs return nextTryDate; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerAdapter.cs index e6a65a2865..970beea3f0 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerAdapter.cs @@ -34,7 +34,7 @@ namespace Volo.Abp.BackgroundWorkers.Quartz throw new ArgumentException($"{nameof(worker)} type is different from the generic type"); } - var timer = (AbpTimer) worker.GetType().GetProperty("Timer", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(worker); + var timer = (AbpAsyncTimer) worker.GetType().GetProperty("Timer", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(worker); period = timer?.Period; } else diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AsyncPeriodicBackgroundWorkerBase.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AsyncPeriodicBackgroundWorkerBase.cs index ed48ba69ee..094c6eb7eb 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AsyncPeriodicBackgroundWorkerBase.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AsyncPeriodicBackgroundWorkerBase.cs @@ -11,15 +11,15 @@ namespace Volo.Abp.BackgroundWorkers public abstract class AsyncPeriodicBackgroundWorkerBase : BackgroundWorkerBase { protected IServiceScopeFactory ServiceScopeFactory { get; } - protected AbpTimer Timer { get; } + protected AbpAsyncTimer Timer { get; } protected AsyncPeriodicBackgroundWorkerBase( - AbpTimer timer, + AbpAsyncTimer timer, IServiceScopeFactory serviceScopeFactory) { ServiceScopeFactory = serviceScopeFactory; Timer = timer; - Timer.Elapsed += Timer_Elapsed; + Timer.Elapsed = Timer_Elapsed; } public async override Task StartAsync(CancellationToken cancellationToken = default) @@ -34,23 +34,24 @@ namespace Volo.Abp.BackgroundWorkers await base.StopAsync(cancellationToken); } - private void Timer_Elapsed(object sender, System.EventArgs e) + private async Task Timer_Elapsed(AbpAsyncTimer timer) + { + await DoWorkAsync(); + } + + private async Task DoWorkAsync() { using (var scope = ServiceScopeFactory.CreateScope()) { try { - AsyncHelper.RunSync( - () => DoWorkAsync(new PeriodicBackgroundWorkerContext(scope.ServiceProvider)) - ); + await DoWorkAsync(new PeriodicBackgroundWorkerContext(scope.ServiceProvider)); } catch (Exception ex) { - AsyncHelper.RunSync( - () => scope.ServiceProvider - .GetRequiredService() - .NotifyAsync(new ExceptionNotificationContext(ex)) - ); + await scope.ServiceProvider + .GetRequiredService() + .NotifyAsync(new ExceptionNotificationContext(ex)); Logger.LogException(ex); } diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/PeriodicBackgroundWorkerBase.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/PeriodicBackgroundWorkerBase.cs index e29dbfec6e..6ac757fef5 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/PeriodicBackgroundWorkerBase.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/PeriodicBackgroundWorkerBase.cs @@ -43,14 +43,12 @@ namespace Volo.Abp.BackgroundWorkers { try { - DoWork(new PeriodicBackgroundWorkerContext(scope.ServiceProvider)); } catch (Exception ex) { - scope.ServiceProvider - .GetRequiredService() - .NotifyAsync(new ExceptionNotificationContext(ex)); + var exceptionNotifier = scope.ServiceProvider.GetRequiredService(); + AsyncHelper.RunSync(() => exceptionNotifier.NotifyAsync(new ExceptionNotificationContext(ex))); Logger.LogException(ex); } diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/SubmitButton.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/SubmitButton.razor new file mode 100644 index 0000000000..140aa6502e --- /dev/null +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/SubmitButton.razor @@ -0,0 +1,10 @@ + diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/SubmitButton.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/SubmitButton.razor.cs new file mode 100644 index 0000000000..95cbdedd20 --- /dev/null +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/SubmitButton.razor.cs @@ -0,0 +1,73 @@ +using System; +using System.Threading.Tasks; +using Blazorise; +using Localization.Resources.AbpUi; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Localization; + +namespace Volo.Abp.BlazoriseUI.Components +{ + public partial class SubmitButton : ComponentBase + { + protected bool Submiting { get; set; } + + [Parameter] + public string Form { get; set; } + + [Parameter] + public ButtonType Type { get; set; } = ButtonType.Submit; + + [Parameter] + public Color Color { get; set; } = Color.Primary; + + [Parameter] + public bool PreventDefaultOnSubmit { get; set; } = true; + + [Parameter] + public bool Block { get; set; } + + [Parameter] + public bool? Disabled { get; set; } + + [Parameter] + public string SaveResourceKey { get; set; } = "Save"; + + [Parameter] + public EventCallback Clicked { get; set; } + + [Parameter] + public RenderFragment ChildContent { get; set; } + + [Inject] + protected IStringLocalizer StringLocalizer { get; set; } + + protected bool IsDisabled + => Disabled == true || Submiting; + + protected bool IsLoading + => Submiting; + + protected string SaveString + => StringLocalizer[SaveResourceKey]; + + protected virtual async Task OnClickedHandler() + { + try + { + Submiting = true; + + await Clicked.InvokeAsync(null); + } + catch (Exception) + { + throw; + } + finally + { + Submiting = false; + + await InvokeAsync(StateHasChanged); + } + } + } +} diff --git a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj index b87f698e0b..1dce47face 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj +++ b/framework/src/Volo.Abp.BlazoriseUI/Volo.Abp.BlazoriseUI.csproj @@ -12,9 +12,9 @@ - - - + + + diff --git a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo.Abp.BlobStoring.Aliyun.csproj b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo.Abp.BlobStoring.Aliyun.csproj index f3f8249f50..25c486d79f 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo.Abp.BlobStoring.Aliyun.csproj +++ b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo.Abp.BlobStoring.Aliyun.csproj @@ -16,7 +16,7 @@ - + diff --git a/framework/src/Volo.Abp.BlobStoring.Aws/Volo.Abp.BlobStoring.Aws.csproj b/framework/src/Volo.Abp.BlobStoring.Aws/Volo.Abp.BlobStoring.Aws.csproj index 796da8aa26..d36d2bfbf3 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aws/Volo.Abp.BlobStoring.Aws.csproj +++ b/framework/src/Volo.Abp.BlobStoring.Aws/Volo.Abp.BlobStoring.Aws.csproj @@ -17,8 +17,8 @@ - - + + diff --git a/framework/src/Volo.Abp.BlobStoring.Azure/Volo.Abp.BlobStoring.Azure.csproj b/framework/src/Volo.Abp.BlobStoring.Azure/Volo.Abp.BlobStoring.Azure.csproj index 6434e1d43c..73a8116e46 100644 --- a/framework/src/Volo.Abp.BlobStoring.Azure/Volo.Abp.BlobStoring.Azure.csproj +++ b/framework/src/Volo.Abp.BlobStoring.Azure/Volo.Abp.BlobStoring.Azure.csproj @@ -16,7 +16,7 @@ - + diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj index 4b3d4dcff7..d1faed8f5c 100644 --- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo.Abp.Caching.StackExchangeRedis.csproj @@ -19,7 +19,7 @@ - + diff --git a/framework/src/Volo.Abp.Caching/Volo.Abp.Caching.csproj b/framework/src/Volo.Abp.Caching/Volo.Abp.Caching.csproj index f1830d9d98..4022d38fee 100644 --- a/framework/src/Volo.Abp.Caching/Volo.Abp.Caching.csproj +++ b/framework/src/Volo.Abp.Caching/Volo.Abp.Caching.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs index de9c653391..d62411628e 100644 --- a/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs +++ b/framework/src/Volo.Abp.Caching/Volo/Abp/Caching/DistributedCache.cs @@ -9,7 +9,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; -using Nito.AsyncEx; using Volo.Abp.ExceptionHandling; using Volo.Abp.MultiTenancy; using Volo.Abp.Threading; @@ -499,7 +498,7 @@ namespace Volo.Abp.Caching return value; } - using (await SyncSemaphore.LockAsync(token).ConfigureAwait(false)) + using (await SyncSemaphore.LockAsync(token)) { value = await GetAsync(key, hideErrors, considerUow, token); if (value != null) @@ -1030,7 +1029,7 @@ namespace Volo.Abp.Caching protected virtual void HandleException(Exception ex) { - AsyncHelper.RunSync(() => HandleExceptionAsync(ex)); + _ = HandleExceptionAsync(ex); } protected virtual async Task HandleExceptionAsync(Exception ex) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj b/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj index 13f81e730b..c9ea67209f 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj +++ b/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj @@ -15,10 +15,10 @@ - - - - + + + + diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs index d4d1d1d22e..bc4db38c84 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs @@ -3,6 +3,7 @@ using Volo.Abp.Cli.Commands; using Volo.Abp.Domain; using Volo.Abp.IdentityModel; using Volo.Abp.Json; +using Volo.Abp.Minify; using Volo.Abp.Modularity; namespace Volo.Abp.Cli @@ -10,7 +11,8 @@ namespace Volo.Abp.Cli [DependsOn( typeof(AbpDddDomainModule), typeof(AbpJsonModule), - typeof(AbpIdentityModelModule) + typeof(AbpIdentityModelModule), + typeof(AbpMinifyModule) )] public class AbpCliCoreModule : AbpModule { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundleConfig.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundleConfig.cs new file mode 100644 index 0000000000..3fb1dd91c9 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundleConfig.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using Volo.Abp.Bundling; + +namespace Volo.Abp.Cli.Bundling +{ + public class BundleConfig + { + public BundlingMode Mode { get; set; } + public string Name { get; set; } + public BundleParameterDictionary Parameters { get; set; } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundleOptions.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundleOptions.cs new file mode 100644 index 0000000000..fceff11240 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundleOptions.cs @@ -0,0 +1,21 @@ +using JetBrains.Annotations; + +namespace Volo.Abp.Cli.Bundling +{ + public class BundleOptions + { + [NotNull] + public string Directory { get; set; } + + [NotNull] + public string BundleName { get; set; } + + [NotNull] + public string FrameworkVersion { get; set; } + + [NotNull] + public string ProjectFileName { get; set; } + + public bool Minify { get; set; } + } +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundleTypeDefinition.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundleTypeDefinition.cs index 57500a1db5..730be91f53 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundleTypeDefinition.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundleTypeDefinition.cs @@ -6,6 +6,6 @@ namespace Volo.Abp.Cli.Bundling { public int Level { get; set; } - public Type BundleContributerType { get; set; } + public Type BundleContributorType { get; set; } } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlerBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlerBase.cs new file mode 100644 index 0000000000..4145c34e68 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlerBase.cs @@ -0,0 +1,132 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml; +using Volo.Abp.Bundling; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Minify; +using Volo.Abp.Minify.NUglify; + +namespace Volo.Abp.Cli.Bundling +{ + public abstract class BundlerBase : IBundler, ITransientDependency + { + private static string[] _minFileSuffixes = {"min", "prod"}; + + protected IMinifier Minifier { get; } + public ILogger Logger { get; set; } + public abstract string FileExtension { get; } + public abstract string GenerateDefinition(string bundleFilePath, + List bundleDefinitionsExcludingFromBundle); + + protected BundlerBase(IMinifier minifier) + { + Minifier = minifier; + } + + public string Bundle(BundleOptions options, BundleContext context) + { + var bundleFilePath = Path.Combine(PathHelper.GetWwwRootPath(options.Directory), + $"{options.BundleName}{FileExtension}"); + var bundleFileDefinitions = context.BundleDefinitions.Where(t => t.ExcludeFromBundle == false).ToList(); + var fileDefinitionsExcludingFromBundle = context.BundleDefinitions.Where(t => t.ExcludeFromBundle).ToList(); + + var bundledContent = BundleFiles(options, bundleFileDefinitions); + File.WriteAllText(bundleFilePath, bundledContent); + + return GenerateDefinition(bundleFilePath,fileDefinitionsExcludingFromBundle); + } + + private bool IsMinFile(string fileName) + { + foreach (var suffix in _minFileSuffixes) + { + if (fileName.EndsWith($".{suffix}{FileExtension}", StringComparison.InvariantCultureIgnoreCase)) + { + return true; + } + } + + return false; + } + + private string BundleFiles(BundleOptions options, List bundleDefinitions) + { + var staticAssetsFilePath = Path.Combine(options.Directory, "bin", "Debug", options.FrameworkVersion, + $"{options.ProjectFileName}.StaticWebAssets.xml"); + if (!File.Exists(staticAssetsFilePath)) + { + throw new BundlingException( + "Unable to find static web assets file. You need to build the project to generate static web assets file."); + } + + var staticAssetsDefinitions = new XmlDocument(); + staticAssetsDefinitions.Load(staticAssetsFilePath); + + var builder = new StringBuilder(); + foreach (var definition in bundleDefinitions) + { + string content; + if (definition.Source.StartsWith("_content")) + { + var pathFragments = definition.Source.Split('/').ToList(); + var basePath = $"{pathFragments[0]}/{pathFragments[1]}"; + var path = staticAssetsDefinitions.SelectSingleNode($"//ContentRoot[@BasePath='{basePath}']") + .Attributes["Path"].Value; + var absolutePath = definition.Source.Replace(basePath, path); + content = GetFileContent(absolutePath, options.Minify); + } + else if (definition.Source.StartsWith("_framework")) + { + var slashIndex = definition.Source.IndexOf('/'); + var fileName = + definition.Source.Substring(slashIndex + 1, definition.Source.Length - slashIndex - 1); + var filePath = + Path.Combine(PathHelper.GetFrameworkFolderPath(options.Directory, options.FrameworkVersion), + fileName); + content = GetFileContent(filePath, false); + } + else + { + var filePath = Path.Combine(PathHelper.GetWwwRootPath(options.Directory), definition.Source); + content = GetFileContent(filePath, options.Minify); + } + + content = ProcessBeforeAddingToTheBundle(definition.Source, Path.Combine(options.Directory, "wwwroot"), + content); + builder.AppendLine(content); + } + + return builder.ToString(); + } + + private string GetFileContent(string filePath, bool minify) + { + var content = File.ReadAllText(filePath); + if (minify && !IsMinFile(filePath)) + { + try + { + content = Minifier.Minify(content); + } + catch (NUglifyException ex) + { + Logger.LogWarning( + $"Unable to minify the file: {Path.GetFileName(filePath)}. Adding file to the bundle without minification.", + ex); + } + } + + return content; + } + + protected virtual string ProcessBeforeAddingToTheBundle(string referencePath, string bundleDirectory, + string fileContent) + { + return fileContent; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingConsts.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingConsts.cs new file mode 100644 index 0000000000..f5153b1fa0 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingConsts.cs @@ -0,0 +1,11 @@ +namespace Volo.Abp.Cli.Bundling +{ + internal static class BundlingConsts + { + internal const string StylePlaceholderStart = ""; + internal const string StylePlaceholderEnd = ""; + internal const string ScriptPlaceholderStart = ""; + internal const string ScriptPlaceholderEnd = ""; + internal const string SupportedWebAssemblyProjectType = "Microsoft.NET.Sdk.BlazorWebAssembly"; + } +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingMode.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingMode.cs new file mode 100644 index 0000000000..8789d631d1 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingMode.cs @@ -0,0 +1,9 @@ +namespace Volo.Abp.Cli.Bundling +{ + public enum BundlingMode + { + None, + Bundle, + BundleAndMinify, + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs index 698b0978c2..cbe577380f 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/BundlingService.cs @@ -1,4 +1,5 @@ -using System; +using Microsoft.Extensions.Logging; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -8,31 +9,45 @@ using System.Threading.Tasks; using System.Xml; using Volo.Abp.Bundling; using Volo.Abp.Cli.Build; +using Volo.Abp.Cli.Bundling.Scripts; +using Volo.Abp.Cli.Bundling.Styles; +using Volo.Abp.Cli.Configuration; using Volo.Abp.DependencyInjection; +using Volo.Abp.Minify.Scripts; +using Volo.Abp.Minify.Styles; using Volo.Abp.Modularity; namespace Volo.Abp.Cli.Bundling { public class BundlingService : IBundlingService, ITransientDependency { - const string StylePlaceholderStart = ""; - const string StylePlaceholderEnd = ""; - const string ScriptPlaceholderStart = ""; - const string ScriptPlaceholderEnd = ""; - const string SupportedWebAssemblyProjectType = "Microsoft.NET.Sdk.BlazorWebAssembly"; - public IDotNetProjectBuilder DotNetProjectBuilder { get; set; } + public IJavascriptMinifier JsMinifier { get; set; } + public ICssMinifier CssMinifier { get; set; } + public ILogger Logger { get; set; } + public IScriptBundler ScriptBundler { get; set; } + public IStyleBundler StyleBundler { get; set; } + public IConfigReader ConfigReader { get; set; } public async Task BundleAsync(string directory, bool forceBuild) { var projectFiles = Directory.GetFiles(directory, "*.csproj"); if (!projectFiles.Any()) { - throw new BundlingException("No project file found in the directory. The working directory must have a Blazor project file."); + throw new BundlingException( + "No project file found in the directory. The working directory must have a Blazor project file."); } var projectFilePath = projectFiles[0]; + var config = ConfigReader.Read(PathHelper.GetWwwRootPath(directory)); + var bundleConfig = config?.Bundle; + + if (bundleConfig == null) + { + throw new BundlingException("Bundle section is missing in the appsettings.json configuration file."); + } + if (forceBuild) { var projects = new List() @@ -44,51 +59,81 @@ namespace Volo.Abp.Cli.Bundling } var frameworkVersion = GetTargetFrameworkVersion(projectFilePath); - var assemblyFilePath = GetAssemblyFilePath(directory, frameworkVersion, Path.GetFileNameWithoutExtension(projectFilePath)); + var projectName = Path.GetFileNameWithoutExtension(projectFilePath); + var assemblyFilePath = PathHelper.GetAssemblyFilePath(directory, frameworkVersion, projectName); var startupModule = GetStartupModule(assemblyFilePath); var bundleDefinitions = new List(); - FindBundleContributersRecursively(startupModule, 0, bundleDefinitions); + FindBundleContributorsRecursively(startupModule, 0, bundleDefinitions); bundleDefinitions = bundleDefinitions.OrderByDescending(t => t.Level).ToList(); - var styleContext = GetStyleContext(bundleDefinitions); - var scriptContext = GetScriptContext(bundleDefinitions); - var styleDefinitions = GenerateStyleDefinitions(styleContext); - var scriptDefinitions = GenerateScriptDefinitions(scriptContext); + var styleContext = GetStyleContext(bundleDefinitions,bundleConfig.Parameters); + var scriptContext = GetScriptContext(bundleDefinitions,bundleConfig.Parameters); + string styleDefinitions; + string scriptDefinitions; + + if (bundleConfig.Mode is BundlingMode.Bundle || bundleConfig.Mode is BundlingMode.BundleAndMinify) + { + var options = new BundleOptions + { + Directory = directory, + FrameworkVersion = frameworkVersion, + ProjectFileName = projectName, + BundleName = bundleConfig.Name.IsNullOrEmpty() ? "global" : bundleConfig.Name, + Minify = bundleConfig.Mode == BundlingMode.BundleAndMinify + }; + + styleDefinitions = StyleBundler.Bundle(options, styleContext); + scriptDefinitions = ScriptBundler.Bundle(options, scriptContext); + } + else + { + styleDefinitions = GenerateStyleDefinitions(styleContext); + scriptDefinitions = GenerateScriptDefinitions(scriptContext); + } await UpdateDependenciesInHtmlFileAsync(directory, styleDefinitions, scriptDefinitions); } - private BundleContext GetScriptContext(List bundleDefinitions) + private BundleContext GetScriptContext(List bundleDefinitions, + BundleParameterDictionary parameters) { - var scriptContext = new BundleContext(); + var scriptContext = new BundleContext + { + Parameters = parameters + }; foreach (var bundleDefinition in bundleDefinitions) { - var contributer = CreateContributerInstance(bundleDefinition.BundleContributerType); - contributer.AddScripts(scriptContext); + var contributor = CreateContributorInstance(bundleDefinition.BundleContributorType); + contributor.AddScripts(scriptContext); } scriptContext.Add("_framework/blazor.webassembly.js"); return scriptContext; } - private BundleContext GetStyleContext(List bundleDefinitions) + private BundleContext GetStyleContext(List bundleDefinitions, + BundleParameterDictionary parameters) { - var styleContext = new BundleContext(); + var styleContext = new BundleContext + { + Parameters = parameters + }; foreach (var bundleDefinition in bundleDefinitions) { - var contributer = CreateContributerInstance(bundleDefinition.BundleContributerType); - contributer.AddStyles(styleContext); + var contributor = CreateContributorInstance(bundleDefinition.BundleContributorType); + contributor.AddStyles(styleContext); } return styleContext; } - private async Task UpdateDependenciesInHtmlFileAsync(string directory, string styleDefinitions, string scriptDefinitions) + private async Task UpdateDependenciesInHtmlFileAsync(string directory, string styleDefinitions, + string scriptDefinitions) { - var htmlFilePath = Path.Combine(directory, "wwwroot", "index.html"); + var htmlFilePath = Path.Combine(PathHelper.GetWwwRootPath(directory), "index.html"); if (!File.Exists(htmlFilePath)) { throw new BundlingException($"index.html file could not be found in the following path:{htmlFilePath}"); @@ -102,8 +147,10 @@ namespace Volo.Abp.Cli.Bundling content = await reader.ReadToEndAsync(); } - content = UpdatePlaceholders(content, StylePlaceholderStart, StylePlaceholderEnd, styleDefinitions); - content = UpdatePlaceholders(content, ScriptPlaceholderStart, ScriptPlaceholderEnd, scriptDefinitions); + content = UpdatePlaceholders(content, BundlingConsts.StylePlaceholderStart, + BundlingConsts.StylePlaceholderEnd, styleDefinitions); + content = UpdatePlaceholders(content, BundlingConsts.ScriptPlaceholderStart, + BundlingConsts.ScriptPlaceholderEnd, scriptDefinitions); using (var writer = new StreamWriter(htmlFilePath, false, fileEncoding)) { @@ -112,11 +159,13 @@ namespace Volo.Abp.Cli.Bundling } } - private string UpdatePlaceholders(string content, string placeholderStart, string placeholderEnd, string definitions) + private string UpdatePlaceholders(string content, string placeholderStart, string placeholderEnd, + string definitions) { var placeholderStartIndex = content.IndexOf(placeholderStart); var placeholderEndIndex = content.IndexOf(placeholderEnd); - var updatedContent = content.Remove(placeholderStartIndex, (placeholderEndIndex + placeholderEnd.Length) - placeholderStartIndex); + var updatedContent = content.Remove(placeholderStartIndex, + (placeholderEndIndex + placeholderEnd.Length) - placeholderStartIndex); return updatedContent.Insert(placeholderStartIndex, definitions); } @@ -124,7 +173,7 @@ namespace Volo.Abp.Cli.Bundling { var builder = new StringBuilder(); - builder.AppendLine($"{StylePlaceholderStart}"); + builder.AppendLine($"{BundlingConsts.StylePlaceholderStart}"); foreach (var style in context.BundleDefinitions) { @@ -138,7 +187,7 @@ namespace Volo.Abp.Cli.Bundling builder.AppendLine("/>"); } - builder.Append($" {StylePlaceholderEnd}"); + builder.Append($" {BundlingConsts.StylePlaceholderEnd}"); return builder.ToString(); } @@ -146,7 +195,7 @@ namespace Volo.Abp.Cli.Bundling private string GenerateScriptDefinitions(BundleContext context) { var builder = new StringBuilder(); - builder.AppendLine($"{ScriptPlaceholderStart}"); + builder.AppendLine($"{BundlingConsts.ScriptPlaceholderStart}"); foreach (var script in context.BundleDefinitions) { builder.Append($" "); } - builder.Append($" {ScriptPlaceholderEnd}"); + + builder.Append($" {BundlingConsts.ScriptPlaceholderEnd}"); return builder.ToString(); } - private IBundleContributor CreateContributerInstance(Type bundleContributerType) + private IBundleContributor CreateContributorInstance(Type bundleContributorType) { - return (IBundleContributor)Activator.CreateInstance(bundleContributerType); + return (IBundleContributor) Activator.CreateInstance(bundleContributorType); } - private void FindBundleContributersRecursively( + private void FindBundleContributorsRecursively( Type module, int level, List bundleDefinitions) { - var bundleContributers = module.Assembly + var bundleContributors = module.Assembly .GetTypes() .Where(t => t.IsAssignableTo()) .ToList(); - if (bundleContributers.Count > 1) + if (bundleContributors.Count > 1) { - throw new BundlingException($"Each project must contain only one class implementing {nameof(IBundleContributor)}"); + throw new BundlingException( + $"Each project must contain only one class implementing {nameof(IBundleContributor)}"); } - if (bundleContributers.Any()) + if (bundleContributors.Any()) { - var bundleContributer = bundleContributers[0]; - var definition = bundleDefinitions.SingleOrDefault(t => t.BundleContributerType == bundleContributer); + var bundleContributor = bundleContributors[0]; + var definition = bundleDefinitions.SingleOrDefault(t => t.BundleContributorType == bundleContributor); if (definition != null) { if (definition.Level < level) @@ -197,7 +249,7 @@ namespace Volo.Abp.Cli.Bundling bundleDefinitions.Add(new BundleTypeDefinition { Level = level, - BundleContributerType = bundleContributer + BundleContributorType = bundleContributor }); } } @@ -210,7 +262,7 @@ namespace Volo.Abp.Cli.Bundling { foreach (var dependedModuleType in descriptor.GetDependedTypes()) { - FindBundleContributersRecursively(dependedModuleType, level + 1, bundleDefinitions); + FindBundleContributorsRecursively(dependedModuleType, level + 1, bundleDefinitions); } } } @@ -223,28 +275,18 @@ namespace Volo.Abp.Cli.Bundling .SingleOrDefault(AbpModule.IsAbpModule); } - private string GetFrameworkFolderPath(string projectDirectory, string frameworkVersion) - { - return Path.Combine(projectDirectory, "bin", "Debug", frameworkVersion, "wwwroot", "_framework"); ; - } - private string GetTargetFrameworkVersion(string projectFilePath) { var document = new XmlDocument(); document.Load(projectFilePath); var sdk = document.DocumentElement.GetAttribute("Sdk"); - if (sdk != SupportedWebAssemblyProjectType) + if (sdk != BundlingConsts.SupportedWebAssemblyProjectType) { - throw new BundlingException($"Unsupported project type. Project type must be {SupportedWebAssemblyProjectType}."); + throw new BundlingException( + $"Unsupported project type. Project type must be {BundlingConsts.SupportedWebAssemblyProjectType}."); } return document.SelectSingleNode("//TargetFramework").InnerText; } - - private string GetAssemblyFilePath(string directory, string frameworkVersion, string projectFileName) - { - var outputDirectory = GetFrameworkFolderPath(directory, frameworkVersion); - return Path.Combine(outputDirectory, projectFileName + ".dll"); - } } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/IBundler.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/IBundler.cs new file mode 100644 index 0000000000..a29de9f72f --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/IBundler.cs @@ -0,0 +1,9 @@ +using Volo.Abp.Bundling; + +namespace Volo.Abp.Cli.Bundling +{ + public interface IBundler + { + string Bundle(BundleOptions options, BundleContext context); + } +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/PathHelper.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/PathHelper.cs new file mode 100644 index 0000000000..6ed6799714 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/PathHelper.cs @@ -0,0 +1,23 @@ +using System.IO; + +namespace Volo.Abp.Cli.Bundling +{ + internal static class PathHelper + { + internal static string GetFrameworkFolderPath(string projectDirectory, string frameworkVersion) + { + return Path.Combine(projectDirectory, "bin", "Debug", frameworkVersion, "wwwroot", "_framework"); ; + } + + internal static string GetAssemblyFilePath(string directory, string frameworkVersion, string projectFileName) + { + var outputDirectory = GetFrameworkFolderPath(directory, frameworkVersion); + return Path.Combine(outputDirectory, projectFileName + ".dll"); + } + + internal static string GetWwwRootPath(string directory) + { + return Path.Combine(directory, "wwwroot"); + } + } +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Scripts/IScriptBundler.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Scripts/IScriptBundler.cs new file mode 100644 index 0000000000..fbe8bb5e59 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Scripts/IScriptBundler.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Volo.Abp.Cli.Bundling.Scripts +{ + public interface IScriptBundler : IBundler + { + } +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Scripts/ScriptBundler.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Scripts/ScriptBundler.cs new file mode 100644 index 0000000000..32b8e2e863 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Scripts/ScriptBundler.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Volo.Abp.Bundling; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Minify.Scripts; + +namespace Volo.Abp.Cli.Bundling.Scripts +{ + public class ScriptBundler : BundlerBase, IScriptBundler, ITransientDependency + { + public override string FileExtension => ".js"; + + public ScriptBundler(IJavascriptMinifier minifier) + : base(minifier) + { + } + + public override string GenerateDefinition(string bundleFilePath, + List bundleDefinitionsExcludingFromBundle) + { + var lastModifiedTicks = File.GetLastWriteTime(bundleFilePath).Ticks; + var builder = new StringBuilder(); + builder.AppendLine($"{BundlingConsts.ScriptPlaceholderStart}"); + builder.AppendLine( + $" "); + + foreach (var bundleDefinition in bundleDefinitionsExcludingFromBundle) + { + builder.Append($" "); + } + + builder.Append($" {BundlingConsts.ScriptPlaceholderEnd}"); + return builder.ToString(); + } + + protected override string ProcessBeforeAddingToTheBundle(string referencePath, string bundleDirectory, + string fileContent) + { + return fileContent.EnsureEndsWith(';') + Environment.NewLine; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Styles/CssRelativePathAdjuster.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Styles/CssRelativePathAdjuster.cs new file mode 100644 index 0000000000..05aba2f40a --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Styles/CssRelativePathAdjuster.cs @@ -0,0 +1,77 @@ +using System; +using System.IO; +using System.Text.RegularExpressions; + +namespace Volo.Abp.Cli.Bundling.Styles +{ + internal static class CssRelativePathAdjuster + { + private static readonly Regex _rxUrl = new Regex(@"url\s*\(\s*([""']?)([^:)]+)\1\s*\)", RegexOptions.IgnoreCase | RegexOptions.Compiled); + + public static string Adjust( + string cssFileContents, + string absoluteInputFilePath, + string absoluteOutputPath) + { + var matches = _rxUrl.Matches(cssFileContents); + + if (matches.Count <= 0) + { + return cssFileContents; + } + + var cssDirectoryPath = Path.GetDirectoryName(absoluteInputFilePath); + + foreach (Match match in matches) + { + string quoteDelimiter = match.Groups[1].Value; //url('') vs url("") + string relativePathToCss = match.Groups[2].Value; + + // Ignore root relative references + if (relativePathToCss.StartsWith("/", StringComparison.Ordinal)) + continue; + + //prevent query string from causing error + var pathAndQuery = relativePathToCss.Split(new[] { '?' }, 2, StringSplitOptions.RemoveEmptyEntries); + var pathOnly = pathAndQuery[0]; + var queryOnly = pathAndQuery.Length == 2 ? pathAndQuery[1] : string.Empty; + + string absolutePath = GetAbsolutePath(cssDirectoryPath, pathOnly); + string serverRelativeUrl = MakeRelative(absoluteOutputPath, absolutePath); + + if (!string.IsNullOrEmpty(queryOnly)) + serverRelativeUrl += "?" + queryOnly; + + string replace = string.Format("url({0}{1}{0})", quoteDelimiter, serverRelativeUrl); + + cssFileContents = cssFileContents.Replace(match.Groups[0].Value, replace); + } + + return cssFileContents; + } + + private static string GetAbsolutePath(string cssFilePath, string pathOnly) + { + return Path.GetFullPath(Path.Combine(cssFilePath, pathOnly)); + } + + private static readonly string _protocol = "file:///"; + private static string MakeRelative(string baseFile, string file) + { + if (string.IsNullOrEmpty(file)) + return file; + + Uri baseUri = new Uri(_protocol + baseFile, UriKind.RelativeOrAbsolute); + Uri fileUri = new Uri(_protocol + file, UriKind.RelativeOrAbsolute); + + if (baseUri.IsAbsoluteUri) + { + return Uri.UnescapeDataString(baseUri.MakeRelativeUri(fileUri).ToString()); + } + else + { + return baseUri.ToString(); + } + } + } +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Styles/IStyleBundler.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Styles/IStyleBundler.cs new file mode 100644 index 0000000000..d2b99bf093 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Styles/IStyleBundler.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Volo.Abp.Cli.Bundling.Styles +{ + public interface IStyleBundler : IBundler + { + } +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Styles/StyleBundler.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Styles/StyleBundler.cs new file mode 100644 index 0000000000..c566aa6ae7 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Bundling/Styles/StyleBundler.cs @@ -0,0 +1,54 @@ +using System.Collections.Generic; +using System.IO; +using System.Text; +using Volo.Abp.Bundling; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Minify.Styles; + +namespace Volo.Abp.Cli.Bundling.Styles +{ + public class StyleBundler : BundlerBase, IStyleBundler, ITransientDependency + { + public override string FileExtension => ".css"; + + public StyleBundler(ICssMinifier minifier) + : base(minifier) + { + } + + public override string GenerateDefinition(string bundleFilePath, + List bundleDefinitionsExcludingFromBundle) + { + var lastModifiedTicks = File.GetLastWriteTime(bundleFilePath).Ticks; + var builder = new StringBuilder(); + builder.AppendLine($"{BundlingConsts.StylePlaceholderStart}"); + builder.AppendLine( + $" "); + + foreach (var bundleDefinition in bundleDefinitionsExcludingFromBundle) + { + builder.Append($" "); + } + + builder.Append($" {BundlingConsts.StylePlaceholderEnd}"); + return builder.ToString(); + } + + protected override string ProcessBeforeAddingToTheBundle(string referencePath, string bundleDirectory, + string fileContent) + { + return CssRelativePathAdjuster.Adjust( + fileContent, + referencePath, + bundleDirectory + ); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BundleCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BundleCommand.cs index eaf0b33116..266e2f6a72 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BundleCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BundleCommand.cs @@ -27,6 +27,7 @@ namespace Volo.Abp.Cli.Commands var forceBuild = commandLineArgs.Options.ContainsKey(Options.ForceBuild.Short) || commandLineArgs.Options.ContainsKey(Options.ForceBuild.Long); + if (!Directory.Exists(workingDirectory)) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs index 32bc6671bf..12810aebb9 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/LoginCommand.cs @@ -2,11 +2,15 @@ using Microsoft.Extensions.Logging.Abstractions; using System; using System.Text; +using System.Text.Json; using System.Threading.Tasks; using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Auth; +using Volo.Abp.Cli.Http; +using Volo.Abp.Cli.ProjectBuilding; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; +using Volo.Abp.Threading; namespace Volo.Abp.Cli.Commands { @@ -15,10 +19,16 @@ namespace Volo.Abp.Cli.Commands public ILogger Logger { get; set; } protected AuthService AuthService { get; } + public ICancellationTokenProvider CancellationTokenProvider { get; } + public IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; } - public LoginCommand(AuthService authService) + public LoginCommand(AuthService authService, + ICancellationTokenProvider cancellationTokenProvider, + IRemoteServiceExceptionHandler remoteServiceExceptionHandler) { AuthService = authService; + CancellationTokenProvider = cancellationTokenProvider; + RemoteServiceExceptionHandler = remoteServiceExceptionHandler; Logger = NullLogger.Instance; } @@ -33,6 +43,14 @@ namespace Volo.Abp.Cli.Commands ); } + var organization = commandLineArgs.Options.GetOrNull(Options.Organization.Short, Options.Organization.Long); + + if (string.IsNullOrWhiteSpace(organization) && await CheckMultipleOrganizationsAsync(commandLineArgs.Target)) + { + Logger.LogError($"You have multiple organizations, please specify your organization with `--organization` parameter."); + return; + } + var password = commandLineArgs.Options.GetOrNull(Options.Password.Short, Options.Password.Long); if (password == null) { @@ -51,12 +69,33 @@ namespace Volo.Abp.Cli.Commands await AuthService.LoginAsync( commandLineArgs.Target, password, - commandLineArgs.Options.GetOrNull(Options.Organization.Short, Options.Organization.Long) + organization ); Logger.LogInformation($"Successfully logged in as '{commandLineArgs.Target}'"); } + private async Task CheckMultipleOrganizationsAsync(string username) + { + var url = $"{CliUrls.WwwAbpIo}api/license/check-multiple-organizations?username={username}"; + + using (var client = new CliHttpClient()) + { + using (var response = await client.GetHttpResponseMessageWithRetryAsync(url, CancellationTokenProvider.Token, Logger)) + { + if (!response.IsSuccessStatusCode) + { + throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'"); + } + + await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response); + + var responseContent = await response.Content.ReadAsStringAsync(); + return JsonSerializer.Deserialize(responseContent); + } + } + } + public string GetUsageInfo() { var sb = new StringBuilder(); @@ -96,4 +135,4 @@ namespace Volo.Abp.Cli.Commands } } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs index 259a1eacf8..75d2651cbc 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs @@ -1,17 +1,24 @@ using System; +using System.Diagnostics; using System.IO; +using System.Runtime.InteropServices; using System.Text; +using System.Text.Json; using System.Threading.Tasks; using ICSharpCode.SharpZipLib.Core; using ICSharpCode.SharpZipLib.Zip; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Cli.Args; +using Volo.Abp.Cli.Auth; +using Volo.Abp.Cli.Http; using Volo.Abp.Cli.ProjectBuilding; using Volo.Abp.Cli.ProjectBuilding.Building; +using Volo.Abp.Cli.ProjectBuilding.Templates.App; using Volo.Abp.Cli.ProjectBuilding.Templates.Console; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; +using Volo.Abp.Threading; namespace Volo.Abp.Cli.Commands { @@ -20,10 +27,13 @@ namespace Volo.Abp.Cli.Commands public ILogger Logger { get; set; } protected TemplateProjectBuilder TemplateProjectBuilder { get; } + public ITemplateInfoProvider TemplateInfoProvider { get; } - public NewCommand(TemplateProjectBuilder templateProjectBuilder) + public NewCommand(TemplateProjectBuilder templateProjectBuilder + , ITemplateInfoProvider templateInfoProvider) { TemplateProjectBuilder = templateProjectBuilder; + TemplateInfoProvider = templateInfoProvider; Logger = NullLogger.Instance; } @@ -187,6 +197,35 @@ namespace Volo.Abp.Cli.Commands } Logger.LogInformation($"'{projectName}' has been successfully created to '{outputFolder}'"); + + if (AppTemplateBase.IsAppTemplate(template ?? (await TemplateInfoProvider.GetDefaultAsync()).Name)) + { + var isCommercial = template == AppProTemplate.TemplateName; + OpenThanksPage(uiFramework, databaseProvider, isTiered || commandLineArgs.Options.ContainsKey("separate-identity-server"), isCommercial); + } + } + + private void OpenThanksPage(UiFramework uiFramework, DatabaseProvider databaseProvider, bool tiered, bool commercial) + { + uiFramework = uiFramework == UiFramework.NotSpecified || uiFramework == UiFramework.None ? UiFramework.Mvc : uiFramework; + + var urlPrefix = commercial ? "commercial" : "www"; + var tieredYesNo = tiered ? "yes" : "no"; + var url = $"https://{urlPrefix}.abp.io/project-created-success?ui={uiFramework:g}&db={databaseProvider:g}&tiered={tieredYesNo}"; + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + url = url.Replace("&", "^&"); + Process.Start(new ProcessStartInfo("cmd", $"/c start {url}") { CreateNoWindow = true }); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + Process.Start("xdg-open", url); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + Process.Start("open", url); + } } private bool GetCreateSolutionFolderPreference(CommandLineArgs commandLineArgs) @@ -195,7 +234,7 @@ namespace Volo.Abp.Cli.Commands if (longKey == false) { - return commandLineArgs.Options.ContainsKey(Options.CreateSolutionFolder.Short); + return commandLineArgs.Options.ContainsKey(Options.CreateSolutionFolder.Short); } return longKey; @@ -230,7 +269,7 @@ namespace Volo.Abp.Cli.Commands sb.AppendLine("-cs|--connection-string (your database connection string)"); sb.AppendLine("--tiered (if supported by the template)"); sb.AppendLine("--no-ui (if supported by the template)"); - sb.AppendLine("----no-random-port (Use template's default ports)"); + sb.AppendLine("--no-random-port (Use template's default ports)"); sb.AppendLine("--separate-identity-server (if supported by the template)"); sb.AppendLine("--local-framework-ref --abp-path (keeps local references to projects instead of replacing with NuGet package references)"); sb.AppendLine(""); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs index f614fbdd24..612f3b7234 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs @@ -31,7 +31,10 @@ namespace Volo.Abp.Cli.Commands { var operationType = NamespaceHelper.NormalizeNamespace(commandLineArgs.Target); - var preview = commandLineArgs.Options.ContainsKey(Options.Preview.Long); + var preview = commandLineArgs.Options.ContainsKey(Options.Preview.Short) || + commandLineArgs.Options.ContainsKey(Options.Preview.Long); + + var version = commandLineArgs.Options.GetOrNull(Options.Version.Short, Options.Version.Long); switch (operationType) { @@ -42,11 +45,11 @@ namespace Volo.Abp.Cli.Commands break; case "install": - await InstallSuiteAsync(preview); + await InstallSuiteAsync(version, preview); break; case "update": - await UpdateSuiteAsync(preview); + await UpdateSuiteAsync(version, preview); break; case "remove": @@ -70,7 +73,8 @@ namespace Volo.Abp.Cli.Commands { var dotnetToolList = CmdHelper.RunCmdAndGetOutput("dotnet tool list -g"); - var suiteLine = dotnetToolList.Split(Environment.NewLine).FirstOrDefault(l => l.ToLower().StartsWith("volo.abp.suite ")); + var suiteLine = dotnetToolList.Split(Environment.NewLine) + .FirstOrDefault(l => l.ToLower().StartsWith("volo.abp.suite ")); if (string.IsNullOrEmpty(suiteLine)) { @@ -80,9 +84,23 @@ namespace Volo.Abp.Cli.Commands return suiteLine.Split(" ", StringSplitOptions.RemoveEmptyEntries)[1]; } - private async Task InstallSuiteAsync(bool preview = false) + private async Task InstallSuiteAsync(string version = null, bool preview = false) { - Logger.LogInformation("Installing ABP Suite..."); + var infoText = "Installing ABP Suite "; + if (version != null) + { + infoText += "v" + version + "... "; + } + else if (preview) + { + infoText += "latest preview version..."; + } + else + { + infoText += "latest version..."; + } + + Logger.LogInformation(infoText); var nugetIndexUrl = await _nuGetIndexUrlService.GetAsync(); @@ -93,9 +111,25 @@ namespace Volo.Abp.Cli.Commands try { - var versionOption = await GetVersionOption(preview); + var versionOption = string.Empty; + + if (preview) + { + var latestPreviewVersion = await GetLatestPreviewVersion(); + if (latestPreviewVersion != null) + { + versionOption = $" --version {latestPreviewVersion}"; + Logger.LogInformation("Latest preview version is " + latestPreviewVersion); + } + } + else if (version != null) + { + versionOption = $" --version {version}"; + } - var result = CmdHelper.RunCmd($"dotnet tool install {SuitePackageName} {versionOption} --add-source {nugetIndexUrl} -g"); + var result = CmdHelper.RunCmd( + $"dotnet tool install {SuitePackageName}{versionOption} --add-source {nugetIndexUrl} -g" + ); if (result == 0) { @@ -117,25 +151,55 @@ namespace Volo.Abp.Cli.Commands private void ShowSuiteManualInstallCommand() { Logger.LogInformation("You can also run the following command to install ABP Suite."); - Logger.LogInformation("dotnet tool install -g Volo.Abp.Suite"); + Logger.LogInformation("dotnet tool install -g Volo.Abp.Suite --add-source https://nuget.abp.io//v3/index.json"); } - private async Task UpdateSuiteAsync(bool preview = false) + private async Task UpdateSuiteAsync(string version = null, bool preview = false) { - Logger.LogInformation("Updating ABP Suite..."); + var infoText = "Updating ABP Suite "; + if (version != null) + { + infoText += "to the " + version + "... "; + } + else if (preview) + { + infoText += "to the latest preview version..."; + } + else + { + infoText += "..."; + } - var nugetIndexUrl = await _nuGetIndexUrlService.GetAsync(); + Logger.LogInformation(infoText); + var nugetIndexUrl = await _nuGetIndexUrlService.GetAsync(); if (nugetIndexUrl == null) { + Logger.LogError("Cannot find your NuGet service URL!"); return; } try { - var versionOption = await GetVersionOption(preview); + var versionOption = string.Empty; - var result = CmdHelper.RunCmd($"dotnet tool update {SuitePackageName} {versionOption} --add-source {nugetIndexUrl} -g"); + if (preview) + { + var latestPreviewVersion = await GetLatestPreviewVersion(); + if (latestPreviewVersion != null) + { + versionOption = $" --version {latestPreviewVersion}"; + Logger.LogInformation("Latest preview version is " + latestPreviewVersion); + } + } + else if (version != null) + { + versionOption = $" --version {version}"; + } + + var result = CmdHelper.RunCmd( + $"dotnet tool update {SuitePackageName}{versionOption} --add-source {nugetIndexUrl} -g" + ); if (result != 0) { @@ -149,29 +213,21 @@ namespace Volo.Abp.Cli.Commands } } - private async Task GetVersionOption(bool preview) + private async Task GetLatestPreviewVersion() { - if (preview) - { - var latestVersion = await GetLatestSuiteVersionAsync(true); - if (latestVersion.IsPrerelease) - { - return $"--version {latestVersion.ToString()}"; - } - } + var latestPreviewVersion = await _nuGetService + .GetLatestVersionOrNullAsync( + packageId: SuitePackageName, + includeReleaseCandidates: true + ); - return ""; - } - - private async Task GetLatestSuiteVersionAsync(bool preview) - { - return await _nuGetService.GetLatestVersionOrNullAsync(SuitePackageName, includeReleaseCandidates: preview); + return latestPreviewVersion.IsPrerelease ? latestPreviewVersion.ToString() : null; } private void ShowSuiteManualUpdateCommand() { Logger.LogError("You can also run the following command to update ABP Suite."); - Logger.LogError("dotnet tool update -g Volo.Abp.Suite"); + Logger.LogError("dotnet tool update -g Volo.Abp.Suite --add-source https://nuget.abp.io//v3/index.json"); } private static void RemoveSuite() @@ -185,7 +241,8 @@ namespace Volo.Abp.Cli.Commands { if (!GlobalToolHelper.IsGlobalToolInstalled("abp-suite")) { - Logger.LogWarning("ABP Suite is not installed! To install it you can run the command: \"abp suite install\""); + Logger.LogWarning( + "ABP Suite is not installed! To install it you can run the command: \"abp suite install\""); return; } } @@ -236,7 +293,14 @@ namespace Volo.Abp.Cli.Commands public static class Preview { public const string Long = "preview"; + public const string Short = "p"; + } + + public static class Version + { + public const string Long = "version"; + public const string Short = "v"; } } } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/UpdateCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/UpdateCommand.cs index 5fd30115e2..3173744bd0 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/UpdateCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/UpdateCommand.cs @@ -34,24 +34,25 @@ namespace Volo.Abp.Cli.Commands var directory = commandLineArgs.Options.GetOrNull(Options.SolutionPath.Short, Options.SolutionPath.Long) ?? Directory.GetCurrentDirectory(); + var version = commandLineArgs.Options.GetOrNull(Options.Version.Short, Options.Version.Long); if (updateNuget || !updateNpm) { - await UpdateNugetPackages(commandLineArgs, directory); + await UpdateNugetPackages(commandLineArgs, directory, version); } if (updateNpm || !updateNuget) { - await UpdateNpmPackages(directory); + await UpdateNpmPackages(directory, version); } } - private async Task UpdateNpmPackages(string directory) + private async Task UpdateNpmPackages(string directory, string version) { - await _npmPackagesUpdater.Update(directory); + await _npmPackagesUpdater.Update(directory, version: version); } - private async Task UpdateNugetPackages(CommandLineArgs commandLineArgs, string directory) + private async Task UpdateNugetPackages(CommandLineArgs commandLineArgs, string directory, string version) { var solution = commandLineArgs.Options.GetOrNull(Options.SolutionName.Short, Options.SolutionName.Long); @@ -66,7 +67,7 @@ namespace Volo.Abp.Cli.Commands { var solutionName = Path.GetFileName(solution).RemovePostFix(".sln"); - await _nugetPackagesVersionUpdater.UpdateSolutionAsync(solution, checkAll: checkAll); + await _nugetPackagesVersionUpdater.UpdateSolutionAsync(solution, checkAll: checkAll, version: version); Logger.LogInformation($"Volo packages are updated in {solutionName} solution."); return; @@ -78,7 +79,7 @@ namespace Volo.Abp.Cli.Commands { var projectName = Path.GetFileName(project).RemovePostFix(".csproj"); - await _nugetPackagesVersionUpdater.UpdateProjectAsync(project, checkAll: checkAll); + await _nugetPackagesVersionUpdater.UpdateProjectAsync(project, checkAll: checkAll, version: version); Logger.LogInformation($"Volo packages are updated in {projectName} project."); return; @@ -107,6 +108,7 @@ namespace Volo.Abp.Cli.Commands sb.AppendLine("-sp|--solution-path (Specify the solution path)"); sb.AppendLine("-sn|--solution-name (Specify the solution name)"); sb.AppendLine("--check-all (Check the new version of each package separately)"); + sb.AppendLine("-v|--version (default: latest version)"); sb.AppendLine(""); sb.AppendLine("Some examples:"); sb.AppendLine(""); @@ -148,6 +150,12 @@ namespace Volo.Abp.Cli.Commands { public const string Long = "check-all"; } + + public static class Version + { + public const string Short = "v"; + public const string Long = "version"; + } } } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/AbpCliConfig.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/AbpCliConfig.cs new file mode 100644 index 0000000000..e71f54c097 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/AbpCliConfig.cs @@ -0,0 +1,9 @@ +using Volo.Abp.Cli.Bundling; + +namespace Volo.Abp.Cli.Configuration +{ + public class AbpCliConfig + { + public BundleConfig Bundle { get; set; } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/ConfigReader.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/ConfigReader.cs new file mode 100644 index 0000000000..baf1fc79dc --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/ConfigReader.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Cli.Configuration +{ + public class ConfigReader : IConfigReader, ITransientDependency + { + const string appSettingFileName = "appsettings.json"; + + public AbpCliConfig Read(string directory) + { + var settingsFilePath = Path.Combine(directory, appSettingFileName); + + if (!File.Exists(settingsFilePath)) + { + throw new FileNotFoundException($"appsettings file could not be found. Path:{settingsFilePath}"); + } + + var settingsFileContent = File.ReadAllText(settingsFilePath); + + var documentOptions = new JsonDocumentOptions + { + CommentHandling = JsonCommentHandling.Skip + }; + + using (var document = JsonDocument.Parse(settingsFileContent,documentOptions)) + { + var element = document.RootElement.GetProperty("AbpCli"); + var configText = element.GetRawText(); + var options = new JsonSerializerOptions + { + Converters = + { + new JsonStringEnumConverter() + }, + ReadCommentHandling = JsonCommentHandling.Skip + }; + + return JsonSerializer.Deserialize(configText, options); + } + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/IConfigReader.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/IConfigReader.cs new file mode 100644 index 0000000000..ed97dbe11f --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Configuration/IConfigReader.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.Cli.Configuration +{ + public interface IConfigReader + { + AbpCliConfig Read(string directory); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClient.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClient.cs index 3712d0be13..d853067abf 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClient.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClient.cs @@ -67,10 +67,7 @@ namespace Volo.Abp.Cli.Http }; } - if (!cancellationToken.HasValue) - { - cancellationToken = CancellationToken.None; - } + cancellationToken ??= CancellationToken.None; return await HttpPolicyExtensions .HandleTransientHttpError() diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs index 33a2e10fdf..2aeb8ed90a 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Licensing/AbpIoApiKeyService.cs @@ -59,22 +59,18 @@ namespace Volo.Abp.Cli.Licensing using (var client = new CliHttpClient()) { - var response = await client.GetHttpResponseMessageWithRetryAsync( - url: url, - cancellationToken: CancellationTokenProvider.Token, - logger: _logger); - - if (!response.IsSuccessStatusCode) + using (var response = await client.GetHttpResponseMessageWithRetryAsync(url, CancellationTokenProvider.Token, _logger)) { - throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'"); - } + if (!response.IsSuccessStatusCode) + { + throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'"); + } - await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response); + await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response); - var responseContent = await response.Content.ReadAsStringAsync(); - var apiKeyResult = JsonSerializer.Deserialize(responseContent); - - return apiKeyResult; + var responseContent = await response.Content.ReadAsStringAsync(); + return JsonSerializer.Deserialize(responseContent); + } } } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/NuGetService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/NuGetService.cs index 1ecfc9e34d..057ffcc02d 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/NuGetService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/NuGetService.cs @@ -40,13 +40,43 @@ namespace Volo.Abp.Cli.NuGet } public async Task GetLatestVersionOrNullAsync(string packageId, bool includeNightly = false, bool includeReleaseCandidates = false) + { + var versionList = await GetPackageVersionListAsync(packageId, includeNightly, includeReleaseCandidates); + + List versions; + + if (!includeNightly && !includeReleaseCandidates) + { + versions = versionList + .Select(SemanticVersion.Parse) + .OrderByDescending(v => v, new VersionComparer()).ToList(); + + versions = versions.Where(x => !x.IsPrerelease).ToList(); + } + else if (!includeNightly && includeReleaseCandidates) + { + versions = versionList + .Where(v => !v.Contains("-preview")) + .Select(SemanticVersion.Parse) + .OrderByDescending(v => v, new VersionComparer()).ToList(); + } + else + { + versions = versionList + .Select(SemanticVersion.Parse) + .OrderByDescending(v => v, new VersionComparer()).ToList(); + } + + return versions.Any() ? versions.Max() : null; + + } + + public async Task> GetPackageVersionListAsync(string packageId, bool includeNightly = false, + bool includeReleaseCandidates = false) { if (AuthService.IsLoggedIn()) { - if (_proPackageList == null) - { - _proPackageList = await GetProPackageListAsync(); - } + _proPackageList ??= await GetProPackageListAsync(); } string url; @@ -65,47 +95,16 @@ namespace Volo.Abp.Cli.NuGet using (var client = new CliHttpClient(setBearerToken: false)) { - var responseMessage = await client.GetHttpResponseMessageWithRetryAsync( + using (var responseMessage = await client.GetHttpResponseMessageWithRetryAsync( url, cancellationToken: CancellationTokenProvider.Token, logger: Logger - ); - - await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage); - - var responseContent = await responseMessage.Content.ReadAsStringAsync(); - - List versions; - - if (!includeNightly && !includeReleaseCandidates) - { - versions = JsonSerializer - .Deserialize(responseContent) - .Versions - .Select(SemanticVersion.Parse) - .OrderByDescending(v=> v, new VersionComparer()).ToList(); - - versions = versions.Where(x => !x.IsPrerelease).ToList(); - } - else if (!includeNightly && includeReleaseCandidates) + )) { - versions = JsonSerializer - .Deserialize(responseContent) - .Versions - .Where(v=> !v.Contains("-preview")) - .Select(SemanticVersion.Parse) - .OrderByDescending(v=> v, new VersionComparer()).ToList(); + await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage); + var responseContent = await responseMessage.Content.ReadAsStringAsync(); + return JsonSerializer.Deserialize(responseContent).Versions; } - else - { - versions = JsonSerializer - .Deserialize(responseContent) - .Versions - .Select(SemanticVersion.Parse) - .OrderByDescending(v=> v, new VersionComparer()).ToList(); - } - - return versions.Any() ? versions.Max() : null; } } @@ -125,27 +124,28 @@ namespace Volo.Abp.Cli.NuGet var url = $"{CliUrls.WwwAbpIo}api/app/nugetPackage/proPackageNames"; - var responseMessage = await client.GetHttpResponseMessageWithRetryAsync( + using (var responseMessage = await client.GetHttpResponseMessageWithRetryAsync( url: url, cancellationToken: CancellationTokenProvider.Token, logger: Logger - ); - - if (responseMessage.IsSuccessStatusCode) + )) { - return JsonSerializer.Deserialize>(await responseMessage.Content.ReadAsStringAsync()); - } + if (responseMessage.IsSuccessStatusCode) + { + return JsonSerializer.Deserialize>(await responseMessage.Content.ReadAsStringAsync()); + } - var exceptionMessage = "Remote server returns '" + (int)responseMessage.StatusCode + "-" + responseMessage.ReasonPhrase + "'. "; - var remoteServiceErrorMessage = await RemoteServiceExceptionHandler.GetAbpRemoteServiceErrorAsync(responseMessage); + var exceptionMessage = "Remote server returns '" + (int)responseMessage.StatusCode + "-" + responseMessage.ReasonPhrase + "'. "; + var remoteServiceErrorMessage = await RemoteServiceExceptionHandler.GetAbpRemoteServiceErrorAsync(responseMessage); - if (remoteServiceErrorMessage != null) - { - exceptionMessage += remoteServiceErrorMessage; - } + if (remoteServiceErrorMessage != null) + { + exceptionMessage += remoteServiceErrorMessage; + } - Logger.LogError(exceptionMessage); - return null; + Logger.LogError(exceptionMessage); + return null; + } } public class NuGetVersionResultDto @@ -154,4 +154,4 @@ namespace Volo.Abp.Cli.NuGet public List Versions { get; set; } } } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ITemplateInfoProvider.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ITemplateInfoProvider.cs index 5330bc9962..55db4cd11a 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ITemplateInfoProvider.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ITemplateInfoProvider.cs @@ -1,10 +1,11 @@ -using Volo.Abp.Cli.ProjectBuilding.Building; +using System.Threading.Tasks; +using Volo.Abp.Cli.ProjectBuilding.Building; namespace Volo.Abp.Cli.ProjectBuilding { public interface ITemplateInfoProvider { - TemplateInfo GetDefault(); + Task GetDefaultAsync(); TemplateInfo Get(string name); } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs index 7a4df335fe..2aefcfd1a9 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs @@ -1,18 +1,44 @@ using System; +using System.Text.Json; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.Cli.Auth; +using Volo.Abp.Cli.Http; using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Templates.App; using Volo.Abp.Cli.ProjectBuilding.Templates.Console; using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule; using Volo.Abp.Cli.ProjectBuilding.Templates.Wpf; using Volo.Abp.DependencyInjection; +using Volo.Abp.Threading; namespace Volo.Abp.Cli.ProjectBuilding { public class TemplateInfoProvider : ITemplateInfoProvider, ITransientDependency { - public TemplateInfo GetDefault() + public ILogger Logger { get; set; } + + public ICancellationTokenProvider CancellationTokenProvider { get; } + public IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; } + public AuthService AuthService { get; } + + public TemplateInfoProvider(ICancellationTokenProvider cancellationTokenProvider, + IRemoteServiceExceptionHandler remoteServiceExceptionHandler, + AuthService authService) { - return Get(AppTemplate.TemplateName); + CancellationTokenProvider = cancellationTokenProvider; + RemoteServiceExceptionHandler = remoteServiceExceptionHandler; + AuthService = authService; + + Logger = NullLogger.Instance; + } + + public async Task GetDefaultAsync() + { + var defaultTemplateName = await CheckProLicenseAsync() ? AppProTemplate.TemplateName : AppTemplate.TemplateName; + + return Get(defaultTemplateName); } public TemplateInfo Get(string name) @@ -35,5 +61,39 @@ namespace Volo.Abp.Cli.ProjectBuilding throw new Exception("There is no template found with given name: " + name); } } + + + private async Task CheckProLicenseAsync() + { + if (!AuthService.IsLoggedIn()) + { + return false; + } + + try + { + var url = $"{CliUrls.WwwAbpIo}api/license/check-user"; + + using (var client = new CliHttpClient()) + { + using (var response = await client.GetHttpResponseMessageWithRetryAsync(url, CancellationTokenProvider.Token, Logger)) + { + if (!response.IsSuccessStatusCode) + { + throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'"); + } + + await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response); + + var responseContent = await response.Content.ReadAsStringAsync(); + return JsonSerializer.Deserialize(responseContent); + } + } + } + catch (Exception) + { + return false; + } + } } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateProjectBuilder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateProjectBuilder.cs index 02b26eba39..cbbb094d11 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateProjectBuilder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateProjectBuilder.cs @@ -49,7 +49,7 @@ namespace Volo.Abp.Cli.ProjectBuilding public async Task BuildAsync(ProjectBuildArgs args) { - var templateInfo = GetTemplateInfo(args); + var templateInfo = await GetTemplateInfoAsync(args); NormalizeArgs(args, templateInfo); @@ -175,11 +175,11 @@ namespace Volo.Abp.Cli.ProjectBuilding } } - private TemplateInfo GetTemplateInfo(ProjectBuildArgs args) + private async Task GetTemplateInfoAsync(ProjectBuildArgs args) { if (args.TemplateName.IsNullOrWhiteSpace()) { - return TemplateInfoProvider.GetDefault(); + return await TemplateInfoProvider.GetDefaultAsync(); } else { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs index 00a42491fe..a598d3483c 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs @@ -161,6 +161,11 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App { steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds")); steps.Add(new AngularEnvironmentFilePortChangeForSeparatedIdentityServersStep()); + + if (context.BuildArgs.MobileApp == MobileApp.ReactNative) + { + steps.Add(new ReactEnvironmentFilePortChangeForSeparatedIdentityServersStep()); + } } else { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/ReactEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/ReactEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs new file mode 100644 index 0000000000..66741f92c9 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/ReactEnvironmentFilePortChangeForSeparatedIdentityServersStep.cs @@ -0,0 +1,44 @@ +using System; +using System.Linq; +using Volo.Abp.Cli.ProjectBuilding.Building; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates.App +{ + public class ReactEnvironmentFilePortChangeForSeparatedIdentityServersStep : ProjectBuildPipelineStep + { + public override void Execute(ProjectBuildContext context) + { + var fileEntry = context.Files.FirstOrDefault(x => + !x.IsDirectory && + x.Name.EndsWith($"{MobileApp.ReactNative.GetFolderName()}/Environment.js", + StringComparison.InvariantCultureIgnoreCase) + ); + + if (fileEntry == null) + { + return; + } + + fileEntry.NormalizeLineEndings(); + var lines = fileEntry.GetLines(); + + for (var i = 0; i < lines.Length; i++) + { + var line = lines[i]; + + if (line.Contains("issuer") && line.Contains("localhost")) + { + line = line.Replace("44305", "44301"); + } + else if (line.Contains("apiUrl") && line.Contains("localhost")) + { + line = line.Replace("44305", "44300"); + } + + lines[i] = line; + } + + fileEntry.SetLines(lines); + } + } +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs index c71e9591c0..d8571843fe 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/NpmPackagesUpdater.cs @@ -26,24 +26,20 @@ namespace Volo.Abp.Cli.ProjectModification private readonly PackageJsonFileFinder _packageJsonFileFinder; private readonly NpmGlobalPackagesChecker _npmGlobalPackagesChecker; - private readonly MyGetPackageListFinder _myGetPackageListFinder; private readonly Dictionary _fileVersionStorage = new Dictionary(); - private MyGetApiResponse _myGetApiResponse; public NpmPackagesUpdater( PackageJsonFileFinder packageJsonFileFinder, NpmGlobalPackagesChecker npmGlobalPackagesChecker, - MyGetPackageListFinder myGetPackageListFinder, ICancellationTokenProvider cancellationTokenProvider) { _packageJsonFileFinder = packageJsonFileFinder; _npmGlobalPackagesChecker = npmGlobalPackagesChecker; - _myGetPackageListFinder = myGetPackageListFinder; CancellationTokenProvider = cancellationTokenProvider; Logger = NullLogger.Instance; } - public async Task Update(string rootDirectory, bool includePreviews = false, bool includeReleaseCandidates = false, bool switchToStable = false) + public async Task Update(string rootDirectory, bool includePreviews = false, bool includeReleaseCandidates = false, bool switchToStable = false, string version = null) { var fileList = _packageJsonFileFinder.Find(rootDirectory); @@ -58,7 +54,7 @@ namespace Volo.Abp.Cli.ProjectModification async Task UpdateAsync(string file) { - var updated = await UpdatePackagesInFile(file, includePreviews,includeReleaseCandidates, switchToStable); + var updated = await UpdatePackagesInFile(file, includePreviews, includeReleaseCandidates, switchToStable, version); packagesUpdated.TryAdd(file, updated); } @@ -103,7 +99,7 @@ namespace Volo.Abp.Cli.ProjectModification private static async Task NpmrcFileExistAsync(string directoryName) { - return File.Exists(Path.Combine(directoryName, ".npmrc")); + return await Task.FromResult(File.Exists(Path.Combine(directoryName, ".npmrc"))); } private async Task CreateNpmrcFileAsync(string directoryName) @@ -157,18 +153,19 @@ namespace Volo.Abp.Cli.ProjectModification { using (var client = new CliHttpClient(TimeSpan.FromMinutes(1))) { - var response = await client.GetHttpResponseMessageWithRetryAsync( + using (var response = await client.GetHttpResponseMessageWithRetryAsync( url: $"{CliUrls.WwwAbpIo}api/myget/apikey/", cancellationToken: CancellationTokenProvider.Token, logger: Logger - ); - - return Encoding.Default.GetString(await response.Content.ReadAsByteArrayAsync()); + )) + { + return Encoding.Default.GetString(await response.Content.ReadAsByteArrayAsync()); + } } } catch (Exception) { - return ""; + return string.Empty; } } @@ -181,7 +178,8 @@ namespace Volo.Abp.Cli.ProjectModification string filePath, bool includePreviews = false, bool includeReleaseCandidates = false, - bool switchToStable = false) + bool switchToStable = false, + string specifiedVersion = null) { var packagesUpdated = false; var fileContent = File.ReadAllText(filePath); @@ -195,7 +193,7 @@ namespace Volo.Abp.Cli.ProjectModification foreach (var abpPackage in abpPackages) { - var updated = await TryUpdatingPackage(filePath, abpPackage, includePreviews, includeReleaseCandidates, switchToStable); + var updated = await TryUpdatingPackage(filePath, abpPackage, includePreviews, includeReleaseCandidates, switchToStable, specifiedVersion); if (updated) { @@ -215,27 +213,46 @@ namespace Volo.Abp.Cli.ProjectModification JProperty package, bool includePreviews = false, bool includeReleaseCandidates = false, - bool switchToStable = false) + bool switchToStable = false, + string specifiedVersion = null) { - var currentVersion = (string) package.Value; + var currentVersion = (string)package.Value; + + var version = string.Empty; - var version = ""; - if ((includePreviews || (!switchToStable && currentVersion.Contains("-preview"))) && !includeReleaseCandidates) + if (!specifiedVersion.IsNullOrWhiteSpace()) { - version = "preview"; + if (!SpecifiedVersionExists(specifiedVersion, package)) + { + return false; + } + + if (SemanticVersion.Parse(specifiedVersion) <= SemanticVersion.Parse(currentVersion.RemovePreFix("~", "^"))) + { + return false; + } + version = specifiedVersion.EnsureStartsWith('^'); } else { - if (!switchToStable && IsPrerelease(currentVersion)) + if ((includePreviews || (!switchToStable && (currentVersion != null && currentVersion.Contains("-preview")))) && !includeReleaseCandidates) { - version = await GetLatestVersion(package, true); + version = "preview"; } else { - version = await GetLatestVersion(package, includeReleaseCandidates); + if (!switchToStable && IsPrerelease(currentVersion)) + { + version = await GetLatestVersion(package, true); + } + else + { + version = await GetLatestVersion(package, includeReleaseCandidates); + } } } + if (string.IsNullOrEmpty(version) || version == currentVersion) { return false; @@ -258,18 +275,14 @@ namespace Volo.Abp.Cli.ProjectModification return version.Split("-", StringSplitOptions.RemoveEmptyEntries).Length > 1; } - protected virtual async Task GetLatestVersion( - JProperty package, - bool includeReleaseCandidates = false) + protected virtual async Task GetLatestVersion(JProperty package, bool includeReleaseCandidates = false) { if (_fileVersionStorage.ContainsKey(package.Name)) { - return _fileVersionStorage[package.Name]; + return await Task.FromResult(_fileVersionStorage[package.Name]); } - var versionListAsJson = CmdHelper.RunCmdAndGetOutput($"npm show {package.Name} versions"); - var versionList = JsonConvert.DeserializeObject(versionListAsJson) - .OrderByDescending(SemanticVersion.Parse, new VersionComparer()).ToList(); + var versionList = GetPackageVersionList(package); var newVersion = includeReleaseCandidates ? versionList.First() @@ -278,24 +291,24 @@ namespace Volo.Abp.Cli.ProjectModification if (string.IsNullOrEmpty(newVersion)) { _fileVersionStorage[package.Name] = newVersion; - return newVersion; + return await Task.FromResult(newVersion); } var newVersionWithPrefix = $"~{newVersion}"; _fileVersionStorage[package.Name] = newVersionWithPrefix; - return newVersionWithPrefix; + return await Task.FromResult(newVersionWithPrefix); } protected virtual List GetAbpPackagesFromPackageJson(JObject fileObject) { - var dependencyList = new[] {"dependencies", "devDependencies", "peerDependencies"}; + var dependencyList = new[] { "dependencies", "devDependencies", "peerDependencies" }; var abpPackages = new List(); foreach (var dependencyListName in dependencyList) { - var dependencies = (JObject) fileObject[dependencyListName]; + var dependencies = (JObject)fileObject[dependencyListName]; if (dependencies == null) { @@ -303,7 +316,9 @@ namespace Volo.Abp.Cli.ProjectModification } var properties = dependencies.Properties().ToList(); - abpPackages.AddRange(properties.Where(p => p.Name.StartsWith("@abp/") || p.Name.StartsWith("@volo/")) + + abpPackages + .AddRange(properties.Where(p => p.Name.StartsWith("@abp/") || p.Name.StartsWith("@volo/")) .ToList()); } @@ -327,5 +342,19 @@ namespace Volo.Abp.Cli.ProjectModification Logger.LogInformation($"Running npm install on {fileDirectory}"); CmdHelper.RunCmd($"cd {fileDirectory} && npm install"); } + + protected virtual List GetPackageVersionList(JProperty package) + { + var versionListAsJson = CmdHelper.RunCmdAndGetOutput($"npm show {package.Name} versions"); + return JsonConvert.DeserializeObject(versionListAsJson) + .OrderByDescending(SemanticVersion.Parse, new VersionComparer()).ToList(); + } + + protected virtual bool SpecifiedVersionExists(string version, JProperty package) + { + var versionList = GetPackageVersionList(package); + + return versionList.Any(v => v.Equals(version, StringComparison.OrdinalIgnoreCase)); + } } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs index de25b11da7..ee736f3aa0 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/ProjectNugetPackageAdder.cs @@ -7,6 +7,8 @@ using System.Threading.Tasks; using System.Xml; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.Cli.Args; +using Volo.Abp.Cli.Commands; using Volo.Abp.Cli.Http; using Volo.Abp.Cli.ProjectBuilding; using Volo.Abp.Cli.Utils; @@ -25,19 +27,22 @@ namespace Volo.Abp.Cli.ProjectModification protected DerivedClassFinder ModuleClassFinder { get; } protected ModuleClassDependcyAdder ModuleClassDependcyAdder { get; } protected IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; } + public BundleCommand BundleCommand { get; } public ProjectNugetPackageAdder( IJsonSerializer jsonSerializer, ProjectNpmPackageAdder npmPackageAdder, DerivedClassFinder moduleClassFinder, ModuleClassDependcyAdder moduleClassDependcyAdder, - IRemoteServiceExceptionHandler remoteServiceExceptionHandler) + IRemoteServiceExceptionHandler remoteServiceExceptionHandler, + BundleCommand bundleCommand) { JsonSerializer = jsonSerializer; NpmPackageAdder = npmPackageAdder; ModuleClassFinder = moduleClassFinder; ModuleClassDependcyAdder = moduleClassDependcyAdder; RemoteServiceExceptionHandler = remoteServiceExceptionHandler; + BundleCommand = bundleCommand; Logger = NullLogger.Instance; } @@ -50,14 +55,14 @@ namespace Volo.Abp.Cli.ProjectModification ); } - public Task AddAsync(string projectFile, NugetPackageInfo package, string version = null, + public async Task AddAsync(string projectFile, NugetPackageInfo package, string version = null, bool useDotnetCliToInstall = true) { var projectFileContent = File.ReadAllText(projectFile); if (projectFileContent.Contains($"\"{package.Name}\"")) { - return Task.CompletedTask; + return; } if (version == null) @@ -94,11 +99,14 @@ namespace Volo.Abp.Cli.ProjectModification } ModuleClassDependcyAdder.Add(moduleFiles.First(), package.ModuleClass); + } - Logger.LogInformation("Successfully installed."); + if (package.Target == NuGetPackageTarget.Blazor) + { + await RunBundleForBlazorAsync(projectFile); } - return Task.CompletedTask; + Logger.LogInformation("Successfully installed."); } private Task AddUsingDotnetCli(NugetPackageInfo package, string version = null) @@ -185,5 +193,15 @@ namespace Volo.Abp.Cli.ProjectModification return JsonSerializer.Deserialize(responseContent); } } + + protected virtual async Task RunBundleForBlazorAsync(string projectFile) + { + var args = new CommandLineArgs("bundle"); + + args.Options.Add(BundleCommand.Options.WorkingDirectory.Short, Path.GetDirectoryName(projectFile)); + args.Options.Add(BundleCommand.Options.ForceBuild.Short, string.Empty); + + await BundleCommand.ExecuteAsync(args); + } } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs index 4d90319c95..4eae8ace8f 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionModuleAdder.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Net; using System.Threading.Tasks; using Volo.Abp.Cli.Args; +using Volo.Abp.Cli.Bundling; using Volo.Abp.Cli.Commands; using Volo.Abp.Cli.Commands.Services; using Volo.Abp.Cli.Http; @@ -35,6 +36,7 @@ namespace Volo.Abp.Cli.ProjectModification public NugetPackageToLocalReferenceConverter NugetPackageToLocalReferenceConverter { get; } public AngularModuleSourceCodeAdder AngularModuleSourceCodeAdder { get; } public NewCommand NewCommand { get; } + public BundleCommand BundleCommand { get; } public SolutionModuleAdder( IJsonSerializer jsonSerializer, @@ -49,7 +51,8 @@ namespace Volo.Abp.Cli.ProjectModification SolutionFileModifier solutionFileModifier, NugetPackageToLocalReferenceConverter nugetPackageToLocalReferenceConverter, AngularModuleSourceCodeAdder angularModuleSourceCodeAdder, - NewCommand newCommand) + NewCommand newCommand, + BundleCommand bundleCommand) { JsonSerializer = jsonSerializer; ProjectNugetPackageAdder = projectNugetPackageAdder; @@ -64,6 +67,7 @@ namespace Volo.Abp.Cli.ProjectModification NugetPackageToLocalReferenceConverter = nugetPackageToLocalReferenceConverter; AngularModuleSourceCodeAdder = angularModuleSourceCodeAdder; NewCommand = newCommand; + BundleCommand = bundleCommand; Logger = NullLogger.Instance; } @@ -118,9 +122,28 @@ namespace Volo.Abp.Cli.ProjectModification await AddAngularPackages(solutionFile, module); } + await RunBundleForBlazorAsync(projectFiles, module); + ModifyDbContext(projectFiles, module, startupProject, skipDbMigrations); } + private async Task RunBundleForBlazorAsync(string[] projectFiles, ModuleWithMastersInfo module) + { + var blazorProject = projectFiles.FirstOrDefault(f => f.EndsWith(".Blazor.csproj")); + + if (blazorProject == null || !module.NugetPackages.Any(np=> np.Target == NuGetPackageTarget.Blazor)) + { + return; + } + + var args = new CommandLineArgs("bundle"); + + args.Options.Add(BundleCommand.Options.WorkingDirectory.Short, Path.GetDirectoryName(blazorProject)); + args.Options.Add(BundleCommand.Options.ForceBuild.Short, string.Empty); + + await BundleCommand.ExecuteAsync(args); + } + private async Task RemoveUnnecessaryProjectsAsync(string solutionDirectory, ModuleWithMastersInfo module, string[] projectFiles) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs index 275bf23c76..c499dd0ee0 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs @@ -25,11 +25,11 @@ namespace Volo.Abp.Cli.ProjectModification Logger = NullLogger.Instance; } - public async Task UpdateSolutionAsync(string solutionPath, bool includePreviews = false, bool includeReleaseCandidates = false, bool switchToStable = false, bool checkAll = false) + public async Task UpdateSolutionAsync(string solutionPath, bool includePreviews = false, bool includeReleaseCandidates = false, bool switchToStable = false, bool checkAll = false, string version = null) { var projectPaths = ProjectFinder.GetProjectFiles(solutionPath); - if (checkAll) + if (checkAll && version.IsNullOrWhiteSpace()) { Task.WaitAll(projectPaths.Select(projectPath => UpdateInternalAsync(projectPath, includePreviews, includeReleaseCandidates, switchToStable)).ToArray()); } @@ -48,7 +48,8 @@ namespace Volo.Abp.Cli.ProjectModification switchToStable, latestVersionFromNuget, latestReleaseCandidateVersionFromNuget, - latestVersionFromMyGet); + latestVersionFromMyGet, + version); File.WriteAllText(filePath, updatedContent); } @@ -57,9 +58,9 @@ namespace Volo.Abp.Cli.ProjectModification } } - public async Task UpdateProjectAsync(string projectPath, bool includeNightlyPreviews = false, bool includeReleaseCandidates = false, bool switchToStable = false, bool checkAll = false) + public async Task UpdateProjectAsync(string projectPath, bool includeNightlyPreviews = false, bool includeReleaseCandidates = false, bool switchToStable = false, bool checkAll = false, string version = null) { - if (checkAll) + if (checkAll && version.IsNullOrWhiteSpace()) { await UpdateInternalAsync(projectPath, includeNightlyPreviews, includeReleaseCandidates, switchToStable); } @@ -77,7 +78,8 @@ namespace Volo.Abp.Cli.ProjectModification switchToStable, latestVersionFromNuget, latestReleaseCandidateVersionFromNuget, - latestVersionFromMyGet); + latestVersionFromMyGet, + version); File.WriteAllText(projectPath, updatedContent); } @@ -91,13 +93,26 @@ namespace Volo.Abp.Cli.ProjectModification File.WriteAllText(projectPath, updatedContent); } + protected virtual async Task SpecifiedVersionExists(string version, string packageId) + { + var versionList = await _nuGetService.GetPackageVersionListAsync(packageId); + + if (versionList.All(v => !v.Equals(version, StringComparison.OrdinalIgnoreCase))) + { + versionList = await _nuGetService.GetPackageVersionListAsync(packageId, true); + } + + return versionList.Any(v => v.Equals(version, StringComparison.OrdinalIgnoreCase)); + } + private async Task UpdateVoloPackagesAsync(string content, bool includeNightlyPreviews = false, bool includeReleaseCandidates = false, bool switchToStable = false, SemanticVersion latestNugetVersion = null, SemanticVersion latestNugetReleaseCandidateVersion = null, - string latestMyGetVersion = null) + string latestMyGetVersion = null, + string specifiedVersion = null) { string packageId = null; @@ -129,40 +144,63 @@ namespace Volo.Abp.Cli.ProjectModification Logger.LogDebug("Checking package: \"{0}\" - Current version: {1}", packageId, currentSemanticVersion); - if ((includeNightlyPreviews || (currentVersion.Contains("-preview") && !switchToStable)) && !includeReleaseCandidates) + if (!specifiedVersion.IsNullOrWhiteSpace()) { - var latestVersion = latestMyGetVersion ?? await GetLatestVersionFromMyGet(packageId); - - if (currentVersion != latestVersion) + if (await SpecifiedVersionExists(specifiedVersion, packageId)) { - Logger.LogInformation("Updating package \"{0}\" from v{1} to v{2}.", packageId, currentVersion, latestVersion); - versionAttribute.Value = latestVersion; + var specifiedSemanticVersion = SemanticVersion.Parse(specifiedVersion); + if (specifiedSemanticVersion > currentSemanticVersion) + { + Logger.LogInformation("Updating package \"{0}\" from v{1} to v{2}.", packageId, currentVersion, specifiedVersion); + versionAttribute.Value = specifiedVersion; + } + else + { + Logger.LogWarning("Unable to update package \"{0}\" version v{1} to v{2}.", packageId, currentVersion, specifiedVersion); + } } else { - Logger.LogDebug("Package: \"{0}-v{1}\" is up to date.", packageId, currentVersion); + Logger.LogWarning("Package \"{0}\" specified version v{1} does not exist.", packageId, specifiedVersion); } } else { - SemanticVersion latestVersion; - if (currentSemanticVersion.IsPrerelease && !switchToStable) - { - latestVersion = latestNugetReleaseCandidateVersion ?? await _nuGetService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: true); - } - else - { - latestVersion = latestNugetVersion ?? await _nuGetService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: includeReleaseCandidates); - } - - if (latestVersion != null && (currentSemanticVersion < latestVersion || (currentSemanticVersion.IsPrerelease && switchToStable))) + if ((includeNightlyPreviews || (currentVersion.Contains("-preview") && !switchToStable)) && !includeReleaseCandidates) { - Logger.LogInformation("Updating package \"{0}\" from v{1} to v{2}.", packageId, currentSemanticVersion.ToString(), latestVersion.ToString()); - versionAttribute.Value = latestVersion.ToString(); + var latestVersion = latestMyGetVersion ?? await GetLatestVersionFromMyGet(packageId); + + if (currentVersion != latestVersion) + { + Logger.LogInformation("Updating package \"{0}\" from v{1} to v{2}.", packageId, currentVersion, latestVersion); + versionAttribute.Value = latestVersion; + } + else + { + Logger.LogDebug("Package: \"{0}-v{1}\" is up to date.", packageId, currentVersion); + } } else { - Logger.LogInformation("Package: \"{0}-v{1}\" is up to date.", packageId, currentSemanticVersion); + SemanticVersion latestVersion; + if (currentSemanticVersion.IsPrerelease && !switchToStable) + { + latestVersion = latestNugetReleaseCandidateVersion ?? await _nuGetService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: true); + } + else + { + latestVersion = latestNugetVersion ?? await _nuGetService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: includeReleaseCandidates); + } + + if (latestVersion != null && (currentSemanticVersion < latestVersion || (currentSemanticVersion.IsPrerelease && switchToStable))) + { + Logger.LogInformation("Updating package \"{0}\" from v{1} to v{2}.", packageId, currentSemanticVersion.ToString(), latestVersion.ToString()); + versionAttribute.Value = latestVersion.ToString(); + } + else + { + Logger.LogInformation("Package: \"{0}-v{1}\" is up to date.", packageId, currentSemanticVersion); + } } } } diff --git a/framework/src/Volo.Abp.Cli/Properties/launchSettings.json b/framework/src/Volo.Abp.Cli/Properties/launchSettings.json new file mode 100644 index 0000000000..6846f7adbd --- /dev/null +++ b/framework/src/Volo.Abp.Cli/Properties/launchSettings.json @@ -0,0 +1,9 @@ +{ + "profiles": { + "Volo.Abp.Cli": { + "commandName": "Project", + "commandLineArgs": "bundle --skip-version-check", + "workingDirectory": "C:\\Github\\volo\\abp\\templates\\app-pro\\aspnet-core\\src\\MyCompanyName.MyProjectName.Blazor" + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj index f41c4c3398..22c6b1355c 100644 --- a/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj +++ b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj @@ -18,8 +18,8 @@ - - + + diff --git a/framework/src/Volo.Abp.Cli/Volo/Abp/Cli/Program.cs b/framework/src/Volo.Abp.Cli/Volo/Abp/Cli/Program.cs index c78d5f93f3..886520e95c 100644 --- a/framework/src/Volo.Abp.Cli/Volo/Abp/Cli/Program.cs +++ b/framework/src/Volo.Abp.Cli/Volo/Abp/Cli/Program.cs @@ -3,13 +3,13 @@ using Microsoft.Extensions.DependencyInjection; using Serilog; using Serilog.Events; using System.IO; -using Volo.Abp.Threading; +using System.Threading.Tasks; namespace Volo.Abp.Cli { public class Program { - private static void Main(string[] args) + private static async Task Main(string[] args) { Console.OutputEncoding = System.Text.Encoding.UTF8; @@ -37,11 +37,9 @@ namespace Volo.Abp.Cli { application.Initialize(); - AsyncHelper.RunSync( - () => application.ServiceProvider - .GetRequiredService() - .RunAsync(args) - ); + await application.ServiceProvider + .GetRequiredService() + .RunAsync(args); application.Shutdown(); } diff --git a/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj b/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj index 1f3f28128f..3926f8f298 100644 --- a/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj +++ b/framework/src/Volo.Abp.Core/Volo.Abp.Core.csproj @@ -14,22 +14,22 @@ - - - - - - - - - - - + + + + + + + + + + + - + - - - + + + diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleContext.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleContext.cs index 69f6e8d9e9..ccfcf426e5 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleContext.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleContext.cs @@ -5,17 +5,21 @@ namespace Volo.Abp.Bundling public class BundleContext { public List BundleDefinitions { get; set; } - + public BundleParameterDictionary Parameters { get; set; } + public BundleContext() { BundleDefinitions = new List(); + Parameters = new BundleParameterDictionary(); } - public void Add(string source, Dictionary additionalProperties = null) + public void Add(string source, bool excludeFromBundle = false, + Dictionary additionalProperties = null) { var bundleDefinition = new BundleDefinition { Source = source, + ExcludeFromBundle = excludeFromBundle }; if (additionalProperties != null) @@ -23,7 +27,8 @@ namespace Volo.Abp.Bundling bundleDefinition.AdditionalProperties = additionalProperties; } - BundleDefinitions.AddIfNotContains((item) => item.Source == bundleDefinition.Source, () => bundleDefinition); + BundleDefinitions.AddIfNotContains((item) => item.Source == bundleDefinition.Source, + () => bundleDefinition); } } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleDefinition.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleDefinition.cs index 7a3bf315be..3450a682df 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleDefinition.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleDefinition.cs @@ -8,6 +8,8 @@ namespace Volo.Abp.Bundling public Dictionary AdditionalProperties { get; set; } + public bool ExcludeFromBundle { get; set; } + public BundleDefinition() { AdditionalProperties = new Dictionary(); diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleParameterDictionary.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleParameterDictionary.cs new file mode 100644 index 0000000000..dc23b97a16 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/BundleParameterDictionary.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace Volo.Abp.Bundling +{ + public class BundleParameterDictionary : Dictionary + { + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/IBundleContributor.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/IBundleContributor.cs index 5388070cbd..deebcec213 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/IBundleContributor.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Bundling/IBundleContributor.cs @@ -5,4 +5,4 @@ void AddScripts(BundleContext context); void AddStyles(BundleContext context); } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultConventionalRegistrar.cs b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultConventionalRegistrar.cs index 5f4d64f512..476aaf3846 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultConventionalRegistrar.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/DependencyInjection/DefaultConventionalRegistrar.cs @@ -26,7 +26,7 @@ namespace Volo.Abp.DependencyInjection return; } - var exposedServiceTypes = ExposedServiceExplorer.GetExposedServices(type); + var exposedServiceTypes = GetExposedServiceTypes(type); TriggerServiceExposing(services, type, exposedServiceTypes); @@ -54,6 +54,11 @@ namespace Volo.Abp.DependencyInjection } } + protected virtual List GetExposedServiceTypes(Type type) + { + return ExposedServiceExplorer.GetExposedServices(type); + } + protected virtual ServiceDescriptor CreateServiceDescriptor( Type implementationType, Type exposingServiceType, @@ -117,10 +122,10 @@ namespace Volo.Abp.DependencyInjection protected virtual ServiceLifetime? GetLifeTimeOrNull(Type type, [CanBeNull] DependencyAttribute dependencyAttribute) { - return dependencyAttribute?.Lifetime ?? GetServiceLifetimeFromClassHierarcy(type); + return dependencyAttribute?.Lifetime ?? GetServiceLifetimeFromClassHierarchy(type); } - protected virtual ServiceLifetime? GetServiceLifetimeFromClassHierarcy(Type type) + protected virtual ServiceLifetime? GetServiceLifetimeFromClassHierarchy(Type type) { if (typeof(ITransientDependency).GetTypeInfo().IsAssignableFrom(type)) { @@ -140,4 +145,4 @@ namespace Volo.Abp.DependencyInjection return null; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Threading/AsyncOneTimeRunner.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Threading/AsyncOneTimeRunner.cs index 78a1394c36..c2a85d10b9 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Threading/AsyncOneTimeRunner.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Threading/AsyncOneTimeRunner.cs @@ -1,7 +1,6 @@ using System; using System.Threading; using System.Threading.Tasks; -using Nito.AsyncEx; namespace Volo.Abp.Threading { @@ -21,7 +20,7 @@ namespace Volo.Abp.Threading return; } - using (await _semaphore.LockAsync().ConfigureAwait(false)) + using (await _semaphore.LockAsync()) { if (_runBefore) { diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Threading/SemaphoreSlimExtensions.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Threading/SemaphoreSlimExtensions.cs new file mode 100644 index 0000000000..af0ea2aa71 --- /dev/null +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Threading/SemaphoreSlimExtensions.cs @@ -0,0 +1,89 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Volo.Abp.Threading +{ + public static class SemaphoreSlimExtensions + { + public static async Task LockAsync(this SemaphoreSlim semaphoreSlim) + { + await semaphoreSlim.WaitAsync(); + return GetDispose(semaphoreSlim); + } + + public static async Task LockAsync(this SemaphoreSlim semaphoreSlim, CancellationToken cancellationToken) + { + await semaphoreSlim.WaitAsync(cancellationToken); + return GetDispose(semaphoreSlim); + } + + public static async Task LockAsync(this SemaphoreSlim semaphoreSlim, int millisecondsTimeout) + { + await semaphoreSlim.WaitAsync(millisecondsTimeout); + return GetDispose(semaphoreSlim); + } + + public static async Task LockAsync(this SemaphoreSlim semaphoreSlim, int millisecondsTimeout, CancellationToken cancellationToken) + { + await semaphoreSlim.WaitAsync(millisecondsTimeout, cancellationToken); + return GetDispose(semaphoreSlim); + } + + public static async Task LockAsync(this SemaphoreSlim semaphoreSlim, TimeSpan timeout) + { + await semaphoreSlim.WaitAsync(timeout); + return GetDispose(semaphoreSlim); + } + + public static async Task LockAsync(this SemaphoreSlim semaphoreSlim, TimeSpan timeout, CancellationToken cancellationToken) + { + await semaphoreSlim.WaitAsync(timeout, cancellationToken); + return GetDispose(semaphoreSlim); + } + + public static IDisposable Lock(this SemaphoreSlim semaphoreSlim) + { + semaphoreSlim.Wait(); + return GetDispose(semaphoreSlim); + } + + public static IDisposable Lock(this SemaphoreSlim semaphoreSlim, CancellationToken cancellationToken) + { + semaphoreSlim.Wait(cancellationToken); + return GetDispose(semaphoreSlim); + } + + public static IDisposable Lock(this SemaphoreSlim semaphoreSlim, int millisecondsTimeout) + { + semaphoreSlim.Wait(millisecondsTimeout); + return GetDispose(semaphoreSlim); + } + + public static IDisposable Lock(this SemaphoreSlim semaphoreSlim, int millisecondsTimeout, CancellationToken cancellationToken) + { + semaphoreSlim.Wait(millisecondsTimeout, cancellationToken); + return GetDispose(semaphoreSlim); + } + + public static IDisposable Lock(this SemaphoreSlim semaphoreSlim, TimeSpan timeout) + { + semaphoreSlim.Wait(timeout); + return GetDispose(semaphoreSlim); + } + + public static IDisposable Lock(this SemaphoreSlim semaphoreSlim, TimeSpan timeout, CancellationToken cancellationToken) + { + semaphoreSlim.Wait(timeout, cancellationToken); + return GetDispose(semaphoreSlim); + } + + private static IDisposable GetDispose(this SemaphoreSlim semaphoreSlim) + { + return new DisposeAction(() => + { + semaphoreSlim.Release(); + }); + } + } +} diff --git a/framework/src/Volo.Abp.Dapper/Volo.Abp.Dapper.csproj b/framework/src/Volo.Abp.Dapper/Volo.Abp.Dapper.csproj index a2fd749d0e..0e267324af 100644 --- a/framework/src/Volo.Abp.Dapper/Volo.Abp.Dapper.csproj +++ b/framework/src/Volo.Abp.Dapper/Volo.Abp.Dapper.csproj @@ -19,7 +19,7 @@ - + diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/AbpDddDomainModule.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/AbpDddDomainModule.cs index 41767d213e..523a6ee4f2 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/AbpDddDomainModule.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/AbpDddDomainModule.cs @@ -1,5 +1,7 @@ -using Volo.Abp.Auditing; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Auditing; using Volo.Abp.Data; +using Volo.Abp.Domain.Repositories; using Volo.Abp.EventBus; using Volo.Abp.ExceptionHandling; using Volo.Abp.Guids; @@ -28,6 +30,9 @@ namespace Volo.Abp.Domain )] public class AbpDddDomainModule : AbpModule { - + public override void PreConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddConventionalRegistrar(new AbpRepositoryConventionalRegistrar()); + } } } diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/AbpRepositoryConventionalRegistrar.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/AbpRepositoryConventionalRegistrar.cs new file mode 100644 index 0000000000..f11812f2ea --- /dev/null +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/AbpRepositoryConventionalRegistrar.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Domain.Repositories +{ + public class AbpRepositoryConventionalRegistrar : DefaultConventionalRegistrar + { + public static bool ExposeRepositoryClasses { get; set; } + + protected override bool IsConventionalRegistrationDisabled(Type type) + { + if (!typeof(IRepository).IsAssignableFrom(type)) + { + return true; + } + + return base.IsConventionalRegistrationDisabled(type); + } + + protected override List GetExposedServiceTypes(Type type) + { + if (ExposeRepositoryClasses) + { + return base.GetExposedServiceTypes(type); + } + + return base.GetExposedServiceTypes(type) + .Where(x => x.IsInterface) + .ToList(); + } + + protected override ServiceLifetime? GetServiceLifetimeFromClassHierarchy(Type type) + { + return base.GetServiceLifetimeFromClassHierarchy(type) ?? + ServiceLifetime.Transient; + } + } +} diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs index ae1b03475c..9904a184ff 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/BasicRepositoryBase.cs @@ -9,11 +9,10 @@ using Volo.Abp.Uow; namespace Volo.Abp.Domain.Repositories { - public abstract class BasicRepositoryBase : - IBasicRepository, + public abstract class BasicRepositoryBase : + IBasicRepository, IServiceProviderAccessor, - IUnitOfWorkEnabled, - ITransientDependency + IUnitOfWorkEnabled where TEntity : class, IEntity { public IServiceProvider ServiceProvider { get; set; } @@ -59,7 +58,7 @@ namespace Volo.Abp.Domain.Repositories } public abstract Task FindAsync(TKey id, bool includeDetails = true, CancellationToken cancellationToken = default); - + public virtual async Task DeleteAsync(TKey id, bool autoSave = false, CancellationToken cancellationToken = default) { var entity = await FindAsync(id, cancellationToken: cancellationToken); diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyBasicRepository.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyBasicRepository.cs index b0d270a97e..8b48fcc067 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyBasicRepository.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IReadOnlyBasicRepository.cs @@ -28,8 +28,6 @@ namespace Volo.Abp.Domain.Repositories string sorting, bool includeDetails = false, CancellationToken cancellationToken = default); - - } public interface IReadOnlyBasicRepository : IReadOnlyBasicRepository diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj index 8e325342d4..8616838cc0 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.PostgreSql/Volo.Abp.EntityFrameworkCore.PostgreSql.csproj @@ -19,7 +19,7 @@ - + diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo.Abp.EntityFrameworkCore.SqlServer.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo.Abp.EntityFrameworkCore.SqlServer.csproj index 1f3f2e0140..a18a7fe3b3 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo.Abp.EntityFrameworkCore.SqlServer.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.SqlServer/Volo.Abp.EntityFrameworkCore.SqlServer.csproj @@ -19,7 +19,7 @@ - + diff --git a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo.Abp.EntityFrameworkCore.Sqlite.csproj b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo.Abp.EntityFrameworkCore.Sqlite.csproj index 181abe63bf..81e26afa00 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo.Abp.EntityFrameworkCore.Sqlite.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore.Sqlite/Volo.Abp.EntityFrameworkCore.Sqlite.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo.Abp.EntityFrameworkCore.csproj b/framework/src/Volo.Abp.EntityFrameworkCore/Volo.Abp.EntityFrameworkCore.csproj index 711f9bff11..6c758d88a5 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo.Abp.EntityFrameworkCore.csproj +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo.Abp.EntityFrameworkCore.csproj @@ -20,8 +20,8 @@ - - + + diff --git a/framework/src/Volo.Abp.ExceptionHandling/Volo.Abp.ExceptionHandling.csproj b/framework/src/Volo.Abp.ExceptionHandling/Volo.Abp.ExceptionHandling.csproj index 01f3828f50..b1d60e60c7 100644 --- a/framework/src/Volo.Abp.ExceptionHandling/Volo.Abp.ExceptionHandling.csproj +++ b/framework/src/Volo.Abp.ExceptionHandling/Volo.Abp.ExceptionHandling.csproj @@ -19,7 +19,7 @@ - + diff --git a/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/AspNetCore/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs b/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/AspNetCore/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs index 6367bd24ff..eb8c4eb804 100644 --- a/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/AspNetCore/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs +++ b/framework/src/Volo.Abp.ExceptionHandling/Volo/Abp/AspNetCore/ExceptionHandling/DefaultExceptionToErrorInfoConverter.cs @@ -62,12 +62,6 @@ namespace Volo.Abp.AspNetCore.ExceptionHandling return CreateEntityNotFoundError(exception as EntityNotFoundException); } - if (exception is AbpAuthorizationException) - { - var authorizationException = exception as AbpAuthorizationException; - return new RemoteServiceErrorInfo(authorizationException.Message); - } - var errorInfo = new RemoteServiceErrorInfo(); if (exception is IUserFriendlyException) diff --git a/framework/src/Volo.Abp.Features/Volo.Abp.Features.csproj b/framework/src/Volo.Abp.Features/Volo.Abp.Features.csproj index a2d098f970..3bea3ea77f 100644 --- a/framework/src/Volo.Abp.Features/Volo.Abp.Features.csproj +++ b/framework/src/Volo.Abp.Features/Volo.Abp.Features.csproj @@ -15,7 +15,12 @@ - + + + + + + diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeatureErrorCodes.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeatureErrorCodes.cs new file mode 100644 index 0000000000..a5a4cf3a58 --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeatureErrorCodes.cs @@ -0,0 +1,11 @@ +namespace Volo.Abp.Features +{ + public static class AbpFeatureErrorCodes + { + public const string FeatureIsNotEnabled = "Volo.Feature:010001"; + + public const string AllOfTheseFeaturesMustBeEnabled = "Volo.Feature:010002"; + + public const string AtLeastOneOfTheseFeaturesMustBeEnabled = "Volo.Feature:010003"; + } +} diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs index f30017feed..70c6e7f37d 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/AbpFeaturesModule.cs @@ -1,15 +1,18 @@ using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; +using Volo.Abp.Features.Localization; using Volo.Abp.Localization; +using Volo.Abp.Localization.ExceptionHandling; using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; using Volo.Abp.Validation; +using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.Features { [DependsOn( - typeof(AbpLocalizationAbstractionsModule), + typeof(AbpLocalizationModule), typeof(AbpMultiTenancyModule), typeof(AbpValidationModule) )] @@ -29,6 +32,23 @@ namespace Volo.Abp.Features options.ValueProviders.Add(); options.ValueProviders.Add(); }); + + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + + Configure(options => + { + options.Resources + .Add("en") + .AddVirtualJson("/Volo/Abp/Features/Localization"); + }); + + Configure(options => + { + options.MapCodeNamespace("Volo.Feature", typeof(AbpFeatureResource)); + }); } private static void AutoAddDefinitionProviders(IServiceCollection services) diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerExtensions.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerExtensions.cs index 8850408df0..ba2b640031 100644 --- a/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerExtensions.cs +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureCheckerExtensions.cs @@ -9,8 +9,8 @@ namespace Volo.Abp.Features public static class FeatureCheckerExtensions { public static async Task GetAsync( - [NotNull] this IFeatureChecker featureChecker, - [NotNull] string name, + [NotNull] this IFeatureChecker featureChecker, + [NotNull] string name, T defaultValue = default) where T : struct { @@ -56,10 +56,11 @@ namespace Volo.Abp.Features { if (!(await featureChecker.IsEnabledAsync(featureName))) { - throw new AbpAuthorizationException("Feature is not enabled: " + featureName); + throw new AbpAuthorizationException(code: AbpFeatureErrorCodes.FeatureIsNotEnabled).WithData( + "FeatureName", featureName); } } - + public static async Task CheckEnabledAsync(this IFeatureChecker featureChecker, bool requiresAll, params string[] featureNames) { if (featureNames.IsNullOrEmpty()) @@ -73,10 +74,8 @@ namespace Volo.Abp.Features { if (!(await featureChecker.IsEnabledAsync(featureName))) { - throw new AbpAuthorizationException( - "Required features are not enabled. All of these features must be enabled: " + - string.Join(", ", featureNames) - ); + throw new AbpAuthorizationException(code: AbpFeatureErrorCodes.AllOfTheseFeaturesMustBeEnabled) + .WithData("FeatureNames", string.Join(", ", featureNames)); } } } @@ -90,11 +89,9 @@ namespace Volo.Abp.Features } } - throw new AbpAuthorizationException( - "Required features are not enabled. At least one of these features must be enabled: " + - string.Join(", ", featureNames) - ); + throw new AbpAuthorizationException(code: AbpFeatureErrorCodes.AtLeastOneOfTheseFeaturesMustBeEnabled) + .WithData("FeatureNames", string.Join(", ", featureNames)); } } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/AbpFeatureResource.cs b/framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/AbpFeatureResource.cs new file mode 100644 index 0000000000..5871d550ad --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/AbpFeatureResource.cs @@ -0,0 +1,10 @@ +using Volo.Abp.Localization; + +namespace Volo.Abp.Features.Localization +{ + [LocalizationResourceName("AbpFeature")] + public class AbpFeatureResource + { + + } +} diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/en.json b/framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/en.json new file mode 100644 index 0000000000..de03dc11d0 --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/en.json @@ -0,0 +1,8 @@ +{ + "culture": "en", + "texts": { + "Volo.Feature:010001": "Feature is not enabled: {FeatureName}", + "Volo.Feature:010002": "Required features are not enabled. All of these features must be enabled: {FeatureNames}", + "Volo.Feature:010003": "Required features are not enabled. At least one of these features must be enabled: {FeatureNames}" + } +} diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/tr.json b/framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/tr.json new file mode 100644 index 0000000000..4339c6ea71 --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/tr.json @@ -0,0 +1,8 @@ +{ + "culture": "tr", + "texts": { + "Volo.Feature:010001": "Bu özellik etkin değil: {FeatureName}", + "Volo.Feature:010002": "Gerekli özellikler etkinleştirilmemiş. Bu özelliklerin tümü etkinleştirilmelidir: {FeatureNames}", + "Volo.Feature:010003": "Gerekli özellikler etkinleştirilmemiş. Bu özelliklerden en az birinin etkinleştirilmesi gerekir: {FeatureNames}" + } +} diff --git a/framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/zh-Hans.json b/framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/zh-Hans.json new file mode 100644 index 0000000000..4c6d99c281 --- /dev/null +++ b/framework/src/Volo.Abp.Features/Volo/Abp/Features/Localization/zh-Hans.json @@ -0,0 +1,8 @@ +{ + "culture": "zh-Hans", + "texts": { + "Volo.Feature:010001": "功能未启用: {FeatureName}", + "Volo.Feature:010002": "必要的功能未启用. 这些功能需要启用: {FeatureNames}", + "Volo.Feature:010003": "必要的功能未启用. 需要启用这些功能中的一项:{FeatureNames}" + } +} diff --git a/framework/src/Volo.Abp.FluentValidation/Volo.Abp.FluentValidation.csproj b/framework/src/Volo.Abp.FluentValidation/Volo.Abp.FluentValidation.csproj index 68ce50ec9d..772774a77e 100644 --- a/framework/src/Volo.Abp.FluentValidation/Volo.Abp.FluentValidation.csproj +++ b/framework/src/Volo.Abp.FluentValidation/Volo.Abp.FluentValidation.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.FluentValidation/Volo/Abp/FluentValidation/FluentObjectValidationContributor.cs b/framework/src/Volo.Abp.FluentValidation/Volo/Abp/FluentValidation/FluentObjectValidationContributor.cs index e699e0093a..ccc290f354 100644 --- a/framework/src/Volo.Abp.FluentValidation/Volo/Abp/FluentValidation/FluentObjectValidationContributor.cs +++ b/framework/src/Volo.Abp.FluentValidation/Volo/Abp/FluentValidation/FluentObjectValidationContributor.cs @@ -26,7 +26,10 @@ namespace Volo.Abp.FluentValidation return; } - var result = validator.Validate(context.ValidatingObject); + var result = validator.Validate((IValidationContext) Activator.CreateInstance( + typeof(ValidationContext<>).MakeGenericType(context.ValidatingObject.GetType()), + context.ValidatingObject)); + if (!result.IsValid) { context.Errors.AddRange( diff --git a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeature.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeature.cs index c7fc9304a8..de9ae0232a 100644 --- a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeature.cs +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalFeature.cs @@ -1,4 +1,4 @@ -using JetBrains.Annotations; +using JetBrains.Annotations; namespace Volo.Abp.GlobalFeatures { diff --git a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionary.cs b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionary.cs index b89bf2fe36..9952b0c5cc 100644 --- a/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionary.cs +++ b/framework/src/Volo.Abp.GlobalFeatures/Volo/Abp/GlobalFeatures/GlobalModuleFeaturesDictionary.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using JetBrains.Annotations; namespace Volo.Abp.GlobalFeatures diff --git a/framework/src/Volo.Abp.HangFire/Volo.Abp.HangFire.csproj b/framework/src/Volo.Abp.HangFire/Volo.Abp.HangFire.csproj index 3bd6638f67..4ec9d0a3b5 100644 --- a/framework/src/Volo.Abp.HangFire/Volo.Abp.HangFire.csproj +++ b/framework/src/Volo.Abp.HangFire/Volo.Abp.HangFire.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo.Abp.Http.Client.IdentityModel.WebAssembly.csproj b/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo.Abp.Http.Client.IdentityModel.WebAssembly.csproj index 269e6a6c18..e4e3c5c235 100644 --- a/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo.Abp.Http.Client.IdentityModel.WebAssembly.csproj +++ b/framework/src/Volo.Abp.Http.Client.IdentityModel.WebAssembly/Volo.Abp.Http.Client.IdentityModel.WebAssembly.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.csproj b/framework/src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.csproj index e35ba45e59..92d4cc81b7 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.csproj +++ b/framework/src/Volo.Abp.Http.Client/Volo.Abp.Http.Client.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionCache.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionCache.cs index 62575fe1c2..aee29e986f 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionCache.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/ApiDescriptionCache.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -using Nito.AsyncEx; using Volo.Abp.DependencyInjection; using Volo.Abp.Http.Modeling; using Volo.Abp.Threading; @@ -24,10 +23,10 @@ namespace Volo.Abp.Http.Client.DynamicProxying } public async Task GetAsync( - string baseUrl, + string baseUrl, Func> factory) { - using (await _semaphore.LockAsync(CancellationTokenProvider.Token).ConfigureAwait(false)) + using (await _semaphore.LockAsync(CancellationTokenProvider.Token)) { var model = _cache.GetOrDefault(baseUrl); if (model == null) @@ -39,4 +38,4 @@ namespace Volo.Abp.Http.Client.DynamicProxying } } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Generators/JQuery/JQueryProxyScriptGenerator.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Generators/JQuery/JQueryProxyScriptGenerator.cs index 7f9672ce69..8cb92c6766 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Generators/JQuery/JQueryProxyScriptGenerator.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/ProxyScripting/Generators/JQuery/JQueryProxyScriptGenerator.cs @@ -25,7 +25,7 @@ namespace Volo.Abp.Http.ProxyScripting.Generators.JQuery script.AppendLine("/* This file is automatically generated by ABP framework to use MVC Controllers from javascript. */"); script.AppendLine(); - + foreach (var module in model.Modules.Values) { script.AppendLine(); @@ -99,9 +99,12 @@ namespace Volo.Abp.Http.ProxyScripting.Generators.JQuery AddAjaxCallParameters(script, action); var ajaxParamsIsFromForm = action.Parameters.Any(x => x.BindingSourceId == ParameterBindingSources.Form); + var dataType = action.ReturnValue.Type == ReturnValueApiDescriptionModel.Create(typeof(string)).Type + ? "{ dataType: 'text' }, " + : string.Empty; script.AppendLine(ajaxParamsIsFromForm - ? " }, $.extend(true, {}, ajaxParams, { contentType: 'application/x-www-form-urlencoded; charset=UTF-8' })));" - : " }, ajaxParams));"); + ? " }, $.extend(true, {}, " + dataType + "{ contentType: 'application/x-www-form-urlencoded; charset=UTF-8' }, ajaxParams)));" + : " }, " + dataType + "ajaxParams));"); script.AppendLine(" };"); } @@ -159,7 +162,7 @@ namespace Volo.Abp.Http.ProxyScripting.Generators.JQuery script.Append(" data: " + formData); } } - + script.AppendLine(); } @@ -191,7 +194,7 @@ namespace Volo.Abp.Http.ProxyScripting.Generators.JQuery return result; } - + private static void AddInitializedEventTrigger(StringBuilder script) { script.AppendLine(); @@ -213,4 +216,4 @@ namespace Volo.Abp.Http.ProxyScripting.Generators.JQuery return name.Split('.').Select(n => n.ToCamelCase()).JoinAsString("."); } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj b/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj index 0ed715a504..9b1a1c9caf 100644 --- a/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj +++ b/framework/src/Volo.Abp.IdentityModel/Volo.Abp.IdentityModel.csproj @@ -15,8 +15,8 @@ - - + + diff --git a/framework/src/Volo.Abp.Kafka/Volo.Abp.Kafka.csproj b/framework/src/Volo.Abp.Kafka/Volo.Abp.Kafka.csproj index 2a0b576f98..4f8a94fe8e 100644 --- a/framework/src/Volo.Abp.Kafka/Volo.Abp.Kafka.csproj +++ b/framework/src/Volo.Abp.Kafka/Volo.Abp.Kafka.csproj @@ -9,7 +9,7 @@ - + diff --git a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs index c22ca6756b..8ae81a2a26 100644 --- a/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs +++ b/framework/src/Volo.Abp.Kafka/Volo/Abp/Kafka/KafkaMessageConsumer.cs @@ -118,10 +118,10 @@ namespace Volo.Abp.Kafka catch (ConsumeException ex) { Logger.LogException(ex, LogLevel.Warning); - AsyncHelper.RunSync(() => ExceptionNotifier.NotifyAsync(ex, logLevel: LogLevel.Warning)); + await ExceptionNotifier.NotifyAsync(ex, logLevel: LogLevel.Warning); } } - }); + }, TaskCreationOptions.LongRunning); } protected virtual async Task HandleIncomingMessage(ConsumeResult consumeResult) diff --git a/framework/src/Volo.Abp.MailKit/Volo.Abp.MailKit.csproj b/framework/src/Volo.Abp.MailKit/Volo.Abp.MailKit.csproj index ddded71dce..edc3752d47 100644 --- a/framework/src/Volo.Abp.MailKit/Volo.Abp.MailKit.csproj +++ b/framework/src/Volo.Abp.MailKit/Volo.Abp.MailKit.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.Minify/Volo.Abp.Minify.csproj b/framework/src/Volo.Abp.Minify/Volo.Abp.Minify.csproj index 1b2f266637..6f25c447f0 100644 --- a/framework/src/Volo.Abp.Minify/Volo.Abp.Minify.csproj +++ b/framework/src/Volo.Abp.Minify/Volo.Abp.Minify.csproj @@ -19,7 +19,7 @@ - + diff --git a/framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj b/framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj index e2f589b399..aa487ffc4e 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj +++ b/framework/src/Volo.Abp.MongoDB/Volo.Abp.MongoDB.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.Quartz/Volo.Abp.Quartz.csproj b/framework/src/Volo.Abp.Quartz/Volo.Abp.Quartz.csproj index 198d2479e4..0fcc4da9f2 100644 --- a/framework/src/Volo.Abp.Quartz/Volo.Abp.Quartz.csproj +++ b/framework/src/Volo.Abp.Quartz/Volo.Abp.Quartz.csproj @@ -15,9 +15,9 @@ - - - + + + diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo.Abp.RabbitMQ.csproj b/framework/src/Volo.Abp.RabbitMQ/Volo.Abp.RabbitMQ.csproj index a21be8bdfa..abec7828ab 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo.Abp.RabbitMQ.csproj +++ b/framework/src/Volo.Abp.RabbitMQ/Volo.Abp.RabbitMQ.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs index 135156f7a8..fb1b0c7fe2 100644 --- a/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs +++ b/framework/src/Volo.Abp.RabbitMQ/Volo/Abp/RabbitMQ/RabbitMqMessageConsumer.cs @@ -20,7 +20,7 @@ namespace Volo.Abp.RabbitMQ protected IExceptionNotifier ExceptionNotifier { get; } - protected AbpTimer Timer { get; } + protected AbpAsyncTimer Timer { get; } protected ExchangeDeclareConfiguration Exchange { get; private set; } @@ -38,7 +38,7 @@ namespace Volo.Abp.RabbitMQ public RabbitMqMessageConsumer( IConnectionPool connectionPool, - AbpTimer timer, + AbpAsyncTimer timer, IExceptionNotifier exceptionNotifier) { ConnectionPool = connectionPool; @@ -50,7 +50,7 @@ namespace Volo.Abp.RabbitMQ Callbacks = new ConcurrentBag>(); Timer.Period = 5000; //5 sec. - Timer.Elapsed += Timer_Elapsed; + Timer.Elapsed = Timer_Elapsed; Timer.RunOnStart = true; } @@ -77,7 +77,7 @@ namespace Volo.Abp.RabbitMQ await TrySendQueueBindCommandsAsync(); } - protected virtual void TrySendQueueBindCommands() + protected virtual async Task TrySendQueueBindCommandsAsync() { try { @@ -119,40 +119,33 @@ namespace Volo.Abp.RabbitMQ catch (Exception ex) { Logger.LogException(ex, LogLevel.Warning); - AsyncHelper.RunSync(() => ExceptionNotifier.NotifyAsync(ex, logLevel: LogLevel.Warning)); + await ExceptionNotifier.NotifyAsync(ex, logLevel: LogLevel.Warning); } } - protected virtual Task TrySendQueueBindCommandsAsync() - { - TrySendQueueBindCommands(); - return Task.CompletedTask; - } - public virtual void OnMessageReceived(Func callback) { Callbacks.Add(callback); } - protected virtual void Timer_Elapsed(object sender, EventArgs e) + protected virtual async Task Timer_Elapsed(AbpAsyncTimer timer) { if (Channel == null || Channel.IsOpen == false) { - TryCreateChannel(); - TrySendQueueBindCommands(); + await TryCreateChannelAsync(); + await TrySendQueueBindCommandsAsync(); } } - protected virtual void TryCreateChannel() + protected virtual async Task TryCreateChannelAsync() { - DisposeChannel(); + await DisposeChannelAsync(); try { var channel = ConnectionPool .Get(ConnectionName) .CreateModel(); - channel.ExchangeDeclare( exchange: Exchange.ExchangeName, type: Exchange.Type, @@ -172,7 +165,7 @@ namespace Volo.Abp.RabbitMQ var consumer = new EventingBasicConsumer(channel); consumer.Received += async (model, basicDeliverEventArgs) => { - await HandleIncomingMessage(channel, basicDeliverEventArgs); + await HandleIncomingMessageAsync(channel, basicDeliverEventArgs); }; channel.BasicConsume( @@ -186,11 +179,11 @@ namespace Volo.Abp.RabbitMQ catch (Exception ex) { Logger.LogException(ex, LogLevel.Warning); - AsyncHelper.RunSync(() => ExceptionNotifier.NotifyAsync(ex, logLevel: LogLevel.Warning)); + await ExceptionNotifier.NotifyAsync(ex, logLevel: LogLevel.Warning); } } - protected virtual async Task HandleIncomingMessage(IModel channel, BasicDeliverEventArgs basicDeliverEventArgs) + protected virtual async Task HandleIncomingMessageAsync(IModel channel, BasicDeliverEventArgs basicDeliverEventArgs) { try { @@ -208,6 +201,24 @@ namespace Volo.Abp.RabbitMQ } } + protected virtual async Task DisposeChannelAsync() + { + if (Channel == null) + { + return; + } + + try + { + Channel.Dispose(); + } + catch (Exception ex) + { + Logger.LogException(ex, LogLevel.Warning); + await ExceptionNotifier.NotifyAsync(ex, logLevel: LogLevel.Warning); + } + } + protected virtual void DisposeChannel() { if (Channel == null) diff --git a/framework/src/Volo.Abp.Security/Volo/Abp/Authorization/AbpAuthorizationException.cs b/framework/src/Volo.Abp.Security/Volo/Abp/Authorization/AbpAuthorizationException.cs index ad5b0b65a3..c0a8c4d4f8 100644 --- a/framework/src/Volo.Abp.Security/Volo/Abp/Authorization/AbpAuthorizationException.cs +++ b/framework/src/Volo.Abp.Security/Volo/Abp/Authorization/AbpAuthorizationException.cs @@ -1,6 +1,7 @@ using System; using System.Runtime.Serialization; using Microsoft.Extensions.Logging; +using Volo.Abp.ExceptionHandling; using Volo.Abp.Logging; namespace Volo.Abp.Authorization @@ -9,7 +10,7 @@ namespace Volo.Abp.Authorization /// This exception is thrown on an unauthorized request. /// [Serializable] - public class AbpAuthorizationException : AbpException, IHasLogLevel + public class AbpAuthorizationException : AbpException, IHasLogLevel, IHasErrorCode { /// /// Severity of the exception. @@ -17,6 +18,11 @@ namespace Volo.Abp.Authorization /// public LogLevel LogLevel { get; set; } + /// + /// Error code. + /// + public string Code { get; } + /// /// Creates a new object. /// @@ -54,5 +60,24 @@ namespace Volo.Abp.Authorization { LogLevel = LogLevel.Warning; } + + /// + /// Creates a new object. + /// + /// Exception message + /// Exception code + /// Inner exception + public AbpAuthorizationException(string message = null, string code = null, Exception innerException = null) + : base(message, innerException) + { + Code = code; + LogLevel = LogLevel.Warning; + } + + public AbpAuthorizationException WithData(string name, object value) + { + Data[name] = value; + return this; + } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Swashbuckle/Microsoft/AspNetCore/Builder/AbpSwaggerUIBuilderExtensions.cs b/framework/src/Volo.Abp.Swashbuckle/Microsoft/AspNetCore/Builder/AbpSwaggerUIBuilderExtensions.cs index 4a54191459..0f19345038 100644 --- a/framework/src/Volo.Abp.Swashbuckle/Microsoft/AspNetCore/Builder/AbpSwaggerUIBuilderExtensions.cs +++ b/framework/src/Volo.Abp.Swashbuckle/Microsoft/AspNetCore/Builder/AbpSwaggerUIBuilderExtensions.cs @@ -15,7 +15,7 @@ namespace Microsoft.AspNetCore.Builder return app.UseSwaggerUI(options => { - options.InjectJavascript("/libs/abp/core/abp.js"); + options.InjectJavascript("/swagger/ui/abp.js"); options.InjectJavascript("/swagger/ui/abp.swagger.js"); options.IndexStream = () => resolver.Resolver(); diff --git a/framework/src/Volo.Abp.Swashbuckle/Volo.Abp.Swashbuckle.csproj b/framework/src/Volo.Abp.Swashbuckle/Volo.Abp.Swashbuckle.csproj index bbd09c5fed..9a720524d9 100644 --- a/framework/src/Volo.Abp.Swashbuckle/Volo.Abp.Swashbuckle.csproj +++ b/framework/src/Volo.Abp.Swashbuckle/Volo.Abp.Swashbuckle.csproj @@ -2,9 +2,9 @@ - + - netstandard2.0 + net5 Volo.Abp.Swashbuckle Volo.Abp.Swashbuckle $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; @@ -15,16 +15,19 @@ - + + + + diff --git a/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleController.cs b/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleController.cs new file mode 100644 index 0000000000..e115ea4b4e --- /dev/null +++ b/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleController.cs @@ -0,0 +1,28 @@ +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.AntiForgery; +using Volo.Abp.Auditing; + +namespace Volo.Abp.Swashbuckle +{ + [Area("Abp")] + [Route("Abp/Swashbuckle/[action]")] + [DisableAuditing] + [RemoteService(false)] + [ApiExplorerSettings(IgnoreApi = true)] + public class AbpSwashbuckleController : AbpController + { + private readonly IAbpAntiForgeryManager _antiForgeryManager; + + public AbpSwashbuckleController(IAbpAntiForgeryManager antiForgeryManager) + { + _antiForgeryManager = antiForgeryManager; + } + + [HttpGet] + public void SetCsrfCookie() + { + _antiForgeryManager.SetCookie(); + } + } +} diff --git a/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleModule.cs b/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleModule.cs index 949ac2ca2d..c8ee0737c8 100644 --- a/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleModule.cs +++ b/framework/src/Volo.Abp.Swashbuckle/Volo/Abp/Swashbuckle/AbpSwashbuckleModule.cs @@ -1,9 +1,12 @@ -using Volo.Abp.Modularity; +using Volo.Abp.AspNetCore.Mvc; +using Volo.Abp.Modularity; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.Swashbuckle { - [DependsOn(typeof(AbpVirtualFileSystemModule))] + [DependsOn( + typeof(AbpVirtualFileSystemModule), + typeof(AbpAspNetCoreMvcModule))] public class AbpSwashbuckleModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.js b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.js new file mode 100644 index 0000000000..0e13317cbf --- /dev/null +++ b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.js @@ -0,0 +1,97 @@ +var abp = abp || {}; +(function () { + + /* Application paths *****************************************/ + + //Current application root path (including virtual directory if exists). + abp.appPath = abp.appPath || '/'; + + /* UTILS ***************************************************/ + + abp.utils = abp.utils || {}; + + /** + * Sets a cookie value for given key. + * This is a simple implementation created to be used by ABP. + * Please use a complete cookie library if you need. + * @param {string} key + * @param {string} value + * @param {Date} expireDate (optional). If not specified the cookie will expire at the end of session. + * @param {string} path (optional) + */ + abp.utils.setCookieValue = function (key, value, expireDate, path) { + var cookieValue = encodeURIComponent(key) + '='; + + if (value) { + cookieValue = cookieValue + encodeURIComponent(value); + } + + if (expireDate) { + cookieValue = cookieValue + "; expires=" + expireDate.toUTCString(); + } + + if (path) { + cookieValue = cookieValue + "; path=" + path; + } + + document.cookie = cookieValue; + }; + + /** + * Gets a cookie with given key. + * This is a simple implementation created to be used by ABP. + * Please use a complete cookie library if you need. + * @param {string} key + * @returns {string} Cookie value or null + */ + abp.utils.getCookieValue = function (key) { + var equalities = document.cookie.split('; '); + for (var i = 0; i < equalities.length; i++) { + if (!equalities[i]) { + continue; + } + + var splitted = equalities[i].split('='); + if (splitted.length != 2) { + continue; + } + + if (decodeURIComponent(splitted[0]) === key) { + return decodeURIComponent(splitted[1] || ''); + } + } + + return null; + }; + + /** + * Deletes cookie for given key. + * This is a simple implementation created to be used by ABP. + * Please use a complete cookie library if you need. + * @param {string} key + * @param {string} path (optional) + */ + abp.utils.deleteCookie = function (key, path) { + var cookieValue = encodeURIComponent(key) + '='; + + cookieValue = cookieValue + "; expires=" + (new Date(new Date().getTime() - 86400000)).toUTCString(); + + if (path) { + cookieValue = cookieValue + "; path=" + path; + } + + document.cookie = cookieValue; + } + + /* SECURITY ***************************************/ + abp.security = abp.security || {}; + abp.security.antiForgery = abp.security.antiForgery || {}; + + abp.security.antiForgery.tokenCookieName = 'XSRF-TOKEN'; + abp.security.antiForgery.tokenHeaderName = 'RequestVerificationToken'; + + abp.security.antiForgery.getToken = function () { + return abp.utils.getCookieValue(abp.security.antiForgery.tokenCookieName); + }; + +})(); diff --git a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js index 22277cb194..ac85cf2559 100644 --- a/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js +++ b/framework/src/Volo.Abp.Swashbuckle/wwwroot/swagger/ui/abp.swagger.js @@ -1,8 +1,26 @@ var abp = abp || {}; (function () { + abp.SwaggerUIBundle = function (configObject) { - configObject.requestInterceptor = function (request) { + + var excludeUrl = ["swagger.json", "connect/token"] + var firstRequest = true; + abp.appPath = configObject.baseUrl || abp.appPath; + + configObject.requestInterceptor = async function (request) { + + if(request.url.includes(excludeUrl[1])){ + firstRequest = true; + } + + if(firstRequest && !excludeUrl.some(url => request.url.includes(url))) + { + await fetch(`${abp.appPath}abp/Swashbuckle/SetCsrfCookie`,{ + headers: request.headers + }); + firstRequest = false; + } var antiForgeryToken = abp.security.antiForgery.getToken(); if (antiForgeryToken) { diff --git a/framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj b/framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj index 7885cefbaf..af14f9e42e 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj +++ b/framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateLocalizer.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateLocalizer.cs index c3c67dd194..4e4a1e4833 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateLocalizer.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateLocalizer.cs @@ -46,5 +46,20 @@ namespace Volo.Abp.TextTemplating var args = arguments.Skip(1).Where(x => x != null && !x.ToString().IsNullOrWhiteSpace()).ToArray(); return args.Any() ? _localizer[name.ToString(), args] : _localizer[name.ToString()]; } + + public int RequiredParameterCount => 1; + + public int ParameterCount => ScriptFunctionCall.MaximumParameterCount - 1; + + public ScriptVarParamKind VarParamKind => ScriptVarParamKind.Direct; + + public Type ReturnType => typeof(object); + + public ScriptParameterInfo GetParameterInfo(int index) + { + return index == 0 + ? new ScriptParameterInfo(typeof(string), "template_name") + : new ScriptParameterInfo(typeof(object), "value"); + } } } diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory.cs index d710f50526..981d1f8819 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory.cs @@ -1,8 +1,9 @@ -using System.Collections.Concurrent; +using System; +using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; -using Nito.AsyncEx; using Volo.Abp.DependencyInjection; +using Volo.Abp.Threading; using Volo.Abp.VirtualFileSystem; namespace Volo.Abp.TextTemplating.VirtualFiles @@ -27,7 +28,7 @@ namespace Volo.Abp.TextTemplating.VirtualFiles return reader; } - using (await SyncObj.LockAsync().ConfigureAwait(false)) + using (await SyncObj.LockAsync()) { if (ReaderCache.TryGetValue(templateDefinition.Name, out reader)) { @@ -52,7 +53,13 @@ namespace Volo.Abp.TextTemplating.VirtualFiles var fileInfo = VirtualFileProvider.GetFileInfo(virtualPath); if (!fileInfo.Exists) { - throw new AbpException("Could not find a file/folder at the location: " + virtualPath); + var directoryContents = VirtualFileProvider.GetDirectoryContents(virtualPath); + if (!directoryContents.Exists) + { + throw new AbpException("Could not find a file/folder at the location: " + virtualPath); + } + + fileInfo = new VirtualDirectoryFileInfo(virtualPath, virtualPath, DateTimeOffset.UtcNow); } if (fileInfo.IsDirectory) diff --git a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs index 638a7db190..6fc7ff4847 100644 --- a/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs +++ b/framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFolderLocalizedTemplateContentReader.cs @@ -11,18 +11,18 @@ namespace Volo.Abp.TextTemplating.VirtualFiles private Dictionary _dictionary; public async Task ReadContentsAsync( - IVirtualFileProvider virtualFileProvider, + IVirtualFileProvider virtualFileProvider, string virtualPath) { _dictionary = new Dictionary(); - var directoryInfo = virtualFileProvider.GetFileInfo(virtualPath); - if (!directoryInfo.IsDirectory) + var directoryContents = virtualFileProvider.GetDirectoryContents(virtualPath); + if (!directoryContents.Exists) { - throw new AbpException("Given virtual path is not a folder: " + virtualPath); + throw new AbpException("Could not find a folder at the location: " + virtualPath); } - foreach (var file in virtualFileProvider.GetDirectoryContents(virtualPath)) + foreach (var file in directoryContents) { if (file.IsDirectory) { @@ -43,4 +43,4 @@ namespace Volo.Abp.TextTemplating.VirtualFiles return _dictionary.GetOrDefault(cultureName); } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AbpAsyncTimer.cs b/framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AbpAsyncTimer.cs new file mode 100644 index 0000000000..8ce369ef66 --- /dev/null +++ b/framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AbpAsyncTimer.cs @@ -0,0 +1,127 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.DependencyInjection; +using Volo.Abp.ExceptionHandling; + +namespace Volo.Abp.Threading +{ + /// + /// A robust timer implementation that ensures no overlapping occurs. It waits exactly specified between ticks. + /// + public class AbpAsyncTimer : ITransientDependency + { + /// + /// This func is raised periodically according to Period of Timer. + /// + public Func Elapsed = _ => Task.CompletedTask; + + /// + /// Task period of timer (as milliseconds). + /// + public int Period { get; set; } + + /// + /// Indicates whether timer raises Elapsed event on Start method of Timer for once. + /// Default: False. + /// + public bool RunOnStart { get; set; } + + public ILogger Logger { get; set; } + + public IExceptionNotifier ExceptionNotifier { get; set; } + + private readonly Timer _taskTimer; + private volatile bool _performingTasks; + private volatile bool _isRunning; + + public AbpAsyncTimer() + { + ExceptionNotifier = NullExceptionNotifier.Instance; + Logger = NullLogger.Instance; + + _taskTimer = new Timer( + TimerCallBack, + null, + Timeout.Infinite, + Timeout.Infinite + ); + } + + public void Start(CancellationToken cancellationToken = default) + { + if (Period <= 0) + { + throw new AbpException("Period should be set before starting the timer!"); + } + + lock (_taskTimer) + { + _taskTimer.Change(RunOnStart ? 0 : Period, Timeout.Infinite); + _isRunning = true; + } + } + + public void Stop(CancellationToken cancellationToken = default) + { + lock (_taskTimer) + { + _taskTimer.Change(Timeout.Infinite, Timeout.Infinite); + while (_performingTasks) + { + Monitor.Wait(_taskTimer); + } + + _isRunning = false; + } + } + + /// + /// This method is called by _taskTimer. + /// + /// Not used argument + private void TimerCallBack(object state) + { + lock (_taskTimer) + { + if (!_isRunning || _performingTasks) + { + return; + } + + _taskTimer.Change(Timeout.Infinite, Timeout.Infinite); + _performingTasks = true; + } + + _ = Timer_Elapsed(); + } + + private async Task Timer_Elapsed() + { + try + { + await Elapsed(this); + } + catch(Exception ex) + { + Logger.LogException(ex); + await ExceptionNotifier.NotifyAsync(ex); + } + finally + { + lock (_taskTimer) + { + _performingTasks = false; + if (_isRunning) + { + _taskTimer.Change(Period, Timeout.Infinite); + } + + Monitor.Pulse(_taskTimer); + } + } + } + } +} diff --git a/framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AbpTimer.cs b/framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AbpTimer.cs index 5c5041cdf6..e7e6efd5de 100644 --- a/framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AbpTimer.cs +++ b/framework/src/Volo.Abp.Threading/Volo/Abp/Threading/AbpTimer.cs @@ -118,4 +118,4 @@ namespace Volo.Abp.Threading } } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Timing/Volo.Abp.Timing.csproj b/framework/src/Volo.Abp.Timing/Volo.Abp.Timing.csproj index 53ef23fd62..c0a9f0b271 100644 --- a/framework/src/Volo.Abp.Timing/Volo.Abp.Timing.csproj +++ b/framework/src/Volo.Abp.Timing/Volo.Abp.Timing.csproj @@ -26,7 +26,7 @@ - + diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj b/framework/src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj index 688ba76982..64425620dc 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj @@ -15,9 +15,9 @@ - - - + + + diff --git a/framework/test/AbpTestBase/AbpTestBase.csproj b/framework/test/AbpTestBase/AbpTestBase.csproj index 10e5b5d74a..a7e6ebb13f 100644 --- a/framework/test/AbpTestBase/AbpTestBase.csproj +++ b/framework/test/AbpTestBase/AbpTestBase.csproj @@ -14,12 +14,12 @@ - - - - - - + + + + + + diff --git a/framework/test/SimpleConsoleDemo/SimpleConsoleDemo.csproj b/framework/test/SimpleConsoleDemo/SimpleConsoleDemo.csproj index 0b4bffe3eb..b48e1dee60 100644 --- a/framework/test/SimpleConsoleDemo/SimpleConsoleDemo.csproj +++ b/framework/test/SimpleConsoleDemo/SimpleConsoleDemo.csproj @@ -18,7 +18,7 @@ - + diff --git a/framework/test/Volo.Abp.AspNetCore.Authentication.OAuth.Tests/Volo.Abp.AspNetCore.Authentication.OAuth.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Authentication.OAuth.Tests/Volo.Abp.AspNetCore.Authentication.OAuth.Tests.csproj index 0a3603d7c0..14db1989b9 100644 --- a/framework/test/Volo.Abp.AspNetCore.Authentication.OAuth.Tests/Volo.Abp.AspNetCore.Authentication.OAuth.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Authentication.OAuth.Tests/Volo.Abp.AspNetCore.Authentication.OAuth.Tests.csproj @@ -17,7 +17,7 @@ - + diff --git a/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo.Abp.AspNetCore.MultiTenancy.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo.Abp.AspNetCore.MultiTenancy.Tests.csproj index e5c8f6a398..88b6b60bc3 100644 --- a/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo.Abp.AspNetCore.MultiTenancy.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo.Abp.AspNetCore.MultiTenancy.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj index 200e8e45a4..e07798d4b9 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo.Abp.AspNetCore.Mvc.Tests.csproj @@ -20,7 +20,7 @@ - + diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests.csproj index f3976e2e1f..fcde227f3a 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Tests.csproj @@ -19,7 +19,7 @@ - + diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Dockerfile b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Dockerfile index b87da6d564..24db1701cb 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Dockerfile +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base WORKDIR /app EXPOSE 80 COPY bin/Release/publish . diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Modals.cshtml b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Modals.cshtml index ad2f4a602c..315d018146 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Modals.cshtml +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Components/Modals.cshtml @@ -34,7 +34,7 @@
Launch modal - + Woohoo, you're reading this text in a modal! @@ -45,16 +45,16 @@
-

-    <abp-button button-type="Primary" data-toggle="modal" data-target="#myModal">Launch modal</abp-button>
-
-    <abp-modal centered="true" size="Large" id="myModal">
-    <abp-modal-header title="Modal title"></abp-modal-header>
-    <abp-modal-body>
-    Woohoo, you're reading this text in a modal!
-    </abp-modal-body>
-    <abp-modal-footer buttons="@(AbpModalButtons.Save|AbpModalButtons.Close)"></abp-modal-footer>
-    </abp-modal>
+                

+    <abp-button button-type="Primary" data-toggle="modal" data-target="#myModal">Launch modal</abp-button>
+
+    <abp-modal centered="true" scrollable="true" size="Large" id="myModal">
+    <abp-modal-header title="Modal title"></abp-modal-header>
+    <abp-modal-body>
+    Woohoo, you're reading this text in a modal!
+    </abp-modal-body>
+    <abp-modal-footer buttons="@(AbpModalButtons.Save|AbpModalButtons.Close)"></abp-modal-footer>
+    </abp-modal>
 
@@ -66,7 +66,7 @@ <!-- Modal --> <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> - <div class="modal-dialog modal-dialog-centered modal-lg" role="document"> + <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="exampleModalLabel">Modal title</h5> diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj index e048ec5869..7fa17a9fe7 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.csproj @@ -8,8 +8,8 @@ - - + + diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json index 0291900d37..92d5d1caaf 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json @@ -3,7 +3,7 @@ "name": "asp.net", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "^4.0.1", + "@abp/aspnetcore.mvc.ui.theme.shared": "^4.1.0-rc.2", "highlight.js": "^9.13.1" }, "devDependencies": {} diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock index 09904a5e99..f72f8191b8 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock @@ -2,30 +2,30 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.shared@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.1.tgz#cd9d0eb11309c597dffd26277cd1bd7c5b1e0e2f" - integrity sha512-QGoCN/my0eAfa4tx5ytDxArIoz2i58jFFVUGso1Lekn54JvSt+WLz2p3uyTGatZ03Bp9836elhFnIopn12WvBw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~4.0.1" - "@abp/bootstrap" "~4.0.1" - "@abp/bootstrap-datepicker" "~4.0.1" - "@abp/datatables.net-bs4" "~4.0.1" - "@abp/font-awesome" "~4.0.1" - "@abp/jquery-form" "~4.0.1" - "@abp/jquery-validation-unobtrusive" "~4.0.1" - "@abp/lodash" "~4.0.1" - "@abp/luxon" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/select2" "~4.0.1" - "@abp/sweetalert" "~4.0.1" - "@abp/timeago" "~4.0.1" - "@abp/toastr" "~4.0.1" - -"@abp/aspnetcore.mvc.ui@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.1.tgz#6490c147a56e4f7055d2ca77f20baf1f60f56867" - integrity sha512-4B3icJrlpuZgMaX52ninyaenH7zLwepePEscDrLaFY9wyonKpZ2zh+xplnyM6vjNd+PhErWuA2+ssCswFhrJ3A== +"@abp/aspnetcore.mvc.ui.theme.shared@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.1.0-rc.2.tgz#d64cea1e504bcd3a08a1819025d40f3f84f0aadc" + integrity sha512-A/DRLwtJO7YCdqAgSF84wNRKjvGEQvcBocIwRxXCJEe3drxMoSwkAGjXQlxIYWZKdYbYUWDTjil2Mvwf91GUqg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~4.1.0-rc.2" + "@abp/bootstrap" "~4.1.0-rc.2" + "@abp/bootstrap-datepicker" "~4.1.0-rc.2" + "@abp/datatables.net-bs4" "~4.1.0-rc.2" + "@abp/font-awesome" "~4.1.0-rc.2" + "@abp/jquery-form" "~4.1.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~4.1.0-rc.2" + "@abp/lodash" "~4.1.0-rc.2" + "@abp/luxon" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/select2" "~4.1.0-rc.2" + "@abp/sweetalert" "~4.1.0-rc.2" + "@abp/timeago" "~4.1.0-rc.2" + "@abp/toastr" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.1.0-rc.2.tgz#54bf30def590e6d25fc35f77253888f3d9f74b9c" + integrity sha512-eOh5IBn4eNAjj2i6tlLRIV/r61Ef7+Z3PNvGgdml/XCo50el4G9XE7shxuGOY+MaFMfmsST2tcJlO9iAo9n2Yw== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -36,145 +36,145 @@ micromatch "^4.0.2" path "^0.12.7" -"@abp/bootstrap-datepicker@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.1.tgz#aad891263edff66f816e003ba4fa7f8acfe8e0b6" - integrity sha512-S0oaVZmXsDcOJLAyoGY0TvP/7bZx0GHIbU9BIhIL2Wl74HYaokjkTr6/IleIek9YeiF2vm9FkrUP1dKH/4f7Gg== +"@abp/bootstrap-datepicker@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.1.0-rc.2.tgz#d3fe863222a11771d366b1a3c246aaf34df94081" + integrity sha512-vn2xWAK3xqo5fMZJ9dOAZZmL+ZUnzZZNh3lF6uA97wTN/SbePlmHBYJpsCKIxOwbJS2HCvekHGJN/Ps4oEjlbw== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.1.tgz#3e41bdf9b3e9f8c497b9fafe22a4851d0401b31b" - integrity sha512-GoSaNWvswRHVoUrq7xClFQYtwqIlyS/vp/TdY+j5FFZP7ud89+ZGpdNqYqq5l9/6aaYa7v4b9mNTZ/1JRzAOYg== +"@abp/bootstrap@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.1.0-rc.2.tgz#b5132cf4c4c92fe833823cf2b91ab1b0167b0ecf" + integrity sha512-SsWEV0DveBIHiG051E6aBB371D15QIsGeo+POFhvQUvrlmzMBlFCAlmH0ef8w1n+3M3C37irCgEGKctt2pbcxQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" bootstrap "^4.5.0" bootstrap-v4-rtl "4.4.1-2" -"@abp/core@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.1.tgz#1df32bc058f45571605670ca81c226a1bd87400c" - integrity sha512-8UT5lwqV/luVG/SxePSTD2FRbZXwXv3cZJKjw+gpBjhD0slWrh51XEOHsM8ciTuhcvV/tsqVU9nXckDMdO58fw== +"@abp/core@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.1.0-rc.2.tgz#d306106a53fa56109751be0099785c94f43be56f" + integrity sha512-b0mOYSz8hNgZ/hBeYg8hkthJgE8CLyHNa2NcythPoIW8RR5qHmDtGoFnuFovLvLk7r+M4NWyxXRKEshSszIPyA== dependencies: - "@abp/utils" "^4.0.1" + "@abp/utils" "^4.1.0-rc.2" -"@abp/datatables.net-bs4@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.1.tgz#7538baad0eff24eca7f4246d020852f83139f645" - integrity sha512-S52jNPF4if68V+P/33NrtGPJXf6xrqgyZzz9b7qBR7HuUm3Nsn7bAslh3JNduNec/sFuE4Utl/xsFHZNjBWEog== +"@abp/datatables.net-bs4@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.1.0-rc.2.tgz#99aa1fbad91939fc23265324a3d8a45d0c1e5a7a" + integrity sha512-Y9UyqniOkx5DJO+2GGurnQE1yfRmGaQ3y7V07gKWRq+gHLUhE+vfgOLVpGM6ufdTIbLvVw5Ng+3gfOmPlUnpxg== dependencies: - "@abp/datatables.net" "~4.0.1" + "@abp/datatables.net" "~4.1.0-rc.2" datatables.net-bs4 "^1.10.21" -"@abp/datatables.net@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.1.tgz#eb89716a37351c41b5bccfc2db88fc7ceb991a26" - integrity sha512-APFLui0w8MqsBWqP/K0QkT5cBq5SsWiqMaIGTXQKinMVLV597sUszrlhe1ISU2PqeD7iX6pCZNNOTI1NEUn9/Q== +"@abp/datatables.net@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.1.0-rc.2.tgz#1a134688259d32187d822d8a49c7a68b4cc226c7" + integrity sha512-9o5g8s7ZTlThd1FMFmO7wS+MxmXgUMmiWx7Hwara9ypfJPd0vanz10bQAdTpLiDy/aa0tUmz0xOVj73yvBJm9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" datatables.net "^1.10.21" -"@abp/font-awesome@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.1.tgz#8a9d83b2c2adfcd5abcbd9c31c315460d44a321e" - integrity sha512-+6+m/DKMnfkeQiWUsMlB6Da8u6yREyN2oQYGYhSRAK8419ym8RHHrqKJv2AClI4iLq2ppHZj8WF84+SeoCekRg== +"@abp/font-awesome@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.1.0-rc.2.tgz#ecf490861c09250cf61611ac74cec5ab4392e807" + integrity sha512-6yAsf/ee2hdrHHUACql8c3gY54Hd7YAK2olHymyc3Io2hhK2VxXRc2W2oRSwbQ9GsSE+XDrEVtjIR64nBseTeg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" "@fortawesome/fontawesome-free" "^5.13.0" -"@abp/jquery-form@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.1.tgz#6dc1922b2800dd635f20881a82e08104a1dd1bb5" - integrity sha512-JMBZYu/MI/GjaLTBOMB5iv8cagnLpReDULNC3r6tLNNqB1R8f3Cg1T7nF4YCuU9SYMqis1P/AuE4oEh+4rQdAQ== +"@abp/jquery-form@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.1.0-rc.2.tgz#76dff67a3fe6e6ad7bd60bb909de93c09966cc0a" + integrity sha512-LGafwxyRYUbHQlJ9pPbYdkVqzdT/y1Fp4Nr4C3W5jxsJuaSICl0RPkRHIPALeoqbpEWuj6dVep6ZuO9hhxBzNw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.1.tgz#4142ca31c0830fe24a1467e8cf13b55ba9d7c1dd" - integrity sha512-rdSRTcdKCHmarbrVgmPYdTiJ0G/aFKd+dr0krO7fALPTuQKChbDnHOO4/JvQSc+cd9faxa8c6ZWvlHdsof23tQ== +"@abp/jquery-validation-unobtrusive@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.1.0-rc.2.tgz#1f1d395cfa47740d47303ff512592ff1993f9e13" + integrity sha512-0LXWvgfyLHVw7qRVOmY0rfVlq+yJq/nhbcVoYK+QbmKnrFu+KZg0KNMOD8wTXs8mZ1EKGQpoQKWxImtCnGrV/A== dependencies: - "@abp/jquery-validation" "~4.0.1" + "@abp/jquery-validation" "~4.1.0-rc.2" jquery-validation-unobtrusive "^3.2.11" -"@abp/jquery-validation@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.1.tgz#74e7d795468c6986f2db15662631fcd4f67c679e" - integrity sha512-FX26aQCsMBdVWAJb7S37Lt7KoHAEHoYguh/qfZIARCpOYOOWvxfDz1wTrmADUkqdillqEiCeD/Imj8bYH9Faaw== +"@abp/jquery-validation@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.1.0-rc.2.tgz#ad4b464fd0133eab8d08c781c7d7c4e00bc4918d" + integrity sha512-iLTobfwqDk7iiQxvv5UowxOKywsh/77VlAVktstnFG3N3Y73+JYKzM0mGM/j4zM1OrjbF9/cnPnDVX7bATPz9w== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-validation "^1.19.2" -"@abp/jquery@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.1.tgz#aa554accb16600fd586c3a4f088040cd26d0bde8" - integrity sha512-MtiRKOLyjEWux+whPP3+zwPbpj8or756JtgjnwOTDB9tp9HLCYUaskt+oalYPvob24nDZcNu2RnMALYdCVhZAQ== +"@abp/jquery@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.1.0-rc.2.tgz#0f64cad5b1ae3e47d2344e5fb30c347b89d6d2bb" + integrity sha512-YubZwMJIN+UcfxfUlt3usfcLMG9WcXNpemUsdBtlKNzti562KZMIHPFLRL+DsiqvzZ74h2PxSWWsxS42Z7z0Yw== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" jquery "~3.5.1" -"@abp/lodash@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.1.tgz#ec261ccaab8a70d5b32a8a7c22387e48936d38d4" - integrity sha512-Dav1QKbBeGR4VVbHHe1s3OEzN7wnb9K/vwzHrWmtO8D1Q5Z3433xjNmgL5VQ9gfxXqooSfEO4gAovZklMDHDew== +"@abp/lodash@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.1.0-rc.2.tgz#9281c641ab7b7b33e7acf12815dc461e7ae967b9" + integrity sha512-RqdekrAyLPaLNJddmrq89EdrI1xg4296tOafFLHvirgRWisJTIa9bflTOwMwEg9FNdLJgA0zHi4WdAMer0qZdA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" lodash "^4.17.15" -"@abp/luxon@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.1.tgz#a540750b1605dbac856ce9c2e776c2fecf6392f9" - integrity sha512-eRumVB7UIf2XH6OZVUTvcKw0A/OSAfYV59fM+Wc4dAkNcmsNZI0gD1o0AigSGNCxTV6v+W2bFrsuooSqK99Y0Q== +"@abp/luxon@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.1.0-rc.2.tgz#78fc1cf651d7c19b87a31823cd3ce68961d6b1e6" + integrity sha512-U4e9uGZlg9xj9tBNP337v3wiaSR6qxWsBgh/duQGWrqV+75LlQjYcZaPoXDidUUS6U6epDSR2pc2T39rahcgSQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" luxon "^1.24.1" -"@abp/malihu-custom-scrollbar-plugin@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.1.tgz#0a556423a67b6c949e32ffcacd72256dea6c31ee" - integrity sha512-YTwYpnQ1ZrON70gvJcnNZRwB3Ze4olGcXxiPvmRgSHbGJkSnHYJiP6PvsN1F3HDFukAJ/iUu+WwEe8OBwlyLXA== +"@abp/malihu-custom-scrollbar-plugin@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.1.0-rc.2.tgz#36553e71052cad9734e0c9b2c65759e538468648" + integrity sha512-JQ6PCcj5qmF9MxNRPAsKHHnqBPCdn4lQnwxZrHcG9tD70Gx+NfC4UH41tqXI+htba4k0PHRyH2y39Q1iJm0NFA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.1.tgz#8983e7b5c3afb862f08b2730b70e59d726e9b5d5" - integrity sha512-WdzY2hvsS/4vz/VXpxq2muSzzE8ggchiIrICy/WKchJxL9L08DM796t6aE6rEl9wucY8XEzzWrPOVqAjJmnXFA== +"@abp/select2@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.1.0-rc.2.tgz#c48e865f401ddce32dff2a7a14ae07c4bde2f57b" + integrity sha512-YYK/SIqXQcSDQFMVg/ogohc76d4JDrOVQEbzfkNNI5bKVJo+hkqtNzAwV9FLdPZZNw15QMv0eF1ie4aUtIxyaA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.1.tgz#0088610915ad6db0a140b77832a37c10066eb4ee" - integrity sha512-t4/44oQCMngSjVqmeRWXwrXa/pRKc3CEpyyTiGIXki4dWJ21j0ePCw2l3rvOJWnpoCznhxa/UGxLfRfK1NEzRg== +"@abp/sweetalert@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.1.0-rc.2.tgz#cdcaf8e9a33cf218a687fd6a42cfe1c85d89c6b7" + integrity sha512-sjQd8TF9oUnaQ1OPTGdVyAfWqSZEk4bRbC/qw2CouEOfRLatzkC0JcmzFLN0f5N1am1RQwkFakpENKH7NqTCvg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" sweetalert "^2.1.2" -"@abp/timeago@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.1.tgz#8c161645534eb1f62fe4607450acf7345729e711" - integrity sha512-PsPobV79U2qzVY+WBsmJM1ohSF4jqcLnL4/7qyJvxlb1WwbCl1F5D4cpiJP4zsM4clPW4mbSsiauMNp+HTNKEA== +"@abp/timeago@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.1.0-rc.2.tgz#445d043ae482b76799b496ae6565abfaf75a34b9" + integrity sha512-wWx56EZMUGIfqJV5JLCvUp4RVhKXHYLQaVNQSF8E05COXmSQwFThVS7vbuiODFp2BGm6RAqCVtZDCreu2B8z9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.1.tgz#ecb6f6193b7edc3150d0614ab9457472baf1cce3" - integrity sha512-bTTz0O8zj7fMhdoummP2Ed5Z8SJTmR6svzNchBXNDrnRAcDQvTihPTcg0UpH8BEDFczbLowq09CG2A/RMSJoug== +"@abp/toastr@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.1.0-rc.2.tgz#1af16fa8687201b6b9c7229d087a4233998703b9" + integrity sha512-g+Jl5H1ZHoJ4JwWuix0xA+GMFY42pwq8WYjxP6qE2/Y2aixYHVIui15eBqF2L06yXOt53YFcC1+pxjrp91xHxw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" toastr "^2.1.4" -"@abp/utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" - integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== +"@abp/utils@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.2.tgz#eb6dbf0ee493d0f050b37347d2d6d283098aedae" + integrity sha512-V2k5I89lVBoeGIKgg4p2H9GlMAcDWbctwKZPVwBEMVEVm1uTR2xQAWdTdSFd5Q8I8Xsf/aIG8ELM7l5j2h7/zQ== dependencies: just-compare "^1.3.0" diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo.Abp.AspNetCore.Mvc.UI.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo.Abp.AspNetCore.Mvc.UI.Tests.csproj index babe8a4650..ceed18107e 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo.Abp.AspNetCore.Mvc.UI.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Tests/Volo.Abp.AspNetCore.Mvc.UI.Tests.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.csproj index f3a7ddacf4..fb39407b4b 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.csproj @@ -15,8 +15,8 @@ - - + + diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json index 7316ef9a28..1dfec0865a 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json @@ -3,8 +3,8 @@ "name": "asp.net", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.1", - "@abp/prismjs": "^4.0.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^4.1.0-rc.2", + "@abp/prismjs": "^4.1.0-rc.2" }, "devDependencies": {} } \ No newline at end of file diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock index f34083e159..60908eb854 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.1.tgz#ce8e3eb830a8e8f9eecb1a3b3bd70c2832fdf15e" - integrity sha512-w+ZG8Ewx9wWfbvRC2MAjJl+rXuXSHLhhGOiJTk68unWLNziDtNQzcSXG/Z5c1hA+acJSGqDoJGEGs4FVM136og== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.1.tgz#cd9d0eb11309c597dffd26277cd1bd7c5b1e0e2f" - integrity sha512-QGoCN/my0eAfa4tx5ytDxArIoz2i58jFFVUGso1Lekn54JvSt+WLz2p3uyTGatZ03Bp9836elhFnIopn12WvBw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~4.0.1" - "@abp/bootstrap" "~4.0.1" - "@abp/bootstrap-datepicker" "~4.0.1" - "@abp/datatables.net-bs4" "~4.0.1" - "@abp/font-awesome" "~4.0.1" - "@abp/jquery-form" "~4.0.1" - "@abp/jquery-validation-unobtrusive" "~4.0.1" - "@abp/lodash" "~4.0.1" - "@abp/luxon" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/select2" "~4.0.1" - "@abp/sweetalert" "~4.0.1" - "@abp/timeago" "~4.0.1" - "@abp/toastr" "~4.0.1" - -"@abp/aspnetcore.mvc.ui@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.1.tgz#6490c147a56e4f7055d2ca77f20baf1f60f56867" - integrity sha512-4B3icJrlpuZgMaX52ninyaenH7zLwepePEscDrLaFY9wyonKpZ2zh+xplnyM6vjNd+PhErWuA2+ssCswFhrJ3A== +"@abp/aspnetcore.mvc.ui.theme.basic@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.1.0-rc.2.tgz#b9462cbe36c41d68e2f44b79a3a2dba2c1b2b54a" + integrity sha512-KW3J6HnN1zZrCmrWmEcXBnGIOeuJDdp1jUECAm4Bdxi++VzfIbGlVvpcvUdT1E213reOUWi4dPhcej12DwrmDw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui.theme.shared@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.1.0-rc.2.tgz#d64cea1e504bcd3a08a1819025d40f3f84f0aadc" + integrity sha512-A/DRLwtJO7YCdqAgSF84wNRKjvGEQvcBocIwRxXCJEe3drxMoSwkAGjXQlxIYWZKdYbYUWDTjil2Mvwf91GUqg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~4.1.0-rc.2" + "@abp/bootstrap" "~4.1.0-rc.2" + "@abp/bootstrap-datepicker" "~4.1.0-rc.2" + "@abp/datatables.net-bs4" "~4.1.0-rc.2" + "@abp/font-awesome" "~4.1.0-rc.2" + "@abp/jquery-form" "~4.1.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~4.1.0-rc.2" + "@abp/lodash" "~4.1.0-rc.2" + "@abp/luxon" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/select2" "~4.1.0-rc.2" + "@abp/sweetalert" "~4.1.0-rc.2" + "@abp/timeago" "~4.1.0-rc.2" + "@abp/toastr" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.1.0-rc.2.tgz#54bf30def590e6d25fc35f77253888f3d9f74b9c" + integrity sha512-eOh5IBn4eNAjj2i6tlLRIV/r61Ef7+Z3PNvGgdml/XCo50el4G9XE7shxuGOY+MaFMfmsST2tcJlO9iAo9n2Yw== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,162 +43,162 @@ micromatch "^4.0.2" path "^0.12.7" -"@abp/bootstrap-datepicker@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.1.tgz#aad891263edff66f816e003ba4fa7f8acfe8e0b6" - integrity sha512-S0oaVZmXsDcOJLAyoGY0TvP/7bZx0GHIbU9BIhIL2Wl74HYaokjkTr6/IleIek9YeiF2vm9FkrUP1dKH/4f7Gg== +"@abp/bootstrap-datepicker@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.1.0-rc.2.tgz#d3fe863222a11771d366b1a3c246aaf34df94081" + integrity sha512-vn2xWAK3xqo5fMZJ9dOAZZmL+ZUnzZZNh3lF6uA97wTN/SbePlmHBYJpsCKIxOwbJS2HCvekHGJN/Ps4oEjlbw== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.1.tgz#3e41bdf9b3e9f8c497b9fafe22a4851d0401b31b" - integrity sha512-GoSaNWvswRHVoUrq7xClFQYtwqIlyS/vp/TdY+j5FFZP7ud89+ZGpdNqYqq5l9/6aaYa7v4b9mNTZ/1JRzAOYg== +"@abp/bootstrap@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.1.0-rc.2.tgz#b5132cf4c4c92fe833823cf2b91ab1b0167b0ecf" + integrity sha512-SsWEV0DveBIHiG051E6aBB371D15QIsGeo+POFhvQUvrlmzMBlFCAlmH0ef8w1n+3M3C37irCgEGKctt2pbcxQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" bootstrap "^4.5.0" bootstrap-v4-rtl "4.4.1-2" -"@abp/clipboard@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.0.1.tgz#aacbd02b6ce991ca20550ad7afc40e0cea247b5e" - integrity sha512-Q7Fe167pBJ/9Vp5RyVc/JejaIzNCdTgXcnZLNC7AEtaeBVCmLwsdnCYP3i32sdvX1AIgt3exhAAsHBt0deij/g== +"@abp/clipboard@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.1.0-rc.2.tgz#14802cefd81f3aa4a421523e4a8d71f06a7281a6" + integrity sha512-mUYqACe/Jh+GEGWaRfOblrKo/yJnNMmj2h3llDOpBzQj1HTuUCAOHBHpdq7SUPEuwQVxjOjDhBjYBKbqGbTKBQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" clipboard "^2.0.6" -"@abp/core@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.1.tgz#1df32bc058f45571605670ca81c226a1bd87400c" - integrity sha512-8UT5lwqV/luVG/SxePSTD2FRbZXwXv3cZJKjw+gpBjhD0slWrh51XEOHsM8ciTuhcvV/tsqVU9nXckDMdO58fw== +"@abp/core@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.1.0-rc.2.tgz#d306106a53fa56109751be0099785c94f43be56f" + integrity sha512-b0mOYSz8hNgZ/hBeYg8hkthJgE8CLyHNa2NcythPoIW8RR5qHmDtGoFnuFovLvLk7r+M4NWyxXRKEshSszIPyA== dependencies: - "@abp/utils" "^4.0.1" + "@abp/utils" "^4.1.0-rc.2" -"@abp/datatables.net-bs4@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.1.tgz#7538baad0eff24eca7f4246d020852f83139f645" - integrity sha512-S52jNPF4if68V+P/33NrtGPJXf6xrqgyZzz9b7qBR7HuUm3Nsn7bAslh3JNduNec/sFuE4Utl/xsFHZNjBWEog== +"@abp/datatables.net-bs4@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.1.0-rc.2.tgz#99aa1fbad91939fc23265324a3d8a45d0c1e5a7a" + integrity sha512-Y9UyqniOkx5DJO+2GGurnQE1yfRmGaQ3y7V07gKWRq+gHLUhE+vfgOLVpGM6ufdTIbLvVw5Ng+3gfOmPlUnpxg== dependencies: - "@abp/datatables.net" "~4.0.1" + "@abp/datatables.net" "~4.1.0-rc.2" datatables.net-bs4 "^1.10.21" -"@abp/datatables.net@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.1.tgz#eb89716a37351c41b5bccfc2db88fc7ceb991a26" - integrity sha512-APFLui0w8MqsBWqP/K0QkT5cBq5SsWiqMaIGTXQKinMVLV597sUszrlhe1ISU2PqeD7iX6pCZNNOTI1NEUn9/Q== +"@abp/datatables.net@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.1.0-rc.2.tgz#1a134688259d32187d822d8a49c7a68b4cc226c7" + integrity sha512-9o5g8s7ZTlThd1FMFmO7wS+MxmXgUMmiWx7Hwara9ypfJPd0vanz10bQAdTpLiDy/aa0tUmz0xOVj73yvBJm9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" datatables.net "^1.10.21" -"@abp/font-awesome@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.1.tgz#8a9d83b2c2adfcd5abcbd9c31c315460d44a321e" - integrity sha512-+6+m/DKMnfkeQiWUsMlB6Da8u6yREyN2oQYGYhSRAK8419ym8RHHrqKJv2AClI4iLq2ppHZj8WF84+SeoCekRg== +"@abp/font-awesome@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.1.0-rc.2.tgz#ecf490861c09250cf61611ac74cec5ab4392e807" + integrity sha512-6yAsf/ee2hdrHHUACql8c3gY54Hd7YAK2olHymyc3Io2hhK2VxXRc2W2oRSwbQ9GsSE+XDrEVtjIR64nBseTeg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" "@fortawesome/fontawesome-free" "^5.13.0" -"@abp/jquery-form@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.1.tgz#6dc1922b2800dd635f20881a82e08104a1dd1bb5" - integrity sha512-JMBZYu/MI/GjaLTBOMB5iv8cagnLpReDULNC3r6tLNNqB1R8f3Cg1T7nF4YCuU9SYMqis1P/AuE4oEh+4rQdAQ== +"@abp/jquery-form@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.1.0-rc.2.tgz#76dff67a3fe6e6ad7bd60bb909de93c09966cc0a" + integrity sha512-LGafwxyRYUbHQlJ9pPbYdkVqzdT/y1Fp4Nr4C3W5jxsJuaSICl0RPkRHIPALeoqbpEWuj6dVep6ZuO9hhxBzNw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.1.tgz#4142ca31c0830fe24a1467e8cf13b55ba9d7c1dd" - integrity sha512-rdSRTcdKCHmarbrVgmPYdTiJ0G/aFKd+dr0krO7fALPTuQKChbDnHOO4/JvQSc+cd9faxa8c6ZWvlHdsof23tQ== +"@abp/jquery-validation-unobtrusive@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.1.0-rc.2.tgz#1f1d395cfa47740d47303ff512592ff1993f9e13" + integrity sha512-0LXWvgfyLHVw7qRVOmY0rfVlq+yJq/nhbcVoYK+QbmKnrFu+KZg0KNMOD8wTXs8mZ1EKGQpoQKWxImtCnGrV/A== dependencies: - "@abp/jquery-validation" "~4.0.1" + "@abp/jquery-validation" "~4.1.0-rc.2" jquery-validation-unobtrusive "^3.2.11" -"@abp/jquery-validation@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.1.tgz#74e7d795468c6986f2db15662631fcd4f67c679e" - integrity sha512-FX26aQCsMBdVWAJb7S37Lt7KoHAEHoYguh/qfZIARCpOYOOWvxfDz1wTrmADUkqdillqEiCeD/Imj8bYH9Faaw== +"@abp/jquery-validation@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.1.0-rc.2.tgz#ad4b464fd0133eab8d08c781c7d7c4e00bc4918d" + integrity sha512-iLTobfwqDk7iiQxvv5UowxOKywsh/77VlAVktstnFG3N3Y73+JYKzM0mGM/j4zM1OrjbF9/cnPnDVX7bATPz9w== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-validation "^1.19.2" -"@abp/jquery@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.1.tgz#aa554accb16600fd586c3a4f088040cd26d0bde8" - integrity sha512-MtiRKOLyjEWux+whPP3+zwPbpj8or756JtgjnwOTDB9tp9HLCYUaskt+oalYPvob24nDZcNu2RnMALYdCVhZAQ== +"@abp/jquery@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.1.0-rc.2.tgz#0f64cad5b1ae3e47d2344e5fb30c347b89d6d2bb" + integrity sha512-YubZwMJIN+UcfxfUlt3usfcLMG9WcXNpemUsdBtlKNzti562KZMIHPFLRL+DsiqvzZ74h2PxSWWsxS42Z7z0Yw== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" jquery "~3.5.1" -"@abp/lodash@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.1.tgz#ec261ccaab8a70d5b32a8a7c22387e48936d38d4" - integrity sha512-Dav1QKbBeGR4VVbHHe1s3OEzN7wnb9K/vwzHrWmtO8D1Q5Z3433xjNmgL5VQ9gfxXqooSfEO4gAovZklMDHDew== +"@abp/lodash@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.1.0-rc.2.tgz#9281c641ab7b7b33e7acf12815dc461e7ae967b9" + integrity sha512-RqdekrAyLPaLNJddmrq89EdrI1xg4296tOafFLHvirgRWisJTIa9bflTOwMwEg9FNdLJgA0zHi4WdAMer0qZdA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" lodash "^4.17.15" -"@abp/luxon@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.1.tgz#a540750b1605dbac856ce9c2e776c2fecf6392f9" - integrity sha512-eRumVB7UIf2XH6OZVUTvcKw0A/OSAfYV59fM+Wc4dAkNcmsNZI0gD1o0AigSGNCxTV6v+W2bFrsuooSqK99Y0Q== +"@abp/luxon@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.1.0-rc.2.tgz#78fc1cf651d7c19b87a31823cd3ce68961d6b1e6" + integrity sha512-U4e9uGZlg9xj9tBNP337v3wiaSR6qxWsBgh/duQGWrqV+75LlQjYcZaPoXDidUUS6U6epDSR2pc2T39rahcgSQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" luxon "^1.24.1" -"@abp/malihu-custom-scrollbar-plugin@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.1.tgz#0a556423a67b6c949e32ffcacd72256dea6c31ee" - integrity sha512-YTwYpnQ1ZrON70gvJcnNZRwB3Ze4olGcXxiPvmRgSHbGJkSnHYJiP6PvsN1F3HDFukAJ/iUu+WwEe8OBwlyLXA== +"@abp/malihu-custom-scrollbar-plugin@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.1.0-rc.2.tgz#36553e71052cad9734e0c9b2c65759e538468648" + integrity sha512-JQ6PCcj5qmF9MxNRPAsKHHnqBPCdn4lQnwxZrHcG9tD70Gx+NfC4UH41tqXI+htba4k0PHRyH2y39Q1iJm0NFA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/prismjs@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.0.1.tgz#8e614878a9d1d63504fe7ba6b7d44093947d862b" - integrity sha512-qZP4TlQDiXaAIrDmpzQJeL/9mtTCxQCIbELDnBHMZFDrYNENOKZeBmvD9WAhgzL7FJcnPtOomJgZ5x2rqpBW/w== +"@abp/prismjs@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.1.0-rc.2.tgz#f49f51a036c36f0fb8b561913e16d46736c24470" + integrity sha512-9E5l1gAT73FZlfkv1dDEDPA2Cryy7hDQp0ahdIG57HRsKeUYhRODNo07cf2ev5RDgIQbm3iAcfe7YJubR5v8OQ== dependencies: - "@abp/clipboard" "~4.0.1" - "@abp/core" "~4.0.1" + "@abp/clipboard" "~4.1.0-rc.2" + "@abp/core" "~4.1.0-rc.2" prismjs "^1.20.0" -"@abp/select2@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.1.tgz#8983e7b5c3afb862f08b2730b70e59d726e9b5d5" - integrity sha512-WdzY2hvsS/4vz/VXpxq2muSzzE8ggchiIrICy/WKchJxL9L08DM796t6aE6rEl9wucY8XEzzWrPOVqAjJmnXFA== +"@abp/select2@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.1.0-rc.2.tgz#c48e865f401ddce32dff2a7a14ae07c4bde2f57b" + integrity sha512-YYK/SIqXQcSDQFMVg/ogohc76d4JDrOVQEbzfkNNI5bKVJo+hkqtNzAwV9FLdPZZNw15QMv0eF1ie4aUtIxyaA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.1.tgz#0088610915ad6db0a140b77832a37c10066eb4ee" - integrity sha512-t4/44oQCMngSjVqmeRWXwrXa/pRKc3CEpyyTiGIXki4dWJ21j0ePCw2l3rvOJWnpoCznhxa/UGxLfRfK1NEzRg== +"@abp/sweetalert@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.1.0-rc.2.tgz#cdcaf8e9a33cf218a687fd6a42cfe1c85d89c6b7" + integrity sha512-sjQd8TF9oUnaQ1OPTGdVyAfWqSZEk4bRbC/qw2CouEOfRLatzkC0JcmzFLN0f5N1am1RQwkFakpENKH7NqTCvg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" sweetalert "^2.1.2" -"@abp/timeago@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.1.tgz#8c161645534eb1f62fe4607450acf7345729e711" - integrity sha512-PsPobV79U2qzVY+WBsmJM1ohSF4jqcLnL4/7qyJvxlb1WwbCl1F5D4cpiJP4zsM4clPW4mbSsiauMNp+HTNKEA== +"@abp/timeago@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.1.0-rc.2.tgz#445d043ae482b76799b496ae6565abfaf75a34b9" + integrity sha512-wWx56EZMUGIfqJV5JLCvUp4RVhKXHYLQaVNQSF8E05COXmSQwFThVS7vbuiODFp2BGm6RAqCVtZDCreu2B8z9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.1.tgz#ecb6f6193b7edc3150d0614ab9457472baf1cce3" - integrity sha512-bTTz0O8zj7fMhdoummP2Ed5Z8SJTmR6svzNchBXNDrnRAcDQvTihPTcg0UpH8BEDFczbLowq09CG2A/RMSJoug== +"@abp/toastr@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.1.0-rc.2.tgz#1af16fa8687201b6b9c7229d087a4233998703b9" + integrity sha512-g+Jl5H1ZHoJ4JwWuix0xA+GMFY42pwq8WYjxP6qE2/Y2aixYHVIui15eBqF2L06yXOt53YFcC1+pxjrp91xHxw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" toastr "^2.1.4" -"@abp/utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" - integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== +"@abp/utils@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.2.tgz#eb6dbf0ee493d0f050b37347d2d6d283098aedae" + integrity sha512-V2k5I89lVBoeGIKgg4p2H9GlMAcDWbctwKZPVwBEMVEVm1uTR2xQAWdTdSFd5Q8I8Xsf/aIG8ELM7l5j2h7/zQ== dependencies: just-compare "^1.3.0" diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo.Abp.AspNetCore.Mvc.Versioning.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo.Abp.AspNetCore.Mvc.Versioning.Tests.csproj index 0296733111..76c3947566 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo.Abp.AspNetCore.Mvc.Versioning.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Versioning.Tests/Volo.Abp.AspNetCore.Mvc.Versioning.Tests.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.csproj index 09f3cf445f..9c96018145 100644 --- a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo.Abp.AspNetCore.Serilog.Tests.csproj @@ -10,8 +10,8 @@ - - + + diff --git a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/Serilog_Enrichers_Tests.cs b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/Serilog_Enrichers_Tests.cs index 77de765f51..7bea930a37 100644 --- a/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/Serilog_Enrichers_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.Serilog.Tests/Volo/Abp/AspNetCore/Serilog/Serilog_Enrichers_Tests.cs @@ -88,10 +88,10 @@ namespace Volo.Abp.AspNetCore.Serilog executedLogEvent.ShouldNotBeNull(); executedLogEvent.Properties.ContainsKey(_serilogOptions.EnricherPropertyNames.CorrelationId) - .ShouldNotBeNull(); + .ShouldBeTrue(); ((ScalarValue) executedLogEvent.Properties[_serilogOptions.EnricherPropertyNames.CorrelationId]).Value .ShouldBe(result); } } -} \ No newline at end of file +} diff --git a/framework/test/Volo.Abp.AspNetCore.SignalR.Tests/Volo.Abp.AspNetCore.SignalR.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.SignalR.Tests/Volo.Abp.AspNetCore.SignalR.Tests.csproj index 4a9e2cc67b..52a3fc5284 100644 --- a/framework/test/Volo.Abp.AspNetCore.SignalR.Tests/Volo.Abp.AspNetCore.SignalR.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.SignalR.Tests/Volo.Abp.AspNetCore.SignalR.Tests.csproj @@ -8,7 +8,7 @@ - + diff --git a/framework/test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.csproj index d04ae3f37b..ce64a53bb3 100644 --- a/framework/test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.csproj @@ -25,7 +25,7 @@ - + diff --git a/framework/test/Volo.Abp.Auditing.Tests/Volo.Abp.Auditing.Tests.csproj b/framework/test/Volo.Abp.Auditing.Tests/Volo.Abp.Auditing.Tests.csproj index 08eb55afb4..3692dd73d1 100644 --- a/framework/test/Volo.Abp.Auditing.Tests/Volo.Abp.Auditing.Tests.csproj +++ b/framework/test/Volo.Abp.Auditing.Tests/Volo.Abp.Auditing.Tests.csproj @@ -11,7 +11,7 @@ - + diff --git a/framework/test/Volo.Abp.Authorization.Tests/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions_Tests.cs b/framework/test/Volo.Abp.Authorization.Tests/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions_Tests.cs new file mode 100644 index 0000000000..e8876aaebf --- /dev/null +++ b/framework/test/Volo.Abp.Authorization.Tests/Microsoft/AspNetCore/Authorization/AbpAuthorizationServiceExtensions_Tests.cs @@ -0,0 +1,49 @@ +using Shouldly; +using Volo.Abp.AspNetCore.ExceptionHandling; +using Volo.Abp.Authorization; +using Volo.Abp.Localization; +using Xunit; + +namespace Microsoft.AspNetCore.Authorization +{ + public class AbpAuthorizationServiceExtensions_Tests : AuthorizationTestBase + { + private readonly IExceptionToErrorInfoConverter _exceptionToErrorInfoConverter; + + public AbpAuthorizationServiceExtensions_Tests() + { + _exceptionToErrorInfoConverter = GetRequiredService(); + } + + [Fact] + public void Test_AbpAuthorizationException_Localization() + { + using (CultureHelper.Use("zh-Hans")) + { + var exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGranted); + var errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false); + errorInfo.Message.ShouldBe("授权失败! 提供的策略尚未授予."); + + exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedWithPolicyName) + .WithData("PolicyName", "my_policy_name"); + errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false); + errorInfo.Message.ShouldBe("授权失败! 提供的策略尚未授予: my_policy_name"); + + exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenPolicyHasNotGrantedForGivenResource) + .WithData("ResourceName", "my_resource_name"); + errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false); + errorInfo.Message.ShouldBe("授权失败! 提供的策略未授予提供的资源: my_resource_name"); + + exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementHasNotGrantedForGivenResource) + .WithData("ResourceName", "my_resource_name"); + errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false); + errorInfo.Message.ShouldBe("授权失败! 提供的要求未授予提供的资源: my_resource_name"); + + exception = new AbpAuthorizationException(code: AbpAuthorizationErrorCodes.GivenRequirementsHasNotGrantedForGivenResource) + .WithData("ResourceName", "my_resource_name"); + errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false); + errorInfo.Message.ShouldBe("授权失败! 提供的要求未授予提供的资源: my_resource_name"); + } + } + } +} diff --git a/framework/test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.csproj b/framework/test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.csproj index 8361d8b9ad..279523610e 100644 --- a/framework/test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.csproj +++ b/framework/test/Volo.Abp.Authorization.Tests/Volo.Abp.Authorization.Tests.csproj @@ -12,9 +12,10 @@ + - + diff --git a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs index 492a36f8b9..69417e48c6 100644 --- a/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs +++ b/framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs @@ -2,12 +2,14 @@ using Volo.Abp.Authorization.TestServices; using Volo.Abp.Autofac; using Volo.Abp.DynamicProxy; +using Volo.Abp.ExceptionHandling; using Volo.Abp.Modularity; namespace Volo.Abp.Authorization { [DependsOn(typeof(AbpAutofacModule))] [DependsOn(typeof(AbpAuthorizationModule))] + [DependsOn(typeof(AbpExceptionHandlingModule))] public class AbpAuthorizationTestModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) @@ -22,4 +24,4 @@ namespace Volo.Abp.Authorization }); } } -} \ No newline at end of file +} diff --git a/framework/test/Volo.Abp.AutoMapper.Tests/Volo.Abp.AutoMapper.Tests.csproj b/framework/test/Volo.Abp.AutoMapper.Tests/Volo.Abp.AutoMapper.Tests.csproj index 36d1c41371..1f11e8fc34 100644 --- a/framework/test/Volo.Abp.AutoMapper.Tests/Volo.Abp.AutoMapper.Tests.csproj +++ b/framework/test/Volo.Abp.AutoMapper.Tests/Volo.Abp.AutoMapper.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/framework/test/Volo.Abp.Autofac.Tests/Volo.Abp.Autofac.Tests.csproj b/framework/test/Volo.Abp.Autofac.Tests/Volo.Abp.Autofac.Tests.csproj index 98ac012ef4..b2bc7f9f65 100644 --- a/framework/test/Volo.Abp.Autofac.Tests/Volo.Abp.Autofac.Tests.csproj +++ b/framework/test/Volo.Abp.Autofac.Tests/Volo.Abp.Autofac.Tests.csproj @@ -14,7 +14,7 @@ - + diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj index b7263e31f5..29e34d5019 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj @@ -13,7 +13,7 @@ - + diff --git a/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj index 35ed7def1b..b0f80716d6 100644 --- a/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj @@ -12,8 +12,8 @@ - - + + diff --git a/framework/test/Volo.Abp.BlobStoring.Aws.Tests/Volo.Abp.BlobStoring.Aws.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Aws.Tests/Volo.Abp.BlobStoring.Aws.Tests.csproj index ef6c0bf0e3..f6ceb67187 100644 --- a/framework/test/Volo.Abp.BlobStoring.Aws.Tests/Volo.Abp.BlobStoring.Aws.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Aws.Tests/Volo.Abp.BlobStoring.Aws.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/framework/test/Volo.Abp.BlobStoring.Aws.Tests/Volo/Abp/BlobStoring/Aws/AbpBlobStoringAwsTestModule.cs b/framework/test/Volo.Abp.BlobStoring.Aws.Tests/Volo/Abp/BlobStoring/Aws/AbpBlobStoringAwsTestModule.cs index d176a864e7..71a1cd8504 100644 --- a/framework/test/Volo.Abp.BlobStoring.Aws.Tests/Volo/Abp/BlobStoring/Aws/AbpBlobStoringAwsTestModule.cs +++ b/framework/test/Volo.Abp.BlobStoring.Aws.Tests/Volo/Abp/BlobStoring/Aws/AbpBlobStoringAwsTestModule.cs @@ -69,7 +69,7 @@ namespace Volo.Abp.BlobStoring.Aws private async Task DeleteBucketAsync(ApplicationShutdownContext context) { - var amazonS3Client = await context.ServiceProvider.GetService() + var amazonS3Client = await context.ServiceProvider.GetRequiredService() .GetAmazonS3Client(_configuration); if (await AmazonS3Util.DoesS3BucketExistV2Async(amazonS3Client, _randomContainerName)) @@ -89,4 +89,4 @@ namespace Volo.Abp.BlobStoring.Aws } } } -} \ No newline at end of file +} diff --git a/framework/test/Volo.Abp.BlobStoring.Azure.Tests/Volo.Abp.BlobStoring.Azure.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Azure.Tests/Volo.Abp.BlobStoring.Azure.Tests.csproj index de4fa933be..04d8328402 100644 --- a/framework/test/Volo.Abp.BlobStoring.Azure.Tests/Volo.Abp.BlobStoring.Azure.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Azure.Tests/Volo.Abp.BlobStoring.Azure.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.csproj index d388702a02..64fe63d66d 100644 --- a/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.FileSystem.Tests/Volo.Abp.BlobStoring.FileSystem.Tests.csproj @@ -11,7 +11,7 @@ - + diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj index 1d148054d5..81e435bc75 100644 --- a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj index cbcbfd9be8..07a2d93c43 100644 --- a/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Tests/Volo.Abp.BlobStoring.Tests.csproj @@ -11,7 +11,7 @@ - + diff --git a/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.csproj b/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.csproj index 69b6fef168..c0ef8e20df 100644 --- a/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.csproj +++ b/framework/test/Volo.Abp.Caching.StackExchangeRedis.Tests/Volo.Abp.Caching.StackExchangeRedis.Tests.csproj @@ -11,7 +11,7 @@ - + diff --git a/framework/test/Volo.Abp.Caching.Tests/Volo.Abp.Caching.Tests.csproj b/framework/test/Volo.Abp.Caching.Tests/Volo.Abp.Caching.Tests.csproj index c09ea42c9f..2817c9e8ea 100644 --- a/framework/test/Volo.Abp.Caching.Tests/Volo.Abp.Caching.Tests.csproj +++ b/framework/test/Volo.Abp.Caching.Tests/Volo.Abp.Caching.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/framework/test/Volo.Abp.Castle.Core.Tests/Volo.Abp.Castle.Core.Tests.csproj b/framework/test/Volo.Abp.Castle.Core.Tests/Volo.Abp.Castle.Core.Tests.csproj index f89cec35e3..f6abd917de 100644 --- a/framework/test/Volo.Abp.Castle.Core.Tests/Volo.Abp.Castle.Core.Tests.csproj +++ b/framework/test/Volo.Abp.Castle.Core.Tests/Volo.Abp.Castle.Core.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.Cli.Core.Tests/Volo.Abp.Cli.Core.Tests.csproj b/framework/test/Volo.Abp.Cli.Core.Tests/Volo.Abp.Cli.Core.Tests.csproj index 7ee53a3424..3f84090e0a 100644 --- a/framework/test/Volo.Abp.Cli.Core.Tests/Volo.Abp.Cli.Core.Tests.csproj +++ b/framework/test/Volo.Abp.Cli.Core.Tests/Volo.Abp.Cli.Core.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.Core.Tests/Volo.Abp.Core.Tests.csproj b/framework/test/Volo.Abp.Core.Tests/Volo.Abp.Core.Tests.csproj index 7e302e93d3..4f6a9cf08a 100644 --- a/framework/test/Volo.Abp.Core.Tests/Volo.Abp.Core.Tests.csproj +++ b/framework/test/Volo.Abp.Core.Tests/Volo.Abp.Core.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.Dapper.Tests/Volo.Abp.Dapper.Tests.csproj b/framework/test/Volo.Abp.Dapper.Tests/Volo.Abp.Dapper.Tests.csproj index 8132a7c368..0df7597d91 100644 --- a/framework/test/Volo.Abp.Dapper.Tests/Volo.Abp.Dapper.Tests.csproj +++ b/framework/test/Volo.Abp.Dapper.Tests/Volo.Abp.Dapper.Tests.csproj @@ -13,7 +13,7 @@ - + diff --git a/framework/test/Volo.Abp.Data.Tests/Volo.Abp.Data.Tests.csproj b/framework/test/Volo.Abp.Data.Tests/Volo.Abp.Data.Tests.csproj index 4c4f7b0531..010b48a785 100644 --- a/framework/test/Volo.Abp.Data.Tests/Volo.Abp.Data.Tests.csproj +++ b/framework/test/Volo.Abp.Data.Tests/Volo.Abp.Data.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.Ddd.Tests/Volo.Abp.Ddd.Tests.csproj b/framework/test/Volo.Abp.Ddd.Tests/Volo.Abp.Ddd.Tests.csproj index 21bd17719f..03926efb22 100644 --- a/framework/test/Volo.Abp.Ddd.Tests/Volo.Abp.Ddd.Tests.csproj +++ b/framework/test/Volo.Abp.Ddd.Tests/Volo.Abp.Ddd.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.csproj b/framework/test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.csproj index 81c6662cdf..fc51965340 100644 --- a/framework/test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.csproj +++ b/framework/test/Volo.Abp.Emailing.Tests/Volo.Abp.Emailing.Tests.csproj @@ -11,7 +11,7 @@ - + diff --git a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo.Abp.EntityFrameworkCore.Tests.csproj b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo.Abp.EntityFrameworkCore.Tests.csproj index 48a2863bcf..a19707983a 100644 --- a/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo.Abp.EntityFrameworkCore.Tests.csproj +++ b/framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo.Abp.EntityFrameworkCore.Tests.csproj @@ -16,7 +16,7 @@ - + diff --git a/framework/test/Volo.Abp.EventBus.Tests/Volo.Abp.EventBus.Tests.csproj b/framework/test/Volo.Abp.EventBus.Tests/Volo.Abp.EventBus.Tests.csproj index 31ba019431..b0fe6b5835 100644 --- a/framework/test/Volo.Abp.EventBus.Tests/Volo.Abp.EventBus.Tests.csproj +++ b/framework/test/Volo.Abp.EventBus.Tests/Volo.Abp.EventBus.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/framework/test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.csproj b/framework/test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.csproj index ed4b35cb0a..713b541431 100644 --- a/framework/test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.csproj +++ b/framework/test/Volo.Abp.Features.Tests/Volo.Abp.Features.Tests.csproj @@ -9,9 +9,10 @@ + - + diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestModule.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestModule.cs index 7b0927b80d..f5ff20e6f2 100644 --- a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestModule.cs +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/AbpFeaturesTestModule.cs @@ -1,10 +1,12 @@ using Volo.Abp.Autofac; +using Volo.Abp.ExceptionHandling; using Volo.Abp.Modularity; namespace Volo.Abp.Features { [DependsOn( typeof(AbpFeaturesModule), + typeof(AbpExceptionHandlingModule), typeof(AbpTestBaseModule), typeof(AbpAutofacModule) )] @@ -12,7 +14,7 @@ namespace Volo.Abp.Features { public override void ConfigureServices(ServiceConfigurationContext context) { - + } } } diff --git a/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureCheckerExtensions_Tests.cs b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureCheckerExtensions_Tests.cs new file mode 100644 index 0000000000..0df9548f3c --- /dev/null +++ b/framework/test/Volo.Abp.Features.Tests/Volo/Abp/Features/FeatureCheckerExtensions_Tests.cs @@ -0,0 +1,40 @@ +using Shouldly; +using Volo.Abp.AspNetCore.ExceptionHandling; +using Volo.Abp.Authorization; +using Volo.Abp.Localization; +using Xunit; + +namespace Volo.Abp.Features +{ + public class FeatureCheckerExtensions_Tests : FeatureTestBase + { + private readonly IExceptionToErrorInfoConverter _exceptionToErrorInfoConverter; + + public FeatureCheckerExtensions_Tests() + { + _exceptionToErrorInfoConverter = GetRequiredService(); + } + + [Fact] + public void Test_AbpAuthorizationException_Localization() + { + using (CultureHelper.Use("zh-Hans")) + { + var exception = new AbpAuthorizationException(code: AbpFeatureErrorCodes.FeatureIsNotEnabled) + .WithData("FeatureName", "my_feature_name"); + var errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false); + errorInfo.Message.ShouldBe("功能未启用: my_feature_name"); + + exception = new AbpAuthorizationException(code: AbpFeatureErrorCodes.AllOfTheseFeaturesMustBeEnabled) + .WithData("FeatureNames", "my_feature_name, my_feature_name2"); + errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false); + errorInfo.Message.ShouldBe("必要的功能未启用. 这些功能需要启用: my_feature_name, my_feature_name2"); + + exception = new AbpAuthorizationException(code: AbpFeatureErrorCodes.AtLeastOneOfTheseFeaturesMustBeEnabled) + .WithData("FeatureNames", "my_feature_name, my_feature_name2"); + errorInfo = _exceptionToErrorInfoConverter.Convert(exception, false); + errorInfo.Message.ShouldBe("必要的功能未启用. 需要启用这些功能中的一项:my_feature_name, my_feature_name2"); + } + } + } +} diff --git a/framework/test/Volo.Abp.FluentValidation.Tests/Volo.Abp.FluentValidation.Tests.csproj b/framework/test/Volo.Abp.FluentValidation.Tests/Volo.Abp.FluentValidation.Tests.csproj index 1a107db3e1..03f1dd72fe 100644 --- a/framework/test/Volo.Abp.FluentValidation.Tests/Volo.Abp.FluentValidation.Tests.csproj +++ b/framework/test/Volo.Abp.FluentValidation.Tests/Volo.Abp.FluentValidation.Tests.csproj @@ -11,7 +11,7 @@ - + diff --git a/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.csproj b/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.csproj index aa1e5d93dd..006e3a0c52 100644 --- a/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.csproj +++ b/framework/test/Volo.Abp.GlobalFeatures.Tests/Volo.Abp.GlobalFeatures.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.Http.Client.IdentityModel.Web.Tests/Volo.Abp.Http.Client.IdentityModel.Web.Tests.csproj b/framework/test/Volo.Abp.Http.Client.IdentityModel.Web.Tests/Volo.Abp.Http.Client.IdentityModel.Web.Tests.csproj index 1a000b7b07..9f0bcb2731 100644 --- a/framework/test/Volo.Abp.Http.Client.IdentityModel.Web.Tests/Volo.Abp.Http.Client.IdentityModel.Web.Tests.csproj +++ b/framework/test/Volo.Abp.Http.Client.IdentityModel.Web.Tests/Volo.Abp.Http.Client.IdentityModel.Web.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.csproj b/framework/test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.csproj index e1e8308e90..8183b3bab6 100644 --- a/framework/test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.csproj +++ b/framework/test/Volo.Abp.Http.Client.Tests/Volo.Abp.Http.Client.Tests.csproj @@ -11,7 +11,7 @@ - + diff --git a/framework/test/Volo.Abp.Http.Tests/Volo.Abp.Http.Tests.csproj b/framework/test/Volo.Abp.Http.Tests/Volo.Abp.Http.Tests.csproj index e5b4898396..0ebbe5968c 100644 --- a/framework/test/Volo.Abp.Http.Tests/Volo.Abp.Http.Tests.csproj +++ b/framework/test/Volo.Abp.Http.Tests/Volo.Abp.Http.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.Json.Tests/Volo.Abp.Json.Tests.csproj b/framework/test/Volo.Abp.Json.Tests/Volo.Abp.Json.Tests.csproj index fbc56e6ac2..6a16a8e8b9 100644 --- a/framework/test/Volo.Abp.Json.Tests/Volo.Abp.Json.Tests.csproj +++ b/framework/test/Volo.Abp.Json.Tests/Volo.Abp.Json.Tests.csproj @@ -8,7 +8,7 @@ - + diff --git a/framework/test/Volo.Abp.Ldap.Tests/Volo.Abp.Ldap.Tests.csproj b/framework/test/Volo.Abp.Ldap.Tests/Volo.Abp.Ldap.Tests.csproj index 245a776adf..04ff7b711c 100644 --- a/framework/test/Volo.Abp.Ldap.Tests/Volo.Abp.Ldap.Tests.csproj +++ b/framework/test/Volo.Abp.Ldap.Tests/Volo.Abp.Ldap.Tests.csproj @@ -8,7 +8,7 @@ - + diff --git a/framework/test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.csproj b/framework/test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.csproj index 4cf02e61c9..bb15c25801 100644 --- a/framework/test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.csproj +++ b/framework/test/Volo.Abp.Localization.Tests/Volo.Abp.Localization.Tests.csproj @@ -14,7 +14,7 @@ - + diff --git a/framework/test/Volo.Abp.MailKit.Tests/Volo.Abp.MailKit.Tests.csproj b/framework/test/Volo.Abp.MailKit.Tests/Volo.Abp.MailKit.Tests.csproj index 0296ddf8ef..8d538f116d 100644 --- a/framework/test/Volo.Abp.MailKit.Tests/Volo.Abp.MailKit.Tests.csproj +++ b/framework/test/Volo.Abp.MailKit.Tests/Volo.Abp.MailKit.Tests.csproj @@ -11,7 +11,7 @@ - + diff --git a/framework/test/Volo.Abp.MemoryDb.Tests/Volo.Abp.MemoryDb.Tests.csproj b/framework/test/Volo.Abp.MemoryDb.Tests/Volo.Abp.MemoryDb.Tests.csproj index 17d31643e0..214701d3dd 100644 --- a/framework/test/Volo.Abp.MemoryDb.Tests/Volo.Abp.MemoryDb.Tests.csproj +++ b/framework/test/Volo.Abp.MemoryDb.Tests/Volo.Abp.MemoryDb.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/framework/test/Volo.Abp.Minify.Tests/Volo.Abp.Minify.Tests.csproj b/framework/test/Volo.Abp.Minify.Tests/Volo.Abp.Minify.Tests.csproj index 9f91246546..46e06e0fcc 100644 --- a/framework/test/Volo.Abp.Minify.Tests/Volo.Abp.Minify.Tests.csproj +++ b/framework/test/Volo.Abp.Minify.Tests/Volo.Abp.Minify.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.csproj b/framework/test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.csproj index 3d0d708c22..c36fbb799c 100644 --- a/framework/test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.csproj +++ b/framework/test/Volo.Abp.MongoDB.Tests/Volo.Abp.MongoDB.Tests.csproj @@ -15,8 +15,8 @@ - - + + diff --git a/framework/test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.csproj b/framework/test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.csproj index 9bbf07d879..b02c8b2c37 100644 --- a/framework/test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.csproj +++ b/framework/test/Volo.Abp.MultiTenancy.Tests/Volo.Abp.MultiTenancy.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.ObjectExtending.Tests/Volo.Abp.ObjectExtending.Tests.csproj b/framework/test/Volo.Abp.ObjectExtending.Tests/Volo.Abp.ObjectExtending.Tests.csproj index 320f3cd6bb..8ea57adfdf 100644 --- a/framework/test/Volo.Abp.ObjectExtending.Tests/Volo.Abp.ObjectExtending.Tests.csproj +++ b/framework/test/Volo.Abp.ObjectExtending.Tests/Volo.Abp.ObjectExtending.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.ObjectMapping.Tests/Volo.Abp.ObjectMapping.Tests.csproj b/framework/test/Volo.Abp.ObjectMapping.Tests/Volo.Abp.ObjectMapping.Tests.csproj index 9d9dd5eb30..488a99daf8 100644 --- a/framework/test/Volo.Abp.ObjectMapping.Tests/Volo.Abp.ObjectMapping.Tests.csproj +++ b/framework/test/Volo.Abp.ObjectMapping.Tests/Volo.Abp.ObjectMapping.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.Security.Tests/Volo.Abp.Security.Tests.csproj b/framework/test/Volo.Abp.Security.Tests/Volo.Abp.Security.Tests.csproj index a64c89ac24..925c0e5b88 100644 --- a/framework/test/Volo.Abp.Security.Tests/Volo.Abp.Security.Tests.csproj +++ b/framework/test/Volo.Abp.Security.Tests/Volo.Abp.Security.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.Serialization.Tests/Volo.Abp.Serialization.Tests.csproj b/framework/test/Volo.Abp.Serialization.Tests/Volo.Abp.Serialization.Tests.csproj index d6f69ebbfa..d9b1e6c07d 100644 --- a/framework/test/Volo.Abp.Serialization.Tests/Volo.Abp.Serialization.Tests.csproj +++ b/framework/test/Volo.Abp.Serialization.Tests/Volo.Abp.Serialization.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj b/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj index 8791851953..fd377ba0c7 100644 --- a/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj +++ b/framework/test/Volo.Abp.Settings.Tests/Volo.Abp.Settings.Tests.csproj @@ -11,7 +11,7 @@ - + diff --git a/framework/test/Volo.Abp.Specifications.Tests/Volo.Abp.Specifications.Tests.csproj b/framework/test/Volo.Abp.Specifications.Tests/Volo.Abp.Specifications.Tests.csproj index 94442135e2..76e39c94d2 100644 --- a/framework/test/Volo.Abp.Specifications.Tests/Volo.Abp.Specifications.Tests.csproj +++ b/framework/test/Volo.Abp.Specifications.Tests/Volo.Abp.Specifications.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.TestApp.Tests/Volo.Abp.TestApp.Tests.csproj b/framework/test/Volo.Abp.TestApp.Tests/Volo.Abp.TestApp.Tests.csproj index 6d78929c51..2d9d056220 100644 --- a/framework/test/Volo.Abp.TestApp.Tests/Volo.Abp.TestApp.Tests.csproj +++ b/framework/test/Volo.Abp.TestApp.Tests/Volo.Abp.TestApp.Tests.csproj @@ -9,7 +9,7 @@ - + diff --git a/framework/test/Volo.Abp.TestApp/Volo.Abp.TestApp.csproj b/framework/test/Volo.Abp.TestApp/Volo.Abp.TestApp.csproj index 460b52ddc1..da91a4c179 100644 --- a/framework/test/Volo.Abp.TestApp/Volo.Abp.TestApp.csproj +++ b/framework/test/Volo.Abp.TestApp/Volo.Abp.TestApp.csproj @@ -14,7 +14,7 @@ - + diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj b/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj index ec9c188503..555c2934b0 100644 --- a/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj @@ -10,8 +10,9 @@ - - + + Always + @@ -19,7 +20,7 @@ - + diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory_Tests.cs b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory_Tests.cs new file mode 100644 index 0000000000..b1dba4bdb5 --- /dev/null +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/VirtualFiles/LocalizedTemplateContentReaderFactory_Tests.cs @@ -0,0 +1,59 @@ +using System.IO; +using System.Threading.Tasks; +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.Primitives; +using Shouldly; +using Volo.Abp.VirtualFileSystem; +using Xunit; + +namespace Volo.Abp.TextTemplating.VirtualFiles +{ + public class LocalizedTemplateContentReaderFactory_Tests: AbpTextTemplatingTestBase + { + private readonly ITemplateDefinitionManager _templateDefinitionManager; + + public LocalizedTemplateContentReaderFactory_Tests() + { + _templateDefinitionManager = GetRequiredService(); + } + + [Fact] + public async Task Create_Should_Work_With_PhysicalFileProvider() + { + var localizedTemplateContentReaderFactory = new LocalizedTemplateContentReaderFactory( + new PhysicalFileVirtualFileProvider( + new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), + @"Volo\Abp\TextTemplating\")))); + + var reader = await localizedTemplateContentReaderFactory.CreateAsync(_templateDefinitionManager.Get(TestTemplates.WelcomeEmail)); + + reader.GetContentOrNull("en").ShouldBe("Welcome {{model.name}} to the abp.io!"); + reader.GetContentOrNull("tr").ShouldBe("Merhaba {{model.name}}, abp.io'ya hoşgeldiniz!"); + } + + class PhysicalFileVirtualFileProvider : IVirtualFileProvider + { + private readonly PhysicalFileProvider _physicalFileProvider; + + public PhysicalFileVirtualFileProvider(PhysicalFileProvider physicalFileProvider) + { + _physicalFileProvider = physicalFileProvider; + } + + public IFileInfo GetFileInfo(string subpath) + { + return _physicalFileProvider.GetFileInfo(subpath); + } + + public IDirectoryContents GetDirectoryContents(string subpath) + { + return _physicalFileProvider.GetDirectoryContents(subpath); + } + + public IChangeToken Watch(string filter) + { + return _physicalFileProvider.Watch(filter); + } + } + } +} diff --git a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContributor_Tests.cs b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContributor_Tests.cs index da2d4179de..e5c7138118 100644 --- a/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContributor_Tests.cs +++ b/framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContributor_Tests.cs @@ -4,46 +4,42 @@ using Xunit; namespace Volo.Abp.TextTemplating.VirtualFiles { - //TODO: Make tests running again! - //public class VirtualFileTemplateContributor_Tests : AbpTextTemplatingTestBase - //{ - // [Fact] - // public async Task Should_Get_Localized_Content_By_Culture() - // { - // var contributor = new VirtualFileTemplateContentContributor( - // "/SampleTemplates/WelcomeEmail" - // ); + public class VirtualFileTemplateContributor_Tests : AbpTextTemplatingTestBase + { + private readonly ITemplateDefinitionManager _templateDefinitionManager; + private readonly VirtualFileTemplateContentContributor _virtualFileTemplateContentContributor; - // contributor.Initialize( - // new TemplateContentContributorInitializationContext( - // new TemplateDefinition("Test"), - // ServiceProvider - // ) - // ); + public VirtualFileTemplateContributor_Tests() + { + _templateDefinitionManager = GetRequiredService(); + _virtualFileTemplateContentContributor = GetRequiredService(); + } - // (await contributor - // .GetOrNullAsync("en")).ShouldBe("Welcome {{model.name}} to the abp.io!"); + [Fact] + public async Task Should_Get_Localized_Content_By_Culture() + { + (await _virtualFileTemplateContentContributor.GetOrNullAsync( + new TemplateContentContributorContext(_templateDefinitionManager.Get(TestTemplates.WelcomeEmail), + ServiceProvider, + "en"))) + .ShouldBe("Welcome {{model.name}} to the abp.io!"); - // (await contributor - // .GetOrNullAsync("tr")).ShouldBe("Merhaba {{model.name}}, abp.io'ya hoşgeldiniz!"); - // } + (await _virtualFileTemplateContentContributor.GetOrNullAsync( + new TemplateContentContributorContext(_templateDefinitionManager.Get(TestTemplates.WelcomeEmail), + ServiceProvider, + "tr"))) + .ShouldBe("Merhaba {{model.name}}, abp.io'ya hoşgeldiniz!"); + } - // [Fact] - // public async Task Should_Get_Non_Localized_Template_Content() - // { - // var contributor = new VirtualFileTemplateContentContributor( - // "/SampleTemplates/ForgotPasswordEmail.tpl" - // ); - - // contributor.Initialize( - // new TemplateContentContributorInitializationContext( - // new TemplateDefinition("Test"), - // ServiceProvider - // ) - // ); - - // (await contributor - // .GetOrNullAsync()).ShouldBe("{{l \"HelloText\"}}. Please click to the following link to get an email to reset your password!"); - // } - //} + [Fact] + public async Task Should_Get_Non_Localized_Template_Content() + { + (await _virtualFileTemplateContentContributor.GetOrNullAsync( + new TemplateContentContributorContext( + _templateDefinitionManager.Get(TestTemplates.ForgotPasswordEmail), + ServiceProvider, + null))) + .ShouldBe("{{L \"HelloText\" model.name}}, {{L \"HowAreYou\" }}. Please click to the following link to get an email to reset your password!"); + } + } } diff --git a/framework/test/Volo.Abp.UI.Navigation.Tests/Volo.Abp.UI.Navigation.Tests.csproj b/framework/test/Volo.Abp.UI.Navigation.Tests/Volo.Abp.UI.Navigation.Tests.csproj index 56f9a7bb5c..ecfd73c615 100644 --- a/framework/test/Volo.Abp.UI.Navigation.Tests/Volo.Abp.UI.Navigation.Tests.csproj +++ b/framework/test/Volo.Abp.UI.Navigation.Tests/Volo.Abp.UI.Navigation.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.Uow.Tests/Volo.Abp.Uow.Tests.csproj b/framework/test/Volo.Abp.Uow.Tests/Volo.Abp.Uow.Tests.csproj index 08221039c8..4c74ef648c 100644 --- a/framework/test/Volo.Abp.Uow.Tests/Volo.Abp.Uow.Tests.csproj +++ b/framework/test/Volo.Abp.Uow.Tests/Volo.Abp.Uow.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/framework/test/Volo.Abp.Validation.Tests/Volo.Abp.Validation.Tests.csproj b/framework/test/Volo.Abp.Validation.Tests/Volo.Abp.Validation.Tests.csproj index a663b56646..b3cdf247be 100644 --- a/framework/test/Volo.Abp.Validation.Tests/Volo.Abp.Validation.Tests.csproj +++ b/framework/test/Volo.Abp.Validation.Tests/Volo.Abp.Validation.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj index da6d0c0fa5..df20ffa678 100644 --- a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj +++ b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo.Abp.VirtualFileSystem.Tests.csproj @@ -15,8 +15,8 @@ - - + + diff --git a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs index aae01ff912..e453c5ee96 100644 --- a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs +++ b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs @@ -33,7 +33,7 @@ namespace Volo.Abp.VirtualFileSystem Encoding.UTF8.GetString(stream.GetAllBytes()).ShouldBe("//jquery-3-1-1-min.js-contents"); } } - + [Fact] public void Should_Define_And_Get_Embedded_Resources_With_Special_Chars() { @@ -57,10 +57,10 @@ namespace Volo.Abp.VirtualFileSystem var contents = _virtualFileProvider.GetDirectoryContents("/js"); //Assert - contents.Exists.ShouldNotBeNull(); + contents.Exists.ShouldBeTrue(); var contentList = contents.ToList(); - + contentList.ShouldContain(x => x.Name == "jquery-3-1-1-min.js"); contentList.ShouldContain(x => x.Name == "my{test}.2.9.min.js"); } @@ -74,7 +74,7 @@ namespace Volo.Abp.VirtualFileSystem var contents = _virtualFileProvider.GetDirectoryContents(path); //Assert - contents.Exists.ShouldNotBeNull(); + contents.Exists.ShouldBeTrue(); var contentList = contents.ToList(); contentList.ShouldContain(x => x.Name == "js"); diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.csproj b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.csproj index f55d41a23e..d6b87b957d 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.csproj +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo.Abp.Account.Application.Contracts.csproj @@ -21,7 +21,7 @@ - + diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ar.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ar.json index 97d9e4d95d..e6c052d09e 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ar.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/ar.json @@ -44,7 +44,7 @@ "LoggedOutTitle": "تسجيل الخروج", "LoggedOutText": "لقد تم تسجيل خروجك وستتم إعادة توجيهك قريبًا.", "ReturnToText": "انقر هنا لإعادة التوجيه إلى {0}", - "OrLoginWith": "أو الدخول بـ", + "OrLoginWith": "أو الدخول بـ:", "ForgotPassword": "نسيت كلمة السر؟", "SendPasswordResetLink_Information": "سيتم إرسال رابط إعادة تعيين كلمة المرور إلى بريدك الإلكتروني لإعادة تعيين كلمة المرور الخاصة بك. إذا لم تتلق رسالة بريد إلكتروني في غضون بضع دقائق ، فيرجى إعادة المحاولة.", "PasswordResetMailSentMessage": "تم إرسال بريد إلكتروني لاسترداد الحساب إلى عنوان بريدك الإلكتروني. إذا كنت لا ترى هذا البريد الإلكتروني في علبة الوارد الخاصة بك في غضون 15 دقيقة ، فابحث عنه في مجلد البريد غير الهام. إذا وجدته هناك ، فيرجى وضع علامة عليه كـ -ليس غير هام-.", @@ -55,4 +55,4 @@ "GoToTheApplication": "اذهب إلى التطبيق", "BackToLogin": "العودة إلى تسجيل الدخول" } -} \ No newline at end of file +} diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/de-DE.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/de-DE.json index 9a5b7314e1..714e7f69c2 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/de-DE.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/de-DE.json @@ -44,7 +44,7 @@ "LoggedOutTitle": "Abgemeldet", "LoggedOutText": "Sie wurden abgemeldet und werden bald weitergeleitet.", "ReturnToText": "Klicken Sie hier, um zu {0} umzuleiten", - "OrLoginWith": "Oder melden Sie sich an mit;", + "OrLoginWith": "Oder melden Sie sich an mit:", "ForgotPassword": "Passwort vergessen?", "SendPasswordResetLink_Information": "Ein Link zum Zurücksetzen des Passworts wird an Ihre E-Mail gesendet. Wenn Sie innerhalb weniger Minuten keine E-Mail erhalten, versuchen Sie es erneut.", "PasswordResetMailSentMessage": "E-Mail zur Kontowiederherstellung an Ihre E-Mail-Adresse gesendet. Wenn Sie diese E-Mail nicht innerhalb von 15 Minuten in Ihrem Posteingang sehen, suchen Sie sie in Ihrem Junk-Mail-Ordner. Wenn Sie es dort finden, markieren Sie es bitte als -Kein Junk-. ", @@ -59,4 +59,4 @@ "ReturnToApplication": "Zur Anwendung zurückkehren", "Volo.Account:InvalidEmailAddress": "Die angegebene E-Mail-Adresse kann nicht gefunden werden: {0}" } -} \ No newline at end of file +} diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json index db38b70309..e7cdc64c43 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/en.json @@ -44,7 +44,7 @@ "LoggedOutTitle": "Signed Out", "LoggedOutText": "You have been signed out and you will be redirected soon.", "ReturnToText": "Click here to redirect to {0}", - "OrLoginWith": "Or login with;", + "OrLoginWith": "Or login with:", "ForgotPassword": "Forgot password?", "SendPasswordResetLink_Information": "A password reset link will be sent to your email to reset your password. If you don't get an email within a few minutes, please re-try.", "PasswordResetMailSentMessage": "Account recovery email sent to your e-mail address. If you don't see this email in your inbox within 15 minutes, look for it in your junk mail folder. If you find it there, please mark it as -Not Junk-. ", diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es.json index 9ca4d954b4..5f7d824ca0 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/es.json @@ -44,7 +44,7 @@ "LoggedOutTitle": "Sesión cerrada", "LoggedOutText": "La sesión ha sido cerrada y serás redireccionado en breve.", "ReturnToText": "Haz click aquí para redirigirte a {0}", - "OrLoginWith": "O inicia sesión con;", + "OrLoginWith": "O inicia sesión con:", "ForgotPassword": "¿Olvidaste la contraseña?", "SendPasswordResetLink_Information": "Un link para resetear la contraseña será enviado a tu e-mail. Si no recibes el e-mail en unos minutos, por favor re-intenta.", "PasswordResetMailSentMessage": "Un e-mail para recuperar la cuenta ha sido enviado a tu e-mail. Si no recibes el e-mail en unos minutos, por favor re-intentalo.", @@ -59,4 +59,4 @@ "ReturnToApplication": "Volver a la aplicación", "Volo.Account:InvalidEmailAddress": "No se puede encontrar la dirección de e-mail solicitada: {0}" } -} \ No newline at end of file +} diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fr.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fr.json index 100a71bb05..1469c7619d 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fr.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/fr.json @@ -44,7 +44,7 @@ "LoggedOutTitle": "Se déconnecter", "LoggedOutText": "Vous avez été déconnecté et vous serez bientôt redirigé.", "ReturnToText": "Cliquez ici pour rediriger vers {0}", - "OrLoginWith": "Ou connectez-vous avec;", + "OrLoginWith": "Ou connectez-vous avec:", "ForgotPassword": "Vous avez oublié le mot de passe ?", "SendPasswordResetLink_Information": "Un lien de réinitialisation du mot de passe sera envoyé à votre adresse e-mail pour réinitialiser votre mot de passe. Si vous ne recevez pas d'e-mail dans quelques minutes, veuillez réessayer.", "PasswordResetMailSentMessage": "E-mail de récupération de compte envoyé à votre adresse e-mail. Si vous ne voyez pas cet e-mail dans votre boîte de réception dans les 15 minutes, recherchez-le dans votre dossier de courrier indésirable. Si vous le trouvez là-bas, veuillez le marquer comme -Pas indésirable-.", @@ -57,4 +57,4 @@ "ProfileTab:Password": "Changer le mot de passe", "ProfileTab:PersonalInfo": "Informations personnelles" } -} \ No newline at end of file +} diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hu.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hu.json index 6d2e1c6460..768b7b21fd 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hu.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/hu.json @@ -44,7 +44,7 @@ "LoggedOutTitle": "Kijelentkezett", "LoggedOutText": "Kijelentkeztünk, és hamarosan átirányítjuk.", "ReturnToText": "Kattintson ide a(z) {0} címre történő átirányításhoz", - "OrLoginWith": "Vagy jelentkezzen be", + "OrLoginWith": "Vagy jelentkezzen be:", "ForgotPassword": "Elfelejtette a jelszavát?", "SendPasswordResetLink_Information": "Jelszó-visszaállítási linket küldünk az e-mailre a jelszó visszaállításához. Ha néhány percen belül nem kap e-mailt, próbálkozzon újra.", "PasswordResetMailSentMessage": "A fiók-helyreállítási e-mailt az Ön e-mail címére küldtük. Ha 15 percen belül nem látja ezt az e-mailt a beérkező levelek között, keresse meg a levélszemét mappájában. Ha ott találja, kérjük, jelölje meg: -Nem szemét-.", @@ -58,4 +58,4 @@ "ProfileTab:PersonalInfo": "Személyes adatok", "ReturnToApplication": "Vissza az alkalmazáshoz" } -} \ No newline at end of file +} diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json index 9f8e765759..3be2997f68 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/tr.json @@ -44,7 +44,7 @@ "LoggedOutTitle": "Çıkış Yaptınız", "LoggedOutText": "Çıkış yaptınız ve birazdan yönlendirileceksiniz.", "ReturnToText": "{0} uygulamasına dönmek için tıklayın.", - "OrLoginWith": "Veya bunlarla giriş yap;", + "OrLoginWith": "Veya bunlarla giriş yap:", "ForgotPassword": "Şifremi unuttum", "SendPasswordResetLink_Information": "E-posta adresinize bir şifre sıfırlama bağlantısı gönderilecektir. Birkaç dakika içerisinde bir e-posta almazsanız lütfen tekrar deneyin.", "PasswordResetMailSentMessage": "E-posta adresinize bir şifre sıfırlama bağlantısı gönderilmiştir. Lütfen e-posta adresinizi kontrol ediniz. Eğer 15 dakika içinde, bu e-postayı gelen kutusunda bulamazsanız, gereksiz veya istenmeyen e-posta kutularına bakınız.", diff --git a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json index cfe4fbaa27..f5995c6e28 100644 --- a/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json +++ b/modules/account/src/Volo.Abp.Account.Application.Contracts/Volo/Abp/Account/Localization/Resources/zh-Hans.json @@ -44,7 +44,7 @@ "LoggedOutTitle": "注销", "LoggedOutText": "你已成功注销并将马上返回.", "ReturnToText": "点击此处返回到 {0}", - "OrLoginWith": "或登录", + "OrLoginWith": "或登录:", "ForgotPassword": "忘记密码?", "SendPasswordResetLink_Information": "密码重置链接将发送到您的电子邮件以重置密码. 如果您在几分钟内没有收到电子邮件,请重试.", "PasswordResetMailSentMessage": "帐户恢复电子邮件已发送到您的电子邮件地址. 如果您在15分钟内未在收件箱中看到此电子邮件,请检查垃圾邮件,并标记为非垃圾邮件.", @@ -59,4 +59,4 @@ "ReturnToApplication": "返回到应用程序", "Volo.Account:InvalidEmailAddress": "找不到给定的电子邮件地址:{0}" } -} \ No newline at end of file +} diff --git a/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj b/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj index b499842ed5..3879cf9569 100644 --- a/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj +++ b/modules/account/src/Volo.Abp.Account.Application/Volo.Abp.Account.Application.csproj @@ -17,7 +17,7 @@ - + @@ -25,7 +25,7 @@ - + diff --git a/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor b/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor index a6edb30a64..a2f7ca4f31 100644 --- a/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor +++ b/modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor @@ -27,7 +27,7 @@ - + @@ -59,7 +59,7 @@ - + diff --git a/modules/account/src/Volo.Abp.Account.Blazor/_Imports.razor b/modules/account/src/Volo.Abp.Account.Blazor/_Imports.razor index 4685ac9893..de520acc22 100644 --- a/modules/account/src/Volo.Abp.Account.Blazor/_Imports.razor +++ b/modules/account/src/Volo.Abp.Account.Blazor/_Imports.razor @@ -1,5 +1,6 @@ @using Microsoft.AspNetCore.Components.Web @using Volo.Abp.AspNetCore.Components.WebAssembly @using Volo.Abp.BlazoriseUI +@using Volo.Abp.BlazoriseUI.Components @using Blazorise @using Blazorise.DataGrid \ No newline at end of file diff --git a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj index 3f6167185f..91f9a3022e 100644 --- a/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj +++ b/modules/account/src/Volo.Abp.Account.Web.IdentityServer/Volo.Abp.Account.Web.IdentityServer.csproj @@ -34,11 +34,11 @@ - + - + diff --git a/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj b/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj index d00999c6b4..ac59aa33ba 100644 --- a/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj +++ b/modules/account/src/Volo.Abp.Account.Web/Volo.Abp.Account.Web.csproj @@ -40,7 +40,7 @@ - + diff --git a/modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.csproj b/modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.csproj index f0806249e6..11d3ec17fc 100644 --- a/modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.csproj +++ b/modules/account/test/Volo.Abp.Account.Application.Tests/Volo.Abp.Account.Application.Tests.csproj @@ -6,13 +6,13 @@ - - - - - - - + + + + + + + diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests.csproj b/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests.csproj index 395670a1c7..b292b74702 100644 --- a/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests.csproj +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests/Volo.Abp.AuditLogging.EntityFrameworkCore.Tests.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.csproj b/modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.csproj index ec89bbf896..b6f241bcdb 100644 --- a/modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.csproj +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.MongoDB.Tests/Volo.Abp.AuditLogging.MongoDB.Tests.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.csproj b/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.csproj index fc8df70002..c324ee2f51 100644 --- a/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.csproj +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.TestBase/Volo.Abp.AuditLogging.TestBase.csproj @@ -14,12 +14,12 @@ - - - - - - + + + + + + diff --git a/modules/audit-logging/test/Volo.Abp.AuditLogging.Tests/Volo.Abp.AuditLogging.Tests.csproj b/modules/audit-logging/test/Volo.Abp.AuditLogging.Tests/Volo.Abp.AuditLogging.Tests.csproj index d60a87ced6..ab122f058f 100644 --- a/modules/audit-logging/test/Volo.Abp.AuditLogging.Tests/Volo.Abp.AuditLogging.Tests.csproj +++ b/modules/audit-logging/test/Volo.Abp.AuditLogging.Tests/Volo.Abp.AuditLogging.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.csproj b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.csproj index c4ea6d9eb4..a38b454ba8 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.csproj +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.csproj @@ -6,7 +6,7 @@ - + diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.csproj b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.csproj index 0f5bd720a1..a9ac493329 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.csproj +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.csproj @@ -6,7 +6,7 @@ - + diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Volo.Abp.BackgroundJobs.DemoApp.Shared.csproj b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Volo.Abp.BackgroundJobs.DemoApp.Shared.csproj index 9a24fa3b02..a32ea90b09 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Volo.Abp.BackgroundJobs.DemoApp.Shared.csproj +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Volo.Abp.BackgroundJobs.DemoApp.Shared.csproj @@ -7,7 +7,7 @@ - + diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.csproj b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.csproj index e106032e76..f26aa765cf 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.csproj +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.csproj @@ -6,7 +6,7 @@ - + all runtime; build; native; contentfiles; analyzers diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.Domain.Tests/Volo.Abp.BackgroundJobs.Domain.Tests.csproj b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.Domain.Tests/Volo.Abp.BackgroundJobs.Domain.Tests.csproj index f6c16a3449..3a0698b660 100644 --- a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.Domain.Tests/Volo.Abp.BackgroundJobs.Domain.Tests.csproj +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.Domain.Tests/Volo.Abp.BackgroundJobs.Domain.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests.csproj b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests.csproj index b874f6abf8..8d7bc4e344 100644 --- a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests.csproj +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests/Volo.Abp.BackgroundJobs.EntityFrameworkCore.Tests.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.csproj b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.csproj index ce922d5aea..b032115d0e 100644 --- a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.csproj +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.csproj b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.csproj index 58c82e4e62..4d9297b041 100644 --- a/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.csproj +++ b/modules/background-jobs/test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.csproj @@ -14,12 +14,12 @@ - - - - - - + + + + + + diff --git a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.csproj b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.csproj index 494e4639e1..11f4acbbf8 100644 --- a/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.csproj +++ b/modules/blob-storing-database/host/BlobStoring.Database.Host.ConsoleApp/src/BlobStoring.Database.Host.ConsoleApp.ConsoleApp/BlobStoring.Database.Host.ConsoleApp.ConsoleApp.csproj @@ -20,13 +20,13 @@ - + - - + + diff --git a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/Volo.Abp.BlobStoring.Database.Domain.Tests.csproj b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/Volo.Abp.BlobStoring.Database.Domain.Tests.csproj index 3f5faacea1..914ea1b7d8 100644 --- a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/Volo.Abp.BlobStoring.Database.Domain.Tests.csproj +++ b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.Domain.Tests/Volo.Abp.BlobStoring.Database.Domain.Tests.csproj @@ -6,7 +6,7 @@ - + diff --git a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.csproj b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.csproj index 2c9388b46f..9eef25e389 100644 --- a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.csproj +++ b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests/Volo.Abp.BlobStoring.Database.EntityFrameworkCore.Tests.csproj @@ -6,10 +6,10 @@ - - - - + + + + diff --git a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/Volo.Abp.BlobStoring.Database.MongoDB.Tests.csproj b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/Volo.Abp.BlobStoring.Database.MongoDB.Tests.csproj index e2448c7d5f..f350f87e86 100644 --- a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/Volo.Abp.BlobStoring.Database.MongoDB.Tests.csproj +++ b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.MongoDB.Tests/Volo.Abp.BlobStoring.Database.MongoDB.Tests.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/Volo.Abp.BlobStoring.Database.TestBase.csproj b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/Volo.Abp.BlobStoring.Database.TestBase.csproj index f4ddf02406..0a5bdb6328 100644 --- a/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/Volo.Abp.BlobStoring.Database.TestBase.csproj +++ b/modules/blob-storing-database/test/Volo.Abp.BlobStoring.Database.TestBase/Volo.Abp.BlobStoring.Database.TestBase.csproj @@ -6,12 +6,12 @@ - - - - - - + + + + + + diff --git a/modules/blogging/app/Volo.BloggingTestApp.EntityFrameworkCore/Volo.BloggingTestApp.EntityFrameworkCore.csproj b/modules/blogging/app/Volo.BloggingTestApp.EntityFrameworkCore/Volo.BloggingTestApp.EntityFrameworkCore.csproj index ef06f64902..2cce194cf8 100644 --- a/modules/blogging/app/Volo.BloggingTestApp.EntityFrameworkCore/Volo.BloggingTestApp.EntityFrameworkCore.csproj +++ b/modules/blogging/app/Volo.BloggingTestApp.EntityFrameworkCore/Volo.BloggingTestApp.EntityFrameworkCore.csproj @@ -16,8 +16,8 @@ - - + + diff --git a/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj b/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj index 3e11d85aee..41176d3edd 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj +++ b/modules/blogging/app/Volo.BloggingTestApp/Volo.BloggingTestApp.csproj @@ -15,9 +15,9 @@ - + - + diff --git a/modules/blogging/app/Volo.BloggingTestApp/package.json b/modules/blogging/app/Volo.BloggingTestApp/package.json index 3bf487c960..9bbbfbced4 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/package.json +++ b/modules/blogging/app/Volo.BloggingTestApp/package.json @@ -3,7 +3,7 @@ "name": "volo.blogtestapp", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.1", - "@abp/blogging": "^4.0.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^4.1.0-rc.2", + "@abp/blogging": "^4.1.0-rc.2" } } \ No newline at end of file diff --git a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock index 551266f2e6..aad202f28c 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock +++ b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.1.tgz#ce8e3eb830a8e8f9eecb1a3b3bd70c2832fdf15e" - integrity sha512-w+ZG8Ewx9wWfbvRC2MAjJl+rXuXSHLhhGOiJTk68unWLNziDtNQzcSXG/Z5c1hA+acJSGqDoJGEGs4FVM136og== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.1.tgz#cd9d0eb11309c597dffd26277cd1bd7c5b1e0e2f" - integrity sha512-QGoCN/my0eAfa4tx5ytDxArIoz2i58jFFVUGso1Lekn54JvSt+WLz2p3uyTGatZ03Bp9836elhFnIopn12WvBw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~4.0.1" - "@abp/bootstrap" "~4.0.1" - "@abp/bootstrap-datepicker" "~4.0.1" - "@abp/datatables.net-bs4" "~4.0.1" - "@abp/font-awesome" "~4.0.1" - "@abp/jquery-form" "~4.0.1" - "@abp/jquery-validation-unobtrusive" "~4.0.1" - "@abp/lodash" "~4.0.1" - "@abp/luxon" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/select2" "~4.0.1" - "@abp/sweetalert" "~4.0.1" - "@abp/timeago" "~4.0.1" - "@abp/toastr" "~4.0.1" - -"@abp/aspnetcore.mvc.ui@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.1.tgz#6490c147a56e4f7055d2ca77f20baf1f60f56867" - integrity sha512-4B3icJrlpuZgMaX52ninyaenH7zLwepePEscDrLaFY9wyonKpZ2zh+xplnyM6vjNd+PhErWuA2+ssCswFhrJ3A== +"@abp/aspnetcore.mvc.ui.theme.basic@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.1.0-rc.2.tgz#b9462cbe36c41d68e2f44b79a3a2dba2c1b2b54a" + integrity sha512-KW3J6HnN1zZrCmrWmEcXBnGIOeuJDdp1jUECAm4Bdxi++VzfIbGlVvpcvUdT1E213reOUWi4dPhcej12DwrmDw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui.theme.shared@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.1.0-rc.2.tgz#d64cea1e504bcd3a08a1819025d40f3f84f0aadc" + integrity sha512-A/DRLwtJO7YCdqAgSF84wNRKjvGEQvcBocIwRxXCJEe3drxMoSwkAGjXQlxIYWZKdYbYUWDTjil2Mvwf91GUqg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~4.1.0-rc.2" + "@abp/bootstrap" "~4.1.0-rc.2" + "@abp/bootstrap-datepicker" "~4.1.0-rc.2" + "@abp/datatables.net-bs4" "~4.1.0-rc.2" + "@abp/font-awesome" "~4.1.0-rc.2" + "@abp/jquery-form" "~4.1.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~4.1.0-rc.2" + "@abp/lodash" "~4.1.0-rc.2" + "@abp/luxon" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/select2" "~4.1.0-rc.2" + "@abp/sweetalert" "~4.1.0-rc.2" + "@abp/timeago" "~4.1.0-rc.2" + "@abp/toastr" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.1.0-rc.2.tgz#54bf30def590e6d25fc35f77253888f3d9f74b9c" + integrity sha512-eOh5IBn4eNAjj2i6tlLRIV/r61Ef7+Z3PNvGgdml/XCo50el4G9XE7shxuGOY+MaFMfmsST2tcJlO9iAo9n2Yw== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,214 +43,214 @@ micromatch "^4.0.2" path "^0.12.7" -"@abp/blogging@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-4.0.1.tgz#d46afb7695922c89395564272d69f7e2e93ae19a" - integrity sha512-tPvjcWW5KTruHdmPi4TLKA2XahIsgJrpYfRIhduTespbCUWZZCdXwD76Bmv3HhD3oNivAR8lnf3iyHujQ3zhPA== +"@abp/blogging@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-4.1.0-rc.2.tgz#f5b3018efc8f64d75369735f13c1984fdc1a9292" + integrity sha512-vGPIbpcelOrKeGz3Pcv9suC0VSi8RB0ufFJaDxyo67XfMaWn+a4N+uuy7p5jpAW2xRsVlXRJ/H+pbE2bPild3w== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.1" - "@abp/owl.carousel" "~4.0.1" - "@abp/prismjs" "~4.0.1" - "@abp/tui-editor" "~4.0.1" + "@abp/aspnetcore.mvc.ui.theme.shared" "~4.1.0-rc.2" + "@abp/owl.carousel" "~4.1.0-rc.2" + "@abp/prismjs" "~4.1.0-rc.2" + "@abp/tui-editor" "~4.1.0-rc.2" -"@abp/bootstrap-datepicker@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.1.tgz#aad891263edff66f816e003ba4fa7f8acfe8e0b6" - integrity sha512-S0oaVZmXsDcOJLAyoGY0TvP/7bZx0GHIbU9BIhIL2Wl74HYaokjkTr6/IleIek9YeiF2vm9FkrUP1dKH/4f7Gg== +"@abp/bootstrap-datepicker@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.1.0-rc.2.tgz#d3fe863222a11771d366b1a3c246aaf34df94081" + integrity sha512-vn2xWAK3xqo5fMZJ9dOAZZmL+ZUnzZZNh3lF6uA97wTN/SbePlmHBYJpsCKIxOwbJS2HCvekHGJN/Ps4oEjlbw== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.1.tgz#3e41bdf9b3e9f8c497b9fafe22a4851d0401b31b" - integrity sha512-GoSaNWvswRHVoUrq7xClFQYtwqIlyS/vp/TdY+j5FFZP7ud89+ZGpdNqYqq5l9/6aaYa7v4b9mNTZ/1JRzAOYg== +"@abp/bootstrap@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.1.0-rc.2.tgz#b5132cf4c4c92fe833823cf2b91ab1b0167b0ecf" + integrity sha512-SsWEV0DveBIHiG051E6aBB371D15QIsGeo+POFhvQUvrlmzMBlFCAlmH0ef8w1n+3M3C37irCgEGKctt2pbcxQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" bootstrap "^4.5.0" bootstrap-v4-rtl "4.4.1-2" -"@abp/clipboard@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.0.1.tgz#aacbd02b6ce991ca20550ad7afc40e0cea247b5e" - integrity sha512-Q7Fe167pBJ/9Vp5RyVc/JejaIzNCdTgXcnZLNC7AEtaeBVCmLwsdnCYP3i32sdvX1AIgt3exhAAsHBt0deij/g== +"@abp/clipboard@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.1.0-rc.2.tgz#14802cefd81f3aa4a421523e4a8d71f06a7281a6" + integrity sha512-mUYqACe/Jh+GEGWaRfOblrKo/yJnNMmj2h3llDOpBzQj1HTuUCAOHBHpdq7SUPEuwQVxjOjDhBjYBKbqGbTKBQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" clipboard "^2.0.6" -"@abp/codemirror@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-4.0.1.tgz#301a58c76b31daa2b4cba7226a971d73a498a534" - integrity sha512-JFVNu1jXz65VLVQgyzVCmYq8JrxT96wDfiBRt55Snw68vqFjQnlh95t9jbITfjUsb2TZqEg7S95STDhrLrq5xg== +"@abp/codemirror@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-4.1.0-rc.2.tgz#fe0fa745185ed3f170f75d6c4e29b47e38cfbdba" + integrity sha512-ddysazVpop0Cv166VWrDV18v9l1gme1GiMMCAR3Cv/WeIvI28EzG0G8OlPKlXJ/qCm65Kf6SF4EFrCuL1nXK+g== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" codemirror "^5.54.0" -"@abp/core@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.1.tgz#1df32bc058f45571605670ca81c226a1bd87400c" - integrity sha512-8UT5lwqV/luVG/SxePSTD2FRbZXwXv3cZJKjw+gpBjhD0slWrh51XEOHsM8ciTuhcvV/tsqVU9nXckDMdO58fw== +"@abp/core@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.1.0-rc.2.tgz#d306106a53fa56109751be0099785c94f43be56f" + integrity sha512-b0mOYSz8hNgZ/hBeYg8hkthJgE8CLyHNa2NcythPoIW8RR5qHmDtGoFnuFovLvLk7r+M4NWyxXRKEshSszIPyA== dependencies: - "@abp/utils" "^4.0.1" + "@abp/utils" "^4.1.0-rc.2" -"@abp/datatables.net-bs4@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.1.tgz#7538baad0eff24eca7f4246d020852f83139f645" - integrity sha512-S52jNPF4if68V+P/33NrtGPJXf6xrqgyZzz9b7qBR7HuUm3Nsn7bAslh3JNduNec/sFuE4Utl/xsFHZNjBWEog== +"@abp/datatables.net-bs4@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.1.0-rc.2.tgz#99aa1fbad91939fc23265324a3d8a45d0c1e5a7a" + integrity sha512-Y9UyqniOkx5DJO+2GGurnQE1yfRmGaQ3y7V07gKWRq+gHLUhE+vfgOLVpGM6ufdTIbLvVw5Ng+3gfOmPlUnpxg== dependencies: - "@abp/datatables.net" "~4.0.1" + "@abp/datatables.net" "~4.1.0-rc.2" datatables.net-bs4 "^1.10.21" -"@abp/datatables.net@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.1.tgz#eb89716a37351c41b5bccfc2db88fc7ceb991a26" - integrity sha512-APFLui0w8MqsBWqP/K0QkT5cBq5SsWiqMaIGTXQKinMVLV597sUszrlhe1ISU2PqeD7iX6pCZNNOTI1NEUn9/Q== +"@abp/datatables.net@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.1.0-rc.2.tgz#1a134688259d32187d822d8a49c7a68b4cc226c7" + integrity sha512-9o5g8s7ZTlThd1FMFmO7wS+MxmXgUMmiWx7Hwara9ypfJPd0vanz10bQAdTpLiDy/aa0tUmz0xOVj73yvBJm9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" datatables.net "^1.10.21" -"@abp/font-awesome@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.1.tgz#8a9d83b2c2adfcd5abcbd9c31c315460d44a321e" - integrity sha512-+6+m/DKMnfkeQiWUsMlB6Da8u6yREyN2oQYGYhSRAK8419ym8RHHrqKJv2AClI4iLq2ppHZj8WF84+SeoCekRg== +"@abp/font-awesome@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.1.0-rc.2.tgz#ecf490861c09250cf61611ac74cec5ab4392e807" + integrity sha512-6yAsf/ee2hdrHHUACql8c3gY54Hd7YAK2olHymyc3Io2hhK2VxXRc2W2oRSwbQ9GsSE+XDrEVtjIR64nBseTeg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" "@fortawesome/fontawesome-free" "^5.13.0" -"@abp/highlight.js@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-4.0.1.tgz#6e455d38cbd84c82d1665cb38f40d4c7ab4b7999" - integrity sha512-HyuU2I1fnhGGKEzY52gH71vop1cq9x2BWVhKxVFH8xphva3N6lftCp212PIqTo6oANTgruyqPhr3z4rGOM4OfQ== +"@abp/highlight.js@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-4.1.0-rc.2.tgz#56ab7754a850ada113a42d8d681cf003754670cb" + integrity sha512-lA1mWhOkTJFcaq0F2s0wnwJurEEzQs4aZ5huO1FDL8GozRF8pLtHRwTjFlcaLNINGNgd5egBcXy5cqPQpZKSRQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" -"@abp/jquery-form@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.1.tgz#6dc1922b2800dd635f20881a82e08104a1dd1bb5" - integrity sha512-JMBZYu/MI/GjaLTBOMB5iv8cagnLpReDULNC3r6tLNNqB1R8f3Cg1T7nF4YCuU9SYMqis1P/AuE4oEh+4rQdAQ== +"@abp/jquery-form@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.1.0-rc.2.tgz#76dff67a3fe6e6ad7bd60bb909de93c09966cc0a" + integrity sha512-LGafwxyRYUbHQlJ9pPbYdkVqzdT/y1Fp4Nr4C3W5jxsJuaSICl0RPkRHIPALeoqbpEWuj6dVep6ZuO9hhxBzNw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.1.tgz#4142ca31c0830fe24a1467e8cf13b55ba9d7c1dd" - integrity sha512-rdSRTcdKCHmarbrVgmPYdTiJ0G/aFKd+dr0krO7fALPTuQKChbDnHOO4/JvQSc+cd9faxa8c6ZWvlHdsof23tQ== +"@abp/jquery-validation-unobtrusive@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.1.0-rc.2.tgz#1f1d395cfa47740d47303ff512592ff1993f9e13" + integrity sha512-0LXWvgfyLHVw7qRVOmY0rfVlq+yJq/nhbcVoYK+QbmKnrFu+KZg0KNMOD8wTXs8mZ1EKGQpoQKWxImtCnGrV/A== dependencies: - "@abp/jquery-validation" "~4.0.1" + "@abp/jquery-validation" "~4.1.0-rc.2" jquery-validation-unobtrusive "^3.2.11" -"@abp/jquery-validation@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.1.tgz#74e7d795468c6986f2db15662631fcd4f67c679e" - integrity sha512-FX26aQCsMBdVWAJb7S37Lt7KoHAEHoYguh/qfZIARCpOYOOWvxfDz1wTrmADUkqdillqEiCeD/Imj8bYH9Faaw== +"@abp/jquery-validation@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.1.0-rc.2.tgz#ad4b464fd0133eab8d08c781c7d7c4e00bc4918d" + integrity sha512-iLTobfwqDk7iiQxvv5UowxOKywsh/77VlAVktstnFG3N3Y73+JYKzM0mGM/j4zM1OrjbF9/cnPnDVX7bATPz9w== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-validation "^1.19.2" -"@abp/jquery@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.1.tgz#aa554accb16600fd586c3a4f088040cd26d0bde8" - integrity sha512-MtiRKOLyjEWux+whPP3+zwPbpj8or756JtgjnwOTDB9tp9HLCYUaskt+oalYPvob24nDZcNu2RnMALYdCVhZAQ== +"@abp/jquery@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.1.0-rc.2.tgz#0f64cad5b1ae3e47d2344e5fb30c347b89d6d2bb" + integrity sha512-YubZwMJIN+UcfxfUlt3usfcLMG9WcXNpemUsdBtlKNzti562KZMIHPFLRL+DsiqvzZ74h2PxSWWsxS42Z7z0Yw== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" jquery "~3.5.1" -"@abp/lodash@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.1.tgz#ec261ccaab8a70d5b32a8a7c22387e48936d38d4" - integrity sha512-Dav1QKbBeGR4VVbHHe1s3OEzN7wnb9K/vwzHrWmtO8D1Q5Z3433xjNmgL5VQ9gfxXqooSfEO4gAovZklMDHDew== +"@abp/lodash@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.1.0-rc.2.tgz#9281c641ab7b7b33e7acf12815dc461e7ae967b9" + integrity sha512-RqdekrAyLPaLNJddmrq89EdrI1xg4296tOafFLHvirgRWisJTIa9bflTOwMwEg9FNdLJgA0zHi4WdAMer0qZdA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" lodash "^4.17.15" -"@abp/luxon@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.1.tgz#a540750b1605dbac856ce9c2e776c2fecf6392f9" - integrity sha512-eRumVB7UIf2XH6OZVUTvcKw0A/OSAfYV59fM+Wc4dAkNcmsNZI0gD1o0AigSGNCxTV6v+W2bFrsuooSqK99Y0Q== +"@abp/luxon@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.1.0-rc.2.tgz#78fc1cf651d7c19b87a31823cd3ce68961d6b1e6" + integrity sha512-U4e9uGZlg9xj9tBNP337v3wiaSR6qxWsBgh/duQGWrqV+75LlQjYcZaPoXDidUUS6U6epDSR2pc2T39rahcgSQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" luxon "^1.24.1" -"@abp/malihu-custom-scrollbar-plugin@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.1.tgz#0a556423a67b6c949e32ffcacd72256dea6c31ee" - integrity sha512-YTwYpnQ1ZrON70gvJcnNZRwB3Ze4olGcXxiPvmRgSHbGJkSnHYJiP6PvsN1F3HDFukAJ/iUu+WwEe8OBwlyLXA== +"@abp/malihu-custom-scrollbar-plugin@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.1.0-rc.2.tgz#36553e71052cad9734e0c9b2c65759e538468648" + integrity sha512-JQ6PCcj5qmF9MxNRPAsKHHnqBPCdn4lQnwxZrHcG9tD70Gx+NfC4UH41tqXI+htba4k0PHRyH2y39Q1iJm0NFA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/markdown-it@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-4.0.1.tgz#031cb8674f2fe40cf8fbb714ea6b5cd8f7c9a5a9" - integrity sha512-8hx4MkIsoDYDsTsIRbqRHPpoiexXK1SeP3VTweLcUnWZxdZ3i8dj3ELy8lbt0O9LrqFACMJmLlVdhrur3w2mfQ== +"@abp/markdown-it@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/markdown-it/-/markdown-it-4.1.0-rc.2.tgz#5cd92655523e19e71cd6529734ce2c30291aef57" + integrity sha512-B3mzKeUsPuFs24gGnec7bVMo27r6klkhx1FDQz3vlxwZ3PkPVQqSp+yfIUVAxohhqFtw0ugoe2zvsLD3fl7qIg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" markdown-it "^11.0.0" -"@abp/owl.carousel@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-4.0.1.tgz#7241fc23aa5bc63dc1668a04e32c56134f5c3d16" - integrity sha512-+H3ypcPAKymA0/yHHT4tr26thhFM7wc+p/ethJaVH26w+REFASnweLRlMMNC7pV+JFpEnHwUOswkRP0/96i25w== +"@abp/owl.carousel@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-4.1.0-rc.2.tgz#f4703da17732e84ebe3882af0f3532866de9f6d4" + integrity sha512-INfTzKEQRubO7bUDJooNq5n7Oyul7+8DHUytah/6sDFbpBBvsk5g4D7OjnhMyhWQw9rmG16Vb5XnyCH9/JwPQQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" owl.carousel "^2.3.4" -"@abp/prismjs@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.0.1.tgz#8e614878a9d1d63504fe7ba6b7d44093947d862b" - integrity sha512-qZP4TlQDiXaAIrDmpzQJeL/9mtTCxQCIbELDnBHMZFDrYNENOKZeBmvD9WAhgzL7FJcnPtOomJgZ5x2rqpBW/w== +"@abp/prismjs@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.1.0-rc.2.tgz#f49f51a036c36f0fb8b561913e16d46736c24470" + integrity sha512-9E5l1gAT73FZlfkv1dDEDPA2Cryy7hDQp0ahdIG57HRsKeUYhRODNo07cf2ev5RDgIQbm3iAcfe7YJubR5v8OQ== dependencies: - "@abp/clipboard" "~4.0.1" - "@abp/core" "~4.0.1" + "@abp/clipboard" "~4.1.0-rc.2" + "@abp/core" "~4.1.0-rc.2" prismjs "^1.20.0" -"@abp/select2@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.1.tgz#8983e7b5c3afb862f08b2730b70e59d726e9b5d5" - integrity sha512-WdzY2hvsS/4vz/VXpxq2muSzzE8ggchiIrICy/WKchJxL9L08DM796t6aE6rEl9wucY8XEzzWrPOVqAjJmnXFA== +"@abp/select2@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.1.0-rc.2.tgz#c48e865f401ddce32dff2a7a14ae07c4bde2f57b" + integrity sha512-YYK/SIqXQcSDQFMVg/ogohc76d4JDrOVQEbzfkNNI5bKVJo+hkqtNzAwV9FLdPZZNw15QMv0eF1ie4aUtIxyaA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.1.tgz#0088610915ad6db0a140b77832a37c10066eb4ee" - integrity sha512-t4/44oQCMngSjVqmeRWXwrXa/pRKc3CEpyyTiGIXki4dWJ21j0ePCw2l3rvOJWnpoCznhxa/UGxLfRfK1NEzRg== +"@abp/sweetalert@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.1.0-rc.2.tgz#cdcaf8e9a33cf218a687fd6a42cfe1c85d89c6b7" + integrity sha512-sjQd8TF9oUnaQ1OPTGdVyAfWqSZEk4bRbC/qw2CouEOfRLatzkC0JcmzFLN0f5N1am1RQwkFakpENKH7NqTCvg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" sweetalert "^2.1.2" -"@abp/timeago@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.1.tgz#8c161645534eb1f62fe4607450acf7345729e711" - integrity sha512-PsPobV79U2qzVY+WBsmJM1ohSF4jqcLnL4/7qyJvxlb1WwbCl1F5D4cpiJP4zsM4clPW4mbSsiauMNp+HTNKEA== +"@abp/timeago@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.1.0-rc.2.tgz#445d043ae482b76799b496ae6565abfaf75a34b9" + integrity sha512-wWx56EZMUGIfqJV5JLCvUp4RVhKXHYLQaVNQSF8E05COXmSQwFThVS7vbuiODFp2BGm6RAqCVtZDCreu2B8z9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.1.tgz#ecb6f6193b7edc3150d0614ab9457472baf1cce3" - integrity sha512-bTTz0O8zj7fMhdoummP2Ed5Z8SJTmR6svzNchBXNDrnRAcDQvTihPTcg0UpH8BEDFczbLowq09CG2A/RMSJoug== +"@abp/toastr@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.1.0-rc.2.tgz#1af16fa8687201b6b9c7229d087a4233998703b9" + integrity sha512-g+Jl5H1ZHoJ4JwWuix0xA+GMFY42pwq8WYjxP6qE2/Y2aixYHVIui15eBqF2L06yXOt53YFcC1+pxjrp91xHxw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" toastr "^2.1.4" -"@abp/tui-editor@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-4.0.1.tgz#3e9a7f464f6ff3880e21518acc42556f82618294" - integrity sha512-BeUNK/R15TrNA14AarQj+WBSMp76dfaz8zeFP7l25FXPMi571mwZQnb+F2wJvsCU3jCWaO/pSGoIY6KehHsXsg== +"@abp/tui-editor@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-4.1.0-rc.2.tgz#32008e17a7e6ebf9451e6425ca3f4938351cdf01" + integrity sha512-xGqOMrrd0Bk6PN90BgyCh7nPvh9QSeu4NHl5xYy2/jrqg0MjIDOIdNbLPjS24KPlSse176Wb9x5sPh1VSBJqBQ== dependencies: - "@abp/codemirror" "~4.0.1" - "@abp/highlight.js" "~4.0.1" - "@abp/jquery" "~4.0.1" - "@abp/markdown-it" "~4.0.1" + "@abp/codemirror" "~4.1.0-rc.2" + "@abp/highlight.js" "~4.1.0-rc.2" + "@abp/jquery" "~4.1.0-rc.2" + "@abp/markdown-it" "~4.1.0-rc.2" tui-editor "^1.4.10" -"@abp/utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" - integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== +"@abp/utils@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.2.tgz#eb6dbf0ee493d0f050b37347d2d6d283098aedae" + integrity sha512-V2k5I89lVBoeGIKgg4p2H9GlMAcDWbctwKZPVwBEMVEVm1uTR2xQAWdTdSFd5Q8I8Xsf/aIG8ELM7l5j2h7/zQ== dependencies: just-compare "^1.3.0" diff --git a/modules/blogging/src/Volo.Blogging.Admin.Web/BloggingAdminMenuContributor.cs b/modules/blogging/src/Volo.Blogging.Admin.Web/BloggingAdminMenuContributor.cs index cd8b073429..95a403678f 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.Web/BloggingAdminMenuContributor.cs +++ b/modules/blogging/src/Volo.Blogging.Admin.Web/BloggingAdminMenuContributor.cs @@ -10,11 +10,11 @@ namespace Volo.Blogging.Admin { if (context.Menu.Name == StandardMenus.Main) { - await ConfigureMainMenu(context); + await ConfigureMainMenuAsync(context); } } - private async Task ConfigureMainMenu(MenuConfigurationContext context) + private async Task ConfigureMainMenuAsync(MenuConfigurationContext context) { var l = context.GetLocalizer(); diff --git a/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj b/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj index 7004bb354e..e3897aa50c 100644 --- a/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj +++ b/modules/blogging/src/Volo.Blogging.Admin.Web/Volo.Blogging.Admin.Web.csproj @@ -24,7 +24,7 @@ - + diff --git a/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj b/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj index 8c9f39e023..308a0b8c31 100644 --- a/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj +++ b/modules/blogging/src/Volo.Blogging.Application/Volo.Blogging.Application.csproj @@ -11,7 +11,7 @@ - + diff --git a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.csproj b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.csproj index 4be1a7f23b..c56b888d38 100644 --- a/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.csproj +++ b/modules/blogging/src/Volo.Blogging.Domain.Shared/Volo.Blogging.Domain.Shared.csproj @@ -21,7 +21,7 @@ - + diff --git a/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj b/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj index 7f05471351..363d806ffe 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj +++ b/modules/blogging/src/Volo.Blogging.Web/Volo.Blogging.Web.csproj @@ -24,7 +24,7 @@ - + diff --git a/modules/blogging/test/Volo.Blogging.Application.Tests/Volo.Blogging.Application.Tests.csproj b/modules/blogging/test/Volo.Blogging.Application.Tests/Volo.Blogging.Application.Tests.csproj index 84b74c8765..8db4427bf3 100644 --- a/modules/blogging/test/Volo.Blogging.Application.Tests/Volo.Blogging.Application.Tests.csproj +++ b/modules/blogging/test/Volo.Blogging.Application.Tests/Volo.Blogging.Application.Tests.csproj @@ -6,7 +6,7 @@ - + diff --git a/modules/blogging/test/Volo.Blogging.Application.Tests/Volo/Blogging/PostAppService_Tests.cs b/modules/blogging/test/Volo.Blogging.Application.Tests/Volo/Blogging/PostAppService_Tests.cs index 260304d6ba..654ddcbe44 100644 --- a/modules/blogging/test/Volo.Blogging.Application.Tests/Volo/Blogging/PostAppService_Tests.cs +++ b/modules/blogging/test/Volo.Blogging.Application.Tests/Volo/Blogging/PostAppService_Tests.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Threading.Tasks; using Shouldly; using Volo.Blogging.Blogs; @@ -55,7 +56,7 @@ namespace Volo.Blogging Url = title.Replace(" ", "-") }); - newPostDto.Id.ShouldNotBeNull(); + newPostDto.Id.ShouldNotBe(Guid.Empty); UsingDbContext(context => { @@ -87,7 +88,7 @@ namespace Volo.Blogging Content = newContent, Url = newTitle.Replace(" ", "-") }); - + UsingDbContext(context => { var post = context.Posts.FirstOrDefault(q => q.Id == oldPost.Id); diff --git a/modules/blogging/test/Volo.Blogging.Domain.Tests/Volo.Blogging.Domain.Tests.csproj b/modules/blogging/test/Volo.Blogging.Domain.Tests/Volo.Blogging.Domain.Tests.csproj index c7fe644a59..0cb4586c02 100644 --- a/modules/blogging/test/Volo.Blogging.Domain.Tests/Volo.Blogging.Domain.Tests.csproj +++ b/modules/blogging/test/Volo.Blogging.Domain.Tests/Volo.Blogging.Domain.Tests.csproj @@ -6,7 +6,7 @@ - + diff --git a/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo.Blogging.EntityFrameworkCore.Tests.csproj b/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo.Blogging.EntityFrameworkCore.Tests.csproj index 87c20fdc04..b3a2f9cc71 100644 --- a/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo.Blogging.EntityFrameworkCore.Tests.csproj +++ b/modules/blogging/test/Volo.Blogging.EntityFrameworkCore.Tests/Volo.Blogging.EntityFrameworkCore.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/modules/blogging/test/Volo.Blogging.MongoDB.Tests/Volo.Blogging.MongoDB.Tests.csproj b/modules/blogging/test/Volo.Blogging.MongoDB.Tests/Volo.Blogging.MongoDB.Tests.csproj index 3b73719bdc..93942029b5 100644 --- a/modules/blogging/test/Volo.Blogging.MongoDB.Tests/Volo.Blogging.MongoDB.Tests.csproj +++ b/modules/blogging/test/Volo.Blogging.MongoDB.Tests/Volo.Blogging.MongoDB.Tests.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/modules/blogging/test/Volo.Blogging.TestBase/Volo.Blogging.TestBase.csproj b/modules/blogging/test/Volo.Blogging.TestBase/Volo.Blogging.TestBase.csproj index 51f3e258b2..45b57946ce 100644 --- a/modules/blogging/test/Volo.Blogging.TestBase/Volo.Blogging.TestBase.csproj +++ b/modules/blogging/test/Volo.Blogging.TestBase/Volo.Blogging.TestBase.csproj @@ -12,12 +12,12 @@ - - - - - - + + + + + + diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj index cc27807686..dbf58f3b71 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj @@ -9,7 +9,7 @@ - + diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json index 2ac9d439cd..e0cbead544 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json @@ -3,6 +3,6 @@ "name": "client-simulation-web", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^4.1.0-rc.2" } } \ No newline at end of file diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock index 9d399b77de..40f5a67717 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.1.tgz#ce8e3eb830a8e8f9eecb1a3b3bd70c2832fdf15e" - integrity sha512-w+ZG8Ewx9wWfbvRC2MAjJl+rXuXSHLhhGOiJTk68unWLNziDtNQzcSXG/Z5c1hA+acJSGqDoJGEGs4FVM136og== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.1.tgz#cd9d0eb11309c597dffd26277cd1bd7c5b1e0e2f" - integrity sha512-QGoCN/my0eAfa4tx5ytDxArIoz2i58jFFVUGso1Lekn54JvSt+WLz2p3uyTGatZ03Bp9836elhFnIopn12WvBw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~4.0.1" - "@abp/bootstrap" "~4.0.1" - "@abp/bootstrap-datepicker" "~4.0.1" - "@abp/datatables.net-bs4" "~4.0.1" - "@abp/font-awesome" "~4.0.1" - "@abp/jquery-form" "~4.0.1" - "@abp/jquery-validation-unobtrusive" "~4.0.1" - "@abp/lodash" "~4.0.1" - "@abp/luxon" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/select2" "~4.0.1" - "@abp/sweetalert" "~4.0.1" - "@abp/timeago" "~4.0.1" - "@abp/toastr" "~4.0.1" - -"@abp/aspnetcore.mvc.ui@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.1.tgz#6490c147a56e4f7055d2ca77f20baf1f60f56867" - integrity sha512-4B3icJrlpuZgMaX52ninyaenH7zLwepePEscDrLaFY9wyonKpZ2zh+xplnyM6vjNd+PhErWuA2+ssCswFhrJ3A== +"@abp/aspnetcore.mvc.ui.theme.basic@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.1.0-rc.2.tgz#b9462cbe36c41d68e2f44b79a3a2dba2c1b2b54a" + integrity sha512-KW3J6HnN1zZrCmrWmEcXBnGIOeuJDdp1jUECAm4Bdxi++VzfIbGlVvpcvUdT1E213reOUWi4dPhcej12DwrmDw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui.theme.shared@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.1.0-rc.2.tgz#d64cea1e504bcd3a08a1819025d40f3f84f0aadc" + integrity sha512-A/DRLwtJO7YCdqAgSF84wNRKjvGEQvcBocIwRxXCJEe3drxMoSwkAGjXQlxIYWZKdYbYUWDTjil2Mvwf91GUqg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~4.1.0-rc.2" + "@abp/bootstrap" "~4.1.0-rc.2" + "@abp/bootstrap-datepicker" "~4.1.0-rc.2" + "@abp/datatables.net-bs4" "~4.1.0-rc.2" + "@abp/font-awesome" "~4.1.0-rc.2" + "@abp/jquery-form" "~4.1.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~4.1.0-rc.2" + "@abp/lodash" "~4.1.0-rc.2" + "@abp/luxon" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/select2" "~4.1.0-rc.2" + "@abp/sweetalert" "~4.1.0-rc.2" + "@abp/timeago" "~4.1.0-rc.2" + "@abp/toastr" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.1.0-rc.2.tgz#54bf30def590e6d25fc35f77253888f3d9f74b9c" + integrity sha512-eOh5IBn4eNAjj2i6tlLRIV/r61Ef7+Z3PNvGgdml/XCo50el4G9XE7shxuGOY+MaFMfmsST2tcJlO9iAo9n2Yw== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,145 +43,145 @@ micromatch "^4.0.2" path "^0.12.7" -"@abp/bootstrap-datepicker@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.1.tgz#aad891263edff66f816e003ba4fa7f8acfe8e0b6" - integrity sha512-S0oaVZmXsDcOJLAyoGY0TvP/7bZx0GHIbU9BIhIL2Wl74HYaokjkTr6/IleIek9YeiF2vm9FkrUP1dKH/4f7Gg== +"@abp/bootstrap-datepicker@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.1.0-rc.2.tgz#d3fe863222a11771d366b1a3c246aaf34df94081" + integrity sha512-vn2xWAK3xqo5fMZJ9dOAZZmL+ZUnzZZNh3lF6uA97wTN/SbePlmHBYJpsCKIxOwbJS2HCvekHGJN/Ps4oEjlbw== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.1.tgz#3e41bdf9b3e9f8c497b9fafe22a4851d0401b31b" - integrity sha512-GoSaNWvswRHVoUrq7xClFQYtwqIlyS/vp/TdY+j5FFZP7ud89+ZGpdNqYqq5l9/6aaYa7v4b9mNTZ/1JRzAOYg== +"@abp/bootstrap@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.1.0-rc.2.tgz#b5132cf4c4c92fe833823cf2b91ab1b0167b0ecf" + integrity sha512-SsWEV0DveBIHiG051E6aBB371D15QIsGeo+POFhvQUvrlmzMBlFCAlmH0ef8w1n+3M3C37irCgEGKctt2pbcxQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" bootstrap "^4.5.0" bootstrap-v4-rtl "4.4.1-2" -"@abp/core@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.1.tgz#1df32bc058f45571605670ca81c226a1bd87400c" - integrity sha512-8UT5lwqV/luVG/SxePSTD2FRbZXwXv3cZJKjw+gpBjhD0slWrh51XEOHsM8ciTuhcvV/tsqVU9nXckDMdO58fw== +"@abp/core@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.1.0-rc.2.tgz#d306106a53fa56109751be0099785c94f43be56f" + integrity sha512-b0mOYSz8hNgZ/hBeYg8hkthJgE8CLyHNa2NcythPoIW8RR5qHmDtGoFnuFovLvLk7r+M4NWyxXRKEshSszIPyA== dependencies: - "@abp/utils" "^4.0.1" + "@abp/utils" "^4.1.0-rc.2" -"@abp/datatables.net-bs4@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.1.tgz#7538baad0eff24eca7f4246d020852f83139f645" - integrity sha512-S52jNPF4if68V+P/33NrtGPJXf6xrqgyZzz9b7qBR7HuUm3Nsn7bAslh3JNduNec/sFuE4Utl/xsFHZNjBWEog== +"@abp/datatables.net-bs4@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.1.0-rc.2.tgz#99aa1fbad91939fc23265324a3d8a45d0c1e5a7a" + integrity sha512-Y9UyqniOkx5DJO+2GGurnQE1yfRmGaQ3y7V07gKWRq+gHLUhE+vfgOLVpGM6ufdTIbLvVw5Ng+3gfOmPlUnpxg== dependencies: - "@abp/datatables.net" "~4.0.1" + "@abp/datatables.net" "~4.1.0-rc.2" datatables.net-bs4 "^1.10.21" -"@abp/datatables.net@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.1.tgz#eb89716a37351c41b5bccfc2db88fc7ceb991a26" - integrity sha512-APFLui0w8MqsBWqP/K0QkT5cBq5SsWiqMaIGTXQKinMVLV597sUszrlhe1ISU2PqeD7iX6pCZNNOTI1NEUn9/Q== +"@abp/datatables.net@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.1.0-rc.2.tgz#1a134688259d32187d822d8a49c7a68b4cc226c7" + integrity sha512-9o5g8s7ZTlThd1FMFmO7wS+MxmXgUMmiWx7Hwara9ypfJPd0vanz10bQAdTpLiDy/aa0tUmz0xOVj73yvBJm9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" datatables.net "^1.10.21" -"@abp/font-awesome@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.1.tgz#8a9d83b2c2adfcd5abcbd9c31c315460d44a321e" - integrity sha512-+6+m/DKMnfkeQiWUsMlB6Da8u6yREyN2oQYGYhSRAK8419ym8RHHrqKJv2AClI4iLq2ppHZj8WF84+SeoCekRg== +"@abp/font-awesome@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.1.0-rc.2.tgz#ecf490861c09250cf61611ac74cec5ab4392e807" + integrity sha512-6yAsf/ee2hdrHHUACql8c3gY54Hd7YAK2olHymyc3Io2hhK2VxXRc2W2oRSwbQ9GsSE+XDrEVtjIR64nBseTeg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" "@fortawesome/fontawesome-free" "^5.13.0" -"@abp/jquery-form@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.1.tgz#6dc1922b2800dd635f20881a82e08104a1dd1bb5" - integrity sha512-JMBZYu/MI/GjaLTBOMB5iv8cagnLpReDULNC3r6tLNNqB1R8f3Cg1T7nF4YCuU9SYMqis1P/AuE4oEh+4rQdAQ== +"@abp/jquery-form@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.1.0-rc.2.tgz#76dff67a3fe6e6ad7bd60bb909de93c09966cc0a" + integrity sha512-LGafwxyRYUbHQlJ9pPbYdkVqzdT/y1Fp4Nr4C3W5jxsJuaSICl0RPkRHIPALeoqbpEWuj6dVep6ZuO9hhxBzNw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.1.tgz#4142ca31c0830fe24a1467e8cf13b55ba9d7c1dd" - integrity sha512-rdSRTcdKCHmarbrVgmPYdTiJ0G/aFKd+dr0krO7fALPTuQKChbDnHOO4/JvQSc+cd9faxa8c6ZWvlHdsof23tQ== +"@abp/jquery-validation-unobtrusive@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.1.0-rc.2.tgz#1f1d395cfa47740d47303ff512592ff1993f9e13" + integrity sha512-0LXWvgfyLHVw7qRVOmY0rfVlq+yJq/nhbcVoYK+QbmKnrFu+KZg0KNMOD8wTXs8mZ1EKGQpoQKWxImtCnGrV/A== dependencies: - "@abp/jquery-validation" "~4.0.1" + "@abp/jquery-validation" "~4.1.0-rc.2" jquery-validation-unobtrusive "^3.2.11" -"@abp/jquery-validation@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.1.tgz#74e7d795468c6986f2db15662631fcd4f67c679e" - integrity sha512-FX26aQCsMBdVWAJb7S37Lt7KoHAEHoYguh/qfZIARCpOYOOWvxfDz1wTrmADUkqdillqEiCeD/Imj8bYH9Faaw== +"@abp/jquery-validation@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.1.0-rc.2.tgz#ad4b464fd0133eab8d08c781c7d7c4e00bc4918d" + integrity sha512-iLTobfwqDk7iiQxvv5UowxOKywsh/77VlAVktstnFG3N3Y73+JYKzM0mGM/j4zM1OrjbF9/cnPnDVX7bATPz9w== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-validation "^1.19.2" -"@abp/jquery@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.1.tgz#aa554accb16600fd586c3a4f088040cd26d0bde8" - integrity sha512-MtiRKOLyjEWux+whPP3+zwPbpj8or756JtgjnwOTDB9tp9HLCYUaskt+oalYPvob24nDZcNu2RnMALYdCVhZAQ== +"@abp/jquery@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.1.0-rc.2.tgz#0f64cad5b1ae3e47d2344e5fb30c347b89d6d2bb" + integrity sha512-YubZwMJIN+UcfxfUlt3usfcLMG9WcXNpemUsdBtlKNzti562KZMIHPFLRL+DsiqvzZ74h2PxSWWsxS42Z7z0Yw== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" jquery "~3.5.1" -"@abp/lodash@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.1.tgz#ec261ccaab8a70d5b32a8a7c22387e48936d38d4" - integrity sha512-Dav1QKbBeGR4VVbHHe1s3OEzN7wnb9K/vwzHrWmtO8D1Q5Z3433xjNmgL5VQ9gfxXqooSfEO4gAovZklMDHDew== +"@abp/lodash@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.1.0-rc.2.tgz#9281c641ab7b7b33e7acf12815dc461e7ae967b9" + integrity sha512-RqdekrAyLPaLNJddmrq89EdrI1xg4296tOafFLHvirgRWisJTIa9bflTOwMwEg9FNdLJgA0zHi4WdAMer0qZdA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" lodash "^4.17.15" -"@abp/luxon@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.1.tgz#a540750b1605dbac856ce9c2e776c2fecf6392f9" - integrity sha512-eRumVB7UIf2XH6OZVUTvcKw0A/OSAfYV59fM+Wc4dAkNcmsNZI0gD1o0AigSGNCxTV6v+W2bFrsuooSqK99Y0Q== +"@abp/luxon@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.1.0-rc.2.tgz#78fc1cf651d7c19b87a31823cd3ce68961d6b1e6" + integrity sha512-U4e9uGZlg9xj9tBNP337v3wiaSR6qxWsBgh/duQGWrqV+75LlQjYcZaPoXDidUUS6U6epDSR2pc2T39rahcgSQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" luxon "^1.24.1" -"@abp/malihu-custom-scrollbar-plugin@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.1.tgz#0a556423a67b6c949e32ffcacd72256dea6c31ee" - integrity sha512-YTwYpnQ1ZrON70gvJcnNZRwB3Ze4olGcXxiPvmRgSHbGJkSnHYJiP6PvsN1F3HDFukAJ/iUu+WwEe8OBwlyLXA== +"@abp/malihu-custom-scrollbar-plugin@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.1.0-rc.2.tgz#36553e71052cad9734e0c9b2c65759e538468648" + integrity sha512-JQ6PCcj5qmF9MxNRPAsKHHnqBPCdn4lQnwxZrHcG9tD70Gx+NfC4UH41tqXI+htba4k0PHRyH2y39Q1iJm0NFA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.1.tgz#8983e7b5c3afb862f08b2730b70e59d726e9b5d5" - integrity sha512-WdzY2hvsS/4vz/VXpxq2muSzzE8ggchiIrICy/WKchJxL9L08DM796t6aE6rEl9wucY8XEzzWrPOVqAjJmnXFA== +"@abp/select2@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.1.0-rc.2.tgz#c48e865f401ddce32dff2a7a14ae07c4bde2f57b" + integrity sha512-YYK/SIqXQcSDQFMVg/ogohc76d4JDrOVQEbzfkNNI5bKVJo+hkqtNzAwV9FLdPZZNw15QMv0eF1ie4aUtIxyaA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.1.tgz#0088610915ad6db0a140b77832a37c10066eb4ee" - integrity sha512-t4/44oQCMngSjVqmeRWXwrXa/pRKc3CEpyyTiGIXki4dWJ21j0ePCw2l3rvOJWnpoCznhxa/UGxLfRfK1NEzRg== +"@abp/sweetalert@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.1.0-rc.2.tgz#cdcaf8e9a33cf218a687fd6a42cfe1c85d89c6b7" + integrity sha512-sjQd8TF9oUnaQ1OPTGdVyAfWqSZEk4bRbC/qw2CouEOfRLatzkC0JcmzFLN0f5N1am1RQwkFakpENKH7NqTCvg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" sweetalert "^2.1.2" -"@abp/timeago@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.1.tgz#8c161645534eb1f62fe4607450acf7345729e711" - integrity sha512-PsPobV79U2qzVY+WBsmJM1ohSF4jqcLnL4/7qyJvxlb1WwbCl1F5D4cpiJP4zsM4clPW4mbSsiauMNp+HTNKEA== +"@abp/timeago@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.1.0-rc.2.tgz#445d043ae482b76799b496ae6565abfaf75a34b9" + integrity sha512-wWx56EZMUGIfqJV5JLCvUp4RVhKXHYLQaVNQSF8E05COXmSQwFThVS7vbuiODFp2BGm6RAqCVtZDCreu2B8z9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.1.tgz#ecb6f6193b7edc3150d0614ab9457472baf1cce3" - integrity sha512-bTTz0O8zj7fMhdoummP2Ed5Z8SJTmR6svzNchBXNDrnRAcDQvTihPTcg0UpH8BEDFczbLowq09CG2A/RMSJoug== +"@abp/toastr@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.1.0-rc.2.tgz#1af16fa8687201b6b9c7229d087a4233998703b9" + integrity sha512-g+Jl5H1ZHoJ4JwWuix0xA+GMFY42pwq8WYjxP6qE2/Y2aixYHVIui15eBqF2L06yXOt53YFcC1+pxjrp91xHxw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" toastr "^2.1.4" -"@abp/utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" - integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== +"@abp/utils@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.2.tgz#eb6dbf0ee493d0f050b37347d2d6d283098aedae" + integrity sha512-V2k5I89lVBoeGIKgg4p2H9GlMAcDWbctwKZPVwBEMVEVm1uTR2xQAWdTdSFd5Q8I8Xsf/aIG8ELM7l5j2h7/zQ== dependencies: just-compare "^1.3.0" diff --git a/modules/cms-kit/angular/package.json b/modules/cms-kit/angular/package.json index 4794011186..3b3f453b0d 100644 --- a/modules/cms-kit/angular/package.json +++ b/modules/cms-kit/angular/package.json @@ -16,10 +16,10 @@ "private": true, "dependencies": { "@abp/ng.account": "~3.3.2", - "@abp/ng.identity": "~4.0.1", - "@abp/ng.setting-management": "~4.0.1", - "@abp/ng.tenant-management": "~4.0.1", - "@abp/ng.theme.basic": "~4.0.1", + "@abp/ng.identity": "~4.1.0-rc.2", + "@abp/ng.setting-management": "~4.1.0-rc.2", + "@abp/ng.tenant-management": "~4.1.0-rc.2", + "@abp/ng.theme.basic": "~4.1.0-rc.2", "@angular/animations": "~10.0.0", "@angular/common": "~10.0.0", "@angular/compiler": "~10.0.0", diff --git a/modules/cms-kit/angular/projects/cms-kit/package.json b/modules/cms-kit/angular/projects/cms-kit/package.json index 1f4bdfd77f..8dfe2a207e 100644 --- a/modules/cms-kit/angular/projects/cms-kit/package.json +++ b/modules/cms-kit/angular/projects/cms-kit/package.json @@ -4,8 +4,8 @@ "peerDependencies": { "@angular/common": "^9.1.11", "@angular/core": "^9.1.11", - "@abp/ng.core": ">=4.0.1", - "@abp/ng.theme.shared": ">=4.0.1" + "@abp/ng.core": ">=4.1.0-rc.2", + "@abp/ng.theme.shared": ">=4.1.0-rc.2" }, "dependencies": { "tslib": "^2.0.0" diff --git a/modules/cms-kit/common.props b/modules/cms-kit/common.props deleted file mode 100644 index 420d9c492c..0000000000 --- a/modules/cms-kit/common.props +++ /dev/null @@ -1,13 +0,0 @@ - - - latest - 0.1.0 - $(NoWarn);CS1591;CS0436 - module - - - - - - - \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Host.Shared/Volo.CmsKit.Host.Shared.csproj b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/Volo.CmsKit.Host.Shared.csproj index c6a4484865..aca54af174 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Host.Shared/Volo.CmsKit.Host.Shared.csproj +++ b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/Volo.CmsKit.Host.Shared.csproj @@ -1,7 +1,5 @@ - - netstandard2.0 Volo.CmsKit diff --git a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj index 95c8963f1f..688c47bc87 100644 --- a/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj +++ b/modules/cms-kit/host/Volo.CmsKit.HttpApi.Host/Volo.CmsKit.HttpApi.Host.csproj @@ -1,7 +1,5 @@ - - net5.0 Volo.CmsKit @@ -10,13 +8,13 @@ - + - + - - - + + + diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj index c8bffec85e..d70327c249 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/Volo.CmsKit.IdentityServer.csproj @@ -8,11 +8,11 @@ - + - - - + + + diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json index 5e131b4756..8f06264a30 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-identityserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^4.1.0-rc.2" } } \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock index 12469bed18..49043f9055 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.1.tgz#ce8e3eb830a8e8f9eecb1a3b3bd70c2832fdf15e" - integrity sha512-w+ZG8Ewx9wWfbvRC2MAjJl+rXuXSHLhhGOiJTk68unWLNziDtNQzcSXG/Z5c1hA+acJSGqDoJGEGs4FVM136og== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.1.tgz#cd9d0eb11309c597dffd26277cd1bd7c5b1e0e2f" - integrity sha512-QGoCN/my0eAfa4tx5ytDxArIoz2i58jFFVUGso1Lekn54JvSt+WLz2p3uyTGatZ03Bp9836elhFnIopn12WvBw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~4.0.1" - "@abp/bootstrap" "~4.0.1" - "@abp/bootstrap-datepicker" "~4.0.1" - "@abp/datatables.net-bs4" "~4.0.1" - "@abp/font-awesome" "~4.0.1" - "@abp/jquery-form" "~4.0.1" - "@abp/jquery-validation-unobtrusive" "~4.0.1" - "@abp/lodash" "~4.0.1" - "@abp/luxon" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/select2" "~4.0.1" - "@abp/sweetalert" "~4.0.1" - "@abp/timeago" "~4.0.1" - "@abp/toastr" "~4.0.1" - -"@abp/aspnetcore.mvc.ui@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.1.tgz#6490c147a56e4f7055d2ca77f20baf1f60f56867" - integrity sha512-4B3icJrlpuZgMaX52ninyaenH7zLwepePEscDrLaFY9wyonKpZ2zh+xplnyM6vjNd+PhErWuA2+ssCswFhrJ3A== +"@abp/aspnetcore.mvc.ui.theme.basic@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.1.0-rc.2.tgz#b9462cbe36c41d68e2f44b79a3a2dba2c1b2b54a" + integrity sha512-KW3J6HnN1zZrCmrWmEcXBnGIOeuJDdp1jUECAm4Bdxi++VzfIbGlVvpcvUdT1E213reOUWi4dPhcej12DwrmDw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui.theme.shared@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.1.0-rc.2.tgz#d64cea1e504bcd3a08a1819025d40f3f84f0aadc" + integrity sha512-A/DRLwtJO7YCdqAgSF84wNRKjvGEQvcBocIwRxXCJEe3drxMoSwkAGjXQlxIYWZKdYbYUWDTjil2Mvwf91GUqg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~4.1.0-rc.2" + "@abp/bootstrap" "~4.1.0-rc.2" + "@abp/bootstrap-datepicker" "~4.1.0-rc.2" + "@abp/datatables.net-bs4" "~4.1.0-rc.2" + "@abp/font-awesome" "~4.1.0-rc.2" + "@abp/jquery-form" "~4.1.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~4.1.0-rc.2" + "@abp/lodash" "~4.1.0-rc.2" + "@abp/luxon" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/select2" "~4.1.0-rc.2" + "@abp/sweetalert" "~4.1.0-rc.2" + "@abp/timeago" "~4.1.0-rc.2" + "@abp/toastr" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.1.0-rc.2.tgz#54bf30def590e6d25fc35f77253888f3d9f74b9c" + integrity sha512-eOh5IBn4eNAjj2i6tlLRIV/r61Ef7+Z3PNvGgdml/XCo50el4G9XE7shxuGOY+MaFMfmsST2tcJlO9iAo9n2Yw== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,145 +43,145 @@ micromatch "^4.0.2" path "^0.12.7" -"@abp/bootstrap-datepicker@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.1.tgz#aad891263edff66f816e003ba4fa7f8acfe8e0b6" - integrity sha512-S0oaVZmXsDcOJLAyoGY0TvP/7bZx0GHIbU9BIhIL2Wl74HYaokjkTr6/IleIek9YeiF2vm9FkrUP1dKH/4f7Gg== +"@abp/bootstrap-datepicker@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.1.0-rc.2.tgz#d3fe863222a11771d366b1a3c246aaf34df94081" + integrity sha512-vn2xWAK3xqo5fMZJ9dOAZZmL+ZUnzZZNh3lF6uA97wTN/SbePlmHBYJpsCKIxOwbJS2HCvekHGJN/Ps4oEjlbw== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.1.tgz#3e41bdf9b3e9f8c497b9fafe22a4851d0401b31b" - integrity sha512-GoSaNWvswRHVoUrq7xClFQYtwqIlyS/vp/TdY+j5FFZP7ud89+ZGpdNqYqq5l9/6aaYa7v4b9mNTZ/1JRzAOYg== +"@abp/bootstrap@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.1.0-rc.2.tgz#b5132cf4c4c92fe833823cf2b91ab1b0167b0ecf" + integrity sha512-SsWEV0DveBIHiG051E6aBB371D15QIsGeo+POFhvQUvrlmzMBlFCAlmH0ef8w1n+3M3C37irCgEGKctt2pbcxQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" bootstrap "^4.5.0" bootstrap-v4-rtl "4.4.1-2" -"@abp/core@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.1.tgz#1df32bc058f45571605670ca81c226a1bd87400c" - integrity sha512-8UT5lwqV/luVG/SxePSTD2FRbZXwXv3cZJKjw+gpBjhD0slWrh51XEOHsM8ciTuhcvV/tsqVU9nXckDMdO58fw== +"@abp/core@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.1.0-rc.2.tgz#d306106a53fa56109751be0099785c94f43be56f" + integrity sha512-b0mOYSz8hNgZ/hBeYg8hkthJgE8CLyHNa2NcythPoIW8RR5qHmDtGoFnuFovLvLk7r+M4NWyxXRKEshSszIPyA== dependencies: - "@abp/utils" "^4.0.1" + "@abp/utils" "^4.1.0-rc.2" -"@abp/datatables.net-bs4@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.1.tgz#7538baad0eff24eca7f4246d020852f83139f645" - integrity sha512-S52jNPF4if68V+P/33NrtGPJXf6xrqgyZzz9b7qBR7HuUm3Nsn7bAslh3JNduNec/sFuE4Utl/xsFHZNjBWEog== +"@abp/datatables.net-bs4@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.1.0-rc.2.tgz#99aa1fbad91939fc23265324a3d8a45d0c1e5a7a" + integrity sha512-Y9UyqniOkx5DJO+2GGurnQE1yfRmGaQ3y7V07gKWRq+gHLUhE+vfgOLVpGM6ufdTIbLvVw5Ng+3gfOmPlUnpxg== dependencies: - "@abp/datatables.net" "~4.0.1" + "@abp/datatables.net" "~4.1.0-rc.2" datatables.net-bs4 "^1.10.21" -"@abp/datatables.net@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.1.tgz#eb89716a37351c41b5bccfc2db88fc7ceb991a26" - integrity sha512-APFLui0w8MqsBWqP/K0QkT5cBq5SsWiqMaIGTXQKinMVLV597sUszrlhe1ISU2PqeD7iX6pCZNNOTI1NEUn9/Q== +"@abp/datatables.net@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.1.0-rc.2.tgz#1a134688259d32187d822d8a49c7a68b4cc226c7" + integrity sha512-9o5g8s7ZTlThd1FMFmO7wS+MxmXgUMmiWx7Hwara9ypfJPd0vanz10bQAdTpLiDy/aa0tUmz0xOVj73yvBJm9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" datatables.net "^1.10.21" -"@abp/font-awesome@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.1.tgz#8a9d83b2c2adfcd5abcbd9c31c315460d44a321e" - integrity sha512-+6+m/DKMnfkeQiWUsMlB6Da8u6yREyN2oQYGYhSRAK8419ym8RHHrqKJv2AClI4iLq2ppHZj8WF84+SeoCekRg== +"@abp/font-awesome@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.1.0-rc.2.tgz#ecf490861c09250cf61611ac74cec5ab4392e807" + integrity sha512-6yAsf/ee2hdrHHUACql8c3gY54Hd7YAK2olHymyc3Io2hhK2VxXRc2W2oRSwbQ9GsSE+XDrEVtjIR64nBseTeg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" "@fortawesome/fontawesome-free" "^5.13.0" -"@abp/jquery-form@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.1.tgz#6dc1922b2800dd635f20881a82e08104a1dd1bb5" - integrity sha512-JMBZYu/MI/GjaLTBOMB5iv8cagnLpReDULNC3r6tLNNqB1R8f3Cg1T7nF4YCuU9SYMqis1P/AuE4oEh+4rQdAQ== +"@abp/jquery-form@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.1.0-rc.2.tgz#76dff67a3fe6e6ad7bd60bb909de93c09966cc0a" + integrity sha512-LGafwxyRYUbHQlJ9pPbYdkVqzdT/y1Fp4Nr4C3W5jxsJuaSICl0RPkRHIPALeoqbpEWuj6dVep6ZuO9hhxBzNw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.1.tgz#4142ca31c0830fe24a1467e8cf13b55ba9d7c1dd" - integrity sha512-rdSRTcdKCHmarbrVgmPYdTiJ0G/aFKd+dr0krO7fALPTuQKChbDnHOO4/JvQSc+cd9faxa8c6ZWvlHdsof23tQ== +"@abp/jquery-validation-unobtrusive@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.1.0-rc.2.tgz#1f1d395cfa47740d47303ff512592ff1993f9e13" + integrity sha512-0LXWvgfyLHVw7qRVOmY0rfVlq+yJq/nhbcVoYK+QbmKnrFu+KZg0KNMOD8wTXs8mZ1EKGQpoQKWxImtCnGrV/A== dependencies: - "@abp/jquery-validation" "~4.0.1" + "@abp/jquery-validation" "~4.1.0-rc.2" jquery-validation-unobtrusive "^3.2.11" -"@abp/jquery-validation@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.1.tgz#74e7d795468c6986f2db15662631fcd4f67c679e" - integrity sha512-FX26aQCsMBdVWAJb7S37Lt7KoHAEHoYguh/qfZIARCpOYOOWvxfDz1wTrmADUkqdillqEiCeD/Imj8bYH9Faaw== +"@abp/jquery-validation@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.1.0-rc.2.tgz#ad4b464fd0133eab8d08c781c7d7c4e00bc4918d" + integrity sha512-iLTobfwqDk7iiQxvv5UowxOKywsh/77VlAVktstnFG3N3Y73+JYKzM0mGM/j4zM1OrjbF9/cnPnDVX7bATPz9w== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-validation "^1.19.2" -"@abp/jquery@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.1.tgz#aa554accb16600fd586c3a4f088040cd26d0bde8" - integrity sha512-MtiRKOLyjEWux+whPP3+zwPbpj8or756JtgjnwOTDB9tp9HLCYUaskt+oalYPvob24nDZcNu2RnMALYdCVhZAQ== +"@abp/jquery@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.1.0-rc.2.tgz#0f64cad5b1ae3e47d2344e5fb30c347b89d6d2bb" + integrity sha512-YubZwMJIN+UcfxfUlt3usfcLMG9WcXNpemUsdBtlKNzti562KZMIHPFLRL+DsiqvzZ74h2PxSWWsxS42Z7z0Yw== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" jquery "~3.5.1" -"@abp/lodash@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.1.tgz#ec261ccaab8a70d5b32a8a7c22387e48936d38d4" - integrity sha512-Dav1QKbBeGR4VVbHHe1s3OEzN7wnb9K/vwzHrWmtO8D1Q5Z3433xjNmgL5VQ9gfxXqooSfEO4gAovZklMDHDew== +"@abp/lodash@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.1.0-rc.2.tgz#9281c641ab7b7b33e7acf12815dc461e7ae967b9" + integrity sha512-RqdekrAyLPaLNJddmrq89EdrI1xg4296tOafFLHvirgRWisJTIa9bflTOwMwEg9FNdLJgA0zHi4WdAMer0qZdA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" lodash "^4.17.15" -"@abp/luxon@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.1.tgz#a540750b1605dbac856ce9c2e776c2fecf6392f9" - integrity sha512-eRumVB7UIf2XH6OZVUTvcKw0A/OSAfYV59fM+Wc4dAkNcmsNZI0gD1o0AigSGNCxTV6v+W2bFrsuooSqK99Y0Q== +"@abp/luxon@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.1.0-rc.2.tgz#78fc1cf651d7c19b87a31823cd3ce68961d6b1e6" + integrity sha512-U4e9uGZlg9xj9tBNP337v3wiaSR6qxWsBgh/duQGWrqV+75LlQjYcZaPoXDidUUS6U6epDSR2pc2T39rahcgSQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" luxon "^1.24.1" -"@abp/malihu-custom-scrollbar-plugin@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.1.tgz#0a556423a67b6c949e32ffcacd72256dea6c31ee" - integrity sha512-YTwYpnQ1ZrON70gvJcnNZRwB3Ze4olGcXxiPvmRgSHbGJkSnHYJiP6PvsN1F3HDFukAJ/iUu+WwEe8OBwlyLXA== +"@abp/malihu-custom-scrollbar-plugin@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.1.0-rc.2.tgz#36553e71052cad9734e0c9b2c65759e538468648" + integrity sha512-JQ6PCcj5qmF9MxNRPAsKHHnqBPCdn4lQnwxZrHcG9tD70Gx+NfC4UH41tqXI+htba4k0PHRyH2y39Q1iJm0NFA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.1.tgz#8983e7b5c3afb862f08b2730b70e59d726e9b5d5" - integrity sha512-WdzY2hvsS/4vz/VXpxq2muSzzE8ggchiIrICy/WKchJxL9L08DM796t6aE6rEl9wucY8XEzzWrPOVqAjJmnXFA== +"@abp/select2@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.1.0-rc.2.tgz#c48e865f401ddce32dff2a7a14ae07c4bde2f57b" + integrity sha512-YYK/SIqXQcSDQFMVg/ogohc76d4JDrOVQEbzfkNNI5bKVJo+hkqtNzAwV9FLdPZZNw15QMv0eF1ie4aUtIxyaA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.1.tgz#0088610915ad6db0a140b77832a37c10066eb4ee" - integrity sha512-t4/44oQCMngSjVqmeRWXwrXa/pRKc3CEpyyTiGIXki4dWJ21j0ePCw2l3rvOJWnpoCznhxa/UGxLfRfK1NEzRg== +"@abp/sweetalert@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.1.0-rc.2.tgz#cdcaf8e9a33cf218a687fd6a42cfe1c85d89c6b7" + integrity sha512-sjQd8TF9oUnaQ1OPTGdVyAfWqSZEk4bRbC/qw2CouEOfRLatzkC0JcmzFLN0f5N1am1RQwkFakpENKH7NqTCvg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" sweetalert "^2.1.2" -"@abp/timeago@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.1.tgz#8c161645534eb1f62fe4607450acf7345729e711" - integrity sha512-PsPobV79U2qzVY+WBsmJM1ohSF4jqcLnL4/7qyJvxlb1WwbCl1F5D4cpiJP4zsM4clPW4mbSsiauMNp+HTNKEA== +"@abp/timeago@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.1.0-rc.2.tgz#445d043ae482b76799b496ae6565abfaf75a34b9" + integrity sha512-wWx56EZMUGIfqJV5JLCvUp4RVhKXHYLQaVNQSF8E05COXmSQwFThVS7vbuiODFp2BGm6RAqCVtZDCreu2B8z9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.1.tgz#ecb6f6193b7edc3150d0614ab9457472baf1cce3" - integrity sha512-bTTz0O8zj7fMhdoummP2Ed5Z8SJTmR6svzNchBXNDrnRAcDQvTihPTcg0UpH8BEDFczbLowq09CG2A/RMSJoug== +"@abp/toastr@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.1.0-rc.2.tgz#1af16fa8687201b6b9c7229d087a4233998703b9" + integrity sha512-g+Jl5H1ZHoJ4JwWuix0xA+GMFY42pwq8WYjxP6qE2/Y2aixYHVIui15eBqF2L06yXOt53YFcC1+pxjrp91xHxw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" toastr "^2.1.4" -"@abp/utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" - integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== +"@abp/utils@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.2.tgz#eb6dbf0ee493d0f050b37347d2d6d283098aedae" + integrity sha512-V2k5I89lVBoeGIKgg4p2H9GlMAcDWbctwKZPVwBEMVEVm1uTR2xQAWdTdSFd5Q8I8Xsf/aIG8ELM7l5j2h7/zQ== dependencies: just-compare "^1.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.csproj b/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.csproj index 955cf491ed..266590c86b 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.csproj +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/Volo.CmsKit.Web.Host.csproj @@ -1,7 +1,5 @@ - - net5.0 Volo.CmsKit @@ -10,11 +8,11 @@ - + - - - + + + diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json index 1171b7f8a6..90988e3200 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^4.1.0-rc.2" } } \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock index b5cd1b1d1c..f795a58ffd 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.1.tgz#ce8e3eb830a8e8f9eecb1a3b3bd70c2832fdf15e" - integrity sha512-w+ZG8Ewx9wWfbvRC2MAjJl+rXuXSHLhhGOiJTk68unWLNziDtNQzcSXG/Z5c1hA+acJSGqDoJGEGs4FVM136og== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.1.tgz#cd9d0eb11309c597dffd26277cd1bd7c5b1e0e2f" - integrity sha512-QGoCN/my0eAfa4tx5ytDxArIoz2i58jFFVUGso1Lekn54JvSt+WLz2p3uyTGatZ03Bp9836elhFnIopn12WvBw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~4.0.1" - "@abp/bootstrap" "~4.0.1" - "@abp/bootstrap-datepicker" "~4.0.1" - "@abp/datatables.net-bs4" "~4.0.1" - "@abp/font-awesome" "~4.0.1" - "@abp/jquery-form" "~4.0.1" - "@abp/jquery-validation-unobtrusive" "~4.0.1" - "@abp/lodash" "~4.0.1" - "@abp/luxon" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/select2" "~4.0.1" - "@abp/sweetalert" "~4.0.1" - "@abp/timeago" "~4.0.1" - "@abp/toastr" "~4.0.1" - -"@abp/aspnetcore.mvc.ui@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.1.tgz#6490c147a56e4f7055d2ca77f20baf1f60f56867" - integrity sha512-4B3icJrlpuZgMaX52ninyaenH7zLwepePEscDrLaFY9wyonKpZ2zh+xplnyM6vjNd+PhErWuA2+ssCswFhrJ3A== +"@abp/aspnetcore.mvc.ui.theme.basic@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.1.0-rc.2.tgz#b9462cbe36c41d68e2f44b79a3a2dba2c1b2b54a" + integrity sha512-KW3J6HnN1zZrCmrWmEcXBnGIOeuJDdp1jUECAm4Bdxi++VzfIbGlVvpcvUdT1E213reOUWi4dPhcej12DwrmDw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui.theme.shared@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.1.0-rc.2.tgz#d64cea1e504bcd3a08a1819025d40f3f84f0aadc" + integrity sha512-A/DRLwtJO7YCdqAgSF84wNRKjvGEQvcBocIwRxXCJEe3drxMoSwkAGjXQlxIYWZKdYbYUWDTjil2Mvwf91GUqg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~4.1.0-rc.2" + "@abp/bootstrap" "~4.1.0-rc.2" + "@abp/bootstrap-datepicker" "~4.1.0-rc.2" + "@abp/datatables.net-bs4" "~4.1.0-rc.2" + "@abp/font-awesome" "~4.1.0-rc.2" + "@abp/jquery-form" "~4.1.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~4.1.0-rc.2" + "@abp/lodash" "~4.1.0-rc.2" + "@abp/luxon" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/select2" "~4.1.0-rc.2" + "@abp/sweetalert" "~4.1.0-rc.2" + "@abp/timeago" "~4.1.0-rc.2" + "@abp/toastr" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.1.0-rc.2.tgz#54bf30def590e6d25fc35f77253888f3d9f74b9c" + integrity sha512-eOh5IBn4eNAjj2i6tlLRIV/r61Ef7+Z3PNvGgdml/XCo50el4G9XE7shxuGOY+MaFMfmsST2tcJlO9iAo9n2Yw== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,145 +43,145 @@ micromatch "^4.0.2" path "^0.12.7" -"@abp/bootstrap-datepicker@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.1.tgz#aad891263edff66f816e003ba4fa7f8acfe8e0b6" - integrity sha512-S0oaVZmXsDcOJLAyoGY0TvP/7bZx0GHIbU9BIhIL2Wl74HYaokjkTr6/IleIek9YeiF2vm9FkrUP1dKH/4f7Gg== +"@abp/bootstrap-datepicker@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.1.0-rc.2.tgz#d3fe863222a11771d366b1a3c246aaf34df94081" + integrity sha512-vn2xWAK3xqo5fMZJ9dOAZZmL+ZUnzZZNh3lF6uA97wTN/SbePlmHBYJpsCKIxOwbJS2HCvekHGJN/Ps4oEjlbw== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.1.tgz#3e41bdf9b3e9f8c497b9fafe22a4851d0401b31b" - integrity sha512-GoSaNWvswRHVoUrq7xClFQYtwqIlyS/vp/TdY+j5FFZP7ud89+ZGpdNqYqq5l9/6aaYa7v4b9mNTZ/1JRzAOYg== +"@abp/bootstrap@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.1.0-rc.2.tgz#b5132cf4c4c92fe833823cf2b91ab1b0167b0ecf" + integrity sha512-SsWEV0DveBIHiG051E6aBB371D15QIsGeo+POFhvQUvrlmzMBlFCAlmH0ef8w1n+3M3C37irCgEGKctt2pbcxQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" bootstrap "^4.5.0" bootstrap-v4-rtl "4.4.1-2" -"@abp/core@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.1.tgz#1df32bc058f45571605670ca81c226a1bd87400c" - integrity sha512-8UT5lwqV/luVG/SxePSTD2FRbZXwXv3cZJKjw+gpBjhD0slWrh51XEOHsM8ciTuhcvV/tsqVU9nXckDMdO58fw== +"@abp/core@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.1.0-rc.2.tgz#d306106a53fa56109751be0099785c94f43be56f" + integrity sha512-b0mOYSz8hNgZ/hBeYg8hkthJgE8CLyHNa2NcythPoIW8RR5qHmDtGoFnuFovLvLk7r+M4NWyxXRKEshSszIPyA== dependencies: - "@abp/utils" "^4.0.1" + "@abp/utils" "^4.1.0-rc.2" -"@abp/datatables.net-bs4@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.1.tgz#7538baad0eff24eca7f4246d020852f83139f645" - integrity sha512-S52jNPF4if68V+P/33NrtGPJXf6xrqgyZzz9b7qBR7HuUm3Nsn7bAslh3JNduNec/sFuE4Utl/xsFHZNjBWEog== +"@abp/datatables.net-bs4@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.1.0-rc.2.tgz#99aa1fbad91939fc23265324a3d8a45d0c1e5a7a" + integrity sha512-Y9UyqniOkx5DJO+2GGurnQE1yfRmGaQ3y7V07gKWRq+gHLUhE+vfgOLVpGM6ufdTIbLvVw5Ng+3gfOmPlUnpxg== dependencies: - "@abp/datatables.net" "~4.0.1" + "@abp/datatables.net" "~4.1.0-rc.2" datatables.net-bs4 "^1.10.21" -"@abp/datatables.net@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.1.tgz#eb89716a37351c41b5bccfc2db88fc7ceb991a26" - integrity sha512-APFLui0w8MqsBWqP/K0QkT5cBq5SsWiqMaIGTXQKinMVLV597sUszrlhe1ISU2PqeD7iX6pCZNNOTI1NEUn9/Q== +"@abp/datatables.net@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.1.0-rc.2.tgz#1a134688259d32187d822d8a49c7a68b4cc226c7" + integrity sha512-9o5g8s7ZTlThd1FMFmO7wS+MxmXgUMmiWx7Hwara9ypfJPd0vanz10bQAdTpLiDy/aa0tUmz0xOVj73yvBJm9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" datatables.net "^1.10.21" -"@abp/font-awesome@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.1.tgz#8a9d83b2c2adfcd5abcbd9c31c315460d44a321e" - integrity sha512-+6+m/DKMnfkeQiWUsMlB6Da8u6yREyN2oQYGYhSRAK8419ym8RHHrqKJv2AClI4iLq2ppHZj8WF84+SeoCekRg== +"@abp/font-awesome@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.1.0-rc.2.tgz#ecf490861c09250cf61611ac74cec5ab4392e807" + integrity sha512-6yAsf/ee2hdrHHUACql8c3gY54Hd7YAK2olHymyc3Io2hhK2VxXRc2W2oRSwbQ9GsSE+XDrEVtjIR64nBseTeg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" "@fortawesome/fontawesome-free" "^5.13.0" -"@abp/jquery-form@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.1.tgz#6dc1922b2800dd635f20881a82e08104a1dd1bb5" - integrity sha512-JMBZYu/MI/GjaLTBOMB5iv8cagnLpReDULNC3r6tLNNqB1R8f3Cg1T7nF4YCuU9SYMqis1P/AuE4oEh+4rQdAQ== +"@abp/jquery-form@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.1.0-rc.2.tgz#76dff67a3fe6e6ad7bd60bb909de93c09966cc0a" + integrity sha512-LGafwxyRYUbHQlJ9pPbYdkVqzdT/y1Fp4Nr4C3W5jxsJuaSICl0RPkRHIPALeoqbpEWuj6dVep6ZuO9hhxBzNw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.1.tgz#4142ca31c0830fe24a1467e8cf13b55ba9d7c1dd" - integrity sha512-rdSRTcdKCHmarbrVgmPYdTiJ0G/aFKd+dr0krO7fALPTuQKChbDnHOO4/JvQSc+cd9faxa8c6ZWvlHdsof23tQ== +"@abp/jquery-validation-unobtrusive@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.1.0-rc.2.tgz#1f1d395cfa47740d47303ff512592ff1993f9e13" + integrity sha512-0LXWvgfyLHVw7qRVOmY0rfVlq+yJq/nhbcVoYK+QbmKnrFu+KZg0KNMOD8wTXs8mZ1EKGQpoQKWxImtCnGrV/A== dependencies: - "@abp/jquery-validation" "~4.0.1" + "@abp/jquery-validation" "~4.1.0-rc.2" jquery-validation-unobtrusive "^3.2.11" -"@abp/jquery-validation@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.1.tgz#74e7d795468c6986f2db15662631fcd4f67c679e" - integrity sha512-FX26aQCsMBdVWAJb7S37Lt7KoHAEHoYguh/qfZIARCpOYOOWvxfDz1wTrmADUkqdillqEiCeD/Imj8bYH9Faaw== +"@abp/jquery-validation@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.1.0-rc.2.tgz#ad4b464fd0133eab8d08c781c7d7c4e00bc4918d" + integrity sha512-iLTobfwqDk7iiQxvv5UowxOKywsh/77VlAVktstnFG3N3Y73+JYKzM0mGM/j4zM1OrjbF9/cnPnDVX7bATPz9w== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-validation "^1.19.2" -"@abp/jquery@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.1.tgz#aa554accb16600fd586c3a4f088040cd26d0bde8" - integrity sha512-MtiRKOLyjEWux+whPP3+zwPbpj8or756JtgjnwOTDB9tp9HLCYUaskt+oalYPvob24nDZcNu2RnMALYdCVhZAQ== +"@abp/jquery@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.1.0-rc.2.tgz#0f64cad5b1ae3e47d2344e5fb30c347b89d6d2bb" + integrity sha512-YubZwMJIN+UcfxfUlt3usfcLMG9WcXNpemUsdBtlKNzti562KZMIHPFLRL+DsiqvzZ74h2PxSWWsxS42Z7z0Yw== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" jquery "~3.5.1" -"@abp/lodash@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.1.tgz#ec261ccaab8a70d5b32a8a7c22387e48936d38d4" - integrity sha512-Dav1QKbBeGR4VVbHHe1s3OEzN7wnb9K/vwzHrWmtO8D1Q5Z3433xjNmgL5VQ9gfxXqooSfEO4gAovZklMDHDew== +"@abp/lodash@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.1.0-rc.2.tgz#9281c641ab7b7b33e7acf12815dc461e7ae967b9" + integrity sha512-RqdekrAyLPaLNJddmrq89EdrI1xg4296tOafFLHvirgRWisJTIa9bflTOwMwEg9FNdLJgA0zHi4WdAMer0qZdA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" lodash "^4.17.15" -"@abp/luxon@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.1.tgz#a540750b1605dbac856ce9c2e776c2fecf6392f9" - integrity sha512-eRumVB7UIf2XH6OZVUTvcKw0A/OSAfYV59fM+Wc4dAkNcmsNZI0gD1o0AigSGNCxTV6v+W2bFrsuooSqK99Y0Q== +"@abp/luxon@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.1.0-rc.2.tgz#78fc1cf651d7c19b87a31823cd3ce68961d6b1e6" + integrity sha512-U4e9uGZlg9xj9tBNP337v3wiaSR6qxWsBgh/duQGWrqV+75LlQjYcZaPoXDidUUS6U6epDSR2pc2T39rahcgSQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" luxon "^1.24.1" -"@abp/malihu-custom-scrollbar-plugin@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.1.tgz#0a556423a67b6c949e32ffcacd72256dea6c31ee" - integrity sha512-YTwYpnQ1ZrON70gvJcnNZRwB3Ze4olGcXxiPvmRgSHbGJkSnHYJiP6PvsN1F3HDFukAJ/iUu+WwEe8OBwlyLXA== +"@abp/malihu-custom-scrollbar-plugin@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.1.0-rc.2.tgz#36553e71052cad9734e0c9b2c65759e538468648" + integrity sha512-JQ6PCcj5qmF9MxNRPAsKHHnqBPCdn4lQnwxZrHcG9tD70Gx+NfC4UH41tqXI+htba4k0PHRyH2y39Q1iJm0NFA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.1.tgz#8983e7b5c3afb862f08b2730b70e59d726e9b5d5" - integrity sha512-WdzY2hvsS/4vz/VXpxq2muSzzE8ggchiIrICy/WKchJxL9L08DM796t6aE6rEl9wucY8XEzzWrPOVqAjJmnXFA== +"@abp/select2@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.1.0-rc.2.tgz#c48e865f401ddce32dff2a7a14ae07c4bde2f57b" + integrity sha512-YYK/SIqXQcSDQFMVg/ogohc76d4JDrOVQEbzfkNNI5bKVJo+hkqtNzAwV9FLdPZZNw15QMv0eF1ie4aUtIxyaA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.1.tgz#0088610915ad6db0a140b77832a37c10066eb4ee" - integrity sha512-t4/44oQCMngSjVqmeRWXwrXa/pRKc3CEpyyTiGIXki4dWJ21j0ePCw2l3rvOJWnpoCznhxa/UGxLfRfK1NEzRg== +"@abp/sweetalert@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.1.0-rc.2.tgz#cdcaf8e9a33cf218a687fd6a42cfe1c85d89c6b7" + integrity sha512-sjQd8TF9oUnaQ1OPTGdVyAfWqSZEk4bRbC/qw2CouEOfRLatzkC0JcmzFLN0f5N1am1RQwkFakpENKH7NqTCvg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" sweetalert "^2.1.2" -"@abp/timeago@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.1.tgz#8c161645534eb1f62fe4607450acf7345729e711" - integrity sha512-PsPobV79U2qzVY+WBsmJM1ohSF4jqcLnL4/7qyJvxlb1WwbCl1F5D4cpiJP4zsM4clPW4mbSsiauMNp+HTNKEA== +"@abp/timeago@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.1.0-rc.2.tgz#445d043ae482b76799b496ae6565abfaf75a34b9" + integrity sha512-wWx56EZMUGIfqJV5JLCvUp4RVhKXHYLQaVNQSF8E05COXmSQwFThVS7vbuiODFp2BGm6RAqCVtZDCreu2B8z9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.1.tgz#ecb6f6193b7edc3150d0614ab9457472baf1cce3" - integrity sha512-bTTz0O8zj7fMhdoummP2Ed5Z8SJTmR6svzNchBXNDrnRAcDQvTihPTcg0UpH8BEDFczbLowq09CG2A/RMSJoug== +"@abp/toastr@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.1.0-rc.2.tgz#1af16fa8687201b6b9c7229d087a4233998703b9" + integrity sha512-g+Jl5H1ZHoJ4JwWuix0xA+GMFY42pwq8WYjxP6qE2/Y2aixYHVIui15eBqF2L06yXOt53YFcC1+pxjrp91xHxw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" toastr "^2.1.4" -"@abp/utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" - integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== +"@abp/utils@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.2.tgz#eb6dbf0ee493d0f050b37347d2d6d283098aedae" + integrity sha512-V2k5I89lVBoeGIKgg4p2H9GlMAcDWbctwKZPVwBEMVEVm1uTR2xQAWdTdSFd5Q8I8Xsf/aIG8ELM7l5j2h7/zQ== dependencies: just-compare "^1.3.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs index 483d54d9d5..2055266d20 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs @@ -18,6 +18,7 @@ using Volo.Abp.Autofac; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.SqlServer; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; using Volo.Abp.FeatureManagement; using Volo.Abp.Identity; using Volo.Abp.Identity.EntityFrameworkCore; @@ -56,6 +57,8 @@ namespace Volo.CmsKit typeof(AbpIdentityEntityFrameworkCoreModule), typeof(AbpPermissionManagementDomainIdentityModule), typeof(AbpFeatureManagementApplicationModule), + typeof(AbpFeatureManagementEntityFrameworkCoreModule), + typeof(AbpFeatureManagementWebModule), typeof(AbpTenantManagementWebModule), typeof(AbpTenantManagementApplicationModule), typeof(AbpTenantManagementEntityFrameworkCoreModule), diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/EntityFrameworkCore/UnifiedDbContext.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/EntityFrameworkCore/UnifiedDbContext.cs index 5eade47bd7..d1b31e0ae7 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/EntityFrameworkCore/UnifiedDbContext.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/EntityFrameworkCore/UnifiedDbContext.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Volo.Abp.AuditLogging.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; using Volo.Abp.Identity.EntityFrameworkCore; using Volo.Abp.PermissionManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore; @@ -25,6 +26,7 @@ namespace Volo.CmsKit.EntityFrameworkCore modelBuilder.ConfigureAuditLogging(); modelBuilder.ConfigureIdentity(); modelBuilder.ConfigureTenantManagement(); + modelBuilder.ConfigureFeatureManagement(); modelBuilder.ConfigureCmsKit(); } } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20201013061938_Initial.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20201013061938_Initial.cs deleted file mode 100644 index 73df34b298..0000000000 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20201013061938_Initial.cs +++ /dev/null @@ -1,749 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -namespace Volo.CmsKit.Migrations -{ - public partial class Initial : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "AbpAuditLogs", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - ApplicationName = table.Column(maxLength: 96, nullable: true), - UserId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: true), - TenantId = table.Column(nullable: true), - TenantName = table.Column(nullable: true), - ImpersonatorUserId = table.Column(nullable: true), - ImpersonatorTenantId = table.Column(nullable: true), - ExecutionTime = table.Column(nullable: false), - ExecutionDuration = table.Column(nullable: false), - ClientIpAddress = table.Column(maxLength: 64, nullable: true), - ClientName = table.Column(maxLength: 128, nullable: true), - ClientId = table.Column(maxLength: 64, nullable: true), - CorrelationId = table.Column(maxLength: 64, nullable: true), - BrowserInfo = table.Column(maxLength: 512, nullable: true), - HttpMethod = table.Column(maxLength: 16, nullable: true), - Url = table.Column(maxLength: 256, nullable: true), - Exceptions = table.Column(maxLength: 4000, nullable: true), - Comments = table.Column(maxLength: 256, nullable: true), - HttpStatusCode = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpClaimTypes", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - Name = table.Column(maxLength: 256, nullable: false), - Required = table.Column(nullable: false), - IsStatic = table.Column(nullable: false), - Regex = table.Column(maxLength: 512, nullable: true), - RegexDescription = table.Column(maxLength: 128, nullable: true), - Description = table.Column(maxLength: 256, nullable: true), - ValueType = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpOrganizationUnits", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - TenantId = table.Column(nullable: true), - ParentId = table.Column(nullable: true), - Code = table.Column(maxLength: 95, nullable: false), - DisplayName = table.Column(maxLength: 128, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpOrganizationUnits", x => x.Id); - table.ForeignKey( - name: "FK_AbpOrganizationUnits_AbpOrganizationUnits_ParentId", - column: x => x.ParentId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - }); - - migrationBuilder.CreateTable( - name: "AbpPermissionGrants", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - Name = table.Column(maxLength: 128, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: false), - ProviderKey = table.Column(maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpRoles", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - TenantId = table.Column(nullable: true), - Name = table.Column(maxLength: 256, nullable: false), - NormalizedName = table.Column(maxLength: 256, nullable: false), - IsDefault = table.Column(nullable: false), - IsStatic = table.Column(nullable: false), - IsPublic = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpSettings", - columns: table => new - { - Id = table.Column(nullable: false), - Name = table.Column(maxLength: 128, nullable: false), - Value = table.Column(maxLength: 2048, nullable: false), - ProviderName = table.Column(maxLength: 64, nullable: true), - ProviderKey = table.Column(maxLength: 64, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpSettings", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpTenants", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - Name = table.Column(maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpTenants", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpUsers", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - LastModificationTime = table.Column(nullable: true), - LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false, defaultValue: false), - DeleterId = table.Column(nullable: true), - DeletionTime = table.Column(nullable: true), - TenantId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: false), - NormalizedUserName = table.Column(maxLength: 256, nullable: false), - Name = table.Column(maxLength: 64, nullable: true), - Surname = table.Column(maxLength: 64, nullable: true), - Email = table.Column(maxLength: 256, nullable: false), - NormalizedEmail = table.Column(maxLength: 256, nullable: false), - EmailConfirmed = table.Column(nullable: false, defaultValue: false), - PasswordHash = table.Column(maxLength: 256, nullable: true), - SecurityStamp = table.Column(maxLength: 256, nullable: false), - PhoneNumber = table.Column(maxLength: 16, nullable: true), - PhoneNumberConfirmed = table.Column(nullable: false, defaultValue: false), - TwoFactorEnabled = table.Column(nullable: false, defaultValue: false), - LockoutEnd = table.Column(nullable: true), - LockoutEnabled = table.Column(nullable: false, defaultValue: false), - AccessFailedCount = table.Column(nullable: false, defaultValue: 0) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "CmsComments", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - EntityType = table.Column(maxLength: 64, nullable: false), - EntityId = table.Column(maxLength: 64, nullable: false), - Text = table.Column(maxLength: 512, nullable: false), - RepliedCommentId = table.Column(nullable: true), - CreatorId = table.Column(nullable: false), - CreationTime = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_CmsComments", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "CmsRatings", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - EntityType = table.Column(maxLength: 64, nullable: false), - EntityId = table.Column(maxLength: 64, nullable: false), - StarCount = table.Column(nullable: false), - CreatorId = table.Column(nullable: false), - CreationTime = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_CmsRatings", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "CmsUserReactions", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - EntityType = table.Column(maxLength: 64, nullable: false), - EntityId = table.Column(maxLength: 64, nullable: false), - ReactionName = table.Column(maxLength: 32, nullable: false), - CreatorId = table.Column(nullable: false), - CreationTime = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_CmsUserReactions", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "CmsUsers", - columns: table => new - { - Id = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true), - ConcurrencyStamp = table.Column(maxLength: 40, nullable: true), - TenantId = table.Column(nullable: true), - UserName = table.Column(maxLength: 256, nullable: false), - Email = table.Column(maxLength: 256, nullable: false), - Name = table.Column(maxLength: 64, nullable: true), - Surname = table.Column(maxLength: 64, nullable: true), - EmailConfirmed = table.Column(nullable: false, defaultValue: false), - PhoneNumber = table.Column(maxLength: 16, nullable: true), - PhoneNumberConfirmed = table.Column(nullable: false, defaultValue: false) - }, - constraints: table => - { - table.PrimaryKey("PK_CmsUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AbpAuditLogActions", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - AuditLogId = table.Column(nullable: false), - ServiceName = table.Column(maxLength: 256, nullable: true), - MethodName = table.Column(maxLength: 128, nullable: true), - Parameters = table.Column(maxLength: 2000, nullable: true), - ExecutionTime = table.Column(nullable: false), - ExecutionDuration = table.Column(nullable: false), - ExtraProperties = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id); - table.ForeignKey( - name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId", - column: x => x.AuditLogId, - principalTable: "AbpAuditLogs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpEntityChanges", - columns: table => new - { - Id = table.Column(nullable: false), - AuditLogId = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ChangeTime = table.Column(nullable: false), - ChangeType = table.Column(nullable: false), - EntityTenantId = table.Column(nullable: true), - EntityId = table.Column(maxLength: 128, nullable: false), - EntityTypeFullName = table.Column(maxLength: 128, nullable: false), - ExtraProperties = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpEntityChanges", x => x.Id); - table.ForeignKey( - name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId", - column: x => x.AuditLogId, - principalTable: "AbpAuditLogs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpOrganizationUnitRoles", - columns: table => new - { - RoleId = table.Column(nullable: false), - OrganizationUnitId = table.Column(nullable: false), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - TenantId = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpOrganizationUnitRoles", x => new { x.OrganizationUnitId, x.RoleId }); - table.ForeignKey( - name: "FK_AbpOrganizationUnitRoles_AbpOrganizationUnits_OrganizationUnitId", - column: x => x.OrganizationUnitId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpOrganizationUnitRoles_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpRoleClaims", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ClaimType = table.Column(maxLength: 256, nullable: false), - ClaimValue = table.Column(maxLength: 1024, nullable: true), - RoleId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AbpRoleClaims_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpTenantConnectionStrings", - columns: table => new - { - TenantId = table.Column(nullable: false), - Name = table.Column(maxLength: 64, nullable: false), - Value = table.Column(maxLength: 1024, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpTenantConnectionStrings", x => new { x.TenantId, x.Name }); - table.ForeignKey( - name: "FK_AbpTenantConnectionStrings_AbpTenants_TenantId", - column: x => x.TenantId, - principalTable: "AbpTenants", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserClaims", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - ClaimType = table.Column(maxLength: 256, nullable: false), - ClaimValue = table.Column(maxLength: 1024, nullable: true), - UserId = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AbpUserClaims_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserLogins", - columns: table => new - { - UserId = table.Column(nullable: false), - LoginProvider = table.Column(maxLength: 64, nullable: false), - TenantId = table.Column(nullable: true), - ProviderKey = table.Column(maxLength: 196, nullable: false), - ProviderDisplayName = table.Column(maxLength: 128, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserLogins", x => new { x.UserId, x.LoginProvider }); - table.ForeignKey( - name: "FK_AbpUserLogins_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserOrganizationUnits", - columns: table => new - { - UserId = table.Column(nullable: false), - OrganizationUnitId = table.Column(nullable: false), - CreationTime = table.Column(nullable: false), - CreatorId = table.Column(nullable: true), - TenantId = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserOrganizationUnits", x => new { x.OrganizationUnitId, x.UserId }); - table.ForeignKey( - name: "FK_AbpUserOrganizationUnits_AbpOrganizationUnits_OrganizationUnitId", - column: x => x.OrganizationUnitId, - principalTable: "AbpOrganizationUnits", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpUserOrganizationUnits_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserRoles", - columns: table => new - { - UserId = table.Column(nullable: false), - RoleId = table.Column(nullable: false), - TenantId = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AbpUserRoles_AbpRoles_RoleId", - column: x => x.RoleId, - principalTable: "AbpRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AbpUserRoles_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpUserTokens", - columns: table => new - { - UserId = table.Column(nullable: false), - LoginProvider = table.Column(maxLength: 64, nullable: false), - Name = table.Column(maxLength: 128, nullable: false), - TenantId = table.Column(nullable: true), - Value = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AbpUserTokens_AbpUsers_UserId", - column: x => x.UserId, - principalTable: "AbpUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AbpEntityPropertyChanges", - columns: table => new - { - Id = table.Column(nullable: false), - TenantId = table.Column(nullable: true), - EntityChangeId = table.Column(nullable: false), - NewValue = table.Column(maxLength: 512, nullable: true), - OriginalValue = table.Column(maxLength: 512, nullable: true), - PropertyName = table.Column(maxLength: 128, nullable: false), - PropertyTypeFullName = table.Column(maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id); - table.ForeignKey( - name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId", - column: x => x.EntityChangeId, - principalTable: "AbpEntityChanges", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogActions_AuditLogId", - table: "AbpAuditLogActions", - column: "AuditLogId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_ExecutionTime", - table: "AbpAuditLogActions", - columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogs_TenantId_ExecutionTime", - table: "AbpAuditLogs", - columns: new[] { "TenantId", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime", - table: "AbpAuditLogs", - columns: new[] { "TenantId", "UserId", "ExecutionTime" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityChanges_AuditLogId", - table: "AbpEntityChanges", - column: "AuditLogId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId", - table: "AbpEntityChanges", - columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpEntityPropertyChanges_EntityChangeId", - table: "AbpEntityPropertyChanges", - column: "EntityChangeId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", - table: "AbpOrganizationUnitRoles", - columns: new[] { "RoleId", "OrganizationUnitId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnits_Code", - table: "AbpOrganizationUnits", - column: "Code"); - - migrationBuilder.CreateIndex( - name: "IX_AbpOrganizationUnits_ParentId", - table: "AbpOrganizationUnits", - column: "ParentId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpPermissionGrants_Name_ProviderName_ProviderKey", - table: "AbpPermissionGrants", - columns: new[] { "Name", "ProviderName", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpRoleClaims_RoleId", - table: "AbpRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpRoles_NormalizedName", - table: "AbpRoles", - column: "NormalizedName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpSettings_Name_ProviderName_ProviderKey", - table: "AbpSettings", - columns: new[] { "Name", "ProviderName", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpTenants_Name", - table: "AbpTenants", - column: "Name"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserClaims_UserId", - table: "AbpUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserLogins_LoginProvider_ProviderKey", - table: "AbpUserLogins", - columns: new[] { "LoginProvider", "ProviderKey" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserOrganizationUnits_UserId_OrganizationUnitId", - table: "AbpUserOrganizationUnits", - columns: new[] { "UserId", "OrganizationUnitId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUserRoles_RoleId_UserId", - table: "AbpUserRoles", - columns: new[] { "RoleId", "UserId" }); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_Email", - table: "AbpUsers", - column: "Email"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_NormalizedEmail", - table: "AbpUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_NormalizedUserName", - table: "AbpUsers", - column: "NormalizedUserName"); - - migrationBuilder.CreateIndex( - name: "IX_AbpUsers_UserName", - table: "AbpUsers", - column: "UserName"); - - migrationBuilder.CreateIndex( - name: "IX_CmsComments_TenantId_RepliedCommentId", - table: "CmsComments", - columns: new[] { "TenantId", "RepliedCommentId" }); - - migrationBuilder.CreateIndex( - name: "IX_CmsComments_TenantId_EntityType_EntityId", - table: "CmsComments", - columns: new[] { "TenantId", "EntityType", "EntityId" }); - - migrationBuilder.CreateIndex( - name: "IX_CmsRatings_TenantId_EntityType_EntityId_CreatorId", - table: "CmsRatings", - columns: new[] { "TenantId", "EntityType", "EntityId", "CreatorId" }); - - migrationBuilder.CreateIndex( - name: "IX_CmsUserReactions_TenantId_EntityType_EntityId_ReactionName", - table: "CmsUserReactions", - columns: new[] { "TenantId", "EntityType", "EntityId", "ReactionName" }); - - migrationBuilder.CreateIndex( - name: "IX_CmsUserReactions_TenantId_CreatorId_EntityType_EntityId_ReactionName", - table: "CmsUserReactions", - columns: new[] { "TenantId", "CreatorId", "EntityType", "EntityId", "ReactionName" }); - - migrationBuilder.CreateIndex( - name: "IX_CmsUsers_TenantId_Email", - table: "CmsUsers", - columns: new[] { "TenantId", "Email" }); - - migrationBuilder.CreateIndex( - name: "IX_CmsUsers_TenantId_UserName", - table: "CmsUsers", - columns: new[] { "TenantId", "UserName" }); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AbpAuditLogActions"); - - migrationBuilder.DropTable( - name: "AbpClaimTypes"); - - migrationBuilder.DropTable( - name: "AbpEntityPropertyChanges"); - - migrationBuilder.DropTable( - name: "AbpOrganizationUnitRoles"); - - migrationBuilder.DropTable( - name: "AbpPermissionGrants"); - - migrationBuilder.DropTable( - name: "AbpRoleClaims"); - - migrationBuilder.DropTable( - name: "AbpSettings"); - - migrationBuilder.DropTable( - name: "AbpTenantConnectionStrings"); - - migrationBuilder.DropTable( - name: "AbpUserClaims"); - - migrationBuilder.DropTable( - name: "AbpUserLogins"); - - migrationBuilder.DropTable( - name: "AbpUserOrganizationUnits"); - - migrationBuilder.DropTable( - name: "AbpUserRoles"); - - migrationBuilder.DropTable( - name: "AbpUserTokens"); - - migrationBuilder.DropTable( - name: "CmsComments"); - - migrationBuilder.DropTable( - name: "CmsRatings"); - - migrationBuilder.DropTable( - name: "CmsUserReactions"); - - migrationBuilder.DropTable( - name: "CmsUsers"); - - migrationBuilder.DropTable( - name: "AbpEntityChanges"); - - migrationBuilder.DropTable( - name: "AbpTenants"); - - migrationBuilder.DropTable( - name: "AbpOrganizationUnits"); - - migrationBuilder.DropTable( - name: "AbpRoles"); - - migrationBuilder.DropTable( - name: "AbpUsers"); - - migrationBuilder.DropTable( - name: "AbpAuditLogs"); - } - } -} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20201013061938_Initial.Designer.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20201210071514_Initial.Designer.cs similarity index 58% rename from modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20201013061938_Initial.Designer.cs rename to modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20201210071514_Initial.Designer.cs index 64e92cbea5..449f18fb53 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20201013061938_Initial.Designer.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20201210071514_Initial.Designer.cs @@ -11,17 +11,17 @@ using Volo.CmsKit.EntityFrameworkCore; namespace Volo.CmsKit.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20201013061938_Initial")] + [Migration("20201210071514_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder + .UseIdentityColumns() .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.8") .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasAnnotation("ProductVersion", "5.0.1"); modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => { @@ -30,99 +30,99 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("ApplicationName") - .HasColumnName("ApplicationName") + .HasMaxLength(96) .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasColumnName("ApplicationName"); b.Property("BrowserInfo") - .HasColumnName("BrowserInfo") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("BrowserInfo"); b.Property("ClientId") - .HasColumnName("ClientId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientId"); b.Property("ClientIpAddress") - .HasColumnName("ClientIpAddress") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientIpAddress"); b.Property("ClientName") - .HasColumnName("ClientName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("ClientName"); b.Property("Comments") - .HasColumnName("Comments") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Comments"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CorrelationId") - .HasColumnName("CorrelationId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("CorrelationId"); b.Property("Exceptions") - .HasColumnName("Exceptions") + .HasMaxLength(4000) .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasColumnName("Exceptions"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("HttpMethod") - .HasColumnName("HttpMethod") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("HttpMethod"); b.Property("HttpStatusCode") - .HasColumnName("HttpStatusCode") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); b.Property("ImpersonatorTenantId") - .HasColumnName("ImpersonatorTenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); b.Property("ImpersonatorUserId") - .HasColumnName("ImpersonatorUserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TenantName") .HasColumnType("nvarchar(max)"); b.Property("Url") - .HasColumnName("Url") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Url"); b.Property("UserId") - .HasColumnName("UserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); b.Property("UserName") - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -140,39 +140,39 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") - .HasColumnName("ExecutionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("MethodName") - .HasColumnName("MethodName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("MethodName"); b.Property("Parameters") - .HasColumnName("Parameters") + .HasMaxLength(2000) .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasColumnName("Parameters"); b.Property("ServiceName") - .HasColumnName("ServiceName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("ServiceName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -190,39 +190,39 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ChangeTime") - .HasColumnName("ChangeTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); b.Property("ChangeType") - .HasColumnName("ChangeType") - .HasColumnType("tinyint"); + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); b.Property("EntityId") .IsRequired() - .HasColumnName("EntityId") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityId"); b.Property("EntityTenantId") .HasColumnType("uniqueidentifier"); b.Property("EntityTypeFullName") .IsRequired() - .HasColumnName("EntityTypeFullName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityTypeFullName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -243,30 +243,30 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("NewValue") - .HasColumnName("NewValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("NewValue"); b.Property("OriginalValue") - .HasColumnName("OriginalValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("OriginalValue"); b.Property("PropertyName") .IsRequired() - .HasColumnName("PropertyName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("PropertyName"); b.Property("PropertyTypeFullName") .IsRequired() - .HasColumnName("PropertyTypeFullName") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("PropertyTypeFullName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -275,6 +275,37 @@ namespace Volo.CmsKit.Migrations b.ToTable("AbpEntityPropertyChanges"); }); + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpFeatureValues"); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => { b.Property("Id") @@ -283,33 +314,33 @@ namespace Volo.CmsKit.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("Description") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsStatic") .HasColumnType("bit"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("Regex") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); b.Property("RegexDescription") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("Required") .HasColumnType("bit"); @@ -322,6 +353,33 @@ namespace Volo.CmsKit.Migrations b.ToTable("AbpClaimTypes"); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers"); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => { b.Property("Id") @@ -330,39 +388,39 @@ namespace Volo.CmsKit.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDefault") - .HasColumnName("IsDefault") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsDefault"); b.Property("IsPublic") - .HasColumnName("IsPublic") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsPublic"); b.Property("IsStatic") - .HasColumnName("IsStatic") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsStatic"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("NormalizedName") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -378,19 +436,19 @@ namespace Volo.CmsKit.Migrations b.Property("ClaimType") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.Property("RoleId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -399,6 +457,81 @@ namespace Volo.CmsKit.Migrations b.ToTable("AbpRoleClaims"); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs"); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => { b.Property("Id") @@ -407,130 +540,136 @@ namespace Volo.CmsKit.Migrations b.Property("AccessFailedCount") .ValueGeneratedOnAdd() - .HasColumnName("AccessFailedCount") .HasColumnType("int") - .HasDefaultValue(0); + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Email") .IsRequired() - .HasColumnName("Email") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Email"); b.Property("EmailConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("EmailConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("LockoutEnabled") .ValueGeneratedOnAdd() - .HasColumnName("LockoutEnabled") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); b.Property("LockoutEnd") .HasColumnType("datetimeoffset"); b.Property("Name") - .HasColumnName("Name") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Name"); b.Property("NormalizedEmail") .IsRequired() - .HasColumnName("NormalizedEmail") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("NormalizedEmail"); b.Property("NormalizedUserName") .IsRequired() - .HasColumnName("NormalizedUserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("NormalizedUserName"); b.Property("PasswordHash") - .HasColumnName("PasswordHash") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("PasswordHash"); b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("PhoneNumber"); b.Property("PhoneNumberConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); b.Property("SecurityStamp") .IsRequired() - .HasColumnName("SecurityStamp") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("SecurityStamp"); b.Property("Surname") - .HasColumnName("Surname") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Surname"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TwoFactorEnabled") .ValueGeneratedOnAdd() - .HasColumnName("TwoFactorEnabled") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); b.Property("UserName") .IsRequired() - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -552,16 +691,16 @@ namespace Volo.CmsKit.Migrations b.Property("ClaimType") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("UserId") .HasColumnType("uniqueidentifier"); @@ -579,21 +718,21 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(196)") - .HasMaxLength(196); + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("UserId", "LoginProvider"); @@ -611,16 +750,16 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("OrganizationUnitId", "UserId"); @@ -638,8 +777,8 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("UserId", "RoleId"); @@ -654,16 +793,16 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Name") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("Value") .HasColumnType("nvarchar(max)"); @@ -681,62 +820,62 @@ namespace Volo.CmsKit.Migrations b.Property("Code") .IsRequired() - .HasColumnName("Code") + .HasMaxLength(95) .HasColumnType("nvarchar(95)") - .HasMaxLength(95); + .HasColumnName("Code"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("DisplayName") .IsRequired() - .HasColumnName("DisplayName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("DisplayName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("ParentId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -756,16 +895,16 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("OrganizationUnitId", "RoleId"); @@ -782,22 +921,22 @@ namespace Volo.CmsKit.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -814,21 +953,21 @@ namespace Volo.CmsKit.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(2048)") - .HasMaxLength(2048); + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); b.HasKey("Id"); @@ -845,48 +984,48 @@ namespace Volo.CmsKit.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.HasKey("Id"); @@ -901,13 +1040,13 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("Name") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.HasKey("TenantId", "Name"); @@ -921,34 +1060,34 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("EntityId") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("EntityType") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("RepliedCommentId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("Text") .IsRequired() - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); b.HasKey("Id"); @@ -966,22 +1105,22 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("EntityId") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("EntityType") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("StarCount") .HasColumnType("smallint"); @@ -1003,31 +1142,31 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("EntityId") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("EntityType") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ReactionName") .IsRequired() - .HasColumnType("nvarchar(32)") - .HasMaxLength(32); + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -1046,56 +1185,56 @@ namespace Volo.CmsKit.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("Email") .IsRequired() - .HasColumnName("Email") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Email"); b.Property("EmailConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("EmailConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("Name") - .HasColumnName("Name") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Name"); b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("PhoneNumber"); b.Property("PhoneNumberConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); b.Property("Surname") - .HasColumnName("Surname") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Surname"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("UserName") .IsRequired() - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -1229,6 +1368,46 @@ namespace Volo.CmsKit.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); #pragma warning restore 612, 618 } } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20201210071514_Initial.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20201210071514_Initial.cs new file mode 100644 index 0000000000..54f7ac975c --- /dev/null +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/20201210071514_Initial.cs @@ -0,0 +1,846 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Volo.CmsKit.Migrations +{ + public partial class Initial : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "AbpAuditLogs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + TenantName = table.Column(type: "nvarchar(max)", nullable: true), + ImpersonatorUserId = table.Column(type: "uniqueidentifier", nullable: true), + ImpersonatorTenantId = table.Column(type: "uniqueidentifier", nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + HttpMethod = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + Url = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + Exceptions = table.Column(type: "nvarchar(4000)", maxLength: 4000, nullable: true), + Comments = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + HttpStatusCode = table.Column(type: "int", nullable: true), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpClaimTypes", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Required = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + Regex = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + RegexDescription = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Description = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + ValueType = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpClaimTypes", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpFeatureValues", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpFeatureValues", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpLinkUsers", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + SourceTenantId = table.Column(type: "uniqueidentifier", nullable: true), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetTenantId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpLinkUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnits", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ParentId = table.Column(type: "uniqueidentifier", nullable: true), + Code = table.Column(type: "nvarchar(95)", maxLength: 95, nullable: false), + DisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnits", x => x.Id); + table.ForeignKey( + name: "FK_AbpOrganizationUnits_AbpOrganizationUnits_ParentId", + column: x => x.ParentId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "AbpPermissionGrants", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpPermissionGrants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpRoles", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsDefault = table.Column(type: "bit", nullable: false), + IsStatic = table.Column(type: "bit", nullable: false), + IsPublic = table.Column(type: "bit", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoles", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSecurityLogs", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ApplicationName = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Identity = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + Action = table.Column(type: "nvarchar(96)", maxLength: 96, nullable: true), + UserId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + TenantName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + CorrelationId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ClientIpAddress = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + BrowserInfo = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSecurityLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpSettings", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + Value = table.Column(type: "nvarchar(2048)", maxLength: 2048, nullable: false), + ProviderName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + ProviderKey = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpSettings", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpTenants", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTenants", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpUsers", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Surname = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + EmailConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + PasswordHash = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + SecurityStamp = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + IsExternal = table.Column(type: "bit", nullable: false, defaultValue: false), + PhoneNumber = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + PhoneNumberConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + TwoFactorEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), + LockoutEnabled = table.Column(type: "bit", nullable: false, defaultValue: false), + AccessFailedCount = table.Column(type: "int", nullable: false, defaultValue: 0), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true), + LastModificationTime = table.Column(type: "datetime2", nullable: true), + LastModifierId = table.Column(type: "uniqueidentifier", nullable: true), + IsDeleted = table.Column(type: "bit", nullable: false, defaultValue: false), + DeleterId = table.Column(type: "uniqueidentifier", nullable: true), + DeletionTime = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "CmsComments", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityType = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + EntityId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Text = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: false), + RepliedCommentId = table.Column(type: "uniqueidentifier", nullable: true), + CreatorId = table.Column(type: "uniqueidentifier", nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CmsComments", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "CmsRatings", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityType = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + EntityId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + StarCount = table.Column(type: "smallint", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CmsRatings", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "CmsUserReactions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityType = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + EntityId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + ReactionName = table.Column(type: "nvarchar(32)", maxLength: 32, nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: false), + CreationTime = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CmsUserReactions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "CmsUsers", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + Surname = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: true), + EmailConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + PhoneNumber = table.Column(type: "nvarchar(16)", maxLength: 16, nullable: true), + PhoneNumberConfirmed = table.Column(type: "bit", nullable: false, defaultValue: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true), + ConcurrencyStamp = table.Column(type: "nvarchar(40)", maxLength: 40, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_CmsUsers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpAuditLogActions", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + ServiceName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), + MethodName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true), + Parameters = table.Column(type: "nvarchar(2000)", maxLength: 2000, nullable: true), + ExecutionTime = table.Column(type: "datetime2", nullable: false), + ExecutionDuration = table.Column(type: "int", nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id); + table.ForeignKey( + name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpEntityChanges", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + AuditLogId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ChangeTime = table.Column(type: "datetime2", nullable: false), + ChangeType = table.Column(type: "tinyint", nullable: false), + EntityTenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityId = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + EntityTypeFullName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + ExtraProperties = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpOrganizationUnitRoles", + columns: table => new + { + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpOrganizationUnitRoles", x => new { x.OrganizationUnitId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpOrganizationUnits_OrganizationUnitId", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpOrganizationUnitRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpRoleClaims", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpRoleClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpRoleClaims_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpTenantConnectionStrings", + columns: table => new + { + TenantId = table.Column(type: "uniqueidentifier", nullable: false), + Name = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Value = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTenantConnectionStrings", x => new { x.TenantId, x.Name }); + table.ForeignKey( + name: "FK_AbpTenantConnectionStrings_AbpTenants_TenantId", + column: x => x.TenantId, + principalTable: "AbpTenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserClaims", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + UserId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ClaimType = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + ClaimValue = table.Column(type: "nvarchar(1024)", maxLength: 1024, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserClaims", x => x.Id); + table.ForeignKey( + name: "FK_AbpUserClaims_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserLogins", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + ProviderKey = table.Column(type: "nvarchar(196)", maxLength: 196, nullable: false), + ProviderDisplayName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserLogins", x => new { x.UserId, x.LoginProvider }); + table.ForeignKey( + name: "FK_AbpUserLogins_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserOrganizationUnits", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + OrganizationUnitId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + CreationTime = table.Column(type: "datetime2", nullable: false), + CreatorId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserOrganizationUnits", x => new { x.OrganizationUnitId, x.UserId }); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpOrganizationUnits_OrganizationUnitId", + column: x => x.OrganizationUnitId, + principalTable: "AbpOrganizationUnits", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserOrganizationUnits_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserRoles", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserRoles", x => new { x.UserId, x.RoleId }); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpRoles_RoleId", + column: x => x.RoleId, + principalTable: "AbpRoles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AbpUserRoles_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpUserTokens", + columns: table => new + { + UserId = table.Column(type: "uniqueidentifier", nullable: false), + LoginProvider = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), + Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + Value = table.Column(type: "nvarchar(max)", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); + table.ForeignKey( + name: "FK_AbpUserTokens_AbpUsers_UserId", + column: x => x.UserId, + principalTable: "AbpUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpEntityPropertyChanges", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + EntityChangeId = table.Column(type: "uniqueidentifier", nullable: false), + NewValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + OriginalValue = table.Column(type: "nvarchar(512)", maxLength: 512, nullable: true), + PropertyName = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: false), + PropertyTypeFullName = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId", + column: x => x.EntityChangeId, + principalTable: "AbpEntityChanges", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_AuditLogId", + table: "AbpAuditLogActions", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_ExecutionTime", + table: "AbpAuditLogActions", + columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "UserId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_AuditLogId", + table: "AbpEntityChanges", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId", + table: "AbpEntityChanges", + columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityPropertyChanges_EntityChangeId", + table: "AbpEntityPropertyChanges", + column: "EntityChangeId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpFeatureValues_Name_ProviderName_ProviderKey", + table: "AbpFeatureValues", + columns: new[] { "Name", "ProviderName", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpLinkUsers_SourceUserId_SourceTenantId_TargetUserId_TargetTenantId", + table: "AbpLinkUsers", + columns: new[] { "SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId" }, + unique: true, + filter: "[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnitRoles_RoleId_OrganizationUnitId", + table: "AbpOrganizationUnitRoles", + columns: new[] { "RoleId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_Code", + table: "AbpOrganizationUnits", + column: "Code"); + + migrationBuilder.CreateIndex( + name: "IX_AbpOrganizationUnits_ParentId", + table: "AbpOrganizationUnits", + column: "ParentId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpPermissionGrants_Name_ProviderName_ProviderKey", + table: "AbpPermissionGrants", + columns: new[] { "Name", "ProviderName", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoleClaims_RoleId", + table: "AbpRoleClaims", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpRoles_NormalizedName", + table: "AbpRoles", + column: "NormalizedName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Action", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Action" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_ApplicationName", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "ApplicationName" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_Identity", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "Identity" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSecurityLogs_TenantId_UserId", + table: "AbpSecurityLogs", + columns: new[] { "TenantId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpSettings_Name_ProviderName_ProviderKey", + table: "AbpSettings", + columns: new[] { "Name", "ProviderName", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpTenants_Name", + table: "AbpTenants", + column: "Name"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserClaims_UserId", + table: "AbpUserClaims", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserLogins_LoginProvider_ProviderKey", + table: "AbpUserLogins", + columns: new[] { "LoginProvider", "ProviderKey" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserOrganizationUnits_UserId_OrganizationUnitId", + table: "AbpUserOrganizationUnits", + columns: new[] { "UserId", "OrganizationUnitId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUserRoles_RoleId_UserId", + table: "AbpUserRoles", + columns: new[] { "RoleId", "UserId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_Email", + table: "AbpUsers", + column: "Email"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedEmail", + table: "AbpUsers", + column: "NormalizedEmail"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_NormalizedUserName", + table: "AbpUsers", + column: "NormalizedUserName"); + + migrationBuilder.CreateIndex( + name: "IX_AbpUsers_UserName", + table: "AbpUsers", + column: "UserName"); + + migrationBuilder.CreateIndex( + name: "IX_CmsComments_TenantId_EntityType_EntityId", + table: "CmsComments", + columns: new[] { "TenantId", "EntityType", "EntityId" }); + + migrationBuilder.CreateIndex( + name: "IX_CmsComments_TenantId_RepliedCommentId", + table: "CmsComments", + columns: new[] { "TenantId", "RepliedCommentId" }); + + migrationBuilder.CreateIndex( + name: "IX_CmsRatings_TenantId_EntityType_EntityId_CreatorId", + table: "CmsRatings", + columns: new[] { "TenantId", "EntityType", "EntityId", "CreatorId" }); + + migrationBuilder.CreateIndex( + name: "IX_CmsUserReactions_TenantId_CreatorId_EntityType_EntityId_ReactionName", + table: "CmsUserReactions", + columns: new[] { "TenantId", "CreatorId", "EntityType", "EntityId", "ReactionName" }); + + migrationBuilder.CreateIndex( + name: "IX_CmsUserReactions_TenantId_EntityType_EntityId_ReactionName", + table: "CmsUserReactions", + columns: new[] { "TenantId", "EntityType", "EntityId", "ReactionName" }); + + migrationBuilder.CreateIndex( + name: "IX_CmsUsers_TenantId_Email", + table: "CmsUsers", + columns: new[] { "TenantId", "Email" }); + + migrationBuilder.CreateIndex( + name: "IX_CmsUsers_TenantId_UserName", + table: "CmsUsers", + columns: new[] { "TenantId", "UserName" }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AbpAuditLogActions"); + + migrationBuilder.DropTable( + name: "AbpClaimTypes"); + + migrationBuilder.DropTable( + name: "AbpEntityPropertyChanges"); + + migrationBuilder.DropTable( + name: "AbpFeatureValues"); + + migrationBuilder.DropTable( + name: "AbpLinkUsers"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnitRoles"); + + migrationBuilder.DropTable( + name: "AbpPermissionGrants"); + + migrationBuilder.DropTable( + name: "AbpRoleClaims"); + + migrationBuilder.DropTable( + name: "AbpSecurityLogs"); + + migrationBuilder.DropTable( + name: "AbpSettings"); + + migrationBuilder.DropTable( + name: "AbpTenantConnectionStrings"); + + migrationBuilder.DropTable( + name: "AbpUserClaims"); + + migrationBuilder.DropTable( + name: "AbpUserLogins"); + + migrationBuilder.DropTable( + name: "AbpUserOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpUserRoles"); + + migrationBuilder.DropTable( + name: "AbpUserTokens"); + + migrationBuilder.DropTable( + name: "CmsComments"); + + migrationBuilder.DropTable( + name: "CmsRatings"); + + migrationBuilder.DropTable( + name: "CmsUserReactions"); + + migrationBuilder.DropTable( + name: "CmsUsers"); + + migrationBuilder.DropTable( + name: "AbpEntityChanges"); + + migrationBuilder.DropTable( + name: "AbpTenants"); + + migrationBuilder.DropTable( + name: "AbpOrganizationUnits"); + + migrationBuilder.DropTable( + name: "AbpRoles"); + + migrationBuilder.DropTable( + name: "AbpUsers"); + + migrationBuilder.DropTable( + name: "AbpAuditLogs"); + } + } +} diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index 96721a1355..a082d0db17 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -16,10 +16,10 @@ namespace Volo.CmsKit.Migrations { #pragma warning disable 612, 618 modelBuilder + .UseIdentityColumns() .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) - .HasAnnotation("ProductVersion", "3.1.8") .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + .HasAnnotation("ProductVersion", "5.0.1"); modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => { @@ -28,99 +28,99 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("ApplicationName") - .HasColumnName("ApplicationName") + .HasMaxLength(96) .HasColumnType("nvarchar(96)") - .HasMaxLength(96); + .HasColumnName("ApplicationName"); b.Property("BrowserInfo") - .HasColumnName("BrowserInfo") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("BrowserInfo"); b.Property("ClientId") - .HasColumnName("ClientId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientId"); b.Property("ClientIpAddress") - .HasColumnName("ClientIpAddress") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("ClientIpAddress"); b.Property("ClientName") - .HasColumnName("ClientName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("ClientName"); b.Property("Comments") - .HasColumnName("Comments") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Comments"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CorrelationId") - .HasColumnName("CorrelationId") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("CorrelationId"); b.Property("Exceptions") - .HasColumnName("Exceptions") + .HasMaxLength(4000) .HasColumnType("nvarchar(4000)") - .HasMaxLength(4000); + .HasColumnName("Exceptions"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") .HasColumnType("datetime2"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("HttpMethod") - .HasColumnName("HttpMethod") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("HttpMethod"); b.Property("HttpStatusCode") - .HasColumnName("HttpStatusCode") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("HttpStatusCode"); b.Property("ImpersonatorTenantId") - .HasColumnName("ImpersonatorTenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorTenantId"); b.Property("ImpersonatorUserId") - .HasColumnName("ImpersonatorUserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("ImpersonatorUserId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TenantName") .HasColumnType("nvarchar(max)"); b.Property("Url") - .HasColumnName("Url") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Url"); b.Property("UserId") - .HasColumnName("UserId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("UserId"); b.Property("UserName") - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -138,39 +138,39 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ExecutionDuration") - .HasColumnName("ExecutionDuration") - .HasColumnType("int"); + .HasColumnType("int") + .HasColumnName("ExecutionDuration"); b.Property("ExecutionTime") - .HasColumnName("ExecutionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ExecutionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("MethodName") - .HasColumnName("MethodName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("MethodName"); b.Property("Parameters") - .HasColumnName("Parameters") + .HasMaxLength(2000) .HasColumnType("nvarchar(2000)") - .HasMaxLength(2000); + .HasColumnName("Parameters"); b.Property("ServiceName") - .HasColumnName("ServiceName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("ServiceName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -188,39 +188,39 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("AuditLogId") - .HasColumnName("AuditLogId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("AuditLogId"); b.Property("ChangeTime") - .HasColumnName("ChangeTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("ChangeTime"); b.Property("ChangeType") - .HasColumnName("ChangeType") - .HasColumnType("tinyint"); + .HasColumnType("tinyint") + .HasColumnName("ChangeType"); b.Property("EntityId") .IsRequired() - .HasColumnName("EntityId") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityId"); b.Property("EntityTenantId") .HasColumnType("uniqueidentifier"); b.Property("EntityTypeFullName") .IsRequired() - .HasColumnName("EntityTypeFullName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("EntityTypeFullName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -241,30 +241,30 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("NewValue") - .HasColumnName("NewValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("NewValue"); b.Property("OriginalValue") - .HasColumnName("OriginalValue") + .HasMaxLength(512) .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasColumnName("OriginalValue"); b.Property("PropertyName") .IsRequired() - .HasColumnName("PropertyName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("PropertyName"); b.Property("PropertyTypeFullName") .IsRequired() - .HasColumnName("PropertyTypeFullName") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("PropertyTypeFullName"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -273,6 +273,37 @@ namespace Volo.CmsKit.Migrations b.ToTable("AbpEntityPropertyChanges"); }); + modelBuilder.Entity("Volo.Abp.FeatureManagement.FeatureValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpFeatureValues"); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => { b.Property("Id") @@ -281,33 +312,33 @@ namespace Volo.CmsKit.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("Description") - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsStatic") .HasColumnType("bit"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("Regex") - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); b.Property("RegexDescription") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("Required") .HasColumnType("bit"); @@ -320,6 +351,33 @@ namespace Volo.CmsKit.Migrations b.ToTable("AbpClaimTypes"); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers"); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => { b.Property("Id") @@ -328,39 +386,39 @@ namespace Volo.CmsKit.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDefault") - .HasColumnName("IsDefault") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsDefault"); b.Property("IsPublic") - .HasColumnName("IsPublic") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsPublic"); b.Property("IsStatic") - .HasColumnName("IsStatic") - .HasColumnType("bit"); + .HasColumnType("bit") + .HasColumnName("IsStatic"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("NormalizedName") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -376,19 +434,19 @@ namespace Volo.CmsKit.Migrations b.Property("ClaimType") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.Property("RoleId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -397,6 +455,81 @@ namespace Volo.CmsKit.Migrations b.ToTable("AbpRoleClaims"); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs"); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => { b.Property("Id") @@ -405,130 +538,136 @@ namespace Volo.CmsKit.Migrations b.Property("AccessFailedCount") .ValueGeneratedOnAdd() - .HasColumnName("AccessFailedCount") .HasColumnType("int") - .HasDefaultValue(0); + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("Email") .IsRequired() - .HasColumnName("Email") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Email"); b.Property("EmailConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("EmailConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("LockoutEnabled") .ValueGeneratedOnAdd() - .HasColumnName("LockoutEnabled") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); b.Property("LockoutEnd") .HasColumnType("datetimeoffset"); b.Property("Name") - .HasColumnName("Name") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Name"); b.Property("NormalizedEmail") .IsRequired() - .HasColumnName("NormalizedEmail") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("NormalizedEmail"); b.Property("NormalizedUserName") .IsRequired() - .HasColumnName("NormalizedUserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("NormalizedUserName"); b.Property("PasswordHash") - .HasColumnName("PasswordHash") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("PasswordHash"); b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("PhoneNumber"); b.Property("PhoneNumberConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); b.Property("SecurityStamp") .IsRequired() - .HasColumnName("SecurityStamp") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("SecurityStamp"); b.Property("Surname") - .HasColumnName("Surname") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Surname"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("TwoFactorEnabled") .ValueGeneratedOnAdd() - .HasColumnName("TwoFactorEnabled") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); b.Property("UserName") .IsRequired() - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -550,16 +689,16 @@ namespace Volo.CmsKit.Migrations b.Property("ClaimType") .IsRequired() - .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); b.Property("ClaimValue") - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("UserId") .HasColumnType("uniqueidentifier"); @@ -577,21 +716,21 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(196)") - .HasMaxLength(196); + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("UserId", "LoginProvider"); @@ -609,16 +748,16 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("OrganizationUnitId", "UserId"); @@ -636,8 +775,8 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("UserId", "RoleId"); @@ -652,16 +791,16 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("LoginProvider") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Name") - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("Value") .HasColumnType("nvarchar(max)"); @@ -679,62 +818,62 @@ namespace Volo.CmsKit.Migrations b.Property("Code") .IsRequired() - .HasColumnName("Code") + .HasMaxLength(95) .HasColumnType("nvarchar(95)") - .HasMaxLength(95); + .HasColumnName("Code"); b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("DisplayName") .IsRequired() - .HasColumnName("DisplayName") + .HasMaxLength(128) .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasColumnName("DisplayName"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("ParentId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -754,16 +893,16 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("OrganizationUnitId", "RoleId"); @@ -780,22 +919,22 @@ namespace Volo.CmsKit.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -812,21 +951,21 @@ namespace Volo.CmsKit.Migrations b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(128)") - .HasMaxLength(128); + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); b.Property("ProviderKey") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ProviderName") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(2048)") - .HasMaxLength(2048); + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); b.HasKey("Id"); @@ -843,48 +982,48 @@ namespace Volo.CmsKit.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("DeleterId") - .HasColumnName("DeleterId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); b.Property("DeletionTime") - .HasColumnName("DeletionTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("IsDeleted") .ValueGeneratedOnAdd() - .HasColumnName("IsDeleted") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); b.Property("LastModificationTime") - .HasColumnName("LastModificationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); b.Property("LastModifierId") - .HasColumnName("LastModifierId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); b.Property("Name") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.HasKey("Id"); @@ -899,13 +1038,13 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("Name") - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("Value") .IsRequired() - .HasColumnType("nvarchar(1024)") - .HasMaxLength(1024); + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); b.HasKey("TenantId", "Name"); @@ -919,34 +1058,34 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("EntityId") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("EntityType") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("RepliedCommentId") .HasColumnType("uniqueidentifier"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("Text") .IsRequired() - .HasColumnType("nvarchar(512)") - .HasMaxLength(512); + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); b.HasKey("Id"); @@ -964,22 +1103,22 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("EntityId") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("EntityType") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("StarCount") .HasColumnType("smallint"); @@ -1001,31 +1140,31 @@ namespace Volo.CmsKit.Migrations .HasColumnType("uniqueidentifier"); b.Property("CreationTime") - .HasColumnName("CreationTime") - .HasColumnType("datetime2"); + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); b.Property("CreatorId") - .HasColumnName("CreatorId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); b.Property("EntityId") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("EntityType") .IsRequired() - .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); b.Property("ReactionName") .IsRequired() - .HasColumnType("nvarchar(32)") - .HasMaxLength(32); + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.HasKey("Id"); @@ -1044,56 +1183,56 @@ namespace Volo.CmsKit.Migrations b.Property("ConcurrencyStamp") .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp") + .HasMaxLength(40) .HasColumnType("nvarchar(40)") - .HasMaxLength(40); + .HasColumnName("ConcurrencyStamp"); b.Property("Email") .IsRequired() - .HasColumnName("Email") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("Email"); b.Property("EmailConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("EmailConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); b.Property("ExtraProperties") - .HasColumnName("ExtraProperties") - .HasColumnType("nvarchar(max)"); + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); b.Property("Name") - .HasColumnName("Name") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Name"); b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") + .HasMaxLength(16) .HasColumnType("nvarchar(16)") - .HasMaxLength(16); + .HasColumnName("PhoneNumber"); b.Property("PhoneNumberConfirmed") .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") .HasColumnType("bit") - .HasDefaultValue(false); + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); b.Property("Surname") - .HasColumnName("Surname") + .HasMaxLength(64) .HasColumnType("nvarchar(64)") - .HasMaxLength(64); + .HasColumnName("Surname"); b.Property("TenantId") - .HasColumnName("TenantId") - .HasColumnType("uniqueidentifier"); + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); b.Property("UserName") .IsRequired() - .HasColumnName("UserName") + .HasMaxLength(256) .HasColumnType("nvarchar(256)") - .HasMaxLength(256); + .HasColumnName("UserName"); b.HasKey("Id"); @@ -1227,6 +1366,46 @@ namespace Volo.CmsKit.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Navigation("Actions"); + + b.Navigation("EntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Navigation("PropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Navigation("ConnectionStrings"); + }); #pragma warning restore 612, 618 } } diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.csproj b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.csproj index ba613daf88..152d740864 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.csproj +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/Volo.CmsKit.Web.Unified.csproj @@ -1,7 +1,5 @@ - - net5.0 Volo.CmsKit @@ -10,10 +8,10 @@ - + - - + + diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json index 1171b7f8a6..90988e3200 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^4.1.0-rc.2" } } \ No newline at end of file diff --git a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock index 78e1068643..569055bae5 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.1.tgz#ce8e3eb830a8e8f9eecb1a3b3bd70c2832fdf15e" - integrity sha512-w+ZG8Ewx9wWfbvRC2MAjJl+rXuXSHLhhGOiJTk68unWLNziDtNQzcSXG/Z5c1hA+acJSGqDoJGEGs4FVM136og== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.1.tgz#cd9d0eb11309c597dffd26277cd1bd7c5b1e0e2f" - integrity sha512-QGoCN/my0eAfa4tx5ytDxArIoz2i58jFFVUGso1Lekn54JvSt+WLz2p3uyTGatZ03Bp9836elhFnIopn12WvBw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~4.0.1" - "@abp/bootstrap" "~4.0.1" - "@abp/bootstrap-datepicker" "~4.0.1" - "@abp/datatables.net-bs4" "~4.0.1" - "@abp/font-awesome" "~4.0.1" - "@abp/jquery-form" "~4.0.1" - "@abp/jquery-validation-unobtrusive" "~4.0.1" - "@abp/lodash" "~4.0.1" - "@abp/luxon" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/select2" "~4.0.1" - "@abp/sweetalert" "~4.0.1" - "@abp/timeago" "~4.0.1" - "@abp/toastr" "~4.0.1" - -"@abp/aspnetcore.mvc.ui@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.1.tgz#6490c147a56e4f7055d2ca77f20baf1f60f56867" - integrity sha512-4B3icJrlpuZgMaX52ninyaenH7zLwepePEscDrLaFY9wyonKpZ2zh+xplnyM6vjNd+PhErWuA2+ssCswFhrJ3A== +"@abp/aspnetcore.mvc.ui.theme.basic@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.1.0-rc.2.tgz#b9462cbe36c41d68e2f44b79a3a2dba2c1b2b54a" + integrity sha512-KW3J6HnN1zZrCmrWmEcXBnGIOeuJDdp1jUECAm4Bdxi++VzfIbGlVvpcvUdT1E213reOUWi4dPhcej12DwrmDw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui.theme.shared@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.1.0-rc.2.tgz#d64cea1e504bcd3a08a1819025d40f3f84f0aadc" + integrity sha512-A/DRLwtJO7YCdqAgSF84wNRKjvGEQvcBocIwRxXCJEe3drxMoSwkAGjXQlxIYWZKdYbYUWDTjil2Mvwf91GUqg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~4.1.0-rc.2" + "@abp/bootstrap" "~4.1.0-rc.2" + "@abp/bootstrap-datepicker" "~4.1.0-rc.2" + "@abp/datatables.net-bs4" "~4.1.0-rc.2" + "@abp/font-awesome" "~4.1.0-rc.2" + "@abp/jquery-form" "~4.1.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~4.1.0-rc.2" + "@abp/lodash" "~4.1.0-rc.2" + "@abp/luxon" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/select2" "~4.1.0-rc.2" + "@abp/sweetalert" "~4.1.0-rc.2" + "@abp/timeago" "~4.1.0-rc.2" + "@abp/toastr" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.1.0-rc.2.tgz#54bf30def590e6d25fc35f77253888f3d9f74b9c" + integrity sha512-eOh5IBn4eNAjj2i6tlLRIV/r61Ef7+Z3PNvGgdml/XCo50el4G9XE7shxuGOY+MaFMfmsST2tcJlO9iAo9n2Yw== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,145 +43,145 @@ micromatch "^4.0.2" path "^0.12.7" -"@abp/bootstrap-datepicker@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.1.tgz#aad891263edff66f816e003ba4fa7f8acfe8e0b6" - integrity sha512-S0oaVZmXsDcOJLAyoGY0TvP/7bZx0GHIbU9BIhIL2Wl74HYaokjkTr6/IleIek9YeiF2vm9FkrUP1dKH/4f7Gg== +"@abp/bootstrap-datepicker@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.1.0-rc.2.tgz#d3fe863222a11771d366b1a3c246aaf34df94081" + integrity sha512-vn2xWAK3xqo5fMZJ9dOAZZmL+ZUnzZZNh3lF6uA97wTN/SbePlmHBYJpsCKIxOwbJS2HCvekHGJN/Ps4oEjlbw== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.1.tgz#3e41bdf9b3e9f8c497b9fafe22a4851d0401b31b" - integrity sha512-GoSaNWvswRHVoUrq7xClFQYtwqIlyS/vp/TdY+j5FFZP7ud89+ZGpdNqYqq5l9/6aaYa7v4b9mNTZ/1JRzAOYg== +"@abp/bootstrap@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.1.0-rc.2.tgz#b5132cf4c4c92fe833823cf2b91ab1b0167b0ecf" + integrity sha512-SsWEV0DveBIHiG051E6aBB371D15QIsGeo+POFhvQUvrlmzMBlFCAlmH0ef8w1n+3M3C37irCgEGKctt2pbcxQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" bootstrap "^4.5.0" bootstrap-v4-rtl "4.4.1-2" -"@abp/core@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.1.tgz#1df32bc058f45571605670ca81c226a1bd87400c" - integrity sha512-8UT5lwqV/luVG/SxePSTD2FRbZXwXv3cZJKjw+gpBjhD0slWrh51XEOHsM8ciTuhcvV/tsqVU9nXckDMdO58fw== +"@abp/core@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.1.0-rc.2.tgz#d306106a53fa56109751be0099785c94f43be56f" + integrity sha512-b0mOYSz8hNgZ/hBeYg8hkthJgE8CLyHNa2NcythPoIW8RR5qHmDtGoFnuFovLvLk7r+M4NWyxXRKEshSszIPyA== dependencies: - "@abp/utils" "^4.0.1" + "@abp/utils" "^4.1.0-rc.2" -"@abp/datatables.net-bs4@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.1.tgz#7538baad0eff24eca7f4246d020852f83139f645" - integrity sha512-S52jNPF4if68V+P/33NrtGPJXf6xrqgyZzz9b7qBR7HuUm3Nsn7bAslh3JNduNec/sFuE4Utl/xsFHZNjBWEog== +"@abp/datatables.net-bs4@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.1.0-rc.2.tgz#99aa1fbad91939fc23265324a3d8a45d0c1e5a7a" + integrity sha512-Y9UyqniOkx5DJO+2GGurnQE1yfRmGaQ3y7V07gKWRq+gHLUhE+vfgOLVpGM6ufdTIbLvVw5Ng+3gfOmPlUnpxg== dependencies: - "@abp/datatables.net" "~4.0.1" + "@abp/datatables.net" "~4.1.0-rc.2" datatables.net-bs4 "^1.10.21" -"@abp/datatables.net@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.1.tgz#eb89716a37351c41b5bccfc2db88fc7ceb991a26" - integrity sha512-APFLui0w8MqsBWqP/K0QkT5cBq5SsWiqMaIGTXQKinMVLV597sUszrlhe1ISU2PqeD7iX6pCZNNOTI1NEUn9/Q== +"@abp/datatables.net@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.1.0-rc.2.tgz#1a134688259d32187d822d8a49c7a68b4cc226c7" + integrity sha512-9o5g8s7ZTlThd1FMFmO7wS+MxmXgUMmiWx7Hwara9ypfJPd0vanz10bQAdTpLiDy/aa0tUmz0xOVj73yvBJm9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" datatables.net "^1.10.21" -"@abp/font-awesome@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.1.tgz#8a9d83b2c2adfcd5abcbd9c31c315460d44a321e" - integrity sha512-+6+m/DKMnfkeQiWUsMlB6Da8u6yREyN2oQYGYhSRAK8419ym8RHHrqKJv2AClI4iLq2ppHZj8WF84+SeoCekRg== +"@abp/font-awesome@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.1.0-rc.2.tgz#ecf490861c09250cf61611ac74cec5ab4392e807" + integrity sha512-6yAsf/ee2hdrHHUACql8c3gY54Hd7YAK2olHymyc3Io2hhK2VxXRc2W2oRSwbQ9GsSE+XDrEVtjIR64nBseTeg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" "@fortawesome/fontawesome-free" "^5.13.0" -"@abp/jquery-form@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.1.tgz#6dc1922b2800dd635f20881a82e08104a1dd1bb5" - integrity sha512-JMBZYu/MI/GjaLTBOMB5iv8cagnLpReDULNC3r6tLNNqB1R8f3Cg1T7nF4YCuU9SYMqis1P/AuE4oEh+4rQdAQ== +"@abp/jquery-form@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.1.0-rc.2.tgz#76dff67a3fe6e6ad7bd60bb909de93c09966cc0a" + integrity sha512-LGafwxyRYUbHQlJ9pPbYdkVqzdT/y1Fp4Nr4C3W5jxsJuaSICl0RPkRHIPALeoqbpEWuj6dVep6ZuO9hhxBzNw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.1.tgz#4142ca31c0830fe24a1467e8cf13b55ba9d7c1dd" - integrity sha512-rdSRTcdKCHmarbrVgmPYdTiJ0G/aFKd+dr0krO7fALPTuQKChbDnHOO4/JvQSc+cd9faxa8c6ZWvlHdsof23tQ== +"@abp/jquery-validation-unobtrusive@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.1.0-rc.2.tgz#1f1d395cfa47740d47303ff512592ff1993f9e13" + integrity sha512-0LXWvgfyLHVw7qRVOmY0rfVlq+yJq/nhbcVoYK+QbmKnrFu+KZg0KNMOD8wTXs8mZ1EKGQpoQKWxImtCnGrV/A== dependencies: - "@abp/jquery-validation" "~4.0.1" + "@abp/jquery-validation" "~4.1.0-rc.2" jquery-validation-unobtrusive "^3.2.11" -"@abp/jquery-validation@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.1.tgz#74e7d795468c6986f2db15662631fcd4f67c679e" - integrity sha512-FX26aQCsMBdVWAJb7S37Lt7KoHAEHoYguh/qfZIARCpOYOOWvxfDz1wTrmADUkqdillqEiCeD/Imj8bYH9Faaw== +"@abp/jquery-validation@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.1.0-rc.2.tgz#ad4b464fd0133eab8d08c781c7d7c4e00bc4918d" + integrity sha512-iLTobfwqDk7iiQxvv5UowxOKywsh/77VlAVktstnFG3N3Y73+JYKzM0mGM/j4zM1OrjbF9/cnPnDVX7bATPz9w== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-validation "^1.19.2" -"@abp/jquery@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.1.tgz#aa554accb16600fd586c3a4f088040cd26d0bde8" - integrity sha512-MtiRKOLyjEWux+whPP3+zwPbpj8or756JtgjnwOTDB9tp9HLCYUaskt+oalYPvob24nDZcNu2RnMALYdCVhZAQ== +"@abp/jquery@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.1.0-rc.2.tgz#0f64cad5b1ae3e47d2344e5fb30c347b89d6d2bb" + integrity sha512-YubZwMJIN+UcfxfUlt3usfcLMG9WcXNpemUsdBtlKNzti562KZMIHPFLRL+DsiqvzZ74h2PxSWWsxS42Z7z0Yw== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" jquery "~3.5.1" -"@abp/lodash@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.1.tgz#ec261ccaab8a70d5b32a8a7c22387e48936d38d4" - integrity sha512-Dav1QKbBeGR4VVbHHe1s3OEzN7wnb9K/vwzHrWmtO8D1Q5Z3433xjNmgL5VQ9gfxXqooSfEO4gAovZklMDHDew== +"@abp/lodash@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.1.0-rc.2.tgz#9281c641ab7b7b33e7acf12815dc461e7ae967b9" + integrity sha512-RqdekrAyLPaLNJddmrq89EdrI1xg4296tOafFLHvirgRWisJTIa9bflTOwMwEg9FNdLJgA0zHi4WdAMer0qZdA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" lodash "^4.17.15" -"@abp/luxon@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.1.tgz#a540750b1605dbac856ce9c2e776c2fecf6392f9" - integrity sha512-eRumVB7UIf2XH6OZVUTvcKw0A/OSAfYV59fM+Wc4dAkNcmsNZI0gD1o0AigSGNCxTV6v+W2bFrsuooSqK99Y0Q== +"@abp/luxon@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.1.0-rc.2.tgz#78fc1cf651d7c19b87a31823cd3ce68961d6b1e6" + integrity sha512-U4e9uGZlg9xj9tBNP337v3wiaSR6qxWsBgh/duQGWrqV+75LlQjYcZaPoXDidUUS6U6epDSR2pc2T39rahcgSQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" luxon "^1.24.1" -"@abp/malihu-custom-scrollbar-plugin@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.1.tgz#0a556423a67b6c949e32ffcacd72256dea6c31ee" - integrity sha512-YTwYpnQ1ZrON70gvJcnNZRwB3Ze4olGcXxiPvmRgSHbGJkSnHYJiP6PvsN1F3HDFukAJ/iUu+WwEe8OBwlyLXA== +"@abp/malihu-custom-scrollbar-plugin@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.1.0-rc.2.tgz#36553e71052cad9734e0c9b2c65759e538468648" + integrity sha512-JQ6PCcj5qmF9MxNRPAsKHHnqBPCdn4lQnwxZrHcG9tD70Gx+NfC4UH41tqXI+htba4k0PHRyH2y39Q1iJm0NFA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.1.tgz#8983e7b5c3afb862f08b2730b70e59d726e9b5d5" - integrity sha512-WdzY2hvsS/4vz/VXpxq2muSzzE8ggchiIrICy/WKchJxL9L08DM796t6aE6rEl9wucY8XEzzWrPOVqAjJmnXFA== +"@abp/select2@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.1.0-rc.2.tgz#c48e865f401ddce32dff2a7a14ae07c4bde2f57b" + integrity sha512-YYK/SIqXQcSDQFMVg/ogohc76d4JDrOVQEbzfkNNI5bKVJo+hkqtNzAwV9FLdPZZNw15QMv0eF1ie4aUtIxyaA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.1.tgz#0088610915ad6db0a140b77832a37c10066eb4ee" - integrity sha512-t4/44oQCMngSjVqmeRWXwrXa/pRKc3CEpyyTiGIXki4dWJ21j0ePCw2l3rvOJWnpoCznhxa/UGxLfRfK1NEzRg== +"@abp/sweetalert@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.1.0-rc.2.tgz#cdcaf8e9a33cf218a687fd6a42cfe1c85d89c6b7" + integrity sha512-sjQd8TF9oUnaQ1OPTGdVyAfWqSZEk4bRbC/qw2CouEOfRLatzkC0JcmzFLN0f5N1am1RQwkFakpENKH7NqTCvg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" sweetalert "^2.1.2" -"@abp/timeago@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.1.tgz#8c161645534eb1f62fe4607450acf7345729e711" - integrity sha512-PsPobV79U2qzVY+WBsmJM1ohSF4jqcLnL4/7qyJvxlb1WwbCl1F5D4cpiJP4zsM4clPW4mbSsiauMNp+HTNKEA== +"@abp/timeago@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.1.0-rc.2.tgz#445d043ae482b76799b496ae6565abfaf75a34b9" + integrity sha512-wWx56EZMUGIfqJV5JLCvUp4RVhKXHYLQaVNQSF8E05COXmSQwFThVS7vbuiODFp2BGm6RAqCVtZDCreu2B8z9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.1.tgz#ecb6f6193b7edc3150d0614ab9457472baf1cce3" - integrity sha512-bTTz0O8zj7fMhdoummP2Ed5Z8SJTmR6svzNchBXNDrnRAcDQvTihPTcg0UpH8BEDFczbLowq09CG2A/RMSJoug== +"@abp/toastr@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.1.0-rc.2.tgz#1af16fa8687201b6b9c7229d087a4233998703b9" + integrity sha512-g+Jl5H1ZHoJ4JwWuix0xA+GMFY42pwq8WYjxP6qE2/Y2aixYHVIui15eBqF2L06yXOt53YFcC1+pxjrp91xHxw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" toastr "^2.1.4" -"@abp/utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" - integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== +"@abp/utils@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.2.tgz#eb6dbf0ee493d0f050b37347d2d6d283098aedae" + integrity sha512-V2k5I89lVBoeGIKgg4p2H9GlMAcDWbctwKZPVwBEMVEVm1uTR2xQAWdTdSFd5Q8I8Xsf/aIG8ELM7l5j2h7/zQ== dependencies: just-compare "^1.3.0" diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenuContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenuContributor.cs index c0be7c4209..403715b1bf 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenuContributor.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Menus/CmsKitAdminMenuContributor.cs @@ -9,11 +9,11 @@ namespace Volo.CmsKit.Admin.Web.Menus { if (context.Menu.Name == StandardMenus.Main) { - await ConfigureMainMenu(context); + await ConfigureMainMenuAsync(context); } } - private Task ConfigureMainMenu(MenuConfigurationContext context) + private Task ConfigureMainMenuAsync(MenuConfigurationContext context) { //Add main menu items. diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj index b965829d85..d1d1f28fac 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Web/Volo.CmsKit.Admin.Web.csproj @@ -18,7 +18,7 @@ - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/Volo/CmsKit/CmsKitCommonHttpApiClientModule.cs b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/Volo/CmsKit/CmsKitCommonHttpApiClientModule.cs index fc3ba90286..a1eff90aa4 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/Volo/CmsKit/CmsKitCommonHttpApiClientModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Common.HttpApi.Client/Volo/CmsKit/CmsKitCommonHttpApiClientModule.cs @@ -7,7 +7,7 @@ namespace Volo.CmsKit typeof(AbpHttpClientModule), typeof(CmsKitCommonApplicationContractsModule) )] - public class CmsKitCommonHttpApiClientModule + public class CmsKitCommonHttpApiClientModule : AbpModule { } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj index 7ef1822195..620274f4f3 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Common.Web/Volo.CmsKit.Common.Web.csproj @@ -19,7 +19,7 @@ - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj index a00ed98617..107aa14452 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo.CmsKit.Domain.Shared.csproj @@ -12,7 +12,7 @@ - + diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index adda59c3e2..b81704034a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using Microsoft.EntityFrameworkCore; using Volo.Abp; using Volo.Abp.EntityFrameworkCore.Modeling; @@ -27,16 +28,20 @@ namespace Volo.CmsKit.EntityFrameworkCore optionsAction?.Invoke(options); - builder.Entity(b => + //TODO: What if only CMSKit Pro features are enabled? This is kinda workaround for now + if (GlobalFeatureManager.Instance.Modules.CmsKit().GetFeatures().Any(f => f.IsEnabled)) { - b.ToTable(options.TablePrefix + "Users", options.Schema); + builder.Entity(b => + { + b.ToTable(options.TablePrefix + "Users", options.Schema); - b.ConfigureByConvention(); - b.ConfigureAbpUser(); + b.ConfigureByConvention(); + b.ConfigureAbpUser(); - b.HasIndex(x => new {x.TenantId, x.UserName}); - b.HasIndex(x => new {x.TenantId, x.Email}); - }); + b.HasIndex(x => new {x.TenantId, x.UserName}); + b.HasIndex(x => new {x.TenantId, x.Email}); + }); + } if (GlobalFeatureManager.Instance.IsEnabled()) { @@ -86,7 +91,7 @@ namespace Volo.CmsKit.EntityFrameworkCore r.Property(x => x.EntityId).IsRequired().HasMaxLength(RatingConsts.MaxEntityIdLength); r.HasIndex(x => new {x.TenantId, x.EntityType, x.EntityId, x.CreatorId}); - }); + }); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Menus/CmsKitPublicMenuContributor.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Menus/CmsKitPublicMenuContributor.cs index 34093ed39c..7f93f1ade1 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Menus/CmsKitPublicMenuContributor.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Menus/CmsKitPublicMenuContributor.cs @@ -9,11 +9,11 @@ namespace Volo.CmsKit.Public.Web.Menus { if (context.Menu.Name == StandardMenus.Main) { - await ConfigureMainMenu(context); + await ConfigureMainMenuAsync(context); } } - private Task ConfigureMainMenu(MenuConfigurationContext context) + private Task ConfigureMainMenuAsync(MenuConfigurationContext context) { //Add main menu items. diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj index 7f945a232e..5f19bdd904 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Volo.CmsKit.Public.Web.csproj @@ -15,7 +15,7 @@ - + diff --git a/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.csproj b/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.csproj index 1a026b2521..a120835478 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.csproj +++ b/modules/cms-kit/src/Volo.CmsKit.Web/Volo.CmsKit.Web.csproj @@ -19,7 +19,7 @@ - + diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Volo.CmsKit.Application.Tests.csproj b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Volo.CmsKit.Application.Tests.csproj index e18b41e3c9..26c4be533f 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Volo.CmsKit.Application.Tests.csproj +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Volo.CmsKit.Application.Tests.csproj @@ -1,7 +1,5 @@ - - net5.0 Volo.CmsKit @@ -10,7 +8,7 @@ - + diff --git a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Volo.CmsKit.Domain.Tests.csproj b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Volo.CmsKit.Domain.Tests.csproj index d7544b0ab0..d80255ba61 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Volo.CmsKit.Domain.Tests.csproj +++ b/modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Volo.CmsKit.Domain.Tests.csproj @@ -1,14 +1,12 @@ - - net5.0 Volo.CmsKit - + diff --git a/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/Volo.CmsKit.EntityFrameworkCore.Tests.csproj b/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/Volo.CmsKit.EntityFrameworkCore.Tests.csproj index cde9dffb97..b7033afe20 100644 --- a/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/Volo.CmsKit.EntityFrameworkCore.Tests.csproj +++ b/modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/Volo.CmsKit.EntityFrameworkCore.Tests.csproj @@ -1,15 +1,13 @@ - - net5.0 Volo.CmsKit - - + + diff --git a/modules/cms-kit/test/Volo.CmsKit.HttpApi.Client.ConsoleTestApp/Volo.CmsKit.HttpApi.Client.ConsoleTestApp.csproj b/modules/cms-kit/test/Volo.CmsKit.HttpApi.Client.ConsoleTestApp/Volo.CmsKit.HttpApi.Client.ConsoleTestApp.csproj index 3a41b650f6..16d88cd7f6 100644 --- a/modules/cms-kit/test/Volo.CmsKit.HttpApi.Client.ConsoleTestApp/Volo.CmsKit.HttpApi.Client.ConsoleTestApp.csproj +++ b/modules/cms-kit/test/Volo.CmsKit.HttpApi.Client.ConsoleTestApp/Volo.CmsKit.HttpApi.Client.ConsoleTestApp.csproj @@ -7,7 +7,7 @@ - + @@ -20,7 +20,7 @@ - + diff --git a/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/Volo.CmsKit.MongoDB.Tests.csproj b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/Volo.CmsKit.MongoDB.Tests.csproj index 783dd21ba9..9591191e60 100644 --- a/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/Volo.CmsKit.MongoDB.Tests.csproj +++ b/modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/Volo.CmsKit.MongoDB.Tests.csproj @@ -1,15 +1,13 @@ - - net5.0 Volo.CmsKit - - + + diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/Volo.CmsKit.TestBase.csproj b/modules/cms-kit/test/Volo.CmsKit.TestBase/Volo.CmsKit.TestBase.csproj index 853d46ffdf..35c8c151ea 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/Volo.CmsKit.TestBase.csproj +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/Volo.CmsKit.TestBase.csproj @@ -1,19 +1,17 @@ - - net5.0 Volo.CmsKit - - - - - - + + + + + + diff --git a/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20201208084431_Added_CommitCount.Designer.cs b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20201208084431_Added_CommitCount.Designer.cs new file mode 100644 index 0000000000..ff28c9f865 --- /dev/null +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20201208084431_Added_CommitCount.Designer.cs @@ -0,0 +1,987 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Volo.Abp.EntityFrameworkCore; +using VoloDocs.EntityFrameworkCore; + +namespace VoloDocs.EntityFrameworkCore.Migrations +{ + [DbContext(typeof(VoloDocsDbContext))] + [Migration("20201208084431_Added_CommitCount")] + partial class Added_CommitCount + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseIdentityColumns() + .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.0"); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Description") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic") + .HasColumnType("bit"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("Regex") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("RegexDescription") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Required") + .HasColumnType("bit"); + + b.Property("ValueType") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityLinkUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("SourceTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetTenantId") + .HasColumnType("uniqueidentifier"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("SourceUserId", "SourceTenantId", "TargetUserId", "TargetTenantId") + .IsUnique() + .HasFilter("[SourceTenantId] IS NOT NULL AND [TargetTenantId] IS NOT NULL"); + + b.ToTable("AbpLinkUsers"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnType("bit") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnType("bit") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnType("bit") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentitySecurityLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Action") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("ApplicationName") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("BrowserInfo") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("ClientId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ClientIpAddress") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Identity") + .HasMaxLength(96) + .HasColumnType("nvarchar(96)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TenantName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "Action"); + + b.HasIndex("TenantId", "ApplicationName"); + + b.HasIndex("TenantId", "Identity"); + + b.HasIndex("TenantId", "UserId"); + + b.ToTable("AbpSecurityLogs"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0) + .HasColumnName("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("Email"); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("EmailConfirmed"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("IsExternal") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsExternal"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("LockoutEnabled"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("Name") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Name"); + + b.Property("NormalizedEmail") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedEmail"); + + b.Property("NormalizedUserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("NormalizedUserName"); + + b.Property("PasswordHash") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("PasswordHash"); + + b.Property("PhoneNumber") + .HasMaxLength(16) + .HasColumnType("nvarchar(16)") + .HasColumnName("PhoneNumber"); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("PhoneNumberConfirmed"); + + b.Property("SecurityStamp") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("SecurityStamp"); + + b.Property("Surname") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)") + .HasColumnName("Surname"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("TwoFactorEnabled"); + + b.Property("UserName") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("ClaimValue") + .HasMaxLength(1024) + .HasColumnType("nvarchar(1024)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderDisplayName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196) + .HasColumnType("nvarchar(196)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "UserId"); + + b.HasIndex("UserId", "OrganizationUnitId"); + + b.ToTable("AbpUserOrganizationUnits"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("LoginProvider") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Code") + .IsRequired() + .HasMaxLength(95) + .HasColumnType("nvarchar(95)") + .HasColumnName("Code"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnType("uniqueidentifier") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnType("datetime2") + .HasColumnName("DeletionTime"); + + b.Property("DisplayName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)") + .HasColumnName("DisplayName"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false) + .HasColumnName("IsDeleted"); + + b.Property("LastModificationTime") + .HasColumnType("datetime2") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnType("uniqueidentifier") + .HasColumnName("LastModifierId"); + + b.Property("ParentId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Code"); + + b.HasIndex("ParentId"); + + b.ToTable("AbpOrganizationUnits"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.Property("OrganizationUnitId") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationTime") + .HasColumnType("datetime2") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnType("uniqueidentifier") + .HasColumnName("CreatorId"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("OrganizationUnitId", "RoleId"); + + b.HasIndex("RoleId", "OrganizationUnitId"); + + b.ToTable("AbpOrganizationUnitRoles"); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpPermissionGrants"); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ProviderKey") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("ProviderName") + .HasMaxLength(64) + .HasColumnType("nvarchar(64)"); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpSettings"); + }); + + modelBuilder.Entity("Volo.Docs.Documents.Document", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("Content") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("EditLink") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("FileName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("Format") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LanguageCode") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("LastCachedTime") + .HasColumnType("datetime2"); + + b.Property("LastSignificantUpdateTime") + .HasColumnType("datetime2"); + + b.Property("LastUpdatedTime") + .HasColumnType("datetime2"); + + b.Property("LocalDirectory") + .HasMaxLength(512) + .HasColumnType("nvarchar(512)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ProjectId") + .HasColumnType("uniqueidentifier"); + + b.Property("RawRootUrl") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("RootUrl") + .HasMaxLength(2048) + .HasColumnType("nvarchar(2048)"); + + b.Property("Version") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.HasKey("Id"); + + b.ToTable("DocsDocuments"); + }); + + modelBuilder.Entity("Volo.Docs.Documents.DocumentContributor", b => + { + b.Property("DocumentId") + .HasColumnType("uniqueidentifier"); + + b.Property("Username") + .HasColumnType("nvarchar(450)"); + + b.Property("AvatarUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("CommitCount") + .HasColumnType("int"); + + b.Property("UserProfileUrl") + .HasColumnType("nvarchar(max)"); + + b.HasKey("DocumentId", "Username"); + + b.ToTable("DocsDocumentContributors"); + }); + + modelBuilder.Entity("Volo.Docs.Projects.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)") + .HasColumnName("ConcurrencyStamp"); + + b.Property("DefaultDocumentName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("DocumentStoreType") + .HasColumnType("nvarchar(max)"); + + b.Property("ExtraProperties") + .HasColumnType("nvarchar(max)") + .HasColumnName("ExtraProperties"); + + b.Property("Format") + .HasColumnType("nvarchar(max)"); + + b.Property("LatestVersionBranchName") + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("MainWebsiteUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("MinimumVersion") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("NavigationDocumentName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ParametersDocumentName") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("nvarchar(128)"); + + b.Property("ShortName") + .IsRequired() + .HasMaxLength(32) + .HasColumnType("nvarchar(32)"); + + b.HasKey("Id"); + + b.ToTable("DocsProjects"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserOrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("OrganizationUnits") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser", null) + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany() + .HasForeignKey("ParentId"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnitRole", b => + { + b.HasOne("Volo.Abp.Identity.OrganizationUnit", null) + .WithMany("Roles") + .HasForeignKey("OrganizationUnitId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Volo.Abp.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Docs.Documents.DocumentContributor", b => + { + b.HasOne("Volo.Docs.Documents.Document", null) + .WithMany("Contributors") + .HasForeignKey("DocumentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Navigation("Claims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Navigation("Claims"); + + b.Navigation("Logins"); + + b.Navigation("OrganizationUnits"); + + b.Navigation("Roles"); + + b.Navigation("Tokens"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.OrganizationUnit", b => + { + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Volo.Docs.Documents.Document", b => + { + b.Navigation("Contributors"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20201208084431_Added_CommitCount.cs b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20201208084431_Added_CommitCount.cs new file mode 100644 index 0000000000..1ed082ff34 --- /dev/null +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20201208084431_Added_CommitCount.cs @@ -0,0 +1,24 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace VoloDocs.EntityFrameworkCore.Migrations +{ + public partial class Added_CommitCount : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "CommitCount", + table: "DocsDocumentContributors", + type: "int", + nullable: false, + defaultValue: 0); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "CommitCount", + table: "DocsDocumentContributors"); + } + } +} diff --git a/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/VoloDocsDbContextModelSnapshot.cs b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/VoloDocsDbContextModelSnapshot.cs index 204023bf3c..112509c609 100644 --- a/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/VoloDocsDbContextModelSnapshot.cs +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/VoloDocsDbContextModelSnapshot.cs @@ -19,7 +19,7 @@ namespace VoloDocs.EntityFrameworkCore.Migrations .UseIdentityColumns() .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("ProductVersion", "5.0.0-rc.2.20475.6"); + .HasAnnotation("ProductVersion", "5.0.0"); modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => { @@ -782,6 +782,9 @@ namespace VoloDocs.EntityFrameworkCore.Migrations b.Property("AvatarUrl") .HasColumnType("nvarchar(max)"); + b.Property("CommitCount") + .HasColumnType("int"); + b.Property("UserProfileUrl") .HasColumnType("nvarchar(max)"); diff --git a/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.csproj b/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.csproj index 861c087ff0..85216796e8 100644 --- a/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.csproj +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.csproj @@ -16,8 +16,8 @@ - - + + diff --git a/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj b/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj index 8244c9b6fd..739ad8f7cd 100644 --- a/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj +++ b/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj @@ -17,9 +17,9 @@ - + - + diff --git a/modules/docs/app/VoloDocs.Web/package.json b/modules/docs/app/VoloDocs.Web/package.json index 4150b401c4..98f5c28d34 100644 --- a/modules/docs/app/VoloDocs.Web/package.json +++ b/modules/docs/app/VoloDocs.Web/package.json @@ -3,7 +3,7 @@ "name": "volo.docstestapp", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.1", - "@abp/docs": "^4.0.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^4.1.0-rc.2", + "@abp/docs": "^4.1.0-rc.2" } } diff --git a/modules/docs/app/VoloDocs.Web/yarn.lock b/modules/docs/app/VoloDocs.Web/yarn.lock index f8dedb6321..31fe451903 100644 --- a/modules/docs/app/VoloDocs.Web/yarn.lock +++ b/modules/docs/app/VoloDocs.Web/yarn.lock @@ -2,45 +2,45 @@ # yarn lockfile v1 -"@abp/anchor-js@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-4.0.1.tgz#212e5ce25bbf7861d1a4dc93a3957126f4709a47" - integrity sha512-H71ZLiedgkNpbWFChcRkvTzxAN69i49Xv/zKqyLsOAKmdlMs0LBQNbV2IdYi/RwQALvkmfX9nNx6SwC5oZ2WQw== +"@abp/anchor-js@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-4.1.0-rc.2.tgz#7053090fd1fbd509d7c285fc8d6ee2051a39ade8" + integrity sha512-F1sZHBUzuysVflAC9sgOVz6SSG1ENrfOrHzKWShuvKlKmdcTp50c5P6s9z+WEavb+/2/6KgG+D1ic1emmANM8A== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" anchor-js "^4.2.2" -"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.1.tgz#ce8e3eb830a8e8f9eecb1a3b3bd70c2832fdf15e" - integrity sha512-w+ZG8Ewx9wWfbvRC2MAjJl+rXuXSHLhhGOiJTk68unWLNziDtNQzcSXG/Z5c1hA+acJSGqDoJGEGs4FVM136og== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.1.tgz#cd9d0eb11309c597dffd26277cd1bd7c5b1e0e2f" - integrity sha512-QGoCN/my0eAfa4tx5ytDxArIoz2i58jFFVUGso1Lekn54JvSt+WLz2p3uyTGatZ03Bp9836elhFnIopn12WvBw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~4.0.1" - "@abp/bootstrap" "~4.0.1" - "@abp/bootstrap-datepicker" "~4.0.1" - "@abp/datatables.net-bs4" "~4.0.1" - "@abp/font-awesome" "~4.0.1" - "@abp/jquery-form" "~4.0.1" - "@abp/jquery-validation-unobtrusive" "~4.0.1" - "@abp/lodash" "~4.0.1" - "@abp/luxon" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/select2" "~4.0.1" - "@abp/sweetalert" "~4.0.1" - "@abp/timeago" "~4.0.1" - "@abp/toastr" "~4.0.1" - -"@abp/aspnetcore.mvc.ui@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.1.tgz#6490c147a56e4f7055d2ca77f20baf1f60f56867" - integrity sha512-4B3icJrlpuZgMaX52ninyaenH7zLwepePEscDrLaFY9wyonKpZ2zh+xplnyM6vjNd+PhErWuA2+ssCswFhrJ3A== +"@abp/aspnetcore.mvc.ui.theme.basic@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.1.0-rc.2.tgz#b9462cbe36c41d68e2f44b79a3a2dba2c1b2b54a" + integrity sha512-KW3J6HnN1zZrCmrWmEcXBnGIOeuJDdp1jUECAm4Bdxi++VzfIbGlVvpcvUdT1E213reOUWi4dPhcej12DwrmDw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui.theme.shared@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.1.0-rc.2.tgz#d64cea1e504bcd3a08a1819025d40f3f84f0aadc" + integrity sha512-A/DRLwtJO7YCdqAgSF84wNRKjvGEQvcBocIwRxXCJEe3drxMoSwkAGjXQlxIYWZKdYbYUWDTjil2Mvwf91GUqg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~4.1.0-rc.2" + "@abp/bootstrap" "~4.1.0-rc.2" + "@abp/bootstrap-datepicker" "~4.1.0-rc.2" + "@abp/datatables.net-bs4" "~4.1.0-rc.2" + "@abp/font-awesome" "~4.1.0-rc.2" + "@abp/jquery-form" "~4.1.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~4.1.0-rc.2" + "@abp/lodash" "~4.1.0-rc.2" + "@abp/luxon" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/select2" "~4.1.0-rc.2" + "@abp/sweetalert" "~4.1.0-rc.2" + "@abp/timeago" "~4.1.0-rc.2" + "@abp/toastr" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.1.0-rc.2.tgz#54bf30def590e6d25fc35f77253888f3d9f74b9c" + integrity sha512-eOh5IBn4eNAjj2i6tlLRIV/r61Ef7+Z3PNvGgdml/XCo50el4G9XE7shxuGOY+MaFMfmsST2tcJlO9iAo9n2Yw== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -51,181 +51,181 @@ micromatch "^4.0.2" path "^0.12.7" -"@abp/bootstrap-datepicker@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.1.tgz#aad891263edff66f816e003ba4fa7f8acfe8e0b6" - integrity sha512-S0oaVZmXsDcOJLAyoGY0TvP/7bZx0GHIbU9BIhIL2Wl74HYaokjkTr6/IleIek9YeiF2vm9FkrUP1dKH/4f7Gg== +"@abp/bootstrap-datepicker@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.1.0-rc.2.tgz#d3fe863222a11771d366b1a3c246aaf34df94081" + integrity sha512-vn2xWAK3xqo5fMZJ9dOAZZmL+ZUnzZZNh3lF6uA97wTN/SbePlmHBYJpsCKIxOwbJS2HCvekHGJN/Ps4oEjlbw== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.1.tgz#3e41bdf9b3e9f8c497b9fafe22a4851d0401b31b" - integrity sha512-GoSaNWvswRHVoUrq7xClFQYtwqIlyS/vp/TdY+j5FFZP7ud89+ZGpdNqYqq5l9/6aaYa7v4b9mNTZ/1JRzAOYg== +"@abp/bootstrap@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.1.0-rc.2.tgz#b5132cf4c4c92fe833823cf2b91ab1b0167b0ecf" + integrity sha512-SsWEV0DveBIHiG051E6aBB371D15QIsGeo+POFhvQUvrlmzMBlFCAlmH0ef8w1n+3M3C37irCgEGKctt2pbcxQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" bootstrap "^4.5.0" bootstrap-v4-rtl "4.4.1-2" -"@abp/clipboard@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.0.1.tgz#aacbd02b6ce991ca20550ad7afc40e0cea247b5e" - integrity sha512-Q7Fe167pBJ/9Vp5RyVc/JejaIzNCdTgXcnZLNC7AEtaeBVCmLwsdnCYP3i32sdvX1AIgt3exhAAsHBt0deij/g== +"@abp/clipboard@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-4.1.0-rc.2.tgz#14802cefd81f3aa4a421523e4a8d71f06a7281a6" + integrity sha512-mUYqACe/Jh+GEGWaRfOblrKo/yJnNMmj2h3llDOpBzQj1HTuUCAOHBHpdq7SUPEuwQVxjOjDhBjYBKbqGbTKBQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" clipboard "^2.0.6" -"@abp/core@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.1.tgz#1df32bc058f45571605670ca81c226a1bd87400c" - integrity sha512-8UT5lwqV/luVG/SxePSTD2FRbZXwXv3cZJKjw+gpBjhD0slWrh51XEOHsM8ciTuhcvV/tsqVU9nXckDMdO58fw== +"@abp/core@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.1.0-rc.2.tgz#d306106a53fa56109751be0099785c94f43be56f" + integrity sha512-b0mOYSz8hNgZ/hBeYg8hkthJgE8CLyHNa2NcythPoIW8RR5qHmDtGoFnuFovLvLk7r+M4NWyxXRKEshSszIPyA== dependencies: - "@abp/utils" "^4.0.1" + "@abp/utils" "^4.1.0-rc.2" -"@abp/datatables.net-bs4@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.1.tgz#7538baad0eff24eca7f4246d020852f83139f645" - integrity sha512-S52jNPF4if68V+P/33NrtGPJXf6xrqgyZzz9b7qBR7HuUm3Nsn7bAslh3JNduNec/sFuE4Utl/xsFHZNjBWEog== +"@abp/datatables.net-bs4@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.1.0-rc.2.tgz#99aa1fbad91939fc23265324a3d8a45d0c1e5a7a" + integrity sha512-Y9UyqniOkx5DJO+2GGurnQE1yfRmGaQ3y7V07gKWRq+gHLUhE+vfgOLVpGM6ufdTIbLvVw5Ng+3gfOmPlUnpxg== dependencies: - "@abp/datatables.net" "~4.0.1" + "@abp/datatables.net" "~4.1.0-rc.2" datatables.net-bs4 "^1.10.21" -"@abp/datatables.net@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.1.tgz#eb89716a37351c41b5bccfc2db88fc7ceb991a26" - integrity sha512-APFLui0w8MqsBWqP/K0QkT5cBq5SsWiqMaIGTXQKinMVLV597sUszrlhe1ISU2PqeD7iX6pCZNNOTI1NEUn9/Q== +"@abp/datatables.net@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.1.0-rc.2.tgz#1a134688259d32187d822d8a49c7a68b4cc226c7" + integrity sha512-9o5g8s7ZTlThd1FMFmO7wS+MxmXgUMmiWx7Hwara9ypfJPd0vanz10bQAdTpLiDy/aa0tUmz0xOVj73yvBJm9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" datatables.net "^1.10.21" -"@abp/docs@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-4.0.1.tgz#64d95b5d38b0eef4ba1e6d886ceaf0a8a3fdd9c4" - integrity sha512-Y9/XROwYj6LdSGjIQhweRxe5XFEMskUmbQr2FTZeN3KFrGqJxVaQHXJn7b+iRdhYQvSx3ztpqPAMyB9KFilg2A== +"@abp/docs@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-4.1.0-rc.2.tgz#414f3e4fcd5d7915a0a7d48814b5b3b78f78678d" + integrity sha512-KKZ4llzDufZsxx66joKL4M/hTbWiTB+osvM7h7hjE3p1xz73n0raG9ND4XmSBtE6FOfaLnPgSLrlhPRhnbCP0g== dependencies: - "@abp/anchor-js" "~4.0.1" - "@abp/clipboard" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/popper.js" "~4.0.1" - "@abp/prismjs" "~4.0.1" + "@abp/anchor-js" "~4.1.0-rc.2" + "@abp/clipboard" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/popper.js" "~4.1.0-rc.2" + "@abp/prismjs" "~4.1.0-rc.2" -"@abp/font-awesome@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.1.tgz#8a9d83b2c2adfcd5abcbd9c31c315460d44a321e" - integrity sha512-+6+m/DKMnfkeQiWUsMlB6Da8u6yREyN2oQYGYhSRAK8419ym8RHHrqKJv2AClI4iLq2ppHZj8WF84+SeoCekRg== +"@abp/font-awesome@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.1.0-rc.2.tgz#ecf490861c09250cf61611ac74cec5ab4392e807" + integrity sha512-6yAsf/ee2hdrHHUACql8c3gY54Hd7YAK2olHymyc3Io2hhK2VxXRc2W2oRSwbQ9GsSE+XDrEVtjIR64nBseTeg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" "@fortawesome/fontawesome-free" "^5.13.0" -"@abp/jquery-form@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.1.tgz#6dc1922b2800dd635f20881a82e08104a1dd1bb5" - integrity sha512-JMBZYu/MI/GjaLTBOMB5iv8cagnLpReDULNC3r6tLNNqB1R8f3Cg1T7nF4YCuU9SYMqis1P/AuE4oEh+4rQdAQ== +"@abp/jquery-form@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.1.0-rc.2.tgz#76dff67a3fe6e6ad7bd60bb909de93c09966cc0a" + integrity sha512-LGafwxyRYUbHQlJ9pPbYdkVqzdT/y1Fp4Nr4C3W5jxsJuaSICl0RPkRHIPALeoqbpEWuj6dVep6ZuO9hhxBzNw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.1.tgz#4142ca31c0830fe24a1467e8cf13b55ba9d7c1dd" - integrity sha512-rdSRTcdKCHmarbrVgmPYdTiJ0G/aFKd+dr0krO7fALPTuQKChbDnHOO4/JvQSc+cd9faxa8c6ZWvlHdsof23tQ== +"@abp/jquery-validation-unobtrusive@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.1.0-rc.2.tgz#1f1d395cfa47740d47303ff512592ff1993f9e13" + integrity sha512-0LXWvgfyLHVw7qRVOmY0rfVlq+yJq/nhbcVoYK+QbmKnrFu+KZg0KNMOD8wTXs8mZ1EKGQpoQKWxImtCnGrV/A== dependencies: - "@abp/jquery-validation" "~4.0.1" + "@abp/jquery-validation" "~4.1.0-rc.2" jquery-validation-unobtrusive "^3.2.11" -"@abp/jquery-validation@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.1.tgz#74e7d795468c6986f2db15662631fcd4f67c679e" - integrity sha512-FX26aQCsMBdVWAJb7S37Lt7KoHAEHoYguh/qfZIARCpOYOOWvxfDz1wTrmADUkqdillqEiCeD/Imj8bYH9Faaw== +"@abp/jquery-validation@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.1.0-rc.2.tgz#ad4b464fd0133eab8d08c781c7d7c4e00bc4918d" + integrity sha512-iLTobfwqDk7iiQxvv5UowxOKywsh/77VlAVktstnFG3N3Y73+JYKzM0mGM/j4zM1OrjbF9/cnPnDVX7bATPz9w== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-validation "^1.19.2" -"@abp/jquery@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.1.tgz#aa554accb16600fd586c3a4f088040cd26d0bde8" - integrity sha512-MtiRKOLyjEWux+whPP3+zwPbpj8or756JtgjnwOTDB9tp9HLCYUaskt+oalYPvob24nDZcNu2RnMALYdCVhZAQ== +"@abp/jquery@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.1.0-rc.2.tgz#0f64cad5b1ae3e47d2344e5fb30c347b89d6d2bb" + integrity sha512-YubZwMJIN+UcfxfUlt3usfcLMG9WcXNpemUsdBtlKNzti562KZMIHPFLRL+DsiqvzZ74h2PxSWWsxS42Z7z0Yw== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" jquery "~3.5.1" -"@abp/lodash@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.1.tgz#ec261ccaab8a70d5b32a8a7c22387e48936d38d4" - integrity sha512-Dav1QKbBeGR4VVbHHe1s3OEzN7wnb9K/vwzHrWmtO8D1Q5Z3433xjNmgL5VQ9gfxXqooSfEO4gAovZklMDHDew== +"@abp/lodash@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.1.0-rc.2.tgz#9281c641ab7b7b33e7acf12815dc461e7ae967b9" + integrity sha512-RqdekrAyLPaLNJddmrq89EdrI1xg4296tOafFLHvirgRWisJTIa9bflTOwMwEg9FNdLJgA0zHi4WdAMer0qZdA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" lodash "^4.17.15" -"@abp/luxon@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.1.tgz#a540750b1605dbac856ce9c2e776c2fecf6392f9" - integrity sha512-eRumVB7UIf2XH6OZVUTvcKw0A/OSAfYV59fM+Wc4dAkNcmsNZI0gD1o0AigSGNCxTV6v+W2bFrsuooSqK99Y0Q== +"@abp/luxon@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.1.0-rc.2.tgz#78fc1cf651d7c19b87a31823cd3ce68961d6b1e6" + integrity sha512-U4e9uGZlg9xj9tBNP337v3wiaSR6qxWsBgh/duQGWrqV+75LlQjYcZaPoXDidUUS6U6epDSR2pc2T39rahcgSQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" luxon "^1.24.1" -"@abp/malihu-custom-scrollbar-plugin@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.1.tgz#0a556423a67b6c949e32ffcacd72256dea6c31ee" - integrity sha512-YTwYpnQ1ZrON70gvJcnNZRwB3Ze4olGcXxiPvmRgSHbGJkSnHYJiP6PvsN1F3HDFukAJ/iUu+WwEe8OBwlyLXA== +"@abp/malihu-custom-scrollbar-plugin@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.1.0-rc.2.tgz#36553e71052cad9734e0c9b2c65759e538468648" + integrity sha512-JQ6PCcj5qmF9MxNRPAsKHHnqBPCdn4lQnwxZrHcG9tD70Gx+NfC4UH41tqXI+htba4k0PHRyH2y39Q1iJm0NFA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/popper.js@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-4.0.1.tgz#234f166fd1e8cbd3b2f60a6c5068adc04e4d3944" - integrity sha512-pHqc9yZgZzoaN4yNT/lXfESTW2RzfFiZQoCvJ4LbXi1sHrzNh3UQ3qEXb7WBUm4pVMcyquu7nW0ZPBlgeOvdgQ== +"@abp/popper.js@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-4.1.0-rc.2.tgz#e714157077a496b9186786775f103db0e130a8c5" + integrity sha512-/8moMZCzXcO7bGR2kz4jhsHweoYBi0v7KbXl+hqsFEi+aHRnKptWnr0X2zpe1ke4oG6rb4jYGeyh5KdANkEbzQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" popper.js "^1.16.0" -"@abp/prismjs@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.0.1.tgz#8e614878a9d1d63504fe7ba6b7d44093947d862b" - integrity sha512-qZP4TlQDiXaAIrDmpzQJeL/9mtTCxQCIbELDnBHMZFDrYNENOKZeBmvD9WAhgzL7FJcnPtOomJgZ5x2rqpBW/w== +"@abp/prismjs@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-4.1.0-rc.2.tgz#f49f51a036c36f0fb8b561913e16d46736c24470" + integrity sha512-9E5l1gAT73FZlfkv1dDEDPA2Cryy7hDQp0ahdIG57HRsKeUYhRODNo07cf2ev5RDgIQbm3iAcfe7YJubR5v8OQ== dependencies: - "@abp/clipboard" "~4.0.1" - "@abp/core" "~4.0.1" + "@abp/clipboard" "~4.1.0-rc.2" + "@abp/core" "~4.1.0-rc.2" prismjs "^1.20.0" -"@abp/select2@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.1.tgz#8983e7b5c3afb862f08b2730b70e59d726e9b5d5" - integrity sha512-WdzY2hvsS/4vz/VXpxq2muSzzE8ggchiIrICy/WKchJxL9L08DM796t6aE6rEl9wucY8XEzzWrPOVqAjJmnXFA== +"@abp/select2@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.1.0-rc.2.tgz#c48e865f401ddce32dff2a7a14ae07c4bde2f57b" + integrity sha512-YYK/SIqXQcSDQFMVg/ogohc76d4JDrOVQEbzfkNNI5bKVJo+hkqtNzAwV9FLdPZZNw15QMv0eF1ie4aUtIxyaA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.1.tgz#0088610915ad6db0a140b77832a37c10066eb4ee" - integrity sha512-t4/44oQCMngSjVqmeRWXwrXa/pRKc3CEpyyTiGIXki4dWJ21j0ePCw2l3rvOJWnpoCznhxa/UGxLfRfK1NEzRg== +"@abp/sweetalert@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.1.0-rc.2.tgz#cdcaf8e9a33cf218a687fd6a42cfe1c85d89c6b7" + integrity sha512-sjQd8TF9oUnaQ1OPTGdVyAfWqSZEk4bRbC/qw2CouEOfRLatzkC0JcmzFLN0f5N1am1RQwkFakpENKH7NqTCvg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" sweetalert "^2.1.2" -"@abp/timeago@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.1.tgz#8c161645534eb1f62fe4607450acf7345729e711" - integrity sha512-PsPobV79U2qzVY+WBsmJM1ohSF4jqcLnL4/7qyJvxlb1WwbCl1F5D4cpiJP4zsM4clPW4mbSsiauMNp+HTNKEA== +"@abp/timeago@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.1.0-rc.2.tgz#445d043ae482b76799b496ae6565abfaf75a34b9" + integrity sha512-wWx56EZMUGIfqJV5JLCvUp4RVhKXHYLQaVNQSF8E05COXmSQwFThVS7vbuiODFp2BGm6RAqCVtZDCreu2B8z9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.1.tgz#ecb6f6193b7edc3150d0614ab9457472baf1cce3" - integrity sha512-bTTz0O8zj7fMhdoummP2Ed5Z8SJTmR6svzNchBXNDrnRAcDQvTihPTcg0UpH8BEDFczbLowq09CG2A/RMSJoug== +"@abp/toastr@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.1.0-rc.2.tgz#1af16fa8687201b6b9c7229d087a4233998703b9" + integrity sha512-g+Jl5H1ZHoJ4JwWuix0xA+GMFY42pwq8WYjxP6qE2/Y2aixYHVIui15eBqF2L06yXOt53YFcC1+pxjrp91xHxw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" toastr "^2.1.4" -"@abp/utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" - integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== +"@abp/utils@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.2.tgz#eb6dbf0ee493d0f050b37347d2d6d283098aedae" + integrity sha512-V2k5I89lVBoeGIKgg4p2H9GlMAcDWbctwKZPVwBEMVEVm1uTR2xQAWdTdSFd5Q8I8Xsf/aIG8ELM7l5j2h7/zQ== dependencies: just-compare "^1.3.0" diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo.Docs.Admin.Application.Contracts.csproj b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo.Docs.Admin.Application.Contracts.csproj index e4420cb87e..8a06bec73d 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo.Docs.Admin.Application.Contracts.csproj +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo.Docs.Admin.Application.Contracts.csproj @@ -22,7 +22,7 @@ - + diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Navigation/DocsMenuContributor.cs b/modules/docs/src/Volo.Docs.Admin.Web/Navigation/DocsMenuContributor.cs index 1012f9cf75..9bc55d543f 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Navigation/DocsMenuContributor.cs +++ b/modules/docs/src/Volo.Docs.Admin.Web/Navigation/DocsMenuContributor.cs @@ -13,11 +13,11 @@ namespace Volo.Docs.Admin.Navigation { if (context.Menu.Name == StandardMenus.Main) { - await ConfigureMainMenu(context); + await ConfigureMainMenuAsync(context); } } - private async Task ConfigureMainMenu(MenuConfigurationContext context) + private async Task ConfigureMainMenuAsync(MenuConfigurationContext context) { var administrationMenu = context.Menu.GetAdministration(); diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj b/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj index f6a6175784..dde54f0235 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj +++ b/modules/docs/src/Volo.Docs.Admin.Web/Volo.Docs.Admin.Web.csproj @@ -27,7 +27,7 @@ - + diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/DocumentContributorDto.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/DocumentContributorDto.cs index 337faf3db1..fcd049d7c9 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/DocumentContributorDto.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/DocumentContributorDto.cs @@ -10,5 +10,7 @@ namespace Volo.Docs.Documents public string UserProfileUrl { get; set; } public string AvatarUrl { get; set; } + + public int CommitCount { get; set; } } } diff --git a/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj b/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj index ae0a4f5842..64af5f4066 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj +++ b/modules/docs/src/Volo.Docs.Domain/Volo.Docs.Domain.csproj @@ -17,10 +17,10 @@ - + - + diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/Document.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/Document.cs index c2ec85f33b..967b5939f2 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/Document.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/Document.cs @@ -87,9 +87,9 @@ namespace Volo.Docs.Documents Contributors = new List(); } - public virtual void AddContributor(string username, string userProfileUrl, string avatarUrl) + public virtual void AddContributor(string username, string userProfileUrl, string avatarUrl, int commitCount = 1) { - Contributors.AddIfNotContains(new DocumentContributor(Id, username, userProfileUrl, avatarUrl)); + Contributors.AddIfNotContains(new DocumentContributor(Id, username, userProfileUrl, avatarUrl, commitCount)); } public virtual void RemoveAllContributors() diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentContributor.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentContributor.cs index 1351b0a4ca..876686b5ff 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentContributor.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentContributor.cs @@ -9,6 +9,8 @@ namespace Volo.Docs.Documents public string Username { get; set; } + public int CommitCount { get; set; } + public string UserProfileUrl { get; set; } public string AvatarUrl { get; set; } @@ -23,12 +25,13 @@ namespace Volo.Docs.Documents return DocumentId == documentId && Username == username; } - public DocumentContributor(Guid documentId, string username, string userProfileUrl, string avatarUrl) + public DocumentContributor(Guid documentId, string username, string userProfileUrl, string avatarUrl, int commitCount = 1) { DocumentId = documentId; Username = username; UserProfileUrl = userProfileUrl; AvatarUrl = avatarUrl; + CommitCount = commitCount; } public override object[] GetKeys() diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/DocumentAuthor.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/DocumentAuthor.cs new file mode 100644 index 0000000000..f1fef91713 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/DocumentAuthor.cs @@ -0,0 +1,13 @@ +namespace Volo.Docs.GitHub.Documents +{ + public class DocumentAuthor + { + public string Login { get; set; } + + public string HtmlUrl { get; set; } + + public string AvatarUrl { get; set; } + + public int CommitCount { get; set; } + } +} diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentSource.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentSource.cs index ef8ea15e76..dfc79f7547 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentSource.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentSource.cs @@ -84,9 +84,11 @@ namespace Volo.Docs.GitHub.Documents } var authors = GetAuthors(commits); + + document.RemoveAllContributors(); foreach (var author in authors) { - document.AddContributor(author.Login, author.HtmlUrl, author.AvatarUrl); + document.AddContributor(author.Login, author.HtmlUrl, author.AvatarUrl, author.CommitCount); } return document; @@ -114,20 +116,35 @@ namespace Volo.Docs.GitHub.Documents : null; } - private static List GetAuthors(IReadOnlyList commits) + private static List GetAuthors(IReadOnlyList commits) { if (commits == null || !commits.Any()) { - return new List(); + return new List(); } - return commits + var authorsOrderedAndGrouped = commits .Where(x => x.Author != null) .Select(x => x.Author) .GroupBy(x => x.Id) - .OrderByDescending(x => x.Count()) - .Select(x => x.FirstOrDefault()) - .ToList(); + .OrderByDescending(x => x.Count()); + + var documentAuthors = new List(); + + foreach (var authorGroup in authorsOrderedAndGrouped) + { + var author = authorGroup.FirstOrDefault(); + var documentAuthor = new DocumentAuthor + { + CommitCount = authorGroup.Count(), + AvatarUrl = author.AvatarUrl, + HtmlUrl = author.HtmlUrl, + Login = author.Login + }; + documentAuthors.Add(documentAuthor); + } + + return documentAuthors; } private static DateTime GetLastCommitDate(IReadOnlyList commits) diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml index a7897eddfe..1cdfe7ca2e 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml @@ -217,7 +217,7 @@ @(L["Contributors"].Value) - @foreach (var contributor in Model.Document.Contributors) + @foreach (var contributor in Model.Document.Contributors.OrderByDescending(c=> c.CommitCount).ToList()) { 0) { + setCookies(); + } + } + }; + $('.doc-section-combobox').change(function () { setCookies(); clearQueryString(); location.reload(); }); + initCookies(); setQueryString(); }; diff --git a/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj b/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj index b67bf5850e..90d738f09e 100644 --- a/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj +++ b/modules/docs/src/Volo.Docs.Web/Volo.Docs.Web.csproj @@ -23,8 +23,8 @@ - - + + diff --git a/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo.Docs.Admin.Application.Tests.csproj b/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo.Docs.Admin.Application.Tests.csproj index 4ba07f323d..756d2c1b51 100644 --- a/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo.Docs.Admin.Application.Tests.csproj +++ b/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo.Docs.Admin.Application.Tests.csproj @@ -6,7 +6,7 @@ - + diff --git a/modules/docs/test/Volo.Docs.Application.Tests/Volo.Docs.Application.Tests.csproj b/modules/docs/test/Volo.Docs.Application.Tests/Volo.Docs.Application.Tests.csproj index 82460f3822..e7d49b7521 100644 --- a/modules/docs/test/Volo.Docs.Application.Tests/Volo.Docs.Application.Tests.csproj +++ b/modules/docs/test/Volo.Docs.Application.Tests/Volo.Docs.Application.Tests.csproj @@ -6,7 +6,7 @@ - + diff --git a/modules/docs/test/Volo.Docs.Domain.Tests/Volo.Docs.Domain.Tests.csproj b/modules/docs/test/Volo.Docs.Domain.Tests/Volo.Docs.Domain.Tests.csproj index bb56aefb8d..0155b7c479 100644 --- a/modules/docs/test/Volo.Docs.Domain.Tests/Volo.Docs.Domain.Tests.csproj +++ b/modules/docs/test/Volo.Docs.Domain.Tests/Volo.Docs.Domain.Tests.csproj @@ -6,7 +6,7 @@ - + diff --git a/modules/docs/test/Volo.Docs.EntityFrameworkCore.Tests/Volo.Docs.EntityFrameworkCore.Tests.csproj b/modules/docs/test/Volo.Docs.EntityFrameworkCore.Tests/Volo.Docs.EntityFrameworkCore.Tests.csproj index 0af70ae609..3672cdfcac 100644 --- a/modules/docs/test/Volo.Docs.EntityFrameworkCore.Tests/Volo.Docs.EntityFrameworkCore.Tests.csproj +++ b/modules/docs/test/Volo.Docs.EntityFrameworkCore.Tests/Volo.Docs.EntityFrameworkCore.Tests.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/modules/docs/test/Volo.Docs.MongoDB.Tests/Volo.Docs.MongoDB.Tests.csproj b/modules/docs/test/Volo.Docs.MongoDB.Tests/Volo.Docs.MongoDB.Tests.csproj index 098634157c..3f370e9d58 100644 --- a/modules/docs/test/Volo.Docs.MongoDB.Tests/Volo.Docs.MongoDB.Tests.csproj +++ b/modules/docs/test/Volo.Docs.MongoDB.Tests/Volo.Docs.MongoDB.Tests.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/modules/docs/test/Volo.Docs.TestBase/Volo.Docs.TestBase.csproj b/modules/docs/test/Volo.Docs.TestBase/Volo.Docs.TestBase.csproj index 6a4ed83050..bea423c535 100644 --- a/modules/docs/test/Volo.Docs.TestBase/Volo.Docs.TestBase.csproj +++ b/modules/docs/test/Volo.Docs.TestBase/Volo.Docs.TestBase.csproj @@ -6,12 +6,12 @@ - - - - - - + + + + + + diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor index 02fdd768a9..07fd973449 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor @@ -71,7 +71,7 @@ if (feature.ValueType is ToggleStringValueType) { - @feature.DisplayName + @feature.DisplayName } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj index 5fb53bf5e0..8b1796e8fb 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo.Abp.FeatureManagement.Domain.Shared.csproj @@ -15,7 +15,7 @@ - + diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj index e0bdc30dcf..550c509ff3 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Volo.Abp.FeatureManagement.Web.csproj @@ -24,7 +24,7 @@ - + diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo.Abp.FeatureManagement.Application.Tests.csproj b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo.Abp.FeatureManagement.Application.Tests.csproj index e27652cf22..fbb33e064c 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo.Abp.FeatureManagement.Application.Tests.csproj +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo.Abp.FeatureManagement.Application.Tests.csproj @@ -13,7 +13,7 @@ - + diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Domain.Tests/Volo.Abp.FeatureManagement.Domain.Tests.csproj b/modules/feature-management/test/Volo.Abp.FeatureManagement.Domain.Tests/Volo.Abp.FeatureManagement.Domain.Tests.csproj index c38551375d..2c578fe0db 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.Domain.Tests/Volo.Abp.FeatureManagement.Domain.Tests.csproj +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.Domain.Tests/Volo.Abp.FeatureManagement.Domain.Tests.csproj @@ -8,7 +8,7 @@ - + diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests.csproj b/modules/feature-management/test/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests.csproj index ddb292253b..f589a6b5ea 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests.csproj +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests/Volo.Abp.FeatureManagement.EntityFrameworkCore.Tests.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.MongoDB.Tests/Volo.Abp.FeatureManagement.MongoDB.Tests.csproj b/modules/feature-management/test/Volo.Abp.FeatureManagement.MongoDB.Tests/Volo.Abp.FeatureManagement.MongoDB.Tests.csproj index 101ba7d1d4..703a8fb219 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.MongoDB.Tests/Volo.Abp.FeatureManagement.MongoDB.Tests.csproj +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.MongoDB.Tests/Volo.Abp.FeatureManagement.MongoDB.Tests.csproj @@ -13,8 +13,8 @@ - - + + diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo.Abp.FeatureManagement.TestBase.csproj b/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo.Abp.FeatureManagement.TestBase.csproj index 262dbe49f0..56e34852e7 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo.Abp.FeatureManagement.TestBase.csproj +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo.Abp.FeatureManagement.TestBase.csproj @@ -14,12 +14,12 @@ - - - - - - + + + + + + diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityWebMainMenuContributor.cs b/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityWebMainMenuContributor.cs index 3198e1335d..5e5714a851 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityWebMainMenuContributor.cs +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/AbpIdentityWebMainMenuContributor.cs @@ -27,12 +27,12 @@ namespace Volo.Abp.Identity.Blazor if (hasRolePermission) { - identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Roles, l["Roles"], url: "/identity/roles")); + identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Roles, l["Roles"], url: "identity/roles")); } if (hasUserPermission) { - identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Users, l["Users"], url: "/identity/users")); + identityMenuItem.AddItem(new ApplicationMenuItem(IdentityMenuNames.Users, l["Users"], url: "identity/users")); } } } diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor index f89082404a..2465940abd 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor @@ -9,61 +9,69 @@ @inject AbpBlazorMessageLocalizerHelper LH @inherits AbpCrudPageBase -@* ************************* PAGE HEADER ************************* *@ - - - @L["Roles"] - - - @if ( HasCreatePermission ) - { - - } - - -@* ************************* DATA GRID ************************* *@ - - - - - - - - - - - - - - @(context.Name) - @if (context.IsDefault) + + + @* ************************* PAGE HEADER ************************* *@ + + + @L["Roles"] + + + @if ( HasCreatePermission ) { - @L["DisplayName:IsDefault"] + } - @if (context.IsPublic) - { - @L["DisplayName:IsPublic"] - } - - - - + + + + + @* ************************* DATA GRID ************************* *@ + + + + + + + + + + + + + + @(context.Name) + @if (context.IsDefault) + { + @L["DisplayName:IsDefault"] + } + @if (context.IsPublic) + { + @L["DisplayName:IsPublic"] + } + + + + + + @* ************************* CREATE MODAL ************************* *@ @if (HasCreatePermission) @@ -71,7 +79,7 @@ -
+ @L["NewRole"] @@ -81,7 +89,7 @@ @L["DisplayName:RoleName"] - + @@ -96,7 +104,7 @@ - +
@@ -108,7 +116,7 @@ -
+ @L["Edit"] @@ -119,7 +127,7 @@ @L["DisplayName:RoleName"] - + @@ -134,7 +142,7 @@ - +
diff --git a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor index 6697a341e5..f4b7e411d9 100644 --- a/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor +++ b/modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor @@ -8,63 +8,71 @@ @inject AbpBlazorMessageLocalizerHelper LH @inherits AbpCrudPageBase -@* ************************* PAGE HEADER ************************* *@ - - -

@L["Users"]

-
- - @if (HasCreatePermission) - { - - } - -
-@* ************************* DATA GRID ************************* *@ - - - - - - - - - - - - - - @(context.As().UserName) - - - - - @(context.As().Email) - - - - - @(context.As().PhoneNumber) - - - - + + + @* ************************* PAGE HEADER ************************* *@ + + +

@L["Users"]

+
+ + @if (HasCreatePermission) + { + + } + +
+
+ + @* ************************* DATA GRID ************************* *@ + + + + + + + + + + + + + + @(context.As().UserName) + + + + + @(context.As().Email) + + + + + @(context.As().PhoneNumber) + + + + + +
@* ************************* CREATE MODAL ************************* *@ @if (HasCreatePermission) @@ -72,7 +80,7 @@ -
+ @L["NewUser"] @@ -89,7 +97,7 @@ @L["DisplayName:UserName"] - + @@ -168,7 +176,7 @@ - +
@@ -181,7 +189,7 @@ -
+ @L["Edit"] @@ -200,7 +208,7 @@ @L["DisplayName:UserName"] - + @@ -279,7 +287,7 @@ - +
diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.csproj b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.csproj index 3187b9946e..ddd23ab870 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo.Abp.Identity.Domain.Shared.csproj @@ -27,7 +27,7 @@
- + diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj b/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj index c8f9990468..1cc6517664 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo.Abp.Identity.Domain.csproj @@ -30,7 +30,7 @@
- + diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityClaimTypeManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityClaimTypeManager.cs index f7286b53d2..9978cdd88a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityClaimTypeManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityClaimTypeManager.cs @@ -3,12 +3,11 @@ using Volo.Abp.Domain.Services; namespace Volo.Abp.Identity { - //TODO: Rename to IdentityClaimTypeManager in v2.0! - public class IdenityClaimTypeManager : DomainService + public class IdentityClaimTypeManager : DomainService { protected IIdentityClaimTypeRepository IdentityClaimTypeRepository { get; } - public IdenityClaimTypeManager(IIdentityClaimTypeRepository identityClaimTypeRepository) + public IdentityClaimTypeManager(IIdentityClaimTypeRepository identityClaimTypeRepository) { IdentityClaimTypeRepository = identityClaimTypeRepository; } diff --git a/modules/identity/src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs b/modules/identity/src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs index ce26e91e20..511455bab3 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs @@ -2,9 +2,11 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.PageToolbars; using Volo.Abp.AutoMapper; using Volo.Abp.Identity.Localization; using Volo.Abp.Identity.Web.Navigation; +using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending.Modularity; @@ -64,6 +66,34 @@ namespace Volo.Abp.Identity.Web options.Conventions.AuthorizePage("/Identity/Roles/CreateModal", IdentityPermissions.Roles.Create); options.Conventions.AuthorizePage("/Identity/Roles/EditModal", IdentityPermissions.Roles.Update); }); + + + Configure(options => + { + options.Configure( + toolbar => + { + toolbar.AddButton( + LocalizableString.Create("NewUser"), + icon: "plus", + name: "CreateUser", + requiredPolicyName: IdentityPermissions.Users.Create + ); + } + ); + + options.Configure( + toolbar => + { + toolbar.AddButton( + LocalizableString.Create("NewRole"), + icon: "plus", + name: "CreateRole", + requiredPolicyName: IdentityPermissions.Roles.Create + ); + } + ); + }); } public override void PostConfigureServices(ServiceConfigurationContext context) diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/Index.cshtml b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/Index.cshtml index 734fc40fe5..30e42694e6 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/Index.cshtml +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/Index.cshtml @@ -2,6 +2,7 @@ @using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.AspNetCore.Mvc.UI.Layout +@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageToolbar @using Volo.Abp.Identity @using Volo.Abp.Identity.Localization @using Volo.Abp.Identity.Web.Navigation @@ -33,10 +34,7 @@ @L["Roles"] - @if (await Authorization.IsGrantedAsync(IdentityPermissions.Roles.Create)) - { - - } + @await Component.InvokeAsync(typeof(AbpPageToolbarViewComponent), new { pageName = typeof(IndexModel).FullName }) diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/Index.cshtml b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/Index.cshtml index ee9192d58f..5904cab2fa 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/Index.cshtml +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/Index.cshtml @@ -2,6 +2,7 @@ @using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.AspNetCore.Mvc.UI.Layout +@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageToolbar @using Volo.Abp.Identity @using Volo.Abp.Identity.Localization @using Volo.Abp.Identity.Web.Navigation @@ -34,10 +35,7 @@ @L["Users"] - @if (await Authorization.IsGrantedAsync(IdentityPermissions.Users.Create)) - { - - } + @await Component.InvokeAsync(typeof(AbpPageToolbarViewComponent), new { pageName = typeof(IndexModel).FullName }) diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj b/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj index 16b42720a8..70fb4586a4 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj +++ b/modules/identity/src/Volo.Abp.Identity.Web/Volo.Abp.Identity.Web.csproj @@ -43,7 +43,7 @@
- + diff --git a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo.Abp.Identity.Application.Tests.csproj b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo.Abp.Identity.Application.Tests.csproj index bf4f32d6b7..afd6f2b880 100644 --- a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo.Abp.Identity.Application.Tests.csproj +++ b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo.Abp.Identity.Application.Tests.csproj @@ -17,7 +17,7 @@ - + diff --git a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.csproj b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.csproj index 04f98805b7..ae2638d130 100644 --- a/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.csproj +++ b/modules/identity/test/Volo.Abp.Identity.AspNetCore.Tests/Volo.Abp.Identity.AspNetCore.Tests.csproj @@ -19,7 +19,7 @@ - + diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.csproj b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.csproj index ce57f7fdae..1771b68a5c 100644 --- a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.csproj +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo.Abp.Identity.Domain.Tests.csproj @@ -18,7 +18,7 @@ - + diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityClaimTypeManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityClaimTypeManager_Tests.cs index 1ef603e6b3..23d5ea0d02 100644 --- a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityClaimTypeManager_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityClaimTypeManager_Tests.cs @@ -5,16 +5,16 @@ using Xunit; namespace Volo.Abp.Identity { - public class IdenityClaimTypeManager_Tests : AbpIdentityDomainTestBase + public class IdentityClaimTypeManager_Tests : AbpIdentityDomainTestBase { private readonly IIdentityClaimTypeRepository _identityClaimTypeRepository; - private readonly IdenityClaimTypeManager _claimTypeManager; + private readonly IdentityClaimTypeManager _claimTypeManager; private readonly IdentityTestData _testData; - public IdenityClaimTypeManager_Tests() + public IdentityClaimTypeManager_Tests() { _identityClaimTypeRepository = GetRequiredService(); - _claimTypeManager = GetRequiredService(); + _claimTypeManager = GetRequiredService(); _testData = GetRequiredService(); } diff --git a/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo.Abp.Identity.EntityFrameworkCore.Tests.csproj b/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo.Abp.Identity.EntityFrameworkCore.Tests.csproj index a81a17bd57..e21b4d6095 100644 --- a/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo.Abp.Identity.EntityFrameworkCore.Tests.csproj +++ b/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo.Abp.Identity.EntityFrameworkCore.Tests.csproj @@ -19,8 +19,8 @@ - - + + diff --git a/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo.Abp.Identity.MongoDB.Tests.csproj b/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo.Abp.Identity.MongoDB.Tests.csproj index 6f4d94340d..e73576a406 100644 --- a/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo.Abp.Identity.MongoDB.Tests.csproj +++ b/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo.Abp.Identity.MongoDB.Tests.csproj @@ -19,8 +19,8 @@ - - + + diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo.Abp.Identity.TestBase.csproj b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo.Abp.Identity.TestBase.csproj index 5638abff65..185e11a6e3 100644 --- a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo.Abp.Identity.TestBase.csproj +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo.Abp.Identity.TestBase.csproj @@ -19,12 +19,12 @@ - - - - - - + + + + + + diff --git a/modules/identityserver/common.props b/modules/identityserver/common.props deleted file mode 100644 index 7f5a705307..0000000000 --- a/modules/identityserver/common.props +++ /dev/null @@ -1,16 +0,0 @@ - - - latest - 0.3.0 - $(NoWarn);CS1591;CS0436 - http://www.aspnetboilerplate.com/images/abp_nupkg.png - http://abp.io - git - https://github.com/volosoft/abp/ - - - - - - - \ No newline at end of file diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/IApiScopeeRepository.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/IApiScopeRepository.cs similarity index 100% rename from modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/IApiScopeeRepository.cs rename to modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/ApiScopes/IApiScopeRepository.cs diff --git a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Tokens/TokenCleanupBackgroundWorker.cs b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Tokens/TokenCleanupBackgroundWorker.cs index a7ad09d191..c424f9513c 100644 --- a/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Tokens/TokenCleanupBackgroundWorker.cs +++ b/modules/identityserver/src/Volo.Abp.IdentityServer.Domain/Volo/Abp/IdentityServer/Tokens/TokenCleanupBackgroundWorker.cs @@ -11,11 +11,11 @@ namespace Volo.Abp.IdentityServer.Tokens protected TokenCleanupOptions Options { get; } public TokenCleanupBackgroundWorker( - AbpTimer timer, + AbpAsyncTimer timer, IServiceScopeFactory serviceScopeFactory, IOptions options) : base( - timer, + timer, serviceScopeFactory) { Options = options.Value; @@ -27,8 +27,7 @@ namespace Volo.Abp.IdentityServer.Tokens await workerContext .ServiceProvider .GetRequiredService() - .CleanAsync() - ; + .CleanAsync(); } } } diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo.Abp.IdentityServer.Domain.Tests.csproj b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo.Abp.IdentityServer.Domain.Tests.csproj index 2063236ee8..87d8052cc9 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo.Abp.IdentityServer.Domain.Tests.csproj +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo.Abp.IdentityServer.Domain.Tests.csproj @@ -16,7 +16,7 @@ - + diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.csproj b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.csproj index 17f38e0f68..9e6337dbb4 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.csproj +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests.csproj @@ -19,12 +19,12 @@ - - - - - - + + + + + + diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo.Abp.IdentityServer.MongoDB.Tests.csproj b/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo.Abp.IdentityServer.MongoDB.Tests.csproj index 5ef09a8598..b78bd68109 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo.Abp.IdentityServer.MongoDB.Tests.csproj +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo.Abp.IdentityServer.MongoDB.Tests.csproj @@ -19,8 +19,8 @@ - - + + diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo.Abp.IdentityServer.TestBase.csproj b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo.Abp.IdentityServer.TestBase.csproj index 69eb62fefc..98a98032ad 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo.Abp.IdentityServer.TestBase.csproj +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo.Abp.IdentityServer.TestBase.csproj @@ -19,12 +19,12 @@ - - - - - - + + + + + + diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs index 6f1e4c1a4e..45625a2852 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs @@ -65,14 +65,14 @@ namespace Volo.Abp.PermissionManagement.Blazor.Components } } - public async Task OpenAsync(string providerName, string providerKey) + public async Task OpenAsync(string providerName, string providerKey, string entityDisplayName = null) { _providerName = providerName; _providerKey = providerKey; var result = await PermissionAppService.GetAsync(_providerName, _providerKey); - _entityDisplayName = result.EntityDisplayName; + _entityDisplayName = entityDisplayName ?? result.EntityDisplayName; _groups = result.Groups; _grantedPermissionCount = 0; diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.csproj index 6689b76fb9..70c8b26f2d 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain.Shared/Volo.Abp.PermissionManagement.Domain.Shared.csproj @@ -25,7 +25,7 @@ - + diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.csproj b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.csproj index 588d1312bc..25309aca3d 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.csproj +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Volo.Abp.PermissionManagement.Web.csproj @@ -32,7 +32,7 @@ - + diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj index 3f93397029..0b96882a24 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj @@ -5,7 +5,7 @@ - + diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj index afd6ec8d93..e24e2cc4e4 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo.Abp.PermissionManagement.Domain.Tests.csproj @@ -17,8 +17,8 @@ - - + + diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests.csproj b/modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests.csproj index e09af1b9d2..8a5588b36c 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests.csproj +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests/Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests.csproj @@ -17,8 +17,8 @@ - - + + diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo.Abp.PermissionManagement.MongoDB.Tests.csproj b/modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo.Abp.PermissionManagement.MongoDB.Tests.csproj index 263b5f852d..f5e3d1b91a 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo.Abp.PermissionManagement.MongoDB.Tests.csproj +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.MongoDB.Tests/Volo.Abp.PermissionManagement.MongoDB.Tests.csproj @@ -17,8 +17,8 @@ - - + + diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo.Abp.PermissionManagement.TestBase.csproj b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo.Abp.PermissionManagement.TestBase.csproj index 08816667cf..a21e917ba0 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo.Abp.PermissionManagement.TestBase.csproj +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo.Abp.PermissionManagement.TestBase.csproj @@ -18,12 +18,12 @@ - - - - - - + + + + + + diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Menus/SettingManagementMenuContributor.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Menus/SettingManagementMenuContributor.cs index 214c0a7485..531613b77c 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Menus/SettingManagementMenuContributor.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Menus/SettingManagementMenuContributor.cs @@ -13,11 +13,11 @@ namespace Volo.Abp.SettingManagement.Blazor.Menus { if (context.Menu.Name == StandardMenus.Main) { - await ConfigureMainMenu(context); + await ConfigureMainMenuAsync(context); } } - private async Task ConfigureMainMenu(MenuConfigurationContext context) + private async Task ConfigureMainMenuAsync(MenuConfigurationContext context) { var settingManagementPageOptions = context.ServiceProvider.GetRequiredService>().Value; var settingPageCreationContext = new SettingComponentCreationContext(context.ServiceProvider); @@ -37,12 +37,12 @@ namespace Volo.Abp.SettingManagement.Blazor.Menus new ApplicationMenuItem( SettingManagementMenus.GroupName, l["Settings"], - "/setting-management", + "setting-management", icon: "fa fa-cog" ) ); } - + protected virtual async Task CheckAnyOfPagePermissionsGranted( SettingManagementComponentOptions settingManagementComponentOptions, SettingComponentCreationContext settingComponentCreationContext) diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.csproj index b3040f828c..e9c00a0afc 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain.Shared/Volo.Abp.SettingManagement.Domain.Shared.csproj @@ -21,7 +21,7 @@ - + diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj index 130539b07a..a96c43378a 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Web/Volo.Abp.SettingManagement.Web.csproj @@ -21,7 +21,7 @@ - + diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.csproj b/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.csproj index 1c855e63c8..7488775d40 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.csproj +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests/Volo.Abp.SettingManagement.EntityFrameworkCore.Tests.csproj @@ -18,7 +18,7 @@ - + diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo.Abp.SettingManagement.MongoDB.Tests.csproj b/modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo.Abp.SettingManagement.MongoDB.Tests.csproj index 398ff74afe..974e28c064 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo.Abp.SettingManagement.MongoDB.Tests.csproj +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.MongoDB.Tests/Volo.Abp.SettingManagement.MongoDB.Tests.csproj @@ -17,8 +17,8 @@ - - + + diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo.Abp.SettingManagement.TestBase.csproj b/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo.Abp.SettingManagement.TestBase.csproj index f05bd661be..88aa51afee 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo.Abp.SettingManagement.TestBase.csproj +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo.Abp.SettingManagement.TestBase.csproj @@ -18,12 +18,12 @@ - - - - - - + + + + + + diff --git a/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo.Abp.SettingManagement.Tests.csproj b/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo.Abp.SettingManagement.Tests.csproj index 4fd0be4d20..82c9643587 100644 --- a/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo.Abp.SettingManagement.Tests.csproj +++ b/modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo.Abp.SettingManagement.Tests.csproj @@ -17,7 +17,7 @@ - + diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Navigation/TenantManagementBlazorMenuContributor.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Navigation/TenantManagementBlazorMenuContributor.cs index c1d6e9ac7a..03bfd6b2d2 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Navigation/TenantManagementBlazorMenuContributor.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Navigation/TenantManagementBlazorMenuContributor.cs @@ -22,7 +22,7 @@ namespace Volo.Abp.TenantManagement.Blazor.Navigation if (await context.IsGrantedAsync(TenantManagementPermissions.Tenants.Default)) { - tenantManagementMenuItem.AddItem(new ApplicationMenuItem(TenantManagementMenuNames.Tenants, l["Tenants"], url: "/tenant-management/tenants")); + tenantManagementMenuItem.AddItem(new ApplicationMenuItem(TenantManagementMenuNames.Tenants, l["Tenants"], url: "tenant-management/tenants")); } } } diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor index 5f0067c6f5..2a5aabfe8d 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor @@ -6,57 +6,65 @@ @using Volo.Abp.TenantManagement.Localization @inject AbpBlazorMessageLocalizerHelper LH @inherits AbpCrudPageBase -@* ************************* PAGE HEADER ************************* *@ - - - @L["Tenants"] - - - @if (HasCreatePermission) - { - - } - - -@* ************************* DATA GRID ************************* *@ - - - - - - - - - - - - - - - @(context.Name) - - - - + + + @* ************************* PAGE HEADER ************************* *@ + + + @L["Tenants"] + + + @if (HasCreatePermission) + { + + } + + + + + @* ************************* DATA GRID ************************* *@ + + + + + + + + + + + + + + + @(context.Name) + + + + + + @* ************************* CREATE MODAL ************************* *@ @if (HasCreatePermission) @@ -64,18 +72,17 @@ -
+ @L["NewTenant"] - @L["TenantName"] - + @@ -106,7 +113,7 @@ - +
@@ -119,7 +126,7 @@ -
+ @L["Edit"] @@ -129,7 +136,7 @@ @L["TenantName"] - + @@ -140,7 +147,7 @@ - +
@@ -153,7 +160,7 @@ -
+ @L["ConnectionStrings"] @@ -179,7 +186,7 @@ - +
diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.csproj index 22b8a95bec..effe1e51f4 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain.Shared/Volo.Abp.TenantManagement.Domain.Shared.csproj @@ -25,7 +25,7 @@ - + diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs index e993ea2c63..e03a7ec2a2 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebModule.cs @@ -2,8 +2,10 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.PageToolbars; using Volo.Abp.AutoMapper; using Volo.Abp.FeatureManagement; +using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending.Modularity; @@ -61,6 +63,28 @@ namespace Volo.Abp.TenantManagement.Web options.Conventions.AuthorizePage("/TenantManagement/Tenants/EditModal", TenantManagementPermissions.Tenants.Update); options.Conventions.AuthorizePage("/TenantManagement/Tenants/ConnectionStrings", TenantManagementPermissions.Tenants.ManageConnectionStrings); }); + + Configure(options => + { + options.Configure( + toolbar => + { + toolbar.AddButton( + LocalizableString.Create("ManageHostFeatures"), + icon: "cog", + name: "ManageHostFeatures", + requiredPolicyName: FeatureManagementPermissions.ManageHostFeatures + ); + + toolbar.AddButton( + LocalizableString.Create("NewTenant"), + icon: "plus", + name: "CreateTenant", + requiredPolicyName: TenantManagementPermissions.Tenants.Create + ); + } + ); + }); } public override void PostConfigureServices(ServiceConfigurationContext context) diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.cshtml b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.cshtml index bb972b02d8..67fd507bcc 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.cshtml +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.cshtml @@ -2,6 +2,7 @@ @using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Abp.AspNetCore.Mvc.UI.Layout +@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageToolbar @using Volo.Abp.FeatureManagement @using Volo.Abp.TenantManagement @using Volo.Abp.TenantManagement.Localization @@ -30,14 +31,7 @@ @L["Tenants"] - @if (await Authorization.IsGrantedAsync(FeatureManagementPermissions.ManageHostFeatures)) - { - - } - @if (await Authorization.IsGrantedAsync(TenantManagementPermissions.Tenants.Create)) - { - - } + @await Component.InvokeAsync(typeof(AbpPageToolbarViewComponent), new { pageName = typeof(IndexModel).FullName }) diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj index bc88833315..9788622e86 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj @@ -35,7 +35,7 @@ - + diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo.Abp.TenantManagement.Application.Tests.csproj b/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo.Abp.TenantManagement.Application.Tests.csproj index c9cb0a7b7c..f5461040ff 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo.Abp.TenantManagement.Application.Tests.csproj +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.Application.Tests/Volo.Abp.TenantManagement.Application.Tests.csproj @@ -17,7 +17,7 @@ - + diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.Domain.Tests/Volo.Abp.TenantManagement.Domain.Tests.csproj b/modules/tenant-management/test/Volo.Abp.TenantManagement.Domain.Tests/Volo.Abp.TenantManagement.Domain.Tests.csproj index cbf366b4ca..23e7f3a551 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.Domain.Tests/Volo.Abp.TenantManagement.Domain.Tests.csproj +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.Domain.Tests/Volo.Abp.TenantManagement.Domain.Tests.csproj @@ -6,7 +6,7 @@ - + diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests.csproj b/modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests.csproj index 2bf8020eb9..94000cb0c5 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests.csproj +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests/Volo.Abp.TenantManagement.EntityFrameworkCore.Tests.csproj @@ -18,8 +18,8 @@ - - + + diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo.Abp.TenantManagement.MongoDB.Tests.csproj b/modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo.Abp.TenantManagement.MongoDB.Tests.csproj index 8efbf4df9a..16526810de 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo.Abp.TenantManagement.MongoDB.Tests.csproj +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.MongoDB.Tests/Volo.Abp.TenantManagement.MongoDB.Tests.csproj @@ -17,8 +17,8 @@ - - + + diff --git a/modules/tenant-management/test/Volo.Abp.TenantManagement.TestBase/Volo.Abp.TenantManagement.TestBase.csproj b/modules/tenant-management/test/Volo.Abp.TenantManagement.TestBase/Volo.Abp.TenantManagement.TestBase.csproj index d956ce2c05..638a45f4de 100644 --- a/modules/tenant-management/test/Volo.Abp.TenantManagement.TestBase/Volo.Abp.TenantManagement.TestBase.csproj +++ b/modules/tenant-management/test/Volo.Abp.TenantManagement.TestBase/Volo.Abp.TenantManagement.TestBase.csproj @@ -18,12 +18,12 @@ - - - - - - + + + + + + diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.csproj b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.csproj index 6cfb1efc40..b1c78debfd 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.csproj +++ b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Volo.Abp.VirtualFileExplorer.DemoApp.csproj @@ -6,7 +6,7 @@ - + diff --git a/npm/lerna.json b/npm/lerna.json index 21623a5bc3..72c9a18b3d 100644 --- a/npm/lerna.json +++ b/npm/lerna.json @@ -1,5 +1,5 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "packages": [ "packs/*" ], diff --git a/npm/ng-packs/apps/dev-app/src/app/home/home.component.html b/npm/ng-packs/apps/dev-app/src/app/home/home.component.html index ae3196c0c6..067a74c50f 100644 --- a/npm/ng-packs/apps/dev-app/src/app/home/home.component.html +++ b/npm/ng-packs/apps/dev-app/src/app/home/home.component.html @@ -1,14 +1,333 @@ -
-
-

{{ '::Welcome' | abpLocalization }}

-
-
-

{{ '::LongWelcomeMessage' | abpLocalization }}

-
-
-
-
abp.io - {{ 'AbpIdentity::Login' | abpLocalization }} +
+
+ +

{{ '::Welcome' | abpLocalization }}

+ +

{{ '::LongWelcomeMessage' | abpLocalization }}

+ + {{ 'AbpAccount::Login' | abpLocalization }} +
+
+

Let's improve your application!

+

Here are some links to help you get started:

+
+
+
+
+ + + + + +
+
+ + + +

+ + + + +

+
+ + + + +
+
+
+ +
+

Meet the ABP Commercial

+

A Complete Web Application Platform Built on the ABP Framework

+
+ +
+
+

+ ABP Commercial is a platform based + on the open source ABP framework. It provides pre-built application modules, rapid + application development tooling, professional UI themes, premium support and more. +

+ +
+ + + + + + + + + + + +
+
+
+
+ + +
+
+
+ {{ context.title }} +
+

+ + {{ link.label }} +
+
+
+ + +
+
+
+ + + Details +
+
+
+
+ + diff --git a/npm/ng-packs/lerna.version.json b/npm/ng-packs/lerna.version.json index 8d9b4e6053..48e91aa4eb 100644 --- a/npm/ng-packs/lerna.version.json +++ b/npm/ng-packs/lerna.version.json @@ -1,5 +1,5 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "packages": [ "packages/*" ], diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index f221ca5b3f..9265ef17c3 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -26,16 +26,16 @@ "postinstall": "npm run compile:ivy" }, "devDependencies": { - "@abp/ng.core": "~4.0.1", - "@abp/ng.feature-management": "~4.0.1", - "@abp/ng.identity": "~4.0.1", - "@abp/ng.permission-management": "~4.0.1", - "@abp/ng.schematics": "~4.0.1", - "@abp/ng.setting-management": "~4.0.1", - "@abp/ng.tenant-management": "~4.0.1", - "@abp/ng.theme.basic": "~4.0.1", - "@abp/ng.theme.shared": "~4.0.1", - "@abp/utils": "^4.0.1", + "@abp/ng.core": "~4.1.0-rc.2", + "@abp/ng.feature-management": "~4.1.0-rc.2", + "@abp/ng.identity": "~4.1.0-rc.2", + "@abp/ng.permission-management": "~4.1.0-rc.2", + "@abp/ng.schematics": "~4.1.0-rc.2", + "@abp/ng.setting-management": "~4.1.0-rc.2", + "@abp/ng.tenant-management": "~4.1.0-rc.2", + "@abp/ng.theme.basic": "~4.1.0-rc.2", + "@abp/ng.theme.shared": "~4.1.0-rc.2", + "@abp/utils": "^4.1.0-rc.2", "@angular-builders/jest": "^10.0.0", "@angular-devkit/build-angular": "~0.1100.0", "@angular-devkit/build-ng-packagr": "~0.1001.2", @@ -59,7 +59,6 @@ "@ngx-validate/core": "^0.0.13", "@ngxs/devtools-plugin": "^3.7.0", "@ngxs/logger-plugin": "^3.7.0", - "@ngxs/router-plugin": "^3.7.0", "@ngxs/store": "^3.7.0", "@schematics/angular": "~10.0.5", "@swimlane/ngx-datatable": "^18.0.0", diff --git a/npm/ng-packs/packages/components/package.json b/npm/ng-packs/packages/components/package.json index 6f8f7f9826..0d0f960738 100644 --- a/npm/ng-packs/packages/components/package.json +++ b/npm/ng-packs/packages/components/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.components", - "version": "4.0.1", + "version": "4.1.0-rc.2", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": ">=4.0.1", + "@abp/ng.core": ">=4.1.0-rc.2", "@ng-bootstrap/ng-bootstrap": ">=6.0.0" }, "dependencies": { diff --git a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html index b98aa7e4ff..4f4aaf472d 100644 --- a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html +++ b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.html @@ -7,10 +7,12 @@ [nzData]="nodes" [nzTreeTemplate]="treeTemplate" [nzExpandedKeys]="expandedKeys" - [nzExpandedIcon]="expandedIconTemplate?.template" + [nzExpandedIcon]="expandedIconTemplate?.template || defaultIconTemplate" (nzExpandChange)="onExpandedKeysChange($event)" (nzCheckBoxChange)="onCheckboxChange($event)" (nzOnDrop)="onDrop($event)" + [nzNoAnimation]="noAnimation" + (nzContextMenu)="dropdowns[$event.node?.key]?.toggle()" >
- + - - {{ node.title }} - + +
+ +
-
- -
- +
+ +
+ +
-
+ + + + {{ node.title }} +
+ + + + + + + + + + + + + + + + diff --git a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.scss b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.scss index 113996455f..07ca018f0d 100644 --- a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.scss +++ b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.scss @@ -27,18 +27,6 @@ cursor: pointer; padding-left: 8px; border: 1px solid transparent; - - &:hover { - background-color: transparent; - border: 1px solid var(--primary); - color: var(--text-color); - } - - &.selected { - background-color: transparent; - color: var(--white); - background-color: var(--primary); - } } .ellipsis { diff --git a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts index 7ba6280c0b..3f6179a5b2 100644 --- a/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts +++ b/npm/ng-packs/packages/components/tree/src/lib/components/tree.component.ts @@ -11,6 +11,7 @@ import { NzFormatEmitEvent, NzFormatBeforeDropEvent } from 'ng-zorro-antd/tree'; import { of } from 'rxjs'; import { TreeNodeTemplateDirective } from '../templates/tree-node-template.directive'; import { ExpandedIconTemplateDirective } from '../templates/expanded-icon-template.directive'; +import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap'; export type DropEvent = NzFormatEmitEvent & { pos: number }; @@ -26,6 +27,8 @@ export type DropEvent = NzFormatEmitEvent & { pos: number }; export class TreeComponent { dropPosition: number; + dropdowns = {} as { [key: string]: NgbDropdown }; + @ContentChild('menu') menu: TemplateRef; @ContentChild(TreeNodeTemplateDirective) customNodeTemplate: TreeNodeTemplateDirective; @ContentChild(ExpandedIconTemplateDirective) expandedIconTemplate: ExpandedIconTemplateDirective; @@ -33,6 +36,7 @@ export class TreeComponent { @Output() readonly expandedKeysChange = new EventEmitter(); @Output() readonly selectedNodeChange = new EventEmitter(); @Output() readonly dropOver = new EventEmitter(); + @Input() noAnimation = true; @Input() draggable: boolean; @Input() checkable: boolean; @Input() checkStrictly: boolean; @@ -68,4 +72,8 @@ export class TreeComponent { this.dropOver.emit(event); } + + initDropdown(key: string, dropdown: NgbDropdown) { + this.dropdowns[key] = dropdown; + } } diff --git a/npm/ng-packs/packages/components/tree/src/lib/tree.module.ts b/npm/ng-packs/packages/components/tree/src/lib/tree.module.ts index b645a69925..2013c37588 100644 --- a/npm/ng-packs/packages/components/tree/src/lib/tree.module.ts +++ b/npm/ng-packs/packages/components/tree/src/lib/tree.module.ts @@ -1,17 +1,18 @@ -import { CommonModule } from '@angular/common'; +import { CoreModule } from '@abp/ng.core'; import { NgModule } from '@angular/core'; import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; +import { NzNoAnimationModule } from 'ng-zorro-antd/core/no-animation'; import { NzTreeModule } from 'ng-zorro-antd/tree'; import { TreeComponent } from './components/tree.component'; -import { TreeNodeTemplateDirective } from './templates/tree-node-template.directive'; import { ExpandedIconTemplateDirective } from './templates/expanded-icon-template.directive'; +import { TreeNodeTemplateDirective } from './templates/tree-node-template.directive'; const templates = [TreeNodeTemplateDirective, ExpandedIconTemplateDirective]; const exported = [...templates, TreeComponent]; @NgModule({ - imports: [CommonModule, NzTreeModule, NgbDropdownModule], + imports: [CoreModule, NzTreeModule, NgbDropdownModule, NzNoAnimationModule], exports: [...exported], declarations: [...exported], }) diff --git a/npm/ng-packs/packages/core/ng-package.json b/npm/ng-packs/packages/core/ng-package.json index 7236b0ca66..e8328e938b 100644 --- a/npm/ng-packs/packages/core/ng-package.json +++ b/npm/ng-packs/packages/core/ng-package.json @@ -8,7 +8,6 @@ "whitelistedNonPeerDependencies": [ "@abp/utils", "@angular/localize", - "@ngxs/router-plugin", "@ngxs/store", "angular-oauth2-oidc", "just-compare", diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json index a39c540d57..9d659c5ea3 100644 --- a/npm/ng-packs/packages/core/package.json +++ b/npm/ng-packs/packages/core/package.json @@ -1,15 +1,14 @@ { "name": "@abp/ng.core", - "version": "4.0.1", + "version": "4.1.0-rc.2", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/utils": "^4.0.1", + "@abp/utils": "^4.1.0-rc.2", "@angular/localize": "~10.0.10", - "@ngxs/router-plugin": "^3.7.0", "@ngxs/store": "^3.7.0", "angular-oauth2-oidc": "^10.0.0", "just-clone": "^3.1.0", diff --git a/npm/ng-packs/packages/core/src/lib/core.module.ts b/npm/ng-packs/packages/core/src/lib/core.module.ts index 4f24ce5ad2..a661012ac7 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -1,9 +1,8 @@ -import { APP_BASE_HREF, CommonModule } from '@angular/common'; +import { CommonModule } from '@angular/common'; import { HttpClientModule, HttpClientXsrfModule, HTTP_INTERCEPTORS } from '@angular/common/http'; import { APP_INITIALIZER, Injector, ModuleWithProviders, NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; -import { NgxsRouterPluginModule } from '@ngxs/router-plugin'; import { NgxsModule } from '@ngxs/store'; import { OAuthModule, OAuthStorage } from 'angular-oauth2-oidc'; import { AbstractNgModelComponent } from './abstracts/ng-model.component'; @@ -25,7 +24,7 @@ import { RoutesHandler } from './handlers/routes.handler'; import { ApiInterceptor } from './interceptors/api.interceptor'; import { LocalizationModule } from './localization.module'; import { ABP } from './models/common'; -import { LocalizationPipe, MockLocalizationPipe } from './pipes/localization.pipe'; +import { LocalizationPipe } from './pipes/localization.pipe'; import { SortPipe } from './pipes/sort.pipe'; import { LocaleProvider } from './providers/locale.provider'; import { LocalizationService } from './services/localization.service'; @@ -113,7 +112,6 @@ export class BaseCoreModule {} BaseCoreModule, LocalizationModule, NgxsModule.forFeature([ProfileState]), - NgxsRouterPluginModule.forRoot(), OAuthModule.forRoot(), HttpClientXsrfModule.withOptions({ cookieName: 'XSRF-TOKEN', @@ -123,17 +121,6 @@ export class BaseCoreModule {} }) export class RootCoreModule {} -/** - * TestCoreModule is the module that will be used in tests - * and it provides mock alternatives - */ -@NgModule({ - exports: [RouterModule, BaseCoreModule, MockLocalizationPipe], - imports: [RouterModule.forRoot([], { relativeLinkResolution: 'legacy' }), BaseCoreModule], - declarations: [MockLocalizationPipe], -}) -export class TestCoreModule {} - /** * CoreModule is the module that is publicly available */ @@ -143,19 +130,6 @@ export class TestCoreModule {} providers: [LocalizationPipe], }) export class CoreModule { - static forTest({ baseHref = '/' } = {} as ABP.Test): ModuleWithProviders { - return { - ngModule: TestCoreModule, - providers: [ - { provide: APP_BASE_HREF, useValue: baseHref }, - { - provide: LocalizationPipe, - useClass: MockLocalizationPipe, - }, - ], - }; - } - static forRoot(options = {} as ABP.Root): ModuleWithProviders { return { ngModule: RootCoreModule, diff --git a/npm/ng-packs/packages/core/src/lib/models/common.ts b/npm/ng-packs/packages/core/src/lib/models/common.ts index 652cc07ea3..88bd75c027 100644 --- a/npm/ng-packs/packages/core/src/lib/models/common.ts +++ b/npm/ng-packs/packages/core/src/lib/models/common.ts @@ -1,5 +1,5 @@ import { EventEmitter, Type } from '@angular/core'; -import { Router } from '@angular/router'; +import { Router, Routes } from '@angular/router'; import { Subject } from 'rxjs'; import { eLayoutType } from '../enums/common'; import { Environment } from './environment'; @@ -12,8 +12,9 @@ export namespace ABP { sendNullsAsQueryParam?: boolean; } - export interface Test { + export interface Test extends Partial { baseHref?: Router; + routes?: Routes; } export type PagedResponse = { diff --git a/npm/ng-packs/packages/core/src/lib/models/dtos.ts b/npm/ng-packs/packages/core/src/lib/models/dtos.ts index bd35d90338..49c1d8e735 100644 --- a/npm/ng-packs/packages/core/src/lib/models/dtos.ts +++ b/npm/ng-packs/packages/core/src/lib/models/dtos.ts @@ -25,7 +25,7 @@ export class LimitedResultRequestDto { constructor(initialValues: Partial = {}) { for (const key in initialValues) { - if (initialValues.hasOwnProperty(key)) { + if (initialValues.hasOwnProperty(key) && initialValues[key] !== undefined) { this[key] = initialValues[key]; } } diff --git a/npm/ng-packs/packages/core/src/lib/pipes/localization.pipe.ts b/npm/ng-packs/packages/core/src/lib/pipes/localization.pipe.ts index cc84cfebdd..cf076d414c 100644 --- a/npm/ng-packs/packages/core/src/lib/pipes/localization.pipe.ts +++ b/npm/ng-packs/packages/core/src/lib/pipes/localization.pipe.ts @@ -22,13 +22,3 @@ export class LocalizationPipe implements PipeTransform { ); } } - -@Injectable() -@Pipe({ - name: 'abpLocalization', -}) -export class MockLocalizationPipe implements PipeTransform { - transform(value: string | Config.LocalizationWithDefault = '', ..._: string[]) { - return typeof value === 'string' ? value : value.defaultValue; - } -} diff --git a/npm/ng-packs/packages/core/src/lib/tests/internal-store.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/internal-store.spec.ts index e0eed44eb6..c0728db069 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/internal-store.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/internal-store.spec.ts @@ -17,25 +17,49 @@ const mockInitialState = { type MockState = typeof mockInitialState; -const patch1: DeepPartial = { foo: { bar: { baz: [() => {}] } } }; -const expected1: MockState = clone(mockInitialState); -expected1.foo.bar.baz = patch1.foo.bar.baz; +const deepPatch1: DeepPartial = { foo: { bar: { baz: [() => {}] } } }; +const deepPatchExpected1: MockState = clone(mockInitialState); +deepPatchExpected1.foo.bar.baz = deepPatch1.foo.bar.baz; -const patch2: DeepPartial = { foo: { bar: { qux: Promise.resolve() } } }; -const expected2: MockState = clone(mockInitialState); -expected2.foo.bar.qux = patch2.foo.bar.qux; +const deepPatch2: DeepPartial = { foo: { bar: { qux: Promise.resolve() } } }; +const deepPatchExpected2: MockState = clone(mockInitialState); +deepPatchExpected2.foo.bar.qux = deepPatch2.foo.bar.qux; -const patch3: DeepPartial = { foo: { n: 1 } }; -const expected3: MockState = clone(mockInitialState); -expected3.foo.n = patch3.foo.n; +const deepPatch3: DeepPartial = { foo: { n: 1 } }; +const deepPatchExpected3: MockState = clone(mockInitialState); +deepPatchExpected3.foo.n = deepPatch3.foo.n; -const patch4: DeepPartial = { x: 'X' }; -const expected4: MockState = clone(mockInitialState); -expected4.x = patch4.x; +const deepPatch4: DeepPartial = { x: 'X' }; +const deepPatchExpected4: MockState = clone(mockInitialState); +deepPatchExpected4.x = deepPatch4.x; -const patch5: DeepPartial = { a: true }; -const expected5: MockState = clone(mockInitialState); -expected5.a = patch5.a; +const deepPatch5: DeepPartial = { a: true }; +const deepPatchExpected5: MockState = clone(mockInitialState); +deepPatchExpected5.a = deepPatch5.a; + +const patch1: Partial = { + foo: { bar: { baz: [() => {}] } } as typeof mockInitialState.foo, +}; +const patchExpected1: MockState = clone(mockInitialState); +patchExpected1.foo = patch1.foo; + +const patch2: Partial = { + foo: { bar: { qux: Promise.resolve() } } as typeof mockInitialState.foo, +}; +const patchExpected2: MockState = clone(mockInitialState); +patchExpected2.foo = patch2.foo; + +const patch3: Partial = { foo: { n: 1 } as typeof mockInitialState.foo }; +const patchExpected3: MockState = clone(mockInitialState); +patchExpected3.foo = patch3.foo; + +const patch4: Partial = { x: 'X' }; +const patchExpected4: MockState = clone(mockInitialState); +patchExpected4.x = patch4.x; + +const patch5: Partial = { a: true }; +const patchExpected5: MockState = clone(mockInitialState); +patchExpected5.a = patch5.a; describe('Internal Store', () => { describe('sliceState', () => { @@ -52,24 +76,38 @@ describe('Internal Store', () => { async ({ selector, expected }) => { const store = new InternalStore(mockInitialState); - const value = await store - .sliceState(selector) - .pipe(take(1)) - .toPromise(); + const value = await store.sliceState(selector).pipe(take(1)).toPromise(); expect(value).toEqual(expected); }, ); }); + describe('deepPatchState', () => { + test.each` + patch | expected + ${deepPatch1} | ${deepPatchExpected1} + ${deepPatch2} | ${deepPatchExpected2} + ${deepPatch3} | ${deepPatchExpected3} + ${deepPatch4} | ${deepPatchExpected4} + ${deepPatch5} | ${deepPatchExpected5} + `('should set state as $expected when patch is $patch', ({ patch, expected }) => { + const store = new InternalStore(mockInitialState); + + store.deepPatch(patch); + + expect(store.state).toEqual(expected); + }); + }); + describe('patchState', () => { test.each` patch | expected - ${patch1} | ${expected1} - ${patch2} | ${expected2} - ${patch3} | ${expected3} - ${patch4} | ${expected4} - ${patch5} | ${expected5} + ${patch1} | ${patchExpected1} + ${patch2} | ${patchExpected2} + ${patch3} | ${patchExpected3} + ${patch4} | ${patchExpected4} + ${patch5} | ${patchExpected5} `('should set state as $expected when patch is $patch', ({ patch, expected }) => { const store = new InternalStore(mockInitialState); @@ -86,12 +124,12 @@ describe('Internal Store', () => { const onQux$ = store.sliceUpdate(state => state.foo.bar.qux); onQux$.pipe(take(1)).subscribe(value => { - expect(value).toEqual(patch2.foo.bar.qux); + expect(value).toEqual(deepPatch2.foo.bar.qux); done(); }); - store.patch(patch1); - store.patch(patch2); + store.deepPatch(deepPatch1); + store.deepPatch(deepPatch2); }); }); @@ -99,7 +137,7 @@ describe('Internal Store', () => { it('should reset state to initialState', () => { const store = new InternalStore(mockInitialState); - store.patch(patch1); + store.deepPatch(deepPatch1); store.reset(); expect(store.state).toEqual(mockInitialState); diff --git a/npm/ng-packs/packages/core/src/lib/utils/internal-store-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/internal-store-utils.ts index 87bc3f81fd..ea4af9ddfb 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/internal-store-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/internal-store-utils.ts @@ -25,7 +25,18 @@ export class InternalStore { constructor(private initialState: State) {} - patch(state: DeepPartial) { + patch(state: Partial) { + let patchedState = state as State; + + if (typeof state === 'object' && !Array.isArray(state)) { + patchedState = { ...this.state, ...state }; + } + + this.state$.next(patchedState); + this.update$.next(patchedState); + } + + deepPatch(state: DeepPartial) { this.state$.next(deepMerge(this.state, state)); this.update$.next(state); } diff --git a/npm/ng-packs/packages/core/src/lib/utils/localization-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/localization-utils.ts index e9014a52db..0e22713449 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/localization-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/localization-utils.ts @@ -1,3 +1,4 @@ +import snq from 'snq'; import { ApplicationLocalizationConfigurationDto } from '../proxy/volo/abp/asp-net-core/mvc/application-configurations/models'; // This will not be necessary when only Angukar 9.1+ is supported @@ -13,7 +14,7 @@ export function createLocalizer(localization: ApplicationLocalizationConfigurati return (resourceName: string, key: string, defaultValue: string) => { if (resourceName === '_') return key; - const resource = localization.values[resourceName]; + const resource = snq(() => localization.values[resourceName]); if (!resource) return defaultValue; diff --git a/npm/ng-packs/packages/core/src/lib/utils/string-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/string-utils.ts index 7404dceab7..b6c4cce653 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/string-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/string-utils.ts @@ -1,12 +1,12 @@ export function createTokenParser(format: string) { - return (string: string) => { + return (str: string) => { const tokens: string[] = []; const regex = format.replace(/\./g, '\\.').replace(/\{\s?([0-9a-zA-Z]+)\s?\}/g, (_, token) => { tokens.push(token); return '(.+)'; }); - const matches = (string.match(regex) || []).slice(1); + const matches = (str.match(regex) || []).slice(1); return matches.reduce((acc, v, i) => { const key = tokens[i]; diff --git a/npm/ng-packs/packages/core/testing/ng-package.json b/npm/ng-packs/packages/core/testing/ng-package.json new file mode 100644 index 0000000000..e647bd0d3e --- /dev/null +++ b/npm/ng-packs/packages/core/testing/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/core/testing", + "lib": { + "entryFile": "src/public-api.ts" + } +} diff --git a/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts b/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts new file mode 100644 index 0000000000..5a43aa9a4c --- /dev/null +++ b/npm/ng-packs/packages/core/testing/src/lib/core-testing.module.ts @@ -0,0 +1,48 @@ +import { + ABP, + BaseCoreModule, + coreOptionsFactory, + CORE_OPTIONS, + LocalizationPipe, +} from '@abp/ng.core'; +import { APP_BASE_HREF } from '@angular/common'; +import { ModuleWithProviders, NgModule } from '@angular/core'; +import { provideRoutes } from '@angular/router'; +import { RouterTestingModule } from '@angular/router/testing'; +import { MockLocalizationPipe } from './pipes/mock-localization.pipe'; + +/** + * CoreTestingModule is the module that will be used in tests + * and it provides mock alternatives + */ +@NgModule({ + exports: [RouterTestingModule, BaseCoreModule, MockLocalizationPipe], + imports: [RouterTestingModule, BaseCoreModule], + declarations: [MockLocalizationPipe], +}) +export class CoreTestingModule { + static forTest( + { baseHref = '/', routes = [], ...options } = {} as ABP.Test, + ): ModuleWithProviders { + return { + ngModule: CoreTestingModule, + providers: [ + { provide: APP_BASE_HREF, useValue: baseHref }, + { + provide: 'CORE_OPTIONS', + useValue: options, + }, + { + provide: CORE_OPTIONS, + useFactory: coreOptionsFactory, + deps: ['CORE_OPTIONS'], + }, + { + provide: LocalizationPipe, + useClass: MockLocalizationPipe, + }, + provideRoutes(routes), + ], + }; + } +} diff --git a/npm/ng-packs/packages/core/testing/src/lib/pipes/index.ts b/npm/ng-packs/packages/core/testing/src/lib/pipes/index.ts new file mode 100644 index 0000000000..60bb9b7dce --- /dev/null +++ b/npm/ng-packs/packages/core/testing/src/lib/pipes/index.ts @@ -0,0 +1 @@ +export * from './mock-localization.pipe'; diff --git a/npm/ng-packs/packages/core/testing/src/lib/pipes/mock-localization.pipe.ts b/npm/ng-packs/packages/core/testing/src/lib/pipes/mock-localization.pipe.ts new file mode 100644 index 0000000000..302173cb0f --- /dev/null +++ b/npm/ng-packs/packages/core/testing/src/lib/pipes/mock-localization.pipe.ts @@ -0,0 +1,12 @@ +import { Config } from '@abp/ng.core'; +import { Injectable, Pipe, PipeTransform } from '@angular/core'; + +@Injectable() +@Pipe({ + name: 'abpLocalization', +}) +export class MockLocalizationPipe implements PipeTransform { + transform(value: string | Config.LocalizationWithDefault = '', ..._: string[]) { + return typeof value === 'string' ? value : value.defaultValue; + } +} diff --git a/npm/ng-packs/packages/core/testing/src/public-api.ts b/npm/ng-packs/packages/core/testing/src/public-api.ts new file mode 100644 index 0000000000..8028a99aac --- /dev/null +++ b/npm/ng-packs/packages/core/testing/src/public-api.ts @@ -0,0 +1,2 @@ +export * from './lib/core-testing.module'; +export * from './lib/pipes'; diff --git a/npm/ng-packs/packages/feature-management/package.json b/npm/ng-packs/packages/feature-management/package.json index d0142b227b..fbb4c5117e 100644 --- a/npm/ng-packs/packages/feature-management/package.json +++ b/npm/ng-packs/packages/feature-management/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.feature-management", - "version": "4.0.1", + "version": "4.1.0-rc.2", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~4.0.1", + "@abp/ng.theme.shared": "~4.1.0-rc.2", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/identity/package.json b/npm/ng-packs/packages/identity/package.json index 165aaa4833..83da999fbc 100644 --- a/npm/ng-packs/packages/identity/package.json +++ b/npm/ng-packs/packages/identity/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.identity", - "version": "4.0.1", + "version": "4.1.0-rc.2", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.permission-management": "~4.0.1", - "@abp/ng.theme.shared": "~4.0.1", + "@abp/ng.permission-management": "~4.1.0-rc.2", + "@abp/ng.theme.shared": "~4.1.0-rc.2", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/identity/src/lib/actions/index.ts b/npm/ng-packs/packages/identity/src/lib/actions/index.ts new file mode 100644 index 0000000000..f2c40cc4c1 --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/actions/index.ts @@ -0,0 +1 @@ +export * from './identity.actions'; diff --git a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html index 1a49d9cbd6..fd8925df56 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html +++ b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.html @@ -5,77 +5,17 @@
{{ 'AbpIdentity::Roles' | abpLocalization }}
- +
- - - -
- -
- - - - - -
-
-
-
- - - {{ row.name }} - {{ - 'AbpIdentity::DisplayName:IsDefault' | abpLocalization - }} - {{ - 'AbpIdentity::DisplayName:IsPublic' | abpLocalization - }} - - -
+
@@ -85,36 +25,8 @@ -
-
- * - -
- -
- - -
- -
- - -
+ +
@@ -122,7 +34,7 @@ - {{ + {{ 'AbpIdentity::Save' | abpLocalization }} diff --git a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts index 8df9762b97..c1410ff148 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts +++ b/npm/ng-packs/packages/identity/src/lib/components/roles/roles.component.ts @@ -1,8 +1,13 @@ import { ListService, PagedAndSortedResultRequestDto } from '@abp/ng.core'; import { ePermissionManagementComponents } from '@abp/ng.permission-management'; import { Confirmation, ConfirmationService } from '@abp/ng.theme.shared'; -import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { + EXTENSIONS_IDENTIFIER, + FormPropData, + generateFormFromProps, +} from '@abp/ng.theme.shared/extensions'; +import { Component, ElementRef, Injector, OnInit, ViewChild } from '@angular/core'; +import { FormGroup } from '@angular/forms'; import { Select, Store } from '@ngxs/store'; import { Observable } from 'rxjs'; import { finalize, pluck } from 'rxjs/operators'; @@ -13,13 +18,20 @@ import { GetRoles, UpdateRole, } from '../../actions/identity.actions'; +import { eIdentityComponents } from '../../enums/components'; import { IdentityRoleDto } from '../../proxy/identity/models'; import { IdentityState } from '../../states/identity.state'; @Component({ selector: 'abp-roles', templateUrl: './roles.component.html', - providers: [ListService], + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eIdentityComponents.Roles, + }, + ], }) export class RolesComponent implements OnInit { @Select(IdentityState.getRoles) @@ -51,9 +63,9 @@ export class RolesComponent implements OnInit { constructor( public readonly list: ListService, - private confirmationService: ConfirmationService, - private fb: FormBuilder, - private store: Store, + protected confirmationService: ConfirmationService, + protected store: Store, + protected injector: Injector, ) {} ngOnInit() { @@ -61,14 +73,8 @@ export class RolesComponent implements OnInit { } buildForm() { - this.form = this.fb.group({ - name: new FormControl({ value: this.selected.name || '', disabled: this.selected.isStatic }, [ - Validators.required, - Validators.maxLength(256), - ]), - isDefault: [this.selected.isDefault || false], - isPublic: [this.selected.isPublic || false], - }); + const data = new FormPropData(this.injector, this.selected); + this.form = generateFormFromProps(data); } openModal() { diff --git a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html index 05dae5f0d9..9963224c2d 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html +++ b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.html @@ -5,16 +5,7 @@
{{ 'AbpIdentity::Users' | abpLocalization }}
- +
@@ -30,170 +21,22 @@ - - - -
- -
- - - -
-
-
-
- - - -
+ - +

{{ (selected?.id ? 'AbpIdentity::Edit' : 'AbpIdentity::NewUser') | abpLocalization }}

-
- -
- - -
+ +
@@ -201,7 +44,7 @@ - {{ + {{ 'AbpIdentity::Save' | abpLocalization }} diff --git a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts index 3588ad02b0..da533ba62a 100644 --- a/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts +++ b/npm/ng-packs/packages/identity/src/lib/components/users/users.component.ts @@ -1,6 +1,11 @@ import { ListService } from '@abp/ng.core'; import { ePermissionManagementComponents } from '@abp/ng.permission-management'; -import { Confirmation, ConfirmationService, getPasswordValidators } from '@abp/ng.theme.shared'; +import { Confirmation, ConfirmationService } from '@abp/ng.theme.shared'; +import { + EXTENSIONS_IDENTIFIER, + FormPropData, + generateFormFromProps, +} from '@abp/ng.theme.shared/extensions'; import { Component, Injector, @@ -9,14 +14,7 @@ import { TrackByFunction, ViewChild, } from '@angular/core'; -import { - AbstractControl, - FormArray, - FormBuilder, - FormControl, - FormGroup, - Validators, -} from '@angular/forms'; +import { AbstractControl, FormArray, FormBuilder, FormGroup } from '@angular/forms'; import { Select, Store } from '@ngxs/store'; import { Observable } from 'rxjs'; import { finalize, pluck, switchMap, take } from 'rxjs/operators'; @@ -29,6 +27,7 @@ import { GetUsers, UpdateUser, } from '../../actions/identity.actions'; +import { eIdentityComponents } from '../../enums/components'; import { Identity } from '../../models/identity'; import { IdentityUserService } from '../../proxy/identity/identity-user.service'; import { @@ -41,7 +40,13 @@ import { IdentityState } from '../../states/identity.state'; @Component({ selector: 'abp-users', templateUrl: './users.component.html', - providers: [ListService], + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eIdentityComponents.Users, + }, + ], }) export class UsersComponent implements OnInit { @Select(IdentityState.getUsers) @@ -83,11 +88,11 @@ export class UsersComponent implements OnInit { constructor( public readonly list: ListService, - private injector: Injector, - private confirmationService: ConfirmationService, - private fb: FormBuilder, - private store: Store, - private identityUserService: IdentityUserService, + protected confirmationService: ConfirmationService, + protected userService: IdentityUserService, + protected fb: FormBuilder, + protected store: Store, + protected injector: Injector, ) {} ngOnInit() { @@ -95,19 +100,14 @@ export class UsersComponent implements OnInit { } buildForm() { - this.identityUserService.getAssignableRoles().subscribe(({ items }) => { + const data = new FormPropData(this.injector, this.selected); + this.form = generateFormFromProps(data); + + this.userService.getAssignableRoles().subscribe(({ items }) => { this.roles = items; - this.form = this.fb.group({ - userName: [this.selected.userName || '', [Validators.required, Validators.maxLength(256)]], - email: [ - this.selected.email || '', - [Validators.required, Validators.email, Validators.maxLength(256)], - ], - name: [this.selected.name || '', [Validators.maxLength(64)]], - surname: [this.selected.surname || '', [Validators.maxLength(64)]], - phoneNumber: [this.selected.phoneNumber || '', [Validators.maxLength(16)]], - lockoutEnabled: [this.selected.id ? this.selected.lockoutEnabled : true], - roleNames: this.fb.array( + this.form.addControl( + 'roleNames', + this.fb.array( this.roles.map(role => this.fb.group({ [role.name]: [ @@ -118,16 +118,7 @@ export class UsersComponent implements OnInit { }), ), ), - }); - - const passwordValidators = getPasswordValidators(this.injector); - - this.form.addControl('password', new FormControl('', [...passwordValidators])); - - if (!this.selected.userName) { - this.form.get('password').setValidators([...passwordValidators, Validators.required]); - this.form.get('password').updateValueAndValidity(); - } + ); }); } diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-actions.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-actions.ts new file mode 100644 index 0000000000..2a2822c62e --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-actions.ts @@ -0,0 +1,31 @@ +import { EntityAction } from '@abp/ng.theme.shared/extensions'; +import { RolesComponent } from '../components/roles/roles.component'; +import { IdentityRoleDto } from '../proxy/identity/models'; + +export const DEFAULT_ROLES_ENTITY_ACTIONS = EntityAction.createMany([ + { + text: 'AbpIdentity::Edit', + action: data => { + const component = data.getInjected(RolesComponent); + component.edit(data.record.id); + }, + permission: 'AbpIdentity.Roles.Update', + }, + { + text: 'AbpIdentity::Permissions', + action: data => { + const component = data.getInjected(RolesComponent); + component.openPermissionsModal(data.record.name); + }, + permission: 'AbpIdentity.Roles.ManagePermissions', + }, + { + text: 'AbpIdentity::Delete', + action: data => { + const component = data.getInjected(RolesComponent); + component.delete(data.record.id, data.record.name); + }, + permission: 'AbpIdentity.Roles.Delete', + visible: data => !data.record.isStatic, + }, +]); diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-props.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-props.ts new file mode 100644 index 0000000000..bd3a49def2 --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-entity-props.ts @@ -0,0 +1,32 @@ +import { LocalizationService } from '@abp/ng.core'; +import { EntityProp, ePropType } from '@abp/ng.theme.shared/extensions'; +import { of } from 'rxjs'; +import { IdentityRoleDto } from '../proxy/identity/models'; + +export const DEFAULT_ROLES_ENTITY_PROPS = EntityProp.createMany([ + { + type: ePropType.String, + name: 'name', + displayName: 'AbpIdentity::RoleName', + sortable: true, + valueResolver: data => { + const l10n = data.getInjected(LocalizationService); + const t = l10n.instant.bind(l10n); + const { isDefault, isPublic, name } = data.record; + + return of( + name + + (isDefault + ? `${t( + 'AbpIdentity::DisplayName:IsDefault', + )}` + : '') + + (isPublic + ? `${t( + 'AbpIdentity::DisplayName:IsPublic', + )}` + : ''), + ); + }, + }, +]); diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-form-props.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-form-props.ts new file mode 100644 index 0000000000..a9cf966257 --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-form-props.ts @@ -0,0 +1,30 @@ +import { ePropType, FormProp, PropData } from '@abp/ng.theme.shared/extensions'; +import { Validators } from '@angular/forms'; +import { IdentityRoleDto } from '../proxy/identity/models'; + +export const DEFAULT_ROLES_CREATE_FORM_PROPS = FormProp.createMany([ + { + type: ePropType.String, + name: 'name', + displayName: 'AbpIdentity::RoleName', + id: 'role-name', + disabled: (data: PropData) => data.record && data.record.isStatic, + validators: () => [Validators.required], + }, + { + type: ePropType.Boolean, + name: 'isDefault', + displayName: 'AbpIdentity::DisplayName:IsDefault', + id: 'role-is-default', + defaultValue: false, + }, + { + type: ePropType.Boolean, + name: 'isPublic', + displayName: 'AbpIdentity::DisplayName:IsPublic', + id: 'role-is-public', + defaultValue: false, + }, +]); + +export const DEFAULT_ROLES_EDIT_FORM_PROPS = DEFAULT_ROLES_CREATE_FORM_PROPS; diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-toolbar-actions.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-toolbar-actions.ts new file mode 100644 index 0000000000..271aced701 --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-roles-toolbar-actions.ts @@ -0,0 +1,15 @@ +import { ToolbarAction } from '@abp/ng.theme.shared/extensions'; +import { RolesComponent } from '../components/roles/roles.component'; +import { IdentityRoleDto } from '../proxy/identity/models'; + +export const DEFAULT_ROLES_TOOLBAR_ACTIONS = ToolbarAction.createMany([ + { + text: 'AbpIdentity::NewRole', + action: data => { + const component = data.getInjected(RolesComponent); + component.add(); + }, + permission: 'AbpIdentity.Roles.Create', + icon: 'fa fa-plus', + }, +]); diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-actions.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-actions.ts new file mode 100644 index 0000000000..f8be7740ff --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-actions.ts @@ -0,0 +1,30 @@ +import { EntityAction } from '@abp/ng.theme.shared/extensions'; +import { UsersComponent } from '../components/users/users.component'; +import { IdentityUserDto } from '../proxy/identity/models'; + +export const DEFAULT_USERS_ENTITY_ACTIONS = EntityAction.createMany([ + { + text: 'AbpIdentity::Edit', + action: data => { + const component = data.getInjected(UsersComponent); + component.edit(data.record.id); + }, + permission: 'AbpIdentity.Users.Update', + }, + { + text: 'AbpIdentity::Permissions', + action: data => { + const component = data.getInjected(UsersComponent); + component.openPermissionsModal(data.record.id); + }, + permission: 'AbpIdentity.Users.ManagePermissions', + }, + { + text: 'AbpIdentity::Delete', + action: data => { + const component = data.getInjected(UsersComponent); + component.delete(data.record.id, data.record.name || data.record.userName); + }, + permission: 'AbpIdentity.Users.Delete', + }, +]); diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-props.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-props.ts new file mode 100644 index 0000000000..f9d7c217be --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-entity-props.ts @@ -0,0 +1,26 @@ +import { EntityProp, ePropType } from '@abp/ng.theme.shared/extensions'; +import { IdentityUserDto } from '../proxy/identity/models'; + +export const DEFAULT_USERS_ENTITY_PROPS = EntityProp.createMany([ + { + type: ePropType.String, + name: 'userName', + displayName: 'AbpIdentity::UserName', + sortable: true, + columnWidth: 250, + }, + { + type: ePropType.String, + name: 'email', + displayName: 'AbpIdentity::EmailAddress', + sortable: true, + columnWidth: 250, + }, + { + type: ePropType.String, + name: 'phoneNumber', + displayName: 'AbpIdentity::PhoneNumber', + sortable: true, + columnWidth: 250, + }, +]); diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-form-props.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-form-props.ts new file mode 100644 index 0000000000..3092bdf7e8 --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-form-props.ts @@ -0,0 +1,61 @@ +import { getPasswordValidators } from '@abp/ng.theme.shared'; +import { ePropType, FormProp } from '@abp/ng.theme.shared/extensions'; +import { Validators } from '@angular/forms'; +import { IdentityUserDto } from '../proxy/identity/models'; + +export const DEFAULT_USERS_CREATE_FORM_PROPS = FormProp.createMany([ + { + type: ePropType.String, + name: 'userName', + displayName: 'AbpIdentity::UserName', + id: 'user-name', + validators: () => [Validators.required, Validators.maxLength(256)], + }, + { + type: ePropType.Password, + name: 'password', + displayName: 'AbpIdentity::Password', + id: 'password', + autocomplete: 'new-password', + validators: data => [Validators.required, ...getPasswordValidators({ get: data.getInjected })], + }, + { + type: ePropType.String, + name: 'name', + displayName: 'AbpIdentity::DisplayName:Name', + id: 'name', + validators: () => [Validators.maxLength(64)], + }, + { + type: ePropType.String, + name: 'surname', + displayName: 'AbpIdentity::DisplayName:Surname', + id: 'surname', + validators: () => [Validators.maxLength(64)], + }, + { + type: ePropType.Email, + name: 'email', + displayName: 'AbpIdentity::EmailAddress', + id: 'email', + validators: () => [Validators.required, Validators.maxLength(256), Validators.email], + }, + { + type: ePropType.String, + name: 'phoneNumber', + displayName: 'AbpIdentity::PhoneNumber', + id: 'phone-number', + validators: () => [Validators.maxLength(16)], + }, + { + type: ePropType.Boolean, + name: 'lockoutEnabled', + displayName: 'AbpIdentity::DisplayName:LockoutEnabled', + id: 'lockout-checkbox', + defaultValue: true, + }, +]); + +export const DEFAULT_USERS_EDIT_FORM_PROPS = DEFAULT_USERS_CREATE_FORM_PROPS.filter( + prop => prop.name !== 'password', +); diff --git a/npm/ng-packs/packages/identity/src/lib/defaults/default-users-toolbar-actions.ts b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-toolbar-actions.ts new file mode 100644 index 0000000000..b1e62a9e18 --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/defaults/default-users-toolbar-actions.ts @@ -0,0 +1,15 @@ +import { ToolbarAction } from '@abp/ng.theme.shared/extensions'; +import { UsersComponent } from '../components/users/users.component'; +import { IdentityUserDto } from '../proxy/identity/models'; + +export const DEFAULT_USERS_TOOLBAR_ACTIONS = ToolbarAction.createMany([ + { + text: 'AbpIdentity::NewUser', + action: data => { + const component = data.getInjected(UsersComponent); + component.add(); + }, + permission: 'AbpIdentity.Users.Create', + icon: 'fa fa-plus', + }, +]); diff --git a/npm/ng-packs/packages/identity/src/lib/guards/extensions.guard.ts b/npm/ng-packs/packages/identity/src/lib/guards/extensions.guard.ts new file mode 100644 index 0000000000..3b5d592acc --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/guards/extensions.guard.ts @@ -0,0 +1,91 @@ +import { ConfigStateService } from '@abp/ng.core'; +import { + ExtensionsService, + getObjectExtensionEntitiesFromStore, + mapEntitiesToContributors, + mergeWithDefaultActions, + mergeWithDefaultProps, +} from '@abp/ng.theme.shared/extensions'; +import { Injectable, Injector } from '@angular/core'; +import { CanActivate } from '@angular/router'; +import { Observable } from 'rxjs'; +import { map, mapTo, tap } from 'rxjs/operators'; +import { eIdentityComponents } from '../enums/components'; +import { + IdentityCreateFormPropContributors, + IdentityEditFormPropContributors, + IdentityEntityActionContributors, + IdentityEntityPropContributors, + IdentityToolbarActionContributors, +} from '../models/config-options'; +import { + DEFAULT_IDENTITY_CREATE_FORM_PROPS, + DEFAULT_IDENTITY_EDIT_FORM_PROPS, + DEFAULT_IDENTITY_ENTITY_ACTIONS, + DEFAULT_IDENTITY_ENTITY_PROPS, + DEFAULT_IDENTITY_TOOLBAR_ACTIONS, + IDENTITY_CREATE_FORM_PROP_CONTRIBUTORS, + IDENTITY_EDIT_FORM_PROP_CONTRIBUTORS, + IDENTITY_ENTITY_ACTION_CONTRIBUTORS, + IDENTITY_ENTITY_PROP_CONTRIBUTORS, + IDENTITY_TOOLBAR_ACTION_CONTRIBUTORS, +} from '../tokens/extensions.token'; + +@Injectable() +export class IdentityExtensionsGuard implements CanActivate { + constructor(private injector: Injector) {} + + canActivate(): Observable { + const extensions: ExtensionsService = this.injector.get(ExtensionsService); + const actionContributors: IdentityEntityActionContributors = + this.injector.get(IDENTITY_ENTITY_ACTION_CONTRIBUTORS, null) || {}; + const toolbarContributors: IdentityToolbarActionContributors = + this.injector.get(IDENTITY_TOOLBAR_ACTION_CONTRIBUTORS, null) || {}; + const propContributors: IdentityEntityPropContributors = + this.injector.get(IDENTITY_ENTITY_PROP_CONTRIBUTORS, null) || {}; + const createFormContributors: IdentityCreateFormPropContributors = + this.injector.get(IDENTITY_CREATE_FORM_PROP_CONTRIBUTORS, null) || {}; + const editFormContributors: IdentityEditFormPropContributors = + this.injector.get(IDENTITY_EDIT_FORM_PROP_CONTRIBUTORS, null) || {}; + + const configState = this.injector.get(ConfigStateService); + return getObjectExtensionEntitiesFromStore(configState, 'Identity').pipe( + map(entities => ({ + [eIdentityComponents.Roles]: entities.Role, + [eIdentityComponents.Users]: entities.User, + })), + mapEntitiesToContributors(configState, 'AbpIdentity'), + tap(objectExtensionContributors => { + mergeWithDefaultActions( + extensions.entityActions, + DEFAULT_IDENTITY_ENTITY_ACTIONS, + actionContributors, + ); + mergeWithDefaultActions( + extensions.toolbarActions, + DEFAULT_IDENTITY_TOOLBAR_ACTIONS, + toolbarContributors, + ); + mergeWithDefaultProps( + extensions.entityProps, + DEFAULT_IDENTITY_ENTITY_PROPS, + objectExtensionContributors.prop, + propContributors, + ); + mergeWithDefaultProps( + extensions.createFormProps, + DEFAULT_IDENTITY_CREATE_FORM_PROPS, + objectExtensionContributors.createForm, + createFormContributors, + ); + mergeWithDefaultProps( + extensions.editFormProps, + DEFAULT_IDENTITY_EDIT_FORM_PROPS, + objectExtensionContributors.editForm, + editFormContributors, + ); + }), + mapTo(true), + ); + } +} diff --git a/npm/ng-packs/packages/identity/src/lib/guards/index.ts b/npm/ng-packs/packages/identity/src/lib/guards/index.ts new file mode 100644 index 0000000000..480f14c40b --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/guards/index.ts @@ -0,0 +1 @@ +export * from './extensions.guard'; diff --git a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts index 27986ae0d7..3b290e851b 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity-routing.module.ts @@ -10,13 +10,14 @@ import { RouterModule, Routes } from '@angular/router'; import { RolesComponent } from './components/roles/roles.component'; import { UsersComponent } from './components/users/users.component'; import { eIdentityComponents } from './enums/components'; +import { IdentityExtensionsGuard } from './guards/extensions.guard'; const routes: Routes = [ { path: '', redirectTo: 'roles', pathMatch: 'full' }, { path: '', component: DynamicLayoutComponent, - canActivate: [AuthGuard, PermissionGuard], + canActivate: [AuthGuard, PermissionGuard, IdentityExtensionsGuard], children: [ { path: 'roles', diff --git a/npm/ng-packs/packages/identity/src/lib/identity.module.ts b/npm/ng-packs/packages/identity/src/lib/identity.module.ts index 036c7e3607..e2b832350a 100644 --- a/npm/ng-packs/packages/identity/src/lib/identity.module.ts +++ b/npm/ng-packs/packages/identity/src/lib/identity.module.ts @@ -1,14 +1,24 @@ import { CoreModule, LazyModuleFactory } from '@abp/ng.core'; import { PermissionManagementModule } from '@abp/ng.permission-management'; import { ThemeSharedModule } from '@abp/ng.theme.shared'; +import { UiExtensionsModule } from '@abp/ng.theme.shared/extensions'; import { ModuleWithProviders, NgModule, NgModuleFactory } from '@angular/core'; import { NgbDropdownModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; import { NgxValidateCoreModule } from '@ngx-validate/core'; import { NgxsModule } from '@ngxs/store'; import { RolesComponent } from './components/roles/roles.component'; import { UsersComponent } from './components/users/users.component'; +import { IdentityExtensionsGuard } from './guards/extensions.guard'; import { IdentityRoutingModule } from './identity-routing.module'; +import { IdentityConfigOptions } from './models/config-options'; import { IdentityState } from './states/identity.state'; +import { + IDENTITY_CREATE_FORM_PROP_CONTRIBUTORS, + IDENTITY_EDIT_FORM_PROP_CONTRIBUTORS, + IDENTITY_ENTITY_ACTION_CONTRIBUTORS, + IDENTITY_ENTITY_PROP_CONTRIBUTORS, + IDENTITY_TOOLBAR_ACTION_CONTRIBUTORS, +} from './tokens/extensions.token'; @NgModule({ declarations: [RolesComponent, UsersComponent], @@ -19,20 +29,43 @@ import { IdentityState } from './states/identity.state'; IdentityRoutingModule, NgbNavModule, ThemeSharedModule, + UiExtensionsModule, NgbDropdownModule, PermissionManagementModule, NgxValidateCoreModule, ], }) export class IdentityModule { - static forChild(): ModuleWithProviders { + static forChild(options: IdentityConfigOptions = {}): ModuleWithProviders { return { ngModule: IdentityModule, - providers: [], + providers: [ + { + provide: IDENTITY_ENTITY_ACTION_CONTRIBUTORS, + useValue: options.entityActionContributors, + }, + { + provide: IDENTITY_TOOLBAR_ACTION_CONTRIBUTORS, + useValue: options.toolbarActionContributors, + }, + { + provide: IDENTITY_ENTITY_PROP_CONTRIBUTORS, + useValue: options.entityPropContributors, + }, + { + provide: IDENTITY_CREATE_FORM_PROP_CONTRIBUTORS, + useValue: options.createFormPropContributors, + }, + { + provide: IDENTITY_EDIT_FORM_PROP_CONTRIBUTORS, + useValue: options.editFormPropContributors, + }, + IdentityExtensionsGuard, + ], }; } - static forLazy(): NgModuleFactory { - return new LazyModuleFactory(IdentityModule.forChild()); + static forLazy(options: IdentityConfigOptions = {}): NgModuleFactory { + return new LazyModuleFactory(IdentityModule.forChild(options)); } } diff --git a/npm/ng-packs/packages/identity/src/lib/models/config-options.ts b/npm/ng-packs/packages/identity/src/lib/models/config-options.ts new file mode 100644 index 0000000000..6a1fc29a00 --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/models/config-options.ts @@ -0,0 +1,42 @@ +import { + CreateFormPropContributorCallback, + EditFormPropContributorCallback, + EntityActionContributorCallback, + EntityPropContributorCallback, + ToolbarActionContributorCallback, +} from '@abp/ng.theme.shared/extensions'; +import { eIdentityComponents } from '../enums/components'; +import { IdentityRoleDto, IdentityUserDto } from '../proxy/identity/models'; + +export type IdentityEntityActionContributors = Partial<{ + [eIdentityComponents.Roles]: EntityActionContributorCallback[]; + [eIdentityComponents.Users]: EntityActionContributorCallback[]; +}>; + +export type IdentityToolbarActionContributors = Partial<{ + [eIdentityComponents.Roles]: ToolbarActionContributorCallback[]; + [eIdentityComponents.Users]: ToolbarActionContributorCallback[]; +}>; + +export type IdentityEntityPropContributors = Partial<{ + [eIdentityComponents.Roles]: EntityPropContributorCallback[]; + [eIdentityComponents.Users]: EntityPropContributorCallback[]; +}>; + +export type IdentityCreateFormPropContributors = Partial<{ + [eIdentityComponents.Roles]: CreateFormPropContributorCallback[]; + [eIdentityComponents.Users]: CreateFormPropContributorCallback[]; +}>; + +export type IdentityEditFormPropContributors = Partial<{ + [eIdentityComponents.Roles]: EditFormPropContributorCallback[]; + [eIdentityComponents.Users]: EditFormPropContributorCallback[]; +}>; + +export interface IdentityConfigOptions { + entityActionContributors?: IdentityEntityActionContributors; + toolbarActionContributors?: IdentityToolbarActionContributors; + entityPropContributors?: IdentityEntityPropContributors; + createFormPropContributors?: IdentityCreateFormPropContributors; + editFormPropContributors?: IdentityEditFormPropContributors; +} diff --git a/npm/ng-packs/packages/identity/src/lib/models/index.ts b/npm/ng-packs/packages/identity/src/lib/models/index.ts new file mode 100644 index 0000000000..c7964853da --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/models/index.ts @@ -0,0 +1,2 @@ +export * from './config-options'; +export * from './identity'; diff --git a/npm/ng-packs/packages/identity/src/lib/states/index.ts b/npm/ng-packs/packages/identity/src/lib/states/index.ts new file mode 100644 index 0000000000..7dccd18456 --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/states/index.ts @@ -0,0 +1 @@ +export * from './identity.state'; diff --git a/npm/ng-packs/packages/identity/src/lib/tokens/extensions.token.ts b/npm/ng-packs/packages/identity/src/lib/tokens/extensions.token.ts new file mode 100644 index 0000000000..14e506da0a --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/tokens/extensions.token.ts @@ -0,0 +1,91 @@ +import { + CreateFormPropContributorCallback, + EditFormPropContributorCallback, + EntityActionContributorCallback, + EntityPropContributorCallback, + ToolbarActionContributorCallback, +} from '@abp/ng.theme.shared/extensions'; +import { InjectionToken } from '@angular/core'; +import { DEFAULT_ROLES_ENTITY_ACTIONS } from '../defaults/default-roles-entity-actions'; +import { DEFAULT_ROLES_ENTITY_PROPS } from '../defaults/default-roles-entity-props'; +import { + DEFAULT_ROLES_CREATE_FORM_PROPS, + DEFAULT_ROLES_EDIT_FORM_PROPS, +} from '../defaults/default-roles-form-props'; +import { DEFAULT_ROLES_TOOLBAR_ACTIONS } from '../defaults/default-roles-toolbar-actions'; +import { DEFAULT_USERS_ENTITY_ACTIONS } from '../defaults/default-users-entity-actions'; +import { DEFAULT_USERS_ENTITY_PROPS } from '../defaults/default-users-entity-props'; +import { + DEFAULT_USERS_CREATE_FORM_PROPS, + DEFAULT_USERS_EDIT_FORM_PROPS, +} from '../defaults/default-users-form-props'; +import { DEFAULT_USERS_TOOLBAR_ACTIONS } from '../defaults/default-users-toolbar-actions'; +import { eIdentityComponents } from '../enums/components'; +import { IdentityRoleDto, IdentityUserDto } from '../proxy/identity/models'; + +export const DEFAULT_IDENTITY_ENTITY_ACTIONS = { + [eIdentityComponents.Roles]: DEFAULT_ROLES_ENTITY_ACTIONS, + [eIdentityComponents.Users]: DEFAULT_USERS_ENTITY_ACTIONS, +}; + +export const DEFAULT_IDENTITY_TOOLBAR_ACTIONS = { + [eIdentityComponents.Roles]: DEFAULT_ROLES_TOOLBAR_ACTIONS, + [eIdentityComponents.Users]: DEFAULT_USERS_TOOLBAR_ACTIONS, +}; + +export const DEFAULT_IDENTITY_ENTITY_PROPS = { + [eIdentityComponents.Roles]: DEFAULT_ROLES_ENTITY_PROPS, + [eIdentityComponents.Users]: DEFAULT_USERS_ENTITY_PROPS, +}; + +export const DEFAULT_IDENTITY_CREATE_FORM_PROPS = { + [eIdentityComponents.Roles]: DEFAULT_ROLES_CREATE_FORM_PROPS, + [eIdentityComponents.Users]: DEFAULT_USERS_CREATE_FORM_PROPS, +}; + +export const DEFAULT_IDENTITY_EDIT_FORM_PROPS = { + [eIdentityComponents.Roles]: DEFAULT_ROLES_EDIT_FORM_PROPS, + [eIdentityComponents.Users]: DEFAULT_USERS_EDIT_FORM_PROPS, +}; + +export const IDENTITY_ENTITY_ACTION_CONTRIBUTORS = new InjectionToken( + 'IDENTITY_ENTITY_ACTION_CONTRIBUTORS', +); + +export const IDENTITY_TOOLBAR_ACTION_CONTRIBUTORS = new InjectionToken( + 'IDENTITY_TOOLBAR_ACTION_CONTRIBUTORS', +); + +export const IDENTITY_ENTITY_PROP_CONTRIBUTORS = new InjectionToken( + 'IDENTITY_ENTITY_PROP_CONTRIBUTORS', +); + +export const IDENTITY_CREATE_FORM_PROP_CONTRIBUTORS = new InjectionToken( + 'IDENTITY_CREATE_FORM_PROP_CONTRIBUTORS', +); + +export const IDENTITY_EDIT_FORM_PROP_CONTRIBUTORS = new InjectionToken( + 'IDENTITY_EDIT_FORM_PROP_CONTRIBUTORS', +); + +// Fix for TS4023 -> https://github.com/microsoft/TypeScript/issues/9944#issuecomment-254693497 +type EntityActionContributors = Partial<{ + [eIdentityComponents.Roles]: EntityActionContributorCallback[]; + [eIdentityComponents.Users]: EntityActionContributorCallback[]; +}>; +type ToolbarActionContributors = Partial<{ + [eIdentityComponents.Roles]: ToolbarActionContributorCallback[]; + [eIdentityComponents.Users]: ToolbarActionContributorCallback[]; +}>; +type EntityPropContributors = Partial<{ + [eIdentityComponents.Roles]: EntityPropContributorCallback[]; + [eIdentityComponents.Users]: EntityPropContributorCallback[]; +}>; +type CreateFormPropContributors = Partial<{ + [eIdentityComponents.Roles]: CreateFormPropContributorCallback[]; + [eIdentityComponents.Users]: CreateFormPropContributorCallback[]; +}>; +type EditFormPropContributors = Partial<{ + [eIdentityComponents.Roles]: EditFormPropContributorCallback[]; + [eIdentityComponents.Users]: EditFormPropContributorCallback[]; +}>; diff --git a/npm/ng-packs/packages/identity/src/lib/tokens/index.ts b/npm/ng-packs/packages/identity/src/lib/tokens/index.ts new file mode 100644 index 0000000000..33233400a2 --- /dev/null +++ b/npm/ng-packs/packages/identity/src/lib/tokens/index.ts @@ -0,0 +1 @@ +export * from './extensions.token'; diff --git a/npm/ng-packs/packages/identity/src/public-api.ts b/npm/ng-packs/packages/identity/src/public-api.ts index 4b192bd857..9ba4a982db 100644 --- a/npm/ng-packs/packages/identity/src/public-api.ts +++ b/npm/ng-packs/packages/identity/src/public-api.ts @@ -1,13 +1,11 @@ -/* - * Public API Surface of identity - */ - -export * from './lib/identity.module'; -export * from './lib/actions/identity.actions'; -export * from './lib/enums'; +export * from './lib/actions'; export * from './lib/components'; -export * from './lib/models/identity'; -export * from './lib/services'; -export * from './lib/states/identity.state'; +export * from './lib/enums'; +export * from './lib/guards'; +export * from './lib/identity.module'; +export * from './lib/models'; export * from './lib/proxy/identity'; export * from './lib/proxy/users'; +export * from './lib/services'; +export * from './lib/states'; +export * from './lib/tokens'; diff --git a/npm/ng-packs/packages/permission-management/package.json b/npm/ng-packs/packages/permission-management/package.json index f9c5d579a5..a8869549d2 100644 --- a/npm/ng-packs/packages/permission-management/package.json +++ b/npm/ng-packs/packages/permission-management/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.permission-management", - "version": "4.0.1", + "version": "4.1.0-rc.2", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~4.0.1", + "@abp/ng.theme.shared": "~4.1.0-rc.2", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/schematics/package.json b/npm/ng-packs/packages/schematics/package.json index 096f5ba656..eef22f2e54 100644 --- a/npm/ng-packs/packages/schematics/package.json +++ b/npm/ng-packs/packages/schematics/package.json @@ -1,6 +1,6 @@ { "name": "@abp/ng.schematics", - "version": "4.0.1", + "version": "4.1.0-rc.2", "description": "Schematics that works with ABP Backend", "keywords": [ "schematics" diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json index 18c8514618..21f158e468 100644 --- a/npm/ng-packs/packages/setting-management/package.json +++ b/npm/ng-packs/packages/setting-management/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.setting-management", - "version": "4.0.1", + "version": "4.1.0-rc.2", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~4.0.1", + "@abp/ng.theme.shared": "~4.1.0-rc.2", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/tenant-management/package.json b/npm/ng-packs/packages/tenant-management/package.json index c2a5038779..c26703aadd 100644 --- a/npm/ng-packs/packages/tenant-management/package.json +++ b/npm/ng-packs/packages/tenant-management/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.tenant-management", - "version": "4.0.1", + "version": "4.1.0-rc.2", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.feature-management": "~4.0.1", - "@abp/ng.theme.shared": "~4.0.1", + "@abp/ng.feature-management": "~4.1.0-rc.2", + "@abp/ng.theme.shared": "~4.1.0-rc.2", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html index 78c8d10a81..a9f108d7f5 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html +++ b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.html @@ -5,26 +5,7 @@
{{ 'AbpTenantManagement::Tenants' | abpLocalization }}
- - +
@@ -41,60 +22,11 @@ - - - -
- -
- - - - -
-
-
-
- -
+ @@ -119,36 +51,7 @@
-
-
- - -
-
- - -
-
- - -
-
+
diff --git a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts index f5b69fd3aa..284c31b9c7 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/components/tenants/tenants.component.ts @@ -16,6 +16,12 @@ import { import { GetTenantsInput, TenantDto } from '../../proxy/models'; import { TenantService } from '../../proxy/tenant.service'; import { TenantManagementState } from '../../states/tenant-management.state'; +import { + EXTENSIONS_IDENTIFIER, + FormPropData, + generateFormFromProps, +} from '@abp/ng.theme.shared/extensions'; +import { eTenantManagementComponents } from '../../enums/components'; interface SelectedModalContent { type: 'saveConnStr' | 'saveTenant'; @@ -26,7 +32,13 @@ interface SelectedModalContent { @Component({ selector: 'abp-tenants', templateUrl: './tenants.component.html', - providers: [ListService], + providers: [ + ListService, + { + provide: EXTENSIONS_IDENTIFIER, + useValue: eTenantManagementComponents.Tenants, + }, + ], }) export class TenantsComponent implements OnInit { @Select(TenantManagementState.get) @@ -113,18 +125,8 @@ export class TenantsComponent implements OnInit { } private createTenantForm() { - const tenantForm = this.fb.group({ - name: [this.selected.name || '', [Validators.required, Validators.maxLength(256)]], - adminEmailAddress: [null, [Validators.required, Validators.maxLength(256), Validators.email]], - adminPassword: [null, [Validators.required, ...getPasswordValidators(this.injector)]], - }); - - if (this.hasSelectedTenant) { - tenantForm.removeControl('adminEmailAddress'); - tenantForm.removeControl('adminPassword'); - } - - this.tenantForm = tenantForm; + const data = new FormPropData(this.injector, this.selected); + this.tenantForm = generateFormFromProps(data); } private createDefaultConnectionStringForm() { diff --git a/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-entity-actions.ts b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-entity-actions.ts new file mode 100644 index 0000000000..7b4460dd94 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-entity-actions.ts @@ -0,0 +1,38 @@ +import { EntityAction } from '@abp/ng.theme.shared/extensions'; +import { TenantsComponent } from '../components/tenants/tenants.component'; +import { TenantDto } from '../proxy/models'; + +export const DEFAULT_TENANTS_ENTITY_ACTIONS = EntityAction.createMany([ + { + text: 'AbpTenantManagement::Edit', + action: data => { + const component = data.getInjected(TenantsComponent); + component.editTenant(data.record.id); + }, + permission: 'AbpTenantManagement.Tenants.Update', + }, + { + text: 'AbpTenantManagement::Permission:ManageConnectionStrings', + action: data => { + const component = data.getInjected(TenantsComponent); + component.onEditConnectionString(data.record.id); + }, + permission: 'AbpTenantManagement.Tenants.ManageConnectionStrings', + }, + { + text: 'AbpTenantManagement::Permission:ManageFeatures', + action: data => { + const component = data.getInjected(TenantsComponent); + component.openFeaturesModal(data.record.id); + }, + permission: 'AbpTenantManagement.Tenants.ManageFeatures', + }, + { + text: 'AbpTenantManagement::Delete', + action: data => { + const component = data.getInjected(TenantsComponent); + component.delete(data.record.id, data.record.name); + }, + permission: 'AbpTenantManagement.Tenants.Delete', + }, +]); diff --git a/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-entity-props.ts b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-entity-props.ts new file mode 100644 index 0000000000..31de557fde --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-entity-props.ts @@ -0,0 +1,11 @@ +import { EntityProp, ePropType } from '@abp/ng.theme.shared/extensions'; +import { TenantDto } from '../proxy/models'; + +export const DEFAULT_TENANTS_ENTITY_PROPS = EntityProp.createMany([ + { + type: ePropType.String, + name: 'name', + displayName: 'AbpTenantManagement::TenantName', + sortable: true, + }, +]); diff --git a/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-form-props.ts b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-form-props.ts new file mode 100644 index 0000000000..a17832113a --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-form-props.ts @@ -0,0 +1,33 @@ +import { getPasswordValidators } from '@abp/ng.theme.shared'; +import { ePropType, FormProp } from '@abp/ng.theme.shared/extensions'; +import { Validators } from '@angular/forms'; +import { TenantCreateDto, TenantUpdateDto } from '../proxy/models'; + +export const DEFAULT_TENANTS_CREATE_FORM_PROPS = FormProp.createMany< + TenantCreateDto | TenantUpdateDto +>([ + { + type: ePropType.String, + name: 'name', + id: 'name', + displayName: 'AbpTenantManagement::TenantName', + validators: () => [Validators.required, Validators.maxLength(256)], + }, + { + type: ePropType.Email, + name: 'adminEmailAddress', + displayName: 'AbpTenantManagement::DisplayName:AdminEmailAddress', + id: 'admin-email-address', + validators: () => [Validators.required, Validators.maxLength(256), Validators.email], + }, + { + type: ePropType.Password, + name: 'adminPassword', + displayName: 'AbpTenantManagement::DisplayName:AdminPassword', + id: 'admin-password', + autocomplete: 'new-password', + validators: data => [Validators.required, ...getPasswordValidators({ get: data.getInjected })], + }, +]); + +export const DEFAULT_TENANTS_EDIT_FORM_PROPS = DEFAULT_TENANTS_CREATE_FORM_PROPS.slice(0, 1); diff --git a/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-toolbar-actions.ts b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-toolbar-actions.ts new file mode 100644 index 0000000000..948294894d --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/src/lib/defaults/default-tenants-toolbar-actions.ts @@ -0,0 +1,24 @@ +import { ToolbarAction } from '@abp/ng.theme.shared/extensions'; +import { TenantsComponent } from '../components/tenants/tenants.component'; +import { TenantDto } from '../proxy/models'; + +export const DEFAULT_TENANTS_TOOLBAR_ACTIONS = ToolbarAction.createMany([ + { + text: 'AbpTenantManagement::ManageHostFeatures', + action: data => { + const component = data.getInjected(TenantsComponent); + component.openFeaturesModal(null); + }, + permission: 'FeatureManagement.ManageHostFeatures', + icon: 'fa fa-cog', + }, + { + text: 'AbpTenantManagement::NewTenant', + action: data => { + const component = data.getInjected(TenantsComponent); + component.addTenant(); + }, + permission: 'AbpTenantManagement.Tenants.Create', + icon: 'fa fa-plus', + }, +]); diff --git a/npm/ng-packs/packages/tenant-management/src/lib/guards/extensions.guard.ts b/npm/ng-packs/packages/tenant-management/src/lib/guards/extensions.guard.ts new file mode 100644 index 0000000000..32f014ddfd --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/src/lib/guards/extensions.guard.ts @@ -0,0 +1,90 @@ +import { ConfigStateService } from '@abp/ng.core'; +import { + ExtensionsService, + getObjectExtensionEntitiesFromStore, + mapEntitiesToContributors, + mergeWithDefaultActions, + mergeWithDefaultProps, +} from '@abp/ng.theme.shared/extensions'; +import { Injectable, Injector } from '@angular/core'; +import { CanActivate } from '@angular/router'; +import { Observable } from 'rxjs'; +import { map, mapTo, tap } from 'rxjs/operators'; +import { eTenantManagementComponents } from '../enums/components'; +import { + TenantManagementCreateFormPropContributors, + TenantManagementEditFormPropContributors, + TenantManagementEntityActionContributors, + TenantManagementEntityPropContributors, + TenantManagementToolbarActionContributors, +} from '../models/config-options'; +import { + DEFAULT_TENANT_MANAGEMENT_CREATE_FORM_PROPS, + DEFAULT_TENANT_MANAGEMENT_EDIT_FORM_PROPS, + DEFAULT_TENANT_MANAGEMENT_ENTITY_ACTIONS, + DEFAULT_TENANT_MANAGEMENT_ENTITY_PROPS, + DEFAULT_TENANT_MANAGEMENT_TOOLBAR_ACTIONS, + TENANT_MANAGEMENT_CREATE_FORM_PROP_CONTRIBUTORS, + TENANT_MANAGEMENT_EDIT_FORM_PROP_CONTRIBUTORS, + TENANT_MANAGEMENT_ENTITY_ACTION_CONTRIBUTORS, + TENANT_MANAGEMENT_ENTITY_PROP_CONTRIBUTORS, + TENANT_MANAGEMENT_TOOLBAR_ACTION_CONTRIBUTORS, +} from '../tokens/extensions.token'; + +@Injectable() +export class TenantManagementExtensionsGuard implements CanActivate { + constructor(private injector: Injector) {} + + canActivate(): Observable { + const extensions: ExtensionsService = this.injector.get(ExtensionsService); + const actionContributors: TenantManagementEntityActionContributors = + this.injector.get(TENANT_MANAGEMENT_ENTITY_ACTION_CONTRIBUTORS, null) || {}; + const toolbarContributors: TenantManagementToolbarActionContributors = + this.injector.get(TENANT_MANAGEMENT_TOOLBAR_ACTION_CONTRIBUTORS, null) || {}; + const propContributors: TenantManagementEntityPropContributors = + this.injector.get(TENANT_MANAGEMENT_ENTITY_PROP_CONTRIBUTORS, null) || {}; + const createFormContributors: TenantManagementCreateFormPropContributors = + this.injector.get(TENANT_MANAGEMENT_CREATE_FORM_PROP_CONTRIBUTORS, null) || {}; + const editFormContributors: TenantManagementEditFormPropContributors = + this.injector.get(TENANT_MANAGEMENT_EDIT_FORM_PROP_CONTRIBUTORS, null) || {}; + + const configState = this.injector.get(ConfigStateService); + return getObjectExtensionEntitiesFromStore(configState, 'TenantManagement').pipe( + map(entities => ({ + [eTenantManagementComponents.Tenants]: entities.Tenant, + })), + mapEntitiesToContributors(configState, 'TenantManagement'), + tap(objectExtensionContributors => { + mergeWithDefaultActions( + extensions.entityActions, + DEFAULT_TENANT_MANAGEMENT_ENTITY_ACTIONS, + actionContributors, + ); + mergeWithDefaultActions( + extensions.toolbarActions, + DEFAULT_TENANT_MANAGEMENT_TOOLBAR_ACTIONS, + toolbarContributors, + ); + mergeWithDefaultProps( + extensions.entityProps, + DEFAULT_TENANT_MANAGEMENT_ENTITY_PROPS, + objectExtensionContributors.prop, + propContributors, + ); + mergeWithDefaultProps( + extensions.createFormProps, + DEFAULT_TENANT_MANAGEMENT_CREATE_FORM_PROPS, + objectExtensionContributors.createForm, + createFormContributors, + ); + mergeWithDefaultProps( + extensions.editFormProps, + DEFAULT_TENANT_MANAGEMENT_EDIT_FORM_PROPS, + objectExtensionContributors.editForm, + editFormContributors, + ); + }), + mapTo(true), + ); + } +} diff --git a/npm/ng-packs/packages/tenant-management/src/lib/guards/index.ts b/npm/ng-packs/packages/tenant-management/src/lib/guards/index.ts new file mode 100644 index 0000000000..480f14c40b --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/src/lib/guards/index.ts @@ -0,0 +1 @@ +export * from './extensions.guard'; diff --git a/npm/ng-packs/packages/tenant-management/src/lib/models/config-options.ts b/npm/ng-packs/packages/tenant-management/src/lib/models/config-options.ts new file mode 100644 index 0000000000..306162f6c5 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/src/lib/models/config-options.ts @@ -0,0 +1,37 @@ +import { + CreateFormPropContributorCallback, + EditFormPropContributorCallback, + EntityActionContributorCallback, + EntityPropContributorCallback, + ToolbarActionContributorCallback, +} from '@abp/ng.theme.shared/extensions'; +import { eTenantManagementComponents } from '../enums/components'; +import { TenantCreateDto, TenantDto, TenantUpdateDto } from '../proxy/models'; + +export type TenantManagementEntityActionContributors = Partial<{ + [eTenantManagementComponents.Tenants]: EntityActionContributorCallback[]; +}>; + +export type TenantManagementToolbarActionContributors = Partial<{ + [eTenantManagementComponents.Tenants]: ToolbarActionContributorCallback[]; +}>; + +export type TenantManagementEntityPropContributors = Partial<{ + [eTenantManagementComponents.Tenants]: EntityPropContributorCallback[]; +}>; + +export type TenantManagementCreateFormPropContributors = Partial<{ + [eTenantManagementComponents.Tenants]: CreateFormPropContributorCallback[]; +}>; + +export type TenantManagementEditFormPropContributors = Partial<{ + [eTenantManagementComponents.Tenants]: EditFormPropContributorCallback[]; +}>; + +export interface TenantManagementConfigOptions { + entityActionContributors?: TenantManagementEntityActionContributors; + toolbarActionContributors?: TenantManagementToolbarActionContributors; + entityPropContributors?: TenantManagementEntityPropContributors; + createFormPropContributors?: TenantManagementCreateFormPropContributors; + editFormPropContributors?: TenantManagementEditFormPropContributors; +} diff --git a/npm/ng-packs/packages/tenant-management/src/lib/models/index.ts b/npm/ng-packs/packages/tenant-management/src/lib/models/index.ts index 580d09d215..2385684df7 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/models/index.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/models/index.ts @@ -1 +1,2 @@ export * from './tenant-management'; +export * from './config-options'; diff --git a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts index a02f63b635..65666ea5a9 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management-routing.module.ts @@ -9,13 +9,14 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { TenantsComponent } from './components/tenants/tenants.component'; import { eTenantManagementComponents } from './enums/components'; +import { TenantManagementExtensionsGuard } from './guards'; const routes: Routes = [ { path: '', redirectTo: 'tenants', pathMatch: 'full' }, { path: '', component: DynamicLayoutComponent, - canActivate: [AuthGuard, PermissionGuard], + canActivate: [AuthGuard, PermissionGuard, TenantManagementExtensionsGuard], children: [ { path: 'tenants', diff --git a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts index 035b658363..e349b9b820 100644 --- a/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts +++ b/npm/ng-packs/packages/tenant-management/src/lib/tenant-management.module.ts @@ -1,13 +1,23 @@ import { CoreModule, LazyModuleFactory } from '@abp/ng.core'; import { FeatureManagementModule } from '@abp/ng.feature-management'; import { ThemeSharedModule } from '@abp/ng.theme.shared'; +import { UiExtensionsModule } from '@abp/ng.theme.shared/extensions'; import { ModuleWithProviders, NgModule, NgModuleFactory } from '@angular/core'; import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; import { NgxValidateCoreModule } from '@ngx-validate/core'; import { NgxsModule } from '@ngxs/store'; import { TenantsComponent } from './components/tenants/tenants.component'; +import { TenantManagementExtensionsGuard } from './guards/extensions.guard'; +import { TenantManagementConfigOptions } from './models/config-options'; import { TenantManagementState } from './states/tenant-management.state'; import { TenantManagementRoutingModule } from './tenant-management-routing.module'; +import { + TENANT_MANAGEMENT_CREATE_FORM_PROP_CONTRIBUTORS, + TENANT_MANAGEMENT_EDIT_FORM_PROP_CONTRIBUTORS, + TENANT_MANAGEMENT_ENTITY_ACTION_CONTRIBUTORS, + TENANT_MANAGEMENT_ENTITY_PROP_CONTRIBUTORS, + TENANT_MANAGEMENT_TOOLBAR_ACTION_CONTRIBUTORS, +} from './tokens/extensions.token'; @NgModule({ declarations: [TenantsComponent], @@ -20,17 +30,44 @@ import { TenantManagementRoutingModule } from './tenant-management-routing.modul ThemeSharedModule, NgbDropdownModule, FeatureManagementModule, + UiExtensionsModule, ], }) export class TenantManagementModule { - static forChild(): ModuleWithProviders { + static forChild( + options: TenantManagementConfigOptions = {}, + ): ModuleWithProviders { return { ngModule: TenantManagementModule, - providers: [], + providers: [ + { + provide: TENANT_MANAGEMENT_ENTITY_ACTION_CONTRIBUTORS, + useValue: options.entityActionContributors, + }, + { + provide: TENANT_MANAGEMENT_TOOLBAR_ACTION_CONTRIBUTORS, + useValue: options.toolbarActionContributors, + }, + { + provide: TENANT_MANAGEMENT_ENTITY_PROP_CONTRIBUTORS, + useValue: options.entityPropContributors, + }, + { + provide: TENANT_MANAGEMENT_CREATE_FORM_PROP_CONTRIBUTORS, + useValue: options.createFormPropContributors, + }, + { + provide: TENANT_MANAGEMENT_EDIT_FORM_PROP_CONTRIBUTORS, + useValue: options.editFormPropContributors, + }, + TenantManagementExtensionsGuard, + ], }; } - static forLazy(): NgModuleFactory { - return new LazyModuleFactory(TenantManagementModule.forChild()); + static forLazy( + options: TenantManagementConfigOptions = {}, + ): NgModuleFactory { + return new LazyModuleFactory(TenantManagementModule.forChild(options)); } } diff --git a/npm/ng-packs/packages/tenant-management/src/lib/tokens/extensions.token.ts b/npm/ng-packs/packages/tenant-management/src/lib/tokens/extensions.token.ts new file mode 100644 index 0000000000..fb79b126d9 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/src/lib/tokens/extensions.token.ts @@ -0,0 +1,74 @@ +import { + CreateFormPropContributorCallback, + EditFormPropContributorCallback, + EntityActionContributorCallback, + EntityPropContributorCallback, + ToolbarActionContributorCallback, +} from '@abp/ng.theme.shared/extensions'; +import { InjectionToken } from '@angular/core'; +import { DEFAULT_TENANTS_ENTITY_ACTIONS } from '../defaults/default-tenants-entity-actions'; +import { DEFAULT_TENANTS_ENTITY_PROPS } from '../defaults/default-tenants-entity-props'; +import { + DEFAULT_TENANTS_CREATE_FORM_PROPS, + DEFAULT_TENANTS_EDIT_FORM_PROPS, +} from '../defaults/default-tenants-form-props'; +import { DEFAULT_TENANTS_TOOLBAR_ACTIONS } from '../defaults/default-tenants-toolbar-actions'; +import { eTenantManagementComponents } from '../enums/components'; +import { TenantCreateDto, TenantDto, TenantUpdateDto } from '../proxy/models'; + +export const DEFAULT_TENANT_MANAGEMENT_ENTITY_ACTIONS = { + [eTenantManagementComponents.Tenants]: DEFAULT_TENANTS_ENTITY_ACTIONS, +}; + +export const DEFAULT_TENANT_MANAGEMENT_TOOLBAR_ACTIONS = { + [eTenantManagementComponents.Tenants]: DEFAULT_TENANTS_TOOLBAR_ACTIONS, +}; + +export const DEFAULT_TENANT_MANAGEMENT_ENTITY_PROPS = { + [eTenantManagementComponents.Tenants]: DEFAULT_TENANTS_ENTITY_PROPS, +}; + +export const DEFAULT_TENANT_MANAGEMENT_CREATE_FORM_PROPS = { + [eTenantManagementComponents.Tenants]: DEFAULT_TENANTS_CREATE_FORM_PROPS, +}; + +export const DEFAULT_TENANT_MANAGEMENT_EDIT_FORM_PROPS = { + [eTenantManagementComponents.Tenants]: DEFAULT_TENANTS_EDIT_FORM_PROPS, +}; + +export const TENANT_MANAGEMENT_ENTITY_ACTION_CONTRIBUTORS = new InjectionToken( + 'TENANT_MANAGEMENT_ENTITY_ACTION_CONTRIBUTORS', +); + +export const TENANT_MANAGEMENT_TOOLBAR_ACTION_CONTRIBUTORS = new InjectionToken( + 'TENANT_MANAGEMENT_TOOLBAR_ACTION_CONTRIBUTORS', +); + +export const TENANT_MANAGEMENT_ENTITY_PROP_CONTRIBUTORS = new InjectionToken( + 'TENANT_MANAGEMENT_ENTITY_PROP_CONTRIBUTORS', +); + +export const TENANT_MANAGEMENT_CREATE_FORM_PROP_CONTRIBUTORS = new InjectionToken( + 'TENANT_MANAGEMENT_CREATE_FORM_PROP_CONTRIBUTORS', +); + +export const TENANT_MANAGEMENT_EDIT_FORM_PROP_CONTRIBUTORS = new InjectionToken( + 'TENANT_MANAGEMENT_EDIT_FORM_PROP_CONTRIBUTORS', +); + +// Fix for TS4023 -> https://github.com/microsoft/TypeScript/issues/9944#issuecomment-254693497 +type EntityActionContributors = Partial<{ + [eTenantManagementComponents.Tenants]: EntityActionContributorCallback[]; +}>; +type ToolbarActionContributors = Partial<{ + [eTenantManagementComponents.Tenants]: ToolbarActionContributorCallback[]; +}>; +type EntityPropContributors = Partial<{ + [eTenantManagementComponents.Tenants]: EntityPropContributorCallback[]; +}>; +type CreateFormPropContributors = Partial<{ + [eTenantManagementComponents.Tenants]: CreateFormPropContributorCallback[]; +}>; +type EditFormPropContributors = Partial<{ + [eTenantManagementComponents.Tenants]: EditFormPropContributorCallback[]; +}>; diff --git a/npm/ng-packs/packages/tenant-management/src/lib/tokens/index.ts b/npm/ng-packs/packages/tenant-management/src/lib/tokens/index.ts new file mode 100644 index 0000000000..33233400a2 --- /dev/null +++ b/npm/ng-packs/packages/tenant-management/src/lib/tokens/index.ts @@ -0,0 +1 @@ +export * from './extensions.token'; diff --git a/npm/ng-packs/packages/tenant-management/src/public-api.ts b/npm/ng-packs/packages/tenant-management/src/public-api.ts index 42961055b1..e012a538b4 100644 --- a/npm/ng-packs/packages/tenant-management/src/public-api.ts +++ b/npm/ng-packs/packages/tenant-management/src/public-api.ts @@ -1,8 +1,10 @@ -export * from './lib/tenant-management.module'; export * from './lib/actions'; export * from './lib/components'; export * from './lib/enums'; +export * from './lib/guards'; export * from './lib/models'; +export * from './lib/proxy'; export * from './lib/services'; export * from './lib/states'; -export * from './lib/proxy'; +export * from './lib/tenant-management.module'; +export * from './lib/tokens'; diff --git a/npm/ng-packs/packages/theme-basic/package.json b/npm/ng-packs/packages/theme-basic/package.json index f763fc3f6a..b7ffc04eab 100644 --- a/npm/ng-packs/packages/theme-basic/package.json +++ b/npm/ng-packs/packages/theme-basic/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.theme.basic", - "version": "4.0.1", + "version": "4.1.0-rc.2", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~4.0.1", + "@abp/ng.theme.shared": "~4.1.0-rc.2", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts index a370edcbe2..7e592cc4b0 100644 --- a/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts +++ b/npm/ng-packs/packages/theme-shared/extensions/src/lib/components/extensible-form/extensible-form-prop.component.ts @@ -1,4 +1,4 @@ -import { ABP, TrackByService } from '@abp/ng.core'; +import { ABP, AbpValidators, TrackByService } from '@abp/ng.core'; import { ChangeDetectionStrategy, ChangeDetectorRef, @@ -168,5 +168,5 @@ export class ExtensibleFormPropComponent implements OnChanges { } function isRequired(validator: ValidatorFn) { - return validator === Validators.required || validator.toString().includes('required'); + return validator === Validators.required || validator === AbpValidators.required; } diff --git a/npm/ng-packs/packages/theme-shared/package.json b/npm/ng-packs/packages/theme-shared/package.json index 6c364e3fd6..b742000740 100644 --- a/npm/ng-packs/packages/theme-shared/package.json +++ b/npm/ng-packs/packages/theme-shared/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.theme.shared", - "version": "4.0.1", + "version": "4.1.0-rc.2", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~4.0.1", + "@abp/ng.core": "~4.1.0-rc.2", "@fortawesome/fontawesome-free": "^5.14.0", "@ng-bootstrap/ng-bootstrap": "^7.0.0", "@ngx-validate/core": "^0.0.13", diff --git a/npm/ng-packs/packages/theme-shared/src/lib/constants/styles.ts b/npm/ng-packs/packages/theme-shared/src/lib/constants/styles.ts index cd9ac2a928..b8d0aef336 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/constants/styles.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/constants/styles.ts @@ -151,6 +151,8 @@ export default ` } ngb-typeahead-window { width: 100%; + max-height: 25em; + overflow-y: scroll !important; } @keyframes fadeInTop { diff --git a/npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts b/npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts index c4a4d2db72..46652f8b25 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts @@ -1,4 +1,4 @@ -import { Config, LocalizationParam, RestOccurError } from '@abp/ng.core'; +import { AuthService, LocalizationParam, RestOccurError } from '@abp/ng.core'; import { HttpErrorResponse } from '@angular/common/http'; import { ApplicationRef, @@ -10,8 +10,8 @@ import { Injector, RendererFactory2, } from '@angular/core'; -import { Navigate, RouterDataResolved, RouterError, RouterState } from '@ngxs/router-plugin'; -import { Actions, ofActionSuccessful, Store } from '@ngxs/store'; +import { NavigationError, ResolveEnd, Router } from '@angular/router'; +import { Actions, ofActionSuccessful } from '@ngxs/store'; import { Observable, Subject } from 'rxjs'; import { filter, map } from 'rxjs/operators'; import snq from 'snq'; @@ -72,7 +72,7 @@ export class ErrorHandler { constructor( private actions: Actions, - private store: Store, + private router: Router, private confirmationService: ConfirmationService, private appRef: ApplicationRef, private cfRes: ComponentFactoryResolver, @@ -86,15 +86,18 @@ export class ErrorHandler { } private listenToRouterError() { - this.actions - .pipe(ofActionSuccessful(RouterError), filter(this.filterRouteErrors)) + this.router.events + .pipe( + filter(event => event instanceof NavigationError), + filter(this.filterRouteErrors), + ) .subscribe(() => this.show404Page()); } private listenToRouterDataResolved() { - this.actions + this.router.events .pipe( - ofActionSuccessful(RouterDataResolved), + filter(event => event instanceof ResolveEnd), filter(() => !!this.componentRef), ) .subscribe(() => { @@ -259,11 +262,7 @@ export class ErrorHandler { } private navigateToLogin() { - this.store.dispatch( - new Navigate(['/account/login'], null, { - state: { redirectUrl: this.store.selectSnapshot(RouterState.url) }, - }), - ); + this.injector.get(AuthService).initLogin(); } createErrorComponent(instance: Partial) { @@ -314,9 +313,9 @@ export class ErrorHandler { return this.httpErrorConfig.skipHandledErrorCodes.findIndex(code => code === status) < 0; }; - private filterRouteErrors = (instance: RouterError): boolean => { + private filterRouteErrors = (navigationError: NavigationError): boolean => { return ( - snq(() => instance.event.error.indexOf('Cannot match') > -1) && + snq(() => navigationError.error.message.indexOf('Cannot match') > -1) && this.httpErrorConfig.skipHandledErrorCodes.findIndex(code => code === 404) < 0 ); }; diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts index 3cbdcbd7de..88813c44de 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/confirmation.service.spec.ts @@ -1,4 +1,4 @@ -import { CoreModule } from '@abp/ng.core'; +import { CoreTestingModule } from '@abp/ng.core/testing'; import { NgModule } from '@angular/core'; import { fakeAsync, tick } from '@angular/core/testing'; import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; @@ -13,7 +13,7 @@ import { ConfirmationService } from '../services'; exports: [ConfirmationComponent], entryComponents: [ConfirmationComponent], declarations: [ConfirmationComponent], - imports: [CoreModule.forTest()], + imports: [CoreTestingModule.forTest()], }) export class MockModule {} @@ -22,7 +22,7 @@ describe('ConfirmationService', () => { let service: ConfirmationService; const createService = createServiceFactory({ service: ConfirmationService, - imports: [NgxsModule.forRoot(), CoreModule.forTest(), MockModule], + imports: [NgxsModule.forRoot(), CoreTestingModule.forTest(), MockModule], }); beforeEach(() => { diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts index 64dfac75f8..939f87e5ee 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/error.handler.spec.ts @@ -1,15 +1,14 @@ -import { CoreModule, RestOccurError } from '@abp/ng.core'; +import { RestOccurError } from '@abp/ng.core'; +import { CoreTestingModule } from '@abp/ng.core/testing'; import { APP_BASE_HREF } from '@angular/common'; import { HttpErrorResponse, HttpHeaders } from '@angular/common/http'; import { Component, NgModule } from '@angular/core'; -import { NavigationError, ResolveEnd, RouterModule } from '@angular/router'; import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; -import { Navigate, RouterDataResolved, RouterError } from '@ngxs/router-plugin'; -import { Actions, NgxsModule, ofActionDispatched, Store } from '@ngxs/store'; +import { NgxsModule, Store } from '@ngxs/store'; import { OAuthService } from 'angular-oauth2-oidc'; import { of } from 'rxjs'; import { HttpErrorWrapperComponent } from '../components/http-error-wrapper/http-error-wrapper.component'; -import { DEFAULT_ERROR_MESSAGES, ErrorHandler, DEFAULT_ERROR_LOCALIZATIONS } from '../handlers'; +import { DEFAULT_ERROR_LOCALIZATIONS, DEFAULT_ERROR_MESSAGES, ErrorHandler } from '../handlers'; import { ConfirmationService } from '../services'; import { httpErrorConfigFactory } from '../tokens/http-error.token'; @@ -17,7 +16,7 @@ import { httpErrorConfigFactory } from '../tokens/http-error.token'; exports: [HttpErrorWrapperComponent], declarations: [HttpErrorWrapperComponent], entryComponents: [HttpErrorWrapperComponent], - imports: [CoreModule], + imports: [CoreTestingModule], }) class MockModule {} @@ -32,12 +31,7 @@ const CONFIRMATION_BUTTONS = { describe('ErrorHandler', () => { const createService = createServiceFactory({ service: ErrorHandler, - imports: [ - RouterModule.forRoot([], { relativeLinkResolution: 'legacy' }), - NgxsModule.forRoot([]), - CoreModule, - MockModule, - ], + imports: [NgxsModule.forRoot([]), CoreTestingModule.forTest(), MockModule], mocks: [OAuthService], providers: [ { provide: APP_BASE_HREF, useValue: '/' }, @@ -177,18 +171,7 @@ describe('ErrorHandler', () => { ); }); - test('should call error method of ConfirmationService when authenticated error occurs with _AbpErrorFormat header', done => { - spectator - .inject(Actions) - .pipe(ofActionDispatched(Navigate)) - .subscribe(({ path, queryParams, extras }) => { - expect(path).toEqual(['/account/login']); - expect(queryParams).toBeNull(); - expect(extras).toEqual({ state: { redirectUrl: '/x' } }); - - done(); - }); - + test('should call error method of ConfirmationService when authenticated error occurs with _AbpErrorFormat header', () => { const headers: HttpHeaders = new HttpHeaders({ _AbpErrorFormat: '_AbpErrorFormat', }); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts index d47e4a7cf5..fa6e0e578c 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/toaster.service.spec.ts @@ -1,4 +1,4 @@ -import { CoreModule } from '@abp/ng.core'; +import { CoreTestingModule } from '@abp/ng.core/testing'; import { NgModule } from '@angular/core'; import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; import { NgxsModule } from '@ngxs/store'; @@ -11,7 +11,7 @@ import { ToasterService } from '../services/toaster.service'; exports: [ToastContainerComponent], entryComponents: [ToastContainerComponent], declarations: [ToastContainerComponent, ToastComponent], - imports: [CoreModule.forTest()], + imports: [CoreTestingModule.forTest()], }) export class MockModule {} const toastClassPrefix = 'abp-toast'; @@ -21,7 +21,7 @@ describe('ToasterService', () => { let service: ToasterService; const createService = createServiceFactory({ service: ToasterService, - imports: [NgxsModule.forRoot(), CoreModule.forTest(), MockModule], + imports: [NgxsModule.forRoot(), CoreTestingModule.forTest(), MockModule], }); beforeEach(() => { diff --git a/npm/ng-packs/tsconfig.json b/npm/ng-packs/tsconfig.json index 213f5bd437..c67c628f64 100644 --- a/npm/ng-packs/tsconfig.json +++ b/npm/ng-packs/tsconfig.json @@ -17,6 +17,7 @@ "paths": { "@abp/ng.core": ["packages/core/src/public-api.ts"], "@abp/ng.core/locale": ["packages/core/locale/src/public-api.ts"], + "@abp/ng.core/testing": ["packages/core/testing/src/public-api.ts"], "@abp/ng.theme.shared": ["packages/theme-shared/src/public-api.ts"], "@abp/ng.theme.shared/extensions": ["packages/theme-shared/extensions/src/public-api.ts"], "@abp/ng.components/tree": ["packages/components/tree/src/public-api.ts"], diff --git a/npm/ng-packs/tslint.json b/npm/ng-packs/tslint.json index dc5de80dab..d02d83c23b 100644 --- a/npm/ng-packs/tslint.json +++ b/npm/ng-packs/tslint.json @@ -3,10 +3,7 @@ "rulesDirectory": ["node_modules/codelyzer"], "rules": { "align": { - "options": [ - "parameters", - "statements" - ] + "options": ["parameters", "statements"] }, "array-type": false, "contextual-lifecycle": true, @@ -15,9 +12,7 @@ "eofline": true, "import-spacing": true, "indent": { - "options": [ - "spaces" - ] + "options": ["spaces"] }, "max-line-length": [true, 140], "no-consecutive-blank-lines": false, @@ -77,13 +72,8 @@ "import-blacklist": [true, "rxjs/Rx"], "interface-over-type-literal": true, "interface-name": [true, "never-prefix"], - "member-access": [false], - "member-ordering": [ - true, - { - "order": ["static-field", "instance-field", "static-method", "instance-method"] - } - ], + "member-access": false, + "member-ordering": false, "no-arg": true, "no-bitwise": true, "no-conflicting-lifecycle": true, @@ -134,9 +124,17 @@ "unified-signatures": true, "use-lifecycle-interface": true, "use-pipe-transform-interface": true, - "variable-name": false, - "prefer-for-of": false - , "whitespace": { + "variable-name": { + "options": [ + "ban-keywords", + "check-format", + "allow-leading-underscore", + "allow-pascal-case", + "allow-snake-case" + ] + }, + "prefer-for-of": true, + "whitespace": { "options": [ "check-branch", "check-decl", @@ -146,5 +144,5 @@ "check-typecast" ] } -} + } } diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock index e2ea0edf2e..4ef0c07ef8 100644 --- a/npm/ng-packs/yarn.lock +++ b/npm/ng-packs/yarn.lock @@ -2,14 +2,13 @@ # yarn lockfile v1 -"@abp/ng.core@~4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-4.0.0.tgz#51f0df8273e1666cfea04a7dc1f2a17b737f1572" - integrity sha512-GbdxxyoDxzhYGX76Evk/dhTbAbJejntB5fvlyIbcNq8MyGTRW0wnIVjBoKwzHaG3qWY6TIEQSjfviLjgneJyPw== +"@abp/ng.core@~4.1.0-rc.1": + version "4.1.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/ng.core/-/ng.core-4.1.0-rc.1.tgz#efbd35e8df0731e75b2195149269b0228ec4ae42" + integrity sha512-WhXHMlDSbYled+mW8faMW8qHUGVErh/E/3eOgfvhx4N2tGGs5w+A4EfjNVBBROcoLDwiX2q1L88WeNnrK1+OIQ== dependencies: - "@abp/utils" "^4.0.0-rc.5" + "@abp/utils" "^4.0.1" "@angular/localize" "~10.0.10" - "@ngxs/router-plugin" "^3.7.0" "@ngxs/store" "^3.7.0" angular-oauth2-oidc "^10.0.0" just-clone "^3.1.0" @@ -18,35 +17,35 @@ ts-toolbelt "6.15.4" tslib "^2.0.0" -"@abp/ng.feature-management@~4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-4.0.0.tgz#9a9aac80996d6654bfe7808a194465c746c7f8ee" - integrity sha512-qDzX3Ene5YyFiO9wNMfH8YMTUHAl/t3AUNwYLzpjiz8llYYn+vvd0wv/+zKRL7oiMf0xsNW6QGZQKhKWXUOyyA== +"@abp/ng.feature-management@~4.1.0-rc.1": + version "4.1.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/ng.feature-management/-/ng.feature-management-4.1.0-rc.1.tgz#5237db2e5a0ea5a6511941864fa721a303b5612c" + integrity sha512-/9GP6ze127uMkHB2QxWJC2MXiEMTLtBhM0DXYlPZKI+Y+FrVOBoUTI3gNz+AqWFwbBAA4PqfVuThhoja5b29Sg== dependencies: - "@abp/ng.theme.shared" "~4.0.0" + "@abp/ng.theme.shared" "~4.1.0-rc.1" tslib "^2.0.0" -"@abp/ng.identity@~4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-4.0.0.tgz#b76fcec5144588af82f5062c8b899e4104732ff0" - integrity sha512-rBRNuArZ3qFpC4Z8CffsOxirRZZYNb1jljRNBdVx3Qn9T+TgQolalRBQXD1ZjQm7OTMd+YaLr6KY9FHmO+NnZw== +"@abp/ng.identity@~4.1.0-rc.1": + version "4.1.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/ng.identity/-/ng.identity-4.1.0-rc.1.tgz#932fd10482e82400a87927d200c2d3c850cccef4" + integrity sha512-uh7Fy+X2qGiNZ58g2c1GkmJL9VnMPLsKzg9EugNV2VxbGYg4/sNmVvAeIV66x2hpDXETHCjm+7lYuZsqI/5Vew== dependencies: - "@abp/ng.permission-management" "~4.0.0" - "@abp/ng.theme.shared" "~4.0.0" + "@abp/ng.permission-management" "~4.1.0-rc.1" + "@abp/ng.theme.shared" "~4.1.0-rc.1" tslib "^2.0.0" -"@abp/ng.permission-management@~4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-4.0.0.tgz#8b6dbd7ac24a9f6948db826dfb6102e773ac26fa" - integrity sha512-Io6jUfvzpaKwhGmsRRkQM+61JS8QaIbrWzjkw7vYXLLgIgWMrMHoIBotRoAZDpHt9kiCMhgBP5Ul3SZhaib0Ug== +"@abp/ng.permission-management@~4.1.0-rc.1": + version "4.1.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/ng.permission-management/-/ng.permission-management-4.1.0-rc.1.tgz#de810f1d50f901cffb15f59756127e83109e79f7" + integrity sha512-AgPpmBKDYnMKmMXoiU9ewGKtn5hH9frO5tV0wjz46BjmO9kIwyap3BBeCFcZjhgVLxZnXi8D0WuzZW7mgQARIQ== dependencies: - "@abp/ng.theme.shared" "~4.0.0" + "@abp/ng.theme.shared" "~4.1.0-rc.1" tslib "^2.0.0" -"@abp/ng.schematics@~4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@abp/ng.schematics/-/ng.schematics-4.0.0.tgz#779bac96bc33ff5979bd003fc74ad1c38d4a1829" - integrity sha512-5+jx1+80W5DW21dJQLItwNGjFHcGDEw93cD4hAbNXPzCCwm28x4zyx5gJY7+lb9D07bne5FGKSfnKbbK3DuSWw== +"@abp/ng.schematics@~4.1.0-rc.1": + version "4.1.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/ng.schematics/-/ng.schematics-4.1.0-rc.1.tgz#42173b847cfc2f293245a96fe4732a9049b8ab7c" + integrity sha512-FU5Mat3ki6ARDmOK5WC4/AMXJC+61EknuH44SE9Y9PraXAYkJk+2Ha+1qAg+VLBQcEEVWLxIqMp+2Soc6d6oow== dependencies: "@angular-devkit/core" "~11.0.2" "@angular-devkit/schematics" "~11.0.2" @@ -54,37 +53,37 @@ jsonc-parser "^2.3.0" typescript "~3.9.2" -"@abp/ng.setting-management@~4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-4.0.0.tgz#31abf72da2e424de5db4876baa705c3026900d11" - integrity sha512-1yX/J2ZEwiKXslLRP5eclrv8H4CLz46GdwToarjtCEi2N33FWc4HugjFiBQVhcPGsgziORPayGiLib6fGFtOOQ== +"@abp/ng.setting-management@~4.1.0-rc.1": + version "4.1.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/ng.setting-management/-/ng.setting-management-4.1.0-rc.1.tgz#d35083c211089683c4fb07f88523c01e3e5d8ce0" + integrity sha512-qKLV2IWkHbK5ohHMxbdzPqE1pvPPatmV0EidE79Rk4j5+WZXOXtNz5GEA2vLmF3CsuVjX90cJQdtY1bdZpvdVQ== dependencies: - "@abp/ng.theme.shared" "~4.0.0" + "@abp/ng.theme.shared" "~4.1.0-rc.1" tslib "^2.0.0" -"@abp/ng.tenant-management@~4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-4.0.0.tgz#2c8633c28fc393953c2aff0f301e23a54f9317fc" - integrity sha512-zNKEAQZmt/r6ixuhhiIWYP1O6yh0aN1v1gVqiblmOBFGvVPYvOjVPg54fms2B/GMdQj1iIhutQp838VUC1czIg== +"@abp/ng.tenant-management@~4.1.0-rc.1": + version "4.1.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/ng.tenant-management/-/ng.tenant-management-4.1.0-rc.1.tgz#be6740c8a7ac844c7100a46fb88bc96ce386e17d" + integrity sha512-OymGkg5BzHiraUC0FcWPm6JN84FgYNZ3YuLTAZd/iHmqQVoj51ymTK8dBOn7sw49vWlAj/WvGN4Z9tT/JS40zg== dependencies: - "@abp/ng.feature-management" "~4.0.0" - "@abp/ng.theme.shared" "~4.0.0" + "@abp/ng.feature-management" "~4.1.0-rc.1" + "@abp/ng.theme.shared" "~4.1.0-rc.1" tslib "^2.0.0" -"@abp/ng.theme.basic@~4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-4.0.0.tgz#ef69555cc481e003768761b24a6ff880ae73d05a" - integrity sha512-KHaIWqrqsNz6iJT8Z/mNzJ4Ayt1ORURoAVPXbXcuc4/k80DboSfkqq3S+8XgRcJDr7WBC+204Bb/tovDy2G+AQ== +"@abp/ng.theme.basic@~4.1.0-rc.1": + version "4.1.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/ng.theme.basic/-/ng.theme.basic-4.1.0-rc.1.tgz#311e1ee4490803d43b1b1286620f1efa0fe3f459" + integrity sha512-nTf9UaupTxT0UgBx/SwaVuhtutUXFqGGq2dBKI0JNxltgfykLhDXUOTlUnymLlsyu09DJv8OIZbCX6PJAMV1GA== dependencies: - "@abp/ng.theme.shared" "~4.0.0" + "@abp/ng.theme.shared" "~4.1.0-rc.1" tslib "^2.0.0" -"@abp/ng.theme.shared@~4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-4.0.0.tgz#6b881677091090aca3e22c53d7297c94806f5927" - integrity sha512-ii7oCZVq4TgrTs8QgM/KzCX+f108a+VYxMM+CJ8G1VRlb/TQYxvIryrJlDhs69zXDteNP5fkn/N6frAUQ+OinA== +"@abp/ng.theme.shared@~4.1.0-rc.1": + version "4.1.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/ng.theme.shared/-/ng.theme.shared-4.1.0-rc.1.tgz#08c051cafd1364563943f7f8b6d067955227cc7e" + integrity sha512-oNPGXI6gyesDnzHq/x7QuXKr0ISwgz9YaKg2bvzZOCvyZ0usL2P4h/4sQvV9ThCYjDdkVKN+cdW+KNvalJ415w== dependencies: - "@abp/ng.core" "~4.0.0" + "@abp/ng.core" "~4.1.0-rc.1" "@fortawesome/fontawesome-free" "^5.14.0" "@ng-bootstrap/ng-bootstrap" "^7.0.0" "@ngx-validate/core" "^0.0.13" @@ -93,17 +92,17 @@ chart.js "^2.9.3" tslib "^2.0.0" -"@abp/utils@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0.tgz#6c2b5f5c20821028fe6cdbffb5e2f6088956b9d5" - integrity sha512-Yj2yCObvS6X/P8rdRMQBo7940k5P/dZhgCUSo9C6P9GNmJY8wNdJFFyhRtaHuAyU5IBBBIY7+mMKOk5eQcbjWQ== +"@abp/utils@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" + integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== dependencies: just-compare "^1.3.0" -"@abp/utils@^4.0.0-rc.5": - version "4.0.0-rc.5" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.0-rc.5.tgz#45b55d6bbf69ad2a052bc2635c039d2cc4aac401" - integrity sha512-pRYUSh30VT4702lfnQCswIwLVqNC6ZFsmydXngwZASJEJVKj30XitSlixnKhocvozG/87H0sYVzvwmUyJiHHQw== +"@abp/utils@^4.1.0-rc.1": + version "4.1.0-rc.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.1.tgz#2863867985db9d178a5ce4347309f060f1ce6142" + integrity sha512-C8e+x5/IdkJWQ8gLtO7ygsth5sd1iXKn0ARu/5u0g11nMjHsMY9Qkwg5QrnpHp2ws1+FL1Dg67omrQp9+KK5SA== dependencies: just-compare "^1.3.0" @@ -125,12 +124,12 @@ "@angular-devkit/core" "10.1.7" rxjs "6.6.2" -"@angular-devkit/architect@0.1100.2": - version "0.1100.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1100.2.tgz#7567af030afe7d6cdea1771bcd2a193a19a90dc9" - integrity sha512-wSMMM8eBPol48OtvIyrIq2H9rOIiJmrPEtPbH0BSuPX0B8BckVImeTPzloqxSrpul4tY7Iwx0zwISDEgb59Vbw== +"@angular-devkit/architect@0.1100.4": + version "0.1100.4" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1100.4.tgz#68c2b0333daa0291ad99205862111c04e7a63020" + integrity sha512-hzTfcSUwM0jsSt9HvvSFyaoAhX9k73L7y4kmkghzIFhKhIKOp/7o3n7hAFwN/jWKKmVQpPKnYmqzm9H9OveaCQ== dependencies: - "@angular-devkit/core" "11.0.2" + "@angular-devkit/core" "11.0.4" rxjs "6.6.3" "@angular-devkit/architect@>=0.1000.0 < 0.1100.0": @@ -142,14 +141,14 @@ rxjs "6.6.2" "@angular-devkit/build-angular@~0.1100.0": - version "0.1100.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.1100.2.tgz#afbeef979df4dbafeed3ff3de438dc9f35e2d148" - integrity sha512-5Qo3DDKggzUJKibNgeyE5mIMFYP0tVebNvMatpbnYnR/U0fUuuQdvNC68s380M5KoOuubfeXr0Js0VFk0mkaow== - dependencies: - "@angular-devkit/architect" "0.1100.2" - "@angular-devkit/build-optimizer" "0.1100.2" - "@angular-devkit/build-webpack" "0.1100.2" - "@angular-devkit/core" "11.0.2" + version "0.1100.4" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.1100.4.tgz#22596475d38b13735876a4c7e1afc199654bb9ed" + integrity sha512-qVkMbtOwlo+k8fvOBOwwfKWMx06k4I1qrdjpRYAoZCt3cdje4EBepSciLrHnTB+ouIqWxpEDfEXTYBS98tXbBg== + dependencies: + "@angular-devkit/architect" "0.1100.4" + "@angular-devkit/build-optimizer" "0.1100.4" + "@angular-devkit/build-webpack" "0.1100.4" + "@angular-devkit/core" "11.0.4" "@babel/core" "7.12.3" "@babel/generator" "7.12.1" "@babel/plugin-transform-runtime" "7.12.1" @@ -157,7 +156,7 @@ "@babel/runtime" "7.12.1" "@babel/template" "7.10.4" "@jsdevtools/coverage-istanbul-loader" "3.0.5" - "@ngtools/webpack" "11.0.2" + "@ngtools/webpack" "11.0.4" ansi-colors "4.1.1" autoprefixer "9.8.6" babel-loader "8.1.0" @@ -203,7 +202,7 @@ speed-measure-webpack-plugin "1.3.3" style-loader "2.0.0" stylus "0.54.8" - stylus-loader "4.1.1" + stylus-loader "4.3.1" terser "5.3.7" terser-webpack-plugin "4.2.3" text-table "0.2.0" @@ -224,10 +223,10 @@ "@angular-devkit/architect" "0.1001.7" rxjs "6.6.2" -"@angular-devkit/build-optimizer@0.1100.2": - version "0.1100.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.1100.2.tgz#93dea833aed64d265cfdfebb6580e10cf909630b" - integrity sha512-2ZdEeAs0a53g9LDkP5H2mCEPLyk7yd9P7eTepNYvIOz3xJ6W6dB2CqotPMfnHgd4o12cbzCOWrPBxbfo/VnMig== +"@angular-devkit/build-optimizer@0.1100.4": + version "0.1100.4" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.1100.4.tgz#dbe44ad1d4a6e95436e3bae297dafc09a8ab9190" + integrity sha512-C05y4qMb05PWR7l1gZwRQKiB6KIDq+p72r8Yr6jm0UO6raOtMM72R8nHnioMnGJcFtZDEAYXEF+X7soI3MMlfw== dependencies: loader-utils "2.0.0" source-map "0.7.3" @@ -235,13 +234,13 @@ typescript "4.0.5" webpack-sources "2.0.1" -"@angular-devkit/build-webpack@0.1100.2": - version "0.1100.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1100.2.tgz#1613334c396931de295d47d8ec8ef980592cc00d" - integrity sha512-XVMtWoxNa3wJLRjJ846Y02PzupdbUizdAtggRu2731RLMvI1KawWlsTURi12MNUnoVQYm9eldiIA/Y1UqeE8mQ== +"@angular-devkit/build-webpack@0.1100.4": + version "0.1100.4" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1100.4.tgz#8ca4b10ce8fc739b128137c6c7c0d24377d27a76" + integrity sha512-uxe8gNSej3KF1FgqNtJmuRDbbINh3yLtXanXhRxFQLUj8IiNR8IciIVvy6RfXC5gqxcWwy1cOefJLLnuN9AOxQ== dependencies: - "@angular-devkit/architect" "0.1100.2" - "@angular-devkit/core" "11.0.2" + "@angular-devkit/architect" "0.1100.4" + "@angular-devkit/core" "11.0.4" rxjs "6.6.3" "@angular-devkit/core@10.0.8": @@ -277,17 +276,6 @@ rxjs "6.6.2" source-map "0.7.3" -"@angular-devkit/core@11.0.2": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-11.0.2.tgz#dd3475912e830740e71e14e3168d609e8ddef8c6" - integrity sha512-vUmmUNmNM9oRcDmt0PunU/ayglo0apq4pGL9Z5jj6alf2WwEiTcGHjyuZSDIO9MOLi41519jp3mDx79qXvvyww== - dependencies: - ajv "6.12.6" - fast-json-stable-stringify "2.1.0" - magic-string "0.25.7" - rxjs "6.6.3" - source-map "0.7.3" - "@angular-devkit/core@11.0.4", "@angular-devkit/core@~11.0.2": version "11.0.4" resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-11.0.4.tgz#4128b90bdb4d1803bb246d177b7cc6df64a0fec1" @@ -341,12 +329,12 @@ ora "5.0.0" rxjs "6.6.2" -"@angular-devkit/schematics@11.0.2": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-11.0.2.tgz#b5aa914d7e91d92b4eeadb7aed3b5228497abbf3" - integrity sha512-unNewc+Y9ofrdKxXNoSHKUL6wvV8Vgh2nJMTLI1VAw8nfqgWphI+s5XwbVzog65nhZ10xJeaUm9u5R8pxLDpQg== +"@angular-devkit/schematics@11.0.4", "@angular-devkit/schematics@~11.0.2": + version "11.0.4" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-11.0.4.tgz#0680fe038c66f2ecc3c69a293505fb02b694ce80" + integrity sha512-fFC7qW9A1bFAZgpCfkezBA4WCRzfVFgOzwPpyt65rgSrzw0+EeHjcrUIcXlhyOXAFrTHtA9oLCfEeSjSx5HBEA== dependencies: - "@angular-devkit/core" "11.0.2" + "@angular-devkit/core" "11.0.4" ora "5.1.0" rxjs "6.6.3" @@ -358,19 +346,10 @@ "@angular-devkit/core" "8.3.29" rxjs "6.4.0" -"@angular-devkit/schematics@~11.0.2": - version "11.0.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-11.0.4.tgz#0680fe038c66f2ecc3c69a293505fb02b694ce80" - integrity sha512-fFC7qW9A1bFAZgpCfkezBA4WCRzfVFgOzwPpyt65rgSrzw0+EeHjcrUIcXlhyOXAFrTHtA9oLCfEeSjSx5HBEA== - dependencies: - "@angular-devkit/core" "11.0.4" - ora "5.1.0" - rxjs "6.6.3" - "@angular/animations@~11.0.0": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-11.0.2.tgz#c095ab0aed4491732c81a894987bcab1a854ab15" - integrity sha512-uF/RlBY1rznbuw+1lm8Q2HKDrBOQQ2Bi2cUPuef+ALn+lxGl501eHlE+PTtBjDEzJcJPfd4pE3Ww3+3Il+D+Tw== + version "11.0.4" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-11.0.4.tgz#fa669490d039455e63413a6b8cd1ff6b7a966bec" + integrity sha512-NI7UdLNdzTfLCDu0zVqwhdKq2z1flRsM2GCD9RHG/NRjlohh73uRTBW+BcYpfh+o+Wq4giiq8UkTIgS2ReqDGg== dependencies: tslib "^2.0.0" @@ -384,15 +363,15 @@ parse5 "^5.0.0" "@angular/cli@~11.0.0": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-11.0.2.tgz#15ee1732258deec8ecb93f6ccac52d95230074d8" - integrity sha512-mebt4ikwXD3gsbHRxKCpn83yW3UVnhiVDEpSXljs1YxscZ1X1dXrxb2g6LdAJwVp9xY5ERqRQeZM7eChqLTrvg== - dependencies: - "@angular-devkit/architect" "0.1100.2" - "@angular-devkit/core" "11.0.2" - "@angular-devkit/schematics" "11.0.2" - "@schematics/angular" "11.0.2" - "@schematics/update" "0.1100.2" + version "11.0.4" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-11.0.4.tgz#a04724f7ffb27417df59c2359e47ec54e1f61fab" + integrity sha512-VkE/gx6P80EJHg13fG+gkZfd2DJmRaDAtnamcCGM4AThzoUN9XBdxc24uMLEzBb0/mJ4vpMK9+WTNIdMmzl+Tg== + dependencies: + "@angular-devkit/architect" "0.1100.4" + "@angular-devkit/core" "11.0.4" + "@angular-devkit/schematics" "11.0.4" + "@schematics/angular" "11.0.4" + "@schematics/update" "0.1100.4" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.1" debug "4.2.0" @@ -410,9 +389,9 @@ uuid "8.3.1" "@angular/common@~11.0.0": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-11.0.2.tgz#7558b940a1110a9c6c65103b1ae8e18f2c8e939c" - integrity sha512-DGJuSBDt+bF77AzJNrLzeaFGSdwQ3OjgP9UUv1eKvaxp9D+lDam8suIJMuBwTsJII/yrDndY75ENPNTEqhmB2A== + version "11.0.4" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-11.0.4.tgz#39cd88bfcecd895419c059c366eac2df2ca6a2e9" + integrity sha512-4R2ALj71J6EAHVCKNnHHCKL7wcosMsv3gcMXbMTE+Wpzo3khEhM0Tej+I1qmMbVmGXVlRb//4+rjE4gff6FvQw== dependencies: tslib "^2.0.0" @@ -455,23 +434,23 @@ integrity sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w== "@angular/core@~11.0.0": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-11.0.2.tgz#490248b1d746e24513f2db996bd857e5a36d2f45" - integrity sha512-GyDebks5ZPHDyChDW3VvzJq00Ct0iuesNpb9z/GpKtOXqug3sGr4KgkFDUTbfizKPWyeoaLH9FQYP55215nCKQ== + version "11.0.4" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-11.0.4.tgz#8eebb6a550dc24e4d53f642c8a78a0da2830cd5b" + integrity sha512-860cTMjdCHcvEsHOsTzpg5rThxwVgtnY4yT0SgboWiphrlzX+aNoyN/cCJHxWhmOTRlrl6/+hkeRq95E2BZkKw== dependencies: tslib "^2.0.0" "@angular/forms@~11.0.0": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-11.0.2.tgz#68de53edfd504b570bfcd23f371a2f21fbec5c49" - integrity sha512-Rn17VPviTTwiDn8Yt/UzdkXjFX0LdvjkmTNZoakqOk8/QNnsCG5sUDJAV7BKHk+2nEfUGCopS4kpBiLKLoaBpQ== + version "11.0.4" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-11.0.4.tgz#6d77f01ecdf027a78df18d4e6cd3ad8fc8dd49e4" + integrity sha512-Fhfc4buwMZk0WumDvl/X7XBnOKFeTRTJrwKdi8LlhY6o1Og8H4e/f69u9iDJCF3YjU4qC6yGtPp9YpSVCPP7Ew== dependencies: tslib "^2.0.0" "@angular/language-service@~11.0.0": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-11.0.2.tgz#b9a97a9bdd3d10ac2335eb94bacf8ab5514aeeb5" - integrity sha512-Cfam/NEP8hKkcqBVGlkBVuPkojZukmVOxdtsFIkIjJW/mywad2lIfjHR/0rZ43jD1bPb7s+tyYcJBgNg42p2ng== + version "11.0.4" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-11.0.4.tgz#0a9c01170be92378f217dea3263c4eb2f8411aaa" + integrity sha512-KtQxVSlZi3SwZEN4E56KHkNTFEYa3FPZfLJFm6WD1dSobFyMwJgvztO08GWSaT4S0ht0NNRD2IRt0XzBYuZkag== "@angular/localize@~10.0.10": version "10.0.14" @@ -483,41 +462,41 @@ yargs "15.3.0" "@angular/localize@~11.0.0": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-11.0.2.tgz#de0fce15d31c958478c280b3aecb398841146f9f" - integrity sha512-G7v/WPjno5QgY2XvYqK9pKP5lsaE17rP6/FIYhTFoA2TTSTJQ0mWlIQigcTvr+AT2t4U6nFJeteGuyIIvpMJYg== + version "11.0.4" + resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-11.0.4.tgz#8f7a36685d97f26d52e3f19d9218e1e2e05a2bb2" + integrity sha512-r0dWvwFvEqQJ/H94rr548S092Hq53RqyMANuFD09CpkWXS6yAWBfArB6mW77PARnicEC0zkbi5qMGACjtSyNtA== dependencies: "@babel/core" "7.8.3" glob "7.1.2" yargs "^16.1.1" "@angular/platform-browser-dynamic@~11.0.0": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-11.0.2.tgz#e8f621482c4fe04c14d799c771382891052ee2a2" - integrity sha512-iV7xz90FdmYFiXZRLkZtP9Lr+OXXh4bhkX7zN1L5H8SSUF4iOJGBdOts5Fiy5GZjYYILjF1pJoEIicfW/RSHjA== + version "11.0.4" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-11.0.4.tgz#d775f12954db689507ef98a51d8d7ed5763becd4" + integrity sha512-ZOWTZaFfZSHhMy7a0RIxipiZoiobHWrGlq8/YaMrIgzUb9Fv518FeFCCI68BP0/GuyxX74MJmzv4ZgQctKKxXw== dependencies: tslib "^2.0.0" "@angular/platform-browser@~11.0.0": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-11.0.2.tgz#78e640400050c69ca3322b8df0f4ec48f629ec34" - integrity sha512-RHPm5/h8g3lSBgdg9OvO7w06juEwwBurvQcugXlk7+AeqznwzBodTWGPIATKzMySXQFmpy3bAZ3IxS0NkRrbWA== + version "11.0.4" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-11.0.4.tgz#131db1115943eb9c0191080e200c1e9dbd214d4c" + integrity sha512-+uUCKJgspSghJ3R6Fk0XHA0tolbaRBi8JFS2cY+hi9s27WKB88peGvtsK6RCOPJONY6JdOuhpcZqRN8dKfPi7w== dependencies: tslib "^2.0.0" "@angular/router@~11.0.0": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-11.0.2.tgz#38119a49edbfc60552d3403b4fc081ec705e2d6d" - integrity sha512-EU0lQ+3vv1ozly+Z4SgaGj/6CWMIExjnSnA1F7SI2yWmMgMMSb5CsGJ2xzr0V8ex3XZzuU2VuKF74muC58qSyg== + version "11.0.4" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-11.0.4.tgz#324507346c508649135f56e5f2b57c60e0ba7b16" + integrity sha512-B0sqv8zMM6j88+udEZzO8wKBw61pHgWZmLopnAqA65rRPrAvMsvAHUnYqX6w5pYqhJQxCVLVeKM+0QlQh1+WnA== dependencies: tslib "^2.0.0" "@ant-design/colors@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-5.0.0.tgz#46b73b4cc6935b35fc8b84555e8e42c8cfc190e6" - integrity sha512-Pe1rYorgVC1v4f+InDXvIlQH715pO1g7BsOhy/ehX/U6ebPKqojmkYJKU3lF+84Zmvyar7ngZ28hesAa1nWjLg== + version "5.0.1" + resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-5.0.1.tgz#09670f2f44a7473d7bc01be901c48ec10f12c7a4" + integrity sha512-x1TUaRILaqy3zgFNo+kIqOa3eTYPt81H1/3E4dCjDP4Qvk/xaPEizLDFdRUcIx0cWwyu2LklwfyLHWpbYK8v6A== dependencies: - "@ctrl/tinycolor" "^3.1.6" + "@ctrl/tinycolor" "^3.3.1" "@ant-design/icons-angular@^10.0.0": version "10.2.0" @@ -583,24 +562,23 @@ source-map "^0.5.0" "@babel/core@^7.1.0", "@babel/core@^7.7.5", "@babel/core@^7.8.6": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.7.tgz#bf55363c08c8352a37691f7216ec30090bf7e3bf" - integrity sha512-tRKx9B53kJe8NCGGIxEQb2Bkr0riUIEuN7Sc1fxhs5H8lKlCWUvQCSNMVIB0Meva7hcbCRJ76de15KoLltdoqw== + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" + integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" + "@babel/generator" "^7.12.10" "@babel/helper-module-transforms" "^7.12.1" "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" + "@babel/parser" "^7.12.10" "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.7" - "@babel/types" "^7.12.7" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.10" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" json5 "^2.1.2" lodash "^4.17.19" - resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" @@ -613,21 +591,21 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.12.1", "@babel/generator@^7.12.5", "@babel/generator@^7.8.3": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" - integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A== +"@babel/generator@^7.12.1", "@babel/generator@^7.12.10", "@babel/generator@^7.8.3": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.10.tgz#2b188fc329fb8e4f762181703beffc0fe6df3460" + integrity sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww== dependencies: - "@babel/types" "^7.12.5" + "@babel/types" "^7.12.10" jsesc "^2.5.1" source-map "^0.5.0" "@babel/helper-annotate-as-pure@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" - integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz#54ab9b000e60a93644ce17b3f37d313aaf1d115d" + integrity sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.10" "@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": version "7.10.4" @@ -692,11 +670,11 @@ "@babel/types" "^7.10.4" "@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz#b158817a3165b5faa2047825dfa61970ddcc16cf" + integrity sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.10" "@babel/helper-hoist-variables@^7.10.4": version "7.10.4" @@ -735,11 +713,11 @@ lodash "^4.17.19" "@babel/helper-optimise-call-expression@^7.10.4": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.7.tgz#7f94ae5e08721a49467346aa04fd22f750033b9c" - integrity sha512-I5xc9oSJ2h59OwyUqjv95HRyzxj53DAubUERgQMrpcCEYQyToeHA+NEcUEsVWB4j53RDeskeBJ0SgRAYHDBckw== + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz#94ca4e306ee11a7dd6e9f42823e2ac6b49881e2d" + integrity sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ== dependencies: - "@babel/types" "^7.12.7" + "@babel/types" "^7.12.10" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.10.4" @@ -824,10 +802,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.12.3", "@babel/parser@^7.12.7", "@babel/parser@^7.8.3": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.7.tgz#fee7b39fe809d0e73e5b25eecaf5780ef3d73056" - integrity sha512-oWR02Ubp4xTLCAqPRiNIuMVgNO5Aif/xpXtabhzW2HWUD47XJsAB4Zd/Rg30+XeQA3juXigV7hlquOTmwqLiwg== +"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.12.10", "@babel/parser@^7.12.3", "@babel/parser@^7.12.7", "@babel/parser@^7.8.3": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.10.tgz#824600d59e96aea26a5a2af5a9d812af05c3ae81" + integrity sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA== "@babel/plugin-proposal-async-generator-functions@^7.12.1": version "7.12.1" @@ -1272,9 +1250,9 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-typeof-symbol@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz#9ca6be343d42512fbc2e68236a82ae64bc7af78a" - integrity sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q== + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz#de01c4c8f96580bd00f183072b0d0ecdcf0dec4b" + integrity sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" @@ -1408,25 +1386,25 @@ "@babel/parser" "^7.12.7" "@babel/types" "^7.12.7" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.7", "@babel/traverse@^7.8.3": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.7.tgz#572a722408681cef17d6b0bef69ef2e728ca69f1" - integrity sha512-nMWaqsQEeSvMNypswUDzjqQ+0rR6pqCtoQpsqGJC4/Khm9cISwPTSpai57F6/jDaOoEGz8yE/WxcO3PV6tKSmQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.10", "@babel/traverse@^7.12.5", "@babel/traverse@^7.8.3": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.10.tgz#2d1f4041e8bf42ea099e5b2dc48d6a594c00017a" + integrity sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" + "@babel/generator" "^7.12.10" "@babel/helper-function-name" "^7.10.4" "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.7" - "@babel/types" "^7.12.7" + "@babel/parser" "^7.12.10" + "@babel/types" "^7.12.10" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.7.tgz#6039ff1e242640a29452c9ae572162ec9a8f5d13" - integrity sha512-MNyI92qZq6jrQkXvtIiykvl4WtoRrVV9MPn+ZfsoEENjiWcBQ3ZSHrkxnJWgWtLX3XXqX5hrSQ+X69wkmesXuQ== +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.10", "@babel/types@^7.12.5", "@babel/types@^7.12.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.10.tgz#7965e4a7260b26f09c56bcfcb0498af1f6d9b260" + integrity sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw== dependencies: "@babel/helper-validator-identifier" "^7.10.4" lodash "^4.17.19" @@ -1478,10 +1456,10 @@ resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-11.0.0.tgz#719cf05fcc1abb6533610a2e0f5dd1e61eac14fe" integrity sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ== -"@ctrl/tinycolor@^3.1.6": - version "3.1.7" - resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.1.7.tgz#1585f67629882002a9f8e15a2941c9a4321bf80c" - integrity sha512-/0C6fjXbCwu22k8mMsKRSAo9zgu61d2p75Or9IuIC0Vu5CWN88t2QHK93LhNnxnqHWf5SFwFU28w9cKfTmnfvg== +"@ctrl/tinycolor@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.3.1.tgz#fa0efcf813daa43f8a6aef3ddaa80f7e66f1278e" + integrity sha512-jUJrjU62MUgHDSu5JfONfgRM2V7GfN5KknsygfIbxwRZXGeayIzxk4O9GiYgEAr9DG5HJThTF5+a5x3wtrOKzQ== "@evocateur/libnpmaccess@^3.1.2": version "3.1.2" @@ -2495,12 +2473,12 @@ jquery "3.5.0" replace-in-file "^4.1.3" -"@ngtools/webpack@11.0.2": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-11.0.2.tgz#d9513854d474fe09350ce705d04fee38ffb8f0c7" - integrity sha512-GbNP6HMBVoee2CkYW/pknprFCeiOLz4FGE06yr4m0700c1i6wuX7AzyHfBcLGAIP6nVblNOT3eh5M41b3cDf8g== +"@ngtools/webpack@11.0.4": + version "11.0.4" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-11.0.4.tgz#fd80a8b7d648ddb8e56d73404e6b673903d2d365" + integrity sha512-MAV7inQmsMISTnDcXwyRX5oJZx8F7K/tZRLJciQwkM0DqZyq8fI9KDRwBcmYeQ+J0mSJV9LUVdExmpulpkywqw== dependencies: - "@angular-devkit/core" "11.0.2" + "@angular-devkit/core" "11.0.4" enhanced-resolve "5.3.1" webpack-sources "2.0.1" @@ -2512,30 +2490,23 @@ tslib "^1.9.0" "@ngxs/devtools-plugin@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@ngxs/devtools-plugin/-/devtools-plugin-3.7.0.tgz#5b6b3e63411da527fcee1e8280714e1b95a838c7" - integrity sha512-jjq91AbnnhzSm4QRUd7M0Y+HnUYnsSTVwUy8c1BsH8rGQ9c77xIveQaF2UBngPaDKQzTyzdVO2rV7twy3W2/fg== + version "3.7.1" + resolved "https://registry.yarnpkg.com/@ngxs/devtools-plugin/-/devtools-plugin-3.7.1.tgz#e0abb97f0fb239236b135f15b82704289c96774b" + integrity sha512-tZ5dVrgHDaOK0NMuSy3eesqwCXncF7Tm2bO/5cSvgSUXCKuU8UfWKxvP/N/Wcz5V5uaUIdOY1bnF6ZdeAMVzGQ== dependencies: tslib "^1.9.0" "@ngxs/logger-plugin@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@ngxs/logger-plugin/-/logger-plugin-3.7.0.tgz#a27d6bb27360fc2677773c57868740b8cd33cc41" - integrity sha512-yr3NXXJEqJnxSuKiHaTbNmoprKKcrIS1PUIlOm9nvKsOmyrGskxu+MYCzUifemXDIyXSP2u0OBNPrVUumcXyhg== - dependencies: - tslib "^1.9.0" - -"@ngxs/router-plugin@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@ngxs/router-plugin/-/router-plugin-3.7.0.tgz#9d0595d8ec12e6143eb9f2f726fcc7cdec8cd635" - integrity sha512-nmArryNIBLWqIKLWelOQhgxEC3evLPDNDkE+PEYvwoASC4NP5rHIqJv0borJAWBCwo10t5wPeT1417vBQex5aQ== + version "3.7.1" + resolved "https://registry.yarnpkg.com/@ngxs/logger-plugin/-/logger-plugin-3.7.1.tgz#045b1b7efbef82d47488f925be8af77cf66ee906" + integrity sha512-+iUwPnKFa0SPvT5duzPKaRZvql49lWPh5/kxE7U6BLnEZd87MrVUmVRDWalyvyiw7/ZiYeEk1aM8OgkmMKgwnQ== dependencies: tslib "^1.9.0" "@ngxs/store@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@ngxs/store/-/store-3.7.0.tgz#e46387219dae610c685accc119ae42e351afcaa4" - integrity sha512-w9fG/DhKBgH1VJMKSoeNW9x9ycD9/Dzy+VkpFD8Jv0JBNX0MRgP+5KQQe3ZKwnJ+7S0UV/99JvJaWgxc/WOvPw== + version "3.7.1" + resolved "https://registry.yarnpkg.com/@ngxs/store/-/store-3.7.1.tgz#3333379eb36cfe475d019b6c894b263ea515b8a5" + integrity sha512-Qg4rkF8XoIg/E2SGUfBbr4JmR8ZbRfeg1X++fF0HJymK1PtbIxtEXQXm7VTH0+GSmYDCwPJb8Im9dZHGZWF5ww== dependencies: tslib "^1.9.0" @@ -2573,21 +2544,26 @@ mkdirp "^1.0.4" "@octokit/auth-token@^2.4.0": - version "2.4.3" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.3.tgz#b868b5f2366533a7e62933eaa1181a8924228cc4" - integrity sha512-fdGoOQ3kQJh+hrilc0Plg50xSfaCKOeYN9t6dpJKXN9BxhhfquL0OzoQXg3spLYymL5rm29uPeI3KEXRaZQ9zg== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.4.tgz#ee31c69b01d0378c12fd3ffe406030f3d94d3b56" + integrity sha512-LNfGu3Ro9uFAYh10MUZVaT7X2CnNm2C8IDQmabx+3DygYIQjs9FwzFAHN/0t6mu5HEPhxcb1XOuxdpY82vCg2Q== dependencies: - "@octokit/types" "^5.0.0" + "@octokit/types" "^6.0.0" "@octokit/endpoint@^6.0.1": - version "6.0.9" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.9.tgz#c6a772e024202b1bd19ab69f90e0536a2598b13e" - integrity sha512-3VPLbcCuqji4IFTclNUtGdp9v7g+nspWdiCUbK3+iPMjJCZ6LEhn1ts626bWLOn0GiDb6j+uqGvPpqLnY7pBgw== + version "6.0.10" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.10.tgz#741ce1fa2f4fb77ce8ebe0c6eaf5ce63f565f8e8" + integrity sha512-9+Xef8nT7OKZglfkOMm7IL6VwxXUQyR7DUSU0LH/F7VNqs8vyd7es5pTfz9E7DwUIx7R3pGscxu1EBhYljyu7Q== dependencies: - "@octokit/types" "^5.0.0" + "@octokit/types" "^6.0.0" is-plain-object "^5.0.0" universal-user-agent "^6.0.0" +"@octokit/openapi-types@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-2.0.0.tgz#6d8f8ad9db3b75a39115f5def2654df8bed39f28" + integrity sha512-J4bfM7lf8oZvEAdpS71oTvC1ofKxfEZgU5vKVwzZKi4QPiL82udjpseJwxPid9Pu2FNmyRQOX4iEj6W1iOSnPw== + "@octokit/plugin-enterprise-rest@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" @@ -2623,22 +2599,22 @@ once "^1.4.0" "@octokit/request-error@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.3.tgz#b51b200052bf483f6fa56c9e7e3aa51ead36ecd8" - integrity sha512-GgD5z8Btm301i2zfvJLk/mkhvGCdjQ7wT8xF9ov5noQY8WbKZDH9cOBqXzoeKd1mLr1xH2FwbtGso135zGBgTA== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.4.tgz#07dd5c0521d2ee975201274c472a127917741262" + integrity sha512-LjkSiTbsxIErBiRh5wSZvpZqT4t0/c9+4dOe0PII+6jXR+oj/h66s7E4a/MghV7iT8W9ffoQ5Skoxzs96+gBPA== dependencies: - "@octokit/types" "^5.0.1" + "@octokit/types" "^6.0.0" deprecation "^2.0.0" once "^1.4.0" "@octokit/request@^5.2.0": - version "5.4.10" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.10.tgz#402d2c53768bde12b99348329ba4129746aebb9c" - integrity sha512-egA49HkqEORVGDZGav1mh+VD+7uLgOxtn5oODj6guJk0HCy+YBSYapFkSLFgeYj3Fr18ZULKGURkjyhkAChylw== + version "5.4.12" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.12.tgz#b04826fa934670c56b135a81447be2c1723a2ffc" + integrity sha512-MvWYdxengUWTGFpfpefBBpVmmEYfkwMoxonIB3sUGp5rhdgwjXL1ejo6JbgzG/QD9B/NYt/9cJX1pxXeSIUCkg== dependencies: "@octokit/endpoint" "^6.0.1" "@octokit/request-error" "^2.0.0" - "@octokit/types" "^5.0.0" + "@octokit/types" "^6.0.3" deprecation "^2.0.0" is-plain-object "^5.0.0" node-fetch "^2.6.1" @@ -2674,11 +2650,12 @@ dependencies: "@types/node" ">= 8" -"@octokit/types@^5.0.0", "@octokit/types@^5.0.1": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-5.5.0.tgz#e5f06e8db21246ca102aa28444cdb13ae17a139b" - integrity sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ== +"@octokit/types@^6.0.0", "@octokit/types@^6.0.3": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.1.1.tgz#bc88b3eb5f447b025a2a1a8177a72db216e8d4ca" + integrity sha512-btm3D6S7VkRrgyYF31etUtVY/eQ1KzrNRqhFt25KSe2mKlXuLXJilglRC6eDA2P6ou94BUnk/Kz5MPEolXgoiw== dependencies: + "@octokit/openapi-types" "^2.0.0" "@types/node" ">= 8" "@rollup/plugin-commonjs@^15.0.0": @@ -2722,13 +2699,13 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@schematics/angular@11.0.2": - version "11.0.2" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-11.0.2.tgz#63041d1931fe2d56135d730a6e43937a3eef4bab" - integrity sha512-tUIuCYJUzHYuiXGJ2KCuwxMocS56kPHaM8+neVYWwWbOxKzLZXv80gMm/pIWxrqUDCkIUi3yb4ienudFhgQLYg== +"@schematics/angular@11.0.4": + version "11.0.4" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-11.0.4.tgz#36268ebda718c4f395457d2eea874fda9c469402" + integrity sha512-LwBD9TIoLy9XqqInJvlN4BHtPyJExyeorNiOp6rXb/wafuDbvZ+9kY9GWZTY1auVo5PNKqErfxr74ydA3FFb9g== dependencies: - "@angular-devkit/core" "11.0.2" - "@angular-devkit/schematics" "11.0.2" + "@angular-devkit/core" "11.0.4" + "@angular-devkit/schematics" "11.0.4" jsonc-parser "2.3.1" "@schematics/angular@~10.0.5": @@ -2747,13 +2724,13 @@ "@angular-devkit/core" "10.1.7" "@angular-devkit/schematics" "10.1.7" -"@schematics/update@0.1100.2": - version "0.1100.2" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.1100.2.tgz#d3a5c726d434d6c8ff04db8836f829299ca7108a" - integrity sha512-pETCmQylIQ7RM+8uqDkI3KfOaX5H7nuzmMXby28zdLPMZniYti0gJxieiVFhvdz2Ot2Axj0hznfmraFgC9mQMw== +"@schematics/update@0.1100.4": + version "0.1100.4" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.1100.4.tgz#b67efdb39396ddcacef97de008100944af3d1556" + integrity sha512-YwFtgxCQQkYC89IC7dfshyGr0roE6bpp5HgpQLdS/AOjHeZKo7/SPdM0W4ddB+Fml1Fo6v4eFG/Ia9oR7qNv1A== dependencies: - "@angular-devkit/core" "11.0.2" - "@angular-devkit/schematics" "11.0.2" + "@angular-devkit/core" "11.0.4" + "@angular-devkit/schematics" "11.0.4" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" npm-package-arg "^8.0.0" @@ -2836,9 +2813,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.15.tgz#db9e4238931eb69ef8aab0ad6523d4d4caa39d03" - integrity sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A== + version "7.11.0" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.0.tgz#b9a1efa635201ba9bc850323a8793ee2d36c04a0" + integrity sha512-kSjgDMZONiIfSH1Nxcr5JIRMwUetDki63FSQfpTCz8ogF3Ulqm8+mr5f78dUYs6vMiB6gBusQqfQmBvHZj/lwg== dependencies: "@babel/types" "^7.3.0" @@ -2915,9 +2892,9 @@ integrity sha512-AzfesNFLvOs6Q1mHzIsVJXSeUnqVh4ZHG8ngygKJfbkcSLwzrBVm/LKa+mR8KrOfnWtUL47112gde1MC0IXqpQ== "@types/jest@26.x": - version "26.0.15" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.15.tgz#12e02c0372ad0548e07b9f4e19132b834cb1effe" - integrity sha512-s2VMReFXRg9XXxV+CW9e5Nz8fH2K1aEhwgjUqPPbQd7g95T0laAcvLv032EhFHIa5GHsZ8W7iJEQVaJq6k3Gog== + version "26.0.19" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.19.tgz#e6fa1e3def5842ec85045bd5210e9bb8289de790" + integrity sha512-jqHoirTG61fee6v6rwbnEuKhpSKih0tuhqeFbCmMmErhtu3BYlOZaXWjffgOstMM4S/3iQD31lI5bGLTrs97yQ== dependencies: jest-diff "^26.0.0" pretty-format "^26.0.0" @@ -2953,14 +2930,14 @@ integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== "@types/node@*", "@types/node@>= 8": - version "14.14.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.9.tgz#04afc9a25c6ff93da14deabd65dc44485b53c8d6" - integrity sha512-JsoLXFppG62tWTklIoO4knA+oDTYsmqWxHRvd4lpmfQRNhX6osheUOWETP2jMoV/2bEHuMra8Pp3Dmo/stBFcw== + version "14.14.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.13.tgz#9e425079799322113ae8477297ae6ef51b8e0cdf" + integrity sha512-vbxr0VZ8exFMMAjCW8rJwaya0dMCDyYW2ZRdTyjtrCvJoENMpdUHOT/eTzvgyA5ZnqRZ/sI0NwqAxNHKYokLJQ== "@types/node@^12.11.1": - version "12.19.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.6.tgz#fbf249fa46487dd8c7386d785231368b92a33a53" - integrity sha512-U2VopDdmBoYBmtm8Rz340mvvSz34VgX/K9+XCuckvcLGMkt3rbMX8soqFOikIPlPBc5lmw8By9NUK7bEFSBFlQ== + version "12.19.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.9.tgz#990ad687ad8b26ef6dcc34a4f69c33d40c95b679" + integrity sha512-yj0DOaQeUrk3nJ0bd3Y5PeDRJ6W0r+kilosLA+dzF3dola/o9hxhMSg2sFvVcA2UHS5JSOsZp4S0c1OEXc4m1Q== "@types/node@^8.0.31": version "8.10.66" @@ -3050,9 +3027,9 @@ "@types/yargs-parser" "*" "@types/yargs@^15.0.0": - version "15.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.10.tgz#0fe3c8173a0d5c3e780b389050140c3f5ea6ea74" - integrity sha512-z8PNtlhrj7eJNLmrAivM7rjBESG6JwC5xP3RVk12i/8HVP7Xnx/sEmERnRImyEuUaJfO942X0qMOYsoupaJbZQ== + version "15.0.11" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.11.tgz#361d7579ecdac1527687bcebf9946621c12ab78c" + integrity sha512-jfcNBxHFYJ4nPIacsi3woz1+kvUO6s1CyeEhtnDHBjHUMNj5UlW2GynmnSgiJJEdNg9yW5C8lfoNRZrHGv5EqA== dependencies: "@types/yargs-parser" "*" @@ -4010,21 +3987,21 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.14.6, browserslist@^4.7.0, browserslist@^4.9.1: - version "4.14.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.7.tgz#c071c1b3622c1c2e790799a37bb09473a4351cb6" - integrity sha512-BSVRLCeG3Xt/j/1cCGj1019Wbty0H+Yvu2AOuZSuoaUWn3RatbL33Cxk+Q4jRMRAbOm0p7SLravLjpnT6s0vzQ== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.15.0, browserslist@^4.7.0, browserslist@^4.9.1: + version "4.16.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.0.tgz#410277627500be3cb28a1bfe037586fbedf9488b" + integrity sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ== dependencies: - caniuse-lite "^1.0.30001157" + caniuse-lite "^1.0.30001165" colorette "^1.2.1" - electron-to-chromium "^1.3.591" + electron-to-chromium "^1.3.621" escalade "^3.1.1" - node-releases "^1.1.66" + node-releases "^1.1.67" browserstack@^1.5.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.6.0.tgz#5a56ab90987605d9c138d7a8b88128370297f9bf" - integrity sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw== + version "1.6.1" + resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.6.1.tgz#e051f9733ec3b507659f395c7a4765a1b1e358b3" + integrity sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw== dependencies: https-proxy-agent "^2.2.1" @@ -4171,9 +4148,9 @@ cache-base@^1.0.1: unset-value "^1.0.0" cacheable-lookup@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz#049fdc59dffdd4fc285e8f4f82936591bd59fec3" - integrity sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w== + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== cacheable-request@^7.0.1: version "7.0.1" @@ -4286,10 +4263,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001157: - version "1.0.30001159" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001159.tgz#bebde28f893fa9594dadcaa7d6b8e2aa0299df20" - integrity sha512-w9Ph56jOsS8RL20K9cLND3u/+5WASWdhC/PPrf+V3/HsM3uHOavWOR1Xzakbv4Puo/srmPHudkmCRWM7Aq+/UA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001165: + version "1.0.30001166" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001166.tgz#ca73e8747acfd16a4fd6c4b784f1b995f9698cf8" + integrity sha512-nCL4LzYK7F4mL0TjEMeYavafOGnBa98vTudH5c8lW9izUjnB99InG6pmC1ElAI1p0GlyZajv4ltUdFXvOHIl1A== canonical-path@1.0.0: version "1.0.0" @@ -4656,9 +4633,9 @@ commander@^2.11.0, commander@^2.12.1, commander@^2.20.0: integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" - integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== commitizen@^4.0.3: version "4.2.2" @@ -5048,11 +5025,11 @@ copy-webpack-plugin@6.2.1: webpack-sources "^1.4.3" core-js-compat@^3.6.2: - version "3.7.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.7.0.tgz#8479c5d3d672d83f1f5ab94cf353e57113e065ed" - integrity sha512-V8yBI3+ZLDVomoWICO6kq/CD28Y4r1M7CWeO4AGpMdMfseu8bkSubBmUPySMGKRTS+su4XQ07zUkAsiu9FCWTg== + version "3.8.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.1.tgz#8d1ddd341d660ba6194cbe0ce60f4c794c87a36e" + integrity sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ== dependencies: - browserslist "^4.14.6" + browserslist "^4.15.0" semver "7.0.0" core-js@3.6.5: @@ -5223,10 +5200,10 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" -css-tree@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.1.tgz#30b8c0161d9fb4e9e2141d762589b6ec2faebd2e" - integrity sha512-NVN42M2fjszcUNpDbdkvutgQSlFYsr1z7kqeuCagHnNLBfYor6uP1WL1KrkmdYZ5Y1vTBCIOI/C/+8T98fJ71w== +css-tree@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" + integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== dependencies: mdn-data "2.0.14" source-map "^0.6.1" @@ -5332,11 +5309,11 @@ cssnano@4.1.10: postcss "^7.0.0" csso@^4.0.2: - version "4.1.1" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.1.1.tgz#e0cb02d6eb3af1df719222048e4359efd662af13" - integrity sha512-Rvq+e1e0TFB8E8X+8MQjHSY6vtol45s5gxtLI/018UsAn2IBMmwNEZRM/h+HVnAJRHjasLIKKUO3uvoMM28LvA== + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: - css-tree "^1.0.0" + css-tree "^1.1.2" cssom@^0.4.1: version "0.4.4" @@ -5772,9 +5749,9 @@ domelementtype@1: integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971" - integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" + integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== domexception@^1.0.1: version "1.0.1" @@ -5833,10 +5810,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.591: - version "1.3.603" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.603.tgz#1b71bec27fb940eccd79245f6824c63d5f7e8abf" - integrity sha512-J8OHxOeJkoSLgBXfV9BHgKccgfLMHh+CoeRo6wJsi6m0k3otaxS/5vrHpMNSEYY4MISwewqanPOuhAtuE8riQQ== +electron-to-chromium@^1.3.621: + version "1.3.626" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.626.tgz#48acdf322be07feb2c1330ba05e4bf6327f721a3" + integrity sha512-7CanEvJx74EnvjHu1X8gf93KieyxvFLnqOXAH/ddjWD4RrUZYqdg3pykrQ/7t6SLI7DTsp4tfQXEfzeK5t6oAw== elliptic@^6.5.3: version "6.5.3" @@ -6096,9 +6073,9 @@ estree-walker@^1.0.1: integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== estree-walker@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.1.tgz#f8e030fb21cefa183b44b7ad516b747434e7a3e0" - integrity sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== esutils@^2.0.2: version "2.0.3" @@ -6551,9 +6528,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" - integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== + version "1.13.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.1.tgz#5f69b813376cee4fd0474a3aba835df04ab763b7" + integrity sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg== font-awesome@^4.7.0: version "4.7.0" @@ -6818,9 +6795,9 @@ git-up@^4.0.0: parse-url "^5.0.0" git-url-parse@^11.1.2: - version "11.4.0" - resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.4.0.tgz#f2bb1f2b00f05552540e95a62e31399a639a6aa6" - integrity sha512-KlIa5jvMYLjXMQXkqpFzobsyD/V2K5DRHl5OAf+6oDFPlPLxrGDVQlIdI63c4/Kt6kai4kALENSALlzTGST3GQ== + version "11.4.3" + resolved "https://registry.yarnpkg.com/git-url-parse/-/git-url-parse-11.4.3.tgz#1610284edf1f14964180f5b3399ec68b692cfd87" + integrity sha512-LZTTk0nqJnKN48YRtOpR8H5SEfp1oM2tls90NuZmBxN95PnCvmuXGzqQ4QmVirBgKx2KPYfPGteX3/raWjKenQ== dependencies: git-up "^4.0.0" @@ -6969,9 +6946,9 @@ globby@^9.2.0: slash "^2.0.0" got@^11.5.2: - version "11.8.0" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.0.tgz#be0920c3586b07fd94add3b5b27cb28f49e6545f" - integrity sha512-k9noyoIIY9EejuhaBNLyZ31D5328LeqnyPNXJQb2XlJZcKakLqN5m6O/ikhq/0lw56kUYS54fVm+D1x57YC9oQ== + version "11.8.1" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.1.tgz#df04adfaf2e782babb3daabc79139feec2f7e85d" + integrity sha512-9aYdZL+6nHmvJwHALLwKSUZ0hMwGaJGYv3hoPLPgnT8BoBXm1SjnZeky+91tfwJaDzun2s4RsBRy48IEYv2q2Q== dependencies: "@sindresorhus/is" "^4.0.0" "@szmarczak/http-timer" "^4.0.5" @@ -7178,9 +7155,9 @@ html-encoding-sniffer@^1.0.2: whatwg-encoding "^1.0.1" html-entities@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" - integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== + version "1.3.3" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.3.tgz#3dca638a43ee7de316fc23067398491152ad4736" + integrity sha512-/VulV3SYni1taM7a4RMdceqzJWR39gpZHjBwUnsCFKWV/GJkD14CJ5F7eWcZozmHJK0/f/H5U3b3SiPkuvxMgg== html-escaper@^2.0.0: version "2.0.2" @@ -7453,11 +7430,16 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@1.3.5, ini@^1.3.2, ini@^1.3.4: +ini@1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== +ini@^1.3.2, ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + init-package-json@^1.10.3: version "1.10.3" resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe" @@ -7582,9 +7564,11 @@ is-accessor-descriptor@^1.0.0: kind-of "^6.0.0" is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + dependencies: + call-bind "^1.0.0" is-arrayish@^0.2.1: version "0.2.1" @@ -7640,9 +7624,9 @@ is-color-stop@^1.0.0: rgba-regex "^1.0.0" is-core-module@^2.0.0, is-core-module@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" - integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== dependencies: has "^1.0.3" @@ -7762,9 +7746,9 @@ is-module@^1.0.0: integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= is-negative-zero@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" - integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== is-number@^3.0.0: version "3.0.0" @@ -8463,9 +8447,9 @@ js-tokens@^4.0.0: integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -8708,7 +8692,7 @@ less-loader@7.0.2: loader-utils "^2.0.0" schema-utils "^3.0.0" -less@3.12.2, less@^3.10.3: +less@3.12.2: version "3.12.2" resolved "https://registry.yarnpkg.com/less/-/less-3.12.2.tgz#157e6dd32a68869df8859314ad38e70211af3ab4" integrity sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q== @@ -8723,6 +8707,21 @@ less@3.12.2, less@^3.10.3: native-request "^1.0.5" source-map "~0.6.0" +less@^3.10.3: + version "3.13.0" + resolved "https://registry.yarnpkg.com/less/-/less-3.13.0.tgz#6a47bb19d97edcf7a53d444b099275dd6b17c85a" + integrity sha512-uPhr9uoSGVKKYVGz0rXcYBK1zjwcIWRGcbnSgNt66XuIZYrYPaQiS+LeUOvqedBwrwdBYYaLqSff5ytGYuT7rA== + dependencies: + tslib "^1.10.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + native-request "^1.0.5" + source-map "~0.6.0" + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -8930,9 +8929,9 @@ log-symbols@^4.0.0: chalk "^4.0.0" loglevel@^1.6.8: - version "1.7.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" - integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ== + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== lolex@^5.0.0: version "5.1.2" @@ -9458,11 +9457,16 @@ ms@2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -ms@2.1.2, ms@^2.0.0, ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.0.0, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" @@ -9585,9 +9589,9 @@ ng-packagr@^11.0.1: terser "^5.0.0" ng-zorro-antd@^10.1.1: - version "10.1.2" - resolved "https://registry.yarnpkg.com/ng-zorro-antd/-/ng-zorro-antd-10.1.2.tgz#43ff5359a2a9a89f97f1344cece4f6b279ae2953" - integrity sha512-T6ph9ITeTS0ohX+VsyZaVrls53fgyTMJ0RFddJCK2WyQgg+BTznlSw24fJWgdTcocoIuPSBuVO27ecyZwN6Hhw== + version "10.2.1" + resolved "https://registry.yarnpkg.com/ng-zorro-antd/-/ng-zorro-antd-10.2.1.tgz#06d9c2db7f92bdd560c98c201114b2fc2318af23" + integrity sha512-G1w/Gs2Qgsoyf9c+t1uyQkZ07ayiOoH4waS8CP+IEvlCe0fZ02V0IFjS6NLrTpDxw7qDBIykI+qcWEY14GIF8A== dependencies: "@angular/cdk" "^10.2.4" "@ant-design/icons-angular" "^10.0.0" @@ -9698,7 +9702,7 @@ node-notifier@^6.0.0: shellwords "^0.1.1" which "^1.3.1" -node-releases@^1.1.66: +node-releases@^1.1.67: version "1.1.67" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== @@ -9923,17 +9927,17 @@ object-copy@^0.1.0: kind-of "^3.0.3" object-inspect@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== object-is@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.3.tgz#2e3b9e65560137455ee3bd62aec4d90a2ea1cc81" - integrity sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg== + version "1.1.4" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.4.tgz#63d6c83c00a43f4cbc9434eb9757c8a5b8565068" + integrity sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -9958,12 +9962,13 @@ object.assign@^4.1.0, object.assign@^4.1.1: object-keys "^1.1.1" object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== + version "2.1.1" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" + integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.1" object.pick@^1.3.0: version "1.3.0" @@ -9973,13 +9978,13 @@ object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" + integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.1" has "^1.0.3" obuf@^1.0.0, obuf@^1.1.2: @@ -10179,11 +10184,11 @@ p-limit@^2.0.0, p-limit@^2.2.0: p-try "^2.0.0" p-limit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" - integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - p-try "^2.0.0" + yocto-queue "^0.1.0" p-locate@^2.0.0: version "2.0.0" @@ -10974,9 +10979,9 @@ prelude-ls@~1.1.2: integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= prettier@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.0.tgz#8a03c7777883b29b37fb2c4348c66a78e980418b" - integrity sha512-yYerpkvseM4iKD/BXLYUkQV5aKt4tQPqaGW6EsZjzyu0r7sVZZNPJW4Y8MyKmicp6t42XUPcBVA+H6sB3gqndw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" + integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== pretty-format@26.x, pretty-format@^26.0.0, pretty-format@^26.6.2: version "26.6.2" @@ -11804,9 +11809,9 @@ rollup@2.32.1: fsevents "~2.1.2" rollup@^2.8.0: - version "2.33.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.33.3.tgz#ae72ce31f992b09a580072951bfea76e9df17342" - integrity sha512-RpayhPTe4Gu/uFGCmk7Gp5Z9Qic2VsqZ040G+KZZvsZYdcuWaJg678JeDJJvJeEQXminu24a2au+y92CUWVd+w== + version "2.35.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.35.1.tgz#e6bc8d10893556a638066f89e8c97f422d03968c" + integrity sha512-q5KxEyWpprAIcainhVy6HfRttD9kutQpHbeqDTWnqAFNJotiojetK6uqmcydNMymBEtC4I8bCYR+J3mTMqeaUA== optionalDependencies: fsevents "~2.1.2" @@ -11916,9 +11921,9 @@ sass@1.27.0: chokidar ">=2.0.0 <4.0.0" sass@^1.23.0: - version "1.29.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.29.0.tgz#ec4e1842c146d8ea9258c28c141b8c2b7c6ab7f1" - integrity sha512-ZpwAUFgnvAUCdkjwPREny+17BpUj8nh5Yr6zKPGtLNTLrmtoRYIjm7njP24COhjJldjwW1dcv52Lpf4tNZVVRA== + version "1.30.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.30.0.tgz#60bbbbaf76ba10117e61c6c24f00161c3d60610e" + integrity sha512-26EUhOXRLaUY7+mWuRFqGeGGNmhB1vblpTENO1Z7mAzzIZeVxZr9EZoaY1kyGLFWdSOZxRMAufiN2mkbO6dAlw== dependencies: chokidar ">=2.0.0 <4.0.0" @@ -12014,11 +12019,18 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.3.2, semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2: +semver@7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -12382,9 +12394,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" - integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== + version "3.0.7" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== spdy-transport@^3.0.0: version "3.0.0" @@ -12482,9 +12494,9 @@ stable@^0.1.8: integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-utils@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.3.tgz#db7a475733b5b8bf6521907b18891d29006f7751" - integrity sha512-WldO+YmqhEpjp23eHZRhOT1NQF51STsbxZ+/AdpFD+EhheFxAe5d0WoK4DQVJkSHacPrJJX3OqRAl9CgHf78pg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.4.tgz#4b600971dcfc6aed0cbdf2a8268177cc916c87c8" + integrity sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w== dependencies: escape-string-regexp "^2.0.0" @@ -12716,10 +12728,10 @@ stylehacks@^4.0.0: postcss "^7.0.0" postcss-selector-parser "^3.0.0" -stylus-loader@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-4.1.1.tgz#0e94f5d6274932a2dad054d1a736b32146ac7a99" - integrity sha512-Vnm7J/nIs/P6swIrdwJW/dflhsCOiFmb1U3PeQ6phRtg1soPLN4uKnnL7AtGIJDe173elbtYIXVzmCyF493CfA== +stylus-loader@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-4.3.1.tgz#8b4e749294d9fe0729c2e5e1f04cbf87e1c941aa" + integrity sha512-apDYJEM5ZpOAWbWInWcsbtI8gHNr/XYVcSY/tWqOUPt7M5tqhtwXVsAkgyiVjhuvw2Yrjq474a9H+g4d047Ebw== dependencies: fast-glob "^3.2.4" klona "^2.0.4" @@ -12834,9 +12846,9 @@ tapable@^1.0.0, tapable@^1.1.3: integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tapable@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.1.1.tgz#b01cc1902d42a7bb30514e320ce21c456f72fd3f" - integrity sha512-Wib1S8m2wdpLbmQz0RBEVosIyvb/ykfKXf3ZIDqvWoMg/zTNm6G/tDSuUM61J1kNCDXWJrLHGSFeMhAG+gAGpQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" + integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: version "4.4.13" @@ -12950,9 +12962,9 @@ terser@^4.1.2: source-map-support "~0.5.12" terser@^5.0.0, terser@^5.3.4: - version "5.5.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.0.tgz#1406fcb4d4bc517add3b22a9694284c040e33448" - integrity sha512-eopt1Gf7/AQyPhpygdKePTzaet31TvQxXvrf7xYUvD/d8qkCJm4SKPDzu+GHK5ZaYTn8rvttfqaZc3swK21e5g== + version "5.5.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289" + integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ== dependencies: commander "^2.20.0" source-map "~0.7.2" @@ -13338,9 +13350,9 @@ typescript@^3.5.2, typescript@~3.9.2: integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== uglify-js@^3.1.4: - version "3.12.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.12.0.tgz#b943f129275c41d435eb54b643bbffee71dccf57" - integrity sha512-8lBMSkFZuAK7gGF8LswsXmir8eX8d2AAMOnxSDWjKBx/fBR6MypQjs78m6ML9zQVp1/hD4TBdfeMZMC7nW1TAA== + version "3.12.1" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.12.1.tgz#78307f539f7b9ca5557babb186ea78ad30cc0375" + integrity sha512-o8lHP20KjIiQe5b/67Rh68xEGRrc2SRsCuuoYclXXoC74AfSRGblU1HKzJWH3HxPZ+Ort85fWHpSX7KwBUC9CQ== uid-number@0.0.6: version "0.0.6" @@ -14003,9 +14015,9 @@ ws@^6.2.1: async-limiter "~1.0.0" ws@^7.0.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.0.tgz#a5dd76a24197940d4a8bb9e0e152bb4503764da7" - integrity sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ== + version "7.4.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.1.tgz#a333be02696bd0e54cea0434e21dcc8a9ac294bb" + integrity sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ== xml-name-validator@^3.0.0: version "3.0.0" @@ -14043,9 +14055,9 @@ xxhashjs@^0.2.1: cuint "^0.2.2" y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== y18n@^5.0.5: version "5.0.5" @@ -14164,9 +14176,9 @@ yargs@^15.0.2, yargs@^15.3.1: yargs-parser "^18.1.2" yargs@^16.1.1: - version "16.1.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.1.1.tgz#5a4a095bd1ca806b0a50d0c03611d38034d219a1" - integrity sha512-hAD1RcFP/wfgfxgMVswPE+z3tlPFtxG8/yWUrG2i17sTWGCGqWnxKcLTF4cUKDUK8fzokwsmO9H0TDkRbMHy8w== + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" escalade "^3.1.1" @@ -14181,6 +14193,11 @@ yn@^2.0.0: resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + zone.js@~0.10.2, zone.js@~0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.10.3.tgz#3e5e4da03c607c9dcd92e37dd35687a14a140c16" diff --git a/npm/packs/anchor-js/package.json b/npm/packs/anchor-js/package.json index d0c9e9c5c2..cd510b6dbc 100644 --- a/npm/packs/anchor-js/package.json +++ b/npm/packs/anchor-js/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/anchor-js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "anchor-js": "^4.2.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json index 7fd15f2807..efa40c47c6 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/aspnetcore.mvc.ui.theme.basic", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~4.0.1" + "@abp/aspnetcore.mvc.ui.theme.shared": "~4.1.0-rc.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json index 86fcedfc6a..5461f2bc81 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json @@ -1,24 +1,24 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/aspnetcore.mvc.ui.theme.shared", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui": "~4.0.1", - "@abp/bootstrap": "~4.0.1", - "@abp/bootstrap-datepicker": "~4.0.1", - "@abp/datatables.net-bs4": "~4.0.1", - "@abp/font-awesome": "~4.0.1", - "@abp/jquery-form": "~4.0.1", - "@abp/jquery-validation-unobtrusive": "~4.0.1", - "@abp/lodash": "~4.0.1", - "@abp/luxon": "~4.0.1", - "@abp/malihu-custom-scrollbar-plugin": "~4.0.1", - "@abp/select2": "~4.0.1", - "@abp/sweetalert": "~4.0.1", - "@abp/timeago": "~4.0.1", - "@abp/toastr": "~4.0.1" + "@abp/aspnetcore.mvc.ui": "~4.1.0-rc.2", + "@abp/bootstrap": "~4.1.0-rc.2", + "@abp/bootstrap-datepicker": "~4.1.0-rc.2", + "@abp/datatables.net-bs4": "~4.1.0-rc.2", + "@abp/font-awesome": "~4.1.0-rc.2", + "@abp/jquery-form": "~4.1.0-rc.2", + "@abp/jquery-validation-unobtrusive": "~4.1.0-rc.2", + "@abp/lodash": "~4.1.0-rc.2", + "@abp/luxon": "~4.1.0-rc.2", + "@abp/malihu-custom-scrollbar-plugin": "~4.1.0-rc.2", + "@abp/select2": "~4.1.0-rc.2", + "@abp/sweetalert": "~4.1.0-rc.2", + "@abp/timeago": "~4.1.0-rc.2", + "@abp/toastr": "~4.1.0-rc.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui/package-lock.json b/npm/packs/aspnetcore.mvc.ui/package-lock.json index ac4f52859e..07502870e8 100644 --- a/npm/packs/aspnetcore.mvc.ui/package-lock.json +++ b/npm/packs/aspnetcore.mvc.ui/package-lock.json @@ -1,6 +1,6 @@ { "name": "@abp/aspnetcore.mvc.ui", - "version": "4.0.1", + "version": "4.1.0-rc.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/npm/packs/aspnetcore.mvc.ui/package.json b/npm/packs/aspnetcore.mvc.ui/package.json index fb07222a2b..7787302e90 100644 --- a/npm/packs/aspnetcore.mvc.ui/package.json +++ b/npm/packs/aspnetcore.mvc.ui/package.json @@ -1,5 +1,5 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/aspnetcore.mvc.ui", "publishConfig": { "access": "public" diff --git a/npm/packs/blogging/package.json b/npm/packs/blogging/package.json index 307db1c47b..1f643356bb 100644 --- a/npm/packs/blogging/package.json +++ b/npm/packs/blogging/package.json @@ -1,14 +1,14 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/blogging", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~4.0.1", - "@abp/owl.carousel": "~4.0.1", - "@abp/prismjs": "~4.0.1", - "@abp/tui-editor": "~4.0.1" + "@abp/aspnetcore.mvc.ui.theme.shared": "~4.1.0-rc.2", + "@abp/owl.carousel": "~4.1.0-rc.2", + "@abp/prismjs": "~4.1.0-rc.2", + "@abp/tui-editor": "~4.1.0-rc.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/bootstrap-datepicker/package.json b/npm/packs/bootstrap-datepicker/package.json index efbf38d82d..ecac08c03a 100644 --- a/npm/packs/bootstrap-datepicker/package.json +++ b/npm/packs/bootstrap-datepicker/package.json @@ -1,5 +1,5 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/bootstrap-datepicker", "publishConfig": { "access": "public" diff --git a/npm/packs/bootstrap/package.json b/npm/packs/bootstrap/package.json index 164375ffaf..38c02e236f 100644 --- a/npm/packs/bootstrap/package.json +++ b/npm/packs/bootstrap/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/bootstrap", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "bootstrap": "^4.5.0", "bootstrap-v4-rtl": "4.4.1-2" }, diff --git a/npm/packs/chart.js/package.json b/npm/packs/chart.js/package.json index 1e62ba6da9..b01a0b74ac 100644 --- a/npm/packs/chart.js/package.json +++ b/npm/packs/chart.js/package.json @@ -1,5 +1,5 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/chart.js", "publishConfig": { "access": "public" diff --git a/npm/packs/clipboard/package.json b/npm/packs/clipboard/package.json index 176ff586c2..c606e7120f 100644 --- a/npm/packs/clipboard/package.json +++ b/npm/packs/clipboard/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/clipboard", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "clipboard": "^2.0.6" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/cms-kit/package.json b/npm/packs/cms-kit/package.json new file mode 100644 index 0000000000..db47499e43 --- /dev/null +++ b/npm/packs/cms-kit/package.json @@ -0,0 +1,11 @@ +{ + "version": "4.1.0-rc.2", + "name": "@abp/cms-kit", + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@abp/star-rating-svg": "~4.1.0-rc.2" + }, + "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" +} diff --git a/npm/packs/codemirror/package.json b/npm/packs/codemirror/package.json index ceda7bb494..c75a614d29 100644 --- a/npm/packs/codemirror/package.json +++ b/npm/packs/codemirror/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/codemirror", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "codemirror": "^5.54.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/core/package.json b/npm/packs/core/package.json index 5493768e63..f55e0354a9 100644 --- a/npm/packs/core/package.json +++ b/npm/packs/core/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/core", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/utils": "^4.0.1" + "@abp/utils": "^4.1.0-rc.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/cropperjs/package.json b/npm/packs/cropperjs/package.json index da2629c365..a97520b580 100644 --- a/npm/packs/cropperjs/package.json +++ b/npm/packs/cropperjs/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/cropperjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "cropperjs": "^1.5.7" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/datatables.net-bs4/package.json b/npm/packs/datatables.net-bs4/package.json index c2c84234d0..ab085bb996 100644 --- a/npm/packs/datatables.net-bs4/package.json +++ b/npm/packs/datatables.net-bs4/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/datatables.net-bs4", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/datatables.net": "~4.0.1", + "@abp/datatables.net": "~4.1.0-rc.2", "datatables.net-bs4": "^1.10.21" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/datatables.net/package.json b/npm/packs/datatables.net/package.json index f49c15f784..8552863eab 100644 --- a/npm/packs/datatables.net/package.json +++ b/npm/packs/datatables.net/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/datatables.net", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~4.0.1", + "@abp/jquery": "~4.1.0-rc.2", "datatables.net": "^1.10.21" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/docs/package.json b/npm/packs/docs/package.json index e5fd967521..4ceb75313e 100644 --- a/npm/packs/docs/package.json +++ b/npm/packs/docs/package.json @@ -1,15 +1,15 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/docs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/anchor-js": "~4.0.1", - "@abp/clipboard": "~4.0.1", - "@abp/malihu-custom-scrollbar-plugin": "~4.0.1", - "@abp/popper.js": "~4.0.1", - "@abp/prismjs": "~4.0.1" + "@abp/anchor-js": "~4.1.0-rc.2", + "@abp/clipboard": "~4.1.0-rc.2", + "@abp/malihu-custom-scrollbar-plugin": "~4.1.0-rc.2", + "@abp/popper.js": "~4.1.0-rc.2", + "@abp/prismjs": "~4.1.0-rc.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/flag-icon-css/package.json b/npm/packs/flag-icon-css/package.json index 69f07920b3..0897d6bbad 100644 --- a/npm/packs/flag-icon-css/package.json +++ b/npm/packs/flag-icon-css/package.json @@ -1,5 +1,5 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/flag-icon-css", "publishConfig": { "access": "public" diff --git a/npm/packs/font-awesome/package.json b/npm/packs/font-awesome/package.json index 7db4a80fce..42038058e3 100644 --- a/npm/packs/font-awesome/package.json +++ b/npm/packs/font-awesome/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/font-awesome", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "@fortawesome/fontawesome-free": "^5.13.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/highlight.js/package.json b/npm/packs/highlight.js/package.json index 3f8c6aaac8..2f4926697f 100644 --- a/npm/packs/highlight.js/package.json +++ b/npm/packs/highlight.js/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/highlight.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1" + "@abp/core": "~4.1.0-rc.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/jquery-form/package.json b/npm/packs/jquery-form/package.json index 6eeb78f25d..1f42d05a36 100644 --- a/npm/packs/jquery-form/package.json +++ b/npm/packs/jquery-form/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/jquery-form", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~4.0.1", + "@abp/jquery": "~4.1.0-rc.2", "jquery-form": "^4.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery-validation-unobtrusive/package.json b/npm/packs/jquery-validation-unobtrusive/package.json index 92f3b4e571..7cd1c72fbf 100644 --- a/npm/packs/jquery-validation-unobtrusive/package.json +++ b/npm/packs/jquery-validation-unobtrusive/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/jquery-validation-unobtrusive", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery-validation": "~4.0.1", + "@abp/jquery-validation": "~4.1.0-rc.2", "jquery-validation-unobtrusive": "^3.2.11" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery-validation/package.json b/npm/packs/jquery-validation/package.json index e4f78dd5db..f7c1d36762 100644 --- a/npm/packs/jquery-validation/package.json +++ b/npm/packs/jquery-validation/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/jquery-validation", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~4.0.1", + "@abp/jquery": "~4.1.0-rc.2", "jquery-validation": "^1.19.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery/package.json b/npm/packs/jquery/package.json index 8d3316ed73..f5785efef6 100644 --- a/npm/packs/jquery/package.json +++ b/npm/packs/jquery/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/jquery", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "jquery": "~3.5.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jstree/package.json b/npm/packs/jstree/package.json index bd0766a57c..aa47e4ef49 100644 --- a/npm/packs/jstree/package.json +++ b/npm/packs/jstree/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/jstree", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~4.0.1", + "@abp/jquery": "~4.1.0-rc.2", "jstree": "^3.3.9" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/lodash/package.json b/npm/packs/lodash/package.json index 69214392f1..81a884216c 100644 --- a/npm/packs/lodash/package.json +++ b/npm/packs/lodash/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/lodash", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "lodash": "^4.17.15" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/luxon/package.json b/npm/packs/luxon/package.json index 27779e5122..efeae6d8c3 100644 --- a/npm/packs/luxon/package.json +++ b/npm/packs/luxon/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/luxon", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "luxon": "^1.24.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/malihu-custom-scrollbar-plugin/package.json b/npm/packs/malihu-custom-scrollbar-plugin/package.json index c65aa9806c..035e07f5dd 100644 --- a/npm/packs/malihu-custom-scrollbar-plugin/package.json +++ b/npm/packs/malihu-custom-scrollbar-plugin/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/malihu-custom-scrollbar-plugin", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "malihu-custom-scrollbar-plugin": "^3.1.5" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/markdown-it/package.json b/npm/packs/markdown-it/package.json index 55479874e6..077544d43e 100644 --- a/npm/packs/markdown-it/package.json +++ b/npm/packs/markdown-it/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/markdown-it", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "markdown-it": "^11.0.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/owl.carousel/package.json b/npm/packs/owl.carousel/package.json index 2c7bf04f4f..4e92cebbdf 100644 --- a/npm/packs/owl.carousel/package.json +++ b/npm/packs/owl.carousel/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/owl.carousel", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "owl.carousel": "^2.3.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/popper.js/package.json b/npm/packs/popper.js/package.json index 97d767386c..392097c1e2 100644 --- a/npm/packs/popper.js/package.json +++ b/npm/packs/popper.js/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/popper.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "popper.js": "^1.16.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/prismjs/package.json b/npm/packs/prismjs/package.json index 2d76b4aeca..ef70a57ec5 100644 --- a/npm/packs/prismjs/package.json +++ b/npm/packs/prismjs/package.json @@ -1,12 +1,12 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/prismjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~4.0.1", - "@abp/core": "~4.0.1", + "@abp/clipboard": "~4.1.0-rc.2", + "@abp/core": "~4.1.0-rc.2", "prismjs": "^1.20.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/select2/package.json b/npm/packs/select2/package.json index 7f7d6e4af6..ebcf7422db 100644 --- a/npm/packs/select2/package.json +++ b/npm/packs/select2/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/select2", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "select2": "^4.0.13" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/signalr/package.json b/npm/packs/signalr/package.json index cb7667d65f..7752057b5d 100644 --- a/npm/packs/signalr/package.json +++ b/npm/packs/signalr/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/signalr", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "@microsoft/signalr": "~3.1.5" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/star-rating-svg/package.json b/npm/packs/star-rating-svg/package.json index 11a4b7b2f9..14d05d4192 100644 --- a/npm/packs/star-rating-svg/package.json +++ b/npm/packs/star-rating-svg/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/star-rating-svg", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~4.0.1", + "@abp/jquery": "~4.1.0-rc.2", "star-rating-svg": "^3.5.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/sweetalert/package.json b/npm/packs/sweetalert/package.json index 780def0cac..28c9e52e18 100644 --- a/npm/packs/sweetalert/package.json +++ b/npm/packs/sweetalert/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/sweetalert", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "sweetalert": "^2.1.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/timeago/package.json b/npm/packs/timeago/package.json index 09da25854c..bd37d0e12f 100644 --- a/npm/packs/timeago/package.json +++ b/npm/packs/timeago/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/timeago", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~4.0.1", + "@abp/jquery": "~4.1.0-rc.2", "timeago": "^1.6.7" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/toastr/package.json b/npm/packs/toastr/package.json index 7c6bb2cf3f..fc87a45442 100644 --- a/npm/packs/toastr/package.json +++ b/npm/packs/toastr/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/toastr", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~4.0.1", + "@abp/jquery": "~4.1.0-rc.2", "toastr": "^2.1.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/tui-editor/package.json b/npm/packs/tui-editor/package.json index da6596ca99..a474d53b2a 100644 --- a/npm/packs/tui-editor/package.json +++ b/npm/packs/tui-editor/package.json @@ -1,14 +1,14 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/tui-editor", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/codemirror": "~4.0.1", - "@abp/highlight.js": "~4.0.1", - "@abp/jquery": "~4.0.1", - "@abp/markdown-it": "~4.0.1", + "@abp/codemirror": "~4.1.0-rc.2", + "@abp/highlight.js": "~4.1.0-rc.2", + "@abp/jquery": "~4.1.0-rc.2", + "@abp/markdown-it": "~4.1.0-rc.2", "tui-editor": "^1.4.10" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/uppy/package.json b/npm/packs/uppy/package.json index 295a087d49..99b1b040d9 100644 --- a/npm/packs/uppy/package.json +++ b/npm/packs/uppy/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/uppy", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~4.0.1", + "@abp/core": "~4.1.0-rc.2", "uppy": "^1.16.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/utils/package.json b/npm/packs/utils/package.json index f85649e2c4..083b550018 100644 --- a/npm/packs/utils/package.json +++ b/npm/packs/utils/package.json @@ -1,6 +1,6 @@ { "name": "@abp/utils", - "version": "4.0.1", + "version": "4.1.0-rc.2", "scripts": { "prepublish": "yarn install --ignore-scripts && node prepublish.js", "ng": "ng", diff --git a/npm/packs/vee-validate/package.json b/npm/packs/vee-validate/package.json index 73b000f497..7a01159115 100644 --- a/npm/packs/vee-validate/package.json +++ b/npm/packs/vee-validate/package.json @@ -1,11 +1,11 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/vee-validate", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/vue": "~4.0.1", + "@abp/vue": "~4.1.0-rc.2", "vee-validate": "~3.4.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/virtual-file-explorer/package.json b/npm/packs/virtual-file-explorer/package.json index e7810eb9b2..b0b5007bad 100644 --- a/npm/packs/virtual-file-explorer/package.json +++ b/npm/packs/virtual-file-explorer/package.json @@ -1,12 +1,12 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/virtual-file-explorer", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~4.0.1", - "@abp/prismjs": "~4.0.1" + "@abp/clipboard": "~4.1.0-rc.2", + "@abp/prismjs": "~4.1.0-rc.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/vue/package.json b/npm/packs/vue/package.json index 5d566a6535..8350dca9db 100644 --- a/npm/packs/vue/package.json +++ b/npm/packs/vue/package.json @@ -1,5 +1,5 @@ { - "version": "4.0.1", + "version": "4.1.0-rc.2", "name": "@abp/vue", "publishConfig": { "access": "public" diff --git a/nupkg/pack.ps1 b/nupkg/pack.ps1 index 88c945ef5a..8c1dcdf10c 100644 --- a/nupkg/pack.ps1 +++ b/nupkg/pack.ps1 @@ -15,7 +15,7 @@ foreach($project in $projects) { # Create nuget pack Set-Location $projectFolder Remove-Item -Recurse (Join-Path $projectFolder "bin/Release") - & dotnet msbuild /t:pack /p:Configuration=Release /p:SourceLinkCreate=true + & dotnet pack -c Release if (-Not $?) { Write-Host ("Packaging failed for the project: " + $projectFolder) @@ -26,6 +26,8 @@ foreach($project in $projects) { $projectName = $project.Substring($project.LastIndexOf("/") + 1) $projectPackPath = Join-Path $projectFolder ("/bin/Release/" + $projectName + ".*.nupkg") Move-Item $projectPackPath $packFolder + $projectSymbolPackPath = Join-Path $projectFolder ("/bin/Release/" + $projectName + ".*.snupkg") + Move-Item $projectSymbolPackPath $packFolder } # Go back to the pack folder diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index 5b4ff7218e..95266a5fe5 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -12,13 +12,13 @@ }, "private": true, "dependencies": { - "@abp/ng.components": "~4.0.1", - "@abp/ng.core": "~4.0.1", - "@abp/ng.identity": "~4.0.1", - "@abp/ng.setting-management": "~4.0.1", - "@abp/ng.tenant-management": "~4.0.1", - "@abp/ng.theme.basic": "~4.0.1", - "@abp/ng.theme.shared": "~4.0.1", + "@abp/ng.components": "~4.1.0-rc.2", + "@abp/ng.core": "~4.1.0-rc.2", + "@abp/ng.identity": "~4.1.0-rc.2", + "@abp/ng.setting-management": "~4.1.0-rc.2", + "@abp/ng.tenant-management": "~4.1.0-rc.2", + "@abp/ng.theme.basic": "~4.1.0-rc.2", + "@abp/ng.theme.shared": "~4.1.0-rc.2", "@angular/animations": "~11.0.0", "@angular/common": "~11.0.0", "@angular/compiler": "~11.0.0", @@ -32,7 +32,7 @@ "zone.js": "~0.10.2" }, "devDependencies": { - "@abp/ng.schematics": "~4.0.1", + "@abp/ng.schematics": "~4.1.0-rc.2", "@angular-devkit/build-angular": "~0.1100.0", "@angular/cli": "~11.0.0", "@angular/compiler-cli": "~11.0.0", diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameMenuContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs similarity index 95% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameMenuContributor.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs index 003d882da6..8b5aebacce 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameMenuContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs @@ -7,7 +7,7 @@ using Volo.Abp.Account.Localization; using Volo.Abp.UI.Navigation; using Volo.Abp.Users; -namespace MyCompanyName.MyProjectName.Blazor +namespace MyCompanyName.MyProjectName.Blazor.Menus { public class MyProjectNameMenuContributor : IMenuContributor { @@ -37,7 +37,7 @@ namespace MyCompanyName.MyProjectName.Blazor context.Menu.Items.Insert( 0, new ApplicationMenuItem( - "MyProjectName.Home", + MyProjectNameMenus.Home, l["Menu:Home"], "/", icon: "fas fa-home" diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenus.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenus.cs new file mode 100644 index 0000000000..e65e49be30 --- /dev/null +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenus.cs @@ -0,0 +1,11 @@ +namespace MyCompanyName.MyProjectName.Blazor.Menus +{ + public class MyProjectNameMenus + { + private const string Prefix = "MyProjectName"; + public const string Home = Prefix + ".Home"; + + //Add your menu items here... + + } +} \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj index 48029e8f3d..9bc6fb7092 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj @@ -7,10 +7,10 @@ - - - - + + + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs index 728d969244..7a51f40a07 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs @@ -17,6 +17,7 @@ using Volo.Abp.UI.Navigation; using Volo.Abp.Identity.Blazor; using Volo.Abp.AutoMapper; using Volo.Abp.TenantManagement.Blazor; +using MyCompanyName.MyProjectName.Blazor.Menus; namespace MyCompanyName.MyProjectName.Blazor { diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBundleContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBundleContributor.cs index a30dbc8f78..c4a948493f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBundleContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBundleContributor.cs @@ -6,6 +6,7 @@ namespace MyCompanyName.MyProjectName.Blazor { public void AddScripts(BundleContext context) { + } public void AddStyles(BundleContext context) diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/appsettings.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/appsettings.json index af7cddcc72..997cf89e64 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/appsettings.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/wwwroot/appsettings.json @@ -7,6 +7,15 @@ "RemoteServices": { "Default": { "BaseUrl": "https://localhost:44305" - } - } + } + }, + "AbpCli": { + "Bundle": { + "Mode": "BundleAndMinify", /* Options: None, Bundle, BundleAndMinify */ + "Name": "global", + "Parameters": { + + } + } + } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj index 4d5b4c51f7..6bf2650ea9 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.DbMigrator/MyCompanyName.MyProjectName.DbMigrator.csproj @@ -23,7 +23,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj index ae9ce4c4d2..c6639bbad7 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj @@ -25,7 +25,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations.csproj index 5803aac5a0..1d2226ee96 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations.csproj @@ -12,7 +12,7 @@
- + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index 2c2569a98c..6e3ccfa0ff 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -12,9 +12,9 @@ - - - + + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs index e099b22391..328722915e 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs @@ -207,7 +207,7 @@ namespace MyCompanyName.MyProjectName app.UseAuthorization(); app.UseSwagger(); - app.UseSwaggerUI(options => + app.UseAbpSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API"); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj index 05d08e875c..d374c7feb6 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj @@ -12,8 +12,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json index 1171b7f8a6..90988e3200 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^4.1.0-rc.2" } } \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/yarn.lock b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/yarn.lock index 33139bd99e..241d313710 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/yarn.lock +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.1.tgz#ce8e3eb830a8e8f9eecb1a3b3bd70c2832fdf15e" - integrity sha512-w+ZG8Ewx9wWfbvRC2MAjJl+rXuXSHLhhGOiJTk68unWLNziDtNQzcSXG/Z5c1hA+acJSGqDoJGEGs4FVM136og== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.1.tgz#cd9d0eb11309c597dffd26277cd1bd7c5b1e0e2f" - integrity sha512-QGoCN/my0eAfa4tx5ytDxArIoz2i58jFFVUGso1Lekn54JvSt+WLz2p3uyTGatZ03Bp9836elhFnIopn12WvBw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~4.0.1" - "@abp/bootstrap" "~4.0.1" - "@abp/bootstrap-datepicker" "~4.0.1" - "@abp/datatables.net-bs4" "~4.0.1" - "@abp/font-awesome" "~4.0.1" - "@abp/jquery-form" "~4.0.1" - "@abp/jquery-validation-unobtrusive" "~4.0.1" - "@abp/lodash" "~4.0.1" - "@abp/luxon" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/select2" "~4.0.1" - "@abp/sweetalert" "~4.0.1" - "@abp/timeago" "~4.0.1" - "@abp/toastr" "~4.0.1" - -"@abp/aspnetcore.mvc.ui@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.1.tgz#6490c147a56e4f7055d2ca77f20baf1f60f56867" - integrity sha512-4B3icJrlpuZgMaX52ninyaenH7zLwepePEscDrLaFY9wyonKpZ2zh+xplnyM6vjNd+PhErWuA2+ssCswFhrJ3A== +"@abp/aspnetcore.mvc.ui.theme.basic@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.1.0-rc.2.tgz#b9462cbe36c41d68e2f44b79a3a2dba2c1b2b54a" + integrity sha512-KW3J6HnN1zZrCmrWmEcXBnGIOeuJDdp1jUECAm4Bdxi++VzfIbGlVvpcvUdT1E213reOUWi4dPhcej12DwrmDw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui.theme.shared@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.1.0-rc.2.tgz#d64cea1e504bcd3a08a1819025d40f3f84f0aadc" + integrity sha512-A/DRLwtJO7YCdqAgSF84wNRKjvGEQvcBocIwRxXCJEe3drxMoSwkAGjXQlxIYWZKdYbYUWDTjil2Mvwf91GUqg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~4.1.0-rc.2" + "@abp/bootstrap" "~4.1.0-rc.2" + "@abp/bootstrap-datepicker" "~4.1.0-rc.2" + "@abp/datatables.net-bs4" "~4.1.0-rc.2" + "@abp/font-awesome" "~4.1.0-rc.2" + "@abp/jquery-form" "~4.1.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~4.1.0-rc.2" + "@abp/lodash" "~4.1.0-rc.2" + "@abp/luxon" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/select2" "~4.1.0-rc.2" + "@abp/sweetalert" "~4.1.0-rc.2" + "@abp/timeago" "~4.1.0-rc.2" + "@abp/toastr" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.1.0-rc.2.tgz#54bf30def590e6d25fc35f77253888f3d9f74b9c" + integrity sha512-eOh5IBn4eNAjj2i6tlLRIV/r61Ef7+Z3PNvGgdml/XCo50el4G9XE7shxuGOY+MaFMfmsST2tcJlO9iAo9n2Yw== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,145 +43,145 @@ micromatch "^4.0.2" path "^0.12.7" -"@abp/bootstrap-datepicker@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.1.tgz#aad891263edff66f816e003ba4fa7f8acfe8e0b6" - integrity sha512-S0oaVZmXsDcOJLAyoGY0TvP/7bZx0GHIbU9BIhIL2Wl74HYaokjkTr6/IleIek9YeiF2vm9FkrUP1dKH/4f7Gg== +"@abp/bootstrap-datepicker@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.1.0-rc.2.tgz#d3fe863222a11771d366b1a3c246aaf34df94081" + integrity sha512-vn2xWAK3xqo5fMZJ9dOAZZmL+ZUnzZZNh3lF6uA97wTN/SbePlmHBYJpsCKIxOwbJS2HCvekHGJN/Ps4oEjlbw== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.1.tgz#3e41bdf9b3e9f8c497b9fafe22a4851d0401b31b" - integrity sha512-GoSaNWvswRHVoUrq7xClFQYtwqIlyS/vp/TdY+j5FFZP7ud89+ZGpdNqYqq5l9/6aaYa7v4b9mNTZ/1JRzAOYg== +"@abp/bootstrap@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.1.0-rc.2.tgz#b5132cf4c4c92fe833823cf2b91ab1b0167b0ecf" + integrity sha512-SsWEV0DveBIHiG051E6aBB371D15QIsGeo+POFhvQUvrlmzMBlFCAlmH0ef8w1n+3M3C37irCgEGKctt2pbcxQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" bootstrap "^4.5.0" bootstrap-v4-rtl "4.4.1-2" -"@abp/core@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.1.tgz#1df32bc058f45571605670ca81c226a1bd87400c" - integrity sha512-8UT5lwqV/luVG/SxePSTD2FRbZXwXv3cZJKjw+gpBjhD0slWrh51XEOHsM8ciTuhcvV/tsqVU9nXckDMdO58fw== +"@abp/core@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.1.0-rc.2.tgz#d306106a53fa56109751be0099785c94f43be56f" + integrity sha512-b0mOYSz8hNgZ/hBeYg8hkthJgE8CLyHNa2NcythPoIW8RR5qHmDtGoFnuFovLvLk7r+M4NWyxXRKEshSszIPyA== dependencies: - "@abp/utils" "^4.0.1" + "@abp/utils" "^4.1.0-rc.2" -"@abp/datatables.net-bs4@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.1.tgz#7538baad0eff24eca7f4246d020852f83139f645" - integrity sha512-S52jNPF4if68V+P/33NrtGPJXf6xrqgyZzz9b7qBR7HuUm3Nsn7bAslh3JNduNec/sFuE4Utl/xsFHZNjBWEog== +"@abp/datatables.net-bs4@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.1.0-rc.2.tgz#99aa1fbad91939fc23265324a3d8a45d0c1e5a7a" + integrity sha512-Y9UyqniOkx5DJO+2GGurnQE1yfRmGaQ3y7V07gKWRq+gHLUhE+vfgOLVpGM6ufdTIbLvVw5Ng+3gfOmPlUnpxg== dependencies: - "@abp/datatables.net" "~4.0.1" + "@abp/datatables.net" "~4.1.0-rc.2" datatables.net-bs4 "^1.10.21" -"@abp/datatables.net@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.1.tgz#eb89716a37351c41b5bccfc2db88fc7ceb991a26" - integrity sha512-APFLui0w8MqsBWqP/K0QkT5cBq5SsWiqMaIGTXQKinMVLV597sUszrlhe1ISU2PqeD7iX6pCZNNOTI1NEUn9/Q== +"@abp/datatables.net@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.1.0-rc.2.tgz#1a134688259d32187d822d8a49c7a68b4cc226c7" + integrity sha512-9o5g8s7ZTlThd1FMFmO7wS+MxmXgUMmiWx7Hwara9ypfJPd0vanz10bQAdTpLiDy/aa0tUmz0xOVj73yvBJm9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" datatables.net "^1.10.21" -"@abp/font-awesome@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.1.tgz#8a9d83b2c2adfcd5abcbd9c31c315460d44a321e" - integrity sha512-+6+m/DKMnfkeQiWUsMlB6Da8u6yREyN2oQYGYhSRAK8419ym8RHHrqKJv2AClI4iLq2ppHZj8WF84+SeoCekRg== +"@abp/font-awesome@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.1.0-rc.2.tgz#ecf490861c09250cf61611ac74cec5ab4392e807" + integrity sha512-6yAsf/ee2hdrHHUACql8c3gY54Hd7YAK2olHymyc3Io2hhK2VxXRc2W2oRSwbQ9GsSE+XDrEVtjIR64nBseTeg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" "@fortawesome/fontawesome-free" "^5.13.0" -"@abp/jquery-form@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.1.tgz#6dc1922b2800dd635f20881a82e08104a1dd1bb5" - integrity sha512-JMBZYu/MI/GjaLTBOMB5iv8cagnLpReDULNC3r6tLNNqB1R8f3Cg1T7nF4YCuU9SYMqis1P/AuE4oEh+4rQdAQ== +"@abp/jquery-form@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.1.0-rc.2.tgz#76dff67a3fe6e6ad7bd60bb909de93c09966cc0a" + integrity sha512-LGafwxyRYUbHQlJ9pPbYdkVqzdT/y1Fp4Nr4C3W5jxsJuaSICl0RPkRHIPALeoqbpEWuj6dVep6ZuO9hhxBzNw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.1.tgz#4142ca31c0830fe24a1467e8cf13b55ba9d7c1dd" - integrity sha512-rdSRTcdKCHmarbrVgmPYdTiJ0G/aFKd+dr0krO7fALPTuQKChbDnHOO4/JvQSc+cd9faxa8c6ZWvlHdsof23tQ== +"@abp/jquery-validation-unobtrusive@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.1.0-rc.2.tgz#1f1d395cfa47740d47303ff512592ff1993f9e13" + integrity sha512-0LXWvgfyLHVw7qRVOmY0rfVlq+yJq/nhbcVoYK+QbmKnrFu+KZg0KNMOD8wTXs8mZ1EKGQpoQKWxImtCnGrV/A== dependencies: - "@abp/jquery-validation" "~4.0.1" + "@abp/jquery-validation" "~4.1.0-rc.2" jquery-validation-unobtrusive "^3.2.11" -"@abp/jquery-validation@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.1.tgz#74e7d795468c6986f2db15662631fcd4f67c679e" - integrity sha512-FX26aQCsMBdVWAJb7S37Lt7KoHAEHoYguh/qfZIARCpOYOOWvxfDz1wTrmADUkqdillqEiCeD/Imj8bYH9Faaw== +"@abp/jquery-validation@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.1.0-rc.2.tgz#ad4b464fd0133eab8d08c781c7d7c4e00bc4918d" + integrity sha512-iLTobfwqDk7iiQxvv5UowxOKywsh/77VlAVktstnFG3N3Y73+JYKzM0mGM/j4zM1OrjbF9/cnPnDVX7bATPz9w== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-validation "^1.19.2" -"@abp/jquery@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.1.tgz#aa554accb16600fd586c3a4f088040cd26d0bde8" - integrity sha512-MtiRKOLyjEWux+whPP3+zwPbpj8or756JtgjnwOTDB9tp9HLCYUaskt+oalYPvob24nDZcNu2RnMALYdCVhZAQ== +"@abp/jquery@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.1.0-rc.2.tgz#0f64cad5b1ae3e47d2344e5fb30c347b89d6d2bb" + integrity sha512-YubZwMJIN+UcfxfUlt3usfcLMG9WcXNpemUsdBtlKNzti562KZMIHPFLRL+DsiqvzZ74h2PxSWWsxS42Z7z0Yw== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" jquery "~3.5.1" -"@abp/lodash@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.1.tgz#ec261ccaab8a70d5b32a8a7c22387e48936d38d4" - integrity sha512-Dav1QKbBeGR4VVbHHe1s3OEzN7wnb9K/vwzHrWmtO8D1Q5Z3433xjNmgL5VQ9gfxXqooSfEO4gAovZklMDHDew== +"@abp/lodash@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.1.0-rc.2.tgz#9281c641ab7b7b33e7acf12815dc461e7ae967b9" + integrity sha512-RqdekrAyLPaLNJddmrq89EdrI1xg4296tOafFLHvirgRWisJTIa9bflTOwMwEg9FNdLJgA0zHi4WdAMer0qZdA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" lodash "^4.17.15" -"@abp/luxon@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.1.tgz#a540750b1605dbac856ce9c2e776c2fecf6392f9" - integrity sha512-eRumVB7UIf2XH6OZVUTvcKw0A/OSAfYV59fM+Wc4dAkNcmsNZI0gD1o0AigSGNCxTV6v+W2bFrsuooSqK99Y0Q== +"@abp/luxon@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.1.0-rc.2.tgz#78fc1cf651d7c19b87a31823cd3ce68961d6b1e6" + integrity sha512-U4e9uGZlg9xj9tBNP337v3wiaSR6qxWsBgh/duQGWrqV+75LlQjYcZaPoXDidUUS6U6epDSR2pc2T39rahcgSQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" luxon "^1.24.1" -"@abp/malihu-custom-scrollbar-plugin@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.1.tgz#0a556423a67b6c949e32ffcacd72256dea6c31ee" - integrity sha512-YTwYpnQ1ZrON70gvJcnNZRwB3Ze4olGcXxiPvmRgSHbGJkSnHYJiP6PvsN1F3HDFukAJ/iUu+WwEe8OBwlyLXA== +"@abp/malihu-custom-scrollbar-plugin@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.1.0-rc.2.tgz#36553e71052cad9734e0c9b2c65759e538468648" + integrity sha512-JQ6PCcj5qmF9MxNRPAsKHHnqBPCdn4lQnwxZrHcG9tD70Gx+NfC4UH41tqXI+htba4k0PHRyH2y39Q1iJm0NFA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.1.tgz#8983e7b5c3afb862f08b2730b70e59d726e9b5d5" - integrity sha512-WdzY2hvsS/4vz/VXpxq2muSzzE8ggchiIrICy/WKchJxL9L08DM796t6aE6rEl9wucY8XEzzWrPOVqAjJmnXFA== +"@abp/select2@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.1.0-rc.2.tgz#c48e865f401ddce32dff2a7a14ae07c4bde2f57b" + integrity sha512-YYK/SIqXQcSDQFMVg/ogohc76d4JDrOVQEbzfkNNI5bKVJo+hkqtNzAwV9FLdPZZNw15QMv0eF1ie4aUtIxyaA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.1.tgz#0088610915ad6db0a140b77832a37c10066eb4ee" - integrity sha512-t4/44oQCMngSjVqmeRWXwrXa/pRKc3CEpyyTiGIXki4dWJ21j0ePCw2l3rvOJWnpoCznhxa/UGxLfRfK1NEzRg== +"@abp/sweetalert@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.1.0-rc.2.tgz#cdcaf8e9a33cf218a687fd6a42cfe1c85d89c6b7" + integrity sha512-sjQd8TF9oUnaQ1OPTGdVyAfWqSZEk4bRbC/qw2CouEOfRLatzkC0JcmzFLN0f5N1am1RQwkFakpENKH7NqTCvg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" sweetalert "^2.1.2" -"@abp/timeago@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.1.tgz#8c161645534eb1f62fe4607450acf7345729e711" - integrity sha512-PsPobV79U2qzVY+WBsmJM1ohSF4jqcLnL4/7qyJvxlb1WwbCl1F5D4cpiJP4zsM4clPW4mbSsiauMNp+HTNKEA== +"@abp/timeago@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.1.0-rc.2.tgz#445d043ae482b76799b496ae6565abfaf75a34b9" + integrity sha512-wWx56EZMUGIfqJV5JLCvUp4RVhKXHYLQaVNQSF8E05COXmSQwFThVS7vbuiODFp2BGm6RAqCVtZDCreu2B8z9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.1.tgz#ecb6f6193b7edc3150d0614ab9457472baf1cce3" - integrity sha512-bTTz0O8zj7fMhdoummP2Ed5Z8SJTmR6svzNchBXNDrnRAcDQvTihPTcg0UpH8BEDFczbLowq09CG2A/RMSJoug== +"@abp/toastr@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.1.0-rc.2.tgz#1af16fa8687201b6b9c7229d087a4233998703b9" + integrity sha512-g+Jl5H1ZHoJ4JwWuix0xA+GMFY42pwq8WYjxP6qE2/Y2aixYHVIui15eBqF2L06yXOt53YFcC1+pxjrp91xHxw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" toastr "^2.1.4" -"@abp/utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" - integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== +"@abp/utils@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.2.tgz#eb6dbf0ee493d0f050b37347d2d6d283098aedae" + integrity sha512-V2k5I89lVBoeGIKgg4p2H9GlMAcDWbctwKZPVwBEMVEVm1uTR2xQAWdTdSFd5Q8I8Xsf/aIG8ELM7l5j2h7/zQ== dependencies: just-compare "^1.3.0" diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj index 66da2cc100..333268deef 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj @@ -34,8 +34,8 @@ - - + + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json index 5e131b4756..8f06264a30 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-identityserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^4.1.0-rc.2" } } \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/yarn.lock b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/yarn.lock index 12469bed18..49043f9055 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/yarn.lock +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.1.tgz#ce8e3eb830a8e8f9eecb1a3b3bd70c2832fdf15e" - integrity sha512-w+ZG8Ewx9wWfbvRC2MAjJl+rXuXSHLhhGOiJTk68unWLNziDtNQzcSXG/Z5c1hA+acJSGqDoJGEGs4FVM136og== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.1.tgz#cd9d0eb11309c597dffd26277cd1bd7c5b1e0e2f" - integrity sha512-QGoCN/my0eAfa4tx5ytDxArIoz2i58jFFVUGso1Lekn54JvSt+WLz2p3uyTGatZ03Bp9836elhFnIopn12WvBw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~4.0.1" - "@abp/bootstrap" "~4.0.1" - "@abp/bootstrap-datepicker" "~4.0.1" - "@abp/datatables.net-bs4" "~4.0.1" - "@abp/font-awesome" "~4.0.1" - "@abp/jquery-form" "~4.0.1" - "@abp/jquery-validation-unobtrusive" "~4.0.1" - "@abp/lodash" "~4.0.1" - "@abp/luxon" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/select2" "~4.0.1" - "@abp/sweetalert" "~4.0.1" - "@abp/timeago" "~4.0.1" - "@abp/toastr" "~4.0.1" - -"@abp/aspnetcore.mvc.ui@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.1.tgz#6490c147a56e4f7055d2ca77f20baf1f60f56867" - integrity sha512-4B3icJrlpuZgMaX52ninyaenH7zLwepePEscDrLaFY9wyonKpZ2zh+xplnyM6vjNd+PhErWuA2+ssCswFhrJ3A== +"@abp/aspnetcore.mvc.ui.theme.basic@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.1.0-rc.2.tgz#b9462cbe36c41d68e2f44b79a3a2dba2c1b2b54a" + integrity sha512-KW3J6HnN1zZrCmrWmEcXBnGIOeuJDdp1jUECAm4Bdxi++VzfIbGlVvpcvUdT1E213reOUWi4dPhcej12DwrmDw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui.theme.shared@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.1.0-rc.2.tgz#d64cea1e504bcd3a08a1819025d40f3f84f0aadc" + integrity sha512-A/DRLwtJO7YCdqAgSF84wNRKjvGEQvcBocIwRxXCJEe3drxMoSwkAGjXQlxIYWZKdYbYUWDTjil2Mvwf91GUqg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~4.1.0-rc.2" + "@abp/bootstrap" "~4.1.0-rc.2" + "@abp/bootstrap-datepicker" "~4.1.0-rc.2" + "@abp/datatables.net-bs4" "~4.1.0-rc.2" + "@abp/font-awesome" "~4.1.0-rc.2" + "@abp/jquery-form" "~4.1.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~4.1.0-rc.2" + "@abp/lodash" "~4.1.0-rc.2" + "@abp/luxon" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/select2" "~4.1.0-rc.2" + "@abp/sweetalert" "~4.1.0-rc.2" + "@abp/timeago" "~4.1.0-rc.2" + "@abp/toastr" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.1.0-rc.2.tgz#54bf30def590e6d25fc35f77253888f3d9f74b9c" + integrity sha512-eOh5IBn4eNAjj2i6tlLRIV/r61Ef7+Z3PNvGgdml/XCo50el4G9XE7shxuGOY+MaFMfmsST2tcJlO9iAo9n2Yw== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,145 +43,145 @@ micromatch "^4.0.2" path "^0.12.7" -"@abp/bootstrap-datepicker@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.1.tgz#aad891263edff66f816e003ba4fa7f8acfe8e0b6" - integrity sha512-S0oaVZmXsDcOJLAyoGY0TvP/7bZx0GHIbU9BIhIL2Wl74HYaokjkTr6/IleIek9YeiF2vm9FkrUP1dKH/4f7Gg== +"@abp/bootstrap-datepicker@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.1.0-rc.2.tgz#d3fe863222a11771d366b1a3c246aaf34df94081" + integrity sha512-vn2xWAK3xqo5fMZJ9dOAZZmL+ZUnzZZNh3lF6uA97wTN/SbePlmHBYJpsCKIxOwbJS2HCvekHGJN/Ps4oEjlbw== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.1.tgz#3e41bdf9b3e9f8c497b9fafe22a4851d0401b31b" - integrity sha512-GoSaNWvswRHVoUrq7xClFQYtwqIlyS/vp/TdY+j5FFZP7ud89+ZGpdNqYqq5l9/6aaYa7v4b9mNTZ/1JRzAOYg== +"@abp/bootstrap@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.1.0-rc.2.tgz#b5132cf4c4c92fe833823cf2b91ab1b0167b0ecf" + integrity sha512-SsWEV0DveBIHiG051E6aBB371D15QIsGeo+POFhvQUvrlmzMBlFCAlmH0ef8w1n+3M3C37irCgEGKctt2pbcxQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" bootstrap "^4.5.0" bootstrap-v4-rtl "4.4.1-2" -"@abp/core@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.1.tgz#1df32bc058f45571605670ca81c226a1bd87400c" - integrity sha512-8UT5lwqV/luVG/SxePSTD2FRbZXwXv3cZJKjw+gpBjhD0slWrh51XEOHsM8ciTuhcvV/tsqVU9nXckDMdO58fw== +"@abp/core@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.1.0-rc.2.tgz#d306106a53fa56109751be0099785c94f43be56f" + integrity sha512-b0mOYSz8hNgZ/hBeYg8hkthJgE8CLyHNa2NcythPoIW8RR5qHmDtGoFnuFovLvLk7r+M4NWyxXRKEshSszIPyA== dependencies: - "@abp/utils" "^4.0.1" + "@abp/utils" "^4.1.0-rc.2" -"@abp/datatables.net-bs4@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.1.tgz#7538baad0eff24eca7f4246d020852f83139f645" - integrity sha512-S52jNPF4if68V+P/33NrtGPJXf6xrqgyZzz9b7qBR7HuUm3Nsn7bAslh3JNduNec/sFuE4Utl/xsFHZNjBWEog== +"@abp/datatables.net-bs4@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.1.0-rc.2.tgz#99aa1fbad91939fc23265324a3d8a45d0c1e5a7a" + integrity sha512-Y9UyqniOkx5DJO+2GGurnQE1yfRmGaQ3y7V07gKWRq+gHLUhE+vfgOLVpGM6ufdTIbLvVw5Ng+3gfOmPlUnpxg== dependencies: - "@abp/datatables.net" "~4.0.1" + "@abp/datatables.net" "~4.1.0-rc.2" datatables.net-bs4 "^1.10.21" -"@abp/datatables.net@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.1.tgz#eb89716a37351c41b5bccfc2db88fc7ceb991a26" - integrity sha512-APFLui0w8MqsBWqP/K0QkT5cBq5SsWiqMaIGTXQKinMVLV597sUszrlhe1ISU2PqeD7iX6pCZNNOTI1NEUn9/Q== +"@abp/datatables.net@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.1.0-rc.2.tgz#1a134688259d32187d822d8a49c7a68b4cc226c7" + integrity sha512-9o5g8s7ZTlThd1FMFmO7wS+MxmXgUMmiWx7Hwara9ypfJPd0vanz10bQAdTpLiDy/aa0tUmz0xOVj73yvBJm9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" datatables.net "^1.10.21" -"@abp/font-awesome@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.1.tgz#8a9d83b2c2adfcd5abcbd9c31c315460d44a321e" - integrity sha512-+6+m/DKMnfkeQiWUsMlB6Da8u6yREyN2oQYGYhSRAK8419ym8RHHrqKJv2AClI4iLq2ppHZj8WF84+SeoCekRg== +"@abp/font-awesome@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.1.0-rc.2.tgz#ecf490861c09250cf61611ac74cec5ab4392e807" + integrity sha512-6yAsf/ee2hdrHHUACql8c3gY54Hd7YAK2olHymyc3Io2hhK2VxXRc2W2oRSwbQ9GsSE+XDrEVtjIR64nBseTeg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" "@fortawesome/fontawesome-free" "^5.13.0" -"@abp/jquery-form@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.1.tgz#6dc1922b2800dd635f20881a82e08104a1dd1bb5" - integrity sha512-JMBZYu/MI/GjaLTBOMB5iv8cagnLpReDULNC3r6tLNNqB1R8f3Cg1T7nF4YCuU9SYMqis1P/AuE4oEh+4rQdAQ== +"@abp/jquery-form@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.1.0-rc.2.tgz#76dff67a3fe6e6ad7bd60bb909de93c09966cc0a" + integrity sha512-LGafwxyRYUbHQlJ9pPbYdkVqzdT/y1Fp4Nr4C3W5jxsJuaSICl0RPkRHIPALeoqbpEWuj6dVep6ZuO9hhxBzNw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.1.tgz#4142ca31c0830fe24a1467e8cf13b55ba9d7c1dd" - integrity sha512-rdSRTcdKCHmarbrVgmPYdTiJ0G/aFKd+dr0krO7fALPTuQKChbDnHOO4/JvQSc+cd9faxa8c6ZWvlHdsof23tQ== +"@abp/jquery-validation-unobtrusive@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.1.0-rc.2.tgz#1f1d395cfa47740d47303ff512592ff1993f9e13" + integrity sha512-0LXWvgfyLHVw7qRVOmY0rfVlq+yJq/nhbcVoYK+QbmKnrFu+KZg0KNMOD8wTXs8mZ1EKGQpoQKWxImtCnGrV/A== dependencies: - "@abp/jquery-validation" "~4.0.1" + "@abp/jquery-validation" "~4.1.0-rc.2" jquery-validation-unobtrusive "^3.2.11" -"@abp/jquery-validation@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.1.tgz#74e7d795468c6986f2db15662631fcd4f67c679e" - integrity sha512-FX26aQCsMBdVWAJb7S37Lt7KoHAEHoYguh/qfZIARCpOYOOWvxfDz1wTrmADUkqdillqEiCeD/Imj8bYH9Faaw== +"@abp/jquery-validation@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.1.0-rc.2.tgz#ad4b464fd0133eab8d08c781c7d7c4e00bc4918d" + integrity sha512-iLTobfwqDk7iiQxvv5UowxOKywsh/77VlAVktstnFG3N3Y73+JYKzM0mGM/j4zM1OrjbF9/cnPnDVX7bATPz9w== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-validation "^1.19.2" -"@abp/jquery@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.1.tgz#aa554accb16600fd586c3a4f088040cd26d0bde8" - integrity sha512-MtiRKOLyjEWux+whPP3+zwPbpj8or756JtgjnwOTDB9tp9HLCYUaskt+oalYPvob24nDZcNu2RnMALYdCVhZAQ== +"@abp/jquery@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.1.0-rc.2.tgz#0f64cad5b1ae3e47d2344e5fb30c347b89d6d2bb" + integrity sha512-YubZwMJIN+UcfxfUlt3usfcLMG9WcXNpemUsdBtlKNzti562KZMIHPFLRL+DsiqvzZ74h2PxSWWsxS42Z7z0Yw== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" jquery "~3.5.1" -"@abp/lodash@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.1.tgz#ec261ccaab8a70d5b32a8a7c22387e48936d38d4" - integrity sha512-Dav1QKbBeGR4VVbHHe1s3OEzN7wnb9K/vwzHrWmtO8D1Q5Z3433xjNmgL5VQ9gfxXqooSfEO4gAovZklMDHDew== +"@abp/lodash@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.1.0-rc.2.tgz#9281c641ab7b7b33e7acf12815dc461e7ae967b9" + integrity sha512-RqdekrAyLPaLNJddmrq89EdrI1xg4296tOafFLHvirgRWisJTIa9bflTOwMwEg9FNdLJgA0zHi4WdAMer0qZdA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" lodash "^4.17.15" -"@abp/luxon@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.1.tgz#a540750b1605dbac856ce9c2e776c2fecf6392f9" - integrity sha512-eRumVB7UIf2XH6OZVUTvcKw0A/OSAfYV59fM+Wc4dAkNcmsNZI0gD1o0AigSGNCxTV6v+W2bFrsuooSqK99Y0Q== +"@abp/luxon@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.1.0-rc.2.tgz#78fc1cf651d7c19b87a31823cd3ce68961d6b1e6" + integrity sha512-U4e9uGZlg9xj9tBNP337v3wiaSR6qxWsBgh/duQGWrqV+75LlQjYcZaPoXDidUUS6U6epDSR2pc2T39rahcgSQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" luxon "^1.24.1" -"@abp/malihu-custom-scrollbar-plugin@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.1.tgz#0a556423a67b6c949e32ffcacd72256dea6c31ee" - integrity sha512-YTwYpnQ1ZrON70gvJcnNZRwB3Ze4olGcXxiPvmRgSHbGJkSnHYJiP6PvsN1F3HDFukAJ/iUu+WwEe8OBwlyLXA== +"@abp/malihu-custom-scrollbar-plugin@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.1.0-rc.2.tgz#36553e71052cad9734e0c9b2c65759e538468648" + integrity sha512-JQ6PCcj5qmF9MxNRPAsKHHnqBPCdn4lQnwxZrHcG9tD70Gx+NfC4UH41tqXI+htba4k0PHRyH2y39Q1iJm0NFA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.1.tgz#8983e7b5c3afb862f08b2730b70e59d726e9b5d5" - integrity sha512-WdzY2hvsS/4vz/VXpxq2muSzzE8ggchiIrICy/WKchJxL9L08DM796t6aE6rEl9wucY8XEzzWrPOVqAjJmnXFA== +"@abp/select2@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.1.0-rc.2.tgz#c48e865f401ddce32dff2a7a14ae07c4bde2f57b" + integrity sha512-YYK/SIqXQcSDQFMVg/ogohc76d4JDrOVQEbzfkNNI5bKVJo+hkqtNzAwV9FLdPZZNw15QMv0eF1ie4aUtIxyaA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.1.tgz#0088610915ad6db0a140b77832a37c10066eb4ee" - integrity sha512-t4/44oQCMngSjVqmeRWXwrXa/pRKc3CEpyyTiGIXki4dWJ21j0ePCw2l3rvOJWnpoCznhxa/UGxLfRfK1NEzRg== +"@abp/sweetalert@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.1.0-rc.2.tgz#cdcaf8e9a33cf218a687fd6a42cfe1c85d89c6b7" + integrity sha512-sjQd8TF9oUnaQ1OPTGdVyAfWqSZEk4bRbC/qw2CouEOfRLatzkC0JcmzFLN0f5N1am1RQwkFakpENKH7NqTCvg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" sweetalert "^2.1.2" -"@abp/timeago@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.1.tgz#8c161645534eb1f62fe4607450acf7345729e711" - integrity sha512-PsPobV79U2qzVY+WBsmJM1ohSF4jqcLnL4/7qyJvxlb1WwbCl1F5D4cpiJP4zsM4clPW4mbSsiauMNp+HTNKEA== +"@abp/timeago@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.1.0-rc.2.tgz#445d043ae482b76799b496ae6565abfaf75a34b9" + integrity sha512-wWx56EZMUGIfqJV5JLCvUp4RVhKXHYLQaVNQSF8E05COXmSQwFThVS7vbuiODFp2BGm6RAqCVtZDCreu2B8z9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.1.tgz#ecb6f6193b7edc3150d0614ab9457472baf1cce3" - integrity sha512-bTTz0O8zj7fMhdoummP2Ed5Z8SJTmR6svzNchBXNDrnRAcDQvTihPTcg0UpH8BEDFczbLowq09CG2A/RMSJoug== +"@abp/toastr@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.1.0-rc.2.tgz#1af16fa8687201b6b9c7229d087a4233998703b9" + integrity sha512-g+Jl5H1ZHoJ4JwWuix0xA+GMFY42pwq8WYjxP6qE2/Y2aixYHVIui15eBqF2L06yXOt53YFcC1+pxjrp91xHxw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" toastr "^2.1.4" -"@abp/utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" - integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== +"@abp/utils@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.2.tgz#eb6dbf0ee493d0f050b37347d2d6d283098aedae" + integrity sha512-V2k5I89lVBoeGIKgg4p2H9GlMAcDWbctwKZPVwBEMVEVm1uTR2xQAWdTdSFd5Q8I8Xsf/aIG8ELM7l5j2h7/zQ== dependencies: just-compare "^1.3.0" diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs index e130ef1716..9bbb38cb4f 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenuContributor.cs @@ -43,7 +43,7 @@ namespace MyCompanyName.MyProjectName.Web.Menus var l = context.GetLocalizer(); - context.Menu.Items.Insert(0, new ApplicationMenuItem("MyProjectName.Home", l["Menu:Home"], "~/")); + context.Menu.Items.Insert(0, new ApplicationMenuItem(MyProjectNameMenus.Home, l["Menu:Home"], "~/")); return Task.CompletedTask; } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenus.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenus.cs new file mode 100644 index 0000000000..d4563554b4 --- /dev/null +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Menus/MyProjectNameMenus.cs @@ -0,0 +1,11 @@ +namespace MyCompanyName.MyProjectName.Web.Menus +{ + public class MyProjectNameMenus + { + private const string Prefix = "MyProjectName"; + public const string Home = Prefix + ".Home"; + + //Add your menu items here... + + } +} \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index 47dbf3b45b..57347aca90 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -18,7 +18,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json index 1171b7f8a6..90988e3200 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^4.1.0-rc.2" } } \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/yarn.lock b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/yarn.lock index 12469bed18..49043f9055 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/yarn.lock +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.1.tgz#ce8e3eb830a8e8f9eecb1a3b3bd70c2832fdf15e" - integrity sha512-w+ZG8Ewx9wWfbvRC2MAjJl+rXuXSHLhhGOiJTk68unWLNziDtNQzcSXG/Z5c1hA+acJSGqDoJGEGs4FVM136og== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.1.tgz#cd9d0eb11309c597dffd26277cd1bd7c5b1e0e2f" - integrity sha512-QGoCN/my0eAfa4tx5ytDxArIoz2i58jFFVUGso1Lekn54JvSt+WLz2p3uyTGatZ03Bp9836elhFnIopn12WvBw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~4.0.1" - "@abp/bootstrap" "~4.0.1" - "@abp/bootstrap-datepicker" "~4.0.1" - "@abp/datatables.net-bs4" "~4.0.1" - "@abp/font-awesome" "~4.0.1" - "@abp/jquery-form" "~4.0.1" - "@abp/jquery-validation-unobtrusive" "~4.0.1" - "@abp/lodash" "~4.0.1" - "@abp/luxon" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/select2" "~4.0.1" - "@abp/sweetalert" "~4.0.1" - "@abp/timeago" "~4.0.1" - "@abp/toastr" "~4.0.1" - -"@abp/aspnetcore.mvc.ui@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.1.tgz#6490c147a56e4f7055d2ca77f20baf1f60f56867" - integrity sha512-4B3icJrlpuZgMaX52ninyaenH7zLwepePEscDrLaFY9wyonKpZ2zh+xplnyM6vjNd+PhErWuA2+ssCswFhrJ3A== +"@abp/aspnetcore.mvc.ui.theme.basic@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.1.0-rc.2.tgz#b9462cbe36c41d68e2f44b79a3a2dba2c1b2b54a" + integrity sha512-KW3J6HnN1zZrCmrWmEcXBnGIOeuJDdp1jUECAm4Bdxi++VzfIbGlVvpcvUdT1E213reOUWi4dPhcej12DwrmDw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui.theme.shared@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.1.0-rc.2.tgz#d64cea1e504bcd3a08a1819025d40f3f84f0aadc" + integrity sha512-A/DRLwtJO7YCdqAgSF84wNRKjvGEQvcBocIwRxXCJEe3drxMoSwkAGjXQlxIYWZKdYbYUWDTjil2Mvwf91GUqg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~4.1.0-rc.2" + "@abp/bootstrap" "~4.1.0-rc.2" + "@abp/bootstrap-datepicker" "~4.1.0-rc.2" + "@abp/datatables.net-bs4" "~4.1.0-rc.2" + "@abp/font-awesome" "~4.1.0-rc.2" + "@abp/jquery-form" "~4.1.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~4.1.0-rc.2" + "@abp/lodash" "~4.1.0-rc.2" + "@abp/luxon" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/select2" "~4.1.0-rc.2" + "@abp/sweetalert" "~4.1.0-rc.2" + "@abp/timeago" "~4.1.0-rc.2" + "@abp/toastr" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.1.0-rc.2.tgz#54bf30def590e6d25fc35f77253888f3d9f74b9c" + integrity sha512-eOh5IBn4eNAjj2i6tlLRIV/r61Ef7+Z3PNvGgdml/XCo50el4G9XE7shxuGOY+MaFMfmsST2tcJlO9iAo9n2Yw== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,145 +43,145 @@ micromatch "^4.0.2" path "^0.12.7" -"@abp/bootstrap-datepicker@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.1.tgz#aad891263edff66f816e003ba4fa7f8acfe8e0b6" - integrity sha512-S0oaVZmXsDcOJLAyoGY0TvP/7bZx0GHIbU9BIhIL2Wl74HYaokjkTr6/IleIek9YeiF2vm9FkrUP1dKH/4f7Gg== +"@abp/bootstrap-datepicker@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.1.0-rc.2.tgz#d3fe863222a11771d366b1a3c246aaf34df94081" + integrity sha512-vn2xWAK3xqo5fMZJ9dOAZZmL+ZUnzZZNh3lF6uA97wTN/SbePlmHBYJpsCKIxOwbJS2HCvekHGJN/Ps4oEjlbw== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.1.tgz#3e41bdf9b3e9f8c497b9fafe22a4851d0401b31b" - integrity sha512-GoSaNWvswRHVoUrq7xClFQYtwqIlyS/vp/TdY+j5FFZP7ud89+ZGpdNqYqq5l9/6aaYa7v4b9mNTZ/1JRzAOYg== +"@abp/bootstrap@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.1.0-rc.2.tgz#b5132cf4c4c92fe833823cf2b91ab1b0167b0ecf" + integrity sha512-SsWEV0DveBIHiG051E6aBB371D15QIsGeo+POFhvQUvrlmzMBlFCAlmH0ef8w1n+3M3C37irCgEGKctt2pbcxQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" bootstrap "^4.5.0" bootstrap-v4-rtl "4.4.1-2" -"@abp/core@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.1.tgz#1df32bc058f45571605670ca81c226a1bd87400c" - integrity sha512-8UT5lwqV/luVG/SxePSTD2FRbZXwXv3cZJKjw+gpBjhD0slWrh51XEOHsM8ciTuhcvV/tsqVU9nXckDMdO58fw== +"@abp/core@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.1.0-rc.2.tgz#d306106a53fa56109751be0099785c94f43be56f" + integrity sha512-b0mOYSz8hNgZ/hBeYg8hkthJgE8CLyHNa2NcythPoIW8RR5qHmDtGoFnuFovLvLk7r+M4NWyxXRKEshSszIPyA== dependencies: - "@abp/utils" "^4.0.1" + "@abp/utils" "^4.1.0-rc.2" -"@abp/datatables.net-bs4@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.1.tgz#7538baad0eff24eca7f4246d020852f83139f645" - integrity sha512-S52jNPF4if68V+P/33NrtGPJXf6xrqgyZzz9b7qBR7HuUm3Nsn7bAslh3JNduNec/sFuE4Utl/xsFHZNjBWEog== +"@abp/datatables.net-bs4@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.1.0-rc.2.tgz#99aa1fbad91939fc23265324a3d8a45d0c1e5a7a" + integrity sha512-Y9UyqniOkx5DJO+2GGurnQE1yfRmGaQ3y7V07gKWRq+gHLUhE+vfgOLVpGM6ufdTIbLvVw5Ng+3gfOmPlUnpxg== dependencies: - "@abp/datatables.net" "~4.0.1" + "@abp/datatables.net" "~4.1.0-rc.2" datatables.net-bs4 "^1.10.21" -"@abp/datatables.net@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.1.tgz#eb89716a37351c41b5bccfc2db88fc7ceb991a26" - integrity sha512-APFLui0w8MqsBWqP/K0QkT5cBq5SsWiqMaIGTXQKinMVLV597sUszrlhe1ISU2PqeD7iX6pCZNNOTI1NEUn9/Q== +"@abp/datatables.net@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.1.0-rc.2.tgz#1a134688259d32187d822d8a49c7a68b4cc226c7" + integrity sha512-9o5g8s7ZTlThd1FMFmO7wS+MxmXgUMmiWx7Hwara9ypfJPd0vanz10bQAdTpLiDy/aa0tUmz0xOVj73yvBJm9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" datatables.net "^1.10.21" -"@abp/font-awesome@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.1.tgz#8a9d83b2c2adfcd5abcbd9c31c315460d44a321e" - integrity sha512-+6+m/DKMnfkeQiWUsMlB6Da8u6yREyN2oQYGYhSRAK8419ym8RHHrqKJv2AClI4iLq2ppHZj8WF84+SeoCekRg== +"@abp/font-awesome@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.1.0-rc.2.tgz#ecf490861c09250cf61611ac74cec5ab4392e807" + integrity sha512-6yAsf/ee2hdrHHUACql8c3gY54Hd7YAK2olHymyc3Io2hhK2VxXRc2W2oRSwbQ9GsSE+XDrEVtjIR64nBseTeg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" "@fortawesome/fontawesome-free" "^5.13.0" -"@abp/jquery-form@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.1.tgz#6dc1922b2800dd635f20881a82e08104a1dd1bb5" - integrity sha512-JMBZYu/MI/GjaLTBOMB5iv8cagnLpReDULNC3r6tLNNqB1R8f3Cg1T7nF4YCuU9SYMqis1P/AuE4oEh+4rQdAQ== +"@abp/jquery-form@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.1.0-rc.2.tgz#76dff67a3fe6e6ad7bd60bb909de93c09966cc0a" + integrity sha512-LGafwxyRYUbHQlJ9pPbYdkVqzdT/y1Fp4Nr4C3W5jxsJuaSICl0RPkRHIPALeoqbpEWuj6dVep6ZuO9hhxBzNw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.1.tgz#4142ca31c0830fe24a1467e8cf13b55ba9d7c1dd" - integrity sha512-rdSRTcdKCHmarbrVgmPYdTiJ0G/aFKd+dr0krO7fALPTuQKChbDnHOO4/JvQSc+cd9faxa8c6ZWvlHdsof23tQ== +"@abp/jquery-validation-unobtrusive@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.1.0-rc.2.tgz#1f1d395cfa47740d47303ff512592ff1993f9e13" + integrity sha512-0LXWvgfyLHVw7qRVOmY0rfVlq+yJq/nhbcVoYK+QbmKnrFu+KZg0KNMOD8wTXs8mZ1EKGQpoQKWxImtCnGrV/A== dependencies: - "@abp/jquery-validation" "~4.0.1" + "@abp/jquery-validation" "~4.1.0-rc.2" jquery-validation-unobtrusive "^3.2.11" -"@abp/jquery-validation@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.1.tgz#74e7d795468c6986f2db15662631fcd4f67c679e" - integrity sha512-FX26aQCsMBdVWAJb7S37Lt7KoHAEHoYguh/qfZIARCpOYOOWvxfDz1wTrmADUkqdillqEiCeD/Imj8bYH9Faaw== +"@abp/jquery-validation@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.1.0-rc.2.tgz#ad4b464fd0133eab8d08c781c7d7c4e00bc4918d" + integrity sha512-iLTobfwqDk7iiQxvv5UowxOKywsh/77VlAVktstnFG3N3Y73+JYKzM0mGM/j4zM1OrjbF9/cnPnDVX7bATPz9w== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-validation "^1.19.2" -"@abp/jquery@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.1.tgz#aa554accb16600fd586c3a4f088040cd26d0bde8" - integrity sha512-MtiRKOLyjEWux+whPP3+zwPbpj8or756JtgjnwOTDB9tp9HLCYUaskt+oalYPvob24nDZcNu2RnMALYdCVhZAQ== +"@abp/jquery@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.1.0-rc.2.tgz#0f64cad5b1ae3e47d2344e5fb30c347b89d6d2bb" + integrity sha512-YubZwMJIN+UcfxfUlt3usfcLMG9WcXNpemUsdBtlKNzti562KZMIHPFLRL+DsiqvzZ74h2PxSWWsxS42Z7z0Yw== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" jquery "~3.5.1" -"@abp/lodash@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.1.tgz#ec261ccaab8a70d5b32a8a7c22387e48936d38d4" - integrity sha512-Dav1QKbBeGR4VVbHHe1s3OEzN7wnb9K/vwzHrWmtO8D1Q5Z3433xjNmgL5VQ9gfxXqooSfEO4gAovZklMDHDew== +"@abp/lodash@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.1.0-rc.2.tgz#9281c641ab7b7b33e7acf12815dc461e7ae967b9" + integrity sha512-RqdekrAyLPaLNJddmrq89EdrI1xg4296tOafFLHvirgRWisJTIa9bflTOwMwEg9FNdLJgA0zHi4WdAMer0qZdA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" lodash "^4.17.15" -"@abp/luxon@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.1.tgz#a540750b1605dbac856ce9c2e776c2fecf6392f9" - integrity sha512-eRumVB7UIf2XH6OZVUTvcKw0A/OSAfYV59fM+Wc4dAkNcmsNZI0gD1o0AigSGNCxTV6v+W2bFrsuooSqK99Y0Q== +"@abp/luxon@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.1.0-rc.2.tgz#78fc1cf651d7c19b87a31823cd3ce68961d6b1e6" + integrity sha512-U4e9uGZlg9xj9tBNP337v3wiaSR6qxWsBgh/duQGWrqV+75LlQjYcZaPoXDidUUS6U6epDSR2pc2T39rahcgSQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" luxon "^1.24.1" -"@abp/malihu-custom-scrollbar-plugin@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.1.tgz#0a556423a67b6c949e32ffcacd72256dea6c31ee" - integrity sha512-YTwYpnQ1ZrON70gvJcnNZRwB3Ze4olGcXxiPvmRgSHbGJkSnHYJiP6PvsN1F3HDFukAJ/iUu+WwEe8OBwlyLXA== +"@abp/malihu-custom-scrollbar-plugin@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.1.0-rc.2.tgz#36553e71052cad9734e0c9b2c65759e538468648" + integrity sha512-JQ6PCcj5qmF9MxNRPAsKHHnqBPCdn4lQnwxZrHcG9tD70Gx+NfC4UH41tqXI+htba4k0PHRyH2y39Q1iJm0NFA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.1.tgz#8983e7b5c3afb862f08b2730b70e59d726e9b5d5" - integrity sha512-WdzY2hvsS/4vz/VXpxq2muSzzE8ggchiIrICy/WKchJxL9L08DM796t6aE6rEl9wucY8XEzzWrPOVqAjJmnXFA== +"@abp/select2@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.1.0-rc.2.tgz#c48e865f401ddce32dff2a7a14ae07c4bde2f57b" + integrity sha512-YYK/SIqXQcSDQFMVg/ogohc76d4JDrOVQEbzfkNNI5bKVJo+hkqtNzAwV9FLdPZZNw15QMv0eF1ie4aUtIxyaA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.1.tgz#0088610915ad6db0a140b77832a37c10066eb4ee" - integrity sha512-t4/44oQCMngSjVqmeRWXwrXa/pRKc3CEpyyTiGIXki4dWJ21j0ePCw2l3rvOJWnpoCznhxa/UGxLfRfK1NEzRg== +"@abp/sweetalert@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.1.0-rc.2.tgz#cdcaf8e9a33cf218a687fd6a42cfe1c85d89c6b7" + integrity sha512-sjQd8TF9oUnaQ1OPTGdVyAfWqSZEk4bRbC/qw2CouEOfRLatzkC0JcmzFLN0f5N1am1RQwkFakpENKH7NqTCvg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" sweetalert "^2.1.2" -"@abp/timeago@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.1.tgz#8c161645534eb1f62fe4607450acf7345729e711" - integrity sha512-PsPobV79U2qzVY+WBsmJM1ohSF4jqcLnL4/7qyJvxlb1WwbCl1F5D4cpiJP4zsM4clPW4mbSsiauMNp+HTNKEA== +"@abp/timeago@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.1.0-rc.2.tgz#445d043ae482b76799b496ae6565abfaf75a34b9" + integrity sha512-wWx56EZMUGIfqJV5JLCvUp4RVhKXHYLQaVNQSF8E05COXmSQwFThVS7vbuiODFp2BGm6RAqCVtZDCreu2B8z9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.1.tgz#ecb6f6193b7edc3150d0614ab9457472baf1cce3" - integrity sha512-bTTz0O8zj7fMhdoummP2Ed5Z8SJTmR6svzNchBXNDrnRAcDQvTihPTcg0UpH8BEDFczbLowq09CG2A/RMSJoug== +"@abp/toastr@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.1.0-rc.2.tgz#1af16fa8687201b6b9c7229d087a4233998703b9" + integrity sha512-g+Jl5H1ZHoJ4JwWuix0xA+GMFY42pwq8WYjxP6qE2/Y2aixYHVIui15eBqF2L06yXOt53YFcC1+pxjrp91xHxw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" toastr "^2.1.4" -"@abp/utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" - integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== +"@abp/utils@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.2.tgz#eb6dbf0ee493d0f050b37347d2d6d283098aedae" + integrity sha512-V2k5I89lVBoeGIKgg4p2H9GlMAcDWbctwKZPVwBEMVEVm1uTR2xQAWdTdSFd5Q8I8Xsf/aIG8ELM7l5j2h7/zQ== dependencies: just-compare "^1.3.0" diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj index 7386e0aa09..fce2337c45 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj @@ -34,7 +34,7 @@ - + diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json index 1171b7f8a6..90988e3200 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^4.1.0-rc.2" } } \ No newline at end of file diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/yarn.lock b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/yarn.lock index 33139bd99e..241d313710 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/yarn.lock +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.1.tgz#ce8e3eb830a8e8f9eecb1a3b3bd70c2832fdf15e" - integrity sha512-w+ZG8Ewx9wWfbvRC2MAjJl+rXuXSHLhhGOiJTk68unWLNziDtNQzcSXG/Z5c1hA+acJSGqDoJGEGs4FVM136og== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.1.tgz#cd9d0eb11309c597dffd26277cd1bd7c5b1e0e2f" - integrity sha512-QGoCN/my0eAfa4tx5ytDxArIoz2i58jFFVUGso1Lekn54JvSt+WLz2p3uyTGatZ03Bp9836elhFnIopn12WvBw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~4.0.1" - "@abp/bootstrap" "~4.0.1" - "@abp/bootstrap-datepicker" "~4.0.1" - "@abp/datatables.net-bs4" "~4.0.1" - "@abp/font-awesome" "~4.0.1" - "@abp/jquery-form" "~4.0.1" - "@abp/jquery-validation-unobtrusive" "~4.0.1" - "@abp/lodash" "~4.0.1" - "@abp/luxon" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/select2" "~4.0.1" - "@abp/sweetalert" "~4.0.1" - "@abp/timeago" "~4.0.1" - "@abp/toastr" "~4.0.1" - -"@abp/aspnetcore.mvc.ui@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.1.tgz#6490c147a56e4f7055d2ca77f20baf1f60f56867" - integrity sha512-4B3icJrlpuZgMaX52ninyaenH7zLwepePEscDrLaFY9wyonKpZ2zh+xplnyM6vjNd+PhErWuA2+ssCswFhrJ3A== +"@abp/aspnetcore.mvc.ui.theme.basic@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.1.0-rc.2.tgz#b9462cbe36c41d68e2f44b79a3a2dba2c1b2b54a" + integrity sha512-KW3J6HnN1zZrCmrWmEcXBnGIOeuJDdp1jUECAm4Bdxi++VzfIbGlVvpcvUdT1E213reOUWi4dPhcej12DwrmDw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui.theme.shared@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.1.0-rc.2.tgz#d64cea1e504bcd3a08a1819025d40f3f84f0aadc" + integrity sha512-A/DRLwtJO7YCdqAgSF84wNRKjvGEQvcBocIwRxXCJEe3drxMoSwkAGjXQlxIYWZKdYbYUWDTjil2Mvwf91GUqg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~4.1.0-rc.2" + "@abp/bootstrap" "~4.1.0-rc.2" + "@abp/bootstrap-datepicker" "~4.1.0-rc.2" + "@abp/datatables.net-bs4" "~4.1.0-rc.2" + "@abp/font-awesome" "~4.1.0-rc.2" + "@abp/jquery-form" "~4.1.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~4.1.0-rc.2" + "@abp/lodash" "~4.1.0-rc.2" + "@abp/luxon" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/select2" "~4.1.0-rc.2" + "@abp/sweetalert" "~4.1.0-rc.2" + "@abp/timeago" "~4.1.0-rc.2" + "@abp/toastr" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.1.0-rc.2.tgz#54bf30def590e6d25fc35f77253888f3d9f74b9c" + integrity sha512-eOh5IBn4eNAjj2i6tlLRIV/r61Ef7+Z3PNvGgdml/XCo50el4G9XE7shxuGOY+MaFMfmsST2tcJlO9iAo9n2Yw== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,145 +43,145 @@ micromatch "^4.0.2" path "^0.12.7" -"@abp/bootstrap-datepicker@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.1.tgz#aad891263edff66f816e003ba4fa7f8acfe8e0b6" - integrity sha512-S0oaVZmXsDcOJLAyoGY0TvP/7bZx0GHIbU9BIhIL2Wl74HYaokjkTr6/IleIek9YeiF2vm9FkrUP1dKH/4f7Gg== +"@abp/bootstrap-datepicker@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.1.0-rc.2.tgz#d3fe863222a11771d366b1a3c246aaf34df94081" + integrity sha512-vn2xWAK3xqo5fMZJ9dOAZZmL+ZUnzZZNh3lF6uA97wTN/SbePlmHBYJpsCKIxOwbJS2HCvekHGJN/Ps4oEjlbw== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.1.tgz#3e41bdf9b3e9f8c497b9fafe22a4851d0401b31b" - integrity sha512-GoSaNWvswRHVoUrq7xClFQYtwqIlyS/vp/TdY+j5FFZP7ud89+ZGpdNqYqq5l9/6aaYa7v4b9mNTZ/1JRzAOYg== +"@abp/bootstrap@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.1.0-rc.2.tgz#b5132cf4c4c92fe833823cf2b91ab1b0167b0ecf" + integrity sha512-SsWEV0DveBIHiG051E6aBB371D15QIsGeo+POFhvQUvrlmzMBlFCAlmH0ef8w1n+3M3C37irCgEGKctt2pbcxQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" bootstrap "^4.5.0" bootstrap-v4-rtl "4.4.1-2" -"@abp/core@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.1.tgz#1df32bc058f45571605670ca81c226a1bd87400c" - integrity sha512-8UT5lwqV/luVG/SxePSTD2FRbZXwXv3cZJKjw+gpBjhD0slWrh51XEOHsM8ciTuhcvV/tsqVU9nXckDMdO58fw== +"@abp/core@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.1.0-rc.2.tgz#d306106a53fa56109751be0099785c94f43be56f" + integrity sha512-b0mOYSz8hNgZ/hBeYg8hkthJgE8CLyHNa2NcythPoIW8RR5qHmDtGoFnuFovLvLk7r+M4NWyxXRKEshSszIPyA== dependencies: - "@abp/utils" "^4.0.1" + "@abp/utils" "^4.1.0-rc.2" -"@abp/datatables.net-bs4@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.1.tgz#7538baad0eff24eca7f4246d020852f83139f645" - integrity sha512-S52jNPF4if68V+P/33NrtGPJXf6xrqgyZzz9b7qBR7HuUm3Nsn7bAslh3JNduNec/sFuE4Utl/xsFHZNjBWEog== +"@abp/datatables.net-bs4@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.1.0-rc.2.tgz#99aa1fbad91939fc23265324a3d8a45d0c1e5a7a" + integrity sha512-Y9UyqniOkx5DJO+2GGurnQE1yfRmGaQ3y7V07gKWRq+gHLUhE+vfgOLVpGM6ufdTIbLvVw5Ng+3gfOmPlUnpxg== dependencies: - "@abp/datatables.net" "~4.0.1" + "@abp/datatables.net" "~4.1.0-rc.2" datatables.net-bs4 "^1.10.21" -"@abp/datatables.net@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.1.tgz#eb89716a37351c41b5bccfc2db88fc7ceb991a26" - integrity sha512-APFLui0w8MqsBWqP/K0QkT5cBq5SsWiqMaIGTXQKinMVLV597sUszrlhe1ISU2PqeD7iX6pCZNNOTI1NEUn9/Q== +"@abp/datatables.net@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.1.0-rc.2.tgz#1a134688259d32187d822d8a49c7a68b4cc226c7" + integrity sha512-9o5g8s7ZTlThd1FMFmO7wS+MxmXgUMmiWx7Hwara9ypfJPd0vanz10bQAdTpLiDy/aa0tUmz0xOVj73yvBJm9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" datatables.net "^1.10.21" -"@abp/font-awesome@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.1.tgz#8a9d83b2c2adfcd5abcbd9c31c315460d44a321e" - integrity sha512-+6+m/DKMnfkeQiWUsMlB6Da8u6yREyN2oQYGYhSRAK8419ym8RHHrqKJv2AClI4iLq2ppHZj8WF84+SeoCekRg== +"@abp/font-awesome@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.1.0-rc.2.tgz#ecf490861c09250cf61611ac74cec5ab4392e807" + integrity sha512-6yAsf/ee2hdrHHUACql8c3gY54Hd7YAK2olHymyc3Io2hhK2VxXRc2W2oRSwbQ9GsSE+XDrEVtjIR64nBseTeg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" "@fortawesome/fontawesome-free" "^5.13.0" -"@abp/jquery-form@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.1.tgz#6dc1922b2800dd635f20881a82e08104a1dd1bb5" - integrity sha512-JMBZYu/MI/GjaLTBOMB5iv8cagnLpReDULNC3r6tLNNqB1R8f3Cg1T7nF4YCuU9SYMqis1P/AuE4oEh+4rQdAQ== +"@abp/jquery-form@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.1.0-rc.2.tgz#76dff67a3fe6e6ad7bd60bb909de93c09966cc0a" + integrity sha512-LGafwxyRYUbHQlJ9pPbYdkVqzdT/y1Fp4Nr4C3W5jxsJuaSICl0RPkRHIPALeoqbpEWuj6dVep6ZuO9hhxBzNw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.1.tgz#4142ca31c0830fe24a1467e8cf13b55ba9d7c1dd" - integrity sha512-rdSRTcdKCHmarbrVgmPYdTiJ0G/aFKd+dr0krO7fALPTuQKChbDnHOO4/JvQSc+cd9faxa8c6ZWvlHdsof23tQ== +"@abp/jquery-validation-unobtrusive@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.1.0-rc.2.tgz#1f1d395cfa47740d47303ff512592ff1993f9e13" + integrity sha512-0LXWvgfyLHVw7qRVOmY0rfVlq+yJq/nhbcVoYK+QbmKnrFu+KZg0KNMOD8wTXs8mZ1EKGQpoQKWxImtCnGrV/A== dependencies: - "@abp/jquery-validation" "~4.0.1" + "@abp/jquery-validation" "~4.1.0-rc.2" jquery-validation-unobtrusive "^3.2.11" -"@abp/jquery-validation@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.1.tgz#74e7d795468c6986f2db15662631fcd4f67c679e" - integrity sha512-FX26aQCsMBdVWAJb7S37Lt7KoHAEHoYguh/qfZIARCpOYOOWvxfDz1wTrmADUkqdillqEiCeD/Imj8bYH9Faaw== +"@abp/jquery-validation@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.1.0-rc.2.tgz#ad4b464fd0133eab8d08c781c7d7c4e00bc4918d" + integrity sha512-iLTobfwqDk7iiQxvv5UowxOKywsh/77VlAVktstnFG3N3Y73+JYKzM0mGM/j4zM1OrjbF9/cnPnDVX7bATPz9w== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-validation "^1.19.2" -"@abp/jquery@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.1.tgz#aa554accb16600fd586c3a4f088040cd26d0bde8" - integrity sha512-MtiRKOLyjEWux+whPP3+zwPbpj8or756JtgjnwOTDB9tp9HLCYUaskt+oalYPvob24nDZcNu2RnMALYdCVhZAQ== +"@abp/jquery@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.1.0-rc.2.tgz#0f64cad5b1ae3e47d2344e5fb30c347b89d6d2bb" + integrity sha512-YubZwMJIN+UcfxfUlt3usfcLMG9WcXNpemUsdBtlKNzti562KZMIHPFLRL+DsiqvzZ74h2PxSWWsxS42Z7z0Yw== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" jquery "~3.5.1" -"@abp/lodash@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.1.tgz#ec261ccaab8a70d5b32a8a7c22387e48936d38d4" - integrity sha512-Dav1QKbBeGR4VVbHHe1s3OEzN7wnb9K/vwzHrWmtO8D1Q5Z3433xjNmgL5VQ9gfxXqooSfEO4gAovZklMDHDew== +"@abp/lodash@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.1.0-rc.2.tgz#9281c641ab7b7b33e7acf12815dc461e7ae967b9" + integrity sha512-RqdekrAyLPaLNJddmrq89EdrI1xg4296tOafFLHvirgRWisJTIa9bflTOwMwEg9FNdLJgA0zHi4WdAMer0qZdA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" lodash "^4.17.15" -"@abp/luxon@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.1.tgz#a540750b1605dbac856ce9c2e776c2fecf6392f9" - integrity sha512-eRumVB7UIf2XH6OZVUTvcKw0A/OSAfYV59fM+Wc4dAkNcmsNZI0gD1o0AigSGNCxTV6v+W2bFrsuooSqK99Y0Q== +"@abp/luxon@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.1.0-rc.2.tgz#78fc1cf651d7c19b87a31823cd3ce68961d6b1e6" + integrity sha512-U4e9uGZlg9xj9tBNP337v3wiaSR6qxWsBgh/duQGWrqV+75LlQjYcZaPoXDidUUS6U6epDSR2pc2T39rahcgSQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" luxon "^1.24.1" -"@abp/malihu-custom-scrollbar-plugin@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.1.tgz#0a556423a67b6c949e32ffcacd72256dea6c31ee" - integrity sha512-YTwYpnQ1ZrON70gvJcnNZRwB3Ze4olGcXxiPvmRgSHbGJkSnHYJiP6PvsN1F3HDFukAJ/iUu+WwEe8OBwlyLXA== +"@abp/malihu-custom-scrollbar-plugin@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.1.0-rc.2.tgz#36553e71052cad9734e0c9b2c65759e538468648" + integrity sha512-JQ6PCcj5qmF9MxNRPAsKHHnqBPCdn4lQnwxZrHcG9tD70Gx+NfC4UH41tqXI+htba4k0PHRyH2y39Q1iJm0NFA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.1.tgz#8983e7b5c3afb862f08b2730b70e59d726e9b5d5" - integrity sha512-WdzY2hvsS/4vz/VXpxq2muSzzE8ggchiIrICy/WKchJxL9L08DM796t6aE6rEl9wucY8XEzzWrPOVqAjJmnXFA== +"@abp/select2@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.1.0-rc.2.tgz#c48e865f401ddce32dff2a7a14ae07c4bde2f57b" + integrity sha512-YYK/SIqXQcSDQFMVg/ogohc76d4JDrOVQEbzfkNNI5bKVJo+hkqtNzAwV9FLdPZZNw15QMv0eF1ie4aUtIxyaA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.1.tgz#0088610915ad6db0a140b77832a37c10066eb4ee" - integrity sha512-t4/44oQCMngSjVqmeRWXwrXa/pRKc3CEpyyTiGIXki4dWJ21j0ePCw2l3rvOJWnpoCznhxa/UGxLfRfK1NEzRg== +"@abp/sweetalert@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.1.0-rc.2.tgz#cdcaf8e9a33cf218a687fd6a42cfe1c85d89c6b7" + integrity sha512-sjQd8TF9oUnaQ1OPTGdVyAfWqSZEk4bRbC/qw2CouEOfRLatzkC0JcmzFLN0f5N1am1RQwkFakpENKH7NqTCvg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" sweetalert "^2.1.2" -"@abp/timeago@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.1.tgz#8c161645534eb1f62fe4607450acf7345729e711" - integrity sha512-PsPobV79U2qzVY+WBsmJM1ohSF4jqcLnL4/7qyJvxlb1WwbCl1F5D4cpiJP4zsM4clPW4mbSsiauMNp+HTNKEA== +"@abp/timeago@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.1.0-rc.2.tgz#445d043ae482b76799b496ae6565abfaf75a34b9" + integrity sha512-wWx56EZMUGIfqJV5JLCvUp4RVhKXHYLQaVNQSF8E05COXmSQwFThVS7vbuiODFp2BGm6RAqCVtZDCreu2B8z9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.1.tgz#ecb6f6193b7edc3150d0614ab9457472baf1cce3" - integrity sha512-bTTz0O8zj7fMhdoummP2Ed5Z8SJTmR6svzNchBXNDrnRAcDQvTihPTcg0UpH8BEDFczbLowq09CG2A/RMSJoug== +"@abp/toastr@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.1.0-rc.2.tgz#1af16fa8687201b6b9c7229d087a4233998703b9" + integrity sha512-g+Jl5H1ZHoJ4JwWuix0xA+GMFY42pwq8WYjxP6qE2/Y2aixYHVIui15eBqF2L06yXOt53YFcC1+pxjrp91xHxw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" toastr "^2.1.4" -"@abp/utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" - integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== +"@abp/utils@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.2.tgz#eb6dbf0ee493d0f050b37347d2d6d283098aedae" + integrity sha512-V2k5I89lVBoeGIKgg4p2H9GlMAcDWbctwKZPVwBEMVEVm1uTR2xQAWdTdSFd5Q8I8Xsf/aIG8ELM7l5j2h7/zQ== dependencies: just-compare "^1.3.0" diff --git a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj index 3e102fa6e3..e78ce77d08 100644 --- a/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj +++ b/templates/app/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj @@ -22,8 +22,8 @@ - - + + diff --git a/templates/console/common.props b/templates/console/common.props index 233f41c1ba..7e29afcfb8 100644 --- a/templates/console/common.props +++ b/templates/console/common.props @@ -4,9 +4,4 @@ 0.1.0 $(NoWarn);CS1591;CS0436 - - - - - \ No newline at end of file diff --git a/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index 4f91776d39..2f8497b830 100644 --- a/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/console/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -12,7 +12,7 @@ - + diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index 8ab64d8bd8..6796923948 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -15,13 +15,13 @@ }, "private": true, "dependencies": { - "@abp/ng.components": "~4.0.1", - "@abp/ng.core": "~4.0.1", - "@abp/ng.identity": "~4.0.1", - "@abp/ng.setting-management": "~4.0.1", - "@abp/ng.tenant-management": "~4.0.1", - "@abp/ng.theme.basic": "~4.0.1", - "@abp/ng.theme.shared": "~4.0.1", + "@abp/ng.components": "~4.1.0-rc.2", + "@abp/ng.core": "~4.1.0-rc.2", + "@abp/ng.identity": "~4.1.0-rc.2", + "@abp/ng.setting-management": "~4.1.0-rc.2", + "@abp/ng.tenant-management": "~4.1.0-rc.2", + "@abp/ng.theme.basic": "~4.1.0-rc.2", + "@abp/ng.theme.shared": "~4.1.0-rc.2", "@angular/animations": "~11.0.0", "@angular/common": "~11.0.0", "@angular/compiler": "~11.0.0", @@ -35,7 +35,7 @@ "zone.js": "~0.10.2" }, "devDependencies": { - "@abp/ng.schematics": "~4.0.1", + "@abp/ng.schematics": "~4.1.0-rc.2", "@angular-devkit/build-angular": "~0.1100.0", "@angular/cli": "~11.0.0", "@angular/compiler-cli": "~11.0.0", diff --git a/templates/module/angular/projects/my-project-name/package.json b/templates/module/angular/projects/my-project-name/package.json index 892e4fe987..df44ce59a3 100644 --- a/templates/module/angular/projects/my-project-name/package.json +++ b/templates/module/angular/projects/my-project-name/package.json @@ -4,8 +4,8 @@ "peerDependencies": { "@angular/common": "^9.1.11", "@angular/core": "^9.1.11", - "@abp/ng.core": ">=4.0.1", - "@abp/ng.theme.shared": ">=4.0.1" + "@abp/ng.core": ">=4.1.0-rc.2", + "@abp/ng.theme.shared": ">=4.1.0-rc.2" }, "dependencies": { "tslib": "^2.0.0" diff --git a/templates/module/aspnet-core/common.props b/templates/module/aspnet-core/common.props index 420d9c492c..c1ff420edf 100644 --- a/templates/module/aspnet-core/common.props +++ b/templates/module/aspnet-core/common.props @@ -3,11 +3,6 @@ latest 0.1.0 $(NoWarn);CS1591;CS0436 - module + module - - - - - \ No newline at end of file diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj index 9090e83e62..444e49801f 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host/MyCompanyName.MyProjectName.Blazor.Host.csproj @@ -8,10 +8,10 @@ - - - - + + + + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj index 10097d1f3b..1705d64e93 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj @@ -13,9 +13,9 @@ - - - + + + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs index 9dbb9987ed..a14632e97f 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs @@ -174,7 +174,7 @@ namespace MyCompanyName.MyProjectName app.UseAbpRequestLocalization(); app.UseAuthorization(); app.UseSwagger(); - app.UseSwaggerUI(options => + app.UseAbpSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj index 2ada24f679..059027f920 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj @@ -10,8 +10,8 @@ - - + + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json index 5e131b4756..8f06264a30 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-identityserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^4.1.0-rc.2" } } \ No newline at end of file diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/yarn.lock b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/yarn.lock index 12469bed18..49043f9055 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/yarn.lock +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.1.tgz#ce8e3eb830a8e8f9eecb1a3b3bd70c2832fdf15e" - integrity sha512-w+ZG8Ewx9wWfbvRC2MAjJl+rXuXSHLhhGOiJTk68unWLNziDtNQzcSXG/Z5c1hA+acJSGqDoJGEGs4FVM136og== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.1.tgz#cd9d0eb11309c597dffd26277cd1bd7c5b1e0e2f" - integrity sha512-QGoCN/my0eAfa4tx5ytDxArIoz2i58jFFVUGso1Lekn54JvSt+WLz2p3uyTGatZ03Bp9836elhFnIopn12WvBw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~4.0.1" - "@abp/bootstrap" "~4.0.1" - "@abp/bootstrap-datepicker" "~4.0.1" - "@abp/datatables.net-bs4" "~4.0.1" - "@abp/font-awesome" "~4.0.1" - "@abp/jquery-form" "~4.0.1" - "@abp/jquery-validation-unobtrusive" "~4.0.1" - "@abp/lodash" "~4.0.1" - "@abp/luxon" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/select2" "~4.0.1" - "@abp/sweetalert" "~4.0.1" - "@abp/timeago" "~4.0.1" - "@abp/toastr" "~4.0.1" - -"@abp/aspnetcore.mvc.ui@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.1.tgz#6490c147a56e4f7055d2ca77f20baf1f60f56867" - integrity sha512-4B3icJrlpuZgMaX52ninyaenH7zLwepePEscDrLaFY9wyonKpZ2zh+xplnyM6vjNd+PhErWuA2+ssCswFhrJ3A== +"@abp/aspnetcore.mvc.ui.theme.basic@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.1.0-rc.2.tgz#b9462cbe36c41d68e2f44b79a3a2dba2c1b2b54a" + integrity sha512-KW3J6HnN1zZrCmrWmEcXBnGIOeuJDdp1jUECAm4Bdxi++VzfIbGlVvpcvUdT1E213reOUWi4dPhcej12DwrmDw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui.theme.shared@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.1.0-rc.2.tgz#d64cea1e504bcd3a08a1819025d40f3f84f0aadc" + integrity sha512-A/DRLwtJO7YCdqAgSF84wNRKjvGEQvcBocIwRxXCJEe3drxMoSwkAGjXQlxIYWZKdYbYUWDTjil2Mvwf91GUqg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~4.1.0-rc.2" + "@abp/bootstrap" "~4.1.0-rc.2" + "@abp/bootstrap-datepicker" "~4.1.0-rc.2" + "@abp/datatables.net-bs4" "~4.1.0-rc.2" + "@abp/font-awesome" "~4.1.0-rc.2" + "@abp/jquery-form" "~4.1.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~4.1.0-rc.2" + "@abp/lodash" "~4.1.0-rc.2" + "@abp/luxon" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/select2" "~4.1.0-rc.2" + "@abp/sweetalert" "~4.1.0-rc.2" + "@abp/timeago" "~4.1.0-rc.2" + "@abp/toastr" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.1.0-rc.2.tgz#54bf30def590e6d25fc35f77253888f3d9f74b9c" + integrity sha512-eOh5IBn4eNAjj2i6tlLRIV/r61Ef7+Z3PNvGgdml/XCo50el4G9XE7shxuGOY+MaFMfmsST2tcJlO9iAo9n2Yw== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,145 +43,145 @@ micromatch "^4.0.2" path "^0.12.7" -"@abp/bootstrap-datepicker@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.1.tgz#aad891263edff66f816e003ba4fa7f8acfe8e0b6" - integrity sha512-S0oaVZmXsDcOJLAyoGY0TvP/7bZx0GHIbU9BIhIL2Wl74HYaokjkTr6/IleIek9YeiF2vm9FkrUP1dKH/4f7Gg== +"@abp/bootstrap-datepicker@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.1.0-rc.2.tgz#d3fe863222a11771d366b1a3c246aaf34df94081" + integrity sha512-vn2xWAK3xqo5fMZJ9dOAZZmL+ZUnzZZNh3lF6uA97wTN/SbePlmHBYJpsCKIxOwbJS2HCvekHGJN/Ps4oEjlbw== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.1.tgz#3e41bdf9b3e9f8c497b9fafe22a4851d0401b31b" - integrity sha512-GoSaNWvswRHVoUrq7xClFQYtwqIlyS/vp/TdY+j5FFZP7ud89+ZGpdNqYqq5l9/6aaYa7v4b9mNTZ/1JRzAOYg== +"@abp/bootstrap@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.1.0-rc.2.tgz#b5132cf4c4c92fe833823cf2b91ab1b0167b0ecf" + integrity sha512-SsWEV0DveBIHiG051E6aBB371D15QIsGeo+POFhvQUvrlmzMBlFCAlmH0ef8w1n+3M3C37irCgEGKctt2pbcxQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" bootstrap "^4.5.0" bootstrap-v4-rtl "4.4.1-2" -"@abp/core@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.1.tgz#1df32bc058f45571605670ca81c226a1bd87400c" - integrity sha512-8UT5lwqV/luVG/SxePSTD2FRbZXwXv3cZJKjw+gpBjhD0slWrh51XEOHsM8ciTuhcvV/tsqVU9nXckDMdO58fw== +"@abp/core@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.1.0-rc.2.tgz#d306106a53fa56109751be0099785c94f43be56f" + integrity sha512-b0mOYSz8hNgZ/hBeYg8hkthJgE8CLyHNa2NcythPoIW8RR5qHmDtGoFnuFovLvLk7r+M4NWyxXRKEshSszIPyA== dependencies: - "@abp/utils" "^4.0.1" + "@abp/utils" "^4.1.0-rc.2" -"@abp/datatables.net-bs4@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.1.tgz#7538baad0eff24eca7f4246d020852f83139f645" - integrity sha512-S52jNPF4if68V+P/33NrtGPJXf6xrqgyZzz9b7qBR7HuUm3Nsn7bAslh3JNduNec/sFuE4Utl/xsFHZNjBWEog== +"@abp/datatables.net-bs4@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.1.0-rc.2.tgz#99aa1fbad91939fc23265324a3d8a45d0c1e5a7a" + integrity sha512-Y9UyqniOkx5DJO+2GGurnQE1yfRmGaQ3y7V07gKWRq+gHLUhE+vfgOLVpGM6ufdTIbLvVw5Ng+3gfOmPlUnpxg== dependencies: - "@abp/datatables.net" "~4.0.1" + "@abp/datatables.net" "~4.1.0-rc.2" datatables.net-bs4 "^1.10.21" -"@abp/datatables.net@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.1.tgz#eb89716a37351c41b5bccfc2db88fc7ceb991a26" - integrity sha512-APFLui0w8MqsBWqP/K0QkT5cBq5SsWiqMaIGTXQKinMVLV597sUszrlhe1ISU2PqeD7iX6pCZNNOTI1NEUn9/Q== +"@abp/datatables.net@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.1.0-rc.2.tgz#1a134688259d32187d822d8a49c7a68b4cc226c7" + integrity sha512-9o5g8s7ZTlThd1FMFmO7wS+MxmXgUMmiWx7Hwara9ypfJPd0vanz10bQAdTpLiDy/aa0tUmz0xOVj73yvBJm9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" datatables.net "^1.10.21" -"@abp/font-awesome@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.1.tgz#8a9d83b2c2adfcd5abcbd9c31c315460d44a321e" - integrity sha512-+6+m/DKMnfkeQiWUsMlB6Da8u6yREyN2oQYGYhSRAK8419ym8RHHrqKJv2AClI4iLq2ppHZj8WF84+SeoCekRg== +"@abp/font-awesome@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.1.0-rc.2.tgz#ecf490861c09250cf61611ac74cec5ab4392e807" + integrity sha512-6yAsf/ee2hdrHHUACql8c3gY54Hd7YAK2olHymyc3Io2hhK2VxXRc2W2oRSwbQ9GsSE+XDrEVtjIR64nBseTeg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" "@fortawesome/fontawesome-free" "^5.13.0" -"@abp/jquery-form@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.1.tgz#6dc1922b2800dd635f20881a82e08104a1dd1bb5" - integrity sha512-JMBZYu/MI/GjaLTBOMB5iv8cagnLpReDULNC3r6tLNNqB1R8f3Cg1T7nF4YCuU9SYMqis1P/AuE4oEh+4rQdAQ== +"@abp/jquery-form@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.1.0-rc.2.tgz#76dff67a3fe6e6ad7bd60bb909de93c09966cc0a" + integrity sha512-LGafwxyRYUbHQlJ9pPbYdkVqzdT/y1Fp4Nr4C3W5jxsJuaSICl0RPkRHIPALeoqbpEWuj6dVep6ZuO9hhxBzNw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.1.tgz#4142ca31c0830fe24a1467e8cf13b55ba9d7c1dd" - integrity sha512-rdSRTcdKCHmarbrVgmPYdTiJ0G/aFKd+dr0krO7fALPTuQKChbDnHOO4/JvQSc+cd9faxa8c6ZWvlHdsof23tQ== +"@abp/jquery-validation-unobtrusive@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.1.0-rc.2.tgz#1f1d395cfa47740d47303ff512592ff1993f9e13" + integrity sha512-0LXWvgfyLHVw7qRVOmY0rfVlq+yJq/nhbcVoYK+QbmKnrFu+KZg0KNMOD8wTXs8mZ1EKGQpoQKWxImtCnGrV/A== dependencies: - "@abp/jquery-validation" "~4.0.1" + "@abp/jquery-validation" "~4.1.0-rc.2" jquery-validation-unobtrusive "^3.2.11" -"@abp/jquery-validation@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.1.tgz#74e7d795468c6986f2db15662631fcd4f67c679e" - integrity sha512-FX26aQCsMBdVWAJb7S37Lt7KoHAEHoYguh/qfZIARCpOYOOWvxfDz1wTrmADUkqdillqEiCeD/Imj8bYH9Faaw== +"@abp/jquery-validation@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.1.0-rc.2.tgz#ad4b464fd0133eab8d08c781c7d7c4e00bc4918d" + integrity sha512-iLTobfwqDk7iiQxvv5UowxOKywsh/77VlAVktstnFG3N3Y73+JYKzM0mGM/j4zM1OrjbF9/cnPnDVX7bATPz9w== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-validation "^1.19.2" -"@abp/jquery@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.1.tgz#aa554accb16600fd586c3a4f088040cd26d0bde8" - integrity sha512-MtiRKOLyjEWux+whPP3+zwPbpj8or756JtgjnwOTDB9tp9HLCYUaskt+oalYPvob24nDZcNu2RnMALYdCVhZAQ== +"@abp/jquery@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.1.0-rc.2.tgz#0f64cad5b1ae3e47d2344e5fb30c347b89d6d2bb" + integrity sha512-YubZwMJIN+UcfxfUlt3usfcLMG9WcXNpemUsdBtlKNzti562KZMIHPFLRL+DsiqvzZ74h2PxSWWsxS42Z7z0Yw== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" jquery "~3.5.1" -"@abp/lodash@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.1.tgz#ec261ccaab8a70d5b32a8a7c22387e48936d38d4" - integrity sha512-Dav1QKbBeGR4VVbHHe1s3OEzN7wnb9K/vwzHrWmtO8D1Q5Z3433xjNmgL5VQ9gfxXqooSfEO4gAovZklMDHDew== +"@abp/lodash@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.1.0-rc.2.tgz#9281c641ab7b7b33e7acf12815dc461e7ae967b9" + integrity sha512-RqdekrAyLPaLNJddmrq89EdrI1xg4296tOafFLHvirgRWisJTIa9bflTOwMwEg9FNdLJgA0zHi4WdAMer0qZdA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" lodash "^4.17.15" -"@abp/luxon@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.1.tgz#a540750b1605dbac856ce9c2e776c2fecf6392f9" - integrity sha512-eRumVB7UIf2XH6OZVUTvcKw0A/OSAfYV59fM+Wc4dAkNcmsNZI0gD1o0AigSGNCxTV6v+W2bFrsuooSqK99Y0Q== +"@abp/luxon@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.1.0-rc.2.tgz#78fc1cf651d7c19b87a31823cd3ce68961d6b1e6" + integrity sha512-U4e9uGZlg9xj9tBNP337v3wiaSR6qxWsBgh/duQGWrqV+75LlQjYcZaPoXDidUUS6U6epDSR2pc2T39rahcgSQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" luxon "^1.24.1" -"@abp/malihu-custom-scrollbar-plugin@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.1.tgz#0a556423a67b6c949e32ffcacd72256dea6c31ee" - integrity sha512-YTwYpnQ1ZrON70gvJcnNZRwB3Ze4olGcXxiPvmRgSHbGJkSnHYJiP6PvsN1F3HDFukAJ/iUu+WwEe8OBwlyLXA== +"@abp/malihu-custom-scrollbar-plugin@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.1.0-rc.2.tgz#36553e71052cad9734e0c9b2c65759e538468648" + integrity sha512-JQ6PCcj5qmF9MxNRPAsKHHnqBPCdn4lQnwxZrHcG9tD70Gx+NfC4UH41tqXI+htba4k0PHRyH2y39Q1iJm0NFA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.1.tgz#8983e7b5c3afb862f08b2730b70e59d726e9b5d5" - integrity sha512-WdzY2hvsS/4vz/VXpxq2muSzzE8ggchiIrICy/WKchJxL9L08DM796t6aE6rEl9wucY8XEzzWrPOVqAjJmnXFA== +"@abp/select2@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.1.0-rc.2.tgz#c48e865f401ddce32dff2a7a14ae07c4bde2f57b" + integrity sha512-YYK/SIqXQcSDQFMVg/ogohc76d4JDrOVQEbzfkNNI5bKVJo+hkqtNzAwV9FLdPZZNw15QMv0eF1ie4aUtIxyaA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.1.tgz#0088610915ad6db0a140b77832a37c10066eb4ee" - integrity sha512-t4/44oQCMngSjVqmeRWXwrXa/pRKc3CEpyyTiGIXki4dWJ21j0ePCw2l3rvOJWnpoCznhxa/UGxLfRfK1NEzRg== +"@abp/sweetalert@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.1.0-rc.2.tgz#cdcaf8e9a33cf218a687fd6a42cfe1c85d89c6b7" + integrity sha512-sjQd8TF9oUnaQ1OPTGdVyAfWqSZEk4bRbC/qw2CouEOfRLatzkC0JcmzFLN0f5N1am1RQwkFakpENKH7NqTCvg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" sweetalert "^2.1.2" -"@abp/timeago@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.1.tgz#8c161645534eb1f62fe4607450acf7345729e711" - integrity sha512-PsPobV79U2qzVY+WBsmJM1ohSF4jqcLnL4/7qyJvxlb1WwbCl1F5D4cpiJP4zsM4clPW4mbSsiauMNp+HTNKEA== +"@abp/timeago@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.1.0-rc.2.tgz#445d043ae482b76799b496ae6565abfaf75a34b9" + integrity sha512-wWx56EZMUGIfqJV5JLCvUp4RVhKXHYLQaVNQSF8E05COXmSQwFThVS7vbuiODFp2BGm6RAqCVtZDCreu2B8z9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.1.tgz#ecb6f6193b7edc3150d0614ab9457472baf1cce3" - integrity sha512-bTTz0O8zj7fMhdoummP2Ed5Z8SJTmR6svzNchBXNDrnRAcDQvTihPTcg0UpH8BEDFczbLowq09CG2A/RMSJoug== +"@abp/toastr@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.1.0-rc.2.tgz#1af16fa8687201b6b9c7229d087a4233998703b9" + integrity sha512-g+Jl5H1ZHoJ4JwWuix0xA+GMFY42pwq8WYjxP6qE2/Y2aixYHVIui15eBqF2L06yXOt53YFcC1+pxjrp91xHxw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" toastr "^2.1.4" -"@abp/utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" - integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== +"@abp/utils@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.2.tgz#eb6dbf0ee493d0f050b37347d2d6d283098aedae" + integrity sha512-V2k5I89lVBoeGIKgg4p2H9GlMAcDWbctwKZPVwBEMVEVm1uTR2xQAWdTdSFd5Q8I8Xsf/aIG8ELM7l5j2h7/zQ== dependencies: just-compare "^1.3.0" diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj index 54c7c5c0ad..2476a0ff07 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyCompanyName.MyProjectName.Web.Host.csproj @@ -12,7 +12,7 @@ - + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json index 1171b7f8a6..90988e3200 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^4.1.0-rc.2" } } \ No newline at end of file diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/yarn.lock b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/yarn.lock index 12469bed18..49043f9055 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/yarn.lock +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.1.tgz#ce8e3eb830a8e8f9eecb1a3b3bd70c2832fdf15e" - integrity sha512-w+ZG8Ewx9wWfbvRC2MAjJl+rXuXSHLhhGOiJTk68unWLNziDtNQzcSXG/Z5c1hA+acJSGqDoJGEGs4FVM136og== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.1.tgz#cd9d0eb11309c597dffd26277cd1bd7c5b1e0e2f" - integrity sha512-QGoCN/my0eAfa4tx5ytDxArIoz2i58jFFVUGso1Lekn54JvSt+WLz2p3uyTGatZ03Bp9836elhFnIopn12WvBw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~4.0.1" - "@abp/bootstrap" "~4.0.1" - "@abp/bootstrap-datepicker" "~4.0.1" - "@abp/datatables.net-bs4" "~4.0.1" - "@abp/font-awesome" "~4.0.1" - "@abp/jquery-form" "~4.0.1" - "@abp/jquery-validation-unobtrusive" "~4.0.1" - "@abp/lodash" "~4.0.1" - "@abp/luxon" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/select2" "~4.0.1" - "@abp/sweetalert" "~4.0.1" - "@abp/timeago" "~4.0.1" - "@abp/toastr" "~4.0.1" - -"@abp/aspnetcore.mvc.ui@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.1.tgz#6490c147a56e4f7055d2ca77f20baf1f60f56867" - integrity sha512-4B3icJrlpuZgMaX52ninyaenH7zLwepePEscDrLaFY9wyonKpZ2zh+xplnyM6vjNd+PhErWuA2+ssCswFhrJ3A== +"@abp/aspnetcore.mvc.ui.theme.basic@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.1.0-rc.2.tgz#b9462cbe36c41d68e2f44b79a3a2dba2c1b2b54a" + integrity sha512-KW3J6HnN1zZrCmrWmEcXBnGIOeuJDdp1jUECAm4Bdxi++VzfIbGlVvpcvUdT1E213reOUWi4dPhcej12DwrmDw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui.theme.shared@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.1.0-rc.2.tgz#d64cea1e504bcd3a08a1819025d40f3f84f0aadc" + integrity sha512-A/DRLwtJO7YCdqAgSF84wNRKjvGEQvcBocIwRxXCJEe3drxMoSwkAGjXQlxIYWZKdYbYUWDTjil2Mvwf91GUqg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~4.1.0-rc.2" + "@abp/bootstrap" "~4.1.0-rc.2" + "@abp/bootstrap-datepicker" "~4.1.0-rc.2" + "@abp/datatables.net-bs4" "~4.1.0-rc.2" + "@abp/font-awesome" "~4.1.0-rc.2" + "@abp/jquery-form" "~4.1.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~4.1.0-rc.2" + "@abp/lodash" "~4.1.0-rc.2" + "@abp/luxon" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/select2" "~4.1.0-rc.2" + "@abp/sweetalert" "~4.1.0-rc.2" + "@abp/timeago" "~4.1.0-rc.2" + "@abp/toastr" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.1.0-rc.2.tgz#54bf30def590e6d25fc35f77253888f3d9f74b9c" + integrity sha512-eOh5IBn4eNAjj2i6tlLRIV/r61Ef7+Z3PNvGgdml/XCo50el4G9XE7shxuGOY+MaFMfmsST2tcJlO9iAo9n2Yw== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,145 +43,145 @@ micromatch "^4.0.2" path "^0.12.7" -"@abp/bootstrap-datepicker@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.1.tgz#aad891263edff66f816e003ba4fa7f8acfe8e0b6" - integrity sha512-S0oaVZmXsDcOJLAyoGY0TvP/7bZx0GHIbU9BIhIL2Wl74HYaokjkTr6/IleIek9YeiF2vm9FkrUP1dKH/4f7Gg== +"@abp/bootstrap-datepicker@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.1.0-rc.2.tgz#d3fe863222a11771d366b1a3c246aaf34df94081" + integrity sha512-vn2xWAK3xqo5fMZJ9dOAZZmL+ZUnzZZNh3lF6uA97wTN/SbePlmHBYJpsCKIxOwbJS2HCvekHGJN/Ps4oEjlbw== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.1.tgz#3e41bdf9b3e9f8c497b9fafe22a4851d0401b31b" - integrity sha512-GoSaNWvswRHVoUrq7xClFQYtwqIlyS/vp/TdY+j5FFZP7ud89+ZGpdNqYqq5l9/6aaYa7v4b9mNTZ/1JRzAOYg== +"@abp/bootstrap@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.1.0-rc.2.tgz#b5132cf4c4c92fe833823cf2b91ab1b0167b0ecf" + integrity sha512-SsWEV0DveBIHiG051E6aBB371D15QIsGeo+POFhvQUvrlmzMBlFCAlmH0ef8w1n+3M3C37irCgEGKctt2pbcxQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" bootstrap "^4.5.0" bootstrap-v4-rtl "4.4.1-2" -"@abp/core@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.1.tgz#1df32bc058f45571605670ca81c226a1bd87400c" - integrity sha512-8UT5lwqV/luVG/SxePSTD2FRbZXwXv3cZJKjw+gpBjhD0slWrh51XEOHsM8ciTuhcvV/tsqVU9nXckDMdO58fw== +"@abp/core@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.1.0-rc.2.tgz#d306106a53fa56109751be0099785c94f43be56f" + integrity sha512-b0mOYSz8hNgZ/hBeYg8hkthJgE8CLyHNa2NcythPoIW8RR5qHmDtGoFnuFovLvLk7r+M4NWyxXRKEshSszIPyA== dependencies: - "@abp/utils" "^4.0.1" + "@abp/utils" "^4.1.0-rc.2" -"@abp/datatables.net-bs4@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.1.tgz#7538baad0eff24eca7f4246d020852f83139f645" - integrity sha512-S52jNPF4if68V+P/33NrtGPJXf6xrqgyZzz9b7qBR7HuUm3Nsn7bAslh3JNduNec/sFuE4Utl/xsFHZNjBWEog== +"@abp/datatables.net-bs4@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.1.0-rc.2.tgz#99aa1fbad91939fc23265324a3d8a45d0c1e5a7a" + integrity sha512-Y9UyqniOkx5DJO+2GGurnQE1yfRmGaQ3y7V07gKWRq+gHLUhE+vfgOLVpGM6ufdTIbLvVw5Ng+3gfOmPlUnpxg== dependencies: - "@abp/datatables.net" "~4.0.1" + "@abp/datatables.net" "~4.1.0-rc.2" datatables.net-bs4 "^1.10.21" -"@abp/datatables.net@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.1.tgz#eb89716a37351c41b5bccfc2db88fc7ceb991a26" - integrity sha512-APFLui0w8MqsBWqP/K0QkT5cBq5SsWiqMaIGTXQKinMVLV597sUszrlhe1ISU2PqeD7iX6pCZNNOTI1NEUn9/Q== +"@abp/datatables.net@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.1.0-rc.2.tgz#1a134688259d32187d822d8a49c7a68b4cc226c7" + integrity sha512-9o5g8s7ZTlThd1FMFmO7wS+MxmXgUMmiWx7Hwara9ypfJPd0vanz10bQAdTpLiDy/aa0tUmz0xOVj73yvBJm9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" datatables.net "^1.10.21" -"@abp/font-awesome@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.1.tgz#8a9d83b2c2adfcd5abcbd9c31c315460d44a321e" - integrity sha512-+6+m/DKMnfkeQiWUsMlB6Da8u6yREyN2oQYGYhSRAK8419ym8RHHrqKJv2AClI4iLq2ppHZj8WF84+SeoCekRg== +"@abp/font-awesome@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.1.0-rc.2.tgz#ecf490861c09250cf61611ac74cec5ab4392e807" + integrity sha512-6yAsf/ee2hdrHHUACql8c3gY54Hd7YAK2olHymyc3Io2hhK2VxXRc2W2oRSwbQ9GsSE+XDrEVtjIR64nBseTeg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" "@fortawesome/fontawesome-free" "^5.13.0" -"@abp/jquery-form@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.1.tgz#6dc1922b2800dd635f20881a82e08104a1dd1bb5" - integrity sha512-JMBZYu/MI/GjaLTBOMB5iv8cagnLpReDULNC3r6tLNNqB1R8f3Cg1T7nF4YCuU9SYMqis1P/AuE4oEh+4rQdAQ== +"@abp/jquery-form@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.1.0-rc.2.tgz#76dff67a3fe6e6ad7bd60bb909de93c09966cc0a" + integrity sha512-LGafwxyRYUbHQlJ9pPbYdkVqzdT/y1Fp4Nr4C3W5jxsJuaSICl0RPkRHIPALeoqbpEWuj6dVep6ZuO9hhxBzNw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.1.tgz#4142ca31c0830fe24a1467e8cf13b55ba9d7c1dd" - integrity sha512-rdSRTcdKCHmarbrVgmPYdTiJ0G/aFKd+dr0krO7fALPTuQKChbDnHOO4/JvQSc+cd9faxa8c6ZWvlHdsof23tQ== +"@abp/jquery-validation-unobtrusive@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.1.0-rc.2.tgz#1f1d395cfa47740d47303ff512592ff1993f9e13" + integrity sha512-0LXWvgfyLHVw7qRVOmY0rfVlq+yJq/nhbcVoYK+QbmKnrFu+KZg0KNMOD8wTXs8mZ1EKGQpoQKWxImtCnGrV/A== dependencies: - "@abp/jquery-validation" "~4.0.1" + "@abp/jquery-validation" "~4.1.0-rc.2" jquery-validation-unobtrusive "^3.2.11" -"@abp/jquery-validation@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.1.tgz#74e7d795468c6986f2db15662631fcd4f67c679e" - integrity sha512-FX26aQCsMBdVWAJb7S37Lt7KoHAEHoYguh/qfZIARCpOYOOWvxfDz1wTrmADUkqdillqEiCeD/Imj8bYH9Faaw== +"@abp/jquery-validation@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.1.0-rc.2.tgz#ad4b464fd0133eab8d08c781c7d7c4e00bc4918d" + integrity sha512-iLTobfwqDk7iiQxvv5UowxOKywsh/77VlAVktstnFG3N3Y73+JYKzM0mGM/j4zM1OrjbF9/cnPnDVX7bATPz9w== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-validation "^1.19.2" -"@abp/jquery@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.1.tgz#aa554accb16600fd586c3a4f088040cd26d0bde8" - integrity sha512-MtiRKOLyjEWux+whPP3+zwPbpj8or756JtgjnwOTDB9tp9HLCYUaskt+oalYPvob24nDZcNu2RnMALYdCVhZAQ== +"@abp/jquery@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.1.0-rc.2.tgz#0f64cad5b1ae3e47d2344e5fb30c347b89d6d2bb" + integrity sha512-YubZwMJIN+UcfxfUlt3usfcLMG9WcXNpemUsdBtlKNzti562KZMIHPFLRL+DsiqvzZ74h2PxSWWsxS42Z7z0Yw== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" jquery "~3.5.1" -"@abp/lodash@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.1.tgz#ec261ccaab8a70d5b32a8a7c22387e48936d38d4" - integrity sha512-Dav1QKbBeGR4VVbHHe1s3OEzN7wnb9K/vwzHrWmtO8D1Q5Z3433xjNmgL5VQ9gfxXqooSfEO4gAovZklMDHDew== +"@abp/lodash@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.1.0-rc.2.tgz#9281c641ab7b7b33e7acf12815dc461e7ae967b9" + integrity sha512-RqdekrAyLPaLNJddmrq89EdrI1xg4296tOafFLHvirgRWisJTIa9bflTOwMwEg9FNdLJgA0zHi4WdAMer0qZdA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" lodash "^4.17.15" -"@abp/luxon@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.1.tgz#a540750b1605dbac856ce9c2e776c2fecf6392f9" - integrity sha512-eRumVB7UIf2XH6OZVUTvcKw0A/OSAfYV59fM+Wc4dAkNcmsNZI0gD1o0AigSGNCxTV6v+W2bFrsuooSqK99Y0Q== +"@abp/luxon@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.1.0-rc.2.tgz#78fc1cf651d7c19b87a31823cd3ce68961d6b1e6" + integrity sha512-U4e9uGZlg9xj9tBNP337v3wiaSR6qxWsBgh/duQGWrqV+75LlQjYcZaPoXDidUUS6U6epDSR2pc2T39rahcgSQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" luxon "^1.24.1" -"@abp/malihu-custom-scrollbar-plugin@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.1.tgz#0a556423a67b6c949e32ffcacd72256dea6c31ee" - integrity sha512-YTwYpnQ1ZrON70gvJcnNZRwB3Ze4olGcXxiPvmRgSHbGJkSnHYJiP6PvsN1F3HDFukAJ/iUu+WwEe8OBwlyLXA== +"@abp/malihu-custom-scrollbar-plugin@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.1.0-rc.2.tgz#36553e71052cad9734e0c9b2c65759e538468648" + integrity sha512-JQ6PCcj5qmF9MxNRPAsKHHnqBPCdn4lQnwxZrHcG9tD70Gx+NfC4UH41tqXI+htba4k0PHRyH2y39Q1iJm0NFA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.1.tgz#8983e7b5c3afb862f08b2730b70e59d726e9b5d5" - integrity sha512-WdzY2hvsS/4vz/VXpxq2muSzzE8ggchiIrICy/WKchJxL9L08DM796t6aE6rEl9wucY8XEzzWrPOVqAjJmnXFA== +"@abp/select2@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.1.0-rc.2.tgz#c48e865f401ddce32dff2a7a14ae07c4bde2f57b" + integrity sha512-YYK/SIqXQcSDQFMVg/ogohc76d4JDrOVQEbzfkNNI5bKVJo+hkqtNzAwV9FLdPZZNw15QMv0eF1ie4aUtIxyaA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.1.tgz#0088610915ad6db0a140b77832a37c10066eb4ee" - integrity sha512-t4/44oQCMngSjVqmeRWXwrXa/pRKc3CEpyyTiGIXki4dWJ21j0ePCw2l3rvOJWnpoCznhxa/UGxLfRfK1NEzRg== +"@abp/sweetalert@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.1.0-rc.2.tgz#cdcaf8e9a33cf218a687fd6a42cfe1c85d89c6b7" + integrity sha512-sjQd8TF9oUnaQ1OPTGdVyAfWqSZEk4bRbC/qw2CouEOfRLatzkC0JcmzFLN0f5N1am1RQwkFakpENKH7NqTCvg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" sweetalert "^2.1.2" -"@abp/timeago@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.1.tgz#8c161645534eb1f62fe4607450acf7345729e711" - integrity sha512-PsPobV79U2qzVY+WBsmJM1ohSF4jqcLnL4/7qyJvxlb1WwbCl1F5D4cpiJP4zsM4clPW4mbSsiauMNp+HTNKEA== +"@abp/timeago@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.1.0-rc.2.tgz#445d043ae482b76799b496ae6565abfaf75a34b9" + integrity sha512-wWx56EZMUGIfqJV5JLCvUp4RVhKXHYLQaVNQSF8E05COXmSQwFThVS7vbuiODFp2BGm6RAqCVtZDCreu2B8z9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.1.tgz#ecb6f6193b7edc3150d0614ab9457472baf1cce3" - integrity sha512-bTTz0O8zj7fMhdoummP2Ed5Z8SJTmR6svzNchBXNDrnRAcDQvTihPTcg0UpH8BEDFczbLowq09CG2A/RMSJoug== +"@abp/toastr@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.1.0-rc.2.tgz#1af16fa8687201b6b9c7229d087a4233998703b9" + integrity sha512-g+Jl5H1ZHoJ4JwWuix0xA+GMFY42pwq8WYjxP6qE2/Y2aixYHVIui15eBqF2L06yXOt53YFcC1+pxjrp91xHxw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" toastr "^2.1.4" -"@abp/utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" - integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== +"@abp/utils@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.2.tgz#eb6dbf0ee493d0f050b37347d2d6d283098aedae" + integrity sha512-V2k5I89lVBoeGIKgg4p2H9GlMAcDWbctwKZPVwBEMVEVm1uTR2xQAWdTdSFd5Q8I8Xsf/aIG8ELM7l5j2h7/zQ== dependencies: just-compare "^1.3.0" diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj index 2017892f0b..51b82b4896 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyCompanyName.MyProjectName.Web.Unified.csproj @@ -12,8 +12,8 @@ - - + + diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json index 1171b7f8a6..90988e3200 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^4.0.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^4.1.0-rc.2" } } \ No newline at end of file diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/yarn.lock b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/yarn.lock index 78e1068643..569055bae5 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/yarn.lock +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/yarn.lock @@ -2,37 +2,37 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.0.1.tgz#ce8e3eb830a8e8f9eecb1a3b3bd70c2832fdf15e" - integrity sha512-w+ZG8Ewx9wWfbvRC2MAjJl+rXuXSHLhhGOiJTk68unWLNziDtNQzcSXG/Z5c1hA+acJSGqDoJGEGs4FVM136og== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~4.0.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.0.1.tgz#cd9d0eb11309c597dffd26277cd1bd7c5b1e0e2f" - integrity sha512-QGoCN/my0eAfa4tx5ytDxArIoz2i58jFFVUGso1Lekn54JvSt+WLz2p3uyTGatZ03Bp9836elhFnIopn12WvBw== - dependencies: - "@abp/aspnetcore.mvc.ui" "~4.0.1" - "@abp/bootstrap" "~4.0.1" - "@abp/bootstrap-datepicker" "~4.0.1" - "@abp/datatables.net-bs4" "~4.0.1" - "@abp/font-awesome" "~4.0.1" - "@abp/jquery-form" "~4.0.1" - "@abp/jquery-validation-unobtrusive" "~4.0.1" - "@abp/lodash" "~4.0.1" - "@abp/luxon" "~4.0.1" - "@abp/malihu-custom-scrollbar-plugin" "~4.0.1" - "@abp/select2" "~4.0.1" - "@abp/sweetalert" "~4.0.1" - "@abp/timeago" "~4.0.1" - "@abp/toastr" "~4.0.1" - -"@abp/aspnetcore.mvc.ui@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.0.1.tgz#6490c147a56e4f7055d2ca77f20baf1f60f56867" - integrity sha512-4B3icJrlpuZgMaX52ninyaenH7zLwepePEscDrLaFY9wyonKpZ2zh+xplnyM6vjNd+PhErWuA2+ssCswFhrJ3A== +"@abp/aspnetcore.mvc.ui.theme.basic@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-4.1.0-rc.2.tgz#b9462cbe36c41d68e2f44b79a3a2dba2c1b2b54a" + integrity sha512-KW3J6HnN1zZrCmrWmEcXBnGIOeuJDdp1jUECAm4Bdxi++VzfIbGlVvpcvUdT1E213reOUWi4dPhcej12DwrmDw== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui.theme.shared@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-4.1.0-rc.2.tgz#d64cea1e504bcd3a08a1819025d40f3f84f0aadc" + integrity sha512-A/DRLwtJO7YCdqAgSF84wNRKjvGEQvcBocIwRxXCJEe3drxMoSwkAGjXQlxIYWZKdYbYUWDTjil2Mvwf91GUqg== + dependencies: + "@abp/aspnetcore.mvc.ui" "~4.1.0-rc.2" + "@abp/bootstrap" "~4.1.0-rc.2" + "@abp/bootstrap-datepicker" "~4.1.0-rc.2" + "@abp/datatables.net-bs4" "~4.1.0-rc.2" + "@abp/font-awesome" "~4.1.0-rc.2" + "@abp/jquery-form" "~4.1.0-rc.2" + "@abp/jquery-validation-unobtrusive" "~4.1.0-rc.2" + "@abp/lodash" "~4.1.0-rc.2" + "@abp/luxon" "~4.1.0-rc.2" + "@abp/malihu-custom-scrollbar-plugin" "~4.1.0-rc.2" + "@abp/select2" "~4.1.0-rc.2" + "@abp/sweetalert" "~4.1.0-rc.2" + "@abp/timeago" "~4.1.0-rc.2" + "@abp/toastr" "~4.1.0-rc.2" + +"@abp/aspnetcore.mvc.ui@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-4.1.0-rc.2.tgz#54bf30def590e6d25fc35f77253888f3d9f74b9c" + integrity sha512-eOh5IBn4eNAjj2i6tlLRIV/r61Ef7+Z3PNvGgdml/XCo50el4G9XE7shxuGOY+MaFMfmsST2tcJlO9iAo9n2Yw== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,145 +43,145 @@ micromatch "^4.0.2" path "^0.12.7" -"@abp/bootstrap-datepicker@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.0.1.tgz#aad891263edff66f816e003ba4fa7f8acfe8e0b6" - integrity sha512-S0oaVZmXsDcOJLAyoGY0TvP/7bZx0GHIbU9BIhIL2Wl74HYaokjkTr6/IleIek9YeiF2vm9FkrUP1dKH/4f7Gg== +"@abp/bootstrap-datepicker@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-4.1.0-rc.2.tgz#d3fe863222a11771d366b1a3c246aaf34df94081" + integrity sha512-vn2xWAK3xqo5fMZJ9dOAZZmL+ZUnzZZNh3lF6uA97wTN/SbePlmHBYJpsCKIxOwbJS2HCvekHGJN/Ps4oEjlbw== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.0.1.tgz#3e41bdf9b3e9f8c497b9fafe22a4851d0401b31b" - integrity sha512-GoSaNWvswRHVoUrq7xClFQYtwqIlyS/vp/TdY+j5FFZP7ud89+ZGpdNqYqq5l9/6aaYa7v4b9mNTZ/1JRzAOYg== +"@abp/bootstrap@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-4.1.0-rc.2.tgz#b5132cf4c4c92fe833823cf2b91ab1b0167b0ecf" + integrity sha512-SsWEV0DveBIHiG051E6aBB371D15QIsGeo+POFhvQUvrlmzMBlFCAlmH0ef8w1n+3M3C37irCgEGKctt2pbcxQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" bootstrap "^4.5.0" bootstrap-v4-rtl "4.4.1-2" -"@abp/core@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.0.1.tgz#1df32bc058f45571605670ca81c226a1bd87400c" - integrity sha512-8UT5lwqV/luVG/SxePSTD2FRbZXwXv3cZJKjw+gpBjhD0slWrh51XEOHsM8ciTuhcvV/tsqVU9nXckDMdO58fw== +"@abp/core@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-4.1.0-rc.2.tgz#d306106a53fa56109751be0099785c94f43be56f" + integrity sha512-b0mOYSz8hNgZ/hBeYg8hkthJgE8CLyHNa2NcythPoIW8RR5qHmDtGoFnuFovLvLk7r+M4NWyxXRKEshSszIPyA== dependencies: - "@abp/utils" "^4.0.1" + "@abp/utils" "^4.1.0-rc.2" -"@abp/datatables.net-bs4@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.0.1.tgz#7538baad0eff24eca7f4246d020852f83139f645" - integrity sha512-S52jNPF4if68V+P/33NrtGPJXf6xrqgyZzz9b7qBR7HuUm3Nsn7bAslh3JNduNec/sFuE4Utl/xsFHZNjBWEog== +"@abp/datatables.net-bs4@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-4.1.0-rc.2.tgz#99aa1fbad91939fc23265324a3d8a45d0c1e5a7a" + integrity sha512-Y9UyqniOkx5DJO+2GGurnQE1yfRmGaQ3y7V07gKWRq+gHLUhE+vfgOLVpGM6ufdTIbLvVw5Ng+3gfOmPlUnpxg== dependencies: - "@abp/datatables.net" "~4.0.1" + "@abp/datatables.net" "~4.1.0-rc.2" datatables.net-bs4 "^1.10.21" -"@abp/datatables.net@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.0.1.tgz#eb89716a37351c41b5bccfc2db88fc7ceb991a26" - integrity sha512-APFLui0w8MqsBWqP/K0QkT5cBq5SsWiqMaIGTXQKinMVLV597sUszrlhe1ISU2PqeD7iX6pCZNNOTI1NEUn9/Q== +"@abp/datatables.net@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-4.1.0-rc.2.tgz#1a134688259d32187d822d8a49c7a68b4cc226c7" + integrity sha512-9o5g8s7ZTlThd1FMFmO7wS+MxmXgUMmiWx7Hwara9ypfJPd0vanz10bQAdTpLiDy/aa0tUmz0xOVj73yvBJm9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" datatables.net "^1.10.21" -"@abp/font-awesome@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.0.1.tgz#8a9d83b2c2adfcd5abcbd9c31c315460d44a321e" - integrity sha512-+6+m/DKMnfkeQiWUsMlB6Da8u6yREyN2oQYGYhSRAK8419ym8RHHrqKJv2AClI4iLq2ppHZj8WF84+SeoCekRg== +"@abp/font-awesome@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-4.1.0-rc.2.tgz#ecf490861c09250cf61611ac74cec5ab4392e807" + integrity sha512-6yAsf/ee2hdrHHUACql8c3gY54Hd7YAK2olHymyc3Io2hhK2VxXRc2W2oRSwbQ9GsSE+XDrEVtjIR64nBseTeg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" "@fortawesome/fontawesome-free" "^5.13.0" -"@abp/jquery-form@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.0.1.tgz#6dc1922b2800dd635f20881a82e08104a1dd1bb5" - integrity sha512-JMBZYu/MI/GjaLTBOMB5iv8cagnLpReDULNC3r6tLNNqB1R8f3Cg1T7nF4YCuU9SYMqis1P/AuE4oEh+4rQdAQ== +"@abp/jquery-form@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-4.1.0-rc.2.tgz#76dff67a3fe6e6ad7bd60bb909de93c09966cc0a" + integrity sha512-LGafwxyRYUbHQlJ9pPbYdkVqzdT/y1Fp4Nr4C3W5jxsJuaSICl0RPkRHIPALeoqbpEWuj6dVep6ZuO9hhxBzNw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.0.1.tgz#4142ca31c0830fe24a1467e8cf13b55ba9d7c1dd" - integrity sha512-rdSRTcdKCHmarbrVgmPYdTiJ0G/aFKd+dr0krO7fALPTuQKChbDnHOO4/JvQSc+cd9faxa8c6ZWvlHdsof23tQ== +"@abp/jquery-validation-unobtrusive@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-4.1.0-rc.2.tgz#1f1d395cfa47740d47303ff512592ff1993f9e13" + integrity sha512-0LXWvgfyLHVw7qRVOmY0rfVlq+yJq/nhbcVoYK+QbmKnrFu+KZg0KNMOD8wTXs8mZ1EKGQpoQKWxImtCnGrV/A== dependencies: - "@abp/jquery-validation" "~4.0.1" + "@abp/jquery-validation" "~4.1.0-rc.2" jquery-validation-unobtrusive "^3.2.11" -"@abp/jquery-validation@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.0.1.tgz#74e7d795468c6986f2db15662631fcd4f67c679e" - integrity sha512-FX26aQCsMBdVWAJb7S37Lt7KoHAEHoYguh/qfZIARCpOYOOWvxfDz1wTrmADUkqdillqEiCeD/Imj8bYH9Faaw== +"@abp/jquery-validation@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-4.1.0-rc.2.tgz#ad4b464fd0133eab8d08c781c7d7c4e00bc4918d" + integrity sha512-iLTobfwqDk7iiQxvv5UowxOKywsh/77VlAVktstnFG3N3Y73+JYKzM0mGM/j4zM1OrjbF9/cnPnDVX7bATPz9w== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" jquery-validation "^1.19.2" -"@abp/jquery@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.0.1.tgz#aa554accb16600fd586c3a4f088040cd26d0bde8" - integrity sha512-MtiRKOLyjEWux+whPP3+zwPbpj8or756JtgjnwOTDB9tp9HLCYUaskt+oalYPvob24nDZcNu2RnMALYdCVhZAQ== +"@abp/jquery@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-4.1.0-rc.2.tgz#0f64cad5b1ae3e47d2344e5fb30c347b89d6d2bb" + integrity sha512-YubZwMJIN+UcfxfUlt3usfcLMG9WcXNpemUsdBtlKNzti562KZMIHPFLRL+DsiqvzZ74h2PxSWWsxS42Z7z0Yw== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" jquery "~3.5.1" -"@abp/lodash@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.0.1.tgz#ec261ccaab8a70d5b32a8a7c22387e48936d38d4" - integrity sha512-Dav1QKbBeGR4VVbHHe1s3OEzN7wnb9K/vwzHrWmtO8D1Q5Z3433xjNmgL5VQ9gfxXqooSfEO4gAovZklMDHDew== +"@abp/lodash@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-4.1.0-rc.2.tgz#9281c641ab7b7b33e7acf12815dc461e7ae967b9" + integrity sha512-RqdekrAyLPaLNJddmrq89EdrI1xg4296tOafFLHvirgRWisJTIa9bflTOwMwEg9FNdLJgA0zHi4WdAMer0qZdA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" lodash "^4.17.15" -"@abp/luxon@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.0.1.tgz#a540750b1605dbac856ce9c2e776c2fecf6392f9" - integrity sha512-eRumVB7UIf2XH6OZVUTvcKw0A/OSAfYV59fM+Wc4dAkNcmsNZI0gD1o0AigSGNCxTV6v+W2bFrsuooSqK99Y0Q== +"@abp/luxon@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-4.1.0-rc.2.tgz#78fc1cf651d7c19b87a31823cd3ce68961d6b1e6" + integrity sha512-U4e9uGZlg9xj9tBNP337v3wiaSR6qxWsBgh/duQGWrqV+75LlQjYcZaPoXDidUUS6U6epDSR2pc2T39rahcgSQ== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" luxon "^1.24.1" -"@abp/malihu-custom-scrollbar-plugin@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.0.1.tgz#0a556423a67b6c949e32ffcacd72256dea6c31ee" - integrity sha512-YTwYpnQ1ZrON70gvJcnNZRwB3Ze4olGcXxiPvmRgSHbGJkSnHYJiP6PvsN1F3HDFukAJ/iUu+WwEe8OBwlyLXA== +"@abp/malihu-custom-scrollbar-plugin@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-4.1.0-rc.2.tgz#36553e71052cad9734e0c9b2c65759e538468648" + integrity sha512-JQ6PCcj5qmF9MxNRPAsKHHnqBPCdn4lQnwxZrHcG9tD70Gx+NfC4UH41tqXI+htba4k0PHRyH2y39Q1iJm0NFA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/select2@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.0.1.tgz#8983e7b5c3afb862f08b2730b70e59d726e9b5d5" - integrity sha512-WdzY2hvsS/4vz/VXpxq2muSzzE8ggchiIrICy/WKchJxL9L08DM796t6aE6rEl9wucY8XEzzWrPOVqAjJmnXFA== +"@abp/select2@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-4.1.0-rc.2.tgz#c48e865f401ddce32dff2a7a14ae07c4bde2f57b" + integrity sha512-YYK/SIqXQcSDQFMVg/ogohc76d4JDrOVQEbzfkNNI5bKVJo+hkqtNzAwV9FLdPZZNw15QMv0eF1ie4aUtIxyaA== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" select2 "^4.0.13" -"@abp/sweetalert@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.0.1.tgz#0088610915ad6db0a140b77832a37c10066eb4ee" - integrity sha512-t4/44oQCMngSjVqmeRWXwrXa/pRKc3CEpyyTiGIXki4dWJ21j0ePCw2l3rvOJWnpoCznhxa/UGxLfRfK1NEzRg== +"@abp/sweetalert@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-4.1.0-rc.2.tgz#cdcaf8e9a33cf218a687fd6a42cfe1c85d89c6b7" + integrity sha512-sjQd8TF9oUnaQ1OPTGdVyAfWqSZEk4bRbC/qw2CouEOfRLatzkC0JcmzFLN0f5N1am1RQwkFakpENKH7NqTCvg== dependencies: - "@abp/core" "~4.0.1" + "@abp/core" "~4.1.0-rc.2" sweetalert "^2.1.2" -"@abp/timeago@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.0.1.tgz#8c161645534eb1f62fe4607450acf7345729e711" - integrity sha512-PsPobV79U2qzVY+WBsmJM1ohSF4jqcLnL4/7qyJvxlb1WwbCl1F5D4cpiJP4zsM4clPW4mbSsiauMNp+HTNKEA== +"@abp/timeago@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-4.1.0-rc.2.tgz#445d043ae482b76799b496ae6565abfaf75a34b9" + integrity sha512-wWx56EZMUGIfqJV5JLCvUp4RVhKXHYLQaVNQSF8E05COXmSQwFThVS7vbuiODFp2BGm6RAqCVtZDCreu2B8z9Q== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" timeago "^1.6.7" -"@abp/toastr@~4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.0.1.tgz#ecb6f6193b7edc3150d0614ab9457472baf1cce3" - integrity sha512-bTTz0O8zj7fMhdoummP2Ed5Z8SJTmR6svzNchBXNDrnRAcDQvTihPTcg0UpH8BEDFczbLowq09CG2A/RMSJoug== +"@abp/toastr@~4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-4.1.0-rc.2.tgz#1af16fa8687201b6b9c7229d087a4233998703b9" + integrity sha512-g+Jl5H1ZHoJ4JwWuix0xA+GMFY42pwq8WYjxP6qE2/Y2aixYHVIui15eBqF2L06yXOt53YFcC1+pxjrp91xHxw== dependencies: - "@abp/jquery" "~4.0.1" + "@abp/jquery" "~4.1.0-rc.2" toastr "^2.1.4" -"@abp/utils@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.0.1.tgz#9a4cb420266c49d8084776bd31c86681d4d4d125" - integrity sha512-nI2ZyaNpvohr75p8jeMPWze+hX+mV47EHI+Zloa4GgGmJqrULdG71kYh45R+jGmMTbQL6huaXGnpz4gNF9TGyQ== +"@abp/utils@^4.1.0-rc.2": + version "4.1.0-rc.2" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-4.1.0-rc.2.tgz#eb6dbf0ee493d0f050b37347d2d6d283098aedae" + integrity sha512-V2k5I89lVBoeGIKgg4p2H9GlMAcDWbctwKZPVwBEMVEVm1uTR2xQAWdTdSFd5Q8I8Xsf/aIG8ELM7l5j2h7/zQ== dependencies: just-compare "^1.3.0" diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs index 11062a5e2a..8d10a7c7f3 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Menus/MyProjectNameMenuContributor.cs @@ -9,11 +9,11 @@ namespace MyCompanyName.MyProjectName.Blazor.Menus { if (context.Menu.Name == StandardMenus.Main) { - await ConfigureMainMenu(context); + await ConfigureMainMenuAsync(context); } } - private Task ConfigureMainMenu(MenuConfigurationContext context) + private Task ConfigureMainMenuAsync(MenuConfigurationContext context) { //Add main menu items. diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj index b4569551d8..a28c9bee5b 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/MyCompanyName.MyProjectName.Domain.Shared.csproj @@ -13,7 +13,7 @@ - + diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Menus/MyProjectNameMenuContributor.cs b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Menus/MyProjectNameMenuContributor.cs index 68191369c1..5db507a100 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Menus/MyProjectNameMenuContributor.cs +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/Menus/MyProjectNameMenuContributor.cs @@ -9,11 +9,11 @@ namespace MyCompanyName.MyProjectName.Web.Menus { if (context.Menu.Name == StandardMenus.Main) { - await ConfigureMainMenu(context); + await ConfigureMainMenuAsync(context); } } - private Task ConfigureMainMenu(MenuConfigurationContext context) + private Task ConfigureMainMenuAsync(MenuConfigurationContext context) { //Add main menu items. diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj index 616e91d7c7..4484d69a23 100644 --- a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj +++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj @@ -21,7 +21,7 @@ - + diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj index 9809a39557..265806176f 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests.csproj @@ -9,7 +9,7 @@ - + diff --git a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj index 8a48f8906d..ab46bde28b 100644 --- a/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj +++ b/templates/module/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp.csproj @@ -20,7 +20,7 @@ - + diff --git a/templates/wpf/common.props b/templates/wpf/common.props index 233f41c1ba..7e29afcfb8 100644 --- a/templates/wpf/common.props +++ b/templates/wpf/common.props @@ -4,9 +4,4 @@ 0.1.0 $(NoWarn);CS1591;CS0436 - - - - - \ No newline at end of file diff --git a/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj b/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj index b5b12c84bb..c1a57201f4 100644 --- a/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj +++ b/templates/wpf/src/MyCompanyName.MyProjectName/MyCompanyName.MyProjectName.csproj @@ -13,7 +13,7 @@ - +