diff --git a/README.md b/README.md index c3c7679aa3..b588e0cba4 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ [![ABP Discord server](https://img.shields.io/discord/951497912645476422?label=Discord)](https://discord.gg/abp) -ABP Framework is a complete **infrastructure** based on the **ASP.NET Core** to create **modern web applications** and **APIs** by following the software development **best practices** and the **latest technologies**. Check out https://abp.io +ABP Framework is a complete **infrastructure** based on **ASP.NET Core** to create **modern web applications** and **APIs** by following the software development **best practices** and the **latest technologies**. Check out https://abp.io ## Getting Started @@ -49,7 +49,7 @@ 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/latest/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 guidance 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. diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ar.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ar.json index 6e9253891e..9b95078f66 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ar.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/ar.json @@ -348,6 +348,11 @@ "Volo.AbpIo.Commercial:030008": "يمكن تحديد تاريخ الشراء فقط عند شراء الحالة!", "Volo.AbpIo.Commercial:030009": "لم يتم العثور على المستخدم!", "Volo.AbpIo.Commercial:030010": "لشراء الترخيص التجريبي ، تحتاج أولاً إلى تنشيط الترخيص التجريبي الخاص بك!", - "Volo.AbpIo.Commercial:030011": "لا يمكنك حذف ترخيص تجريبي عند شرائه!" + "Volo.AbpIo.Commercial:030011": "لا يمكنك حذف ترخيص تجريبي عند شرائه!", + "MoveWaitList": "الانتقال إلى قائمة الانتظار", + "CommunityLinkTitle": "افتح على موقع المجتمع", + "CommunityLink": "رابط المجتمع", + "ReloadFromSource": "إعادة التحميل من المصدر", + "ReloadFromSourceConfirmationMessage": "سيتم تحديث هذه المشاركة من \"{0}\". هل تريد الاستمرار؟" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/cs.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/cs.json index c9b4bacc6d..b594121f0f 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/cs.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/cs.json @@ -348,6 +348,11 @@ "Volo.AbpIo.Commercial:030008": "Datum nákupu lze nastavit pouze ve stavu Zakoupeno!", "Volo.AbpIo.Commercial:030009": "Uživatel nenalezen!", "Volo.AbpIo.Commercial:030010": "Chcete-li zakoupit zkušební licenci, musíte nejprve aktivovat zkušební licenci!", - "Volo.AbpIo.Commercial:030011": "Po zakoupení zkušební licence nelze odstranit!" + "Volo.AbpIo.Commercial:030011": "Po zakoupení zkušební licence nelze odstranit!", + "MoveWaitList": "Přejít na čekací listinu", + "CommunityLinkTitle": "Otevřít na webu komunity", + "CommunityLink": "Odkaz na komunitu", + "ReloadFromSource": "Znovu načíst ze zdroje", + "ReloadFromSourceConfirmationMessage": "Tento příspěvek bude obnoven z „{0}“. Chceš pokračovat?" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 34d20a3bda..9f4fe44349 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -452,6 +452,11 @@ "WhoWeAreItem": "Who We Are Item", "FieldIsRequired": "{0} is required.", "FieldIsNotValid": " {0} is not valid.", - "InterestedLicenseType": "Interested License Type" + "InterestedLicenseType": "Interested License Type", + "MoveWaitList": "Move to wait list", + "CommunityLinkTitle": "Open on the community website", + "CommunityLink": "Community Link", + "ReloadFromSource": "Reload From the Source", + "ReloadFromSourceConfirmationMessage": "This post will be refreshed from \"{0}\". Do you want to continue?" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fi.json index 54d5ed7a71..3248ec9863 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fi.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fi.json @@ -452,6 +452,11 @@ "WhoWeAreItem": "Keitä me olemme -tuote", "FieldIsRequired": "{0} vaaditaan.", "FieldIsNotValid": " {0} ei kelpaa.", - "InterestedLicenseType": "Kiinnostunut lisenssityyppi" + "InterestedLicenseType": "Kiinnostunut lisenssityyppi", + "MoveWaitList": "Siirrä jonotuslistalle", + "CommunityLinkTitle": "Avaa yhteisön verkkosivuilla", + "CommunityLink": "Yhteisön linkki", + "ReloadFromSource": "Lataa uudelleen lähteestä", + "ReloadFromSourceConfirmationMessage": "Tämä viesti päivitetään kohteesta \"{0}\". Haluatko jatkaa?" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fr.json index 8ac2e0e770..075992d7c7 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/fr.json @@ -348,6 +348,11 @@ "Volo.AbpIo.Commercial:030008": "La date d'achat ne peut être définie que lorsque le statut est Acheté !", "Volo.AbpIo.Commercial:030009": "Utilisateur non trouvé!", "Volo.AbpIo.Commercial:030010": "Pour acheter la licence d'essai, vous devez d'abord activer votre licence d'essai !", - "Volo.AbpIo.Commercial:030011": "Vous ne pouvez pas supprimer une licence d'essai lorsqu'elle est achetée !" + "Volo.AbpIo.Commercial:030011": "Vous ne pouvez pas supprimer une licence d'essai lorsqu'elle est achetée !", + "MoveWaitList": "Passer à la liste d'attente", + "CommunityLinkTitle": "Ouvert sur le site communautaire", + "CommunityLink": "Lien communautaire", + "ReloadFromSource": "Recharger à partir de la source", + "ReloadFromSourceConfirmationMessage": "Ce message sera actualisé à partir de \"{0}\". Voulez-vous continuer?" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hi.json index bbe2980c7b..01d9a571e1 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hi.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/hi.json @@ -348,6 +348,11 @@ "Volo.AbpIo.Commercial:030008": "खरीद की तारीख तभी निर्धारित की जा सकती है जब स्थिति खरीदी गई हो!", "Volo.AbpIo.Commercial:030009": "उपयोगकर्ता नहीं मिला!", "Volo.AbpIo.Commercial:030010": "परीक्षण लाइसेंस खरीदने के लिए, पहले आपको अपना परीक्षण लाइसेंस सक्रिय करना होगा!", - "Volo.AbpIo.Commercial:030011": "जब आप एक परीक्षण लाइसेंस खरीदा जाता है तो आप उसे हटा नहीं सकते हैं!" + "Volo.AbpIo.Commercial:030011": "जब आप एक परीक्षण लाइसेंस खरीदा जाता है तो आप उसे हटा नहीं सकते हैं!", + "MoveWaitList": "प्रतीक्षा सूची में ले जाएँ\n", + "CommunityLinkTitle": "सामुदायिक वेबसाइट पर खोलें", + "CommunityLink": "सामुदायिक लिंक", + "ReloadFromSource": "स्रोत से पुनः लोड करें", + "ReloadFromSourceConfirmationMessage": "यह पोस्ट \"{0}\" से ताज़ा की जाएगी। क्या आप जारी रखना चाहते हैं?" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/it.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/it.json index eb6b0e7779..f4e51f77c0 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/it.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/it.json @@ -348,6 +348,11 @@ "Volo.AbpIo.Commercial:030008": "La data di acquisto può essere impostata solo quando lo stato è Acquistato!", "Volo.AbpIo.Commercial:030009": "Utente non trovato!", "Volo.AbpIo.Commercial:030010": "Per acquistare la licenza di prova, devi prima attivare la tua licenza di prova!", - "Volo.AbpIo.Commercial:030011": "Non è possibile eliminare una licenza di prova al momento dell'acquisto!" + "Volo.AbpIo.Commercial:030011": "Non è possibile eliminare una licenza di prova al momento dell'acquisto!", + "MoveWaitList": "Passa alla lista d'attesa", + "CommunityLinkTitle": "Apri sul sito web della comunità", + "CommunityLink": "Collegamento comunitario", + "ReloadFromSource": "Ricarica dalla sorgente", + "ReloadFromSourceConfirmationMessage": "Questo post verrà aggiornato da \"{0}\". Volete continuare?" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/sl.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/sl.json index 421ed3f0d4..968c8fa8c0 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/sl.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/sl.json @@ -348,6 +348,11 @@ "Volo.AbpIo.Commercial:030008": "Datum nakupa je mogoče nastaviti samo, če je status Kupljeno!", "Volo.AbpIo.Commercial:030009": "Uporabnik ni najden!", "Volo.AbpIo.Commercial:030010": "Za nakup preizkusne licence morate najprej aktivirati preizkusno licenco!", - "Volo.AbpIo.Commercial:030011": "Preskusne licence ne morete izbrisati, ko je kupljena!" + "Volo.AbpIo.Commercial:030011": "Preskusne licence ne morete izbrisati, ko je kupljena!", + "MoveWaitList": "Presuňte sa na zoznam čakateľov", + "CommunityLinkTitle": "Otvorte na webovej stránke komunity", + "CommunityLink": "Odkaz na komunitu", + "ReloadFromSource": "Znovu načítať zo zdroja", + "ReloadFromSourceConfirmationMessage": "Tento príspevok bude obnovený z „{0}“. Chceš pokračovať?" } } \ 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 8fb4eeb4e1..4559503a6d 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json @@ -412,6 +412,11 @@ "CustomPaymentFlexSwitchDescription": "Lisanslı", "AllowFeatureUpgradeOnLicenseExpire": "Lisans süresi dolunca özellik yükseltmesine izin ver", "Deleted{0}": "[{0} silindi]", - "Permission:BookDiscount": "Kitap indirimleri" + "Permission:BookDiscount": "Kitap indirimleri", + "MoveWaitList": "Bekleme listesine geç", + "CommunityLinkTitle": "Topluluk web sitesinde açın", + "CommunityLink": "Topluluk Bağlantısı", + "ReloadFromSource": "Kaynaktan Yeniden Yükle", + "ReloadFromSourceConfirmationMessage": "Bu gönderi \"{0}\" adresinden yenilenecek. Devam etmek istiyor musun?" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hans.json index 09ec893538..0ed00a2c75 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hans.json @@ -452,6 +452,11 @@ "WhoWeAreItem": "关于我们", "FieldIsRequired": "{0}是必须的。", "FieldIsNotValid": "{0}是无效的。", - "InterestedLicenseType": "感兴趣的许可证类型" + "InterestedLicenseType": "感兴趣的许可证类型", + "MoveWaitList": "移至候补名单", + "CommunityLinkTitle": "在社区网站上打开", + "CommunityLink": "在社区网站上打开", + "ReloadFromSource": "从源重新加载", + "ReloadFromSourceConfirmationMessage": "此帖子将从“{0}”刷新。 你想继续吗?" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hant.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hant.json index 209e667c83..b5ec2f3816 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hant.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hant.json @@ -348,6 +348,11 @@ "Volo.AbpIo.Commercial:030008": "購買日期只能在狀態為已購買時設置!", "Volo.AbpIo.Commercial:030009": "未找到用戶!", "Volo.AbpIo.Commercial:030010": "要購買試用許可證,首先您需要激活您的試用許可證!", - "Volo.AbpIo.Commercial:030011": "購買試用許可證後,您無法刪除它!" + "Volo.AbpIo.Commercial:030011": "購買試用許可證後,您無法刪除它!", + "MoveWaitList": "移至候补名单", + "CommunityLinkTitle": "在社区网站上打开", + "CommunityLink": "社区链接", + "ReloadFromSource": "從源重新加載", + "ReloadFromSourceConfirmationMessage": "此帖子將從“{0}”刷新。 你想繼續嗎?" } } \ 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 0b097d53a8..783582d7be 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json @@ -28,6 +28,7 @@ "Volo.AbpIo.Domain:030011": "You cannot delete a trial license when it is purchased!", "Volo.AbpIo.Domain:030012": "A user is entitled to have only 1 free trial period. You already used your trial license.", "Volo.AbpIo.Domain:030013": "A user with an active license cannot start a trial license.", + "Volo.AbpIo.Domain:040000": "Telemetry already exists!.", "Volo.AbpIo.Domain:070000": "The organization name can only contain latin letters, numbers, dots and hyphens!", "Volo.AbpIo.Domain:070001": "The company name can only contain latin letters, numbers, dots, space and hyphens!", "WantToLearn?": "Want to learn?", @@ -178,6 +179,7 @@ "BuyNewLicenseBetweenDatesToGetBenefit": "Buy a new license between {0} and {1} to get benefit for extra 2 months!", "CheckAllCommunityTalks": "Check All Community Posts", "ReadMore": "Read More", + "ContinueReading": "Continue Reading", "Post": "Post", "ExploreTheContentsCreatedByTheCoreABPTeamAndTheABPCommunity": "Explore the contents created by the core ABP team and the ABP community.", "WelcomeFallCampaign": "Welcome Fall Campaign!", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json index dee01c8589..4275bb3771 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/tr.json @@ -22,17 +22,13 @@ "Features": "Özellikler", "GetStarted": "Başlayın", "Documents": "Dokümanlar", - "Community": "Topluluk", "ContributionGuide": "Katkı Rehberi", "Blog": "Blog", - "Commercial": "Ticari", "MyAccount": "Hesabım", "Permission:License": "Lisans", "Permission:UserInfo": "kullanıcı bilgisi", "SeeDocuments": "Dokümanlara Göz Atın", - "Samples": "örnekler", - "Framework": "Çerçeve", - "Support": "Destek", + "Samples": "Örnekler", "FreeDDDBook": "Ücretsiz DDD Kitabı", "New": "Yeni", "Volo.AbpIo.Domain:020005": "Lisans uzatma yılı {MinExtendLicenseYear} yıldan az {MaxExtendLicenseYear} yıldan fazla olamaz.", @@ -96,7 +92,7 @@ "MySupportQuestions": "Destek Sorularım", "MyProfile": "Profilim", "Logout": "Çıkış Yap", - "Home": "Ev", + "Home": "Ana Sayfa", "Posts": "Gönderiler", "JoinTheABPCommunity": "ABP Topluluğuna Katılın", "SubmitYourPost": "Gönderinizi Gönderin", @@ -166,6 +162,12 @@ "ABPCommunityTalks": "ABP Topluluk Konuşmaları", "ABPCommunityPosts": "ABP Topluluk Gönderileri", "WelcomeFallCampaign": "Hoş Geldin Sonbahar Kampanyası!", - "GiveAwayForNewPurchases": "Yeni alımlar için Uygulama Geliştirme Sınıfı Eğitimi hediye edilecektir!" + "GiveAwayForNewPurchases": "Yeni alımlar için Uygulama Geliştirme Sınıfı Eğitimi hediye edilecektir!", + "ExploreTheContentsCreatedByTheCoreABPTeamAndTheABPCommunity": "ABP ekibi ve ABP topluluğu tarafından oluşturulan içerikleri keşfedin.", + "CheckAllCommunityTalks": "Tüm Topluluk Gönderilerine Göz Atın", + "ExploreTheBook": "Kitabı Keşfedin", + "ExploreTheEBook": "E-Kitabı Keşfedin", + "LatestVideos": "Son Videolar", + "Videos": "Videolar" } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json index 1135aa17a8..938f3f9525 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ar.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "هل يمكنني تغيير المطورين المسجلين لمنظمتي في المستقبل؟", "ChangingDevelopersExplanation": "بالإضافة إلى إضافة مطورين جدد إلى الترخيص الخاص بك ، يمكنك أيضًا تغيير المطورين الحاليين (يمكنك إزالة مطور وإضافة مطور جديد إلى نفس المقعد) دون أي تكلفة إضافية.", "WhenShouldIRenewMyLicense": "متى يجب أن أجدد رخصتي؟", - "WhenShouldIRenewMyLicenseExplanation": "إذا قمت بتجديد ترخيصك في غضون شهر واحد بعد انتهاء صلاحية ترخيصك ، فسيتم تطبيق الخصومات التالية: ترخيص الفريق {0}؛ رخصة تجارية {1} ؛ ترخيص المؤسسة {2}. ومع ذلك ، إذا جددت ترخيصك بعد شهر واحد من تاريخ انتهاء صلاحية الترخيص ، فسيكون سعر التجديد هو نفسه سعر شراء الترخيص ولن يكون هناك خصم على التجديد.", + "WhenShouldIRenewMyLicenseExplanation": "إذا قمت بتجديد ترخيصك في غضون {3} يوما بعد انتهاء صلاحية رخصتك ، فسيتم تطبيق الخصومات التالية: رخصة الفريق {0}؛ الرخصة التجارية {1} ؛ رخصة المؤسسة {2}. ومع ذلك ، إذا جددت رخصتك بعد {3} يوما من تاريخ انتهاء صلاحية الرخصة ، فسيكون سعر التجديد هو نفسه سعر شراء الرخصة ولن يكون هناك خصم على التجديد.", "TrialPlan": "هل لديك خطة تجريبية؟", "DoYouAcceptBankWireTransfer": "هل تقبل التحويل البنكي؟", "DoYouAcceptBankWireTransferExplanation": "نعم ، نحن نقبل التحويل البنكي.
بعد إرسال رسوم الترخيص عبر التحويل المصرفي ، أرسل لنا بريدًا إلكترونيًا على accounting@abp.io إيصالك ونوع الترخيص المطلوب. معلومات حسابنا المصرفي الدولي:", @@ -515,6 +515,7 @@ "Pricing_Page_Testimonial_3": "نحن نحب ABP. ليس علينا كتابة كل شيء من الصفر. نبدأ من الميزات الجاهزة ونركز فقط على ما نحتاج حقًا إلى كتابته. أيضًا ، ABP مصمم جيدًا والشفرة عالية الجودة مع عدد أقل من الأخطاء. إذا كان علينا كتابة كل ما نحتاجه بمفردنا ، فقد نضطر إلى قضاء سنوات. مرة أخرى نحب أن الإصدار الجديد ، أو إصلاح المشكلة ، أو التحسين يأتي قريبًا جدًا كل أسبوعين. نحن لا ننتظر طويلا.", "Pricing_Page_Testimonial_4": "ABP التجاري منتج رائع يوصى به. تسويق المنتجات التجارية لعملائنا في منصة واحدة قابلة للتكوين. البداية السريعة التي يوفرها إطار العمل والأدوات لأي فريق تستحق كل سنت. كانت ABP هي الأنسب لاحتياجاتنا.", "Pricing_Page_Testimonial_5": "إطار عمل ABP ليس مجرد إطار عمل ، ولكنه أيضًا دليل لتطوير / إدارة المشروع ، لأنه يوفر تدريب DDD و GenericRepository و DI و Microservice و Modularity. حتى إذا كنت لن تستخدم الإطار نفسه ، يمكنك تطوير نفسك باستخدام docs.abp.io المُعد جيدًا ومهنيًا (OpenIdict و Redis و Quartz وما إلى ذلك). نظرًا لأن العديد من الأشياء مبنية مسبقًا ، فإنها تقصر وقت تطوير المشروع بشكل كبير (مثل صفحة تسجيل الدخول ، ومعالجة الاستثناءات ، وتصفية البيانات ، والبذر ، وتسجيل التدقيق ، والترجمة ، ووحدة التحكم في واجهة برمجة التطبيقات التلقائية ، وما إلى ذلك). كمثال من تطبيقنا ، لقد استخدمت Local Event Bus للتحكم في المخزون. لذلك ، أنا قادر على إدارة حركات الأوامر عن طريق كتابة معالج الأسهم. إنه لأمر رائع ألا تضيع الوقت من أجل CreationTime ، CreatorId. يتم ملؤها تلقائيًا.", + "Pricing_Page_Testimonial_6": "إطار عمل ABP هو إطار عمل جيد ولكنه يحتاج إلى وقت لفهم الطبقات والفئات والمكتبات المختلفة التي يستخدمها (خاصة ABP). قضيت الكثير من الوقت في قراءة قاعدة الكود ، لكن ABP Commercial توفر لنا الوقت لإنشاء كيانات تخصص المشروع (AR) والمستودع المرتبط بكل منها. أعجبني أيضًا أن النهج المستخدم في ABP ناضج جدًا ، ونعلم أنه يعتمد على DDD و monolith.", "AbpBookDownloadArea_ClaimYourEBook": "احصل على كتاب إتقان إطار عمل ABP الالكتروني الخاص بك", "AddMemberModal_Warning_1": "اذا كان المستخدم الذي تحاول اضافته لا يوجد في النظام, يرجى مطالبة عضو فريقك بالتسجيل في {0} ومشاركة اسم المستخدم الخاص بحسابه معك.", "MyOrganizations_Detail_WelcomeMessage": "مرحبًا بك في مؤسستك، {0}", @@ -780,7 +781,7 @@ "SupportPolicyFaqTitle": "ما هي سياسة الدعم الخاصة بك؟", "SupportPolicyFaqExplanation": "نحن ندعم فقط الإصدار الرئيسي النشط والسابق. لا نضمن إصدار تصحيح للإصدارات الرئيسية الثالثة والأقدم. على سبيل المثال ، إذا كان الإصدار النشط هو 7.0.0 ، فسنصدر إصدارات تصحيح لكل من 6.x.x و 7.x.x. إلى جانب ذلك ، نحن نقدم الدعم فقط لإطار عمل ABP والقضايا التجارية المتعلقة بـ ABP. هذا يعني أنه لا يتم تقديم أي دعم لتطبيقات الطرف الثالث والخدمات السحابية والمكتبات الطرفية الأخرى التي تستخدمها منتجات ABP. سنبذل جهودًا معقولة تجاريًا لتزويد عملائنا بالدعم الفني خلال ساعات العمل الرسمية لـ \"Volosoft Bilisim A.S\". من ناحية أخرى ، نحن لا نلتزم بوقت استجابة اتفاقية مستوى الخدمة (SLA) ، لكننا سنحاول الرد على المشكلات الفنية في أسرع وقت ممكن خلال ساعات العمل الرسمية لدينا. ما لم يتم إبرام اتفاقية خاصة مع العميل ، فإننا نقدم الدعم فقط على https://support.abp.io. لدينا أيضًا دعم خاص بالبريد الإلكتروني ، وهو متاح فقط لحاملي تراخيص المؤسسة.", "WhyUseAbpIoPlatform": "لماذا يجب علي استخدام منصة ABP.IO بدلاً من إنشاء حل جديد من البداية؟", - "WhyUseAbpIoPlatformFaqExplanation": "انظر الى هذا المستند للحصول على شرح مفصل لسبب استخدام ABP.IO Platform لفائدته الكبيرة بدلًا من القيام بكل شيء بنفسك.", + "WhyUseAbpIoPlatformFaqExplanation": "انظر الى هذا المستند للحصول على شرح مفصل لسبب استخدام ABP.IO Platform لفائدته الكبيرة بدلًا من القيام بكل شيء بنفسك.", "EulaPageTitle": "اتفاقية ترخيص المستخدم النهائي (EULA)", "PrivacyPolicyPageTitle": "سياسة الخصوصية - سياسة ملفات تعريف الارتباط", "TermsConditionsPageTitle": "الأحكام والشروط", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json index 5786954ed0..a1205f1809 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/cs.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Mohu v budoucnu změnit registrované vývojáře své organizace?", "ChangingDevelopersExplanation": "Kromě přidání nových vývojářů do vaší licence můžete také změnit stávající vývojáře (můžete odebrat vývojáře a přidat nového na stejné místo) bez jakýchkoli dalších nákladů.", "WhenShouldIRenewMyLicense": "Kdy bych měl obnovit licenci?", - "WhenShouldIRenewMyLicenseExplanation": "Pokud si licenci obnovíte do 1 měsíce po vypršení platnosti licence, budou uplatněny následující slevy: Týmová licence {0}; Obchodní licence {1}; Enterprise Licence {2}. Pokud však licenci obnovíte po 1 měsíci od data vypršení platnosti vaší licence, cena za obnovení bude stejná jako cena za zakoupení licence a na obnovení nebude poskytnuta žádná sleva.", + "WhenShouldIRenewMyLicenseExplanation": "Pokud si licenci obnovíte do {3} dní po vypršení platnosti licence, budou uplatněny následující slevy: Týmová licence {0}; Obchodní licence {1}; Enterprise Licence {2}. Pokud však licenci obnovíte po {3} měsíci od data vypršení platnosti vaší licence, cena za obnovení bude stejná jako cena za zakoupení licence a na obnovení nebude poskytnuta žádná sleva.", "TrialPlan": "Máte zkušební plán?", "DoYouAcceptBankWireTransfer": "Přijímáte bankovní převod?", "DoYouAcceptBankWireTransferExplanation": "Ano, přijímáme bankovní převod.
Po zaslání licenčního poplatku bankovním převodem nám zašlete e-mail na adresu accounting@abp.io potvrzení a požadovaný typ licence. Informace o našem mezinárodním bankovním účtu:", @@ -399,9 +399,8 @@ "WhatHappensWhenLicenseEndsExplanation4": "Po skončení platnosti licence nelze instalovat nové moduly a motivy přidané do platformy ABP Commercial.", "WhatHappensWhenLicenseEndsExplanation5": "Sadu ABP Suite nelze použít.", "WhatHappensWhenLicenseEndsExplanation6": "Již nelze získat prémiovou podporu.", - "WhatHappensWhenLicenseEndsExplanation7": "Pokud chcete i nadále využívat tyto výhody, můžete svou licenci prodloužit (obnovit). Pokud prodloužíte licenci do 1 měsíce po vypršení platnosti licence, budou uplatněny následující slevy: Týmová licence {0}; Obchodní licence {1}; Enterprise Licence {2}.", + "WhatHappensWhenLicenseEndsExplanation7": "Pokud chcete i nadále využívat tyto výhody, můžete svou licenci prodloužit (obnovit). Pokud prodloužíte licenci do {3} dní po vypršení platnosti licence, budou uplatněny následující slevy: Týmová licence {0}; Obchodní licence {1}; Enterprise Licence {2}.", "BlazoriseLicense": "Musíme si koupit licenci Blazorise?", "BlazoriseLicenseExplanation": "Máme dohodu mezi společnostmi Volosoft a Megabit, na základě této dohody je licence Blazorise přibalena k produktům ABP Commercial, proto si naši zákazníci nemusí kupovat další licenci Blazorise." - } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json index 5b4eb201aa..ebc78f8b51 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/de.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Kann ich die registrierten Entwickler meiner Organisation in Zukunft ändern?", "ChangingDevelopersExplanation": "Sie können nicht nur neue Entwickler zu Ihrer Lizenz hinzufügen, sondern auch die vorhandenen Entwickler ändern (Sie können einen Entwickler entfernen und einen neuen zum selben Arbeitsplatz hinzufügen) ohne zusätzliche Kosten.", "WhenShouldIRenewMyLicense": "Wann sollte ich meine Lizenz erneuern?", - "WhenShouldIRenewMyLicenseExplanation": "Wenn Sie Ihre Lizenz innerhalb von 1 Monat nach Ablauf Ihrer Lizenz erneuern, werden die folgenden Rabatte gewährt: Team-Lizenz {0}% Rabatt, Business-Lizenz {1}% Rabatt, Enterprise-Lizenz {2}% Rabatt . Wenn Sie Ihre Lizenz 1 Monat nach dem Ablaufdatum Ihrer Lizenz verlängern, entspricht der Verlängerungspreis dem Lizenzkaufpreis und es wird kein Rabatt auf Ihre Verlängerung gewährt.", + "WhenShouldIRenewMyLicenseExplanation": "Wenn Sie Ihre Lizenz innerhalb von {3} Tage nach Ablauf Ihrer Lizenz erneuern, werden die folgenden Rabatte gewährt: Team-Lizenz {0}% Rabatt, Business-Lizenz {1}% Rabatt, Enterprise-Lizenz {2}% Rabatt . Wenn Sie Ihre Lizenz {3} Tage nach dem Ablaufdatum Ihrer Lizenz verlängern, entspricht der Verlängerungspreis dem Lizenzkaufpreis und es wird kein Rabatt auf Ihre Verlängerung gewährt.", "TrialPlan": "Hast du einen Probeplan?", "DoYouAcceptBankWireTransfer": "Akzeptieren Sie Banküberweisungen?", "DoYouAcceptBankWireTransferExplanation": "Ja, wir akzeptieren Banküberweisungen.
Nachdem Sie die Lizenzgebühr per Banküberweisung gesendet haben, senden Sie uns Ihre Quittung und den gewünschten Lizenztyp per E-Mail an accounting@abp.io. Unsere internationale Bankverbindung:", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index a24ec2ba67..b388a4e71b 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -202,11 +202,11 @@ "WhatHappensWhenLicenseEndsExplanation4": "You can not install new modules and themes added to the ABP Commercial platform after your license ends.", "WhatHappensWhenLicenseEndsExplanation5": "You can not use the ABP Suite.", "WhatHappensWhenLicenseEndsExplanation6": "You can not get the premium support anymore.", - "WhatHappensWhenLicenseEndsExplanation7": "You can extend (renew) your license if you want to continue getting these benefits. If you extend your license within 1 month after your license expires, the following discounts will be applied: Team License {0}; Business License {1}; Enterprise License {2}.", + "WhatHappensWhenLicenseEndsExplanation7": "You can extend (renew) your license if you want to continue getting these benefits. If you extend your license within {3} days after your license expires, the following discounts will be applied: Team License {0}; Business License {1}; Enterprise License {2}.", "discountForYears": "{0}% discount for {1} year(s)", "WhatHappensWhenLicenseEndsExplanation8": "The ABP projects you generated are not stored on our servers. Therefore, it is your responsibility to keep the source code you download. When your license expires, there's no way to get your generated ABP project source code.", "WhenShouldIRenewMyLicense": "When should I renew my license?", - "WhenShouldIRenewMyLicenseExplanation": "If you renew your license within 1 month after your license expires, the following discounts will be applied: Team License {0}; Business License {1}; Enterprise License {2}. However, if you renew your license after 1 month since the expiry date of your license, the renewal price will be the same as the license purchase price and there will be no discount on your renewal.", + "WhenShouldIRenewMyLicenseExplanation": "If you renew your license within {3} days after your license expires, the following discounts will be applied: Team License {0}; Business License {1}; Enterprise License {2}. However, if you renew your license after {3} days since the expiry date of your license, the renewal price will be the same as the license purchase price and there will be no discount on your renewal.", "TrialPlan": "Do you have a trial plan?", "TrialPlanExplanation": "No, there is no trial version for ABP Commercial. You can check the community edition to understand the code quality and approaches. We also offer a 30-day money-back guarantee for the Team license, no questions asked! You can request a refund within the first 30 days. We provide a 60% refund within 30 days for Business and Enterprise licenses. This is because the Business and Enterprise licenses contain the full source-code of all the modules and themes.", "DoYouAcceptBankWireTransfer": "Do you accept bank wire transfers?", @@ -537,6 +537,7 @@ "Pricing_Page_Testimonial_3": "We love ABP. We don't have to write everything from scratch. We start from out-of-the-box features and just focus on what we really need to write. Also, ABP is well-architected and the code is high quality with fewer bugs. If we would have to write everything we needed on our own, we might have to spend years. Once more things we like is that the new version, or issue fixing, or improvement come out very soon every other week. We don't wait too long.", "Pricing_Page_Testimonial_4": "ABP Commercial is a fantastic product would recommend. Commercial products to market for our customers in a single configurable platform. The jump start that the framework and tooling provide any team is worth every cent. ABP Commercial was the best fit for our needs.", "Pricing_Page_Testimonial_5": "ABP Framework is not only a framework, but it is also a guide for project development/management, because it provides DDD, GenericRepository, DI, Microservice, and Modularity training. Even if you are not going to use the framework itself, you can develop yourself with docs.abp.io which is well and professionally prepared (OpenIddict, Redis, Quartz etc.). Because many things are pre-built, it shortens project development time significantly (Such as login page, exception handling, data filtering, seeding, audit logging, localization, auto API controller etc.). As an example from our application, I have used Local Event Bus for stock control. So, I am able to manage order movements by writing stock handler. It is wonderful not to lose time for CreationTime, CreatorId. They are being filled automatically.", + "Pricing_Page_Testimonial_6": "ABP Framework is a good framework but it needs time to understand the different layers, classes, and libraries it used (specially ABP). I spent a lot of time reading the code base, but ABP Commercial save us time to create the project specialty entities (AR) and the repository linked to each of them. I liked also the approach used in ABP is very mature, we know is based on DDD and monolith.", "AbpBookDownloadArea_ClaimYourEBook": "Claim your Mastering ABP Framework E-Book", "AddMemberModal_Warning_1": "If the username you are trying to add doesn't exist in the system, please ask your team member to register on {0} and share the username of his/her account with you.", "MyOrganizations_Detail_WelcomeMessage": "Welcome to your organization, {0}", @@ -759,6 +760,7 @@ "ViewLiveDemo": "View Live Theme Demo", "GetLeptonX": "Get LeptonX Now", "SeeLeptonXDocumentation": "See LeptonX Documentation", + "SeeLeptonDocumentation": "See Lepton Documentation", "SimplifiedMenu": "Simplified menu", "SimplifiedMenuDescription": "You can easily find the page you are looking for by filtering the menu", "YourFavoritePages": "Your favorite pages at your reach", @@ -825,6 +827,10 @@ "PrivacyPolicyPageTitle": "Privacy Policy - Cookie Policy", "TermsConditionsPageTitle": "Terms and Conditions", "TrainingsPageTitle": "ABP Training Packages", - "ModulesPageTitle": "ABP Pre-Built Application Modules" + "ModulesPageTitle": "ABP Pre-Built Application Modules", + "Volo.AbpIo.Commercial:040001": "API Access Key is incorrect.", + "GetLepton": "Get Lepton Now", + "MyOrganizations_Detail_LicenseStartDate": "License Start Date", + "MyOrganizations_Detail_LicenseExpiryDate": "Expiry Date" } } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json index 7625f777eb..88ce642703 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/es.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "¿Puedo cambiar los desarrolladores registrados de mi organización en el futuro?", "ChangingDevelopersExplanation": "Además de agregar nuevos desarrolladores a su licencia, también puede cambiar los desarrolladores existentes (puede eliminar un desarrollador y agregar uno nuevo al mismo puesto) sin ningún costo adicional.", "WhenShouldIRenewMyLicense": "¿Cuándo debo renovar mi licencia?", - "WhenShouldIRenewMyLicenseExplanation": "Si renueva su licencia dentro de 1 mes después de su vencimiento, se aplicarán los siguientes descuentos: Licencia de equipo {0}% de descuento, Licencia comercial {1}% de descuento, Licencia empresarial {2}% de descuento . Si renueva su licencia 1 mes después de la fecha de vencimiento de su licencia, el precio de renovación será el mismo que el precio de compra de la licencia y no habrá descuento en su renovación.", + "WhenShouldIRenewMyLicenseExplanation": "Si renueva su licencia dentro de {3} dias después de su vencimiento, se aplicarán los siguientes descuentos: Licencia de equipo {0}% de descuento, Licencia comercial {1}% de descuento, Licencia empresarial {2}% de descuento . Si renueva su licencia {3} dias después de la fecha de vencimiento de su licencia, el precio de renovación será el mismo que el precio de compra de la licencia y no habrá descuento en su renovación.", "TrialPlan": "¿Tiene un plan de prueba?", "DoYouAcceptBankWireTransfer": "¿Aceptan transferencia bancaria?", "DoYouAcceptBankWireTransferExplanation": "Sí, aceptamos transferencia bancaria.
Después de enviar la tarifa de la licencia mediante transferencia bancaria, envíenos un correo electrónico a accounting@abp.io con su recibo y el tipo de licencia solicitada. Nuestra información de cuenta bancaria internacional:", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json index 2b376d4955..bc8bd81c8f 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fi.json @@ -202,7 +202,7 @@ "WhatHappensWhenLicenseEndsExplanation4": "Et voi asentaa uusia moduuleja ja teemoja, jotka on lisätty ABP Commercial -alustaan lisenssisi päätyttyä.", "WhatHappensWhenLicenseEndsExplanation5": "Et voi käyttää ABP Suitea.", "WhatHappensWhenLicenseEndsExplanation6": "Et voi enää saada premium-tukea.", - "WhatHappensWhenLicenseEndsExplanation7": "Voit jatkaa (uusia) lisenssiäsi, jos haluat jatkaa näiden etujen saamista. Jos jatkat lisenssiäsi yhden kuukauden kuluessa lisenssin vanhenemisesta, seuraavat alennukset sovelletaan: Tiimilisenssi {0}; Toimilupa {1}; Yrityslisenssi {2}.", + "WhatHappensWhenLicenseEndsExplanation7": "Voit jatkaa (uusia) lisenssiäsi, jos haluat jatkaa näiden etujen saamista. Jos jatkat lisenssiäsi {3} päivää kuluessa lisenssin vanhenemisesta, seuraavat alennukset sovelletaan: Tiimilisenssi {0}; Toimilupa {1}; Yrityslisenssi {2}.", "discountForYears": "{0}% de remise pendant {1} an(s)", "WhatHappensWhenLicenseEndsExplanation8": "Luomiasi ABP-projekteja ei tallenneta palvelimillemme. Siksi on sinun vastuullasi säilyttää lataamasi lähdekoodi. Kun lisenssisi vanhenee, luotua ABP-projektin lähdekoodia ei ole mahdollista saada.", "WhenShouldIRenewMyLicense": "Milloin minun pitäisi uusia lisenssini?", @@ -537,6 +537,7 @@ "Pricing_Page_Testimonial_3": "Rakastamme ABP:tä. Meidän ei tarvitse kirjoittaa kaikkea tyhjästä. Aloitamme valmiista ominaisuuksista ja keskitymme vain siihen, mitä todella tarvitsemme kirjoittaa. Lisäksi ABP on hyvin suunniteltu ja koodi on korkealaatuista ja siinä on vähemmän bugeja. Jos joutuisimme kirjoittamaan kaiken tarvitsemamme itse, joudumme ehkä viettämään vuosia. Jälleen kerran pidämme siitä, että uusi versio, ongelmankorjaus tai parannus ilmestyy hyvin pian joka toinen viikko. Emme odota liian kauan.", "Pricing_Page_Testimonial_4": "ABP Commercial on loistava tuote, jota suosittelen. Kaupalliset tuotteet markkinoille asiakkaillemme yhdellä konfiguroitavalla alustalla. Kehyksen ja työkalujen tarjoama aloitus jokaiselle joukkueelle on jokaisen sentin arvoinen. ABP Commercial sopi parhaiten tarpeisiimme.", "Pricing_Page_Testimonial_5": "ABP Framework ei ole vain viitekehys, vaan se on myös opas projektin kehittämiseen/hallintaan, koska se tarjoaa DDD-, GenericRepository-, DI-, Microservice- ja Modularity-koulutusta. Vaikka et itse käyttäisikään kehystä, voit kehittää itseäsi docs.abp.io:lla, joka on hyvin ja ammattimaisesti valmisteltu (OpenIddict, Redis, Quartz jne.). Koska monet asiat on rakennettu valmiiksi, se lyhentää projektin kehitysaikaa merkittävästi (kuten kirjautumissivu, poikkeusten käsittely, tietojen suodatus, kylvö, tarkastusloki, lokalisointi, automaattinen API-ohjain jne.). Esimerkkinä sovelluksestamme olen käyttänyt paikallista tapahtumaväylää varastonhallintaan. Pystyn siis hallitsemaan tilausliikkeitä kirjoittamalla varastokäsittelijäksi. On hienoa olla hukkaamatta aikaa CreationTimelle, CreatorId:lle. Ne täytetään automaattisesti.", + "Pricing_Page_Testimonial_6": "ABP Framework on hyvä kehys, mutta sen käyttämien eri kerrosten, luokkien ja kirjastojen (erityisesti ABP:n) ymmärtäminen vaatii aikaa. Käytin paljon aikaa koodikannan lukemiseen, mutta ABP Commercial säästää aikaa projektin erityiskokonaisuuksien (AR) ja kuhunkin niistä linkitetyn arkiston luomiseen. Pidin myös ABP:ssä käytetystä lähestymistavasta, joka on hyvin kypsä, sillä se perustuu DDD:hen ja monoliittisuuteen.", "AbpBookDownloadArea_ClaimYourEBook": "Lunasta Mastering ABP Framework -e-kirja", "AddMemberModal_Warning_1": "Jos käyttäjätunnusta, jota yrität lisätä, ei ole järjestelmässä, pyydä tiimisi jäsentä rekisteröitymään osoitteessa {0} ja jakaa hänen tilinsä käyttäjätunnus kanssasi.", "MyOrganizations_Detail_WelcomeMessage": "Tervetuloa organisaatioosi, {0}", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json index e1419b70a4..0588062ad8 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/fr.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Puis-je changer les développeurs enregistrés de mon organisation à l'avenir?", "ChangingDevelopersExplanation": "En plus d'ajouter de nouveaux développeurs à votre licence, vous pouvez également modifier les développeurs existants (vous pouvez supprimer un développeur et en ajouter un nouveau sur le même siège) sans aucun coût supplémentaire.", "WhenShouldIRenewMyLicense": "Quand dois-je renouveler ma licence?", - "WhenShouldIRenewMyLicenseExplanation": "Si vous renouvelez votre licence dans 1 mois après l'expiration de votre licence, les remises suivantes seront appliquées : licence d'équipe {0} ; licence commerciale {1} ; licence d'entreprise {2}. Toutefois, si vous renouveler votre licence après 1 mois depuis la date d'expiration de votre licence, le prix de renouvellement sera le même que le prix d'achat de la licence et il n'y aura pas de remise sur votre renouvellement.", + "WhenShouldIRenewMyLicenseExplanation": "Si vous renouvelez votre licence dans {3} jours après l'expiration de votre licence, les remises suivantes seront appliquées : licence d'équipe {0} ; licence commerciale {1} ; licence d'entreprise {2}. Toutefois, si vous renouveler votre licence après {3} jours depuis la date d'expiration de votre licence, le prix de renouvellement sera le même que le prix d'achat de la licence et il n'y aura pas de remise sur votre renouvellement.", "TrialPlan": "Avez-vous un plan d'essai?", "DoYouAcceptBankWireTransfer": "Acceptez-vous les virements bancaires?", "DoYouAcceptBankWireTransferExplanation": "Oui, nous acceptons les virements bancaires.
Après avoir envoyé les frais de licence par virement bancaire, envoyez-nous par e-mail à accounting@abp.io votre reçu et le type de licence demandé. Nos coordonnées bancaires internationales :", @@ -399,7 +399,7 @@ "WhatHappensWhenLicenseEndsExplanation4": "Vous ne pouvez pas installer les nouveaux modules et thèmes ajoutés à la plateforme ABP Commercial après l'expiration de votre licence.", "WhatHappensWhenLicenseEndsExplanation5": "Vous ne pouvez pas utiliser la suite ABP.", "WhatHappensWhenLicenseEndsExplanation6": "Vous ne pouvez plus bénéficier du
support premium.", - "WhatHappensWhenLicenseEndsExplanation7": "Vous pouvez prolonger (renouveler) votre licence si vous souhaitez continuer à bénéficier de ces avantages. Si vous prolongez votre licence dans 1 mois après l'expiration de votre licence, les remises suivantes seront appliquées : Licence d'équipe {0} ; Licence commerciale {1} ; Licence Entreprise {2}.", + "WhatHappensWhenLicenseEndsExplanation7": "Vous pouvez prolonger (renouveler) votre licence si vous souhaitez continuer à bénéficier de ces avantages. Si vous prolongez votre licence dans {3} jours après l'expiration de votre licence, les remises suivantes seront appliquées : Licence d'équipe {0} ; Licence commerciale {1} ; Licence Entreprise {2}.", "BlazoriseLicense": "Faut-il acheter une licence Blazorise ?", "BlazoriseLicenseExplanation": "Nous avons conclu un accord entre Volosoft et Megabit, dans le cadre duquel la licence Blazorise est intégrée aux produits ABP Commercial, de sorte que nos clients n'ont pas besoin d'acheter une licence Blazorise supplémentaire." } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json index 4d00cc26b3..2d16ac121d 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hi.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "क्या मैं भविष्य में अपने संगठन के पंजीकृत डेवलपर्स को बदल सकता हूं?", "ChangingDevelopersExplanation": "अपने लाइसेंस में नए डेवलपर्स को जोड़ने के अलावा, आप मौजूदा डेवलपर्स को भी बदल सकते हैं (आप एक डेवलपर को हटा सकते हैं और एक ही सीट पर एक नया जोड़ सकते हैं) बिना किसी अतिरिक्त लागत के।", "WhenShouldIRenewMyLicense": "मुझे अपना लाइसेंस कब नवीनीकृत करना चाहिए?", - "WhenShouldIRenewMyLicenseExplanation": "यदि आप अपने लाइसेंस की समय सीमा समाप्त होने के बाद 1 महीने के भीतर अपना लाइसेंस नवीनीकृत करते हैं, तो निम्नलिखित छूटें लागू होंगी: टीम लाइसेंस {0} ; व्यवसाय लाइसेंस {1} ; एंटरप्राइज़ लाइसेंस {2} . यदि आप अपने लाइसेंस की समाप्ति तिथि के बाद 1 महीने अपने लाइसेंस का नवीनीकरण करते हैं, तो नवीनीकरण मूल्य लाइसेंस खरीद मूल्य के समान होगा और आपके नवीनीकरण पर कोई छूट नहीं होगी।", + "WhenShouldIRenewMyLicenseExplanation": "यदि आप अपने लाइसेंस की समय सीमा समाप्त होने के बाद {3} दिन के भीतर अपना लाइसेंस नवीनीकृत करते हैं, तो निम्नलिखित छूटें लागू होंगी: टीम लाइसेंस {0} ; व्यवसाय लाइसेंस {1} ; एंटरप्राइज़ लाइसेंस {2} . यदि आप अपने लाइसेंस की समाप्ति तिथि के बाद {3} दिन अपने लाइसेंस का नवीनीकरण करते हैं, तो नवीनीकरण मूल्य लाइसेंस खरीद मूल्य के समान होगा और आपके नवीनीकरण पर कोई छूट नहीं होगी।", "TrialPlan": "क्या आपके पास एक परीक्षण योजना है?", "DoYouAcceptBankWireTransfer": "क्या आप बैंक वायर ट्रांसफर स्वीकार करते हैं?", "DoYouAcceptBankWireTransferExplanation": "हां, हम बैंक वायर ट्रांसफर स्वीकार करते हैं।
बैंक हस्तांतरण के माध्यम से लाइसेंस शुल्क भेजने के बाद, हमें अपनी रसीद और अनुरोधित लाइसेंस के प्रकार accounting@abp.io पर ईमेल करें। हमारे अंतरराष्ट्रीय बैंक खाते की जानकारी:", @@ -398,7 +398,7 @@ "WhatHappensWhenLicenseEndsExplanation4": "आपका लाइसेंस समाप्त होने के बाद आप ABP कमर्शियल प्लेटफॉर्म में जोड़े गए नए मॉड्यूल और थीम इंस्टॉल नहीं कर सकते।", "WhatHappensWhenLicenseEndsExplanation5": "आप एबीपी सूट का उपयोग नहीं कर सकते।", "WhatHappensWhenLicenseEndsExplanation6": "अब आप प्रीमियम समर्थन प्राप्त नहीं कर सकते।", - "WhatHappensWhenLicenseEndsExplanation7": "यदि आप इन लाभों को प्राप्त करना जारी रखना चाहते हैं तो आप अपने लाइसेंस का विस्तार (नवीनीकरण) कर सकते हैं। यदि आप अपना लाइसेंस समाप्त होने के बाद 1 महीने के भीतर अपना लाइसेंस बढ़ाते हैं, तो निम्नलिखित छूट लागू होंगी: टीम लाइसेंस {0}; व्यवसाय लाइसेंस {1}; उद्यम लाइसेंस {2}।", + "WhatHappensWhenLicenseEndsExplanation7": "यदि आप इन लाभों को प्राप्त करना जारी रखना चाहते हैं तो आप अपने लाइसेंस का विस्तार (नवीनीकरण) कर सकते हैं। यदि आप अपना लाइसेंस समाप्त होने के बाद {3} दिन के भीतर अपना लाइसेंस बढ़ाते हैं, तो निम्नलिखित छूट लागू होंगी: टीम लाइसेंस {0}; व्यवसाय लाइसेंस {1}; उद्यम लाइसेंस {2}।", "BlazoriseLicense": "क्या हमें ब्लेज़ोराइज़ लाइसेंस खरीदने की ज़रूरत है?", "BlazoriseLicenseExplanation": "हमारे पास Volosoft और Megabit के बीच एक समझौता है, इस समझौते के साथ Blazorise लाइसेंस को ABP वाणिज्यिक उत्पादों के साथ बंडल किया गया है, इसलिए हमारे ग्राहकों को एक अतिरिक्त Blazorise लाइसेंस खरीदने की आवश्यकता नहीं है।" } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json index 1e2387039a..9df49a3b0a 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/hu.json @@ -206,9 +206,9 @@ "discountForYears": "{0}% kedvezmény {1} évre", "WhatHappensWhenLicenseEndsExplanation8": "Az Ön által generált ABP projekteket nem tároljuk a szervereinken. Ezért az Ön felelőssége a letöltött forráskód megőrzése. Amikor a licensze lejár, nincs mód a generált ABP projekt forráskódjának lekérésére.", "WhenShouldIRenewMyLicense": "Mikor kell megújítanom a jogosítványomat?", - "WhenShouldIRenewMyLicenseExplanation": "Ha a licenc lejártát követő 1 hónapon belül megújítja a licencet, a következő kedvezmények érvényesek: Csapatlicenc {0}; Üzleti engedély {1}; Vállalati licenc {2}. Ha azonban a licenc lejárati dátuma óta 1 hónap után megújítja a licencet, a megújítási ár megegyezik a licenc vásárlási árával, és nem jár kedvezmény a megújításra.", + "WhenShouldIRenewMyLicenseExplanation": "Ha a licenc lejártát követő {3} nap megújítja a licencet, a következő kedvezmények érvényesek: Csapatlicenc {0}; Üzleti engedély {1}; Vállalati licenc {2}. Ha azonban a licenc lejárati dátuma óta 1 hónap után megújítja a licencet, a megújítási ár megegyezik a licenc vásárlási árával, és nem jár kedvezmény a megújításra.", "TrialPlan": "Van próbaterv?", - "TrialPlanExplanation": "14 napos próbaidővel rendelkezik az ABP Commercial csapat licenszéhez. További információért látogasson el ide . Továbbá a Team licenszekre 30 napos pénz-visszafizetési garanciát biztosítunk. Az első 30 napban csak visszatérítést kérhet. A Business és Enterprise licenszek esetén 30 napon belül 60%-os visszatérítést biztosítunk. Ennek az az oka, hogy a Business és Enterprise licenszek tartalmazzák az összes modul és téma teljes forráskódját.", + "TrialPlanExplanation": "Nem, az ABP Commercialhoz nincs próbaverzió. Tekintse meg a közösségi kiadást, hogy megértse a kód minőségét és megközelítéseit. A Team licencre 30 napos pénz-visszafizetési garanciát is vállalunk, kérdés nélkül! Az első 30 napon belül kérheti a visszatérítést. Üzleti és vállalati licencek esetén 60% visszatérítést biztosítunk 30 napon belül. Ennek az az oka, hogy a Business és Enterprise licencek tartalmazzák az összes modul és téma teljes forráskódját.", "DoYouAcceptBankWireTransfer": "Elfogadja a banki átutalást?", "DoYouAcceptBankWireTransferExplanation": "Igen, elfogadunk banki átutalást.
Miután banki átutalással elküldte a licencdíjat, küldje el nekünk e-mailben az accounting@abp.io címre nyugtát és a kért engedély típusát. Nemzetközi bankszámlánk információi:", "HowToUpgrade": "Hogyan lehet frissíteni a meglévő alkalmazásokat, ha új verzió érhető el?", @@ -538,6 +538,7 @@ "Pricing_Page_Testimonial_3": "Szeretjük az ABP-t. Nem kell mindent a nulláról írnunk. A beépített funkciókból indulunk ki, és csak arra koncentrálunk, amit valóban meg kell írnunk. Ezenkívül az ABP jól felépített, és a kód kiváló minőségű, kevesebb hibával. Ha magunknak kellene megírnunk mindent, amire szükségünk van, akkor lehet, hogy éveket kellene töltenünk. Még egyszer, amit szeretünk, az az, hogy az új verzió, a hibajavítás vagy a fejlesztés nagyon hamar, minden második héten megjelenik. Nem várunk túl sokáig.", "Pricing_Page_Testimonial_4": "Az ABP Commercial egy fantasztikus termék, amelyet ajánlunk. Kereskedelmi termékek, amelyeket ügyfeleink számára egyetlen konfigurálható platformon értékesíthetnek. Az ugrásszerű indítás, amelyet a keret és az eszközök biztosítanak bármely csapat számára, minden centet megér. Az ABP Commercial volt a legjobban megfelelő az igényeinknek.", "Pricing_Page_Testimonial_5": "Az ABP Framework nem csak keretrendszer, hanem útmutató is a projektfejlesztéshez/menedzsmenthez, mert DDD, GenericRepository, DI, Microservice és Modularity képzést biztosít. Ha magát a keretrendszert nem is használja, fejlesztheti magát a docs.abp.io-val, amely jól és professzionálisan elkészített (OpenIddict, Redis, Quartz stb.) leírás. Mivel sok minden előre be van építve, jelentősen lerövidíti a projektfejlesztési időt (például bejelentkezési oldal, kivételkezelés, adatszűrés, aéapadatok, audit naplózás, lokalizáció, automatikus API vezérlő stb.). Alkalmazásunkból példaként a Helyi Event Bus-t használtam az állomány karbantartására. Így a rendelési mozgásokat eseményekkel tudom a készlethez igazítani. Csodálatos, hogy nem veszítünk időt a CreationTime-ra, a CreatorId-re. Automatikusan feltöltődnek.", + "Pricing_Page_Testimonial_6": "Az ABP Framework egy jó keretrendszer, de időre van szükség a különböző rétegek, osztályok és könyvtárak (különösen az ABP) megértéséhez. Sok időt töltöttem a kódbázis elolvasásával, de az ABP Commercial időt takarít meg nekünk a projekt speciális entitások (AR) és a mindegyikhez kapcsolódó tároló létrehozására. Tetszett az ABP-ben használt megközelítés is nagyon érett, tudjuk, hogy a DDD-n és a monoliton alapul.", "AbpBookDownloadArea_ClaimYourEBook": "Igényelje Mastering ABP Framework e-könyvét", "AddMemberModal_Warning_1": "Ha a hozzáadni kívánt felhasználónév nem létezik a rendszerben, kérje meg csapattagját, hogy regisztráljon a (z) {0} webhelyen, és ossza meg fiókja felhasználónevét Önnel.", "MyOrganizations_Detail_WelcomeMessage": "Üdvözöljük szervezetében, {0}", @@ -749,4 +750,4 @@ "TotalNetPrice": "Total Net Price", "BlackFridayDiscount": "Black Friday Kedvezmény" } -} +} \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json index 7e5c856f4e..ff0c6cc417 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/is.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Get ég breytt skráðum forriturum fyrirtækisins míns í framtíðinni?", "ChangingDevelopersExplanation": "Til viðbótar við að bæta nýjum verktaka við leyfi þitt geturðu einnig breytt núverandi forriturum (þú getur fjarlægt verktaka og bætt nýjum við) án aukakostnaðar.", "WhenShouldIRenewMyLicense": "Hvenær ætti ég að endurnýja leyfið mitt?", - "WhenShouldIRenewMyLicenseExplanation": "Ef þú endurnýjar leyfið þitt innan eins mánaðar eftir að leyfið þitt rennur út verða eftirfarandi afslættir notaðir: Team Leyfi {0}% afsláttur, Business License {1}% afsláttur, Enterprise License {2}% afsláttur . Ef þú endurnýjar leyfið þitt 1 mánuði eftir að leyfið rennur út, verður endurnýjunarverðið það sama og kaupverð leyfisins og enginn afsláttur af endurnýjun þinni.", + "WhenShouldIRenewMyLicenseExplanation": "Ef þú endurnýjar leyfið þitt innan {3} dagar eftir að leyfið þitt rennur út verða eftirfarandi afslættir notaðir: Team Leyfi {0}% afsláttur, Business License {1}% afsláttur, Enterprise License {2}% afsláttur . Ef þú endurnýjar leyfið þitt {3} dagar eftir að leyfið rennur út, verður endurnýjunarverðið það sama og kaupverð leyfisins og enginn afsláttur af endurnýjun þinni.", "TrialPlan": "Ertu með prufuáætlun?", "DoYouAcceptBankWireTransfer": "Samþykki þið bankamillifærslu?", "DoYouAcceptBankWireTransferExplanation": "Já, við tökum við bankamillifærslu.
Eftir að hafa sent leyfisgjaldið með millifærslu skaltu senda okkur tölvupóst á accounting@abp.io kvittun þína og tegund leyfis sem óskað er eftir. Upplýsingar um alþjóðlega bankareikninginn okkar:", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json index 398c23dc3e..ccd74fd005 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/it.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Posso cambiare gli sviluppatori registrati della mia organizzazione in futuro?", "ChangingDevelopersExplanation": "Oltre ad aggiungere nuovi sviluppatori alla tua licenza, puoi anche Modifica gli sviluppatori esistenti (puoi rimuovere uno sviluppatore e aggiungerne uno nuovo alla stessa postazione) senza alcun costo aggiuntivo.", "WhenShouldIRenewMyLicense": "Quando devo rinnovare la mia licenza?", - "WhenShouldIRenewMyLicenseExplanation": "Se rinnovi la licenza entro 1 mese dopo la scadenza della licenza, verranno applicati i seguenti sconti: Licenza Team {0} ; Licenza Business {1} ; Licenza Enterprise {2} . Se rinnovi la licenza 1 mese dopo la data di scadenza della licenza, il prezzo di rinnovo sarà lo stesso del prezzo di acquisto della licenza e non ci saranno sconti sul rinnovo.", + "WhenShouldIRenewMyLicenseExplanation": "Se rinnovi la licenza entro {3} giorni dopo la scadenza della licenza, verranno applicati i seguenti sconti: Licenza Team {0} ; Licenza Business {1} ; Licenza Enterprise {2} . Se rinnovi la licenza {3} giorni dopo la data di scadenza della licenza, il prezzo di rinnovo sarà lo stesso del prezzo di acquisto della licenza e non ci saranno sconti sul rinnovo.", "TrialPlan": "Hai un piano di prova?", "DoYouAcceptBankWireTransfer": "Accettate bonifici bancari?", "DoYouAcceptBankWireTransferExplanation": "Sì, accettiamo bonifico bancario.
Dopo aver inviato il canone tramite bonifico bancario, inviaci un'e-mail a accounting@abp.io con la ricevuta e il tipo di licenza richiesta. Le nostre informazioni sul conto bancario internazionale:", @@ -398,7 +398,7 @@ "WhatHappensWhenLicenseEndsExplanation4": "Non è possibile installare nuovi moduli e temi aggiunti alla piattaforma ABP Commercial dopo la scadenza della licenza.", "WhatHappensWhenLicenseEndsExplanation5": "Non è possibile utilizzare la suite ABP.", "WhatHappensWhenLicenseEndsExplanation6": "Non è più possibile ottenere il supporto premium.", - "WhatHappensWhenLicenseEndsExplanation7": "Puoi estendere (rinnovare) la tua licenza se desideri continuare a ottenere questi vantaggi. Se estendi la licenza entro 1 mese dalla scadenza della licenza, verranno applicati i seguenti sconti: Licenza Team {0}; Licenza commerciale {1}; Licenza aziendale {2}.", + "WhatHappensWhenLicenseEndsExplanation7": "Puoi estendere (rinnovare) la tua licenza se desideri continuare a ottenere questi vantaggi. Se estendi la licenza entro {3} giorni dalla scadenza della licenza, verranno applicati i seguenti sconti: Licenza Team {0}; Licenza commerciale {1}; Licenza aziendale {2}.", "BlazoriseLicense": "Dobbiamo acquistare la licenza di Blazorise?", "BlazoriseLicenseExplanation": "Abbiamo un accordo tra Volosoft e Megabit, con il quale la licenza di Blazorise viene fornita in bundle con i prodotti commerciali ABP, pertanto i nostri clienti non hanno bisogno di acquistare una licenza Blazorise aggiuntiva." } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json index b2c2caec7f..cc7a076848 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/nl.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Kan ik de geregistreerde ontwikkelaars van mijn organisatie in de toekomst wijzigen?", "ChangingDevelopersExplanation": "Naast het toevoegen van nieuwe ontwikkelaars aan uw licentie, kunt u ook de bestaande ontwikkelaars wijzigen (u kunt een ontwikkelaar verwijderen en een nieuwe toevoegen aan dezelfde stoel) zonder extra kosten.", "WhenShouldIRenewMyLicense": "Wanneer moet ik mijn licentie verlengen?", - "WhenShouldIRenewMyLicenseExplanation": "Als u uw licentie verlengt binnen 1 maand nadat uw licentie is verlopen, worden de volgende kortingen toegepast: Teamlicentie {0}% korting, Zakelijke licentie {1}% korting, Enterprise-licentie {2}% korting . Als u uw licentie 1 maand na de vervaldatum van uw licentie verlengt, is de verlengingsprijs gelijk aan de aankoopprijs van de licentie en wordt er geen korting op uw verlenging gegeven.", + "WhenShouldIRenewMyLicenseExplanation": "Als u uw licentie verlengt binnen {3} dagen nadat uw licentie is verlopen, worden de volgende kortingen toegepast: Teamlicentie {0}% korting, Zakelijke licentie {1}% korting, Enterprise-licentie {2}% korting . Als u uw licentie {3} dagen na de vervaldatum van uw licentie verlengt, is de verlengingsprijs gelijk aan de aankoopprijs van de licentie en wordt er geen korting op uw verlenging gegeven.", "TrialPlan": "Heb je een proefplan?", "DoYouAcceptBankWireTransfer": "Accepteert u bankoverschrijvingen?", "DoYouAcceptBankWireTransferExplanation": "Ja, we accepteren bankoverschrijvingen.
Nadat u de licentievergoeding via bankoverschrijving heeft verzonden, stuurt u een e-mail naar accounting@abp.io met uw kwitantie en het type licentie dat u heeft aangevraagd. Onze internationale bankrekeninggegevens:", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json index a640fe8f4f..4aa4f6616f 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pl-PL.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Czy mogę w przyszłości zmienić zarejestrowanych programistów mojej organizacji?", "ChangingDevelopersExplanation": "Oprócz dodawania nowych programistów do swojej licencji możesz również zmieniać istniejących programistów (możesz usunąć programistę i dodać nowego do tego samego stanowiska) bez żadnych dodatkowych kosztów.", "WhenShouldIRenewMyLicense": "Kiedy powinienem odnowić licencję?", - "WhenShouldIRenewMyLicenseExplanation": "Jeśli odnowisz licencję w ciągu 1 miesiąca po wygaśnięciu licencji, zostaną zastosowane następujące rabaty: licencja zespołowa {0}% rabatu, licencja biznesowa {1}% rabatu, licencja Enterprise {2}% rabatu . Jeśli odnowisz licencję 1 miesiąc po dacie wygaśnięcia licencji, cena odnowienia będzie taka sama jak cena zakupu licencji i nie będzie rabatu na odnowienie.", + "WhenShouldIRenewMyLicenseExplanation": "Jeśli odnowisz licencję w ciągu {3} dni po wygaśnięciu licencji, zostaną zastosowane następujące rabaty: licencja zespołowa {0}% rabatu, licencja biznesowa {1}% rabatu, licencja Enterprise {2}% rabatu . Jeśli odnowisz licencję 1 miesiąc po dacie wygaśnięcia licencji, cena odnowienia będzie taka sama jak cena zakupu licencji i nie będzie rabatu na odnowienie.", "TrialPlan": "Czy masz plan próbny?", "DoYouAcceptBankWireTransfer": "Czy akceptujesz przelew bankowy?", "DoYouAcceptBankWireTransferExplanation": "Tak, akceptujemy przelew bankowy.
Po wysłaniu opłaty licencyjnej przelewem bankowym wyślij nam e-mail na adres accounting@abp.io z potwierdzeniem odbioru i rodzajem żądanej licencji. Informacje o naszych międzynarodowych kontach bankowych:", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json index 80059fb5a2..4e06b40112 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/pt-BR.json @@ -191,7 +191,7 @@ "ChangingDevelopers": "Posso mudar os desenvolvedores registrados da minha organização no futuro?", "ChangingDevelopersExplanation": "Além de adicionar novos desenvolvedores à sua licença, você também pode alterar os desenvolvedores existentes (você pode remover um desenvolvedor e adicionar um novo ao mesmo assento) sem nenhum custo adicional.", "WhenShouldIRenewMyLicense": "Quando devo renovar minha licença?", - "WhenShouldIRenewMyLicenseExplanation": "Se você renovar sua licença em 1 mês após a expiração da licença, os seguintes descontos serão aplicados: Licença de equipe {0} ; Licença de negócios {1} ; Licença empresarial {2} . Se você renovar sua licença 1 mês após a data de expiração de sua licença, o preço de renovação será o mesmo que o preço de compra da licença e não haverá desconto em sua renovação.", + "WhenShouldIRenewMyLicenseExplanation": "Se você renovar sua licença em {3} dias após a expiração da licença, os seguintes descontos serão aplicados: Licença de equipe {0} ; Licença de negócios {1} ; Licença empresarial {2} . Se você renovar sua licença {3} dias após a data de expiração de sua licença, o preço de renovação será o mesmo que o preço de compra da licença e não haverá desconto em sua renovação.", "TrialPlan": "Você tem um plano experimental?", "DoYouAcceptBankWireTransfer": "Você aceita transferência bancária?", "DoYouAcceptBankWireTransferExplanation": "Sim, aceitamos transferência bancária.
Após enviar a taxa de licença por transferência bancária, envie-nos um e-mail para accounting@abp.io com seu recibo e o tipo de licença solicitada. Nossas informações de conta bancária internacional:", @@ -402,6 +402,6 @@ "WhatHappensWhenLicenseEndsExplanation4": "Você não pode instalar novos módulos e temas adicionados à plataforma comercial da ABP após o término de sua licença.", "WhatHappensWhenLicenseEndsExplanation5": "Você não pode usar o ABP Suite", "WhatHappensWhenLicenseEndsExplanation6": "Você não pode mais obter o apoio de premium.", - "WhatHappensWhenLicenseEndsExplanation7": "Você pode estender (renovar) sua licença se quiser continuar obtendo esses benefícios. Se você estender sua licença dentro de 1 mês após a expiração de sua licença, os seguintes descontos serão aplicados: Licença de equipe {0}; Licença Comercial {1}; Licença empresarial {2}." + "WhatHappensWhenLicenseEndsExplanation7": "Você pode estender (renovar) sua licença se quiser continuar obtendo esses benefícios. Se você estender sua licença dentro de {3} dias após a expiração de sua licença, os seguintes descontos serão aplicados: Licença de equipe {0}; Licença Comercial {1}; Licença empresarial {2}." } } \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json index c1eeae7448..358bd87038 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ro-RO.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Pe viitor, pot schimba dezvoltatorii ataşaţi organizaţiei mele?", "ChangingDevelopersExplanation": "În plus faţă de adăugarea de noi dezvoltatori la licenţa dumneavoastră, puteţi schimba şi dezvoltatorii existenţi(puteţi elimina un dezvoltator şi adăuga unul nou în locul lui) fără costuri suplimentare.", "WhenShouldIRenewMyLicense": "Când ar trebui să-mi reînnoiesc licenţa?", - "WhenShouldIRenewMyLicenseExplanation": "Dacă vă reînnoiți licența în termen de o lună de la expirarea licenței, se vor aplica următoarele reduceri: Licență de echipă {0}% reducere, Licență de afaceri {1}% reducere, Licență Enterprise {2}% reducere . Dacă vă reînnoiți licența la 1 lună după data de expirare a licenței, prețul de reînnoire va fi același cu prețul de achiziție a licenței și nu va exista nicio reducere la reînnoirea dvs.", + "WhenShouldIRenewMyLicenseExplanation": "Dacă vă reînnoiți licența în termen de {3} de zile de la expirarea licenței, se vor aplica următoarele reduceri: Licență de echipă {0}% reducere, Licență de afaceri {1}% reducere, Licență Enterprise {2}% reducere . Dacă vă reînnoiți licența la {3} de zile după data de expirare a licenței, prețul de reînnoire va fi același cu prețul de achiziție a licenței și nu va exista nicio reducere la reînnoirea dvs.", "TrialPlan": "Aveţi un plan de încercare?", "DoYouAcceptBankWireTransfer": "Acceptaţi transfer bancar?", "DoYouAcceptBankWireTransferExplanation": "Da, acceptăm transfer bancar.
După ce ați trimis taxa de licență prin transfer bancar, trimiteți-ne un e-mail la accounting@abp.io chitanța dvs. și tipul de licență solicitat. Informațiile noastre internaționale despre contul nostru bancar:", @@ -381,4 +381,4 @@ "CommercialNewsletterConfirmationMessage": "Sunt de acord cu Termenii și condițiile și cu Politica de confidențialitate .", "BlackFridayDiscount": "Black Friday Discount" } -} +} \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json index 7a0427083e..8c53bc9ea8 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/ru.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Могу ли я сменить зарегистрированных разработчиков моей организации в будущем?", "ChangingDevelopersExplanation": "Помимо добавления новых разработчиков к вашей лицензии, вы также можете изменить существующих разработчиков (вы можете удалить разработчика и добавить нового на то же место) без каких-либо дополнительных затрат.", "WhenShouldIRenewMyLicense": "Когда мне следует продлить лицензию?", - "WhenShouldIRenewMyLicenseExplanation": "Если вы продлите лицензию в течение 1 месяца после истечения срока действия лицензии, будут применяться следующие скидки: групповая лицензия {0}% скидка, бизнес-лицензия {1}% скидка, корпоративная лицензия {2}% скидка . Если вы продлеваете лицензию через 1 месяц после даты истечения срока действия лицензии, цена продления будет такой же, как цена покупки лицензии, и при продлении скидки не будет.", + "WhenShouldIRenewMyLicenseExplanation": "Если вы продлите лицензию в течение {3} дней после истечения срока действия лицензии, будут применяться следующие скидки: групповая лицензия {0}% скидка, бизнес-лицензия {1}% скидка, корпоративная лицензия {2}% скидка . Если вы продлеваете лицензию {3} дней после даты истечения срока действия лицензии, цена продления будет такой же, как цена покупки лицензии, и при продлении скидки не будет.", "TrialPlan": "У вас есть пробный план?", "DoYouAcceptBankWireTransfer": "Вы принимаете банковский перевод?", "DoYouAcceptBankWireTransferExplanation": "Да, мы принимаем банковский перевод.
После отправки платы за лицензию банковским переводом отправьте нам электронное письмо по адресу accounting@abp.io, квитанцию и тип запрошенной лицензии. Информация о нашем международном банковском счете:", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json index 90a6b33fef..b0a6d6490e 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sk.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Môžem v budúcnosti zmeniť registrovaných vývojárov svojej organizácie?", "ChangingDevelopersExplanation": "Okrem pridávania nových vývojárov do licencie môžete tiež meniť existujúcich vývojárov (môžete odstrániť vývojára a pridať nového na to isté miesto) bez akýchkoľvek ďalších nákladov.", "WhenShouldIRenewMyLicense": "Kedy si mám obnoviť licenciu?", - "WhenShouldIRenewMyLicenseExplanation": "Ak si licenciu obnovíte do 1 mesiaca po vypršaní platnosti licencie, budú sa uplatňovať tieto zľavy: Tímová licencia {0} ; Obchodná licencia {1} ; Enterprise licencia {2} . Ak si licenciu obnovíte 1 mesiac po dátume skončenia platnosti licencie, cena za obnovenie bude rovnaká ako cena za nákup licencie a na obnovenie nebude poskytnutá žiadna zľava.", + "WhenShouldIRenewMyLicenseExplanation": "Ak si licenciu obnovíte do 30 dní po vypršaní platnosti licencie, budú sa uplatňovať tieto zľavy: Tímová licencia {0} ; Obchodná licencia {1} ; Enterprise licencia {2} . Ak si licenciu obnovíte 30 dní po dátume skončenia platnosti licencie, cena za obnovenie bude rovnaká ako cena za nákup licencie a na obnovenie nebude poskytnutá žiadna zľava.", "TrialPlan": "Máte skúšobný plán?", "DoYouAcceptBankWireTransfer": "Prijímate bankový prevod?", "DoYouAcceptBankWireTransferExplanation": "Áno, akceptujeme bankový prevod.
Po odoslaní licenčného poplatku bankovým prevodom nám pošlite e-mail na adresu accounting@abp.io svoje potvrdenie a požadovaný typ licencie. Informácie o našom medzinárodnom bankovom účte:", @@ -396,7 +396,7 @@ "WhatHappensWhenLicenseEndsExplanation4": "Po skončení platnosti vašej licencie nemôžete inštalovať nové moduly a témy pridané do platformy ABP Commercial.", "WhatHappensWhenLicenseEndsExplanation5": "Balík ABP Suite nemôžete používať.", "WhatHappensWhenLicenseEndsExplanation6": "Už nemôžete získať prémiovú podporu.", - "WhatHappensWhenLicenseEndsExplanation7": "Ak chcete naďalej využívať tieto výhody, môžete si licenciu predĺžiť (obnoviť). Ak predĺžite svoju licenciu do 1 mesiaca po vypršaní platnosti licencie, budú sa uplatňovať nasledujúce zľavy: Tímová licencia {0}; Obchodná licencia {1}; Podniková licencia {2}", + "WhatHappensWhenLicenseEndsExplanation7": "Ak chcete naďalej využívať tieto výhody, môžete si licenciu predĺžiť (obnoviť). Ak predĺžite svoju licenciu do 30 dní po vypršaní platnosti licencie, budú sa uplatňovať nasledujúce zľavy: Tímová licencia {0}; Obchodná licencia {1}; Podniková licencia {2}", "BlazoriseLicense": "Musíme si kúpiť licenciu Blazorise?", "BlazoriseLicenseExplanation": "Máme dohodu medzi spoločnosťami Volosoft a Megabit, na základe ktorej je licencia Blazorise pribalená k produktom ABP Commercial, preto si naši zákazníci nemusia kupovať ďalšiu licenciu Blazorise." } diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json index 5abffa2189..85acb70552 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/sl.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Ali lahko v prihodnosti spremenim registrirane razvijalce svoje organizacije?", "ChangingDevelopersExplanation": "Poleg dodajanja novih razvijalcev vaši licenci lahko spremenite tudi obstoječe razvijalce (lahko odstranite razvijalca in dodate novega na isto mesto) brez dodatnih stroškov.", "WhenShouldIRenewMyLicense": "Kdaj naj podaljšam licenco?", - "WhenShouldIRenewMyLicenseExplanation": "Če licenco podaljšate v 1 mesecu po poteku licence, bodo uporabljeni naslednji popusti: licenca za ekipo {0} % popusta, poslovna licenca {1} % popusta, licenca za podjetje {2} % popusta . Če podaljšate licenco 1 mesec po datumu poteka veljavnosti licence, bo cena podaljšanja enaka nakupni ceni licence in pri podaljšanju ne bo popusta.", + "WhenShouldIRenewMyLicenseExplanation": "Če licenco podaljšate v {3} dni po poteku licence, bodo uporabljeni naslednji popusti: licenca za ekipo {0} % popusta, poslovna licenca {1} % popusta, licenca za podjetje {2} % popusta . Če podaljšate licenco {3} dni po datumu poteka veljavnosti licence, bo cena podaljšanja enaka nakupni ceni licence in pri podaljšanju ne bo popusta.", "TrialPlan": "Ali imate poskusni načrt?", "DoYouAcceptBankWireTransfer": "Ali sprejemate bančno nakazilo?", "DoYouAcceptBankWireTransferExplanation": "Da, sprejemamo bančno nakazilo.
Ko pošljete licenčnino prek bančnega nakazila, nam pošljite e-pošto na accounting@abp.io vaše potrdilo o prejemu in vrsto zahtevane licence. Naši podatki o mednarodnem bančnem računu:", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json index d1a517971a..96375db1f6 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/tr.json @@ -95,7 +95,7 @@ "LanguageManagement": "Dil Yönetimi", "TextTemplateManagement": "Metin Şablonu Yönetimi", "See All Modules": "SeeAllModüller", - "ABPSuite": "ABP Süiti", + "ABPSuite": "ABP Suite", "AbpSuiteShortDescription": "ABP Suite, ABP Commercial için tamamlayıcı bir araçtır.", "AbpSuiteExplanation": "Birkaç dakika içinde web sayfaları oluşturmanıza olanak tanır. Komut satırından yüklenebilen bir .NET Core Global aracıdır. Yeni bir ABP çözümü oluşturabilir, veritabanından ön uca kadar CRUD sayfaları oluşturabilir.", "Details": "Detaylar", @@ -193,7 +193,7 @@ "ChangingDevelopers": "Gelecekte kuruluşumun kayıtlı geliştiricilerini değiştirebilir miyim?", "ChangingDevelopersExplanation": "Lisansınıza yeni geliştiriciler eklemenin yanı sıra mevcut geliştiricileri de herhangi bir ek ücret ödemeden değiştirebilirsiniz (bir geliştiriciyi kaldırıp aynı koltuğa yeni bir tane ekleyebilirsiniz).", "WhenShouldIRenewMyLicense": "Ehliyetimi ne zaman yenilemeliyim?", - "WhenShouldIRenewMyLicenseExplanation": "Lisansınızın süresi dolduktan sonra 1 ay içinde lisansınızı yenilerseniz, aşağıdaki indirimler uygulanacaktır: Takım Lisansı %{0} indirim, İşletme Lisansı %{1} indirim, Kurumsal Lisans %{2} indirim . Lisansınızın sona erme tarihinden 1 ay sonra lisansınızı yenilerseniz, yenileme fiyatı lisans satın alma fiyatı ile aynı olacak ve yenilemenizde indirim yapılmayacaktır.", + "WhenShouldIRenewMyLicenseExplanation": "Lisansınızın süresi dolduktan sonra {3} gün içinde lisansınızı yenilerseniz, aşağıdaki indirimler uygulanacaktır: Takım Lisansı %{0} indirim, İşletme Lisansı %{1} indirim, Kurumsal Lisans %{2} indirim . Lisansınızın sona erme tarihinden {3} gün sonra lisansınızı yenilerseniz, yenileme fiyatı lisans satın alma fiyatı ile aynı olacak ve yenilemenizde indirim yapılmayacaktır.", "TrialPlan": "Deneme planınız var mı?", "DoYouAcceptBankWireTransfer": "Banka havalesini kabul ediyor musunuz?", "DoYouAcceptBankWireTransferExplanation": "Evet, banka havalesini kabul ediyoruz.
Lisans ücretini banka havalesi yoluyla gönderdikten sonra, dekontunuzu ve talep edilen lisans türünü accounting@abp.io adresinden bize e-posta ile gönderin. Uluslararası banka hesap bilgilerimiz:", @@ -393,16 +393,16 @@ "LastNameField": "Soyad", "AbpCommercialMetaTitle": " {0} | ABP Commercial", "AbpCommercialMetaDescription": "ABP Commercial, açık kaynaklı ABP çerçevesinin üzerine inşa edilmiş önceden oluşturulmuş uygulama modülleri, hızlı geliştirme araçları, kullanıcı arayüzü temaları ve hizmetlerinden oluşan bir settir.", - "WhatHappensWhenLicenseEnds": "Lisans sürem sona erdiğinde ne olacak?", + "WhatHappensWhenLicenseEnds": "Lisans sürem sona erdiğinde ne olacak?", "WhatHappensWhenLicenseEndsExplanation1": "ABP Ticari lisansı kalıcı bir lisanstır. Lisansınızın süresi dolduktan sonra projenizi geliştirmeye devam edebilirsiniz. Ve lisansınızı yenilemek zorunda değilsiniz. Lisansınız kutudan bir yıllık güncelleme ve destek planı ile birlikte gelir. Yeni özellikler, performans geliştirmeleri, hata düzeltmeleri, destek almaya devam etmek ve ABP Suite'i kullanmaya devam etmek için lisansınızı yenilemeniz gerekir. Lisansınızın süresi dolduğunda aşağıdaki avantajlardan yararlanamazsınız:", "WhatHappensWhenLicenseEndsExplanation2": "ABP Ticari'yi kullanarak yeni çözümler oluşturamazsınız, ancak mevcut uygulamalarınızı sonsuza kadar geliştirmeye devam edebilirsiniz.", "WhatHappensWhenLicenseEndsExplanation3": "MINOR sürümünüzdeki modüller ve temalar için güncellemeleri alabileceksiniz (RC veya Önizleme sürümleri hariç). Örneğin: bir modülün v3.2.0 sürümünü kullanıyorsanız, bu modülün v3.2.x (v3.2.1, v3.2.5... vb.) sürümleri için güncellemeleri almaya devam edebilirsiniz. Ancak bir sonraki büyük veya küçük sürüm için güncelleme alamazsınız (v3.3.0, v3.3.3, 4.x.x... gibi). Örneğin, lisansınızın süresi dolduğunda, en son sürüm v4.4.3 idi ve daha sonra hem 4.4.4 sürümünü hem de 4.5.0 sürümünü yayınladı, v4.4.X'e erişebilirsiniz, ancak v4.5.X'e erişemezsiniz.", "WhatHappensWhenLicenseEndsExplanation4": "Lisansınız sona erdikten sonra ABP Ticari platformuna eklenen yeni modülleri ve temaları yükleyemezsiniz.", "WhatHappensWhenLicenseEndsExplanation5": "ABP Suite'i kullanamazsınız.", "WhatHappensWhenLicenseEndsExplanation6": "Artık premium desteği alamazsınız.", - "WhatHappensWhenLicenseEndsExplanation7": "Bu avantajlardan yararlanmaya devam etmek istiyorsanız lisansınızı uzatabilirsiniz (yenileyebilirsiniz). Lisansınızın süresi dolduktan sonra 1 ay içinde lisansınızı uzatırsanız, aşağıdaki indirimler uygulanacaktır: Takım Lisansı {0} % indirim, İşletme Lisansı %{1} indirim, Kurumsal Lisans %{2} indirim.", + "WhatHappensWhenLicenseEndsExplanation7": "Bu avantajlardan yararlanmaya devam etmek istiyorsanız lisansınızı uzatabilirsiniz (yenileyebilirsiniz). Lisansınızın süresi dolduktan sonra {3} gün içinde lisansınızı uzatırsanız, aşağıdaki indirimler uygulanacaktır: Takım Lisansı {0} % indirim, İşletme Lisansı %{1} indirim, Kurumsal Lisans %{2} indirim.", "WhatHappensWhenLicenseEndsExplanation8": "Oluşturduğunuz ABP projeleri sunucularımızda saklanmamaktadır. Bu nedenle indirdiğiniz kaynak kodunu saklamak sizin sorumluluğunuzdadır. Lisansınızın süresi dolduğunda, oluşturulan ABP proje kaynak kodunuzu almanın bir yolu yoktur.", - "TrialPlanExplanation": "ABP Ticari takım lisansı için 14 günlük deneme süresi var. Daha fazla bilgi için burayı ziyaret edin. Ayrıca, Takım lisansları için 30 günlük para iade garantisi veriyoruz. Sadece ilk 30 gün içinde geri ödeme talebinde bulunabilirsiniz. İşletme ve Kurumsal lisansları için 30 gün içinde %60 geri ödeme sağlıyoruz. Bunun nedeni, İşletme ve Kurumsal lisanslarının tüm modüllerin ve temaların tam kaynak kodunu içermesidir.", + "TrialPlanExplanation": "Hayır, ABP Commercial için deneme sürümü yoktur. Kod kalitesini ve yaklaşımları anlamak için topluluk sürümünü kontrol edebilirsiniz. Ayrıca, Takım lisansları için 30 günlük para iade garantisi veriyoruz. Sadece ilk 30 gün içinde geri ödeme talebinde bulunabilirsiniz. İşletme ve Kurumsal lisansları için 30 gün içinde %60 geri ödeme sağlıyoruz. Bunun nedeni, İşletme ve Kurumsal lisanslarının tüm modüllerin ve temaların tam kaynak kodunu içermesidir.", "ContactUsQuestions": "Herhangi bir sorunuz varsa bizimle iletişime geçin", "ActivationRequirement": "Denemenizi başlatmanıza son bir adım kaldı.
Bilgilerinizi kontrol ettikten sonra lisansınızı etkinleştireceğiz. Lisansınız etkinleştirildiğinde, {0} adresine bir e-posta göndereceğiz. Merak etmeyin bu süreç uzun sürmeyecek!", "PurchaseNow": "Şimdi satın al", @@ -417,9 +417,8 @@ "RenewLicenseEarly": "Lisansımı erken yenilersem, tüm yılı alacak mıyım?", "RenewLicenseEarylExplanation": "Lisansınızı lisans bitiş tarihinizden önce yenilediğinizde, lisans bitiş tarihinize 1 yıl eklenecektir. Örneğin, lisansınızın süresi {0}-06-06 tarihinde doluyorsa ve lisansınızı {0}-01-01 tarihinde yenilediyseniz, yeni lisans bitiş tarihiniz {1}-06-06 olacaktır.", "OpenSourceWebApplication": "Açık Kaynak Web Uygulaması", - "CompleteWebDevelopment": "Tam Web Geliştirme", "ABPFrameworkDescription": "ABP Framework, yazılım geliştirme ve sözleşmelerin en iyi uygulamalarını takip ederek modern web uygulamaları oluşturmak için eksiksiz bir altyapıdır.", - "CommunityDescription": "ABP Çerçevesi ile ilgili deneyimlerinizi paylaşın!", + "CommunityDescription": "ABP Çerçevesi ile ilgili deneyimlerinizi paylaşın!", "GetStarted": "Başlayın", "Views": "Görünümler", "LatestPosts": "Son Gönderiler", @@ -441,7 +440,7 @@ "ModularArchitectureExplanation": "Bu başlangıç şablonu, temiz ve sürdürülebilir bir kod tabanı oluşturmak için katmanlı, modüler ve DDD tabanlı bir çözüm mimarisi sağlar.", "SeeDetails": "Ayrıntıları Gör", "SeeDocumentation": "Belgelere göz atın", - "Bs5Compatible": "Bootstrap 5 uyumlu profesyonel tema, yönetici web siteniz için mükemmel.", + "Bs5Compatible": "Bootstrap 5 uyumlu profesyonel tema, yönetici web siteniz için mükemmel.", "LeptonXTheme": "LeptonX Tema", "LeptonXDark": "LeptonX Koyu", "LeptonXLight": "LeptonX Açık", @@ -454,7 +453,7 @@ "EasilyInstallAndUpgrade": "Kolay kurulum ve yükseltme", "SupportForum": "Destek Forumu", "TrustedBy": "Güvenenler", - "OurPricing": "Fiyatlandırmamız", + "OurPricing": "Fiyatlandırmamız", "Plans": "Planlar", "NameSurname": "Ad Soyad", "Unspecified": "Belirtilmemiş", @@ -465,7 +464,7 @@ "License": "Lisans", "Development": "Geliştirme", "Payment": "Ödeme", - "WatchExplainerVideo": "Hadi Tanışalım! Açıklayıcı Videoyu İzleyin", + "WatchExplainerVideo": "Hadi Tanışalım! Açıklayıcı Videoyu İzleyin", "LightDarkAndSemiDarkThemes": "Açık, koyu ve yarı koyu temalar", "LeptonXThemeExplanation": "Lepton Teması, temanızı sistem ayarlarınıza göre değiştirebilir.", "PRO": "PRO", @@ -548,6 +547,7 @@ "Pricing_Page_Testimonial_3": "ABP'yi seviyoruz. Her şeyi sıfırdan yazmak zorunda kalmıyoruz. Kullanıma hazır özelliklerden başlıyoruz ve sadece gerçekten yazmamız gerekenlere odaklanıyoruz. Ayrıca, ABP iyi tasarlanmış ve kod daha az hata ile yüksek kalitede. İhtiyaç duyduğumuz her şeyi kendi başımıza yazmak zorunda kalsaydık, yıllarımızı harcamak zorunda kalabilirdik. Hoşumuza giden bir diğer şey de yeni sürümün, sorun düzeltmenin ya da iyileştirmenin iki haftada bir çıkması. Çok uzun süre beklemiyoruz.", "Pricing_Page_Testimonial_4": "ABP Commercial harika bir ürün, tavsiye ederim. Müşterilerimiz için ticari ürünleri tek bir yapılandırılabilir platformda pazara sunuyor. Çerçeve ve araçların herhangi bir ekibe sağladığı hızlı başlangıç her kuruşa değer. ABP Commercial ihtiyaçlarımız için en uygun üründü.", "Pricing_Page_Testimonial_5": "ABP Framework sadece bir framework değil, aynı zamanda bir proje geliştirme/yönetme rehberi, çünkü DDD, GenericRepository, DI, Microservice ve Modularity eğitimleri veriyor. Framework'ün kendisini kullanmayacak olsanız bile, iyi ve profesyonelce hazırlanmış docs.abp.io ile kendinizi geliştirebilirsiniz (OpenIddict, Redis, Quartz vb.). Birçok şey önceden hazır olduğu için proje geliştirme süresini önemli ölçüde kısaltıyor (Giriş sayfası, istisna işleme, veri filtreleme, tohumlama, denetim günlüğü, yerelleştirme, otomatik API denetleyicisi vb.) Uygulamamızdan bir örnek olarak, stok kontrolü için Local Event Bus kullandım. Böylece stok işleyicisi yazarak sipariş hareketlerini yönetebiliyorum. CreationTime, CreatorId için zaman kaybetmemek harika. Bunlar otomatik olarak dolduruluyor.", + "Pricing_Page_Testimonial_6": "ABP Framework iyi bir çerçeve ancak kullandığı farklı katmanları, sınıfları ve kütüphaneleri (özellikle ABP) anlamak için zaman gerekiyor. Kod tabanını okumak için çok zaman harcadım, ancak ABP Commercial, proje özel varlıklarını (AR) ve her birine bağlı depoyu oluşturmak için bize zaman kazandırdı. ABP'de kullanılan yaklaşımın çok olgun olduğunu da beğendim, DDD ve monolith'e dayandığını biliyoruz.", "AbpBookDownloadArea_ClaimYourEBook": "Mastering ABP Framework E-Kitabınızı talep edin", "AddMemberModal_Warning_1": "Eklemeye çalıştığınız kullanıcı adı sistemde yoksa, lütfen ekip üyenizden {0} adresine kaydolmasını ve hesabının kullanıcı adını sizinle paylaşmasını isteyin.", "MyOrganizations_Detail_WelcomeMessage": "Organizasyonunuza hoş geldiniz, {0}", @@ -654,7 +654,7 @@ "UpgradePaymentInfoSection_LicenseUpgradeDescription": "Lisansınızı yükselterek, ek avantajlar elde etmenizi sağlayacak daha yüksek bir lisans türüne terfi edeceksiniz. Lisans türleri arasındaki farkları kontrol etmek için lisans karşılaştırma tablosuna bakın.", "Landing_Page_CustomerStories": "Müşteri Hikayeleri", "Landing_Page_OurGreatCustomers": "Büyük Müşterilerimiz", - "Landing_Page_WebApplicationFramework": "Web Uygulama Çerçevesi", + "Landing_Page_WebApplicationFramework": "Web Uygulama Çerçevesi", "Landing_Page_WebDevelopmentPlatform": "Web Geliştirme Platformu", "Landing_Page_CompleteWebDevelopmentPlatform": "Tam Web Geliştirme Platformu", "Landing_Page_TryFreeDemo": "Ücretsiz Demo Dene", @@ -721,7 +721,7 @@ "Landing_Page_DocsModuleDescription_9": "GitHub kaynağına ek olarak, dokümantasyon kaynağı olarak bir klasörün kullanılmasına izin verir.", "Landing_Page_FileManagementModuleDescription_1": "Dosyaları hiyerarşik bir klasör yapısı içinde yükleyin, indirin ve düzenleyin.", "Landing_Page_FileManagementModuleDescription_2": "Bu modül, dosyaları hiyerarşik bir klasör yapısında yüklemek, indirmek ve düzenlemek için kullanılır. Ayrıca çoklu kiracılığa uyumludur ve kiracılarınız için toplam boyut sınırını belirleyebilirsiniz.", - "Landing_Page_FileManagementModuleDescription_3": "Bu modül BLOB Depolama sistemine dayanmaktadır, bu nedenle dosya içeriklerini depolamak için farklı depolama sağlayıcıları kullanabilir.", + "Landing_Page_FileManagementModuleDescription_3": "Bu modül BLOB Depolama sistemine dayanmaktadır, bu nedenle dosya içeriklerini depolamak için farklı depolama sağlayıcıları kullanabilir.", "Landing_Page_IdentityModuleDescription_1": "Bu modül bir uygulamanın Kullanıcı ve Rol sistemini uygular;", "Landing_Page_IdentityModuleDescription_2": "Microsoft'un ASP.NET Core Identity kütüphanesi üzerine inşa edilmiştir.", "Landing_Page_IdentityModuleDescription_3": "Sistemdeki rolleri ve kullanıcıları yönetin. Bir kullanıcının birden çok role sahip olmasına izin verilir.", @@ -744,12 +744,67 @@ "ConfirmedEmailAddressRequiredToStartTrial": "Deneme lisansı başlatmak için onaylanmış bir e -posta adresiniz olmalı.", "EmailVerificationMailNotSent": "E-posta doğrulama postası gönderilemedi.", "GetConfirmationEmail": "Daha önce bir onay e-postası almadıysanız almak için buraya tıklayın.", - "WhichLicenseTypeYouAreInterestedIn": "Hangi lisans türüyle ilgileniyorsunuz?", + "WhichLicenseTypeYouAreInterestedIn": "Hangi lisans türüyle ilgileniyorsunuz?", "BlackFridayDiscount": "Kara Cuma İndirimi", "EulaPageTitle": "Son Kullanıcı Lisans Sözleşmesi (EULA)", "PrivacyPolicyPageTitle": "Gizlilik Politikası - Çerez Politikası", "TermsConditionsPageTitle": "Şartlar ve Koşullar", "TrainingsPageTitle": "ABP Eğitim Paketleri", - "ModulesPageTitle": "ABP Önceden Oluşturulmuş Uygulama Modülleri" + "ModulesPageTitle": "ABP Hazır Uygulama Modülleri", + "Testimonial_ShortDescription_1": "ABP'nin modülerliği, ekibin zamanında teslimat yapmasını mümkün kıldı.", + "Testimonial_ShortDescription_2": "Yeni özellikleri eskisinden daha hızlı oluşturun.", + "Testimonial_ShortDescription_3": "Kullanıma hazır özelliklerden başlıyoruz ve sadece yazmamız gerekenlere odaklanıyoruz.", + "Testimonial_ShortDescription_4": "ABP Commercial ihtiyaçlarımız için en uygun olanıydı.", + "DontTakeOurWordForIt": "Bizim sözümüze güvenmeyin...", + "ReadAbpCommercialUsersWantYouToKnow": "ABP Commercial kullanıcılarının bilmenizi istediklerini okuyun.", + "OnlineReviewersOnAbpCommercial": "ABP Commercial Hakkında Çevrimiçi Yorumlar", + "SeeWhatToldAboutAbpCommercial": "ABP Commercial hakkında neler söylendiğini görün ve isterseniz düşüncelerinizi yazın.", + "YouDeserveGoodUXUI": "İyi bir kullanıcı arayüzünü ve daha iyi bir kullanıcı deneyimini hak ediyorsunuz. ABP'nin LeptonX Teması size hizmet etmek için burada.", + "ViewLiveDemo": "Canlı Tema Demosunu Görüntüle", + "LeptonXThemeForDashboard": "Yönetici Kontrol Paneliniz için LeptonX Teması", + "GetLeptonX": "LeptonX'i Şimdi Alın", + "SimplifiedMenu": "Basitleştirilmiş menü", + "SimplifiedMenuDescription": "Menüyü filtreleyerek aradığınız sayfayı kolayca bulabilirsiniz", + "YourFavoritePages": "Favori sayfalarınız elinizin altında", + "YourFavoritePagesDescription": "Sayfanın sağ üst köşesindeki yıldız simgesine tıklayarak sayfayı kolayca favorilere ekleyin veya favorilerden kaldırın.", + "BreadCrumbs": "Kesintisiz geçiş için Breadcrumb", + "BreadCrumbsDescription": "Breadcrumb'ı kullanarak, sol menü kapalıyken bile tek tıklamayla aynı seviyedeki sayfalara geçebilirsiniz, üstelik tablet ve mobil uyumlu çalışır!", + "YourMenu": "Menünüz dilediğiniz gibi", + "YourMenuDescription": "Kullanıcı menüsündeki doğrudan tıklanabilir simgeleri ve açılır kutuları istediğiniz gibi özelleştirin. Kullanıcı menüsü ihtiyaçlarınıza göre tamamen özelleştirilebilir", + "RtlSupport": "Diliniz için RTL desteği", + "RtlSupportDescription": "LeptonX Teması, diliniz için RTL'yi destekler. Dili değiştirmeniz için dil seçenekleri ayarlar menüsündedir.", + "YourColors": "Yönetici kontrol paneli kullanıcı arayüzünüzdeki renkleriniz", + "YourColorsDescription": "LeptonX Tema, sistem tercihlerinize göre çalışır ve gösterge paneli açık tema, gösterge paneli koyu tema ve gösterge paneli yarı koyu tema seçeneklerine sahiptir.", + "ArrangeContentWidth": "İçerik genişliğinizi kolayca düzenleyin", + "ArrangeContentWidthDescription": "İçerik alanınızın genişliğini kolayca değiştirin.", + "LeptonXCompatibleWith": "LeptonX Teması aşağıdakilerle uyumludur", + "MobileResponsiveTemplate": "Mobil Uyumlu Şablon", + "MobileResponsiveTemplateDescription1": "LeptonX yönetici kontrol panelinize istediğiniz cihazdan erişin.", + "MobileResponsiveTemplateDescription2": "Her cihazınızda rahatlıkla kullanabilmeniz için tasarlanmıştır. Mobil cihazlara ve tablet boyutlarına duyarlıdır.", + "TopMenuLayoutOption": "Üst Menü Düzeni Seçeneği", + "TopMenuLayoutOptionDescription1": "Web sitenizi aynı yönetici kontrol paneliyle kurmak istiyorsanız, LeptonX Teması ile bunu yapmanız mümkün!", + "TopMenuLayoutOptionDescription2": "Bunu gerçekleştirmek için LeptonX üst menü düzenini deneyin!", + "EasilyCustomizable": "Marka renkleriniz için kolayca özelleştirilebilir", + "EasilyCustomizableDescription1": "LeptonX temasını sadece birkaç SCSS değişkeni kullanarak özelleştirebilirsiniz. Geçersiz kılma yok, ekstra CSS yükü yok!", + "EasilyCustomizableDescription2": "LeptonX ile yönetici panelinizi istediğiniz gibi düzenleyebilirsiniz.", + "IndependentLayout": "Bağımsız düzen ve içerik alanı", + "IndependentLayoutDescription1": "LeptonX'in yerleşim altyapısı içerikten tamamen ayrı olarak tasarlandı.", + "IndependentLayoutDescription2": "Bu, isterseniz projenizi Bootstrap dışında bir içerik yapısı ile özgürce tasarlayabileceğiniz anlamına gelir.", + "MostUsedLibraries": "LeptonX ile entegre edilmiş en çok kullanılan kütüphaneler", + "MostUsedLibrariesDescription1": "LeptonX en çok kullandığınız kütüphaneleri içerir. ApexCharts, DataTables, DropZone, FullCalender, JSTree, Select2, Toastr gibi kütüphaneleri zahmetsizce kullanmanızı sağlar.", + "MostUsedLibrariesDescription2": "LeptonX ayrıca MVC Angular ve Blazor'a özgü kütüphaneleri de destekler.", + "CreateAndCustomize": "LeptonX özel sayfaları ile ihtiyacınız olan sayfaları saniyeler içinde oluşturun ve özelleştirin", + "CreateAndCustomizeDescription": "LeptonX Temasını kullanarak önceden hazırlanmış birçok html sayfasına da erişebilirsiniz. Bunlar arasında giriş sayfası, blog, SSS, abonelik listesi, fatura, fiyatlandırma, dosya yönetimi gibi birçok sayfa bulunmaktadır.", + "LeptonThemeForAdmin": "Yönetici kontrol paneliniz için Lepton Teması", + "LeptonThemeForAdminDescription": "Lepton Teması hala kullanılabilir durumdadır ve bakımı yapılacaktır. Bir Lepton Teması kullanıcısı olarak LeptonX Temasına geçmek istiyorsanız, nasıl yapılacağını öğrenmek için belgelere bakabilirsiniz.", + "LeptonCompatibleWith": "Lepton Teması aşağıdakilerle uyumludur", + "SeeLeptonDocumentation": "Lepton Dokümantasyonuna Bakın", + "GetLepton": "Lepton'u Şimdi Alın", + "WhyUseAbpIoPlatform": "Sıfırdan yeni bir çözüm oluşturmak yerine neden ABP.IO Platformunu kullanmalıyım?", + "WhyUseAbpIoPlatformFaqExplanation": "ABP.IO Platformunu kullanmanın her şeyi kendiniz yapmaya göre neden önemli bir avantaja sahip olduğuna dair ayrıntılı bir açıklama için bu belgeye bakın.", + "SupportPolicyFaqTitle": "Destek politikanız nedir?", + "SupportPolicyFaqExplanation": "Yalnızca etkin ve önceki ana sürümü destekliyoruz. Üçüncü ve daha eski ana sürümler için bir yama sürümünü garanti etmiyoruz. Örneğin, etkin sürüm 7.0.0 ise, hem 6.x.x hem de 7.x.x için yama sürümleri yayınlayacağız. Ayrıca, yalnızca ABP Framework ve ABP Commercial ile ilgili sorunlar için destek sağlıyoruz. Bu, ABP ürünleri tarafından kullanılan 3. taraf uygulamalar, bulut hizmetleri ve diğer çevresel kütüphaneler için destek verilmediği anlamına gelir. Müşterilerimize \"Volosoft Bilişim A.Ş\"nin resmi çalışma saatleri içinde teknik destek sağlamak için ticari olarak makul çabayı göstereceğiz. Öte yandan, bir hizmet seviyesi anlaşması (SLA) yanıt süresi taahhüt etmiyoruz, ancak teknik sorunlara resmi çalışma saatlerimiz içinde mümkün olduğunca çabuk yanıt vermeye çalışacağız. Müşteri ile özel bir anlaşma yapılmadığı sürece, yalnızca https://support.abp.io adresinden destek sağlıyoruz. Ayrıca, yalnızca Kurumsal Lisans sahiplerinin kullanabildiği özel e-posta desteğimiz de bulunmaktadır.", + "BlazoriseLicense": "Blazorise lisansı satın almamız gerekiyor mu?", + "BlazoriseLicenseExplanation": "Volosoft ve Megabit arasında bir anlaşmamız var, bu anlaşma ile Blazorise lisansı ABP Ticari ürünleri ile birlikte geliyor, bu nedenle müşterilerimizin ekstra bir Blazorise lisansı satın almasına gerek kalmıyor." } -} +} \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json index 4d0666772a..e5ed696808 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/vi.json @@ -190,7 +190,7 @@ "ChangingDevelopers": "Tôi có thể thay đổi các nhà phát triển đã đăng ký của tổ chức của mình trong tương lai không?", "ChangingDevelopersExplanation": "Ngoài việc thêm các nhà phát triển mới vào giấy phép của mình, bạn cũng có thể thay đổi các nhà phát triển hiện có (bạn có thể xóa một nhà phát triển và thêm một nhà phát triển mới vào cùng một chỗ ngồi) mà không phải trả thêm bất kỳ chi phí nào.", "WhenShouldIRenewMyLicense": "Khi nào tôi nên gia hạn giấy phép của mình?", - "WhenShouldIRenewMyLicenseExplanation": "Nếu bạn gia hạn giấy phép của mình trong vòng 1 tháng sau khi giấy phép của bạn hết hạn, các chiết khấu sau sẽ được áp dụng: Giảm giá {0}% cho Giấy phép Nhóm, Giảm giá {1}% Giấy phép Kinh doanh, Giảm giá {2}% Giấy phép Doanh nghiệp . Nếu bạn gia hạn giấy phép 1 tháng sau ngày giấy phép hết hạn, giá gia hạn sẽ giống như giá mua giấy phép và sẽ không có chiết khấu khi gia hạn của bạn.", + "WhenShouldIRenewMyLicenseExplanation": "Nếu bạn gia hạn giấy phép của mình trong vòng {3} ngày sau khi giấy phép của bạn hết hạn, các chiết khấu sau sẽ được áp dụng: Giảm giá {0}% cho Giấy phép Nhóm, Giảm giá {1}% Giấy phép Kinh doanh, Giảm giá {2}% Giấy phép Doanh nghiệp . Nếu bạn gia hạn giấy phép {3} ngày sau ngày giấy phép hết hạn, giá gia hạn sẽ giống như giá mua giấy phép và sẽ không có chiết khấu khi gia hạn của bạn.", "TrialPlan": "Bạn có kế hoạch dùng thử không?", "DoYouAcceptBankWireTransfer": "Bạn có chấp nhận chuyển khoản ngân hàng không?", "DoYouAcceptBankWireTransferExplanation": "Có, chúng tôi chấp nhận chuyển khoản ngân hàng.
Sau khi gửi phí cấp phép qua chuyển khoản ngân hàng, hãy gửi email cho chúng tôi theo địa chỉ accounting@abp.io biên lai của bạn và loại giấy phép được yêu cầu. Thông tin tài khoản ngân hàng quốc tế của chúng tôi:", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json index a3a3e20b34..d78d8469f8 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hans.json @@ -202,13 +202,13 @@ "WhatHappensWhenLicenseEndsExplanation4": "你不能在你的许可证到期后安装ABP商业平台上添加的新模块和主题。", "WhatHappensWhenLicenseEndsExplanation5": "你不能使用ABP Suite。", "WhatHappensWhenLicenseEndsExplanation6": "你不能再获得高级支持。", - "WhatHappensWhenLicenseEndsExplanation7": "如果您想继续获得这些好处,您可以延长(续订)您的许可证。 如果您在许可证到期后 1 个月内延长许可证,将应用以下折扣:团队许可证 {0}; 营业执照{1}; 企业许可证 {2}。", + "WhatHappensWhenLicenseEndsExplanation7": "如果您想继续获得这些好处,您可以延长(续订)您的许可证。 如果您在许可证到期后 {3} 天内延长许可证,将应用以下折扣:团队许可证 {0}; 营业执照{1}; 企业许可证 {2}。", "discountForYears": "{0}% 折扣 {1} 年", "WhatHappensWhenLicenseEndsExplanation8": "您生成的 ABP 项目未存储在我们的服务器上。 因此,您有责任保留下载的源代码。 当您的许可证到期时,将无法获取您生成的 ABP 项目源代码。", "WhenShouldIRenewMyLicense": "我什么时候应该续订我的许可?", - "WhenShouldIRenewMyLicenseExplanation": "如果您在许可证到期后 1 个月 内续订许可证,将适用以下折扣:团队许可证 {0}; 营业执照{1}; 企业许可证 {2}。 但是,如果您在许可证到期后 1 个月 后续订许可证,则续订价格将与许可证购买价格相同,并且您的续订不会有任何折扣。", + "WhenShouldIRenewMyLicenseExplanation": "如果您在许可证到期后 {3} 天 内续订许可证,将适用以下折扣:团队许可证 {0}; 营业执照{1}; 企业许可证 {2}。 但是,如果您在许可证到期后 {3} 天 后续订许可证,则续订价格将与许可证购买价格相同,并且您的续订不会有任何折扣。", "TrialPlan": "你们有试用计划吗?", - "TrialPlanExplanation": "ABP商业团队许可证有14天的试用期。若要了解更多信息,请访问这里。此外,我们为团队许可证提供30天的金额返还保证。你只需要在30天内请求退款。商业和企业许可证将提供60%的金额返还保证。这是因为商业和企业许可证包含了所有模块和主题的全部源代码。", + "TrialPlanExplanation": "不,ABP商业版没有试用版。您可以通过查看社区版了解代码质量和方法。我们还为团队许可证提供30天无条件退款保证!您可以在前30天内申请退款。对于商业和企业许可证,我们在30天内提供60%的退款。这是因为商业和企业许可证包含所有模块和主题的完整源代码。", "DoYouAcceptBankWireTransfer": "你们接受银行电汇吗?", "DoYouAcceptBankWireTransferExplanation": "是的,我们接受银行电汇。
在通过银行转账发送许可费后,将您的收据和所需的许可类型通过电子邮件发送至accounting@abp.io。 我们的国际银行账户信息:", "HowToUpgrade": "可用新版本时如何升级现有应用程序?", @@ -537,6 +537,7 @@ "Pricing_Page_Testimonial_3": "我们大爱 ABP。 我们不必从头开始编写所有内容。 我们从\"开箱即用\"的功能开始,只需关注我们真正需要编写的内容。 此外,ABP 架构良好,代码质量高,错误少。 如果我们需要自己来编写所需的一切,我们可能需要花费数年时间。 另一点让我们喜欢的是新版本、问题修复或改进每隔一周很快地就会出现。 我们不会等太久。", "Pricing_Page_Testimonial_4": "ABP 商业版 是一款很值得推荐的出色产品。 是在一个可配置的平台上为我们的客户推向市场的商业产品。 其框架和工具为任何团队提供的快速启动值得每一分钱。 ABP 商业版 最适合我们的需求。", "Pricing_Page_Testimonial_5": "ABP Framework 不仅是一个框架,它还是项目开发/管理的指南,因为它提供了 DDD、GenericRepository、DI、微服务和模块化培训。 即使你不打算使用框架本身,你也可以通过 docs.abp.io 进行自己的开发,该文档已经做好了专业的准备(OpenIddict、Redis、Quartz 等)。 因为很多东西都是预先构建的,它大大缩短了项目开发时间(例如登录页面、异常处理、数据过滤、种子、审计日志、本地化、自动 API 控制器等)。 作为我们应用程序的一个示例,我使用本地事件总线进行库存控制。 因此我可以通过编写库存处理程序来管理订单移动。 不为 CreationTime,CreatorId 浪费时间真是太好了。 它们正在自动填充。", + "Pricing_Page_Testimonial_6": "ABP Framework 是一个很好的框架,但它需要时间来理解它使用的不同层、类和库(特别是 ABP)。 我花了很多时间阅读代码库,但是 ABP Commercial 为我们节省了创建项目专业实体 (AR) 和链接到每个实体的存储库的时间。 我也喜欢 ABP 中使用的方法非常成熟,我们知道它基于 DDD 和单体。", "AbpBookDownloadArea_ClaimYourEBook": "领取您的掌握ABP框架电子书", "AddMemberModal_Warning_1": "如果您尝试添加的用户名在系统中不存在,请让您的团队成员在 {0} 并与您分享他/她帐户的用户名。", "MyOrganizations_Detail_WelcomeMessage": "欢迎加入您的组织,{0}", @@ -815,7 +816,7 @@ "Other": "其他", "WhereDidYouHearAboutUs_explain": "请说明...", "DeletingMemberWarningMessage": "\"{0}\"将从开发者列表中删除。如果您愿意,您可以将此空位分配给另一个开发者。", - "AdditionalInfo": "如果开发者席位高于您的要求,您可以减少它们。您可以发送电子邮件至info@abp.io以删除一些开发人员席位。清理未使用的开发人员席位将降低许可证续期成本。如果您愿意,您可以在有效许可期内重新购买额外的开发人员席位。请注意,由于此许可证包中有{0}个开发人员,因此无法减少此数量。", + "AdditionalInfo": "如果开发人员席位超出您的要求,您可以减少它们。 您可以发送电子邮件至 info@abp.io 以删除您的一些开发人员席位。 清除未使用的开发人员席位将降低许可证续订成本。 如果需要,您可以在有效许可期限内重新购买额外的开发人员席位。 请注意,由于此许可证中有 {0} 个开发人员,因此您无法减少此数量。", "LinkExpiredErrorMessage": "您正在尝试访问的链接已过期。", "ExpirationDate": "过期时间", "SpringCampaignDiscount": "春季促销折扣", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json index 8a478286ca..19afb1a5bb 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/zh-Hant.json @@ -192,7 +192,7 @@ "ChangingDevelopers": "我將來可以更改我組織的註冊開發人員嗎?", "ChangingDevelopersExplanation": "除了將新的開發人員添加到你的許可中之外,你還可以更改現有的開發人員(可以刪除一個開發人員並將新的開發人員添加到同一位置),而無需任何額外費用.", "WhenShouldIRenewMyLicense": "我什麽時候應該續訂我的許可?", - "WhenShouldIRenewMyLicenseExplanation": "如果您在許可證到期後 1 個月內續訂許可證,將享受以下折扣:團隊許可證 {0} ; 商業許可證 {1} ;企業許可證 {2}. 如果您在許可證到期後 1 個月續訂許可證,續訂價格將與許可證購買價格相同,並且續訂不會有折扣。", + "WhenShouldIRenewMyLicenseExplanation": "如果您在許可證到期後 {3} 天內續訂許可證,將享受以下折扣:團隊許可證 {0} ; 商業許可證 {1} ;企業許可證 {2}. 如果您在許可證到期後 {3} 天續訂許可證,續訂價格將與許可證購買價格相同,並且續訂不會有折扣。", "TrialPlan": "你們有試用計劃嗎?", "DoYouAcceptBankWireTransfer": "你們接受銀行電匯嗎?", "DoYouAcceptBankWireTransferExplanation": "是的,我們接受銀行電匯。
在通過銀行轉賬發送許可費後,將您的收據和所需的許可類型通過電子郵件發送至accounting@abp.io。 我們的國際銀行賬戶信息:", @@ -402,6 +402,6 @@ "WhatHappensWhenLicenseEndsExplanation4": "許可證到期後,您將無法安裝添加到 ABP 商業平台的新模塊和主題。", "WhatHappensWhenLicenseEndsExplanation5": "您不能使用 ABP 套件。", "WhatHappensWhenLicenseEndsExplanation6": "您無法再獲得高級支持。", - "WhatHappensWhenLicenseEndsExplanation7": "如果您想繼續獲得這些好處,您可以延長(更新)您的許可證。如果您在許可到期後 1 個月 內延長許可,將應用以下折扣:團隊許可 {0};營業執照{1};企業許可證{2}。" + "WhatHappensWhenLicenseEndsExplanation7": "如果您想繼續獲得這些好處,您可以延長(更新)您的許可證。如果您在許可到期後 {3} 天 內延長許可,將應用以下折扣:團隊許可 {0};營業執照{1};企業許可證{2}。" } -} +} \ No newline at end of file diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json index 81c659c500..2d52d01ed2 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Community/Localization/Resources/tr.json @@ -93,7 +93,6 @@ "NoThanks": "Hayır teşekkürler", "MaybeLater": "Belki sonra", "JoinOurPostNewsletter": "Makale bültenimize katılın", - "Community": "Toplum", "Marketing": "Pazarlama", "CommunityPrivacyPolicyConfirmation": "Şartlar ve Koşullar ile Gizlilik Politikası'nı kabul ediyorum.", "PostRequestMessageTitle": "Bu web sitesinde görmek istediğiniz bir makaleyi/eğiticiyi istemek için GitHub'da bir sorun açın.", @@ -143,7 +142,6 @@ "Volo.AbpIo.Domain:060002": "Makale İçeriği Github(\"{PostUrl}\") kaynağında mevcut değil.", "Volo.AbpIo.Domain:060003": "Makale içeriği bulunamadı!", "MemberNotPublishedPostYet": "Bu üye henüz bir gönderi yayınlamadı.", - "WelcomeToABP": "ABP'ye Hoşgeldiniz", "Browse": "Göz at", "ArticleRequestsDescription": "Burada belirli bir içerik mi görmek istiyorsunuz? Topluluktan bunu oluşturmasını isteyebilirsiniz!", "LatestContentRequests": "Son İçerik Talepleri", diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json index 6834f5da0d..dcc04e9f79 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/tr.json @@ -1,7 +1,7 @@ { "culture": "tr", "texts": { - "GetStarted": "Başlamak - Başlangıç Templateleri", + "GetStarted": "Başlangıç Şablonları", "Create": "Oluştur", "NewProject": "Yeni Proje", "DirectDownload": "Doğrudan İndir", @@ -82,7 +82,7 @@ "CLI_CommandLineInterface": "CLI (Command Line Interface)", "CLI_CommandLineInterfaceExplanation": "CLI yeni proje oluşturma ve uygulamanıza modüller ekleme işlemlerini otomatik hale getirir.", "StartupTemplates": "Başlangıç Templateler", - "StartupTemplatesExplanation": "Çeşitli başlangıç templateleri size geliştirme başlatmak için tam yapılandırılmış bir çözüm sağlar.", + "StartupTemplatesExplanation": "Çeşitli başlangıç şablonları size geliştirme başlatmak için tam yapılandırılmış bir çözüm sağlar.", "BasedOnFamiliarTools": "Bilinen Araçlara Dayalı ", "BasedOnFamiliarToolsExplanation": "Zaten bildiğiniz popüler araçlar ile geliştirilme ve egtegre edilmiştir. Düşük öğrenme eğrisi, koaly adaptasyon, rahat geliştirme.", "ORMIndependent": "ORM Bağımsız", @@ -139,8 +139,8 @@ "AggregateRootEntity": "Aggregate Root, Entity", "AutoRESTAPIsExplanation": "ABP, application servislerinizi otomatik olarak API Controller olarak kurallı bir şekilde yapılandırabilir.", "DynamicClientProxiesExplanation": "Apilerinizi, JavaScript ve C# clients tarafından kolaylıkla kullanın.", - "DistributedEventBusWithRabbitMQIntegrationExplanation": "Easily publish & consume distributed events using built-in Distributed Event Bus with RabbitMQ integration available.", - "TestInfrastructureExplanation": "The framework has been developed unit & integration testing in mind. Provides you base classes to make it easier. Startup templates come with pre-configured for testing.", + "DistributedEventBusWithRabbitMQIntegrationExplanation": "RabbitMQ entegrasyonu ile yerleşik Dağıtılmış Event Bus kullanarak dağıtılmış olayları kolayca yayınlayın ve tüketin.", + "TestInfrastructureExplanation": "Çerçeve, birim ve entegrasyon testleri göz önünde bulundurularak geliştirilmiştir. İşinizi kolaylaştırmak için size temel sınıflar sağlar. Başlangıç şablonları test için önceden yapılandırılmış olarak gelir.", "AuditLoggingEntityHistoriesExplanation": "İş açısından kritik uygulamalar için yerleşik denetim günlüğü. Özellik düzeyinde ayrıntılarla istek, hizmet, yöntem düzeyinde denetim günlüğü ve varlık geçmişleri.", "EmailSMSAbstractionsWithTemplatingSupportExplanation": "IEmailSender ve ISmsSender soyutlamaları, uygulama mantığınızı altyapıdan ayırır. Gelişmiş e-posta şablon sistemi, e-posta şablonları oluşturmanıza ve yerelleştirmenize ve gerektiğinde kolayca kullanmanıza olanak tanır.", "LocalizationExplanation": "Yerelleştirme sistemi, düz JSON dosyalarında kaynaklar oluşturmanıza ve bunları UI'nizi yerelleştirmek için kullanmanıza olanak tanır. AspNet Core'un yerelleştirme sistemi ile tam uyumlu iken kalıtım, uzantılar ve JavaScript entegrasyonu gibi gelişmiş senaryoları destekler.", @@ -163,7 +163,7 @@ "Strong": "Güçlü", "Complete": "Tamamlayınız", "BasedLayeringModel": "Tabanlı Katmanlama Modeli", - "Microservice": "mikro hizmet", + "Microservice": "Mikroservis", "Compatible": "Uyumlu", "MeeTTheABPCommunityInfo": "Misyonumuz, geliştiricilerin makaleler, öğreticiler, vaka çalışmaları vb. ile birbirlerine yardımcı olabilecekleri ve benzer düşünen insanlarla tanışabilecekleri bir ortam yaratmaktır.", "JoinTheABPCommunityInfo": "Canlı bir topluluğa katılın ve ABP Çerçevesine katkıda bulunun!", @@ -178,7 +178,7 @@ "ProgressiveWebApplication": "Progresif Web Uygulaması", "UseslatestPreVersion": "En son yayın öncesi sürümünü kullanır", "ReadTheDocumentation": "Belgeleri okuyun", - "Documentation": "belgeler", + "Documentation": "Dökümanlar", "GettingStartedTutorial": "Başlarken Eğitimi", "ApplicationDevelopmentTutorial": "Uygulama Geliştirme Eğitimi", "TheStartupTemplate": "Başlangıç Şablonu", @@ -285,7 +285,6 @@ "Database": "Veritabanı", "Saas": "Saas", "OpenSourceWebApp": " Açık kaynak
web uygulaması", - "Framework": "Çerçeve", "AuditLoggingExplanation": "Sisteminizdeki tüm işlemleri ve veri değişikliklerini otomatik olarak izleyin.", "AbpNewCommandExplanation": "ABP başlangıç şablonlarını kullanarak yeni çözümler oluşturur.", "AbpAddModuleCommandExplanation": "Çözümünüze önceden oluşturulmuş uygulama modülleri yükler", @@ -300,10 +299,8 @@ "Preview": "Önizleme", "CreateANewSolution": "Yeni bir çözüm oluşturun", "ABPFrameworkFeatures": "ABP Çerçevesi Özellikleri", - "Commercial": "Ticari", "ThirdPartyTools": "Üçüncü taraf araçlar", "Back": "Geri", - "Community": "Topluluk", "SeeMore": "Daha fazla göster", "DetailsOfTheEBook": "E-kitap detayları", "JoinOurMarketingNewsletter": "Pazarlama bültenimize katılın", @@ -377,7 +374,18 @@ "CreateSolutionFolder": "Çözüm Klasörü Oluşturun", "CreateSolutionFolderOption": "Projenin çıktı klasöründe yeni bir klasörde mi yoksa doğrudan çıktı klasöründe mi olacağını belirtir.", "SelectUITheme": "UI Temasını Seçin", - "BooksPageTitle": "ABP Kitapları" - + "BooksPageTitle": "ABP Kitapları", + "InstallAbpCliMessage": "Daha önce yüklemediyseniz, ABP CLI'yi bir komut satırı terminaline yükleyin:", + "RunTheFollowingCommand": "Aşağıdaki komutu bir komut satırı terminalinde çalıştırın:", + "ChangeSolutionOptionsBelow": "Aşağıdaki çözüm seçeneklerini değiştirebilirsiniz.", + "MultiLayerApplicationExplanation1": "Domain Driven Design uygulamalarına dayalı olarak tamamen katmanlı bir çözüm oluşturur.", + "MultiLayerApplicationExplanation2": "Sürdürülebilir ve genişletilebilir bir kod tabanına ihtiyaç duyan uzun vadeli projeler için önerilir.", + "SingleLayerApplicationExplanation1": "Tek katmanlı bir web uygulaması oluşturur.", + "SingleLayerApplicationExplanation2": "Daha basit ve anlaşılması kolay bir mimariye sahip bir uygulama oluşturmak için önerilir.", + "ApplicationModuleExplanation1": "Yeniden kullanılabilir, tamamen katmanlı bir uygulama modülü çözümü oluşturur.", + "ApplicationModuleExplanation2": "Modüler uygulamanız için modüller oluşturmak üzere bu seçeneği kullanabilirsiniz.", + "LeptonXLiteThemeInfo": " Modern ve şık bir Bootstrap UI teması. Üretime hazır bir UI temasına sahip olmak istiyorsanız idealdir. Bu en yeni temadır ve varsayılandır.", + "BasicThemeInfo": "Sade Bootstrap renkleri ve stilleri ile minimalist UI teması. Kendi UI temanızı oluşturacaksanız idealdir.", + "Details": "Detaylar" } } \ No newline at end of file diff --git a/build/build-all-release.ps1 b/build/build-all-release.ps1 index f54912d4f5..31aed989cd 100644 --- a/build/build-all-release.ps1 +++ b/build/build-all-release.ps1 @@ -5,7 +5,7 @@ foreach ($solutionPath in $solutionPaths) { $solutionAbsPath = (Join-Path $rootFolder $solutionPath) Set-Location $solutionAbsPath - dotnet build --configuration Release + dotnet build --configuration Release -- /maxcpucount if (-Not $?) { Write-Host ("Build failed for the solution: " + $solutionPath) Set-Location $rootFolder diff --git a/build/common.ps1 b/build/common.ps1 index 61d9cf03d2..85f18edb21 100644 --- a/build/common.ps1 +++ b/build/common.ps1 @@ -36,7 +36,8 @@ if ($full -eq "-f") "../templates/console", "../templates/wpf", "../templates/app-nolayers/aspnet-core", - "../abp_io/AbpIoLocalization" + "../abp_io/AbpIoLocalization", + "../source-code" ) }else{ Write-host "" diff --git a/delete-bin-obj.ps1 b/delete-bin-obj.ps1 new file mode 100644 index 0000000000..e26ba4fdce --- /dev/null +++ b/delete-bin-obj.ps1 @@ -0,0 +1,15 @@ +Clear-Host + +Write-Host "Deleting all BIN and OBJ folders..." -ForegroundColor Cyan + +Get-ChildItem -Path . -Include bin,obj -Recurse -Directory | ForEach-Object { + if ($_.FullName -notmatch "\\node_modules\\") { + Write-Host "Deleting:" $_.FullName -ForegroundColor Yellow + Remove-Item $_.FullName -Recurse -Force + } else { + Write-Host "Skipping:" $_.FullName -ForegroundColor Magenta + } +} + +Write-Host "BIN and OBJ folders have been successfully deleted." -ForegroundColor Green + diff --git a/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/abp-essential-features.png b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/abp-essential-features.png new file mode 100644 index 0000000000..287d130cb8 Binary files /dev/null and b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/abp-essential-features.png differ diff --git a/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/abp-try-now.png b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/abp-try-now.png new file mode 100644 index 0000000000..c3a5ffdaec Binary files /dev/null and b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/abp-try-now.png differ diff --git a/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/cover.png b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/cover.png new file mode 100644 index 0000000000..b2a7aa8595 Binary files /dev/null and b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/cover.png differ diff --git a/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/cross-platform.png b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/cross-platform.png new file mode 100644 index 0000000000..5889357a42 Binary files /dev/null and b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/cross-platform.png differ diff --git a/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/ddd-book.png b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/ddd-book.png new file mode 100644 index 0000000000..b18c3b716a Binary files /dev/null and b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/ddd-book.png differ diff --git a/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/developer-focused.png b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/developer-focused.png new file mode 100644 index 0000000000..bfb0f15d28 Binary files /dev/null and b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/developer-focused.png differ diff --git a/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/features.png b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/features.png new file mode 100644 index 0000000000..7c941289e2 Binary files /dev/null and b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/features.png differ diff --git a/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/key-features.png b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/key-features.png new file mode 100644 index 0000000000..4c4b714694 Binary files /dev/null and b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/key-features.png differ diff --git a/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/module-layers-and-packages.png b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/module-layers-and-packages.png new file mode 100644 index 0000000000..50d8d09f9b Binary files /dev/null and b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/module-layers-and-packages.png differ diff --git a/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/open-source.png b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/open-source.png new file mode 100644 index 0000000000..e389e67146 Binary files /dev/null and b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/images/open-source.png differ diff --git a/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/post.md b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/post.md new file mode 100644 index 0000000000..8c6bef4b8a --- /dev/null +++ b/docs/en/Blog-Posts/2023-04-07_Ultimate_NET_Framework_ABP/post.md @@ -0,0 +1,85 @@ +Building robust web applications has become more important than ever as the world is becoming more web-focused. With the rise of new tools and frameworks, choosing the right web development framework can be challenging. Especially if you are a .NET developer, there not so many popular ASPNET Framework around. However, the ABP Framework has become popular for many developers due to its flexibility, scalability, feature set and performance. Let's mention what's ABP Framework and what it promises to .NET developers. + +## ASP.NET Core Architecture Best Practices + +![ABP Key Features](images/key-features.png) + +ABP Framework is an application design framework that provides developers with a powerful set of tools to build web applications quickly and efficiently. It is an open-source, cross-platform framework supporting monolithic and microservices architectures. ABP Framework is built on top of the ASP.NET Core architecture and incorporates best practices for developing web applications. + +## ASP.NET Platform + +The framework includes a wide range of features, such as an angular code generator with the help of [ABP Suite](https://commercial.abp.io/tools/suite), project templates, and web application themes. These features enable developers to create web applications that are both functional and visually appealing without spending much time on coding. Moreover, ABP Framework provides a common application framework that can be used for different applications, including SAAS, e-commerce, and social media platforms. + +ABP Framework also supports the domain-driven design, which means that the framework is designed to be flexible and adaptable to different business requirements. This approach allows developers to build applications aligned with business needs, ensuring that they are efficient and effective. + +## Open Source Dot Net Framework + +One of the major advantages of ABP Framework is its open-source nature. Many developers continuously improve and update the framework, making it more reliable and secure. Moreover, the ABP Framework is compatible with multiple .NET frameworks, including ASP.NET and .NET Core. When starting your project on top of a solid Microsoft web framework, the ABP Framework is one of the best choices. + +![ABP is cross platform](images\cross-platform.png) + +Another advantage of ABP Framework is that it provides rapid web application development tools that are easy to use. The framework includes project templates that developers can use as a starting point for their web applications, which can significantly reduce the development time. ABP Framework also provides a web app builder that developers can use to create web applications quickly and efficiently. + +## ASPNET Core Architecture + +ABP Framework is also compatible with Microsoft's Clean Architecture, a software design pattern that promotes separation of concerns and maintainability. This integration ensures that the applications developed using ABP Framework are well-structured, easy to maintain, and scalable. Many application marketplace reviewers commented about ABP as the best web application framework. While ABP supports multiple UI choices like MVC, Angular, Blazor Web Assembly and Blazor Server, the most downloaded one is MVC microservice architecture. If you are here to find a NET application framework for your next NET Core application, you are in the right place! + +![ABP Framework Project Hierarchy](images/module-layers-and-packages.png) + +Clean Architecture is a design pattern that emphasizes the separation of concerns, ensuring that the code is organized in independent layers. This helps developers to write code that is easy to maintain, test and refactor. ABP Framework uses this pattern to structure its application code and ensure that it is easy to manage. + +## Open Source Web Framework + +ABP Framework is an open-source web framework that is free to use and distribute. The framework is licensed under the MIT license, meaning developers can use it for commercial and non-commercial purposes without any restrictions. + +ABP Framework provides different templates, which are ASPNET Core web app compatible with various platforms, including Windows, Linux, and macOS. + +## Domain Driven Design DotNet + +The ABP Framework also implements Domain-Driven Design (DDD), a software design methodology that emphasizes the importance of the domain model. The framework provides a guide for implementing DDD through an implementing domain-driven design. It helps developers to create a domain model that is easy to understand, test, and maintain. As ABP is a C# framework, it supports most of the common application framework features for a core framework. + +![ABP Framework - Domain Driven Design e-book](images/ddd-book.png) + +There is also a free PDF e-book for Dotnet developers that explains the Domain Driven Design principle with real-world examples. You can download this e-book at https://abp.io/books/implementing-domain-driven-design + +## It's a Dotnet Web Framework + +ABP Framework is a dotnet web framework that is designed with C# and provides developers with a set of tools that makes it easy to build modern web applications. Whether you want to start a new dotnet monolithic solution or dotnet microservice solution, you can start with ABP. Creating your own dotnet framework architecture may be hard if you don't have many years of experience. The brain team of the ABP Framework specializes in ASP.NET framework architecture and ASP.NET application frameworks. + +![Developer Focused](images/developer-focused.png) + +## Essential Features of the ABP Framework: + +ASP.NET Core modularity, ASP.NET Core modular development, ASP.NET Core localization, ASP.NET Core SaaS framework, ASP.NET Core distributed, event, bus, ASP.NET Core cross-cutting concerns, ASP.NET Core blob storing, ASP.NET Core audit logging, ASP.NET Core microservice, ASP.NET Core microservice solution, ASP.NET Core microservice example, ASP.NET Core API gateway, ASP.NET Core domain, driven, design, ASP.NET Core layered architecture, ASP.NET Core layering, ASP.NET Core clean architecture, ASP.NET Core authentication, ASP.NET Core authorization, ASP.NET Core UI theme, ASP.NET Core tag helpers, ASP.NET Core identity, ASP.NET Core, identity, server, ASP.NET Core IdentityServer, ASP.NET Core payment module, ASP.NET Core best practices, ASP.NET Core design patterns, ASP.NET Core background jobs, ASP.NET Core exception handling, ASP.NET Core, background, workers, ASP.NET Core repository, ASP.NET Core repository pattern, ASP.NET Core unit of work, ASP.NET Core domain services, ASP.NET Core Swagger, ASP.NET Core content management system, ASP.NET Core CMS module, ASP.NET Core user management, ASP.NET Core Role management, ASP.NET Core permission management + +![ABP Essential Features](images/abp-essential-features.png) + +## Open Source Web Application Framework + +ABP Framework is an open-source web application development framework that is free to use and distribute. The framework is licensed under the MIT license, meaning developers can use it for commercial and non-commercial purposes without any restrictions. + +![ABP Framework is open-source](images\open-source.png) + +## C# Web Application Framework + +ABP Framework is built using C#, which is a modern programming language that is widely used in the development of web applications. C# provides developers with features that make it easy to write clean and maintainable code. ABP Framework is a web framework designed to work with C# and provides developers with tools that make it easy to build modern web applications. + +## Key Features + +The following .NET features are available in the ABP Framework: + +.NET modular development, .NET localization, .NET multi-tenancy, .NET SaaS framework, .NET distributed event bus, .NET cross-cutting concerns, .NET,microservice, .NET microservice solution, .NET microservice example, .NET domain driven design, .NET clean architecture, .NET authentication, .NET authorization, .NET best practices, .NET design,patterns, .NET exception handling, .NET background workers, .NET unit of work, .NET domain services, .NET user management, .NET role management, .NET permission management + +![ABP Framework Features](images/features.png) + +The following keywords best describe the ABP Framework; + +Open source backend framework, open source development framework, open source web app builder, open source web applications, open source web development, web application development framework, web application framework, web application framework software, web application infrastructure, web application open source, asp net framework, asp net open source, ASP.NET application, ASP.NET software, ASP.NET web app, ASP.NET web development, web app builder open source, web app framework, Dotnet framework, Dotnet UI framework, Dotnet web application themes. + + + +## Conclusion + +ABP Framework is a powerful and flexible web application framework that provides developers with the tools to build high-quality web applications quickly and efficiently. It is an open-source, cross-platform framework that supports multiple .NET frameworks, including ASP.NET and .NET Core. ABP Framework provides rapid web application development tools, project templates, and web application themes that enable developers to create visually appealing and functional applications in no time. + +![Try ABP now](images\abp-try-now.png) \ No newline at end of file diff --git a/docs/en/Community-Articles/2023-03-20-Dapper/POST.md b/docs/en/Community-Articles/2023-03-20-Dapper/POST.md new file mode 100644 index 0000000000..491c9a010c --- /dev/null +++ b/docs/en/Community-Articles/2023-03-20-Dapper/POST.md @@ -0,0 +1,297 @@ +# Using Dapper with the ABP Framework + +[Dapper](https://github.com/DapperLib/Dapper) is a simple and lightweight object mapper for .NET. A key feature of Dapper is its [high performance](https://github.com/DapperLib/Dapper#performance) compared to other ORMs. In this article, I will show how to use it in your ABP projects. But, we'll see when to use it first. + +### Source Code + +You can find the [full source code of the demo application here](https://github.com/abpframework/abp-samples/tree/master/Dapper). + +## When to Use Dapper? + +In the ABP Framework, we suggest to use Dapper in combination with Entity Framework Core (EF Core) for the following reasons: + +* EF Core is much easier to use (you don't need to manually write SQL queries and work with low level database objects). +* EF Core abstracts different DBMS dialects, so it will be easier to change your DBMS later. +* The EF Core's change tracking system automatically updates the changes in the database. +* EF Core is better compatible with Object Oriented Programming (OOP) practices and is more type safe to work with. So, the EF Core code is more understandable and maintainable. + +In most of your use cases, you typically work with one or a few entities and a maintainable codebase can be chosen instead of a slight performance difference. However, there may be certain places in your application where it matters: + +* You may work with a lot of entities, so you'd like to query faster (Indeed, EF Core's [AsNoTracking()](https://learn.microsoft.com/en-us/ef/core/querying/tracking) extension can help in most cases). +* You may be performing too many database operations in a single request. +* EF Core may not create an optimized SQL query and you may want to manually write it for better performance. + +For such cases, Dapper can be a good choice. You can easily write SQL queries and bind the result to your objects. + +## Creating a new ABP Solution + +To demonstrate the useage of Dapper, I've created an ABP solution. You can find the [full source code of the demo application here](https://github.com/abpframework/abp-samples/tree/master/Dapper). If you want to create the same solution from scratch, follow the steps below: + +Install the ABP CLI if you haven't installed it before: + +````bash +dotnet tool install -g Volo.Abp.Cli +```` + +Create a new solution with the ABP Framework's non-layered startup template with MVC UI and EF Core database: + +````bash +abp new DapperDemo -t app-nolayers +```` + +> The startup template and UI selection don't matter for this article. I selected these options to keep the demo solution simple. + +After creating the solution, run the following command to migrate the database (run the command in the folder of the `.csproj` file: + +````csharp +dotnet run --migrate-database +```` + +> If you've created a layered solution, then run the `DbMigrator` application inside the solution. If you have trouble by creating the solution, please refer to the [Quick Start](https://docs.abp.io/en/abp/latest/Tutorials/Todo/Single-Layer/Index) document. + +## Setting Up the Entity Framework Core Part + +We will use EF Core with Dapper, so we need to configure EF Core first. I will use the following `Book` entity as an example: + +````csharp +public class Book : AuditedAggregateRoot +{ + public string Name { get; set; } + public DateTime PublishDate { get; set; } + public float Price { get; set; } +} +```` + +If you are using a layered solution, entities are located in the `Domain` project. For my demo solution, I just placed it in the `Entities` folder of the single-layer project: + +![book-class-in-rider](book-class-in-rider.png) + +Once I created the `Book` entity, I should add it to my `DbContext` class: + +````csharp +public class DapperDemoDbContext : AbpDbContext +{ + // 1: ADD A DBSET PROPERTY + public DbSet Books { get; set; } + + public DapperDemoDbContext(DbContextOptions options) + : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder builder) + { + //...other code parts + + // 2: MAP YOUR ENTITY TO A DATABASE TABLE + builder.Entity(b => + { + b.ToTable("Books"); + b.Property(x => x.Name).IsRequired().HasMaxLength(128); + }); + } +} + +```` + +Now, we can add a new database migration: + +````bash +dotnet ef migrations add Added_Book +```` + +And apply the changes to the database: + +````bash +dotnet ef database update +```` + +At this point, you should be able to see the Books table if you check your database: + +![book-database-table](book-database-table.png) + +> As you see, the `Books` table contains more fields than the `Book` entity's property count. Other properties are inherited from the `AuditedAggregateRoot` table. You could inherit from the `BasicAggregateRoot` class if you don't want these properties. + +## Seeding the Database + +ABP's [data seeding](https://docs.abp.io/en/abp/latest/Data-Seeding) system is a great way to add some test data to the database. The following class inserts two books to the `Books` table when I migrate the database: + +````csharp +public class DapperDemoDataSeederContributor : IDataSeedContributor, ITransientDependency +{ + private readonly IRepository _bookRepository; + + public DapperDemoDataSeederContributor(IRepository bookRepository) + { + _bookRepository = bookRepository; + } + + public async Task SeedAsync(DataSeedContext context) + { + if (await _bookRepository.GetCountAsync() > 0) + { + return; + } + + await _bookRepository.InsertAsync( + new Book + { + Name = "1984", + PublishDate = new DateTime(1949, 6, 8), + Price = 19.84f + } + ); + + await _bookRepository.InsertAsync( + new Book + { + Name = "The Hitchhiker's Guide to the Galaxy", + PublishDate = new DateTime(1995, 9, 27), + Price = 42.0f + } + ); + } +} +```` + +After creating the `DapperDemoDataSeederContributor` class, I can re-run the following command: + +````bash +dotnet run --migrate-database +```` + +Now, I can see the records in the database: + +![book-table-data](book-table-data.png) + +Now, everything is ready to try querying from the `Books` table with Dapper. + +## Using Dapper Without the Integration Package + +ABP provides an integration package for Dapper. However, I first want to demonstrate using Dapper without the integration package. + +### Installing the Dapper Package + +First, install the [Dapper](https://www.nuget.org/packages/Dapper) package to your project. You can use a command-line terminal, locate the root path of your project (`.csproj` file that you want to install it in) and run the following command: + +````bash +dotnet add package Dapper +```` + +> If your application is layered, then we suggest to add the `Dapper` package to your `EntityFrameworkCore` integration project in your solution. + +### Executing a Dapper Query + +I will query from the `Books` table, but I don't want to use the `Book` entity to map the result (because I don't need all the properties). So, I am creating a new class for the query result: + +````csharp +public class BookDataView +{ + public Guid Id { get; set; } + public string Name { get; set; } + public float Price { get; set; } +} +```` + +Now, we can use Dapper's `QueryAsync` extension method as shown below: + +````csharp +public class DemoService : ITransientDependency +{ + private readonly IRepository _bookRepository; + + public DemoService(IRepository bookRepository) + { + _bookRepository = bookRepository; + } + + [UnitOfWork] + public virtual async Task> GetListAsync() + { + var database = (await _bookRepository.GetDbContextAsync()).Database; + var dbConnection = database.GetDbConnection(); + var dbTransaction = database.CurrentTransaction?.GetDbTransaction(); + + var queryResult = await dbConnection.QueryAsync( + "SELECT Id, Name, Price FROM Books", + transaction: dbTransaction + ); + + return queryResult.ToList(); + } +} +```` + +Let's examine this class: + +* I've injected the ABP's standard [generic repository](https://docs.abp.io/en/abp/latest/Repositories) service into the `DemoService` constructor. +* `_bookRepository.GetDbContextAsync()` returns the underlying `DbContext` object of EF Core. We need to have the [Volo.Abp.EntityFrameworkCore](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore) package reference to be able to access that method. If you have created a single-layer solution, the reference will already have existed. If you have created a layered solution you may need to manually add this package to the project that contains the `DemoService` class. Because the layered solution isolates the EF Core dependency from the rest of the solution. +* Dapper needs a `DbConnection` and a `DbTransaction` object (as optional) to execute a query. We are getting them over the `database` object obtained from the `DbContext`. We suggest to always pass the current `DbTransaction` object while working with Dapper. Because, if there is a database transaction on the same database connection that you execute queries on, and you don't pass the transaction object, you'll get an exception. +* Finally, we can use Dapper's `QueryAsync` extension method to execute the database query. +* Notice that the `GetListAsync` method is made as `virtual` and marked with the `UnitOfWork` attribute to enable the [Unit Of Work](https://docs.abp.io/en/abp/latest/Unit-Of-Work) for that method. It ensures the database connection is available in the body of the `GetListAsync` method. + +That's all. You can execute any Dapper operation using the `DbConnection` and `DbTransaction` objects obtained from the `_bookRepository` object. Please refer to Dapper's documentation for other operations. + +> We've obtained the `DbContext` object from a repository. However, a repository is not required to obtain a `DbContext`. Instead, you could inject the `IDbContextProvider` service (`IDbContextProvider` for this demo) and call its `GetDbContextAsync` method. + +## Using the Volo.Abp.Dapper Package + +In the previous section, you saw that you don't need an ABP integration package to be able to use Dapper in your ABP applications. However, there is an integration package here: [Volo.Abp.Dapper](https://www.nuget.org/packages/Volo.Abp.Dapper). In fact, that package doesn't contain much services. It just provides a convenient base class to create Dapper based repository classes. + +### Installing the Volo.Abp.Dapper Package + +You can use the [ABP CLI](https://docs.abp.io/en/abp/latest/CLI#add-package) to easily install ABP packages to your projects. Execute the following command in the folder of the `.csproj` file that you want to install the package on: + +````bash +abp add-package Volo.Abp.Dapper +```` + +> You can check the [ABP Dapper document](https://docs.abp.io/en/abp/latest/Dapper) for alternative installation options. + +### Creating a Repository Class + +In the `DemoService` example, we used database objects out of a [repository](https://docs.abp.io/en/abp/latest/Repositories) class. If you want to implement layering to your solution and abstracting database operations, it can be better to create a repository class to execute the Dapper operations. + +Here's a repository class that executes the same database query: + +````csharp +public class BookRepository : DapperRepository, ITransientDependency +{ + public BookRepository(IDbContextProvider dbContextProvider) + : base(dbContextProvider) + { + } + + public virtual async Task> GetListAsync() + { + var connection = await GetDbConnectionAsync(); + var queryResult = await connection.QueryAsync( + "SELECT Id, Name, Price FROM Books", + transaction: await GetDbTransactionAsync() + ); + return queryResult.ToList(); + } +} +```` + +Let's examine this class: + +* It inherits from the `DapperRepository` class, which provides useful methods and properties for database operations. It also implements the `IUnitOfWorkEnabled` interface, so ABP makes the database connection (and transaction if requested) available in the method body by implementing dynamic proxies (a.k.a. interception). +* The `GetListAsync` method's been made `virtual`. That's needed to make the interception process working. It wouldn't be needed if we introduce `IBookRepository` to that class and always use it by injecting the `BookRepository` class (in this case, it will use interface proxying - however, this is too much details for the purpose of this article). +* We've used the `GetDbConnectionAsync` and `GetDbTransactionAsync` methods to obtain the current database connection and transaction (that is managed by ABP's [unit of work](https://docs.abp.io/en/abp/latest/Unit-Of-Work) system). + +You can then inject the `BookRepository` class when you want to get a list of `BookDataView` whenever it is needed. In the demo project, I used it inside the `IndexModel.cshtml.cs` to show a list of books on the page: + +![list-of-books](list-of-books.png) + +## Conclusion + +In this article, I've explained ABP's Dapper integration and demonstrated how you can execute Dapper operations in your applications. I suggest to use Dapper when it is really needed and adds any significant value (generally a performance gain) to your application. Otherwise, EF Core is much more convenient for most of the database operations and you will have a more maintainable codebase using EF Core. + +## Source Code + +You can find the [full source code of the demo application here](https://github.com/abpframework/abp-samples/tree/master/Dapper). + +## See Also + +* [ABP Dapper documentation](https://docs.abp.io/en/abp/latest/Dapper) diff --git a/docs/en/Community-Articles/2023-03-20-Dapper/book-class-in-rider.png b/docs/en/Community-Articles/2023-03-20-Dapper/book-class-in-rider.png new file mode 100644 index 0000000000..db1e5791b4 Binary files /dev/null and b/docs/en/Community-Articles/2023-03-20-Dapper/book-class-in-rider.png differ diff --git a/docs/en/Community-Articles/2023-03-20-Dapper/book-database-table.png b/docs/en/Community-Articles/2023-03-20-Dapper/book-database-table.png new file mode 100644 index 0000000000..d1584118d9 Binary files /dev/null and b/docs/en/Community-Articles/2023-03-20-Dapper/book-database-table.png differ diff --git a/docs/en/Community-Articles/2023-03-20-Dapper/book-table-data.png b/docs/en/Community-Articles/2023-03-20-Dapper/book-table-data.png new file mode 100644 index 0000000000..6b9ea69b59 Binary files /dev/null and b/docs/en/Community-Articles/2023-03-20-Dapper/book-table-data.png differ diff --git a/docs/en/Community-Articles/2023-03-20-Dapper/list-of-books.png b/docs/en/Community-Articles/2023-03-20-Dapper/list-of-books.png new file mode 100644 index 0000000000..23b190afa6 Binary files /dev/null and b/docs/en/Community-Articles/2023-03-20-Dapper/list-of-books.png differ diff --git a/docs/en/Community-Articles/2023-03-27-What-is-new-in-NET8/post.md b/docs/en/Community-Articles/2023-03-27-What-is-new-in-NET8/post.md index 060452b407..5ae3ff2ce0 100644 --- a/docs/en/Community-Articles/2023-03-27-What-is-new-in-NET8/post.md +++ b/docs/en/Community-Articles/2023-03-27-What-is-new-in-NET8/post.md @@ -15,7 +15,7 @@ dotnet publish -p:PublishRelease=false -> /app/bin/Debug/net8.0/app.dll -## `System.Text.Json` Serialization 🧱 +## System.Text.Json Serialization 🧱 [System.Text.Json](https://learn.microsoft.com/en-us/dotnet/api/system.text.json) replaced Newtonsoft.Json in the recent versions. We are also using `System.Text.Json` in the [ABP Framework](https://abp.io) now. There are several enhancements to object serialization and deserialization. @@ -25,7 +25,9 @@ The latest version of the [source generator](https://learn.microsoft.com/en-us/d -## Randomness +## Randomness + +AI programming is very popular these days. And the need to produce more random content arose. ### GetItems() 🧮 @@ -110,7 +112,7 @@ In .NET 8, various new types have been introduced to enhance application perform -## Improvements in `System.Numerics` and `System.Runtime.Intrinsics` 🔥 +## Improvements in System.Numerics and System.Runtime.Intrinsics 🔥 There are several enhancements made to the [System.Numerics](https://learn.microsoft.com/en-us/dotnet/api/system.numerics) and [System.Runtime.Intrinsics](https://learn.microsoft.com/en-us/dotnet/api/system.runtime.intrinsics) namespaces. These improvements include better hardware acceleration for [Vector256](https://learn.microsoft.com/en-us/dotnet/api/system.runtime.intrinsics.vector256-1), [Matrix3x2](https://learn.microsoft.com/en-us/dotnet/api/system.numerics.matrix3x2), and [Matrix4x4](https://learn.microsoft.com/en-us/dotnet/api/system.numerics.matrix4x4) in .NET 8. @@ -183,7 +185,7 @@ In .NET 8, the support for native AOT now encompasses the `x64` and `Arm64` arch -## .NET 8 Devops Improvements 📦 +## .NET 8 DevOps Improvements 📦 ### NET Container Image Changes @@ -210,7 +212,9 @@ The support requirements for Linux have been updated for .NET 8, with changes to For further details, please refer to the [support for Red Hat Enterprise Linux Family](https://github.com/dotnet/core/blob/main/linux-support.md#red-hat-enterprise-linux-family-support) page. -〰️〰️〰️ + + +--- Become a pioneer and try the new features of .NET 8 now. Adapt it to your project or start a new .NET 8 project. diff --git a/docs/en/Community-Articles/2023-03-28-Converting-Create-Edit-Modal-To-Page/POST.md b/docs/en/Community-Articles/2023-03-28-Converting-Create-Edit-Modal-To-Page/POST.md new file mode 100644 index 0000000000..4904da48cf --- /dev/null +++ b/docs/en/Community-Articles/2023-03-28-Converting-Create-Edit-Modal-To-Page/POST.md @@ -0,0 +1,372 @@ +# Convert Create/Edit Modals to Page +In this document we will explain how to convert BookStore's Books create & edit modals to regular blazor pages. + +## Before +![bookstore-crud-before](images/old.gif) + +## After + +![bookstore-crud-after](images/new.gif) + + +# Books.razor Page +Books.razor page is the main page of the books management. Create & Update operations are done in this page. So we'll remove create & update operations from this page and move a separate blazor component for each operation. Each component will be a page. + +- Remove both Create & Update modals. + + ![remove-all-modals](images/books-remove-modals.png) + +- Replace **NewBook** button with a link to **CreateBook** page. + + ```html + + ``` + +- Inject `NavigationManager` to `Books.razor` page. + ```csharp + @inject NavigationManager NavigationManager + ``` + +- Replace **Edit** button with a link to **UpdateBook** page. + + ```html + + ``` + + ```csharp + private void NavigateToEdit(Guid id) + { + NavigationManager.NavigateTo($"books/{id}/edit"); + } + ``` + +- Remove all methods in the `Books.razor` page except constructor. And add `GoToEditPage` as below: + + ```csharp + protected void GoToEditPage(BookDto book) + { + NavigationManager.NavigateTo($"books/{book.Id}"); + } + ``` + + ![bookstore-remove-methods](images/books-remove-methods.png) + +- Change Edit button to a link in the table. + + ```html + + ``` + + +# CreateBooks Page +Create new `CreateBook.razor` and `CreateBook.razor.cs` files in your project. + +- `CreateBook.razor` + +```html +@page "/books/new" +@attribute [Authorize(BookStorePermissions.Books.Create)] +@inherits BookStoreComponentBase + +@using Acme.BookStore.Books; +@using Acme.BookStore.Localization; +@using Acme.BookStore.Permissions; +@using Microsoft.Extensions.Localization; +@using Volo.Abp.AspNetCore.Components.Web; + +@inject IStringLocalizer L +@inject AbpBlazorMessageLocalizerHelper LH +@inject IBookAppService AppService +@inject NavigationManager NavigationManager + + + + + @L["NewBook"] + + + + + + + @L["Author"] + + + + @L["Name"] + + + + + + + + + @L["Type"] + + + + @L["PublishDate"] + + + + @L["Price"] + + + + + + + + + +``` + +- `CreateBook.razor.cs` + +```csharp +using Acme.BookStore.Books; +using Blazorise; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp; + +namespace Acme.BookStore.Blazor.Pages; + +public partial class CreateBook +{ + protected Validations CreateValidationsRef; + protected CreateUpdateBookDto NewEntity = new(); + IReadOnlyList authorList = Array.Empty(); + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + authorList = (await AppService.GetAuthorLookupAsync()).Items; + + if (!authorList.Any()) + { + throw new UserFriendlyException(message: L["AnAuthorIsRequiredForCreatingBook"]); + } + + NewEntity.AuthorId = authorList.First().Id; + + if (CreateValidationsRef != null) + { + await CreateValidationsRef.ClearAll(); + } + } + + protected virtual async Task CreateEntityAsync() + { + try + { + var validate = true; + if (CreateValidationsRef != null) + { + validate = await CreateValidationsRef.ValidateAll(); + } + if (validate) + { + await AppService.CreateAsync(NewEntity); + NavigationManager.NavigateTo("books"); + } + } + catch (Exception ex) + { + await HandleErrorAsync(ex); + } + } +} +``` + +# EditBooks Page +Create new `EditBook.razor` and `EditBook.razor.cs` files in your project. + +- `EditBook.razor` + +```html +@page "/books/{Id}" +@attribute [Authorize(BookStorePermissions.Books.Edit)] +@inherits BookStoreComponentBase +@using Acme.BookStore.Books; +@using Acme.BookStore.Localization; +@using Acme.BookStore.Permissions; +@using Microsoft.Extensions.Localization; +@using Volo.Abp.AspNetCore.Components.Web; + +@inject IStringLocalizer L +@inject AbpBlazorMessageLocalizerHelper LH +@inject IBookAppService AppService +@inject NavigationManager NavigationManager + + + + + @EditingEntity.Name + + + + + + + @L["Author"] + + + + @L["Name"] + + + + + + + + + @L["Type"] + + + + @L["PublishDate"] + + + + @L["Price"] + + + + + + + + + +``` + +- `EditBook.razor.cs` + +```csharp +using Acme.BookStore.Books; +using Blazorise; +using Microsoft.AspNetCore.Components; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp; + +namespace Acme.BookStore.Blazor.Pages; + +public partial class EditBook +{ + protected CreateUpdateBookDto EditingEntity = new(); + protected Validations EditValidationsRef; + IReadOnlyList authorList = Array.Empty(); + + [Parameter] + public string Id { get; set; } + + public Guid EditingEntityId { get; set; } + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + // Blazor can't parse Guid as route constraint currently. + // See https://github.com/dotnet/aspnetcore/issues/19008 + EditingEntityId = Guid.Parse(Id); + + authorList = (await AppService.GetAuthorLookupAsync()).Items; + + if (!authorList.Any()) + { + throw new UserFriendlyException(message: L["AnAuthorIsRequiredForCreatingBook"]); + } + + var entityDto = await AppService.GetAsync(EditingEntityId); + + EditingEntity = ObjectMapper.Map(entityDto); + + if (EditValidationsRef != null) + { + await EditValidationsRef.ClearAll(); + } + } + + protected virtual async Task UpdateEntityAsync() + { + try + { + var validate = true; + if (EditValidationsRef != null) + { + validate = await EditValidationsRef.ValidateAll(); + } + if (validate) + { + await AppService.UpdateAsync(EditingEntityId, EditingEntity); + + NavigationManager.NavigateTo("books"); + } + } + catch (Exception ex) + { + await HandleErrorAsync(ex); + } + } +} +``` + +You can check the following commit for details: +https://github.com/abpframework/abp-samples/commit/aae61ad6d66ebf6191dd4dcfb4e23d30bd680a4e \ No newline at end of file diff --git a/docs/en/Community-Articles/2023-03-28-Converting-Create-Edit-Modal-To-Page/images/books-remove-methods.png b/docs/en/Community-Articles/2023-03-28-Converting-Create-Edit-Modal-To-Page/images/books-remove-methods.png new file mode 100644 index 0000000000..a2df67fee2 Binary files /dev/null and b/docs/en/Community-Articles/2023-03-28-Converting-Create-Edit-Modal-To-Page/images/books-remove-methods.png differ diff --git a/docs/en/Community-Articles/2023-03-28-Converting-Create-Edit-Modal-To-Page/images/books-remove-modals.png b/docs/en/Community-Articles/2023-03-28-Converting-Create-Edit-Modal-To-Page/images/books-remove-modals.png new file mode 100644 index 0000000000..0e9fd6e8d4 Binary files /dev/null and b/docs/en/Community-Articles/2023-03-28-Converting-Create-Edit-Modal-To-Page/images/books-remove-modals.png differ diff --git a/docs/en/Community-Articles/2023-03-28-Converting-Create-Edit-Modal-To-Page/images/new.gif b/docs/en/Community-Articles/2023-03-28-Converting-Create-Edit-Modal-To-Page/images/new.gif new file mode 100644 index 0000000000..42784eb281 Binary files /dev/null and b/docs/en/Community-Articles/2023-03-28-Converting-Create-Edit-Modal-To-Page/images/new.gif differ diff --git a/docs/en/Community-Articles/2023-03-28-Converting-Create-Edit-Modal-To-Page/images/old.gif b/docs/en/Community-Articles/2023-03-28-Converting-Create-Edit-Modal-To-Page/images/old.gif new file mode 100644 index 0000000000..80a97a80f2 Binary files /dev/null and b/docs/en/Community-Articles/2023-03-28-Converting-Create-Edit-Modal-To-Page/images/old.gif differ diff --git a/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/abp-framework.png b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/abp-framework.png new file mode 100644 index 0000000000..b1157793bf Binary files /dev/null and b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/abp-framework.png differ diff --git a/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/abp-suite.png b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/abp-suite.png new file mode 100644 index 0000000000..e4ad6d6014 Binary files /dev/null and b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/abp-suite.png differ diff --git a/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/architecture-layers.png b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/architecture-layers.png new file mode 100644 index 0000000000..081376668b Binary files /dev/null and b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/architecture-layers.png differ diff --git a/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/conclusion.png b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/conclusion.png new file mode 100644 index 0000000000..cecdd739b4 Binary files /dev/null and b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/conclusion.png differ diff --git a/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/cover.png b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/cover.png new file mode 100644 index 0000000000..a926bcfca6 Binary files /dev/null and b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/cover.png differ diff --git a/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/csharp-microservice-framework.png b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/csharp-microservice-framework.png new file mode 100644 index 0000000000..2550a9209d Binary files /dev/null and b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/csharp-microservice-framework.png differ diff --git a/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/ddd.png b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/ddd.png new file mode 100644 index 0000000000..45f6261a57 Binary files /dev/null and b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/ddd.png differ diff --git a/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/essential-features.png b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/essential-features.png new file mode 100644 index 0000000000..e709f00327 Binary files /dev/null and b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/essential-features.png differ diff --git a/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/essentials.png b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/essentials.png new file mode 100644 index 0000000000..dee5928bbd Binary files /dev/null and b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/essentials.png differ diff --git a/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/modular.png b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/modular.png new file mode 100644 index 0000000000..96943ef81f Binary files /dev/null and b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/modular.png differ diff --git a/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/pre-built-modules.png b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/pre-built-modules.png new file mode 100644 index 0000000000..0d5f5a7e9a Binary files /dev/null and b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/pre-built-modules.png differ diff --git a/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/the-abp-platform.png b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/the-abp-platform.png new file mode 100644 index 0000000000..bae6f08238 Binary files /dev/null and b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/images/the-abp-platform.png differ diff --git a/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/post.md b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/post.md new file mode 100644 index 0000000000..b844fb5540 --- /dev/null +++ b/docs/en/Community-Articles/2023-04-03-What-is-ABP-Framework/post.md @@ -0,0 +1,118 @@ +# ABP Framework: An Open Source Web Application Development Framework + + + +## What is ABP Framework? + +![ABP Framework](images/abp-framework.png) + +ABP Framework is an open-source web application development framework that provides developers with a set of tools to build modern, scalable, and maintainable web applications. ABP Framework is also a C# web framework that is based on the ASP.NET web framework. It is one of the [most popular repository](https://github.com/abpframework/abp) for open source application framework. + +ABP Framework is a modular and extensible framework that uses the clean architecture principles and is built on top of the latest .NET technologies. The framework comes with a set of pre-built modules, including user management, role management, permission management, content management system (CMS) modules, which makes it easier for developers to create line of business applications. + + + +## Clean Architecture + +When you want to start a new scratch project, you first google for Dotnet Framework Architecture. There are some boilerplate dotnet startup templates but these are only an orchestration of some popular tools. ABP is not a template but it's a full stack open source application development framework. + +When you say "Clean Architecture ASP.NET Core", the first web development framework that comes to mind is undoubtedly the ABP Framework. It is built using clean architecture principles, which help developers build scalable and maintainable applications. Clean architecture separates the application into distinct layers, each with a clear responsibility. The dotnet architecture layers include the presentation layer, application layer, domain layer, and infrastructure layer. Each layer has a clear responsibility, which helps in separating concerns and keeping the code organized. This makes ABP Framework one of the best asp net frameworks. + +![Clean architecture - ABP Layers](images/architecture-layers.png) + +## C# Web Framework for Web Development + +ABP Framework is built using C#, which is a modern programming language that is widely used in the development of web applications. C# provides developers with a set of features that make it easy to write clean and maintainable code. ABP Framework is a web framework that is designed to work with C# and provides developers with a set of tools that makes it easy to build modern web applications. If you are looking for an ASP NET Core shared framework download, then go to https://abp.io/get-started and create your project. + +![ABP Framework Essentials](images/essentials.png) + +## Yet another ASP.NET Web Framework + +There are a few full stack AspNet Core frameworks around. Many of them are one developer projects which can be risky for you to start a long running project. ABP Framework is built on top of the latest ASP NET Core Framework, which provides developers with a set of features that makes it easy to build modern web applications. And most important part is, ABP is backed with a large group of developers and it has almost 10K stars on GitHub. ASP.NET provides developers with a set of tools that makes it easy to build web applications using a model-view-controller (MVC) architecture. + +![ABP.io Platform](images/the-abp-platform.png) + + + +## Implementing Domain Driven Design with C# + +ABP Framework provides developers with a set of tools that make it easy to implement domain-driven design principles. The framework comes with a set of pre-built modules, including user management, role management, permission management, and content management system (CMS) modules, which makes it easier for developers to create complex applications. + +![Implementing Domain Driven Design with C#](images/ddd.png) + + + +## Open Source Web Application + +ABP Framework is an open-source web application development framework that is free to use and distribute. The framework is licensed under the MIT license, which means that developers can use it for commercial and non-commercial purposes without any restrictions. + + + +## .NET Application Framework with Pre-Built Modules + +ABP Framework is built using the latest .NET technologies and provides developers with a set of tools that makes it easy to build modern web applications. ABP contains several important modules of a line of business applications. + +![ABP Pre-built Modules](images/pre-built-modules.png) + + + +## C# Microservice Framework + +ABP Framework is a C# microservices framework that is designed to help developers build scalable and maintainable microservices. The framework is also known as .NET .net microservices framework. It provides developers with a set of tools that makes it easy to build microservices using clean architecture principles. + +![C# Microservice Framework](images/csharp-microservice-framework.png) + + + +## CRUD Tool Dotnet + +ABP Framework has a commercial version as well. The paid version comes with a premium support, rich themes and there's a very handy tool called [ABP Suite](https://commercial.abp.io/tools/suite) for "CRUD page generation ASP.NET". While ABP is not a low-code or no-code platform, ABP Suite provides ASP NET rapid application development. There are many ASP.NET rapid development tools but these are only tools without a framework support. If you are looking for web based rapid application development tools (also open-source), ABP is the way to go! + +![ABP Suite](images/abp-suite.png) + +## Modular Development + +One of the best sides of the ABP Framework is the modular development side. It's born as a modular system. There are several open source web frameworks around but many of them lack of modularity. + +![Modular Development](images/modular.png) + +Let's see the key features of the ABP Framework: + +- Multi-tenancy support +- Cross-cutting concerns implemented +- Full-stack microservice solution +- SaaS framework +- ASP.NET modular monolith +- Has an ASP.NET user management module +- Distributed events +- Layered architecture +- Free framework for website +- Several framework templates + + + +## The Essential Features of ABP + +ABP Framework is an open source SaaS framework. This crucial feature distinguishes it from other open source web development frameworks. + +![Essential Features](images/essential-features.png) + +The following essential ASP.NET features are available in the ABP Framework: + +ASP.NET modularity, ASP.NET modular development, ASP.NET localization, ASP.NET multi-tenancy, ASP.NET SaaS, ASP.NET SaaS framework, ASP.NET distributed events, ASP.NET distributed event bus, ASP.NET cross-cutting concerns, ASP.NET blob storing, ASP.NET audit logging, ASP.NET microservice, ASP.NET microservice solution, ASP.NET microservice example, ASP.NET API gateway, ASP.NET domain driven design, ASP.NET layered architecture, ASP.NET layering, ASP.NET clean architecture, ASP.NET authentication, ASP.NET authorization, ASP.NET identity, ASP.NET identity server, ASP.NET IdentityServer, ASP.NET payment module, ASP.NET best practices, ASP.NET design patterns, ASP.NET background jobs, ASP.NET exception handling, ASP.NET background workers, ASP.NET repository, ASP.NET repository pattern, ASP.NET unit of work, ASP.NET domain services, ASP.NET swagger, ASP.NET content management system, ASP.NET user management, ASP.NET role management, ASP.NET permission management + + + +## Microservice Example: eShopOnAbp + +[eShopOnAbp](https://www.eshoponabp.com/) is a microservice example built on top ABP. It is a sample net application, similar to the Microsoft's [eShopOnContainer](https://github.com/dotnet-architecture/eShopOnContainers) project. It is a reference microservice solution built with the ABP Framework and .NET, runs on Kubernetes with Helm configuration, includes API Gateways, Angular and ASP.NET Core MVC applications with PostgreSQL and MongoDB databases. For more information, check out https://github.com/abpframework/eShopOnAbp. + + + +## Conclusion + +In conclusion, ABP Framework is an open-source web development framework that offers many features and benefits for building modern and scalable web applications. Its modular and extensible architecture, implementation of Domain-Driven Design, and compatibility with various platforms make it a popular choice for developers. Whether you're building a web application, microservices, or modular monoliths, ABP Framework has everything you need to get started. + +![conclusion](images/conclusion.png) + +Whether you're building a dot net website, a web app infrastructure, or a webpage framework, open source web application frameworks are a cost-effective and flexible option for web development. If you are looking for an open source web application builder which contains project framework template with web application development tools (open source), [ABP Framework](https://abp.io/) is the right choice. \ No newline at end of file diff --git a/docs/en/Community-Articles/2023-04-11-Top-10-NET-Core-Libraries-Every-Developer-Should-Know/Top 10 .NET Core Libraries Every Developer Should Know.md b/docs/en/Community-Articles/2023-04-11-Top-10-NET-Core-Libraries-Every-Developer-Should-Know/Top 10 .NET Core Libraries Every Developer Should Know.md new file mode 100644 index 0000000000..417a5266f7 --- /dev/null +++ b/docs/en/Community-Articles/2023-04-11-Top-10-NET-Core-Libraries-Every-Developer-Should-Know/Top 10 .NET Core Libraries Every Developer Should Know.md @@ -0,0 +1,60 @@ +# Top 10 .NET Core Libraries Every Developer Should Know + +> *Brief Summary*: +> +> This article is intended for .NET Core developers who wish to create a robust and useful.NET core application. It is a list of the most popular and widely used .NET Core libraries that have been carefully vetted. Go up the GitHub reference link for the DotNet libraries and see how many stars the .NET community has rewarded. + + + +## Best .NET libraries — Top useful libraries every .NET developers use + +.NET Core has become one of the most popular frameworks for developing modern applications. One of the reasons for its popularity is the wide range of libraries available to developers. .NET Core got new updates in its features with lesser coding, deploying high-accomplishment, and extremely scalable applications. Making the underlying architecture functions more effective and efficient without having to reinvent the wheel will free up your time to focus on more crucial tasks, including making your application stand out from the competition. + +In this article, we'll take a closer look at **The Most Popular .NET Libraries Every Developer Should Know**. As a software developer, you're likely familiar with the .NET framework and the many libraries it offers. With so many options available, it can be overwhelming to know which ones to choose for your project. This is the main reason I have compiled a list of the **Top 10 .NET Libraries That Developers Should Use** to make their development process more efficient and effective. A list of Top 10 .NET Core Libraries will let developers understand these so that they can pick appropriate libraries for their projects. + +If you're a .NET Core developer, there are **10 important .NET Core libraries** that you should be familiar with. While creating these **Essential 10 .NET Libraries Every Developer Must Know**, I used NuGet and GitHub.com popular repositories. And all the libraries listed here are also open-source. The list is filtered with only to .NET Core related libraries. Also I excluded the Microsoft .NET Core Framework libraries from this **Top 10 Unique .NET Core Libraries Developers Must Utilize**. So, without further ado, let’s get right into it: + +------ + + + +## Top 10 best libraries for .NET developers + +1. **Newtonsoft.Json:** This library is widely used for working with JSON data in .NET applications. It provides high performance and ease of use, making it a go-to solution for serialization and deserialization of JSON data. +2. **Dapper:** It is a simple and efficient ORM that offers high performance and flexibility when working with relational databases. It is easy to use and offers a fast and efficient way to interact with databases. +3. **Polly:** Polly is a library that helps handle transient errors and faults in .NET applications. It offers an easy-to-use policy-based approach to handling retries, timeouts, and circuit breakers, making it a valuable tool for building reliable applications. +4. **AutoMapper**: This .NET Core library simplifies object-to-object mapping by automatically mapping properties from one object to another. This library is especially useful in larger projects where mapping can become time-consuming and tedious. +5. **FluentValidation:** It is a library that provides a fluent API for building validation rules. It makes it easy to create complex validation logic and supports a wide range of validation scenarios, making it a valuable tool for ensuring data integrity in your applications. +6. **Serilog**: This library is a structured logging library that makes it easy to collect and analyze logs from your application. It offers flexibility and extensibility, and supports a variety of sinks for storing logs, including Elasticsearch, SQL Server, and more. +7. **Swashbuckle.AspNetCore.Swagger:** This library generates OpenAPI documentation for your ASP.NET Core Web API. It makes it easy to understand the functionality of your API and allows you to easily generate client code for your API. +8. **NLog**: It is is a free logging platform for .NET with rich log routing and management capabilities. It makes it easy to produce and manage high-quality logs for your application regardless of its size or complexity. +9. **Moq4**: It is is a popular mocking framework for .NET applications. It makes it easy to create mock objects for unit testing, reducing the need for expensive and time-consuming integration testing. +10. **StackExchange.Redis**: This is a library for working with Redis databases in .NET applications. It provides a simple and efficient way to interact with Redis, and offers high performance and scalability. + +------ + +![10 important .NET Core Libraries](essential-10-net-libraries-every-developer-must-know.png) + + + +## Top 10 .NET Core Libraries List That Every Developer Must Know + +Here you can see them in table with the GitHub stars, GitHub release counts, recent release frequency, NuGet download counts and per day NuGet download counts: + +| GitHub URL | NuGet URL | Stars | Releases | Last release | Downloads | Download Per Day | +| ------------------------------------------------------------ | ------------------------------------------------------------ | ----- | -------- | ------------ | --------- | ---------------- | +| [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) | [Newtonsoft.Json](https://www.nuget.org/packages/Newtonsoft.Json) | 10K | 65 | 1 month ago | 3B | 680K | +| [Dapper](https://github.com/DapperLib/Dapper) | [Dapper](https://www.nuget.org/packages/Dapper) | 16K | 70 | 2 years ago | 216M | 50K | +| [Polly](https://github.com/App-vNext/Polly) | [Polly](https://www.nuget.org/packages/polly) | 12K | 26 | 1 year ago | 335M | 92K | +| [AutoMapper](https://github.com/AutoMapper/AutoMapper) | [AutoMapper](https://www.nuget.org/packages/AutoMapper) | 9K | 41 | 6 months ago | 400M | 90K | +| [FluentValidation](https://github.com/FluentValidation/FluentValidation) | [FluentValidation](https://www.nuget.org/packages/FluentValidation) | 8K | 68 | 3 days ago | 250M | 56K | +| [Serilog](https://github.com/serilog/serilog) | [Serilog](https://www.nuget.org/packages/Serilog) | 6K | 15 | 1 month ago | 722M | 197K | +| [Swashbuckle.AspNetCore.Swagger](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) | [Swashbuckle.AspNetCore.Swagger](https://www.nuget.org/packages/Swashbuckle.AspNetCore.Swagger) | 5K | 28 | 4 months ago | 386M | 168K | +| [NLog](https://github.com/NLog/NLog) | [NLog](https://www.nuget.org/packages/Nlog) | 6K | 125 | 1 week ago | 217M | 48K | +| [Moq](https://github.com/moq/moq4) | [Moq](https://www.nuget.org/packages/Moq) | 5K | 33 | 4 months ago | 418M | 93K | +| [StackExchange.Redis](https://github.com/StackExchange/StackExchange.Redis) | [StackExchange.Redis](https://www.nuget.org/packages/StackExchange.Redis) | 5K | 34 | 11 days ago | 244M | 74K | + + + +In conclusion, these 10 .NET Core libraries are essential tools for any .NET Core developer. They offer a wide range of functionality, from handling errors to mocking for unit testing and simplifying object mapping. Whether you're working on a large-scale enterprise application or a small project, these libraries can help you build more reliable, efficient, and effective applications. + diff --git a/docs/en/Community-Articles/2023-04-11-Top-10-NET-Core-Libraries-Every-Developer-Should-Know/cover1.png b/docs/en/Community-Articles/2023-04-11-Top-10-NET-Core-Libraries-Every-Developer-Should-Know/cover1.png new file mode 100644 index 0000000000..2edb48ce42 Binary files /dev/null and b/docs/en/Community-Articles/2023-04-11-Top-10-NET-Core-Libraries-Every-Developer-Should-Know/cover1.png differ diff --git a/docs/en/Community-Articles/2023-04-11-Top-10-NET-Core-Libraries-Every-Developer-Should-Know/cover2.png b/docs/en/Community-Articles/2023-04-11-Top-10-NET-Core-Libraries-Every-Developer-Should-Know/cover2.png new file mode 100644 index 0000000000..2e2a201748 Binary files /dev/null and b/docs/en/Community-Articles/2023-04-11-Top-10-NET-Core-Libraries-Every-Developer-Should-Know/cover2.png differ diff --git a/docs/en/Community-Articles/2023-04-11-Top-10-NET-Core-Libraries-Every-Developer-Should-Know/essential-10-net-libraries-every-developer-must-know.png b/docs/en/Community-Articles/2023-04-11-Top-10-NET-Core-Libraries-Every-Developer-Should-Know/essential-10-net-libraries-every-developer-must-know.png new file mode 100644 index 0000000000..e986bb5719 Binary files /dev/null and b/docs/en/Community-Articles/2023-04-11-Top-10-NET-Core-Libraries-Every-Developer-Should-Know/essential-10-net-libraries-every-developer-must-know.png differ diff --git a/docs/en/Dapper.md b/docs/en/Dapper.md index d9874bbb7c..727d4961c2 100644 --- a/docs/en/Dapper.md +++ b/docs/en/Dapper.md @@ -1,68 +1,69 @@ # Dapper Integration -Dapper is a light-weight and simple database provider. The major benefit of using Dapper is writing T-SQL queries. It provides some extension methods for `IDbConnection` interface. +[Dapper](https://github.com/DapperLib/Dapper) is a simple and lightweight object mapper for .NET. A key feature of Dapper is its [high performance](https://github.com/DapperLib/Dapper#performance) compared to other ORMs. -ABP does not encapsulate many functions for Dapper. ABP Dapper library provides a `DapperRepository` base class based on ABP EntityFrameworkCore module, which provides the `IDbConnection` and `IDbTransaction` properties required by Dapper. +While you can use Dapper as is in your ABP applications, there is also an integration package that simplifies creating repository classes using Dapper. -`IDbConnection` and `IDbTransaction` works well with the [ABP Unit-Of-Work](Unit-Of-Work.md). +> ABP's Dapper integration package is based on Entity Framework Core (EF Core). That means it assumes you will use Dapper mixed with EF Core where EF Core is the primary database provider and you use Dapper when you need to fine-tune your quires and get the maximum performance. See [this article](https://community.abp.io/posts/using-dapper-with-the-abp-framework-shp74p2l) if you want to know why it is like that. ## Installation -Install and configure EF Core according to [EF Core's integrated documentation](Entity-Framework-Core.md). +You can use the [ABP CLI](CLI.md) to install the [Volo.Abp.Dapper](https://www.nuget.org/packages/Volo.Abp.Dapper) package to your project. Execute the following command in the folder of the `.csproj` file that you want to install the package on: -`Volo.Abp.Dapper` is the main nuget package for the Dapper integration. - -You can find it on NuGet Gallery: https://www.nuget.org/packages/Volo.Abp.Dapper - -Install it to your project (for a layered application, to your data/infrastructure layer): - -```shell -Install-Package Volo.Abp.Dapper -``` - -Then add `AbpDapperModule` module dependency (with `DependsOn` attribute) to your [module](Module-Development-Basics.md): - -````C# -using Volo.Abp.Dapper; -using Volo.Abp.Modularity; - -namespace MyCompany.MyProject -{ - [DependsOn(typeof(AbpDapperModule))] - public class MyModule : AbpModule - { - //... - } -} +````bash +abp add-package Volo.Abp.Dapper ```` -## Implement Dapper Repository +> If you haven't done it yet, you first need to install the ABP CLI. For other installation options, see [the package description page](https://abp.io/package-detail/Volo.Abp.Dapper). +> +> If you have a layered solution, it is suggested to install that package to your database layer of the solution. -The following code creates the `PersonRepository`, which requires EF Core's `DbContext` (MyAppDbContext). -You can inject `PersonDapperRepository` to your services for your database operations. +## Implement a Dapper Repository -`DbConnection` and `DbTransaction` comes from the `DapperRepository` base class. +The best way to interact with Dapper is to create a [repository](Repositories.md) class that abstracts your Dapper database operations. The following example creates a new repository class that works with the `People` table: ```C# -public class PersonDapperRepository : DapperRepository, ITransientDependency +public class PersonDapperRepository : + DapperRepository, ITransientDependency { public PersonDapperRepository(IDbContextProvider dbContextProvider) : base(dbContextProvider) { } - public virtual async Task> GetAllPersonNames() + public virtual async Task> GetAllPersonNamesAsync() { var dbConnection = await GetDbConnectionAsync(); - return (await dbConnection.QueryAsync("select Name from People", transaction: await GetDbTransactionAsync())) - .ToList(); + return (await dbConnection.QueryAsync( + "select Name from People", + transaction: await GetDbTransactionAsync()) + ).ToList(); } - public virtual async Task UpdatePersonNames(string name) + public virtual async Task UpdatePersonNamesAsync(string name) { var dbConnection = await GetDbConnectionAsync(); - return await dbConnection.ExecuteAsync("update People set Name = @NewName", new { NewName = name }, - await GetDbTransactionAsync()); + return await dbConnection.ExecuteAsync( + "update People set Name = @NewName", + new { NewName = name }, + await GetDbTransactionAsync() + ); } } ``` + +Let's examine this class: + +- It inherits from the `DapperRepository` class, which provides useful methods and properties for database operations. It also implements the `IUnitOfWorkEnabled` interface, so ABP makes the database connection (and transaction if requested) available in the method body by implementing dynamic proxies (a.k.a. interception). +- It gets an `IDbContextProvider` object where `MyAppDbContext` is type of your Entity Framework Core `DbContext` class. It should be configured as explained in the [EF Core document](Entity-Framework-Core.md). If you've created by ABP's startup template, then it should already be configured. +- The `GetAllPersonNamesAsync` and `UpdatePersonNamesAsync` method's been made `virtual`. That's needed to make the interception process working. +- We've used the `GetDbConnectionAsync` and `GetDbTransactionAsync` methods to obtain the current database connection and transaction (that is managed by ABP's [Unit of Work](Unit-Of-Work.md) system). + +Then you can [inject](Dependency-Injection.md) `PersonDapperRepository` to any service to perform these database operations. If you want to implement a layered solution, we suggest to introduce an `IPersonDapperRepository` interface in your domain layer, implement it in your database later, then inject the interface to use the repository service. + +> If you want to learn more details and examples of using Dapper with the ABP Framework, [check this community article](https://community.abp.io/posts/using-dapper-with-the-abp-framework-shp74p2l). + +## See Also + +* [Community Article: Using Dapper with the ABP Framework](https://community.abp.io/posts/using-dapper-with-the-abp-framework-shp74p2l) +* [Entity Framework Core integration document](Entity-Framework-Core.md) diff --git a/docs/en/Getting-Started-React-Native.md b/docs/en/Getting-Started-React-Native.md index be0505b9f1..df8fb355a5 100644 --- a/docs/en/Getting-Started-React-Native.md +++ b/docs/en/Getting-Started-React-Native.md @@ -56,7 +56,7 @@ Please do the following: > When you are using OpenIddict, You should remove 'clientSecret' on Environment.js (if exists) and disable "HTTPS-only" settings. (Openiddict has default since Version 6.0) ### How to disable Https-only in Openiddict. -You should add this code on `MyProjectName`HttpApiHostModule. +You should add this code on {{ if Tiered == "No" }}`MyProjectNameHttpApiHostModule`{{ else if Tiered == "Yes" }}`MyProjectNameAuthServerModule`{{ end }}. ```csharp public override void PreConfigureServices(ServiceConfigurationContext context) diff --git a/docs/en/Migration-Guides/Abp-7_1.md b/docs/en/Migration-Guides/Abp-7_1.md index 7e579af217..711f520800 100644 --- a/docs/en/Migration-Guides/Abp-7_1.md +++ b/docs/en/Migration-Guides/Abp-7_1.md @@ -2,6 +2,8 @@ This document is a guide for upgrading ABP v7.0 solutions to ABP v7.1. There are a few changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application. +> **Note**: Entity Framework developers may need to add a new code-first database migration to their projects since we made some improvements to the existing entities of some application modules. + ## Navigation Menu - `CustomData` type changed to `Dictionary` `ApplicationMenu` and `ApplicationMenuItem` classes' `CustomData` property type has been changed to `Dictionary`. So, if you use the optional `CustomData` property of these classes, change it accordingly. See [#15608](https://github.com/abpframework/abp/pull/15608) for more information. @@ -16,4 +18,4 @@ var menu = new ApplicationMenu("Home", L["Home"], "/", customData: new MyCustomD ```csharp var menu = new ApplicationMenu("Home", L["Home"], "/").WithCustomData("CustomDataKey", new MyCustomData()); -``` \ No newline at end of file +``` diff --git a/docs/en/Migration-Guides/Abp-7_2.md b/docs/en/Migration-Guides/Abp-7_2.md new file mode 100644 index 0000000000..5c99e8e604 --- /dev/null +++ b/docs/en/Migration-Guides/Abp-7_2.md @@ -0,0 +1,13 @@ +# ABP Version 7.2 Migration Guide + +This document is a guide for upgrading ABP v7.1 solutions to ABP v7.2. There are a few changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application. + +## `LastPasswordChangeTime` and `ShouldChangePasswordOnNextLogin` Properties Added to the `IdentityUser` Class + +In this version, two new properties, which are `LastPasswordChangeTime` and `ShouldChangePasswordOnNextLogin` have been added to the `IdentityUser` class and to the corresponding entity. Therefore, you may need to create a new migration and apply it to your database. + +## Renamed `OnRegistered` Method + +There was a typo in an extension method, named as `OnRegistred`. In this version, we have fixed the typo and renamed the method as `OnRegistered`. Also, we have updated the related places in our modules that use this method. + +However, if you have used this method in your projects, you need to rename it as `OnRegistered` in your code. \ No newline at end of file diff --git a/docs/en/Migration-Guides/Index.md b/docs/en/Migration-Guides/Index.md index 8a693970b2..7d85d3f46f 100644 --- a/docs/en/Migration-Guides/Index.md +++ b/docs/en/Migration-Guides/Index.md @@ -2,6 +2,7 @@ The following documents explain how to migrate your existing ABP applications. We write migration documents only if you need to take an action while upgrading your solution. Otherwise, you can easily upgrade your solution using the [abp update command](../Upgrading.md). +- [7.1 to 7.2](Abp-7_2.md) - [7.0 to 7.1](Abp-7_1.md) - [6.0 to 7.0](Abp-7_0.md) - [5.3 to 6.0](Abp-6_0.md) diff --git a/docs/en/Modules/Cms-Kit/Comments.md b/docs/en/Modules/Cms-Kit/Comments.md index 26aa7c0398..af335f1227 100644 --- a/docs/en/Modules/Cms-Kit/Comments.md +++ b/docs/en/Modules/Cms-Kit/Comments.md @@ -19,6 +19,16 @@ Configure(options => { options.EntityTypes.Add(new CommentEntityTypeDefinition("Product")); options.IsRecaptchaEnabled = true; //false by default + options.AllowedExternalUrls = new Dictionary> + { + { + "quote", + new List + { + "https://abp.io/" + } + } + }; }); ``` @@ -28,6 +38,7 @@ Configure(options => - `EntityTypes`: List of defined entity types(`CmsKitCommentOptions`) in the comment system. - `IsRecaptchaEnabled`: This flag enables or disables the reCaptcha for the comment system. You can set it as **true** if you want to use reCaptcha in your comment system. +- `AllowedExternalUrls`: Indicates the allowed external URLs by entity types, which can be included in a comment. If it's specified for a certain entity type, then only the specified external URLs are allowed in the comments. `CommentEntityTypeDefinition` properties: @@ -46,7 +57,7 @@ The comment system provides a commenting [widget](../../UI/AspNetCore/Widgets.md }) ``` -`entityType` was explained in the previous section. `entityId` should be the unique id of the product, in this example. If you have a Product entity, you can use its Id here. `referralLinks` is an optional parameter. You can use this parameter to add values (such as "nofollow", "noreferrer", or any other values) to the [rel attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel) of links. +`entityType` was explained in the previous section. `entityId` should be the unique id of the product, in this example. If you have a Product entity, you can use its Id here. `referralLinks` is an optional parameter. You can use this parameter to add values (such as "nofollow", "noreferrer", or any other values) to the [rel attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel) of links. ## User Interface diff --git a/docs/en/Themes/LeptonXLite/Angular.md b/docs/en/Themes/LeptonXLite/Angular.md index 56b003e606..3a82c77495 100644 --- a/docs/en/Themes/LeptonXLite/Angular.md +++ b/docs/en/Themes/LeptonXLite/Angular.md @@ -28,12 +28,8 @@ yarn add bootstrap-icons * [Styles - Angular UI](../../UI/Angular/Theme-Configurations.md) -Add the following style - -```json -"node_modules/bootstrap-icons/font/bootstrap-icons.css", -``` - +Note: You should remove the old theme styles from "angular.json" if you are switching from "ThemeBasic" or "Lepton." +Look at the [Theme Configurations](../../UI/Angular/Theme-Configurations) list of styles. Depending on your theme, you can alter your styles in angular.json. - Finally, remove `ThemeBasicModule` from `app.module.ts`, and import the related modules in `app.module.ts` ```js @@ -44,7 +40,7 @@ import { SideMenuLayoutModule } from "@abp/ng.theme.lepton-x/layouts"; imports: [ // ... - // do not forget to remove ThemeBasicModule + // do not forget to remove ThemeBasicModule or other old theme module // ThemeBasicModule.forRoot(), ThemeLeptonXModule.forRoot(), SideMenuLayoutModule.forRoot(), diff --git a/docs/en/UI/Angular/Card-Component.md b/docs/en/UI/Angular/Card-Component.md index 5c92d7abed..861171c39e 100644 --- a/docs/en/UI/Angular/Card-Component.md +++ b/docs/en/UI/Angular/Card-Component.md @@ -1,8 +1,27 @@ # Card Component The ABP Card Component is a wrapper component for the Bootstrap card class. +It supports all the features that Bootstrap card component provides. -## Usage +ABP Card Component has three main components, `CardHeader`, `CardBody` and `CardFooter`. These components have their own class and style inputs + +|Component |Selector |Input Properties | +|--------- |-----------------|------------------------------------| +|CardHeader|`abp-card-header`| `cardHeaderClass`,`cardHeaderStyle`| +|CardBody |`abp-card-body` | `cardBodyClass`,`cardBodyStyle` | +|CardFooter|`abp-card-footer`| `cardFooterClass`,`cardFooterStyle`| + +In addition to these components, the Card component provides directives like `CardHeader`,`CardTitle`,`CardSubtitle`,`CardImgTop`. + +|Directive |Selector | +|-------------|-------------------------------------------------------------| +|CardHeader |`abp-card-header`,`[abp-card-header]`,`[abpCardHeader]` | +|CardTitle |`abp-card-title`,`[abp-card-title]`,`[abpCardTitle]` | +|CardSubtitle |`abp-card-subtitle`,`[abp-card-subtitle]`,`[abpCardSubtitle]`| +|CardImgTop |`abp-card-img-top`,`[abp-card-img-top]`,`[abpCardImgTop]` | + + +# Usage ABP Card Component is a part of the `ThemeSharedModule` module. If you've imported that module into your module, you don't need to import it again. If not, first import it as shown below: @@ -24,29 +43,164 @@ export class MyFeatureModule {} ``` -Then, the `abp-card` component can be used. See the example below: -```ts +Then, the `abp-card` component can be used. See the examples below: +## CardBody + +```ts // card-demo.component.ts import { Component } from '@angular/core'; +@Component({ + selector: 'app-card-demo', + template: ` + + This is some text within a card body + + `, +}) +export class CardDemoComponent { } +``` +See the card body result below: + +![abp-card-body](./images/abp-card-body.png) + +## Titles, Text and Links + +```ts + +//card-demo.component.ts +import { Component } from '@angular/core'; + @Component({ selector: 'app-card-demo', template: ` - Lorem Ipsum - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla commodo condimentum ligula, sed varius nibh eleifend sit amet. Maecenas facilisis vel arcu nec maximus. +
Card Title
+
Card subtitle
+

Some quick example text to build on the card title and make up the bulk of the card's content.

+ Card link + Another link
`, }) export class CardDemoComponent { } ``` +See the card title, text and link result below: + +![abp-card-title-text-link](./images/abp-card-title-text-link.png) + +## Images + +```ts + +//card-demo.component.ts +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-card-demo', + template: ` + + ... + +

Some quick example text to build on the card title and make up the bulk of the card's content.

+
+
+ `, +}) +export class CardDemoComponent { } +``` +See the card image result below: + +![abp-card-image-top](./images/abp-card-image.png) + +## List Groups + +```ts + +//card-demo.component.ts +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-card-demo', + template: ` + +
    +
  • An item
  • +
  • A second item
  • +
  • A third item
  • +
+
+ `, +}) +export class CardDemoComponent { } +``` +See the group list result below: -See the result below: +![abp-card-list-group](./images/abp-card-list-group.png) -![abp-card-component](./images/abp-card-component.png) +## Kitchen Sink + +```ts + +//card-demo.component.ts +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-card-demo', + template: ` + + ... + +
Card title
+

Some quick example text to build on the card title and make up the bulk of the card's content.

+
+
    +
  • An item
  • +
  • A second item
  • +
  • A third item
  • +
+ + Card link + Another link + +
+ `, +}) +export class CardDemoComponent { } +``` +See kitchen sink result below: + +![abp-card-kitchen-sink](./images/abp-card-kitchen-sink.png) + +## Header and Footer + +```ts + +//card-demo.component.ts +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-card-demo', + template: ` + + Featured + +
Special title treatment
+

With supporting text below as a natural lead-in to additional content.

+ Go somewhere +
+ + 2 days ago + +
+ `, +}) +export class CardDemoComponent { } +``` +See the header and footer result below: -As you can see in the example above, you can customize your card component's style with the `cardStyle` input. You can also add your custom classes with the `cardClass` input. +![abp-card-header-footer](./images/abp-card-header-footer.png) diff --git a/docs/en/UI/Angular/Modifying-the-Menu.md b/docs/en/UI/Angular/Modifying-the-Menu.md index b0a3b760fa..c59ce0d650 100644 --- a/docs/en/UI/Angular/Modifying-the-Menu.md +++ b/docs/en/UI/Angular/Modifying-the-Menu.md @@ -88,14 +88,65 @@ function configureRoutes(routes: RoutesService) { } ``` +We can also define a group for navigation elements. It's an optional property + - **Note:** It'll also include groups that were defined at the modules + +```js +// route.provider.ts +import { RoutesService } from '@abp/ng.core'; + +function configureRoutes(routes: RoutesService) { + return () => { + routes.add([ + { + //etc.. + group: 'ModuleName::GroupName' + }, + { + path: '/your-path/child', + name: 'Your child navigation', + parentName: 'Your navigation', + requiredPolicy: 'permission key here', + order: 1, + }, + ]); + }; +} +``` + +To get the route items as grouped we can use the `groupedVisible` (or Observable one `groupedVisible$`) getter methods + - It returns `RouteGroup[]` if there is any group in the route tree, otherwise it returns `undefined` + +```js +import { ABP, RoutesService, RouteGroup } from "@abp/ng.core"; +import { Component } from "@angular/core"; + +@Component(/* component metadata */) +export class AppComponent { + visible: RouteGroup[] | undefined = this.routes.groupedVisible; + //Or + visible$:Observable[] | undefined> = this.routes.groupedVisible$; + + constructor(private routes: RoutesService) {} +} +``` + ...and then in app.module.ts... + - The `groupedVisible` method will return the `Others` group for ungrouped items, the default key is `AbpUi::OthersGroup`, we can change this `key` via the `OTHERS_GROUP` injection token ```js import { NgModule } from '@angular/core'; +import { OTHERS_GROUP } from '@abp/ng.core'; import { APP_ROUTE_PROVIDER } from './route.provider'; @NgModule({ - providers: [APP_ROUTE_PROVIDER], + providers: [ + APP_ROUTE_PROVIDER, + { + provide: OTHERS_GROUP, + useValue: 'ModuleName::MyOthersGroupKey', + }, + ], // imports, declarations, and bootstrap }) export class AppModule {} @@ -109,8 +160,9 @@ Here is what every property works as: - `requiredPolicy` is the permission key to access the page. See the [Permission Management document](./Permission-Management.md) - `order` is the order of the navigation element. "Administration" has an order of `100`, so keep that in mind when ordering top level menu items. - `iconClass` is the class of the `i` tag, which is placed to the left of the navigation label. -- `layout` defines in which layout the route will be loaded. (default: `eLayoutType.empty`) +- `layout` defines in which layout the route is loaded. (default: `eLayoutType.empty`) - `invisible` makes the item invisible in the menu. (default: `false`) +- `group` is an optional property that is used to group together related routes in an application. (type: `string`, default: `AbpUi::OthersGroup`) ### Via `routes` Property in `AppRoutingModule` diff --git a/docs/en/UI/Angular/Page-Alerts.md b/docs/en/UI/Angular/Page-Alerts.md index a27cee4abf..96371908f9 100644 --- a/docs/en/UI/Angular/Page-Alerts.md +++ b/docs/en/UI/Angular/Page-Alerts.md @@ -61,4 +61,21 @@ this.service.show({ ![angular-page-alert-with-params-example](./images/page-alert-with-params-example.png) +## Render HTML content +We can pass html content to the `title` and `message` parameters + + +* It allows static message or localization key +* [abpSafeHtml](https://github.com/abpframework/abp/blob/37b59a7f05202264505d002397dbb27d275740e1/npm/ng-packs/packages/core/src/lib/pipes/safe-html.pipe.ts#L6) pipe will sanitize html values + +```typescript +this.service.show({ + type: 'success', + title: `New blog published`, + message: 'AbpApp::HtmlMessageWithParams{0}', + messageLocalizationParams: ['admin'], +}); +``` + +![angular-page-alert-with-html-example](./images/page-alert-with-html-example.png) diff --git a/docs/en/UI/Angular/images/abp-card-body.png b/docs/en/UI/Angular/images/abp-card-body.png new file mode 100644 index 0000000000..d5d7d07d29 Binary files /dev/null and b/docs/en/UI/Angular/images/abp-card-body.png differ diff --git a/docs/en/UI/Angular/images/abp-card-header-footer.png b/docs/en/UI/Angular/images/abp-card-header-footer.png new file mode 100644 index 0000000000..72f0d7be45 Binary files /dev/null and b/docs/en/UI/Angular/images/abp-card-header-footer.png differ diff --git a/docs/en/UI/Angular/images/abp-card-header.png b/docs/en/UI/Angular/images/abp-card-header.png new file mode 100644 index 0000000000..a13ed5b3fe Binary files /dev/null and b/docs/en/UI/Angular/images/abp-card-header.png differ diff --git a/docs/en/UI/Angular/images/abp-card-image.png b/docs/en/UI/Angular/images/abp-card-image.png new file mode 100644 index 0000000000..c4136d524b Binary files /dev/null and b/docs/en/UI/Angular/images/abp-card-image.png differ diff --git a/docs/en/UI/Angular/images/abp-card-kitchen-sink.png b/docs/en/UI/Angular/images/abp-card-kitchen-sink.png new file mode 100644 index 0000000000..908e062ff0 Binary files /dev/null and b/docs/en/UI/Angular/images/abp-card-kitchen-sink.png differ diff --git a/docs/en/UI/Angular/images/abp-card-list-group.png b/docs/en/UI/Angular/images/abp-card-list-group.png new file mode 100644 index 0000000000..aa7b746647 Binary files /dev/null and b/docs/en/UI/Angular/images/abp-card-list-group.png differ diff --git a/docs/en/UI/Angular/images/abp-card-title-text-link.png b/docs/en/UI/Angular/images/abp-card-title-text-link.png new file mode 100644 index 0000000000..af7d009929 Binary files /dev/null and b/docs/en/UI/Angular/images/abp-card-title-text-link.png differ diff --git a/docs/en/UI/Angular/images/page-alert-with-html-example.png b/docs/en/UI/Angular/images/page-alert-with-html-example.png new file mode 100644 index 0000000000..a07133faf2 Binary files /dev/null and b/docs/en/UI/Angular/images/page-alert-with-html-example.png differ diff --git a/docs/en/UI/AspNetCore/Tag-Helpers/Form-elements.md b/docs/en/UI/AspNetCore/Tag-Helpers/Form-elements.md index 15a8b0819c..54e9712d30 100644 --- a/docs/en/UI/AspNetCore/Tag-Helpers/Form-elements.md +++ b/docs/en/UI/AspNetCore/Tag-Helpers/Form-elements.md @@ -58,49 +58,49 @@ Model: ### Attributes -You can set some of the attributes on your c# property, or directly on html tag. If you are going to use this property in a [abp-dynamic-form](Dynamic-forms.md), then you can only set these properties via property attributes. +You can set some of the attributes on your c# property, or directly on HTML tag. If you are going to use this property in a [abp-dynamic-form](Dynamic-forms.md), then you can only set these properties via property attributes. #### Property Attributes - `[TextArea()]`: Converts the input into a text area. -* `[Placeholder()]`: Sets placeholder for input. You can use a localization key directly. -* `[InputInfoText()]`: Sets a small info text for input. You can use a localization key directly. -* `[FormControlSize()]`: Sets size of form-control wrapper element. Available values are +* `[Placeholder()]`: Sets the description are of the input. You can use a localization key directly. +* `[InputInfoText()]`: Sets text for the input. You can directly use a localization key. +* `[FormControlSize()]`: Sets the size of the form-control wrapper element. Available values are - `AbpFormControlSize.Default` - `AbpFormControlSize.Small` - `AbpFormControlSize.Medium` - `AbpFormControlSize.Large` -* `[DisabledInput]` : Input is disabled. -* `[ReadOnlyInput]`: Input is read-only. +* `[DisabledInput]` : Sets the input as disabled. +* `[ReadOnlyInput]`: Sets the input as read-only. #### Tag Attributes -* `info`: Sets a small info text for input. You can use a localization key directly. -* `auto-focus`: If true, browser auto focuses on the element. -* `size`: Sets size of form-control wrapper element. Available values are +* `info`: Sets text for the input. You can directly use a localization key. +* `auto-focus`: It lets the browser set focus to the element when its value is true. +* `size`: Sets the size of the form-control wrapper element. Available values are - `AbpFormControlSize.Default` - `AbpFormControlSize.Small` - `AbpFormControlSize.Medium` - `AbpFormControlSize.Large` -* `disabled`: Input is disabled. -* `readonly`: Input is read-only. -* `label`: Sets the label for input. -* `display-required-symbol`: Adds the required symbol (*) to label if input is required. Default `True`. +* `disabled`: Sets the input as disabled. +* `readonly`: Sets the input as read-only. +* `label`: Sets the label of input. +* `required-symbol`: Adds the required symbol `(*)` to the label when the input is required. The default value is `True`. `asp-format`, `name` and `value` attributes of [Asp.Net Core Input Tag Helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms?view=aspnetcore-7.0#the-input-tag-helper) are also valid for `abp-input` tag helper. ### Label & Localization -You can set label of your input in different ways: +You can set the label of the input in several ways: -- You can use `Label` attribute and directly set the label. But it doesn't auto localize your localization key. So use it as `label="@L["{LocalizationKey}"].Value"`. -- You can set it using `[Display(name="{LocalizationKey}")]` attribute of Asp.Net Core. +- You can use the `Label` attribute to set the label directly. This property does not automatically localize the text. To localize the label, use `label="@L["{LocalizationKey}"].Value"`. +- You can set it using `[Display(name="{LocalizationKey}")]` attribute of ASP.NET Core. - You can just let **abp** find the localization key for the property. It will try to find "DisplayName:{PropertyName}" or "{PropertyName}" localization keys, if `label` or `[DisplayName]` attributes are not set. ## abp-select -`abp-select` tag creates a Bootstrap form select for a given c# property. It uses [Asp.Net Core Select Tag Helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms?view=aspnetcore-7.0#the-select-tag-helper) in background, so every data annotation attribute of `select` tag helper of Asp.Net Core is also valid for `abp-select`. +`abp-select` tag creates a Bootstrap form select for a given c# property. It uses [ASP.NET Core Select Tag Helper](https://docs.microsoft.com/tr-tr/aspnet/core/mvc/views/working-with-forms?view=aspnetcore-3.1#the-select-tag-helper) in background, so every data annotation attribute of `select` tag helper of ASP.NET Core is also valid for `abp-select`. `abp-select` tag needs a list of `Microsoft.AspNetCore.Mvc.Rendering.SelectListItem ` to work. It can be provided by `asp-items` attriube on the tag or `[SelectItems()]` attribute on c# property. (if you are using [abp-dynamic-form](Dynamic-forms.md), c# attribute is the only way.) @@ -170,14 +170,14 @@ Model: ### Attributes -You can set some of the attributes on your c# property, or directly on html tag. If you are going to use this property in a [abp-dynamic-form](Dynamic-forms.md), then you can only set these properties via property attributes. +You can set some of the attributes on your c# property, or directly on HTML tag. If you are going to use this property in a [abp-dynamic-form](Dynamic-forms.md), then you can only set these properties via property attributes. #### Property Attributes * `[SelectItems()]`: Sets the select data. Parameter should be the name of the data list. (see example above) -- `[InputInfoText()]`: Sets a small info text for input. You can use a localization key directly. -- `[FormControlSize()]`: Sets size of form-control wrapper element. Available values are +- `[InputInfoText()]`: Sets text for the input. You can directly use a localization key. +- `[FormControlSize()]`: Sets the size of the form-control wrapper element. Available values are - `AbpFormControlSize.Default` - `AbpFormControlSize.Small` - `AbpFormControlSize.Medium` @@ -186,21 +186,21 @@ You can set some of the attributes on your c# property, or directly on html tag. #### Tag Attributes - `asp-items`: Sets the select data. This Should be a list of SelectListItem. -- `info`: Sets a small info text for input. You can use a localization key directly. -- `size`: Sets size of form-control wrapper element. Available values are +- `info`: Sets text for the input. You can directly use a localization key. +- `size`: Sets the size of the form-control wrapper element. Available values are - `AbpFormControlSize.Default` - `AbpFormControlSize.Small` - `AbpFormControlSize.Medium` - `AbpFormControlSize.Large` -- `label`: Sets the label for input. -- `display-required-symbol`: Adds the required symbol (*) to label if input is required. Default `True`. +- `label`: Sets the label of input. +- `required-symbol`: Adds the required symbol `(*)` to the label when the input is required. The default value is `True`. ### Label & Localization -You can set label of your input in different ways: +You can set the label of the input in several ways: - You can use `Label` attribute and directly set the label. But it doesn't auto localize your localization key. So use it as `label="@L["{LocalizationKey}"].Value".` -- You can set it using `[Display(name="{LocalizationKey}")]` attribute of Asp.Net Core. +- You can set it using `[Display(name="{LocalizationKey}")]` attribute of ASP.NET Core. - You can just let **abp** find the localization key for the property. It will try to find "DisplayName:{PropertyName}" or "{PropertyName}" localization keys. Localizations of combobox values are set by `abp-select` for **Enum** property. It searches for "{EnumTypeName}.{EnumPropertyName}" or "{EnumPropertyName}" localization keys. For instance, in the example above, it will use "CarType.StationWagon" or "StationWagon" keys for localization when it localizes combobox values. @@ -251,7 +251,7 @@ Model: ### Attributes -You can set some of the attributes on your c# property, or directly on html tag. If you are going to use this property in a [abp-dynamic-form](Dynamic-forms.md), then you can only set these properties via property attributes. +You can set some of the attributes on your c# property, or directly on HTML tag. If you are going to use this property in a [abp-dynamic-form](Dynamic-forms.md), then you can only set these properties via property attributes. #### Property Attributes @@ -261,3 +261,172 @@ You can set some of the attributes on your c# property, or directly on html tag. - `asp-items`: Sets the select data. This Should be a list of SelectListItem. - `Inline`: If true, radio buttons will be in single line, next to each other. If false, they will be under each other. + +## abp-date-picker & abp-date-range-picker + +`abp-date-picker` and `abp-date-range-picker` tags creates a Bootstrap form date picker for a given c# property. `abp-date-picker` is for single date selection, `abp-date-range-picker` is for date range selection. It uses [datepicker](https://www.daterangepicker.com/) jQuery plugin. + +Usage: + +````xml + + + +```` + +Model: + +````csharp + public class FormElementsModel : PageModel + { + public SampleModel MyModel { get; set; } + + public DynamicForm DynamicFormExample { get; set; } + + public void OnGet() + { + MyModel = new SampleModel(); + + DynamicFormExample = new DynamicForm(); + } + + public class SampleModel + { + public DateTime MyDate { get; set; } + + public DateTime MyDateRangeStart { get; set; } + + public DateTime MyDateRangeEnd { get; set; } + } + + public class DynamicForm + { + [DateRangePicker("MyPicker",true)] + public DateTime StartDate { get; set; } + + [DateRangePicker("MyPicker",false)] + [DatePickerOptions(nameof(DatePickerOptions))] + public DateTime EndDate { get; set; } + + public DateTime DateTime { get; set; } + + public DynamicForm() + { + StartDate = DateTime.Now; + EndDate = DateTime.Now; + DateTime = DateTime.Now; + } + } + + public AbpDatePickerOptions DatePickerOptions { get; set; } + } +```` + +### Attributes + +You can set some of the attributes on your c# property, or directly on HTML tag. If you are going to use this property in a [abp-dynamic-form](Dynamic-forms.md), then you can only set these properties via property attributes. + +#### Property Attributes + +* `[Placeholder()]`: Sets the description are of the input. You can use a localization key directly. +* `[InputInfoText()]`: Sets text for the input. You can directly use a localization key. +* `[FormControlSize()]`: Sets the size of the form-control wrapper element. Available values are + - `AbpFormControlSize.Default` + - `AbpFormControlSize.Small` + - `AbpFormControlSize.Medium` + - `AbpFormControlSize.Large` +* `[DisabledInput]` : Sets the input as disabled. +* `[ReadOnlyInput]`: Sets the input as read-only. +- `[DatePickerOptions()]`: Sets the predefined options of the date picker. Parameter should be the name of the options property (see example above). See the available [datepicker options](https://www.daterangepicker.com/#options). You can use a localization key directly. + +##### abp-date-picker +`[DatePicker]` : Sets the input as datepicker. Especially for string properties. + +##### abp-date-range-picker +`[DateRangePicker()]` : Sets the picker id for the date range picker. You can set the property as a start date by setting IsStart=true or leave it as default/false to set it as an end date. + +#### Tag Attributes + +* `info`: Sets text for the input. You can directly use a localization key. +* `auto-focus`: It lets the browser set focus to the element when its value is true. +* `size`: Sets the size of the form-control wrapper element. Available values are + - `AbpFormControlSize.Default` + - `AbpFormControlSize.Small` + - `AbpFormControlSize.Medium` + - `AbpFormControlSize.Large` +* `disabled`: Sets the input as disabled. +* `readonly`: Sets the input as read-only. +* `label`: Sets the label of input. +* `required-symbol`: Adds the required symbol `(*)` to the label when the input is required. The default value is `True`. +* `open-button`: A button to open the datepicker will be added when its `True`. The default value is `True`. +* `clear-button`: A button to clear the datepicker will be added when its `True`. The default value is `True`. +* `single-open-and-clear-button`: Shows the open and clear buttons in a single button when it's `True`. The default value is `True`. +* `is-utc`: Converts the date to UTC when its `True`. The default value is `False`. +* `is-iso`: Converts the date to ISO format when its `True`. The default value is `False`. +* `date-format`: Sets the date format of the input. The default format is the user's culture date format. You need to provide a JavaScript date format convention. Eg: `YYYY-MM-DDTHH:MM:SSZ`. +* `date-separator`: Sets a character to separate start and end dates. The default value is `-` +* Other non-mapped attributes will be automatically added to the input element as is. See the available [datepicker options](https://www.daterangepicker.com/#options). Eg: `data-start-date="2020-01-01"` + +##### abp-date-picker + +* `asp-date`: Sets the date value. This should be a `DateTime`, `DateTime?`, `DateTimeOffset`, `DateTimeOffset?` or `string` value. + +##### abp-date-range-picker + +* `asp-for-start`: Sets the start date value. This should be a `DateTime`, `DateTime?`, `DateTimeOffset`, `DateTimeOffset?` or `string` value. +* `asp-for-end`: Sets the end date value. This should be a `DateTime`, `DateTime?`, `DateTimeOffset`, `DateTimeOffset?` or `string` value. + +### Label & Localization + +You can set the label of the input in several ways: + +- You can use the `Label` attribute to set the label directly. This property does not automatically localize the text. To localize the label, use `label="@L["{LocalizationKey}"].Value"`. +- You can set it using `[Display(name="{LocalizationKey}")]` attribute ASP.NET Core. +- You can just let **abp** find the localization key for the property. If the `label` or `[DisplayName]` attributes are not set, it tries to find the localization by convention. For example `DisplayName:{YourPropertyName}` or `{YourPropertyName}`. If your property name is FullName, it will search for `DisplayName:FullName` or `{FullName}`. + +### JavaScript Usage + +````javascript +var newPicker = abp.libs.bootstrapDateRangePicker.createDateRangePicker( + { + label: "New Picker", + } +); +newPicker.insertAfter($('body')); +```` + +````javascript +var newPicker = abp.libs.bootstrapDateRangePicker.createSinglePicker( + { + label: "New Picker", + } +); +newPicker.insertAfter($('body')); +```` + +#### Options + +* `label`: Sets the label of the input. +* `placeholder`: Sets the placeholder of the input. +* `value`: Sets the value of the input. +* `name`: Sets the name of the input. +* `id`: Sets the id of the input. +* `required`: Sets the input as required. +* `disabled`: Sets the input as disabled. +* `readonly`: Sets the input as read-only. +* `size`: Sets the size of the form-control wrapper element. Available values are + - `AbpFormControlSize.Default` + - `AbpFormControlSize.Small` + - `AbpFormControlSize.Medium` + - `AbpFormControlSize.Large` +* `openButton`: A button to open the datepicker will be added when its `True`. The default value is `True`. +* `clearButton`: A button to clear the datepicker will be added when its `True`. The default value is `True`. +* `singleOpenAndClearButton`: Shows the open and clear buttons in a single button when it's `True`. The default value is `True`. +* `isUtc`: Converts the date to UTC when its `True`. The default value is `False`. +* `isIso`: Converts the date to ISO format when its `True`. The default value is `False`. +* `dateFormat`: Sets the date format of the input. The default format is the user's culture date format. You need to provide a JavaScript date format convention. Eg: `YYYY-MM-DDTHH:MM:SSZ`. +* `dateSeparator`: Sets a character to separate start and end dates. The default value is `-`. +* `startDateName`: Sets the name of the hidden start date input. +* `endDateName`: Sets the name of the hidden end date input. +* `dateName`: Sets the name of the hidden date input. +* Other [datepicker options](https://www.daterangepicker.com/#options). Eg: `startDate: "2020-01-01"`. \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs index 9a6a40a17a..aa48ad633b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs +++ b/framework/src/Volo.Abp.AspNetCore.Components.Web/Volo/Abp/AspNetCore/Components/Web/Extensibility/TableColumns/TableColumn.cs @@ -10,14 +10,22 @@ public class TableColumn { public string Title { get; set; } public string Data { get; set; } + + public string PropertyName { get; set; } + [CanBeNull] public string DisplayFormat { get; set; } + public IFormatProvider DisplayFormatProvider { get; set; } = CultureInfo.CurrentCulture; + [CanBeNull] public Type Component { get; set; } + public List Actions { get; set; } + [CanBeNull] public Func ValueConverter { get; set; } + public bool Sortable { get; set; } public TableColumn() diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs index 447861a788..5956e4f7d3 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/AbpAspNetCoreMultiTenancyOptions.cs @@ -3,7 +3,10 @@ using System.Globalization; using System.Net; using System.Text.Encodings.Web; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Extensions; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.MultiTenancy; @@ -27,28 +30,55 @@ public class AbpAspNetCoreMultiTenancyOptions TenantKey = TenantResolverConsts.DefaultTenantKey; MultiTenancyMiddlewareErrorPageBuilder = async (context, exception) => { - // Try to delete the tenant's cookie if it does not exist or is inactive. + var isCookieAuthentication = false; var tenantResolveResult = context.RequestServices.GetRequiredService().Result; - if (tenantResolveResult != null && - tenantResolveResult.AppliedResolvers.Contains(CookieTenantResolveContributor.ContributorName)) + if (tenantResolveResult != null) { + if (tenantResolveResult.AppliedResolvers.Count == 1 && tenantResolveResult.AppliedResolvers.Contains(CurrentUserTenantResolveContributor.ContributorName)) + { + var authenticationType = context.User.Identity?.AuthenticationType; + if (authenticationType != null) + { + var scheme = await context.RequestServices.GetRequiredService().GetHandlerAsync(context, authenticationType); + if (scheme is CookieAuthenticationHandler cookieAuthenticationHandler) + { + // Try to delete the authentication's cookie if it does not exist or is inactive. + await cookieAuthenticationHandler.SignOutAsync(null); + isCookieAuthentication = true; + } + } + } + var options = context.RequestServices.GetRequiredService>().Value; - AbpMultiTenancyCookieHelper.SetTenantCookie(context, null, options.TenantKey); + if (tenantResolveResult.AppliedResolvers.Contains(CookieTenantResolveContributor.ContributorName) || + context.Request.Cookies.ContainsKey(options.TenantKey)) + { + // Try to delete the tenant's cookie if it does not exist or is inactive. + AbpMultiTenancyCookieHelper.SetTenantCookie(context, null, options.TenantKey); + } } - context.Response.Headers.Add("Abp-Tenant-Resolve-Error", exception.Message); - context.Response.StatusCode = (int)HttpStatusCode.NotFound; - context.Response.ContentType = "text/html"; + if (isCookieAuthentication && context.Request.Method.Equals("Get", StringComparison.OrdinalIgnoreCase) && !context.Request.IsAjax()) + { + context.Response.Headers.Add("Abp-Tenant-Resolve-Error", exception.Message); + context.Response.Redirect(context.Request.GetEncodedUrl()); + } + else + { + context.Response.Headers.Add("Abp-Tenant-Resolve-Error", exception.Message); + context.Response.StatusCode = (int)HttpStatusCode.NotFound; + context.Response.ContentType = "text/html"; - var message = exception.Message; - var details = exception is BusinessException businessException ? businessException.Details : string.Empty; + var message = exception.Message; + var details = exception is BusinessException businessException ? businessException.Details : string.Empty; - await context.Response.WriteAsync($"\r\n"); - await context.Response.WriteAsync($"

{HtmlEncoder.Default.Encode(message)}

{HtmlEncoder.Default.Encode(details)}
\r\n"); - await context.Response.WriteAsync("\r\n"); + await context.Response.WriteAsync($"\r\n"); + await context.Response.WriteAsync($"

{HtmlEncoder.Default.Encode(message)}

{HtmlEncoder.Default.Encode(details)}
\r\n"); + await context.Response.WriteAsync("\r\n"); - // Note the 500 spaces are to work around an IE 'feature' - await context.Response.WriteAsync(new string(' ', 500)); + // Note the 500 spaces are to work around an IE 'feature' + await context.Response.WriteAsync(new string(' ', 500)); + } return true; }; diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs index 00b3f87056..89ae55b3b1 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/MultiTenancyMiddleware.cs @@ -5,6 +5,8 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.RequestLocalization; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Localization; @@ -15,6 +17,8 @@ namespace Volo.Abp.AspNetCore.MultiTenancy; public class MultiTenancyMiddleware : IMiddleware, ITransientDependency { + public ILogger Logger { get; set; } + private readonly ITenantConfigurationProvider _tenantConfigurationProvider; private readonly ICurrentTenant _currentTenant; private readonly AbpAspNetCoreMultiTenancyOptions _options; @@ -26,6 +30,8 @@ public class MultiTenancyMiddleware : IMiddleware, ITransientDependency IOptions options, ITenantResolveResultAccessor tenantResolveResultAccessor) { + Logger = NullLogger.Instance; + _tenantConfigurationProvider = tenantConfigurationProvider; _currentTenant = currentTenant; _tenantResolveResultAccessor = tenantResolveResultAccessor; @@ -41,6 +47,8 @@ public class MultiTenancyMiddleware : IMiddleware, ITransientDependency } catch (Exception e) { + Logger.LogException(e); + if (await _options.MultiTenancyMiddlewareErrorPageBuilder(context, e)) { return; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs index 733d56b1f2..1379b63d7c 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpDynamicformTagHelperService.cs @@ -15,6 +15,7 @@ using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Extensions; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Grid; +using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form; @@ -161,6 +162,10 @@ public class AbpDynamicFormTagHelperService : AbpTagHelperService(); + abpDateInputTagHelper.AspFor = model; + abpDateInputTagHelper.ViewContext = TagHelper.ViewContext; + abpDateInputTagHelper.DisplayRequiredSymbol = TagHelper.RequiredSymbols ?? true; + return abpDateInputTagHelper; + } + + private AbpTagHelper GetAbpDateRangeInputTagHelper(TagHelperContext context, TagHelperOutput output, ModelExpression model) + { + var modelAttribute = model.ModelExplorer.GetAttribute(); + + var pickerId = modelAttribute.PickerId; + + var abpDateRangeInputTagHelper = _serviceProvider.GetRequiredService(); + abpDateRangeInputTagHelper.PickerId = pickerId; + abpDateRangeInputTagHelper.ViewContext = TagHelper.ViewContext; + + if (modelAttribute.IsStart) + { + abpDateRangeInputTagHelper.AspForStart = model; + + var otherModelExists = TryToGetOtherDateModel(model, pickerId, out var otherModel); + if (otherModelExists && otherModel.GetAttribute().IsEnd) + { + abpDateRangeInputTagHelper.AspForEnd = ModelExplorerToModelExpressionConverter(otherModel); + } + } + + return abpDateRangeInputTagHelper; + } + + private bool TryToGetOtherDateModel(ModelExpression model, string pickerId, out ModelExplorer otherModel) + { + otherModel = TagHelper.Model.ModelExplorer.Properties.SingleOrDefault(x => x != model.ModelExplorer && x.GetAttribute()?.PickerId == pickerId); + return otherModel != null; + } + + private static bool IsDateRangeGroup(ModelExplorer modelModelExplorer) + { + return modelModelExplorer.GetAttribute() != null; + } + protected virtual void RemoveFormGroupItemsNotInModel(TagHelperContext context, TagHelperOutput output, List items) { var models = GetModels(context, output); @@ -311,6 +374,25 @@ public class AbpDynamicFormTagHelperService : AbpTagHelperService() != null || + model.ModelExplorer.GetAttribute() != null) + { + return true; + } + + if (model.Metadata.ModelType == typeof(DateTime) || + model.Metadata.ModelType == typeof(DateTime?) || + model.Metadata.ModelType == typeof(DateTimeOffset) || + model.Metadata.ModelType == typeof(DateTimeOffset?)) + { + return true; + } + + return false; + } + protected virtual bool IsEnum(ModelExplorer explorer) { return explorer.Metadata.IsEnum; 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 0a3d1e1c08..a3cecfa471 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 @@ -294,8 +294,10 @@ public class AbpInputTagHelperService : AbpTagHelperService { return ""; } + + var isHaveRequiredAttribute = context.AllAttributes.Any(a => a.Name == "required"); - return TagHelper.AspFor.ModelExplorer.GetAttribute() != null ? " * " : ""; + return TagHelper.AspFor.ModelExplorer.GetAttribute() != null || isHaveRequiredAttribute ? " * " : ""; } protected virtual string GetInfoAsHtml(TagHelperContext context, TagHelperOutput output, TagHelperOutput inputTag, bool isCheckbox) 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 73a49ea82d..f7fa9802ad 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 @@ -197,8 +197,10 @@ public class AbpSelectTagHelperService : AbpTagHelperService { return ""; } + + var isHaveRequiredAttribute = context.AllAttributes.Any(a => a.Name == "required"); - return TagHelper.AspFor.ModelExplorer.GetAttribute() != null ? " * " : ""; + return TagHelper.AspFor.ModelExplorer.GetAttribute() != null || isHaveRequiredAttribute ? " * " : ""; } protected virtual void AddInfoTextId(TagHelperOutput inputTagHelperOutput) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs new file mode 100644 index 0000000000..10923f25af --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelper.cs @@ -0,0 +1,215 @@ +using System; +using System.Collections.Generic; +using Microsoft.AspNetCore.Razor.TagHelpers; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; + +public abstract class + AbpDatePickerBaseTagHelper : AbpTagHelper>, IAbpDatePickerOptions + where TTagHelper : AbpDatePickerBaseTagHelper + +{ + private readonly IAbpDatePickerOptions _abpDatePickerOptionsImplementation; + + public string Label { get; set; } + + public string LabelTooltip { get; set; } + + public string LabelTooltipIcon { get; set; } = "bi-info-circle"; + + public string LabelTooltipPlacement { get; set; } = "right"; + + public bool LabelTooltipHtml { get; set; } = false; + + [HtmlAttributeName("info")] + public string InfoText { get; set; } + + [HtmlAttributeName("disabled")] + public bool IsDisabled { get; set; } = false; + + [HtmlAttributeName("readonly")] + public bool? IsReadonly { get; set; } = false; + + public bool AutoFocus { get; set; } + + public AbpFormControlSize Size { get; set; } = AbpFormControlSize.Default; + + [HtmlAttributeName("required-symbol")] + public bool DisplayRequiredSymbol { get; set; } = true; + + public string Name { get; set; } + + public string Value { get; set; } + + public bool SuppressLabel { get; set; } + + protected AbpDatePickerBaseTagHelper(AbpDatePickerBaseTagHelperService service) : base(service) + { + _abpDatePickerOptionsImplementation = new AbpDatePickerOptions(); + } + + public string PickerId { + get => _abpDatePickerOptionsImplementation.PickerId; + set => _abpDatePickerOptionsImplementation.PickerId = value; + } + + public DateTime? MinDate { + get => _abpDatePickerOptionsImplementation.MinDate; + set => _abpDatePickerOptionsImplementation.MinDate = value; + } + + public DateTime? MaxDate { + get => _abpDatePickerOptionsImplementation.MaxDate; + set => _abpDatePickerOptionsImplementation.MaxDate = value; + } + + public object MaxSpan { + get => _abpDatePickerOptionsImplementation.MaxSpan; + set => _abpDatePickerOptionsImplementation.MaxSpan = value; + } + + public bool? ShowDropdowns { + get => _abpDatePickerOptionsImplementation.ShowDropdowns; + set => _abpDatePickerOptionsImplementation.ShowDropdowns = value; + } + + public int? MinYear { + get => _abpDatePickerOptionsImplementation.MinYear; + set => _abpDatePickerOptionsImplementation.MinYear = value; + } + + public int? MaxYear { + get => _abpDatePickerOptionsImplementation.MaxYear; + set => _abpDatePickerOptionsImplementation.MaxYear = value; + } + + public AbpDatePickerWeekNumbers WeekNumbers { + get => _abpDatePickerOptionsImplementation.WeekNumbers; + set => _abpDatePickerOptionsImplementation.WeekNumbers = value; + } + + public bool? TimePicker { + get => _abpDatePickerOptionsImplementation.TimePicker; + set => _abpDatePickerOptionsImplementation.TimePicker = value; + } + + public int? TimePickerIncrement { + get => _abpDatePickerOptionsImplementation.TimePickerIncrement; + set => _abpDatePickerOptionsImplementation.TimePickerIncrement = value; + } + + public bool? TimePicker24Hour { + get => _abpDatePickerOptionsImplementation.TimePicker24Hour; + set => _abpDatePickerOptionsImplementation.TimePicker24Hour = value; + } + + public bool? TimePickerSeconds { + get => _abpDatePickerOptionsImplementation.TimePickerSeconds; + set => _abpDatePickerOptionsImplementation.TimePickerSeconds = value; + } + + public List Ranges { + get => _abpDatePickerOptionsImplementation.Ranges; + set => _abpDatePickerOptionsImplementation.Ranges = value; + } + + public bool? ShowCustomRangeLabel { + get => _abpDatePickerOptionsImplementation.ShowCustomRangeLabel; + set => _abpDatePickerOptionsImplementation.ShowCustomRangeLabel = value; + } + + public bool? AlwaysShowCalendars { + get => _abpDatePickerOptionsImplementation.AlwaysShowCalendars; + set => _abpDatePickerOptionsImplementation.AlwaysShowCalendars = value; + } + + public AbpDatePickerOpens Opens { + get => _abpDatePickerOptionsImplementation.Opens; + set => _abpDatePickerOptionsImplementation.Opens = value; + } + + public AbpDatePickerDrops Drops { + get => _abpDatePickerOptionsImplementation.Drops; + set => _abpDatePickerOptionsImplementation.Drops = value; + } + + public string ButtonClasses { + get => _abpDatePickerOptionsImplementation.ButtonClasses; + set => _abpDatePickerOptionsImplementation.ButtonClasses = value; + } + + public string TodayButtonClasses { + get => _abpDatePickerOptionsImplementation.TodayButtonClasses; + set => _abpDatePickerOptionsImplementation.TodayButtonClasses = value; + } + + public string ApplyButtonClasses { + get => _abpDatePickerOptionsImplementation.ApplyButtonClasses; + set => _abpDatePickerOptionsImplementation.ApplyButtonClasses = value; + } + + public string ClearButtonClasses { + get => _abpDatePickerOptionsImplementation.ClearButtonClasses; + set => _abpDatePickerOptionsImplementation.ClearButtonClasses = value; + } + + public object Locale { + get => _abpDatePickerOptionsImplementation.Locale; + set => _abpDatePickerOptionsImplementation.Locale = value; + } + + public bool? AutoApply { + get => _abpDatePickerOptionsImplementation.AutoApply; + set => _abpDatePickerOptionsImplementation.AutoApply = value; + } + + public bool? LinkedCalendars { + get => _abpDatePickerOptionsImplementation.LinkedCalendars; + set => _abpDatePickerOptionsImplementation.LinkedCalendars = value; + } + + public bool? AutoUpdateInput { + get => _abpDatePickerOptionsImplementation.AutoUpdateInput; + set => _abpDatePickerOptionsImplementation.AutoUpdateInput = value; + } + + public string ParentEl { + get => _abpDatePickerOptionsImplementation.ParentEl; + set => _abpDatePickerOptionsImplementation.ParentEl = value; + } + + public string DateFormat { + get => _abpDatePickerOptionsImplementation.DateFormat; + set => _abpDatePickerOptionsImplementation.DateFormat = value; + } + + public bool OpenButton { + get => _abpDatePickerOptionsImplementation.OpenButton; + set => _abpDatePickerOptionsImplementation.OpenButton = value; + } + + public bool ClearButton { + get => _abpDatePickerOptionsImplementation.ClearButton; + set => _abpDatePickerOptionsImplementation.ClearButton = value; + } + + public bool SingleOpenAndClearButton { + get => _abpDatePickerOptionsImplementation.SingleOpenAndClearButton; + set => _abpDatePickerOptionsImplementation.SingleOpenAndClearButton = value; + } + + public bool? IsUtc { + get => _abpDatePickerOptionsImplementation.IsUtc; + set => _abpDatePickerOptionsImplementation.IsUtc = value; + } + + public bool? IsIso { + get => _abpDatePickerOptionsImplementation.IsIso; + set => _abpDatePickerOptionsImplementation.IsIso = value; + } + + public object Options { + get => _abpDatePickerOptionsImplementation.Options; + set => _abpDatePickerOptionsImplementation.Options = value; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs new file mode 100644 index 0000000000..82273097cf --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs @@ -0,0 +1,712 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text.Encodings.Web; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Localization.Resources.AbpUi; +using Microsoft.AspNetCore.Mvc.Rendering; +using Microsoft.AspNetCore.Mvc.TagHelpers; +using Microsoft.AspNetCore.Mvc.ViewFeatures; +using Microsoft.AspNetCore.Razor.TagHelpers; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Localization; +using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Microsoft.AspNetCore.Razor.TagHelpers; +using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Button; +using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Extensions; +using Volo.Abp.Json; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; + +public abstract class AbpDatePickerBaseTagHelperService : AbpTagHelperService + where TTagHelper : AbpDatePickerBaseTagHelper +{ + protected readonly Dictionary> SupportedInputTypes = new() { + {typeof(string), o => DateTime.Parse((string)o).ToString("O")}, + {typeof(DateTime), o => ((DateTime) o).ToString("O")}, + {typeof(DateTime?), o => ((DateTime?) o)?.ToString("O")}, + {typeof(DateTimeOffset), o => ((DateTimeOffset) o).ToString("O")}, + {typeof(DateTimeOffset?), o => ((DateTimeOffset?) o)?.ToString("O")} + }; + + protected readonly IJsonSerializer JsonSerializer; + protected readonly IHtmlGenerator Generator; + protected readonly HtmlEncoder Encoder; + protected readonly IServiceProvider ServiceProvider; + protected readonly IAbpTagHelperLocalizer TagHelperLocalizer; + protected virtual string TagName { get; set; } = "abp-date-picker"; + protected IStringLocalizer L { get; } + protected InputTagHelper InputTagHelper { get; set; } + protected abstract TagHelperOutput TagHelperOutput { get; set; } + + protected AbpDatePickerBaseTagHelperService(IJsonSerializer jsonSerializer, IHtmlGenerator generator, + HtmlEncoder encoder, IServiceProvider serviceProvider, IStringLocalizer l, + IAbpTagHelperLocalizer tagHelperLocalizer) + { + JsonSerializer = jsonSerializer; + Generator = generator; + Encoder = encoder; + ServiceProvider = serviceProvider; + L = l; + TagHelperLocalizer = tagHelperLocalizer; + + InputTagHelper = new InputTagHelper(Generator) { InputTypeName = "text" }; + } + + protected virtual T GetAttribute() where T : Attribute + { + return GetAttributeAndModelExpression(out _); + } + + protected abstract T GetAttributeAndModelExpression(out ModelExpression modelExpression) where T : Attribute; + + + public async override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) + { + TagHelperOutput = new TagHelperOutput("input", GetInputAttributes(context, output), (_, _) => Task.FromResult(new DefaultTagHelperContent())); + + InputTagHelper.ViewContext = TagHelper.ViewContext; + + if (!TagHelper.Name.IsNullOrEmpty()) + { + InputTagHelper.Name = TagHelper.Name; + } + + if (!TagHelper.Value.IsNullOrEmpty()) + { + InputTagHelper.Value = TagHelper.Value; + } + + AddDisabledAttribute(TagHelperOutput); + AddAutoFocusAttribute(TagHelperOutput); + AddFormControls(context, output, TagHelperOutput); + AddReadOnlyAttribute(TagHelperOutput); + AddPlaceholderAttribute(TagHelperOutput); + AddInfoTextId(TagHelperOutput); + + // Open and close button + var openButtonContent = TagHelper.OpenButton + ? await ProcessButtonAndGetContentAsync(context, output, "calendar", "open") + : ""; + var clearButtonContent = TagHelper.ClearButton + ? await ProcessButtonAndGetContentAsync(context, output, "times", "clear", visible:!TagHelper.SingleOpenAndClearButton) + : ""; + + var labelContent = await GetLabelAsHtmlAsync(context, output, TagHelperOutput); + var infoContent = GetInfoAsHtml(context, output, TagHelperOutput); + var validationContent = await GetValidationAsHtmlAsync(context, output); + + var inputGroup = new TagHelperOutput("div", + new TagHelperAttributeList(new[] { new TagHelperAttribute("class", "input-group") }), + (_, _) => Task.FromResult(new DefaultTagHelperContent())); + inputGroup.Content.AppendHtml( + TagHelperOutput.Render(Encoder) + openButtonContent + clearButtonContent + ); + + var abpDatePickerTag = new TagHelperOutput(TagName, GetBaseTagAttributes(context, output, TagHelper), + (_, _) => Task.FromResult(new DefaultTagHelperContent())); + abpDatePickerTag.Content.AppendHtml(inputGroup.Render(Encoder)); + abpDatePickerTag.Content.AppendHtml(validationContent); + abpDatePickerTag.Content.AppendHtml(GetExtraInputHtml(context, output)); + + var innerHtml = labelContent + abpDatePickerTag.Render(Encoder) + infoContent; + + var order = GetOrder(); + + AddGroupToFormGroupContents( + context, + GetPropertyName(), + SurroundInnerHtmlAndGet(context, output, innerHtml), + order + ); + + + output.TagMode = TagMode.StartTagAndEndTag; + output.TagName = "div"; + LeaveOnlyGroupAttributes(context, output); + output.Attributes.AddClass("mb-3"); + + output.Content.AppendHtml(innerHtml); + } + + protected virtual void AddReadOnlyAttribute(TagHelperOutput inputTagHelperOutput) + { + if (inputTagHelperOutput.Attributes.ContainsName("readonly") == false && + (TagHelper.IsReadonly != false || GetAttribute() != null)) + { + inputTagHelperOutput.Attributes.Add("readonly", ""); + } + } + + protected virtual TagHelperAttributeList GetInputAttributes(TagHelperContext context, TagHelperOutput output) + { + var groupPrefix = "group-"; + + var tagHelperAttributes = output.Attributes.Where(a => !a.Name.StartsWith(groupPrefix)).ToList(); + + var attrList = new TagHelperAttributeList(); + + foreach (var tagHelperAttribute in tagHelperAttributes) + { + attrList.Add(tagHelperAttribute); + } + + attrList.Add("type", "text"); + + if (attrList.ContainsName("value")) + { + attrList.Remove(attrList.First(a => a.Name == "value")); + } + + if (!TagHelper.Name.IsNullOrEmpty() && !attrList.ContainsName("name")) + { + attrList.Add("name", TagHelper.Name); + } + + if (!attrList.ContainsName("autocomplete")) + { + attrList.Add("autocomplete", "off"); + } + + return attrList; + } + protected virtual void LeaveOnlyGroupAttributes(TagHelperContext context, TagHelperOutput output) + { + var groupPrefix = "group-"; + var tagHelperAttributes = output.Attributes.Where(a => a.Name.StartsWith(groupPrefix)).ToList(); + + output.Attributes.Clear(); + + foreach (var tagHelperAttribute in tagHelperAttributes) + { + var nameWithoutPrefix = tagHelperAttribute.Name.Substring(groupPrefix.Length); + var newAttribute = new TagHelperAttribute(nameWithoutPrefix, tagHelperAttribute.Value); + output.Attributes.Add(newAttribute); + } + } + + protected virtual string SurroundInnerHtmlAndGet(TagHelperContext context, TagHelperOutput output, string innerHtml) + { + return "
" + + Environment.NewLine + innerHtml + Environment.NewLine + + "
"; + } + + protected abstract string GetPropertyName(); + + protected virtual void AddGroupToFormGroupContents(TagHelperContext context, string propertyName, string html, + int order) + { + var list = context.GetValue>(FormGroupContents) ?? new List(); + + if (!list.Any(igc => igc.HtmlContent.Contains("id=\"" + propertyName.Replace('.', '_') + "\""))) + { + list.Add(new FormGroupItem { HtmlContent = html, Order = order, PropertyName = propertyName }); + } + } + + protected abstract int GetOrder(); + protected abstract void AddBaseTagAttributes(TagHelperAttributeList attributes); + + protected virtual string GetExtraInputHtml(TagHelperContext context, TagHelperOutput output) + { + return string.Empty; + } + + protected TagHelperAttributeList ConvertDatePickerOptionsToAttributeList(IAbpDatePickerOptions options) + { + var attrList = new TagHelperAttributeList(); + + if(options == null) + { + return attrList; + } + + if (options.Locale != null) + { + attrList.Add("data-locale", JsonSerializer.Serialize(options.Locale)); + } + + if (options.MinDate != null) + { + attrList.Add("data-min-date", options.MinDate); + } + + if (options.MaxDate != null) + { + attrList.Add("data-max-date", options.MaxDate); + } + + if (options.MaxSpan != null) + { + attrList.Add("data-max-span", JsonSerializer.Serialize(options.MaxSpan)); + } + + if (options.ShowDropdowns == false) + { + attrList.Add("data-show-dropdowns", options.ShowDropdowns.ToString().ToLowerInvariant()); + } + + if (options.MinYear != null) + { + attrList.Add("data-min-year", options.MinYear); + } + + if (options.MaxYear != null) + { + attrList.Add("data-max-year", options.MaxYear); + } + + switch (options.WeekNumbers) + { + case AbpDatePickerWeekNumbers.Normal: + attrList.Add("data-show-week-numbers", "true"); + break; + case AbpDatePickerWeekNumbers.Iso: + attrList.Add("data-show-i-s-o-week-numbers", "true"); + break; + } + + if (options.TimePicker != null) + { + attrList.Add("data-time-picker", options.TimePicker.ToString().ToLowerInvariant()); + } + + if (options.TimePickerIncrement != null) + { + attrList.Add("data-time-picker-increment", options.TimePickerIncrement); + } + + if (options.TimePicker24Hour != null) + { + attrList.Add("data-time-picker24-hour", options.TimePicker24Hour.ToString().ToLowerInvariant()); + } + + if (options.TimePickerSeconds != null) + { + attrList.Add("data-time-picker-seconds", options.TimePickerSeconds.ToString().ToLowerInvariant()); + } + + if (options.Opens != AbpDatePickerOpens.Center) + { + attrList.Add("data-opens", options.Opens.ToString().ToLowerInvariant()); + } + + if (options.Drops != AbpDatePickerDrops.Down) + { + attrList.Add("data-drops", options.Drops.ToString().ToLowerInvariant()); + } + + if (!options.ButtonClasses.IsNullOrEmpty()) + { + attrList.Add("data-button-classes", options.ButtonClasses); + } + + if (!options.ApplyButtonClasses.IsNullOrEmpty()) + { + attrList.Add("data-apply-button-classes", options.ApplyButtonClasses); + } + + if (!options.ClearButtonClasses.IsNullOrEmpty()) + { + attrList.Add("data-clear-button-classes", options.ClearButtonClasses); + } + + if (!options.TodayButtonClasses.IsNullOrEmpty()) + { + attrList.Add("data-today-button-classes", options.TodayButtonClasses); + } + + if (options.AutoApply != null) + { + attrList.Add("data-auto-apply", options.AutoApply.ToString().ToLowerInvariant()); + } + + if (options.LinkedCalendars != null) + { + attrList.Add("data-linked-calendars", options.LinkedCalendars.ToString().ToLowerInvariant()); + } + + if (options.AutoUpdateInput != null) + { + attrList.Add("data-auto-update-input", options.AutoUpdateInput.ToString().ToLowerInvariant()); + } + + if (!options.ParentEl.IsNullOrEmpty()) + { + attrList.Add("data-parent-el", options.ParentEl); + } + + if (!options.DateFormat.IsNullOrEmpty()) + { + attrList.Add("data-date-format", options.DateFormat); + } + + if(options.Ranges != null && options.Ranges.Any()) + { + var ranges = options.Ranges.ToDictionary(r => r.Label, r => r.Dates); + + attrList.Add("data-ranges", JsonSerializer.Serialize(ranges)); + } + + if(options.AlwaysShowCalendars != null) + { + attrList.Add("data-always-show-calendars", options.AlwaysShowCalendars.ToString().ToLowerInvariant()); + } + + if(options.ShowCustomRangeLabel == false) + { + attrList.Add("data-show-custom-range-label", options.ShowCustomRangeLabel.ToString().ToLowerInvariant()); + } + + if(options.Options != null) + { + attrList.Add("data-options", JsonSerializer.Serialize(options.Options)); + } + + if (options.IsUtc != null) + { + attrList.Add("data-is-utc", options.IsUtc.ToString().ToLowerInvariant()); + } + + if (options.IsIso != null) + { + attrList.Add("data-is-iso", options.IsIso.ToString().ToLowerInvariant()); + } + + if (!options.PickerId.IsNullOrWhiteSpace()) + { + attrList.Add("id", options.PickerId); + } + + if(!options.SingleOpenAndClearButton) + { + attrList.Add("data-single-open-and-clear-button", options.SingleOpenAndClearButton.ToString().ToLowerInvariant()); + } + + return attrList; + } + + protected TagHelperAttributeList GetBaseTagAttributes(TagHelperContext context, TagHelperOutput output, IAbpDatePickerOptions options) + { + var groupPrefix = "group-"; + + var tagHelperAttributes = output.Attributes.Where(a => !a.Name.StartsWith(groupPrefix)).ToList(); + + var attrList = new TagHelperAttributeList(); + + foreach (var tagHelperAttribute in tagHelperAttributes) + { + attrList.Add(tagHelperAttribute); + } + + if (attrList.ContainsName("type")) + { + attrList.Remove(attrList.First(a => a.Name == "type")); + } + + if (attrList.ContainsName("name")) + { + attrList.Remove(attrList.First(a => a.Name == "name")); + } + + if (attrList.ContainsName("id")) + { + attrList.Remove(attrList.First(a => a.Name == "id")); + } + + if (attrList.ContainsName("value")) + { + attrList.Remove(attrList.First(a => a.Name == "value")); + } + + foreach (var attr in ConvertDatePickerOptionsToAttributeList(options)) + { + attrList.Add(attr); + } + + var optionsAttribute = GetAttributeAndModelExpression(out var modelExpression); + if (optionsAttribute != null) + { + foreach (var attr in ConvertDatePickerOptionsToAttributeList(optionsAttribute.GetDatePickerOptions(modelExpression.ModelExplorer))) + { + attrList.Add(attr); + } + } + + AddBaseTagAttributes(attrList); + + return attrList; + } + + protected virtual bool IsOutputHidden(TagHelperOutput inputTag) + { + return inputTag.Attributes.Any(a => + a.Name.ToLowerInvariant() == "type" && a.Value?.ToString()?.ToLowerInvariant() == "hidden"); + } + + protected virtual string GetInfoAsHtml(TagHelperContext context, TagHelperOutput output, TagHelperOutput inputTag) + { + if (IsOutputHidden(inputTag)) + { + return string.Empty; + } + + string text; + ModelExplorer modelExplorer = null; + + if (!string.IsNullOrEmpty(TagHelper.InfoText)) + { + text = TagHelper.InfoText; + } + else + { + var infoAttribute = GetAttributeAndModelExpression(out var modelExpression); + if (infoAttribute != null) + { + modelExplorer = modelExpression.ModelExplorer; + text = infoAttribute.Text; + } + else + { + return string.Empty; + } + } + + var idAttr = inputTag.Attributes.FirstOrDefault(a => a.Name == "id"); + modelExplorer ??= GetModelExpression().ModelExplorer; + var localizedText = TagHelperLocalizer.GetLocalizedText(text, modelExplorer); + + var div = new TagBuilder("div"); + div.Attributes.Add("id", idAttr?.Value + "InfoText"); + div.AddCssClass("form-text"); + div.InnerHtml.Append(localizedText); + + inputTag.Attributes.Add("aria-describedby", idAttr?.Value + "InfoText"); + + return div.ToHtmlString(); + } + + protected virtual async Task GetLabelAsHtmlAsync(TagHelperContext context, TagHelperOutput output, + TagHelperOutput inputTag) + { + if (IsOutputHidden(inputTag) || TagHelper.SuppressLabel) + { + return string.Empty; + } + if (string.IsNullOrEmpty(TagHelper.Label)) + { + return await GetLabelAsHtmlUsingTagHelperAsync(context, output) + GetRequiredSymbol(context, output); + } + + var label = new TagBuilder("label"); + label.Attributes.Add("for", GetIdAttributeValue(inputTag)); + label.InnerHtml.AppendHtml(TagHelper.Label); + + label.AddCssClass("form-label"); + + if (!TagHelper.LabelTooltip.IsNullOrEmpty()) + { + label.Attributes.Add("data-bs-toggle", "tooltip"); + label.Attributes.Add("data-bs-placement", TagHelper.LabelTooltipPlacement); + if (TagHelper.LabelTooltipHtml) + { + label.Attributes.Add("data-bs-html", "true"); + } + + label.Attributes.Add("title", TagHelper.LabelTooltip); + label.InnerHtml.AppendHtml($" "); + } + + return label.ToHtmlString(); + } + + protected virtual string GetIdAttributeValue(TagHelperOutput inputTag) + { + var idAttr = inputTag.Attributes.FirstOrDefault(a => a.Name == "id"); + + return idAttr != null ? idAttr.Value.ToString() : string.Empty; + } + + protected virtual string GetRequiredSymbol(TagHelperContext context, TagHelperOutput output) + { + if (!TagHelper.DisplayRequiredSymbol) + { + return ""; + } + + var isHaveRequiredAttribute = context.AllAttributes.Any(a => a.Name == "required"); + + return GetAttribute() != null || isHaveRequiredAttribute ? " * " : ""; + } + + protected abstract ModelExpression GetModelExpression(); + + protected virtual async Task GetLabelAsHtmlUsingTagHelperAsync(TagHelperContext context, + TagHelperOutput output) + { + var modelExpression = GetModelExpression(); + if (modelExpression == null) + { + return string.Empty; + } + var labelTagHelper = new LabelTagHelper(Generator) { + ViewContext = TagHelper.ViewContext, + For = modelExpression + }; + + var attributeList = new TagHelperAttributeList(); + + attributeList.AddClass("form-label"); + + if (!TagHelper.LabelTooltip.IsNullOrEmpty()) + { + attributeList.Add("data-bs-toggle", "tooltip"); + attributeList.Add("data-bs-placement", TagHelper.LabelTooltipPlacement); + if (TagHelper.LabelTooltipHtml) + { + attributeList.Add("data-bs-html", "true"); + } + + attributeList.Add("title", TagHelper.LabelTooltip); + } + + var innerOutput = + await labelTagHelper.ProcessAndGetOutputAsync(attributeList, context, "label", TagMode.StartTagAndEndTag); + if (!TagHelper.LabelTooltip.IsNullOrEmpty()) + { + innerOutput.Content.AppendHtml($" "); + } + + return innerOutput.Render(Encoder); + } + + protected virtual async Task ProcessButtonAndGetContentAsync(TagHelperContext context, + TagHelperOutput output, string icon, string type, bool visible = true) + { + var abpButtonTagHelper = ServiceProvider.GetRequiredService(); + var attributes = + new TagHelperAttributeList { new("type", "button"), new("tabindex", "-1"), new("data-type", type) }; + abpButtonTagHelper.ButtonType = AbpButtonType.Outline_Secondary; + abpButtonTagHelper.Icon = icon; + + abpButtonTagHelper.Disabled = TagHelper.IsDisabled; + + if (!visible) + { + attributes.AddClass("d-none"); + } + + return await abpButtonTagHelper.RenderAsync(attributes, context, Encoder, "button", TagMode.StartTagAndEndTag); + } + + protected virtual void AddInfoTextId(TagHelperOutput inputTagHelperOutput) + { + if (GetAttribute() == null) + { + return; + } + + var idAttr = inputTagHelperOutput.Attributes.FirstOrDefault(a => a.Name == "id"); + + if (idAttr == null) + { + return; + } + + inputTagHelperOutput.Attributes.Add("aria-describedby", GetInfoText()); + } + + public virtual string GetInfoText() + { + var infoAttribute = GetAttributeAndModelExpression(out var modelExpression); + + if (infoAttribute != null) + { + return TagHelperLocalizer.GetLocalizedText(infoAttribute.Text, modelExpression.ModelExplorer); + } + + return string.Empty; + } + + protected virtual void AddPlaceholderAttribute(TagHelperOutput inputTagHelperOutput) + { + if (inputTagHelperOutput.Attributes.ContainsName("placeholder")) + { + return; + } + + var attribute = GetAttributeAndModelExpression(out var modelExpression); + + if (attribute != null) + { + var placeholderLocalized = + TagHelperLocalizer.GetLocalizedText(attribute.Value, modelExpression.ModelExplorer); + + inputTagHelperOutput.Attributes.Add("placeholder", placeholderLocalized); + } + } + + protected virtual void AddFormControls(TagHelperContext context, TagHelperOutput output, + TagHelperOutput inputTagHelperOutput) + { + inputTagHelperOutput.Attributes.AddClass("form-control"); + var size = GetSize(context, output); + if (!size.IsNullOrEmpty()) + { + inputTagHelperOutput.Attributes.AddClass(size); + } + } + + protected virtual void AddAutoFocusAttribute(TagHelperOutput inputTagHelperOutput) + { + if (TagHelper.AutoFocus && !inputTagHelperOutput.Attributes.ContainsName("data-auto-focus")) + { + inputTagHelperOutput.Attributes.Add("data-auto-focus", "true"); + } + } + + protected virtual void AddDisabledAttribute(TagHelperOutput inputTagHelperOutput) + { + if (inputTagHelperOutput.Attributes.ContainsName("disabled") == false && + (TagHelper.IsDisabled || GetAttribute() != null)) + { + inputTagHelperOutput.Attributes.Add("disabled", ""); + } + } + + + protected virtual string GetSize(TagHelperContext context, TagHelperOutput output) + { + // TODO: Test this method + var attribute = GetAttribute(); + + if (attribute != null) + { + TagHelper.Size = attribute.Size; + } + + return TagHelper.Size switch { + AbpFormControlSize.Small => "form-control-sm", + AbpFormControlSize.Medium => "form-control-md", + AbpFormControlSize.Large => "form-control-lg", + _ => "" + }; + } + + protected abstract Task GetValidationAsHtmlAsync(TagHelperContext context, TagHelperOutput output); + + protected virtual async Task GetValidationAsHtmlByInputAsync(TagHelperContext context, + TagHelperOutput output, + [NotNull]InputTagHelper inputTag) + { + var validationMessageTagHelper = + new ValidationMessageTagHelper(Generator) { For = inputTag.For, ViewContext = TagHelper.ViewContext }; + + var attributeList = new TagHelperAttributeList { { "class", "text-danger col-auto" } }; + + return await validationMessageTagHelper.RenderAsync(attributeList, context, Encoder, "span", + TagMode.StartTagAndEndTag); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerDrops.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerDrops.cs new file mode 100644 index 0000000000..c61cbfec78 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerDrops.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; + +public enum AbpDatePickerDrops : byte +{ + Down = 1, + Up = 2, + Auto = 3 +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerOpens.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerOpens.cs new file mode 100644 index 0000000000..a74bf229ef --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerOpens.cs @@ -0,0 +1,10 @@ +using System; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; + +public enum AbpDatePickerOpens : byte +{ + Left = 1, + Right = 2, + Center = 3, +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerOptions.cs new file mode 100644 index 0000000000..15b4e2003d --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerOptions.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; + +public class AbpDatePickerOptions : IAbpDatePickerOptions +{ + public string PickerId { get; set; } + public DateTime? MinDate { get; set; } + public DateTime? MaxDate { get; set; } + public object MaxSpan { get; set; } + public bool? ShowDropdowns { get; set; } + public int? MinYear { get; set; } + public int? MaxYear { get; set; } + public AbpDatePickerWeekNumbers WeekNumbers { get; set; } = AbpDatePickerWeekNumbers.None; + public bool? TimePicker { get; set; } + public int? TimePickerIncrement { get; set; } + public bool? TimePicker24Hour { get; set; } + public bool? TimePickerSeconds { get; set; } + public List Ranges { get; set; } + public bool? ShowCustomRangeLabel { get; set; } + public bool? AlwaysShowCalendars { get; set; } + public AbpDatePickerOpens Opens { get; set; } = AbpDatePickerOpens.Center; + public AbpDatePickerDrops Drops { get; set; } = AbpDatePickerDrops.Down; + public string ButtonClasses { get; set; } + public string TodayButtonClasses { get; set; } + public string ApplyButtonClasses { get; set; } + public string ClearButtonClasses { get; set; } + public object Locale { get; set; } + public bool? AutoApply { get; set; } + public bool? LinkedCalendars { get; set; } + public bool? AutoUpdateInput { get; set; } + public string ParentEl { get; set; } + public string DateFormat { get; set; } + public bool OpenButton { get; set; } = true; + public bool ClearButton { get; set; } = true; + public bool SingleOpenAndClearButton { get; set; } = true; + public bool? IsUtc { get; set; } + public bool? IsIso { get; set; } + public object Options { get; set; } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerRange.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerRange.cs new file mode 100644 index 0000000000..eea3d2ad31 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerRange.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; + +public class AbpDatePickerRange +{ + private readonly List _dates = new List(); + public string Label { get; set; } + public IReadOnlyList Dates => _dates; + + public AbpDatePickerRange() + { + + } + public AbpDatePickerRange(string label, DateTime start, DateTime end) + { + Label = label; + AddDate(start); + AddDate(end); + } + + public AbpDatePickerRange(string label, DateTime date) + { + Label = label; + AddDate(date); + } + + public AbpDatePickerRange(string label, DateTimeOffset start, DateTimeOffset end) + { + Label = label; + AddDate(start); + AddDate(end); + } + + public AbpDatePickerRange(string label, DateTimeOffset date) + { + Label = label; + AddDate(date); + } + + public AbpDatePickerRange(string label, string start, string end) + { + Label = label; + AddDate(start); + AddDate(end); + } + + public AbpDatePickerRange(string label, string date) + { + Label = label; + AddDate(date); + } + + public void AddDate(string date) + { + _dates.Add(DateTime.Parse(date).ToString("O")); + } + + public void AddDate(DateTime date) + { + _dates.Add(date.ToString("O")); + } + + public void AddDate(DateTimeOffset date) + { + _dates.Add(date.ToString("O")); + } + + public void AddDate(DateTime? date) + { + if (date.HasValue) + { + _dates.Add(date.Value.ToString("O")); + } + } + + public void AddDate(DateTimeOffset? date) + { + if (date.HasValue) + { + _dates.Add(date.Value.ToString("O")); + } + } + + public void AddDate(string date, string format) + { + _dates.Add(DateTime.ParseExact(date, format, null).ToString("O")); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelper.cs new file mode 100644 index 0000000000..8426b0071b --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelper.cs @@ -0,0 +1,16 @@ +using JetBrains.Annotations; +using Microsoft.AspNetCore.Mvc.ViewFeatures; +using Microsoft.AspNetCore.Razor.TagHelpers; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; + +[HtmlTargetElement("abp-date-picker", TagStructure = TagStructure.NormalOrSelfClosing)] +public class AbpDatePickerTagHelper : AbpDatePickerBaseTagHelper +{ + [CanBeNull] + public ModelExpression AspFor { get; set; } + + public AbpDatePickerTagHelper(AbpDatePickerTagHelperService service) : base(service) + { + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelperService.cs new file mode 100644 index 0000000000..e5eae85c53 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelperService.cs @@ -0,0 +1,88 @@ +using System; +using System.Text.Encodings.Web; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Localization.Resources.AbpUi; +using Microsoft.AspNetCore.Mvc.TagHelpers; +using Microsoft.AspNetCore.Mvc.ViewFeatures; +using Microsoft.AspNetCore.Razor.TagHelpers; +using Microsoft.Extensions.Localization; +using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Extensions; +using Volo.Abp.Json; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; + +public class AbpDatePickerTagHelperService : AbpDatePickerBaseTagHelperService +{ + public AbpDatePickerTagHelperService(IJsonSerializer jsonSerializer, IHtmlGenerator generator, HtmlEncoder encoder, IServiceProvider serviceProvider, IStringLocalizer l, IAbpTagHelperLocalizer tagHelperLocalizer) : base(jsonSerializer, generator, encoder, serviceProvider, l, tagHelperLocalizer) + { + + } + + protected override TagHelperOutput TagHelperOutput { get; set; } + + [CanBeNull] + protected virtual InputTagHelper DateTagHelper { get; set; } + + [CanBeNull] + protected virtual TagHelperOutput DateTagHelperOutput { get; set; } + protected override string GetPropertyName() + { + return TagHelper.AspFor?.Name ?? string.Empty; + } + + protected override T GetAttributeAndModelExpression(out ModelExpression modelExpression) + { + modelExpression = TagHelper.AspFor; + return modelExpression?.ModelExplorer.GetAttribute(); + } + + public async override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) + { + if (TagHelper.AspFor != null) + { + DateTagHelper = new InputTagHelper(Generator) + { + InputTypeName = "hidden", + ViewContext = TagHelper.ViewContext, + For = TagHelper.AspFor, + }; + + var attributes = new TagHelperAttributeList { { "data-date", "true" }, { "type", "hidden" } }; + DateTagHelperOutput = await DateTagHelper.ProcessAndGetOutputAsync(attributes, context, "input"); + } + + await base.ProcessAsync(context, output); + } + + + protected override int GetOrder() + { + return TagHelper.AspFor?.Metadata.Order ?? 0; + } + + protected override void AddBaseTagAttributes(TagHelperAttributeList attributes) + { + if (TagHelper.AspFor != null && + TagHelper.AspFor.Model != null && + SupportedInputTypes.TryGetValue(TagHelper.AspFor.Metadata.ModelType, out var convertFunc)) + { + attributes.Add("data-date", convertFunc(TagHelper.AspFor.Model)); + } + } + + protected override ModelExpression GetModelExpression() + { + return TagHelper.AspFor; + } + + protected async override Task GetValidationAsHtmlAsync(TagHelperContext context, TagHelperOutput output) + { + return DateTagHelper != null ? await GetValidationAsHtmlByInputAsync(context, output, DateTagHelper) : string.Empty; + } + + protected override string GetExtraInputHtml(TagHelperContext context, TagHelperOutput output) + { + return DateTagHelperOutput?.Render(Encoder); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerWeekNumbers.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerWeekNumbers.cs new file mode 100644 index 0000000000..b542fcec4d --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerWeekNumbers.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; + +public enum AbpDatePickerWeekNumbers : byte +{ + None = 0, + Normal = 1, + Iso = 2 +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelper.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelper.cs new file mode 100644 index 0000000000..bfd1e354f6 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelper.cs @@ -0,0 +1,20 @@ +using JetBrains.Annotations; +using Microsoft.AspNetCore.Mvc.ViewFeatures; +using Microsoft.AspNetCore.Razor.TagHelpers; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; + +[HtmlTargetElement("abp-date-range-picker", TagStructure = TagStructure.NormalOrSelfClosing)] +public class AbpDateRangePickerTagHelper : AbpDatePickerBaseTagHelper +{ + [CanBeNull] + public ModelExpression AspForStart { get; set; } + + [CanBeNull] + public ModelExpression AspForEnd { get; set; } + + public AbpDateRangePickerTagHelper(AbpDateRangePickerTagHelperService tagHelperService) : + base(tagHelperService) + { + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelperService.cs new file mode 100644 index 0000000000..45a083b789 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelperService.cs @@ -0,0 +1,132 @@ +using System; +using System.Linq; +using System.Text.Encodings.Web; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Localization.Resources.AbpUi; +using Microsoft.AspNetCore.Mvc.TagHelpers; +using Microsoft.AspNetCore.Mvc.ViewFeatures; +using Microsoft.AspNetCore.Razor.TagHelpers; +using Microsoft.Extensions.Localization; +using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Extensions; +using Volo.Abp.Json; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; + +public class AbpDateRangePickerTagHelperService : AbpDatePickerBaseTagHelperService +{ + public AbpDateRangePickerTagHelperService(IJsonSerializer jsonSerializer, IHtmlGenerator generator, + HtmlEncoder encoder, IServiceProvider serviceProvider, IStringLocalizer l, + IAbpTagHelperLocalizer tagHelperLocalizer) : + base(jsonSerializer, generator, encoder, serviceProvider, l, + tagHelperLocalizer) + { + } + + protected override string TagName { get; set; } = "abp-date-range-picker"; + + protected override T GetAttributeAndModelExpression(out ModelExpression modelExpression) + { + modelExpression = new[] { TagHelper.AspForStart, TagHelper.AspForEnd }.FirstOrDefault(x => x?.ModelExplorer?.GetAttribute() != null); + return modelExpression?.ModelExplorer.GetAttribute(); + } + + public async override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) + { + if (TagHelper.AspForStart != null) + { + var startDateAttributes = new TagHelperAttributeList { { "data-start-date", "true" }, { "type", "hidden" } }; + StartDateTagHelper = new InputTagHelper(Generator) + { + ViewContext = TagHelper.ViewContext, + For = TagHelper.AspForStart, + InputTypeName = "hidden" + }; + + StartDateTagHelperOutput = await StartDateTagHelper.ProcessAndGetOutputAsync(startDateAttributes, context, "input"); + } + + if (TagHelper.AspForEnd != null) + { + var endDateAttributes = new TagHelperAttributeList { { "data-end-date", "true" }, { "type", "hidden" } }; + EndDateTagHelper = new InputTagHelper(Generator) + { + ViewContext = TagHelper.ViewContext, + For = TagHelper.AspForEnd, + InputTypeName = "hidden" + }; + + EndDateTagHelperOutput = await EndDateTagHelper.ProcessAndGetOutputAsync(endDateAttributes, context, "input"); + } + + await base.ProcessAsync(context, output); + } + + protected override TagHelperOutput TagHelperOutput { get; set; } + + [CanBeNull] + protected virtual InputTagHelper StartDateTagHelper { get; set; } + + [CanBeNull] + protected virtual TagHelperOutput StartDateTagHelperOutput { get; set; } + + [CanBeNull] + protected virtual InputTagHelper EndDateTagHelper { get; set; } + + [CanBeNull] + protected virtual TagHelperOutput EndDateTagHelperOutput { get; set; } + + protected override string GetPropertyName() + { + return TagHelper.AspForStart?.Name ?? string.Empty; + } + + protected override int GetOrder() + { + return TagHelper.Order; + } + + protected override void AddBaseTagAttributes(TagHelperAttributeList attributes) + { + if (TagHelper.AspForStart != null && + TagHelper.AspForStart.Model != null && + SupportedInputTypes.TryGetValue(TagHelper.AspForStart.Metadata.ModelType, out var convertFuncStart)) + { + attributes.Add("data-start-date", convertFuncStart(TagHelper.AspForStart.Model)); + } + + if (TagHelper.AspForEnd != null && + TagHelper.AspForEnd.Model != null && + SupportedInputTypes.TryGetValue(TagHelper.AspForEnd.Metadata.ModelType, out var convertFuncEnd)) + { + attributes.Add("data-end-date", convertFuncEnd(TagHelper.AspForEnd.Model)); + } + } + + protected override string GetExtraInputHtml(TagHelperContext context, TagHelperOutput output) + { + return StartDateTagHelperOutput?.Render(Encoder) + EndDateTagHelperOutput?.Render(Encoder); + } + + protected override ModelExpression GetModelExpression() + { + return TagHelper.AspForStart; + } + + protected async override Task GetValidationAsHtmlAsync(TagHelperContext context, TagHelperOutput output) + { + var validationHtml = string.Empty; + + if (StartDateTagHelper != null) + { + validationHtml += await GetValidationAsHtmlByInputAsync(context, output, StartDateTagHelper); + } + + if (EndDateTagHelper != null) + { + validationHtml += await GetValidationAsHtmlByInputAsync(context, output, EndDateTagHelper); + } + + return validationHtml; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/DatePickerAttribute.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/DatePickerAttribute.cs new file mode 100644 index 0000000000..840e21241e --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/DatePickerAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; + +[AttributeUsage(AttributeTargets.Property)] +public class DatePickerAttribute : Attribute +{ +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/DatePickerOptionsAttribute.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/DatePickerOptionsAttribute.cs new file mode 100644 index 0000000000..9cff72aa23 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/DatePickerOptionsAttribute.cs @@ -0,0 +1,34 @@ +using System; +using System.Linq; +using Microsoft.AspNetCore.Mvc.ViewFeatures; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; + +[AttributeUsage(AttributeTargets.Property)] +public class DatePickerOptionsAttribute : Attribute +{ + public string DatePickerOptionsPropertyName { get; set; } + + public DatePickerOptionsAttribute(string datePickerOptionsPropertyName) + { + DatePickerOptionsPropertyName = datePickerOptionsPropertyName; + } + + public IAbpDatePickerOptions GetDatePickerOptions(ModelExplorer explorer) + { + var properties = explorer.Container.Properties.Where(p => p.Metadata.PropertyName != null && p.Metadata.PropertyName.Equals(DatePickerOptionsPropertyName)).ToList(); + + while (properties.Count == 0) + { + explorer = explorer.Container; + if(explorer.Container == null) + { + return null; + } + + properties = explorer.Container.Properties.Where(p => p.Metadata.PropertyName != null && p.Metadata.PropertyName.Equals(DatePickerOptionsPropertyName)).ToList(); + } + + return properties.FirstOrDefault(p=> p.Model is IAbpDatePickerOptions)?.Model as IAbpDatePickerOptions; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/DateRangePickerAttribute.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/DateRangePickerAttribute.cs new file mode 100644 index 0000000000..04412ed4fc --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/DateRangePickerAttribute.cs @@ -0,0 +1,19 @@ +using System; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; + +[AttributeUsage(AttributeTargets.Property)] +public class DateRangePickerAttribute : Attribute +{ + public string PickerId { get; set; } + + public bool IsStart { get; set; } + + public bool IsEnd => !IsStart; + + public DateRangePickerAttribute(string pickerId, bool isStart = false) + { + PickerId = pickerId; + IsStart = isStart; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/IAbpDatePickerOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/IAbpDatePickerOptions.cs new file mode 100644 index 0000000000..118c409da9 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/IAbpDatePickerOptions.cs @@ -0,0 +1,160 @@ +using System; +using System.Collections.Generic; +using JetBrains.Annotations; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form.DatePicker; + +public interface IAbpDatePickerOptions +{ + public string PickerId { get; set; } + + /// + /// Min date allowed + /// + DateTime? MinDate { get; set; } + + /// + /// Max date allowed + /// + DateTime? MaxDate { get; set; } + + /// + /// The maximum span between the selected start and end dates. Can have any property you can add to a moment object (i.e. days, months) + /// + object MaxSpan { get; set; } + + /// + /// Show year and month select boxes above calendars to jump to a specific month and year. + /// + bool? ShowDropdowns { get; set; } + + /// + /// The minimum year shown in the dropdowns when showDropdowns is set to true. + /// + int? MinYear { get; set; } + + /// + /// The maximum year shown in the dropdowns when showDropdowns is set to true. + /// + int? MaxYear { get; set; } + + /// + /// Show week numbers at the start of each week on the calendars. + /// + AbpDatePickerWeekNumbers WeekNumbers { get; set; } + + /// + /// Adds select boxes to choose times in addition to dates. + /// + bool? TimePicker { get; set; } + + /// + /// Increment of the minutes selection list for times (i.e. 30 to allow only selection of times ending in 0 or 30). + /// + int? TimePickerIncrement { get; set; } + + /// + /// Use 24-hour instead of 12-hour times, removing the AM/PM selection. + /// + bool? TimePicker24Hour { get; set; } + + /// + /// Show seconds in the timePicker. + /// + bool? TimePickerSeconds { get; set; } + + /// + /// Set predefined date ranges the user can select from. Each key is the label for the range, and its value an array with two dates representing the bounds of the range. + /// + List Ranges { get; set; } + + /// + /// Displays "Custom Range" at the end of the list of predefined ranges, when the ranges option is used. This option will be highlighted whenever the current date range selection does not match one of the predefined ranges. Clicking it will display the calendars to select a new range. + /// + bool? ShowCustomRangeLabel { get; set; } + + /// + /// Normally, if you use the ranges option to specify pre-defined date ranges, calendars for choosing a custom date range are not shown until the user clicks "Custom Range". When this option is set to true, the calendars for choosing a custom date range are always shown instead. + /// + bool? AlwaysShowCalendars { get; set; } + + /// + /// Whether the picker appears aligned to the left, to the right, or centered under the HTML element it's attached to. + /// + AbpDatePickerOpens Opens { get; set; } + + /// + /// Whether the picker appears below (default) or above the HTML element it's attached to. + /// + AbpDatePickerDrops Drops { get; set; } + + /// + /// CSS class names that will be added to both the today, clear, and apply buttons. + /// + [CanBeNull] + string ButtonClasses { get; set; } + + /// + /// CSS class names that will be added only to the today button. + /// + [CanBeNull] + string TodayButtonClasses { get; set; } + + /// + /// CSS class names that will be added only to the apply button. + /// + [CanBeNull] + string ApplyButtonClasses { get; set; } + + /// + /// CSS class names that will be added only to the clear button. + /// + [CanBeNull] + string ClearButtonClasses { get; set; } + + /// + /// Allows you to provide localized strings for buttons and labels, customize the date format, and change the first day of week for the calendars. + /// + [CanBeNull] + object Locale { get; set; } + + /// + /// Hide the apply button, and automatically apply a new date range as soon as two dates are clicked. + /// + bool? AutoApply { get; set; } + + /// + /// When enabled, the two calendars displayed will always be for two sequential months (i.e. January and February), and both will be advanced when clicking the left or right arrows above the calendars. When disabled, the two calendars can be individually advanced and display any month/year. + /// + bool? LinkedCalendars { get; set; } + + /// + /// Indicates whether the date range picker should automatically update the value of the input element it's attached to at initialization and when the selected dates change. + /// + bool? AutoUpdateInput { get; set; } + + /// + /// jQuery selector of the parent element that the date range picker will be added to, if not provided this will be 'body' + /// + [CanBeNull] + string ParentEl { get; set; } + + [CanBeNull] + string DateFormat { get; set; } + + bool OpenButton { get; set; } + + bool ClearButton { get; set; } + + bool SingleOpenAndClearButton { get; set; } + + bool? IsUtc { get; set; } + + bool? IsIso { get; set; } + + /// + /// Other non-mapped attributes will be automatically added to the input element as is. + /// + [CanBeNull] + object Options { get; set; } +} \ 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 cad3da097a..c576f7897d 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 @@ -30,8 +30,7 @@ - - + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js index c9c2597067..945df5d0c6 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/bootstrap/dom-event-handlers.js @@ -193,6 +193,567 @@ }); } + abp.libs.bootstrapDateRangePicker = { + packageName: "bootstrap-daterangepicker", + + createDateRangePicker: function (options) { + options = options || {}; + options.singleDatePicker = false; + return this.createDatePicker(options); + }, + createSinglePicker: function (options) { + options = options || {}; + options.singleDatePicker = true; + return this.createDatePicker(options); + }, + createDatePicker: function (options) { + var $container = $('
') + var label = $('') + if (options.label) { + label.text(options.label) + } + + $container.append(label) + var $datePicker = options.singleDatePicker ? $('') : $(''); + $container.append($datePicker) + + var $inputGroup = $('
'); + var $dateInput = $(''); + + if (options.placeholder) { + $dateInput.attr('placeholder', options.placeholder) + } + + if (options.value) { + $dateInput.val(options.value) + } + + if (options.name) { + $dateInput.attr('name', options.name) + } + + if (options.id) { + $dateInput.attr('id', options.id) + } + + if (options.required) { + $dateInput.attr('required', true) + } + + if (options.disabled) { + $dateInput.attr('disabled', true) + } + + if (options.readonly) { + $dateInput.attr('readonly', true) + } + + if(options.placeholder) { + $dateInput.attr('placeholder', options.placeholder) + } + + if (options.size) { + switch (options.size) { + case 'Small': + $dateInput.addClass('form-control-sm') + break; + case 'Medium': + $dateInput.addClass('form-control-md') + break; + case 'Large': + $dateInput.addClass('form-control-lg') + break; + default: + break; + } + } + + $inputGroup.append($dateInput); + + if (options.openButton !== false) { + var $openButton = $(''); + $inputGroup.append($openButton); + if(options.disabled) { + $openButton.attr('disabled', 'disabled') + } + } + + if (options.clearButton !== false) { + var $clearButton = $(''); + $inputGroup.append($clearButton); + if(options.disabled) { + $clearButton.attr('disabled', 'disabled') + } + } + + $datePicker.append($inputGroup); + + if (options.startDateName) { + var $hiddenStartDateElement = $(''); + $datePicker.append($hiddenStartDateElement); + } + + if (options.endDateName) { + var $hiddenEndDateElement = $(''); + $datePicker.append($hiddenEndDateElement); + } + + if (options.dateName) { + var $hiddenDateElement = $(''); + $datePicker.append($hiddenDateElement); + } + + $datePicker.data('options', options); + abp.dom.initializers.initializeDateRangePickers($datePicker); + $container[0].datePicker = $datePicker[0]; + return $container; + } + }; + + + abp.dom.initializers.initializeDateRangePickers = function ($rootElement) { + function setOptions (options, $datePickerElement, singleDatePicker) { + + options.singleDatePicker = singleDatePicker; + + var defaultOptions = { + showDropdowns: true, + opens: "center", + drops: "down", + autoApply: true, + autoUpdateInput: false, + showTodayButton: true, + showClearButton: true, + minYear: parseInt(moment().subtract(100, 'year').locale('en').format('YYYY')), + maxYear: parseInt(moment().add(100, 'year').locale('en').format('YYYY')), + locale: { + direction: abp.localization.currentCulture.isRightToLeft ? 'rtl' : 'ltr', + todayLabel: abp.localization.localize('Today', 'AbpUi'), + clearLabel: abp.localization.localize('Clear', 'AbpUi'), + applyLabel: abp.localization.localize('Apply', 'AbpUi'), + }, + singleOpenAndClearButton: true + }; + var locale = defaultOptions.locale; + $.extend(options, defaultOptions); + $.extend(options, $datePickerElement.data()); + if ($.isEmptyObject(options.locale)) { + options.locale = locale; + } else { + locale = options.locale; + } + + $.extend(options, $datePickerElement.data("options")); + if ($.isEmptyObject(options.locale)) { + options.locale = locale; + } + + if (options.timePicker && options.timePicker24Hour === undefined) { + options.timePicker24Hour = moment.localeData().longDateFormat('LT').indexOf('A') < 1; + } + + if (options.dateFormat) { + options.locale = options.locale || {}; + options.locale.format = options.dateFormat; + } + + if (options.separator) { + options.locale = options.locale || {}; + options.locale.separator = options.separator; + } + + if (options.ranges) { + $.each(options.ranges, function (key, value) { + let start = value[0]; + let end; + if (value.length > 1) { + end = value[1]; + } else { + end = value[0]; + } + options.ranges[key] = [getMoment(start, options), getMoment(end, options)]; + }); + } + + if (typeof options.template !== 'string' && !(options.template instanceof $)) + options.template = + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + ' ' + + '
' + + '
'; + } + + function replaceOpenButton (hasDate,singleOpenAndClearButton, $openButton, $clearButton) { + var hiddenClass = 'd-none'; + + if (singleOpenAndClearButton) { + if (hasDate) { + $openButton.addClass(hiddenClass); + $clearButton.removeClass(hiddenClass); + $clearButton.insertAfter($openButton); + } else { + $openButton.removeClass(hiddenClass); + $clearButton.addClass(hiddenClass); + $openButton.insertAfter($clearButton); + } + } + } + + function getMoment (date, options, dateFormat) { + var isUtc = options.isUtc; + dateFormat = dateFormat || options.dateFormat; + if (!date) { + return isUtc ? moment.utc() : moment(); + } + + if (isUtc) { + return moment.utc(date, dateFormat); + } else { + return moment(date, dateFormat); + } + } + + function getStartDate(options, startDate){ + startDate = startDate ? startDate : options.startDate; + startDate = startDate ? getMoment(startDate, options) : null; + if (options.singleDatePicker && !startDate) { + startDate = options.date ? getMoment(options.date, options) : null; + } + + if(startDate && startDate.isValid()){ + return startDate; + } + + return null; + } + + function getEndDate(options, endDate){ + if (options.singleDatePicker) { + return null; + } + endDate = endDate ? endDate : options.endDate; + endDate = endDate ? getMoment(endDate, options) : null; + + if(endDate && endDate.isValid()){ + return endDate; + } + + return null; + } + + function getTodayButton(options, $input){ + if (options.showTodayButton) { + var $todayBtn = $(''); + if(options.todayButtonClasses){ + $todayBtn.addClass(options.todayButtonClasses); + }else{ + $todayBtn.addClass('btn-default'); + } + + $todayBtn.on('click', function () { + var today = getMoment(undefined, options); + $input.data('daterangepicker').setStartDate(today); + $input.data('daterangepicker').setEndDate(today); + $input.data('daterangepicker').clickApply(); + }); + + return $todayBtn; + } + + return null; + } + + function getClearButton(options, $input, $dateRangePicker){ + if (options.showClearButton) { + var $clearBtn = $(''); + if(options.clearButtonClasses){ + $clearBtn.addClass(options.clearButtonClasses); + }else{ + $clearBtn.addClass('btn-default'); + } + $clearBtn.on('click', function () { + $input.val('').trigger('change'); + $dateRangePicker.hide(); + }); + + return $clearBtn; + } + return null; + } + + function addExtraButtons(options, $dateRangePicker, $input) { + var extraButtons = [getTodayButton(options, $input), getClearButton(options, $input, $dateRangePicker)]; + + if ($dateRangePicker.container.hasClass('auto-apply')) { + var $div = $('
'); + $div.css('display', 'block'); + $.each(extraButtons, function (index, value) { + $div.prepend(value); + }); + + $div.insertAfter($dateRangePicker.container.find('.drp-buttons')); + } else { + $.each(extraButtons, function (index, value) { + $dateRangePicker.container.find('.drp-buttons').prepend(value); + }); + } + } + + function addOpenButtonClick($openButton, $dateRangePicker){ + if(!$openButton){ + return; + } + $dateRangePicker.outsideClick = function (e) { + var target = $(e.target); + // if the page is clicked anywhere except within the daterangerpicker/button itself then call this.hide() + if ( + // ie modal dialog fix + e.type == "focusin" || + target.closest(this.element).length || + target.closest(this.container).length || + target.closest('.calendar-table').length || + target.closest($openButton).length + ) { + return; + } + + this.hide(); + this.element.trigger('outsideClick.daterangepicker', this); + }; + + $openButton.on('click', function () { + $dateRangePicker.toggle(); + }); + } + + function extendDateFormat (format,options) { + if (options.timePicker) { + if (options.timePicker24Hour) { + if (options.timePickerSeconds) { + format += " HH:mm:ss"; + } else { + format += " HH:mm"; + } + } else { + if (options.timePickerSeconds) { + format += ' ' + " hh:mm:ss A" + } else { + format += " hh:mm A"; + } + } + } + + return format; + } + + function fillInput($input, startDate, endDate, options) { + if (options.singleDatePicker) { + if (startDate) { + $input.val(startDate.format(options.dateFormat)); + } + } else { + if (startDate && endDate) { + $input.val(startDate.format(options.dateFormat) + options.separator + endDate.format(options.dateFormat)); + } + } + } + + $rootElement + .findWithSelf('abp-date-picker,abp-date-range-picker') + .each(function () { + var $this = $(this); + var $input = $this.find('.input-group input[type="text"]') + if ($input.data('daterangepicker')) { + return; + } + + var $openButton = $this.find('button[data-type="open"]') + var $clearButton = $this.find('button[data-type="clear"]') + var singleDatePicker = $this.is('abp-date-picker') + var options = {}; + + setOptions(options, $this, singleDatePicker); + + var isIso = options.isIso; + var dateFormat = options.dateFormat; + var separator = options.separator; + var defaultDateFormat = extendDateFormat("YYYY-MM-DD", options); + + var singleOpenAndClearButton = options.singleOpenAndClearButton && $clearButton.length > 0 && $openButton.length > 0; + + var startDate = getStartDate(options); + + var endDate = getEndDate(options); + if (startDate) { + options.startDate = startDate; + } + if (endDate) { + options.endDate = endDate; + } + + $input.daterangepicker(options); + + var $dateRangePicker = $input.data('daterangepicker'); + + addExtraButtons(options, $dateRangePicker, $input); + + addOpenButtonClick($openButton, $dateRangePicker); + + if (!dateFormat) { + dateFormat = extendDateFormat(moment.localeData().longDateFormat('L'), options); + options.dateFormat = dateFormat; + } + + if (!separator) { + separator = $dateRangePicker.locale.separator; + options.separator = separator; + } + + if(options.autoUpdateInput){ + fillInput($input, startDate, endDate, options); + } + + $input.on('apply.daterangepicker', function (ev, picker) { + if (singleDatePicker) { + $(this).val(picker.startDate.format(dateFormat)); + } else { + $(this).val(picker.startDate.format(dateFormat) + separator + picker.endDate.format(dateFormat)); + } + + $(this).trigger('change'); + }); + + $input.on('cancel.daterangepicker', function (ev, picker) { + $(this).val(''); + $(this).trigger('change'); + }); + + $input.on('show.daterangepicker', function (ev, picker) { + var momentStartDate = getMoment(startDate, options); + var momentEndDate = getMoment(endDate, options); + if (momentStartDate.isValid()) { + picker.setStartDate(momentStartDate); + } + if (momentEndDate.isValid()) { + picker.setEndDate(momentEndDate); + } + }); + + $clearButton.on('click', function () { + $input.val(''); + $input.trigger('change'); + }); + + var firstTrigger = true; + $input.on('change', function () { + if ($(this).val() !== '') { + replaceOpenButton(true, singleOpenAndClearButton, $openButton, $clearButton); + } else { + replaceOpenButton(false, singleOpenAndClearButton, $openButton, $clearButton); + } + var dates = $(this).val().split(separator); + if (dates.length === 2) { + startDate = formatDate(getStartDate(options, dates[0])); + endDate = formatDate(getEndDate(options, dates[1])); + } else { + if (dates[0]) { + startDate = formatDate(getStartDate(options, dates[0])); + } + else { + if(!firstTrigger){ + startDate = null; + } + } + + if(!firstTrigger){ + endDate = null; + } + } + + if (!startDate) { + replaceOpenButton(false, singleOpenAndClearButton, $openButton, $clearButton); + $(this).val(''); + } + + if (!singleDatePicker) { + var input1 = $this.find("input[data-start-date]") + input1.val(startDate); + var input2 = $this.find("input[data-end-date]") + input2.val(endDate); + } else { + var input = $this.find("input[data-date]") + input.val(startDate); + } + + if (singleDatePicker) { + $this.data('date', startDate); + $input.data('date', startDate); + } else { + $this.data('startDate', startDate); + $this.data('endDate', endDate); + $input.data('startDate', startDate); + $input.data('endDate', endDate); + } + + firstTrigger = false; + }); + + function formatDate(date) { + if (date) { + if (isIso) { + return date.locale('en').format(); + } + return date.locale('en').format(defaultDateFormat) + } + + return null; + } + + function getFormattedStartDate() { + if (startDate) { + return getMoment(startDate, options).format(dateFormat); + } + + return null; + } + + function getFormattedEndDate() { + if (endDate) { + return getMoment(endDate, options).format(dateFormat); + } + + return null; + } + + if (singleDatePicker) { + $this[0].getFormattedDate = getFormattedStartDate; + $input[0].getFormattedDate = getFormattedStartDate; + $dateRangePicker.getFormattedDate = getFormattedStartDate; + } else { + $dateRangePicker.getFormattedStartDate = getFormattedStartDate; + $dateRangePicker.getFormattedEndDate = getFormattedEndDate; + + $this[0].getFormattedStartDate = getFormattedStartDate; + $this[0].getFormattedEndDate = getFormattedEndDate; + + $input[0].getFormattedStartDate = getFormattedStartDate; + $input[0].getFormattedEndDate = getFormattedEndDate; + } + + $input.trigger('change'); + }); + } + abp.dom.onNodeAdded(function (args) { abp.dom.initializers.initializeToolTips(args.$el.findWithSelf('[data-toggle="tooltip"]')); abp.dom.initializers.initializePopovers(args.$el.findWithSelf('[data-toggle="popover"]')); @@ -217,6 +778,7 @@ abp.dom.initializers.initializePopovers($('[data-toggle="popover"]')); abp.dom.initializers.initializeTimeAgos($('.timeago')); abp.dom.initializers.initializeDatepickers($(document)); + abp.dom.initializers.initializeDateRangePickers($(document)); abp.dom.initializers.initializeForms($('form')); abp.dom.initializers.initializeAutocompleteSelects($('.auto-complete-select')); $('[data-auto-focus="true"]').first().findWithSelf('input,select').focus(); diff --git a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Cors/AbpCorsPolicyBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Cors/AbpCorsPolicyBuilderExtensions.cs index 97a6f55978..2ef9939c73 100644 --- a/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Cors/AbpCorsPolicyBuilderExtensions.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Cors/AbpCorsPolicyBuilderExtensions.cs @@ -1,11 +1,11 @@ using Microsoft.AspNetCore.Cors.Infrastructure; - +using Volo.Abp.Http; namespace Microsoft.AspNetCore.Cors; public static class AbpCorsPolicyBuilderExtensions { public static CorsPolicyBuilder WithAbpExposedHeaders(this CorsPolicyBuilder corsPolicyBuilder) { - return corsPolicyBuilder.WithExposedHeaders("_AbpErrorFormat"); + return corsPolicyBuilder.WithExposedHeaders(AbpHttpConsts.AbpErrorFormat).WithExposedHeaders(AbpHttpConsts.AbpTenantResolveError); } } diff --git a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs index 1e3cf13549..3bcc507e39 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/AbpCrudPageBase.cs @@ -309,7 +309,7 @@ public abstract class AbpCrudPageBase< { CurrentSorting = e.Columns .Where(c => c.SortDirection != SortDirection.Default) - .Select(c => c.Field + (c.SortDirection == SortDirection.Descending ? " DESC" : "")) + .Select(c => c.SortField + (c.SortDirection == SortDirection.Descending ? " DESC" : "")) .JoinAsString(","); CurrentPage = e.Page; @@ -608,7 +608,8 @@ public abstract class AbpCrudPageBase< yield return new TableColumn { Title = lookupPropertyDefinition.GetLocalizedDisplayName(StringLocalizerFactory), - Data = $"ExtraProperties[{propertyInfo.Name}]" + Data = $"ExtraProperties[{propertyInfo.Name}]", + PropertyName = propertyInfo.Name }; } else @@ -616,7 +617,8 @@ public abstract class AbpCrudPageBase< var column = new TableColumn { Title = propertyInfo.GetLocalizedDisplayName(StringLocalizerFactory), - Data = $"ExtraProperties[{propertyInfo.Name}]" + Data = $"ExtraProperties[{propertyInfo.Name}]", + PropertyName = propertyInfo.Name }; if (propertyInfo.IsDate() || propertyInfo.IsDateTime()) diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor index c674ec3612..88a0a1df4a 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor @@ -34,15 +34,16 @@ { if (column.Actions.Any()) { + var entityActionType = column.Actions.Count == 1 ? ActionType.Button : ActionType.Dropdown; - + @foreach (var action in column.Actions) { if (action.ConfirmationMessage != null) { + @{ var entity = context as IHasExtraProperties; diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor index 52369d6b46..2ea468f1f4 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor @@ -11,7 +11,6 @@ TValue="object" TextField="item => item?.Text" ValueField="item => item?.Value" - SelectedText="@SelectedText" SelectedValue="@SelectedValue" SelectedValueChanged="@SelectedValueChanged" SearchChanged="@SearchFilterChangedAsync" diff --git a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor.cs b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor.cs index c21db1352d..5da0138d9d 100644 --- a/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor.cs +++ b/framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor.cs @@ -23,7 +23,7 @@ namespace Volo.Abp.BlazoriseUI.Components.ObjectExtending; public partial class LookupExtensionProperty where TEntity : IHasExtraProperties { - protected List> lookupItems; + protected List> lookupItems = new(); [Inject] public ILookupApiRequestService LookupApiService { get; set; } @@ -37,17 +37,28 @@ public partial class LookupExtensionProperty } } - public string SelectedText => Entity.GetProperty(TextPropertyName); - - public LookupExtensionProperty() + protected override void OnParametersSet() { - lookupItems = new List>(); + var value = Entity.GetProperty(PropertyInfo.Name); + var text = Entity.GetProperty(TextPropertyName); + if (value != null && text != null) + { + lookupItems.Add(new SelectItem + { + Text = Entity.GetProperty(TextPropertyName).ToString(), + Value = value + }); + } } - - protected async override Task OnInitializedAsync() + + protected async override Task OnAfterRenderAsync(bool firstRender) { - await base.OnInitializedAsync(); - await SearchFilterChangedAsync(string.Empty); + await base.OnAfterRenderAsync(firstRender); + + if (firstRender) + { + await SearchFilterChangedAsync(string.Empty); + } } protected virtual void UpdateLookupTextProperty(object value) diff --git a/framework/src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.csproj b/framework/src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.csproj index 5b52e2b9e4..83a3253b07 100644 --- a/framework/src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.csproj +++ b/framework/src/Volo.Abp.Castle.Core/Volo.Abp.Castle.Core.csproj @@ -15,7 +15,7 @@ - + diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs index 03b192c851..f7a4f27e5f 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs @@ -123,10 +123,17 @@ public static class EntityHelper return typeof(IEntity).IsAssignableFrom(type); } + public static Func IsValueObjectPredicate = type => typeof(ValueObject).IsAssignableFrom(type); + public static bool IsValueObject([NotNull] Type type) { Check.NotNull(type, nameof(type)); - return typeof(ValueObject).IsAssignableFrom(type); + return IsValueObjectPredicate(type); + } + + public static bool IsValueObject(object obj) + { + return obj != null && IsValueObject(obj.GetType()); } public static void CheckEntity([NotNull] Type type) diff --git a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj index c75303ad2a..85b832eefb 100644 --- a/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj +++ b/framework/src/Volo.Abp.DistributedLocking.Abstractions/Volo.Abp.DistributedLocking.Abstractions.csproj @@ -16,7 +16,7 @@ - + diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs index e9e1f2c618..96d7b4111e 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs @@ -4,11 +4,13 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Linq.Dynamic.Core; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore.Storage; using Volo.Abp.Domain.Entities; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.DependencyInjection; @@ -73,6 +75,16 @@ public class EfCoreRepository : RepositoryBase, IE { return (await GetDbContextAsync()).Set(); } + + protected async Task GetDbConnectionAsync() + { + return (await GetDbContextAsync()).Database.GetDbConnection(); + } + + protected async Task GetDbTransactionAsync() + { + return (await GetDbContextAsync()).Database.CurrentTransaction?.GetDbTransaction(); + } protected virtual AbpEntityOptions AbpEntityOptions => _entityOptionsLazy.Value; diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs index c887175655..801e772e26 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/EntityHistory/EntityHistoryHelper.cs @@ -93,7 +93,7 @@ public class EntityHistoryHelper : IEntityHistoryHelper, ITransientDependency } var entityId = GetEntityId(entity); - if (entityId == null && changeType != EntityChangeType.Created && !(entity is ValueObject)) + if (entityId == null && changeType != EntityChangeType.Created && !EntityHelper.IsValueObject(entity)) { return null; } @@ -151,7 +151,7 @@ public class EntityHistoryHelper : IEntityHistoryHelper, ITransientDependency return keys.JoinAsString(","); } - if (entityAsObj is ValueObject) + if (EntityHelper.IsValueObject(entityAsObj)) { return null; } diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpConsts.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpConsts.cs index 6e33882a30..0e617d7ae8 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpConsts.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/AbpHttpConsts.cs @@ -3,4 +3,5 @@ public static class AbpHttpConsts { public const string AbpErrorFormat = "_AbpErrorFormat"; + public const string AbpTenantResolveError = "Abp-Tenant-Resolve-Error"; } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json index 4717b1fe9b..bcbab76211 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ar.json @@ -48,6 +48,7 @@ "Search": "بحث", "ItemWillBeDeletedMessageWithFormat": "سيتم حذف {0}!", "ItemWillBeDeletedMessage": "سوف يتم حذف هذا البند!", - "ManageYourAccount": "إدارة حسابك" + "ManageYourAccount": "إدارة حسابك", + "OthersGroup": "آخرون" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/cs.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/cs.json index 1fe7ea6a23..5dc41952a6 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/cs.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/cs.json @@ -48,6 +48,7 @@ "Search": "Vyhledávání", "ItemWillBeDeletedMessageWithFormat": "{0} bude smazáno!", "ItemWillBeDeletedMessage": "Tato položka bude smazána!", - "ManageYourAccount": "Spravujte svůj účet" + "ManageYourAccount": "Spravujte svůj účet", + "OthersGroup": "Jiný" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/de.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/de.json index edb4f7563a..dc99f75586 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/de.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/de.json @@ -48,6 +48,7 @@ "Search": "Suche", "ItemWillBeDeletedMessageWithFormat": "{0} wird gelöscht!", "ItemWillBeDeletedMessage": "Dieses Element wird gelöscht!", - "ManageYourAccount": "Verwalten Sie Ihr Benutzerkonto" + "ManageYourAccount": "Verwalten Sie Ihr Benutzerkonto", + "OthersGroup":"Andere" } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/el.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/el.json index 6bba8ee140..24a7642eb0 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/el.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/el.json @@ -48,6 +48,7 @@ "Search": "Αναζήτηση", "ItemWillBeDeletedMessageWithFormat": "Το {0} θα διαγραφεί", "ItemWillBeDeletedMessage": "Αυτό το στοιχείο θα διαγραφεί!", - "ManageYourAccount": "Διαχείριση Λογαριασμού" + "ManageYourAccount": "Διαχείριση Λογαριασμού", + "OthersGroup":"άλλος" } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en-GB.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en-GB.json index a26c5ddf9e..4b88af7d26 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en-GB.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en-GB.json @@ -48,6 +48,7 @@ "Search": "Search", "ItemWillBeDeletedMessageWithFormat": "{0} will be deleted!", "ItemWillBeDeletedMessage": "This item will be deleted!", - "ManageYourAccount": "Manage your account" + "ManageYourAccount": "Manage your account", + "OthersGroup": "Other" } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json index 2a22849731..b97ca73d1d 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json @@ -48,6 +48,9 @@ "Search": "Search", "ItemWillBeDeletedMessageWithFormat": "{0} will be deleted!", "ItemWillBeDeletedMessage": "This item will be deleted!", - "ManageYourAccount": "Manage your account" + "ManageYourAccount": "Manage your account", + "OthersGroup": "Other", + "Today": "Today", + "Apply": "Apply" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json index f2b40a785b..c28e8049bc 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/es.json @@ -48,6 +48,7 @@ "Search": "Buscar", "ItemWillBeDeletedMessageWithFormat": "{0} serán borrados!", "ItemWillBeDeletedMessage": "Este elemento será borrado", - "ManageYourAccount": "Administrar cuenta" + "ManageYourAccount": "Administrar cuenta", + "OthersGroup": "Otra" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fa.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fa.json index c2f81b9c52..4fd179573b 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fa.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fa.json @@ -48,6 +48,7 @@ "Search": "جستجو", "ItemWillBeDeletedMessageWithFormat": "{0} حذف خواهد شد!", "ItemWillBeDeletedMessage": "این مورد حذف خواهد شد!", - "ManageYourAccount": "حساب خود را مدیریت کنید" + "ManageYourAccount": "حساب خود را مدیریت کنید", + "OthersGroup": "دیگر" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fi.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fi.json index 6f8e5732be..25811c92eb 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fi.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fi.json @@ -48,6 +48,7 @@ "Search": "Hae", "ItemWillBeDeletedMessageWithFormat": "{0} poistetaan!", "ItemWillBeDeletedMessage": "Tämä kohde poistetaan!", - "ManageYourAccount": "Hallitse tiliäsi" + "ManageYourAccount": "Hallitse tiliäsi", + "OthersGroup": "Muut" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json index 0fc43162b2..b850315dfe 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/fr.json @@ -48,6 +48,7 @@ "Search": "Recherche", "ItemWillBeDeletedMessageWithFormat": "{0} sera supprimé!", "ItemWillBeDeletedMessage": "Cet objet va être supprimé!", - "ManageYourAccount": "Gérer votre compte" + "ManageYourAccount": "Gérer votre compte", + "OthersGroup": "Autre" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hi.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hi.json index 2c451bc797..0a20f1dcbb 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hi.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hi.json @@ -48,6 +48,7 @@ "Search": "खोज", "ItemWillBeDeletedMessageWithFormat": "{0} हटा दिया जाएगा!", "ItemWillBeDeletedMessage": "यह आइटम हटा दिया जाएगा!", - "ManageYourAccount": "अपने खाते का प्रबंधन" + "ManageYourAccount": "अपने खाते का प्रबंधन", + "OthersGroup": "अन्य" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hr.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hr.json index 9cbef79b12..a6285a4cee 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hr.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hr.json @@ -48,6 +48,7 @@ "Search": "Pretraga", "ItemWillBeDeletedMessageWithFormat": "{0} zapis će biti obrisan!", "ItemWillBeDeletedMessage": "Ovaj zapis će biti obrisan!", - "ManageYourAccount": "Upravljaj korisničkim računom" + "ManageYourAccount": "Upravljaj korisničkim računom", + "OthersGroup": "Drugi" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hu.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hu.json index 595e2f8b62..98c0c46f54 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hu.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/hu.json @@ -48,6 +48,7 @@ "Search": "Keresés", "ItemWillBeDeletedMessageWithFormat": "{0} törlésre kerül!", "ItemWillBeDeletedMessage": "Ez az elem törlődik!", - "ManageYourAccount": "Kezelje fiókját" + "ManageYourAccount": "Kezelje fiókját", + "OthersGroup": "Egyéb" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/is.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/is.json index a931570496..12b1565c2e 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/is.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/is.json @@ -48,6 +48,7 @@ "Search": "Leita", "ItemWillBeDeletedMessageWithFormat": "{0} verður eytt!", "ItemWillBeDeletedMessage": "Þessum lið verður eytt!", - "ManageYourAccount": "Stillingar notandaaðgangs" + "ManageYourAccount": "Stillingar notandaaðgangs", + "OthersGroup": "Annað" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/it.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/it.json index 3c4328619e..f07bf67e2d 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/it.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/it.json @@ -48,6 +48,7 @@ "Search": "Ricerca", "ItemWillBeDeletedMessageWithFormat": "{0} sarà eliminato!", "ItemWillBeDeletedMessage": "Questo elemento sarà eliminato!", - "ManageYourAccount": "Gestisci il tuo account" + "ManageYourAccount": "Gestisci il tuo account", + "OthersGroup": "Altra" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/nl.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/nl.json index d23d2356b4..5875fe07b9 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/nl.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/nl.json @@ -48,6 +48,7 @@ "Search": "Zoeken", "ItemWillBeDeletedMessageWithFormat": "{0} wordt verwijderd!", "ItemWillBeDeletedMessage": "Dit item wordt verwijderd!", - "ManageYourAccount": "Beheer uw account" + "ManageYourAccount": "Beheer uw account", + "OthersGroup": "Ander" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pl-PL.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pl-PL.json index e7cd503b4f..f2b8227137 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pl-PL.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pl-PL.json @@ -48,6 +48,7 @@ "Search": "Szukaj", "ItemWillBeDeletedMessageWithFormat": "{0} zostanie usunięty!", "ItemWillBeDeletedMessage": "Ten element zostanie usunięty!", - "ManageYourAccount": "Zarządzaj kontem" + "ManageYourAccount": "Zarządzaj kontem", + "OthersGroup": "Inny" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json index 03855ec698..928c9299fb 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json @@ -48,6 +48,7 @@ "Search": "Procurar", "ItemWillBeDeletedMessageWithFormat": "{0} será excluído!", "ItemWillBeDeletedMessage": "Este item será excluído!", - "ManageYourAccount": "Gerenciar sua conta" + "ManageYourAccount": "Gerenciar sua conta", + "OthersGroup": "Outra" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json index 7064064671..544b893c39 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ro-RO.json @@ -48,6 +48,7 @@ "Search": "Caută", "ItemWillBeDeletedMessageWithFormat": "{0} va fi şters!", "ItemWillBeDeletedMessage": "Acest articol va fi şters!", - "ManageYourAccount": "Administraţi-vă contul" + "ManageYourAccount": "Administraţi-vă contul", + "OthersGroup": "Alte" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ru.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ru.json index dc648a2138..66f24ca65d 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ru.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/ru.json @@ -48,6 +48,7 @@ "Search": "поиск", "ItemWillBeDeletedMessageWithFormat": "{0} будет удален!", "ItemWillBeDeletedMessage": "Этот предмет будет удален!", - "ManageYourAccount": "Настройте свой аккаунт" + "ManageYourAccount": "Настройте свой аккаунт", + "OthersGroup": "Другой" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sk.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sk.json index 59b2628310..28278f04f2 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sk.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sk.json @@ -48,6 +48,7 @@ "Search": "Hľadať", "ItemWillBeDeletedMessageWithFormat": "{0} sa vymaže!", "ItemWillBeDeletedMessage": "Táto položka bude vymazaná!", - "ManageYourAccount": "Spravovať svoje konto" + "ManageYourAccount": "Spravovať svoje konto", + "OthersGroup": "Iné" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json index 7a50fbaf25..c05c1dc202 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/sl.json @@ -48,6 +48,7 @@ "Search": "Iskanje", "ItemWillBeDeletedMessageWithFormat": "{0} bo izbrisan!", "ItemWillBeDeletedMessage": "Ta element bo izbrisan!", - "ManageYourAccount": "Upravljajte svoj račun" + "ManageYourAccount": "Upravljajte svoj račun", + "OthersGroup": "Ostalo" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/tr.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/tr.json index 67ae56793a..9dc46b85a8 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/tr.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/tr.json @@ -48,6 +48,9 @@ "Search": "Arama", "ItemWillBeDeletedMessageWithFormat": "{0} silinecektir!", "ItemWillBeDeletedMessage": "Bu nesne silinecektir!", - "ManageYourAccount": "Hesap yönetimi" + "ManageYourAccount": "Hesap yönetimi", + "OthersGroup": "Diğer", + "Today": "Bugün", + "Apply": "Uygula" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/vi.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/vi.json index 4062990743..1b8bc5fb5b 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/vi.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/vi.json @@ -48,6 +48,7 @@ "Search": "Tìm kiếm", "ItemWillBeDeletedMessageWithFormat": "{0} sẽ bị xóa!", "ItemWillBeDeletedMessage": "Vật phẩm này sẽ bị xoá!", - "ManageYourAccount": "Quản lý tài khoản của bạn" + "ManageYourAccount": "Quản lý tài khoản của bạn", + "OthersGroup": "Khác" } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json index 7c9d2798ff..133faa7386 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json @@ -48,6 +48,7 @@ "Search": "搜索", "ItemWillBeDeletedMessageWithFormat": "{0} 将被删除!", "ItemWillBeDeletedMessage": "此项将被删除!", - "ManageYourAccount": "管理你的账户" + "ManageYourAccount": "管理你的账户", + "OthersGroup": "其他" } } diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json index 449dd67480..7bac7da3b8 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hant.json @@ -48,6 +48,7 @@ "Search": "查詢", "ItemWillBeDeletedMessageWithFormat": "{0} 將被刪除!", "ItemWillBeDeletedMessage": "此項目將被刪除!", - "ManageYourAccount": "管理個人帳號" + "ManageYourAccount": "管理個人帳號", + "OthersGroup": "其他" } } diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/AbpAspNetCoreMvcUiBootstrapDemoModule.cs b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/AbpAspNetCoreMvcUiBootstrapDemoModule.cs index 8437109aba..c0c03a8dfe 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/AbpAspNetCoreMvcUiBootstrapDemoModule.cs +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/AbpAspNetCoreMvcUiBootstrapDemoModule.cs @@ -1,8 +1,12 @@ using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Hosting; +using Volo.Abp.AspNetCore.Mvc.UI.Bundling; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Menus; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Bundling; using Volo.Abp.Autofac; using Volo.Abp.Modularity; +using Volo.Abp.UI.Navigation; namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo; @@ -26,4 +30,31 @@ public class AbpAspNetCoreMvcUiBootstrapDemoModule : AbpModule app.UseStaticFiles(); app.UseConfiguredEndpoints(); } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.StyleBundles + .Get(StandardBundles.Styles.Global) + .AddFiles("/css/demo.css"); + } ); + + Configure(options => + { + options.MenuContributors.Add(new BootstrapDemoMenuContributor()); + }); + + Configure(options => + { + options.StyleBundles.Configure( + StandardBundles.Styles.Global, + bundleConfiguration => + { + bundleConfiguration.AddFiles("/styles/my-global-styles.css"); + } + ); + }); + + } } diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/BootstrapDemoBrandingProvider.cs b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/BootstrapDemoBrandingProvider.cs new file mode 100644 index 0000000000..b3fea361e8 --- /dev/null +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/BootstrapDemoBrandingProvider.cs @@ -0,0 +1,10 @@ +using Volo.Abp.Ui.Branding; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo; + +public class BootstrapDemoBrandingProvider : DefaultBrandingProvider +{ + public override string AppName => "Bootstrap Tag Helpers"; + + public override string LogoUrl => "/imgs/demo/abp-io-light.png"; +} \ No newline at end of file diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Menus/BootstrapDemoMenuContributor.cs b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Menus/BootstrapDemoMenuContributor.cs new file mode 100644 index 0000000000..b6fce0dce0 --- /dev/null +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Menus/BootstrapDemoMenuContributor.cs @@ -0,0 +1,93 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Menus; +using Volo.Abp.UI.Navigation; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo.Menus; + +public class BootstrapDemoMenuContributor : IMenuContributor +{ + public Task ConfigureMenuAsync(MenuConfigurationContext context) + { + if (context.Menu.Name == StandardMenus.Main) + { + AddMainMenuItems(context); + } + + return Task.CompletedTask; + } + private void AddMainMenuItems(MenuConfigurationContext context) + { + var menuItem = new ApplicationMenuItem(BootstrapDemoMenus.Components.Root, "Components"); + + var items = new List() + { + new ApplicationMenuItem(BootstrapDemoMenus.Components.Alerts, "Alerts", url: "/Components/Alerts"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Badges, "Badges", url: "/Components/Badges"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Borders, "Borders", url: "/Components/Borders"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Breadcrumbs, "Breadcrumbs", url: "/Components/Breadcrumbs"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Buttons, "Buttons", url: "/Components/Buttons"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.ButtonGroups, "Button Groups", url: "/Components/ButtonGroups"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Cards, "Cards", url: "/Components/Cards"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Carousel, "Carousel", url: "/Components/Carousel"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Collapse, "Collapse", url: "/Components/Collapse"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Dropdowns, "Dropdowns", url: "/Components/Dropdowns"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.DynamicForms, "Dynamic Forms", url: "/Components/DynamicForms"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.FormElements, "Form Elements", url: "/Components/FormElements"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Grids, "Grids", url: "/Components/Grids"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.ListGroups, "List Groups", url: "/Components/ListGroup"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Modals, "Modals", url: "/Components/Modals"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Navbars, "Navbars", url: "/Components/Navs"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Paginator, "Paginator", url: "/Components/Paginator"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Popovers, "Popovers", url: "/Components/Popovers"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.ProgressBars, "Progress Bars", url: "/Components/ProgressBars"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Tables, "Tables", url: "/Components/Tables"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Tabs, "Tabs", url: "/Components/Tabs"), + new ApplicationMenuItem(BootstrapDemoMenus.Components.Tooltips, "Tooltips", url: "/Components/Tooltips") + }; + + items.OrderBy(x => x.Name) + .ToList() + .ForEach(x => menuItem.AddItem(x)); + + context.Menu.AddItem(menuItem); + + context.Menu.AddItem( + new ApplicationMenuItem( + name: "Framework", + displayName: "Framework", + url: "https://abp.io" + ) + ); + context.Menu.AddItem( + new ApplicationMenuItem( + name: "Community", + displayName: "Community", + url: "https://community.abp.io" + ) + ); + context.Menu.AddItem( + new ApplicationMenuItem( + name: "Commercial", + displayName: "Commercial", + url: "https://commercial.abp.io" + ) + ); + context.Menu.AddItem( + new ApplicationMenuItem( + name: "Documents", + displayName: "Documents", + url: "https://Docs.abp.io" + ) + ); + context.Menu.AddItem( + new ApplicationMenuItem( + name: "Github", + displayName: "Github", + url: "https://github.com/abpframework/abp", + icon:"fa fa-github" + ) + ); + } +} diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Menus/BootstrapDemoMenus.cs b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Menus/BootstrapDemoMenus.cs new file mode 100644 index 0000000000..4227c807c6 --- /dev/null +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/Menus/BootstrapDemoMenus.cs @@ -0,0 +1,34 @@ +namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo.Pages.Menus; + +public class BootstrapDemoMenus +{ + private const string Prefix = "BootstrapDemo"; + public const string Home = Prefix + ".Home"; + + public static class Components + { + public const string Root = Prefix + ".Components"; + public const string Alerts = Root + ".Alerts"; + public const string Badges = Root + ".Badges"; + public const string Borders = Root + ".Borders"; + public const string Breadcrumbs = Root + ".Breadcrumbs"; + public const string ButtonGroups = Root + ".ButtonGroups"; + public const string Buttons = Root + ".Buttons"; + public const string Cards = Root + ".Cards"; + public const string Carousel = Root + ".Carousel"; + public const string Collapse = Root + ".Collapse"; + public const string Dropdowns = Root + ".Dropdowns"; + public const string DynamicForms = Root + ".DynamicForms"; + public const string FormElements = Root + ".FormElements"; + public const string Grids = Root + ".Grids"; + public const string ListGroups = Root + ".ListGroups"; + public const string Modals = Root + ".Modals"; + public const string Navbars = Root + ".Navbars"; + public const string Paginator = Root + ".Paginator"; + public const string Popovers = Root + ".Popovers"; + public const string ProgressBars = Root + ".ProgressBars"; + public const string Tables = Root + ".Tables"; + public const string Tabs = Root + ".Tabs"; + public const string Tooltips = Root + ".Tooltips"; + } +} \ No newline at end of file diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/_ViewStart.cshtml b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/_ViewStart.cshtml deleted file mode 100644 index 821d04a80b..0000000000 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Pages/_ViewStart.cshtml +++ /dev/null @@ -1,3 +0,0 @@ -@{ - Layout = "~/Pages/_Layout.cshtml"; -} diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json index c358e44ded..c9e953ae3a 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/package.json +++ b/modules/basic-theme/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": "^7.1.0", + "@abp/aspnetcore.mvc.ui.theme.shared": "^7.1.1", "highlight.js": "^9.13.1" }, "devDependencies": {} diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/wwwroot/imgs/demo/abp-io-light.png b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/wwwroot/imgs/demo/abp-io-light.png new file mode 100644 index 0000000000..6a671a31be Binary files /dev/null and b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/wwwroot/imgs/demo/abp-io-light.png differ diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/wwwroot/styles/my-global-styles.css b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/wwwroot/styles/my-global-styles.css new file mode 100644 index 0000000000..538e75d469 --- /dev/null +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/wwwroot/styles/my-global-styles.css @@ -0,0 +1,10 @@ +.navbar-brand{ + padding-right: 1em; + padding-top: 0.50em; +} +.navbar-brand img{ + padding-right: 2em; +} +.nav-item{ + padding-left: 2.2em; +} \ No newline at end of file diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock index 44a4c413cf..98b4449024 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/yarn.lock @@ -2,32 +2,32 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.shared@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.0.tgz#af4d0b4228fb0ead0626d344a5458856103446ff" - integrity sha512-Pn6UBgSJbOCnW0OFcLZrOH4dEpSSlBDjSy6HMm0wtdgodu9TjRYY/mAwRsjhXZTX3ycpuktVhVotB4ZLvFpgUg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.1.0" - "@abp/bootstrap" "~7.1.0" - "@abp/bootstrap-datepicker" "~7.1.0" - "@abp/bootstrap-daterangepicker" "~7.1.0" - "@abp/datatables.net-bs5" "~7.1.0" - "@abp/font-awesome" "~7.1.0" - "@abp/jquery-form" "~7.1.0" - "@abp/jquery-validation-unobtrusive" "~7.1.0" - "@abp/lodash" "~7.1.0" - "@abp/luxon" "~7.1.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.1.0" - "@abp/moment" "~7.1.0" - "@abp/select2" "~7.1.0" - "@abp/sweetalert2" "~7.1.0" - "@abp/timeago" "~7.1.0" - "@abp/toastr" "~7.1.0" - -"@abp/aspnetcore.mvc.ui@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.0.tgz#a10cc69976e294587a5274f11c216e55ebb1feb7" - integrity sha512-TGCmp4rxQiTUPaZYYGvhQSm5vjcZhJUEriuNyGSKWcs8vTC4eV6Eh6JqANU42RNxohWrQczEIWWMrQz5MEfX6g== +"@abp/aspnetcore.mvc.ui.theme.shared@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.1.tgz#48cf683b8a147bc5955de5e812a0dfa3b7184f29" + integrity sha512-caHzC5zOr2vXY2QDRKuFQ4qIWOS/DbsJUO+UhfKSHvP/bAv7Cu10K3gHwrbfuNCChDJ9iLK0+oJYXUtYBXRA3g== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.1.1" + "@abp/bootstrap" "~7.1.1" + "@abp/bootstrap-datepicker" "~7.1.1" + "@abp/bootstrap-daterangepicker" "~7.1.1" + "@abp/datatables.net-bs5" "~7.1.1" + "@abp/font-awesome" "~7.1.1" + "@abp/jquery-form" "~7.1.1" + "@abp/jquery-validation-unobtrusive" "~7.1.1" + "@abp/lodash" "~7.1.1" + "@abp/luxon" "~7.1.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.1.1" + "@abp/moment" "~7.1.1" + "@abp/select2" "~7.1.1" + "@abp/sweetalert2" "~7.1.1" + "@abp/timeago" "~7.1.1" + "@abp/toastr" "~7.1.1" + +"@abp/aspnetcore.mvc.ui@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.1.tgz#f862b77573b5c34d9b938160669400edbf06154d" + integrity sha512-+xafeXzwnFa4Evak9Wq+jrpimWITio4Yv9WeSbKInNakIPO+wJNBClBneca1XQ+LFy4bMRuqgWYJueUct+E3tA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -36,158 +36,158 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.0.tgz#2a5635f35aeb5be636dfdd5a3fe68c083507cb29" - integrity sha512-ZZTsDgrbKyU/mA8ZKKiSTsd9mTHl2n3mDWrDX7rJdZ5zyGzxxk2Dc81kQP5qUdp6OAG6chiLIPLxXntjWVnyvA== +"@abp/bootstrap-datepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.1.tgz#45c9b9086b3a64ce4ba6193320afdf2e81d12136" + integrity sha512-/T2FlMlPV19J70t8yueyxj9k72+4t3b2aVDrNHCf7uPuSqClwVKEylzGr8RFc7VXHZZwwaUrbLhxYkhkCKLuLA== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.0.tgz#1bf9a27976036c8e658d104a964742410aaca691" - integrity sha512-dhOf3aU82RDYcQc+HOObqd960SmHZTDPhS+6D9QkJ9a3PocyoBzLEi/lcgjfQytMzwsebxY8vk+S2WTUucoRuQ== +"@abp/bootstrap-daterangepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.1.tgz#19349099f6c007feef1ebe73c9c1059f8d271bc1" + integrity sha512-pCTiPRNW4gnzo0rWKbu2A52dRUeXRI3MqJW7h46yNk4n1ZrnsmwH6/b/ebp89YlbNXWaatDrEpk3NbqxSDDAdQ== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.0.tgz#52063d1f577d01d17f3b67e9bdc1ea811242b41e" - integrity sha512-S8Vnpj+cUO58C79aPum9eKlj13nY/T36ReUBPwT3CPrzStM9ab5BlNwHXR3Piyx/73i/r4Utehg18hs2fVi5Jw== +"@abp/bootstrap@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.1.tgz#1481b984a7f31f92f262d6957340fcaa87eb8ece" + integrity sha512-qFNLuBExQeVDOlFKP/STa3r+8CHhPUfsOFnPaknkS2QLewmtAZw3BJFEgvpJQkSvQdaBXW+EjutaJiFGdDrkEQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" bootstrap "^5.1.3" -"@abp/core@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.0.tgz#cffbe4a166073b394850ffd9739b0a089149a3fb" - integrity sha512-+DLBAtXo5BRYwcQH3yFzya0EZj8wd0/BE2QmXTVJ+nxQly+cp7ZV98oRIzI7ArIIV52Th4CXHwZv0l0U0Rdisg== +"@abp/core@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.1.tgz#de4d666d26fba4ab5f7b3e6fff38f2f5f034d121" + integrity sha512-d/vHAAU60v6gdH3+VpchXDD1l5yXNmKsb3i92gvG9M0orjgVy3dJmb6zBVw50nnZxNSfq3Z0S1TC/QdA2C1rQg== dependencies: - "@abp/utils" "~7.1.0" + "@abp/utils" "~7.1.1" -"@abp/datatables.net-bs5@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.0.tgz#3c2289290c3667cad69604d6184fb9b77263f137" - integrity sha512-1LqROrLgFOiUN3E28s5qEu82Zdy4kLGJ6a7f1J6OAvqGXF62DRbKhoS8Rsd5DOV+JHCRnAx8PnTBhlUbl2zmoQ== +"@abp/datatables.net-bs5@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.1.tgz#b7058a0cad4119cc7391493a7d148250efc41b72" + integrity sha512-uPqHzfE9dH5nEuocvIduQYcjEa4MwBXMjtnY5tHM+PK2yB8DsDOrXVopOX0YPTgFk49pLvOVbgxsftuyPb3xKQ== dependencies: - "@abp/datatables.net" "~7.1.0" + "@abp/datatables.net" "~7.1.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.0.tgz#e26dd279276dd38dff485c68bb92b77a4737b625" - integrity sha512-vwihQI6Sxp9gktMSSQ99HwS8oHoYZh1zmZWEnVNAvMnTlxMhqwHEIK2y0XkT/jI3z5NGntz75qFSoqHGFLRAbw== +"@abp/datatables.net@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.1.tgz#a84975c8ab0d7406e524d2eae41f7a04bc00f13c" + integrity sha512-eKIxvap/bKc1G7Dev+t9V8HvHWQYza0Y4RdYmC0bPOyRthlTW9AH8jyKK5HtJlpNpj9rjB2jy3/I9D1uzD67QQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.0.tgz#65d9919c3d511197e4518ce25164f767c4776a5a" - integrity sha512-1u0zBE26iNv3YjQ1gTv8rozt6jSXDD0OISMXRT90BAGpOrEHoUB9VaRx4q7AXIrPye95RhfpccGbWE31vPEguw== +"@abp/font-awesome@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.1.tgz#da4a0be295b0acf9b62d8299d1c567ae192a320f" + integrity sha512-AVjbSFXj5IzzQwqwP/fgsuRG1NzV6/KGn5owsfn6HeKSOBjqW4h4EGyunMNoAOW4fsdFxvE4zjBpsG1/E9tuQg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.0.tgz#e1d29ea105a3c4664057fea6c03999ff9529ee59" - integrity sha512-GuJC3TTclKk47mMjtasZBkKF1KqZcvUCXTkTM165U3hN80Bn5GjbS48oXz/iHI70lWNDsycVRrrrc8guwksvzg== +"@abp/jquery-form@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.1.tgz#03c17ccb19820e0a56be58275e2ebba7e7ebaa5f" + integrity sha512-UurenNEYZRN192B70R3DR1NsFUae45h/2huAQD07OM0fyJyM6ji5N7q/Q2Aao0jqBLwRNPrEinUcP8BmJxe2Tw== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.0.tgz#0eb2364582337d530aa6f24fcbaaefa40fda6f7a" - integrity sha512-JiZvmSBt/Q8kZ15wazRDf738UjY1ZCpNm0fE47mpokE9T1YiD8DVDnv4qFDa7ActB5PsfwD1vRANNrmfUsSJcw== +"@abp/jquery-validation-unobtrusive@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.1.tgz#255146ccc553bb9f9197ccf87fa71d930698cf65" + integrity sha512-oUYvNmiGxeyJeGoG3EWAzy2Ld9EKgyK6U28gKaAMrXFlYbiEMnX5+8v1Tdb3sQuOJ68bdiyYjO3Ke9NLsTZHFg== dependencies: - "@abp/jquery-validation" "~7.1.0" + "@abp/jquery-validation" "~7.1.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.0.tgz#2c28095e4fccbaea78dc1f0c5459456380727079" - integrity sha512-rXCrd1ZZ2pse4MgF2fB6e/880UiaHuk+ZXBg/y8Yj2Ab5OVsUuCw9CpsjHOplWC6Rq5A8SjO7BCdI4juxb3xHQ== +"@abp/jquery-validation@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.1.tgz#b3af6606daaa6303c28f6a04aeaa2d6612c5248b" + integrity sha512-ZkDWUbHqF9NkczPdvEZH4gkb6NeXRI5JsROXzmx3K+QIOGUhs//4gOzSYYak0kn0Mljeg8fjJQNa55914d8Xow== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.0.tgz#5c43c7b4fff5f04f7bf9f763e6c2e57f000cbb10" - integrity sha512-JPgrVkRVnxFFm96movaOsfM4NsDghIdfAwo25Qz4t5hAeiAVusTCULML5Ds1IjHHQBjbYV/81Zno3xHzC4eU8A== +"@abp/jquery@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.1.tgz#43adacf3d345576ff7ca42a5a470eb61fb827e23" + integrity sha512-3Epxyyoz1BJge7lbimkg0Ha4DmNlZN5vYFgVKa8SOCoKfoZ7+8gmbXlUEAUe4wnsjP5tQ4/AjoqgzjPL9KQcCg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" jquery "~3.6.0" -"@abp/lodash@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.0.tgz#d187bdac06a1425737837521d09aaf998d49bd08" - integrity sha512-/PmbRfN8ACBey4r8QpwSad38n720yZG5WY/lvddCoBmhJYeUtEr0moFF4g2x0wVm7U1wVXQK6RR9GOr0Q2A7Og== +"@abp/lodash@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.1.tgz#7371484331867775adcb5f4a92d63d4cbed25f19" + integrity sha512-hwNcYcRNZZV5OgH+W775OkpJ5JmrDi+LiVFDAmelWgAXSgqxic8bDla+UUL/pjnkKxwgI4BAlOIctYN/2QM3iA== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" lodash "^4.17.21" -"@abp/luxon@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.0.tgz#e6e119736e0340df162aeaf6546ec322253fee7e" - integrity sha512-UqsJTELF9bxZgE4v9dSfuHvyhinqFPKWZD1ctzTv4At5wie5yrqa+r5y59rPRui3svBxiZXSSZKmDCZnaoFW+w== +"@abp/luxon@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.1.tgz#b0cf4a72ffe66f77d403b896ea5d1ea007ebc9b7" + integrity sha512-2RDIdHrPUDvOoowQlMInfQ0rDZA8IOf2fVs7C2bcZmhjGoK7+vsUJsw/q9awpgeKrHwqJ0o1zsFGfFFKlYMnew== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.0.tgz#f113854212adcddbb142ee54f27e8f3876a22e7c" - integrity sha512-IIbDZ/7fjcnZ05ZHbX6KrlDlkXzZLD8w7teAoMuhBcLZeP3PWythzFYbCc6LwvtgvvkfriyPSth4PCsv2mh/gw== +"@abp/malihu-custom-scrollbar-plugin@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.1.tgz#8a25f3dd78c1f0c395ac255976567d2919d3ec38" + integrity sha512-kfW+B+kFr0Qao17rDginL0ICPwGA3t387hx5LhPIxP2p7aluaA3qyiEbM50Izz+t4mL4JdaBN8DU0kLziqVERw== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.0.tgz#c924fd6278992d8939501903347808a2ded053aa" - integrity sha512-pwbGxx/h0U0NILec6ZscHt6FBOyCUi8TTZzp1B7W9hpC3KSh4qGH1fUM2LI1mXFLl8c/exmVs7aZMN/24KgBag== +"@abp/moment@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.1.tgz#5cf7f815cc4dbe55c9c363d146592683f8a90d62" + integrity sha512-tgg4rTmAGZE+B8OBpeq1ADXJW07EdkCkQUSrLykWMaQr1PZfs9xi0tgsi4CpdITLOK48b9BueRmUdZOgmFXKiQ== dependencies: moment "^2.9.0" -"@abp/select2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.0.tgz#30522455c70059251e593cdb0228dbbf831bbb78" - integrity sha512-VPdqxjT8URm1rkwsPvutOgFPs/JTlm8KVcvdV1UsvJMxx5OIKMKcxgsL9UJl033HzVVwp/XBsMQsaNRHnW+hvw== +"@abp/select2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.1.tgz#1afa414ce68c1f35c3e7ab1beee00f924604de51" + integrity sha512-+5MMLQuXlj07VIXhVKEAmeqsfuGXHWwtpDY2LMsT15lNJbrvq0wF9KZJ0eMF8u29Nyk8IuBJf1YRUzx815PiVg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.0.tgz#7cbf9c53ab9e1db2c59d63f392ba9b62624272f6" - integrity sha512-5NL2TijufGF5Jdbed1V+s6+tCa/C/R/ZSfb7CjQnBOCSC0JNhBDHtRabOaouqr2la4xbAEHjIoyXEnWXYAidYw== +"@abp/sweetalert2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.1.tgz#9ba7578ab53af056f26ef34ae0f2fddc28722c12" + integrity sha512-8hjmEqmcRoMN3Cmk7k0lNdtsm8JytrjPzvHahjqKHIcK1Zi0RbjWJpafbvDu5IFlFrRNYHXlqpUw8e3dtCEp3A== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.0.tgz#96909f2d0d27ac977d0caf6a0e2b725681f8124e" - integrity sha512-gWDwvnVSVKPBaOaJCaqhvcqS/GwTQFzNH6dWIH19/g23rF3+s/KwTyoW5AA8uWStBx1PxZaugR0OIK/7hctUog== +"@abp/timeago@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.1.tgz#c7be25a320aa311e2e9c7a8186b51766db4523ac" + integrity sha512-FsIjAiP2dqRHwrrKx/5tWgLMZ2LboNLhrHeRb1FFol/0163uVEQGEJkxLOE5xY530mdaFFfAOc0x6aniSLE4ZQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" timeago "^1.6.7" -"@abp/toastr@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.0.tgz#c11d780c86c16835528f152aac4cbe4aa94bb810" - integrity sha512-awgpA6J65TlMK54Hdq2fyDsZ6nvD69RKfAUaGzpz685tNbvaqQfXxSlBQVEad8QZlMGFeCOAmH9GYkBHNaP/zg== +"@abp/toastr@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.1.tgz#5ef7da983a226f226d8b9b85f2fa9ff7eeed41aa" + integrity sha512-8x8FQt8BSmgI1b6JXK7N+JJJ0ksBcFSMQol0AbzTOFOBO2T77eXIuiVh8961ynaeIECjGWcazXUMuG09Drq6Ig== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" toastr "^2.1.4" -"@abp/utils@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.0.tgz#fb52fdc21e8d26a32245eefac86c512a9318ee47" - integrity sha512-CorSSUsaVug2qY6f4j2uxtAjdSq1dfdq1QdjdQaoPxoZKU74Yv/Cyh7YZ+WJa3Upmaw4V0+6ELX9RE3OjJIxIQ== +"@abp/utils@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.1.tgz#e11bc878573dd8118e42b3c1582c44d8b5c71d83" + integrity sha512-G4S0ndDUe8W525O8KUBucLcrESoSFjeqLjRZ+W7N7K9D/oLisYU9Siwxb2csTdjXz6JeQ7AtQl7ak1WpAMiJ/g== dependencies: just-compare "^1.3.0" diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json index 1c7ac4cfd3..33a1d6e702 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/package.json +++ b/modules/basic-theme/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": "^7.1.0", - "@abp/prismjs": "^7.1.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.1", + "@abp/prismjs": "^7.1.1" }, "devDependencies": {} } diff --git a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock index e132e1d51e..189b5134b9 100644 --- a/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock +++ b/modules/basic-theme/test/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Demo/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.0.tgz#79b5154f041fde68ecf81a920f756d16157cb439" - integrity sha512-rmrPRviLwlAN+o48ZnzPoRRYv78Uqwd1eSX6ftaf4CPxbb+bQJAKAcL5FbAnNheLesL62sn4x11Q60F8Mp850g== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.0.tgz#af4d0b4228fb0ead0626d344a5458856103446ff" - integrity sha512-Pn6UBgSJbOCnW0OFcLZrOH4dEpSSlBDjSy6HMm0wtdgodu9TjRYY/mAwRsjhXZTX3ycpuktVhVotB4ZLvFpgUg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.1.0" - "@abp/bootstrap" "~7.1.0" - "@abp/bootstrap-datepicker" "~7.1.0" - "@abp/bootstrap-daterangepicker" "~7.1.0" - "@abp/datatables.net-bs5" "~7.1.0" - "@abp/font-awesome" "~7.1.0" - "@abp/jquery-form" "~7.1.0" - "@abp/jquery-validation-unobtrusive" "~7.1.0" - "@abp/lodash" "~7.1.0" - "@abp/luxon" "~7.1.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.1.0" - "@abp/moment" "~7.1.0" - "@abp/select2" "~7.1.0" - "@abp/sweetalert2" "~7.1.0" - "@abp/timeago" "~7.1.0" - "@abp/toastr" "~7.1.0" - -"@abp/aspnetcore.mvc.ui@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.0.tgz#a10cc69976e294587a5274f11c216e55ebb1feb7" - integrity sha512-TGCmp4rxQiTUPaZYYGvhQSm5vjcZhJUEriuNyGSKWcs8vTC4eV6Eh6JqANU42RNxohWrQczEIWWMrQz5MEfX6g== +"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.1.tgz#9368779919662a804a8119ac6cf9b731fa2a9728" + integrity sha512-xMUBHJv9pLWp3wx3Oc6+F4G8biZ+BgCskYzAgV2lLWFjQAUxe8klbP0dsVr0EZemyMctX6zlHLURRIl+Os8Z2Q== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.1.tgz#48cf683b8a147bc5955de5e812a0dfa3b7184f29" + integrity sha512-caHzC5zOr2vXY2QDRKuFQ4qIWOS/DbsJUO+UhfKSHvP/bAv7Cu10K3gHwrbfuNCChDJ9iLK0+oJYXUtYBXRA3g== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.1.1" + "@abp/bootstrap" "~7.1.1" + "@abp/bootstrap-datepicker" "~7.1.1" + "@abp/bootstrap-daterangepicker" "~7.1.1" + "@abp/datatables.net-bs5" "~7.1.1" + "@abp/font-awesome" "~7.1.1" + "@abp/jquery-form" "~7.1.1" + "@abp/jquery-validation-unobtrusive" "~7.1.1" + "@abp/lodash" "~7.1.1" + "@abp/luxon" "~7.1.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.1.1" + "@abp/moment" "~7.1.1" + "@abp/select2" "~7.1.1" + "@abp/sweetalert2" "~7.1.1" + "@abp/timeago" "~7.1.1" + "@abp/toastr" "~7.1.1" + +"@abp/aspnetcore.mvc.ui@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.1.tgz#f862b77573b5c34d9b938160669400edbf06154d" + integrity sha512-+xafeXzwnFa4Evak9Wq+jrpimWITio4Yv9WeSbKInNakIPO+wJNBClBneca1XQ+LFy4bMRuqgWYJueUct+E3tA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,175 +43,175 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.0.tgz#2a5635f35aeb5be636dfdd5a3fe68c083507cb29" - integrity sha512-ZZTsDgrbKyU/mA8ZKKiSTsd9mTHl2n3mDWrDX7rJdZ5zyGzxxk2Dc81kQP5qUdp6OAG6chiLIPLxXntjWVnyvA== +"@abp/bootstrap-datepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.1.tgz#45c9b9086b3a64ce4ba6193320afdf2e81d12136" + integrity sha512-/T2FlMlPV19J70t8yueyxj9k72+4t3b2aVDrNHCf7uPuSqClwVKEylzGr8RFc7VXHZZwwaUrbLhxYkhkCKLuLA== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.0.tgz#1bf9a27976036c8e658d104a964742410aaca691" - integrity sha512-dhOf3aU82RDYcQc+HOObqd960SmHZTDPhS+6D9QkJ9a3PocyoBzLEi/lcgjfQytMzwsebxY8vk+S2WTUucoRuQ== +"@abp/bootstrap-daterangepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.1.tgz#19349099f6c007feef1ebe73c9c1059f8d271bc1" + integrity sha512-pCTiPRNW4gnzo0rWKbu2A52dRUeXRI3MqJW7h46yNk4n1ZrnsmwH6/b/ebp89YlbNXWaatDrEpk3NbqxSDDAdQ== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.0.tgz#52063d1f577d01d17f3b67e9bdc1ea811242b41e" - integrity sha512-S8Vnpj+cUO58C79aPum9eKlj13nY/T36ReUBPwT3CPrzStM9ab5BlNwHXR3Piyx/73i/r4Utehg18hs2fVi5Jw== +"@abp/bootstrap@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.1.tgz#1481b984a7f31f92f262d6957340fcaa87eb8ece" + integrity sha512-qFNLuBExQeVDOlFKP/STa3r+8CHhPUfsOFnPaknkS2QLewmtAZw3BJFEgvpJQkSvQdaBXW+EjutaJiFGdDrkEQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" bootstrap "^5.1.3" -"@abp/clipboard@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.1.0.tgz#21531f61322fc64114350972c9cedaa54f7114ae" - integrity sha512-1woUBwgtvsThNmEzYyIb46O13jchetY/HkYaOpwbLW6A13Qrsa0lHbABUDLpLp685T/1M/9lweOhWvNxRw2Ozw== +"@abp/clipboard@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.1.1.tgz#06985266e399a03f819585ec9b9ae17ffcbfef0b" + integrity sha512-IxlQJgNlhp6hMVAkPqRgzmB0a5bKdrZ0whVlaxNKR42geetutV+5KPo/koCmliksHLAFTfiAedQXOXsJ90p2AQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" clipboard "^2.0.8" -"@abp/core@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.0.tgz#cffbe4a166073b394850ffd9739b0a089149a3fb" - integrity sha512-+DLBAtXo5BRYwcQH3yFzya0EZj8wd0/BE2QmXTVJ+nxQly+cp7ZV98oRIzI7ArIIV52Th4CXHwZv0l0U0Rdisg== +"@abp/core@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.1.tgz#de4d666d26fba4ab5f7b3e6fff38f2f5f034d121" + integrity sha512-d/vHAAU60v6gdH3+VpchXDD1l5yXNmKsb3i92gvG9M0orjgVy3dJmb6zBVw50nnZxNSfq3Z0S1TC/QdA2C1rQg== dependencies: - "@abp/utils" "~7.1.0" + "@abp/utils" "~7.1.1" -"@abp/datatables.net-bs5@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.0.tgz#3c2289290c3667cad69604d6184fb9b77263f137" - integrity sha512-1LqROrLgFOiUN3E28s5qEu82Zdy4kLGJ6a7f1J6OAvqGXF62DRbKhoS8Rsd5DOV+JHCRnAx8PnTBhlUbl2zmoQ== +"@abp/datatables.net-bs5@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.1.tgz#b7058a0cad4119cc7391493a7d148250efc41b72" + integrity sha512-uPqHzfE9dH5nEuocvIduQYcjEa4MwBXMjtnY5tHM+PK2yB8DsDOrXVopOX0YPTgFk49pLvOVbgxsftuyPb3xKQ== dependencies: - "@abp/datatables.net" "~7.1.0" + "@abp/datatables.net" "~7.1.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.0.tgz#e26dd279276dd38dff485c68bb92b77a4737b625" - integrity sha512-vwihQI6Sxp9gktMSSQ99HwS8oHoYZh1zmZWEnVNAvMnTlxMhqwHEIK2y0XkT/jI3z5NGntz75qFSoqHGFLRAbw== +"@abp/datatables.net@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.1.tgz#a84975c8ab0d7406e524d2eae41f7a04bc00f13c" + integrity sha512-eKIxvap/bKc1G7Dev+t9V8HvHWQYza0Y4RdYmC0bPOyRthlTW9AH8jyKK5HtJlpNpj9rjB2jy3/I9D1uzD67QQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.0.tgz#65d9919c3d511197e4518ce25164f767c4776a5a" - integrity sha512-1u0zBE26iNv3YjQ1gTv8rozt6jSXDD0OISMXRT90BAGpOrEHoUB9VaRx4q7AXIrPye95RhfpccGbWE31vPEguw== +"@abp/font-awesome@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.1.tgz#da4a0be295b0acf9b62d8299d1c567ae192a320f" + integrity sha512-AVjbSFXj5IzzQwqwP/fgsuRG1NzV6/KGn5owsfn6HeKSOBjqW4h4EGyunMNoAOW4fsdFxvE4zjBpsG1/E9tuQg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.0.tgz#e1d29ea105a3c4664057fea6c03999ff9529ee59" - integrity sha512-GuJC3TTclKk47mMjtasZBkKF1KqZcvUCXTkTM165U3hN80Bn5GjbS48oXz/iHI70lWNDsycVRrrrc8guwksvzg== +"@abp/jquery-form@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.1.tgz#03c17ccb19820e0a56be58275e2ebba7e7ebaa5f" + integrity sha512-UurenNEYZRN192B70R3DR1NsFUae45h/2huAQD07OM0fyJyM6ji5N7q/Q2Aao0jqBLwRNPrEinUcP8BmJxe2Tw== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.0.tgz#0eb2364582337d530aa6f24fcbaaefa40fda6f7a" - integrity sha512-JiZvmSBt/Q8kZ15wazRDf738UjY1ZCpNm0fE47mpokE9T1YiD8DVDnv4qFDa7ActB5PsfwD1vRANNrmfUsSJcw== +"@abp/jquery-validation-unobtrusive@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.1.tgz#255146ccc553bb9f9197ccf87fa71d930698cf65" + integrity sha512-oUYvNmiGxeyJeGoG3EWAzy2Ld9EKgyK6U28gKaAMrXFlYbiEMnX5+8v1Tdb3sQuOJ68bdiyYjO3Ke9NLsTZHFg== dependencies: - "@abp/jquery-validation" "~7.1.0" + "@abp/jquery-validation" "~7.1.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.0.tgz#2c28095e4fccbaea78dc1f0c5459456380727079" - integrity sha512-rXCrd1ZZ2pse4MgF2fB6e/880UiaHuk+ZXBg/y8Yj2Ab5OVsUuCw9CpsjHOplWC6Rq5A8SjO7BCdI4juxb3xHQ== +"@abp/jquery-validation@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.1.tgz#b3af6606daaa6303c28f6a04aeaa2d6612c5248b" + integrity sha512-ZkDWUbHqF9NkczPdvEZH4gkb6NeXRI5JsROXzmx3K+QIOGUhs//4gOzSYYak0kn0Mljeg8fjJQNa55914d8Xow== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.0.tgz#5c43c7b4fff5f04f7bf9f763e6c2e57f000cbb10" - integrity sha512-JPgrVkRVnxFFm96movaOsfM4NsDghIdfAwo25Qz4t5hAeiAVusTCULML5Ds1IjHHQBjbYV/81Zno3xHzC4eU8A== +"@abp/jquery@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.1.tgz#43adacf3d345576ff7ca42a5a470eb61fb827e23" + integrity sha512-3Epxyyoz1BJge7lbimkg0Ha4DmNlZN5vYFgVKa8SOCoKfoZ7+8gmbXlUEAUe4wnsjP5tQ4/AjoqgzjPL9KQcCg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" jquery "~3.6.0" -"@abp/lodash@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.0.tgz#d187bdac06a1425737837521d09aaf998d49bd08" - integrity sha512-/PmbRfN8ACBey4r8QpwSad38n720yZG5WY/lvddCoBmhJYeUtEr0moFF4g2x0wVm7U1wVXQK6RR9GOr0Q2A7Og== +"@abp/lodash@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.1.tgz#7371484331867775adcb5f4a92d63d4cbed25f19" + integrity sha512-hwNcYcRNZZV5OgH+W775OkpJ5JmrDi+LiVFDAmelWgAXSgqxic8bDla+UUL/pjnkKxwgI4BAlOIctYN/2QM3iA== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" lodash "^4.17.21" -"@abp/luxon@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.0.tgz#e6e119736e0340df162aeaf6546ec322253fee7e" - integrity sha512-UqsJTELF9bxZgE4v9dSfuHvyhinqFPKWZD1ctzTv4At5wie5yrqa+r5y59rPRui3svBxiZXSSZKmDCZnaoFW+w== +"@abp/luxon@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.1.tgz#b0cf4a72ffe66f77d403b896ea5d1ea007ebc9b7" + integrity sha512-2RDIdHrPUDvOoowQlMInfQ0rDZA8IOf2fVs7C2bcZmhjGoK7+vsUJsw/q9awpgeKrHwqJ0o1zsFGfFFKlYMnew== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.0.tgz#f113854212adcddbb142ee54f27e8f3876a22e7c" - integrity sha512-IIbDZ/7fjcnZ05ZHbX6KrlDlkXzZLD8w7teAoMuhBcLZeP3PWythzFYbCc6LwvtgvvkfriyPSth4PCsv2mh/gw== +"@abp/malihu-custom-scrollbar-plugin@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.1.tgz#8a25f3dd78c1f0c395ac255976567d2919d3ec38" + integrity sha512-kfW+B+kFr0Qao17rDginL0ICPwGA3t387hx5LhPIxP2p7aluaA3qyiEbM50Izz+t4mL4JdaBN8DU0kLziqVERw== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.0.tgz#c924fd6278992d8939501903347808a2ded053aa" - integrity sha512-pwbGxx/h0U0NILec6ZscHt6FBOyCUi8TTZzp1B7W9hpC3KSh4qGH1fUM2LI1mXFLl8c/exmVs7aZMN/24KgBag== +"@abp/moment@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.1.tgz#5cf7f815cc4dbe55c9c363d146592683f8a90d62" + integrity sha512-tgg4rTmAGZE+B8OBpeq1ADXJW07EdkCkQUSrLykWMaQr1PZfs9xi0tgsi4CpdITLOK48b9BueRmUdZOgmFXKiQ== dependencies: moment "^2.9.0" -"@abp/prismjs@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.1.0.tgz#e9dc477f5d8728532a7c27e8e1b309a20b1aa32c" - integrity sha512-7pBxUKgqYaEEsuA7AUcdYJh05x2v0NVdkOc5n7KEw/ixqzB6d40SDBKndYg8ns+Zknvh6IK6e2FjOO+y/hWloQ== +"@abp/prismjs@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.1.1.tgz#bfcee96e5a1e2f98fb29006f16aeeb227a4e773d" + integrity sha512-7o7FRzgGNPR9GxQ6CPskWL2N87LykoylKnkCm0Cz0n+x0JSrAEMv2yEiJJT2L1S+51ldCQhBmF2blOjxgUT98A== dependencies: - "@abp/clipboard" "~7.1.0" - "@abp/core" "~7.1.0" + "@abp/clipboard" "~7.1.1" + "@abp/core" "~7.1.1" prismjs "^1.26.0" -"@abp/select2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.0.tgz#30522455c70059251e593cdb0228dbbf831bbb78" - integrity sha512-VPdqxjT8URm1rkwsPvutOgFPs/JTlm8KVcvdV1UsvJMxx5OIKMKcxgsL9UJl033HzVVwp/XBsMQsaNRHnW+hvw== +"@abp/select2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.1.tgz#1afa414ce68c1f35c3e7ab1beee00f924604de51" + integrity sha512-+5MMLQuXlj07VIXhVKEAmeqsfuGXHWwtpDY2LMsT15lNJbrvq0wF9KZJ0eMF8u29Nyk8IuBJf1YRUzx815PiVg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.0.tgz#7cbf9c53ab9e1db2c59d63f392ba9b62624272f6" - integrity sha512-5NL2TijufGF5Jdbed1V+s6+tCa/C/R/ZSfb7CjQnBOCSC0JNhBDHtRabOaouqr2la4xbAEHjIoyXEnWXYAidYw== +"@abp/sweetalert2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.1.tgz#9ba7578ab53af056f26ef34ae0f2fddc28722c12" + integrity sha512-8hjmEqmcRoMN3Cmk7k0lNdtsm8JytrjPzvHahjqKHIcK1Zi0RbjWJpafbvDu5IFlFrRNYHXlqpUw8e3dtCEp3A== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.0.tgz#96909f2d0d27ac977d0caf6a0e2b725681f8124e" - integrity sha512-gWDwvnVSVKPBaOaJCaqhvcqS/GwTQFzNH6dWIH19/g23rF3+s/KwTyoW5AA8uWStBx1PxZaugR0OIK/7hctUog== +"@abp/timeago@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.1.tgz#c7be25a320aa311e2e9c7a8186b51766db4523ac" + integrity sha512-FsIjAiP2dqRHwrrKx/5tWgLMZ2LboNLhrHeRb1FFol/0163uVEQGEJkxLOE5xY530mdaFFfAOc0x6aniSLE4ZQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" timeago "^1.6.7" -"@abp/toastr@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.0.tgz#c11d780c86c16835528f152aac4cbe4aa94bb810" - integrity sha512-awgpA6J65TlMK54Hdq2fyDsZ6nvD69RKfAUaGzpz685tNbvaqQfXxSlBQVEad8QZlMGFeCOAmH9GYkBHNaP/zg== +"@abp/toastr@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.1.tgz#5ef7da983a226f226d8b9b85f2fa9ff7eeed41aa" + integrity sha512-8x8FQt8BSmgI1b6JXK7N+JJJ0ksBcFSMQol0AbzTOFOBO2T77eXIuiVh8961ynaeIECjGWcazXUMuG09Drq6Ig== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" toastr "^2.1.4" -"@abp/utils@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.0.tgz#fb52fdc21e8d26a32245eefac86c512a9318ee47" - integrity sha512-CorSSUsaVug2qY6f4j2uxtAjdSq1dfdq1QdjdQaoPxoZKU74Yv/Cyh7YZ+WJa3Upmaw4V0+6ELX9RE3OjJIxIQ== +"@abp/utils@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.1.tgz#e11bc878573dd8118e42b3c1582c44d8b5c71d83" + integrity sha512-G4S0ndDUe8W525O8KUBucLcrESoSFjeqLjRZ+W7N7K9D/oLisYU9Siwxb2csTdjXz6JeQ7AtQl7ak1WpAMiJ/g== dependencies: just-compare "^1.3.0" diff --git a/modules/blogging/app/Volo.BloggingTestApp/package.json b/modules/blogging/app/Volo.BloggingTestApp/package.json index 50688cb2ae..eced81afcd 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": "^7.1.0", - "@abp/blogging": "^7.1.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.1", + "@abp/blogging": "^7.1.1" } } diff --git a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock index b71f475667..75067839b2 100644 --- a/modules/blogging/app/Volo.BloggingTestApp/yarn.lock +++ b/modules/blogging/app/Volo.BloggingTestApp/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.0.tgz#79b5154f041fde68ecf81a920f756d16157cb439" - integrity sha512-rmrPRviLwlAN+o48ZnzPoRRYv78Uqwd1eSX6ftaf4CPxbb+bQJAKAcL5FbAnNheLesL62sn4x11Q60F8Mp850g== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.0.tgz#af4d0b4228fb0ead0626d344a5458856103446ff" - integrity sha512-Pn6UBgSJbOCnW0OFcLZrOH4dEpSSlBDjSy6HMm0wtdgodu9TjRYY/mAwRsjhXZTX3ycpuktVhVotB4ZLvFpgUg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.1.0" - "@abp/bootstrap" "~7.1.0" - "@abp/bootstrap-datepicker" "~7.1.0" - "@abp/bootstrap-daterangepicker" "~7.1.0" - "@abp/datatables.net-bs5" "~7.1.0" - "@abp/font-awesome" "~7.1.0" - "@abp/jquery-form" "~7.1.0" - "@abp/jquery-validation-unobtrusive" "~7.1.0" - "@abp/lodash" "~7.1.0" - "@abp/luxon" "~7.1.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.1.0" - "@abp/moment" "~7.1.0" - "@abp/select2" "~7.1.0" - "@abp/sweetalert2" "~7.1.0" - "@abp/timeago" "~7.1.0" - "@abp/toastr" "~7.1.0" - -"@abp/aspnetcore.mvc.ui@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.0.tgz#a10cc69976e294587a5274f11c216e55ebb1feb7" - integrity sha512-TGCmp4rxQiTUPaZYYGvhQSm5vjcZhJUEriuNyGSKWcs8vTC4eV6Eh6JqANU42RNxohWrQczEIWWMrQz5MEfX6g== +"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.1.tgz#9368779919662a804a8119ac6cf9b731fa2a9728" + integrity sha512-xMUBHJv9pLWp3wx3Oc6+F4G8biZ+BgCskYzAgV2lLWFjQAUxe8klbP0dsVr0EZemyMctX6zlHLURRIl+Os8Z2Q== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.1.tgz#48cf683b8a147bc5955de5e812a0dfa3b7184f29" + integrity sha512-caHzC5zOr2vXY2QDRKuFQ4qIWOS/DbsJUO+UhfKSHvP/bAv7Cu10K3gHwrbfuNCChDJ9iLK0+oJYXUtYBXRA3g== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.1.1" + "@abp/bootstrap" "~7.1.1" + "@abp/bootstrap-datepicker" "~7.1.1" + "@abp/bootstrap-daterangepicker" "~7.1.1" + "@abp/datatables.net-bs5" "~7.1.1" + "@abp/font-awesome" "~7.1.1" + "@abp/jquery-form" "~7.1.1" + "@abp/jquery-validation-unobtrusive" "~7.1.1" + "@abp/lodash" "~7.1.1" + "@abp/luxon" "~7.1.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.1.1" + "@abp/moment" "~7.1.1" + "@abp/select2" "~7.1.1" + "@abp/sweetalert2" "~7.1.1" + "@abp/timeago" "~7.1.1" + "@abp/toastr" "~7.1.1" + +"@abp/aspnetcore.mvc.ui@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.1.tgz#f862b77573b5c34d9b938160669400edbf06154d" + integrity sha512-+xafeXzwnFa4Evak9Wq+jrpimWITio4Yv9WeSbKInNakIPO+wJNBClBneca1XQ+LFy4bMRuqgWYJueUct+E3tA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,201 +43,201 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/blogging@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-7.1.0.tgz#ca555eb3c85de4ec6b96aad15669a3f4ad7ccff8" - integrity sha512-S4O2wwbh3uIHsuz5ART8rqDoJ0gLU4Gwop9KRH0EvohvMAFjGI5v1bkbwo3/3V9R4/xt9tn4VLK/x4QEIpaPgw== +"@abp/blogging@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/blogging/-/blogging-7.1.1.tgz#36f3c80469fd2091056f0426d172248660f3ad6a" + integrity sha512-qd9s/fyZWcw4T4x3kFaHQPaYn8+7E6xPrx+o3fR67EEzPMtkCvugw7aIkQtEfeWJ17wHBOiXKZPTDA33bJ8d6Q== dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.0" - "@abp/owl.carousel" "~7.1.0" - "@abp/prismjs" "~7.1.0" - "@abp/tui-editor" "~7.1.0" + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.1" + "@abp/owl.carousel" "~7.1.1" + "@abp/prismjs" "~7.1.1" + "@abp/tui-editor" "~7.1.1" -"@abp/bootstrap-datepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.0.tgz#2a5635f35aeb5be636dfdd5a3fe68c083507cb29" - integrity sha512-ZZTsDgrbKyU/mA8ZKKiSTsd9mTHl2n3mDWrDX7rJdZ5zyGzxxk2Dc81kQP5qUdp6OAG6chiLIPLxXntjWVnyvA== +"@abp/bootstrap-datepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.1.tgz#45c9b9086b3a64ce4ba6193320afdf2e81d12136" + integrity sha512-/T2FlMlPV19J70t8yueyxj9k72+4t3b2aVDrNHCf7uPuSqClwVKEylzGr8RFc7VXHZZwwaUrbLhxYkhkCKLuLA== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.0.tgz#1bf9a27976036c8e658d104a964742410aaca691" - integrity sha512-dhOf3aU82RDYcQc+HOObqd960SmHZTDPhS+6D9QkJ9a3PocyoBzLEi/lcgjfQytMzwsebxY8vk+S2WTUucoRuQ== +"@abp/bootstrap-daterangepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.1.tgz#19349099f6c007feef1ebe73c9c1059f8d271bc1" + integrity sha512-pCTiPRNW4gnzo0rWKbu2A52dRUeXRI3MqJW7h46yNk4n1ZrnsmwH6/b/ebp89YlbNXWaatDrEpk3NbqxSDDAdQ== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.0.tgz#52063d1f577d01d17f3b67e9bdc1ea811242b41e" - integrity sha512-S8Vnpj+cUO58C79aPum9eKlj13nY/T36ReUBPwT3CPrzStM9ab5BlNwHXR3Piyx/73i/r4Utehg18hs2fVi5Jw== +"@abp/bootstrap@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.1.tgz#1481b984a7f31f92f262d6957340fcaa87eb8ece" + integrity sha512-qFNLuBExQeVDOlFKP/STa3r+8CHhPUfsOFnPaknkS2QLewmtAZw3BJFEgvpJQkSvQdaBXW+EjutaJiFGdDrkEQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" bootstrap "^5.1.3" -"@abp/clipboard@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.1.0.tgz#21531f61322fc64114350972c9cedaa54f7114ae" - integrity sha512-1woUBwgtvsThNmEzYyIb46O13jchetY/HkYaOpwbLW6A13Qrsa0lHbABUDLpLp685T/1M/9lweOhWvNxRw2Ozw== +"@abp/clipboard@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.1.1.tgz#06985266e399a03f819585ec9b9ae17ffcbfef0b" + integrity sha512-IxlQJgNlhp6hMVAkPqRgzmB0a5bKdrZ0whVlaxNKR42geetutV+5KPo/koCmliksHLAFTfiAedQXOXsJ90p2AQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" clipboard "^2.0.8" -"@abp/core@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.0.tgz#cffbe4a166073b394850ffd9739b0a089149a3fb" - integrity sha512-+DLBAtXo5BRYwcQH3yFzya0EZj8wd0/BE2QmXTVJ+nxQly+cp7ZV98oRIzI7ArIIV52Th4CXHwZv0l0U0Rdisg== +"@abp/core@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.1.tgz#de4d666d26fba4ab5f7b3e6fff38f2f5f034d121" + integrity sha512-d/vHAAU60v6gdH3+VpchXDD1l5yXNmKsb3i92gvG9M0orjgVy3dJmb6zBVw50nnZxNSfq3Z0S1TC/QdA2C1rQg== dependencies: - "@abp/utils" "~7.1.0" + "@abp/utils" "~7.1.1" -"@abp/datatables.net-bs5@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.0.tgz#3c2289290c3667cad69604d6184fb9b77263f137" - integrity sha512-1LqROrLgFOiUN3E28s5qEu82Zdy4kLGJ6a7f1J6OAvqGXF62DRbKhoS8Rsd5DOV+JHCRnAx8PnTBhlUbl2zmoQ== +"@abp/datatables.net-bs5@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.1.tgz#b7058a0cad4119cc7391493a7d148250efc41b72" + integrity sha512-uPqHzfE9dH5nEuocvIduQYcjEa4MwBXMjtnY5tHM+PK2yB8DsDOrXVopOX0YPTgFk49pLvOVbgxsftuyPb3xKQ== dependencies: - "@abp/datatables.net" "~7.1.0" + "@abp/datatables.net" "~7.1.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.0.tgz#e26dd279276dd38dff485c68bb92b77a4737b625" - integrity sha512-vwihQI6Sxp9gktMSSQ99HwS8oHoYZh1zmZWEnVNAvMnTlxMhqwHEIK2y0XkT/jI3z5NGntz75qFSoqHGFLRAbw== +"@abp/datatables.net@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.1.tgz#a84975c8ab0d7406e524d2eae41f7a04bc00f13c" + integrity sha512-eKIxvap/bKc1G7Dev+t9V8HvHWQYza0Y4RdYmC0bPOyRthlTW9AH8jyKK5HtJlpNpj9rjB2jy3/I9D1uzD67QQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.0.tgz#65d9919c3d511197e4518ce25164f767c4776a5a" - integrity sha512-1u0zBE26iNv3YjQ1gTv8rozt6jSXDD0OISMXRT90BAGpOrEHoUB9VaRx4q7AXIrPye95RhfpccGbWE31vPEguw== +"@abp/font-awesome@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.1.tgz#da4a0be295b0acf9b62d8299d1c567ae192a320f" + integrity sha512-AVjbSFXj5IzzQwqwP/fgsuRG1NzV6/KGn5owsfn6HeKSOBjqW4h4EGyunMNoAOW4fsdFxvE4zjBpsG1/E9tuQg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.0.tgz#e1d29ea105a3c4664057fea6c03999ff9529ee59" - integrity sha512-GuJC3TTclKk47mMjtasZBkKF1KqZcvUCXTkTM165U3hN80Bn5GjbS48oXz/iHI70lWNDsycVRrrrc8guwksvzg== +"@abp/jquery-form@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.1.tgz#03c17ccb19820e0a56be58275e2ebba7e7ebaa5f" + integrity sha512-UurenNEYZRN192B70R3DR1NsFUae45h/2huAQD07OM0fyJyM6ji5N7q/Q2Aao0jqBLwRNPrEinUcP8BmJxe2Tw== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.0.tgz#0eb2364582337d530aa6f24fcbaaefa40fda6f7a" - integrity sha512-JiZvmSBt/Q8kZ15wazRDf738UjY1ZCpNm0fE47mpokE9T1YiD8DVDnv4qFDa7ActB5PsfwD1vRANNrmfUsSJcw== +"@abp/jquery-validation-unobtrusive@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.1.tgz#255146ccc553bb9f9197ccf87fa71d930698cf65" + integrity sha512-oUYvNmiGxeyJeGoG3EWAzy2Ld9EKgyK6U28gKaAMrXFlYbiEMnX5+8v1Tdb3sQuOJ68bdiyYjO3Ke9NLsTZHFg== dependencies: - "@abp/jquery-validation" "~7.1.0" + "@abp/jquery-validation" "~7.1.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.0.tgz#2c28095e4fccbaea78dc1f0c5459456380727079" - integrity sha512-rXCrd1ZZ2pse4MgF2fB6e/880UiaHuk+ZXBg/y8Yj2Ab5OVsUuCw9CpsjHOplWC6Rq5A8SjO7BCdI4juxb3xHQ== +"@abp/jquery-validation@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.1.tgz#b3af6606daaa6303c28f6a04aeaa2d6612c5248b" + integrity sha512-ZkDWUbHqF9NkczPdvEZH4gkb6NeXRI5JsROXzmx3K+QIOGUhs//4gOzSYYak0kn0Mljeg8fjJQNa55914d8Xow== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.0.tgz#5c43c7b4fff5f04f7bf9f763e6c2e57f000cbb10" - integrity sha512-JPgrVkRVnxFFm96movaOsfM4NsDghIdfAwo25Qz4t5hAeiAVusTCULML5Ds1IjHHQBjbYV/81Zno3xHzC4eU8A== +"@abp/jquery@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.1.tgz#43adacf3d345576ff7ca42a5a470eb61fb827e23" + integrity sha512-3Epxyyoz1BJge7lbimkg0Ha4DmNlZN5vYFgVKa8SOCoKfoZ7+8gmbXlUEAUe4wnsjP5tQ4/AjoqgzjPL9KQcCg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" jquery "~3.6.0" -"@abp/lodash@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.0.tgz#d187bdac06a1425737837521d09aaf998d49bd08" - integrity sha512-/PmbRfN8ACBey4r8QpwSad38n720yZG5WY/lvddCoBmhJYeUtEr0moFF4g2x0wVm7U1wVXQK6RR9GOr0Q2A7Og== +"@abp/lodash@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.1.tgz#7371484331867775adcb5f4a92d63d4cbed25f19" + integrity sha512-hwNcYcRNZZV5OgH+W775OkpJ5JmrDi+LiVFDAmelWgAXSgqxic8bDla+UUL/pjnkKxwgI4BAlOIctYN/2QM3iA== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" lodash "^4.17.21" -"@abp/luxon@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.0.tgz#e6e119736e0340df162aeaf6546ec322253fee7e" - integrity sha512-UqsJTELF9bxZgE4v9dSfuHvyhinqFPKWZD1ctzTv4At5wie5yrqa+r5y59rPRui3svBxiZXSSZKmDCZnaoFW+w== +"@abp/luxon@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.1.tgz#b0cf4a72ffe66f77d403b896ea5d1ea007ebc9b7" + integrity sha512-2RDIdHrPUDvOoowQlMInfQ0rDZA8IOf2fVs7C2bcZmhjGoK7+vsUJsw/q9awpgeKrHwqJ0o1zsFGfFFKlYMnew== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.0.tgz#f113854212adcddbb142ee54f27e8f3876a22e7c" - integrity sha512-IIbDZ/7fjcnZ05ZHbX6KrlDlkXzZLD8w7teAoMuhBcLZeP3PWythzFYbCc6LwvtgvvkfriyPSth4PCsv2mh/gw== +"@abp/malihu-custom-scrollbar-plugin@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.1.tgz#8a25f3dd78c1f0c395ac255976567d2919d3ec38" + integrity sha512-kfW+B+kFr0Qao17rDginL0ICPwGA3t387hx5LhPIxP2p7aluaA3qyiEbM50Izz+t4mL4JdaBN8DU0kLziqVERw== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.0.tgz#c924fd6278992d8939501903347808a2ded053aa" - integrity sha512-pwbGxx/h0U0NILec6ZscHt6FBOyCUi8TTZzp1B7W9hpC3KSh4qGH1fUM2LI1mXFLl8c/exmVs7aZMN/24KgBag== +"@abp/moment@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.1.tgz#5cf7f815cc4dbe55c9c363d146592683f8a90d62" + integrity sha512-tgg4rTmAGZE+B8OBpeq1ADXJW07EdkCkQUSrLykWMaQr1PZfs9xi0tgsi4CpdITLOK48b9BueRmUdZOgmFXKiQ== dependencies: moment "^2.9.0" -"@abp/owl.carousel@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-7.1.0.tgz#d46d8c450d5c408bb90138554bbfe6889cd2ff9a" - integrity sha512-3szLO4UHXPb3jhu3gDLVbeKhy7kqBUeXm87rVMcNIgyxBVupXEaUUAsJCKbRiuq1lFKt+4BShx1ned6PMgp4sw== +"@abp/owl.carousel@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/owl.carousel/-/owl.carousel-7.1.1.tgz#b4c7c608d390e263050412a2c1121a54e2428fbe" + integrity sha512-SccYGePSPp5d9N70IXmOnSmpIovmOVZMgNRDcDsxmlQvSUD/aZkDO7ue4zKDfMdrSg8+IqmyMvtfOKB2no7V5g== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" owl.carousel "^2.3.4" -"@abp/prismjs@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.1.0.tgz#e9dc477f5d8728532a7c27e8e1b309a20b1aa32c" - integrity sha512-7pBxUKgqYaEEsuA7AUcdYJh05x2v0NVdkOc5n7KEw/ixqzB6d40SDBKndYg8ns+Zknvh6IK6e2FjOO+y/hWloQ== +"@abp/prismjs@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.1.1.tgz#bfcee96e5a1e2f98fb29006f16aeeb227a4e773d" + integrity sha512-7o7FRzgGNPR9GxQ6CPskWL2N87LykoylKnkCm0Cz0n+x0JSrAEMv2yEiJJT2L1S+51ldCQhBmF2blOjxgUT98A== dependencies: - "@abp/clipboard" "~7.1.0" - "@abp/core" "~7.1.0" + "@abp/clipboard" "~7.1.1" + "@abp/core" "~7.1.1" prismjs "^1.26.0" -"@abp/select2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.0.tgz#30522455c70059251e593cdb0228dbbf831bbb78" - integrity sha512-VPdqxjT8URm1rkwsPvutOgFPs/JTlm8KVcvdV1UsvJMxx5OIKMKcxgsL9UJl033HzVVwp/XBsMQsaNRHnW+hvw== +"@abp/select2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.1.tgz#1afa414ce68c1f35c3e7ab1beee00f924604de51" + integrity sha512-+5MMLQuXlj07VIXhVKEAmeqsfuGXHWwtpDY2LMsT15lNJbrvq0wF9KZJ0eMF8u29Nyk8IuBJf1YRUzx815PiVg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.0.tgz#7cbf9c53ab9e1db2c59d63f392ba9b62624272f6" - integrity sha512-5NL2TijufGF5Jdbed1V+s6+tCa/C/R/ZSfb7CjQnBOCSC0JNhBDHtRabOaouqr2la4xbAEHjIoyXEnWXYAidYw== +"@abp/sweetalert2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.1.tgz#9ba7578ab53af056f26ef34ae0f2fddc28722c12" + integrity sha512-8hjmEqmcRoMN3Cmk7k0lNdtsm8JytrjPzvHahjqKHIcK1Zi0RbjWJpafbvDu5IFlFrRNYHXlqpUw8e3dtCEp3A== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.0.tgz#96909f2d0d27ac977d0caf6a0e2b725681f8124e" - integrity sha512-gWDwvnVSVKPBaOaJCaqhvcqS/GwTQFzNH6dWIH19/g23rF3+s/KwTyoW5AA8uWStBx1PxZaugR0OIK/7hctUog== +"@abp/timeago@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.1.tgz#c7be25a320aa311e2e9c7a8186b51766db4523ac" + integrity sha512-FsIjAiP2dqRHwrrKx/5tWgLMZ2LboNLhrHeRb1FFol/0163uVEQGEJkxLOE5xY530mdaFFfAOc0x6aniSLE4ZQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" timeago "^1.6.7" -"@abp/toastr@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.0.tgz#c11d780c86c16835528f152aac4cbe4aa94bb810" - integrity sha512-awgpA6J65TlMK54Hdq2fyDsZ6nvD69RKfAUaGzpz685tNbvaqQfXxSlBQVEad8QZlMGFeCOAmH9GYkBHNaP/zg== +"@abp/toastr@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.1.tgz#5ef7da983a226f226d8b9b85f2fa9ff7eeed41aa" + integrity sha512-8x8FQt8BSmgI1b6JXK7N+JJJ0ksBcFSMQol0AbzTOFOBO2T77eXIuiVh8961ynaeIECjGWcazXUMuG09Drq6Ig== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" toastr "^2.1.4" -"@abp/tui-editor@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-7.1.0.tgz#5d050aa6f9d427eb5bd6eae9c645ba522c8215a8" - integrity sha512-QCuP8gibxA/i36i/7dQmMTYXTkgh8eFKTWrSsfgBLLmJ+2ODd/H+wOjVcvscNXgAIu3lCtsqhbnMXswFszZMnw== +"@abp/tui-editor@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-7.1.1.tgz#91c330860e245c7cac3f39a08c46125b197ca201" + integrity sha512-a5rIOTVkwPlty6i4D0SmctbvJUSKfnBbKezzk4ZGBMmu2Mlw5qIpLWYe3Tz1v50c/oQtArJ/6O2yCC+LJrIx1A== dependencies: - "@abp/jquery" "~7.1.0" - "@abp/prismjs" "~7.1.0" + "@abp/jquery" "~7.1.1" + "@abp/prismjs" "~7.1.1" -"@abp/utils@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.0.tgz#fb52fdc21e8d26a32245eefac86c512a9318ee47" - integrity sha512-CorSSUsaVug2qY6f4j2uxtAjdSq1dfdq1QdjdQaoPxoZKU74Yv/Cyh7YZ+WJa3Upmaw4V0+6ELX9RE3OjJIxIQ== +"@abp/utils@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.1.tgz#e11bc878573dd8118e42b3c1582c44d8b5c71d83" + integrity sha512-G4S0ndDUe8W525O8KUBucLcrESoSFjeqLjRZ+W7N7K9D/oLisYU9Siwxb2csTdjXz6JeQ7AtQl7ak1WpAMiJ/g== dependencies: just-compare "^1.3.0" diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package.json index 892283f45d..d1b401c4af 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": "^7.1.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.1" } } diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock index 4a687745e9..0ad110e7ef 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.0.tgz#79b5154f041fde68ecf81a920f756d16157cb439" - integrity sha512-rmrPRviLwlAN+o48ZnzPoRRYv78Uqwd1eSX6ftaf4CPxbb+bQJAKAcL5FbAnNheLesL62sn4x11Q60F8Mp850g== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.0.tgz#af4d0b4228fb0ead0626d344a5458856103446ff" - integrity sha512-Pn6UBgSJbOCnW0OFcLZrOH4dEpSSlBDjSy6HMm0wtdgodu9TjRYY/mAwRsjhXZTX3ycpuktVhVotB4ZLvFpgUg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.1.0" - "@abp/bootstrap" "~7.1.0" - "@abp/bootstrap-datepicker" "~7.1.0" - "@abp/bootstrap-daterangepicker" "~7.1.0" - "@abp/datatables.net-bs5" "~7.1.0" - "@abp/font-awesome" "~7.1.0" - "@abp/jquery-form" "~7.1.0" - "@abp/jquery-validation-unobtrusive" "~7.1.0" - "@abp/lodash" "~7.1.0" - "@abp/luxon" "~7.1.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.1.0" - "@abp/moment" "~7.1.0" - "@abp/select2" "~7.1.0" - "@abp/sweetalert2" "~7.1.0" - "@abp/timeago" "~7.1.0" - "@abp/toastr" "~7.1.0" - -"@abp/aspnetcore.mvc.ui@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.0.tgz#a10cc69976e294587a5274f11c216e55ebb1feb7" - integrity sha512-TGCmp4rxQiTUPaZYYGvhQSm5vjcZhJUEriuNyGSKWcs8vTC4eV6Eh6JqANU42RNxohWrQczEIWWMrQz5MEfX6g== +"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.1.tgz#9368779919662a804a8119ac6cf9b731fa2a9728" + integrity sha512-xMUBHJv9pLWp3wx3Oc6+F4G8biZ+BgCskYzAgV2lLWFjQAUxe8klbP0dsVr0EZemyMctX6zlHLURRIl+Os8Z2Q== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.1.tgz#48cf683b8a147bc5955de5e812a0dfa3b7184f29" + integrity sha512-caHzC5zOr2vXY2QDRKuFQ4qIWOS/DbsJUO+UhfKSHvP/bAv7Cu10K3gHwrbfuNCChDJ9iLK0+oJYXUtYBXRA3g== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.1.1" + "@abp/bootstrap" "~7.1.1" + "@abp/bootstrap-datepicker" "~7.1.1" + "@abp/bootstrap-daterangepicker" "~7.1.1" + "@abp/datatables.net-bs5" "~7.1.1" + "@abp/font-awesome" "~7.1.1" + "@abp/jquery-form" "~7.1.1" + "@abp/jquery-validation-unobtrusive" "~7.1.1" + "@abp/lodash" "~7.1.1" + "@abp/luxon" "~7.1.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.1.1" + "@abp/moment" "~7.1.1" + "@abp/select2" "~7.1.1" + "@abp/sweetalert2" "~7.1.1" + "@abp/timeago" "~7.1.1" + "@abp/toastr" "~7.1.1" + +"@abp/aspnetcore.mvc.ui@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.1.tgz#f862b77573b5c34d9b938160669400edbf06154d" + integrity sha512-+xafeXzwnFa4Evak9Wq+jrpimWITio4Yv9WeSbKInNakIPO+wJNBClBneca1XQ+LFy4bMRuqgWYJueUct+E3tA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,158 +43,158 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.0.tgz#2a5635f35aeb5be636dfdd5a3fe68c083507cb29" - integrity sha512-ZZTsDgrbKyU/mA8ZKKiSTsd9mTHl2n3mDWrDX7rJdZ5zyGzxxk2Dc81kQP5qUdp6OAG6chiLIPLxXntjWVnyvA== +"@abp/bootstrap-datepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.1.tgz#45c9b9086b3a64ce4ba6193320afdf2e81d12136" + integrity sha512-/T2FlMlPV19J70t8yueyxj9k72+4t3b2aVDrNHCf7uPuSqClwVKEylzGr8RFc7VXHZZwwaUrbLhxYkhkCKLuLA== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.0.tgz#1bf9a27976036c8e658d104a964742410aaca691" - integrity sha512-dhOf3aU82RDYcQc+HOObqd960SmHZTDPhS+6D9QkJ9a3PocyoBzLEi/lcgjfQytMzwsebxY8vk+S2WTUucoRuQ== +"@abp/bootstrap-daterangepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.1.tgz#19349099f6c007feef1ebe73c9c1059f8d271bc1" + integrity sha512-pCTiPRNW4gnzo0rWKbu2A52dRUeXRI3MqJW7h46yNk4n1ZrnsmwH6/b/ebp89YlbNXWaatDrEpk3NbqxSDDAdQ== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.0.tgz#52063d1f577d01d17f3b67e9bdc1ea811242b41e" - integrity sha512-S8Vnpj+cUO58C79aPum9eKlj13nY/T36ReUBPwT3CPrzStM9ab5BlNwHXR3Piyx/73i/r4Utehg18hs2fVi5Jw== +"@abp/bootstrap@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.1.tgz#1481b984a7f31f92f262d6957340fcaa87eb8ece" + integrity sha512-qFNLuBExQeVDOlFKP/STa3r+8CHhPUfsOFnPaknkS2QLewmtAZw3BJFEgvpJQkSvQdaBXW+EjutaJiFGdDrkEQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" bootstrap "^5.1.3" -"@abp/core@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.0.tgz#cffbe4a166073b394850ffd9739b0a089149a3fb" - integrity sha512-+DLBAtXo5BRYwcQH3yFzya0EZj8wd0/BE2QmXTVJ+nxQly+cp7ZV98oRIzI7ArIIV52Th4CXHwZv0l0U0Rdisg== +"@abp/core@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.1.tgz#de4d666d26fba4ab5f7b3e6fff38f2f5f034d121" + integrity sha512-d/vHAAU60v6gdH3+VpchXDD1l5yXNmKsb3i92gvG9M0orjgVy3dJmb6zBVw50nnZxNSfq3Z0S1TC/QdA2C1rQg== dependencies: - "@abp/utils" "~7.1.0" + "@abp/utils" "~7.1.1" -"@abp/datatables.net-bs5@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.0.tgz#3c2289290c3667cad69604d6184fb9b77263f137" - integrity sha512-1LqROrLgFOiUN3E28s5qEu82Zdy4kLGJ6a7f1J6OAvqGXF62DRbKhoS8Rsd5DOV+JHCRnAx8PnTBhlUbl2zmoQ== +"@abp/datatables.net-bs5@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.1.tgz#b7058a0cad4119cc7391493a7d148250efc41b72" + integrity sha512-uPqHzfE9dH5nEuocvIduQYcjEa4MwBXMjtnY5tHM+PK2yB8DsDOrXVopOX0YPTgFk49pLvOVbgxsftuyPb3xKQ== dependencies: - "@abp/datatables.net" "~7.1.0" + "@abp/datatables.net" "~7.1.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.0.tgz#e26dd279276dd38dff485c68bb92b77a4737b625" - integrity sha512-vwihQI6Sxp9gktMSSQ99HwS8oHoYZh1zmZWEnVNAvMnTlxMhqwHEIK2y0XkT/jI3z5NGntz75qFSoqHGFLRAbw== +"@abp/datatables.net@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.1.tgz#a84975c8ab0d7406e524d2eae41f7a04bc00f13c" + integrity sha512-eKIxvap/bKc1G7Dev+t9V8HvHWQYza0Y4RdYmC0bPOyRthlTW9AH8jyKK5HtJlpNpj9rjB2jy3/I9D1uzD67QQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.0.tgz#65d9919c3d511197e4518ce25164f767c4776a5a" - integrity sha512-1u0zBE26iNv3YjQ1gTv8rozt6jSXDD0OISMXRT90BAGpOrEHoUB9VaRx4q7AXIrPye95RhfpccGbWE31vPEguw== +"@abp/font-awesome@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.1.tgz#da4a0be295b0acf9b62d8299d1c567ae192a320f" + integrity sha512-AVjbSFXj5IzzQwqwP/fgsuRG1NzV6/KGn5owsfn6HeKSOBjqW4h4EGyunMNoAOW4fsdFxvE4zjBpsG1/E9tuQg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.0.tgz#e1d29ea105a3c4664057fea6c03999ff9529ee59" - integrity sha512-GuJC3TTclKk47mMjtasZBkKF1KqZcvUCXTkTM165U3hN80Bn5GjbS48oXz/iHI70lWNDsycVRrrrc8guwksvzg== +"@abp/jquery-form@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.1.tgz#03c17ccb19820e0a56be58275e2ebba7e7ebaa5f" + integrity sha512-UurenNEYZRN192B70R3DR1NsFUae45h/2huAQD07OM0fyJyM6ji5N7q/Q2Aao0jqBLwRNPrEinUcP8BmJxe2Tw== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.0.tgz#0eb2364582337d530aa6f24fcbaaefa40fda6f7a" - integrity sha512-JiZvmSBt/Q8kZ15wazRDf738UjY1ZCpNm0fE47mpokE9T1YiD8DVDnv4qFDa7ActB5PsfwD1vRANNrmfUsSJcw== +"@abp/jquery-validation-unobtrusive@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.1.tgz#255146ccc553bb9f9197ccf87fa71d930698cf65" + integrity sha512-oUYvNmiGxeyJeGoG3EWAzy2Ld9EKgyK6U28gKaAMrXFlYbiEMnX5+8v1Tdb3sQuOJ68bdiyYjO3Ke9NLsTZHFg== dependencies: - "@abp/jquery-validation" "~7.1.0" + "@abp/jquery-validation" "~7.1.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.0.tgz#2c28095e4fccbaea78dc1f0c5459456380727079" - integrity sha512-rXCrd1ZZ2pse4MgF2fB6e/880UiaHuk+ZXBg/y8Yj2Ab5OVsUuCw9CpsjHOplWC6Rq5A8SjO7BCdI4juxb3xHQ== +"@abp/jquery-validation@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.1.tgz#b3af6606daaa6303c28f6a04aeaa2d6612c5248b" + integrity sha512-ZkDWUbHqF9NkczPdvEZH4gkb6NeXRI5JsROXzmx3K+QIOGUhs//4gOzSYYak0kn0Mljeg8fjJQNa55914d8Xow== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.0.tgz#5c43c7b4fff5f04f7bf9f763e6c2e57f000cbb10" - integrity sha512-JPgrVkRVnxFFm96movaOsfM4NsDghIdfAwo25Qz4t5hAeiAVusTCULML5Ds1IjHHQBjbYV/81Zno3xHzC4eU8A== +"@abp/jquery@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.1.tgz#43adacf3d345576ff7ca42a5a470eb61fb827e23" + integrity sha512-3Epxyyoz1BJge7lbimkg0Ha4DmNlZN5vYFgVKa8SOCoKfoZ7+8gmbXlUEAUe4wnsjP5tQ4/AjoqgzjPL9KQcCg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" jquery "~3.6.0" -"@abp/lodash@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.0.tgz#d187bdac06a1425737837521d09aaf998d49bd08" - integrity sha512-/PmbRfN8ACBey4r8QpwSad38n720yZG5WY/lvddCoBmhJYeUtEr0moFF4g2x0wVm7U1wVXQK6RR9GOr0Q2A7Og== +"@abp/lodash@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.1.tgz#7371484331867775adcb5f4a92d63d4cbed25f19" + integrity sha512-hwNcYcRNZZV5OgH+W775OkpJ5JmrDi+LiVFDAmelWgAXSgqxic8bDla+UUL/pjnkKxwgI4BAlOIctYN/2QM3iA== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" lodash "^4.17.21" -"@abp/luxon@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.0.tgz#e6e119736e0340df162aeaf6546ec322253fee7e" - integrity sha512-UqsJTELF9bxZgE4v9dSfuHvyhinqFPKWZD1ctzTv4At5wie5yrqa+r5y59rPRui3svBxiZXSSZKmDCZnaoFW+w== +"@abp/luxon@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.1.tgz#b0cf4a72ffe66f77d403b896ea5d1ea007ebc9b7" + integrity sha512-2RDIdHrPUDvOoowQlMInfQ0rDZA8IOf2fVs7C2bcZmhjGoK7+vsUJsw/q9awpgeKrHwqJ0o1zsFGfFFKlYMnew== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.0.tgz#f113854212adcddbb142ee54f27e8f3876a22e7c" - integrity sha512-IIbDZ/7fjcnZ05ZHbX6KrlDlkXzZLD8w7teAoMuhBcLZeP3PWythzFYbCc6LwvtgvvkfriyPSth4PCsv2mh/gw== +"@abp/malihu-custom-scrollbar-plugin@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.1.tgz#8a25f3dd78c1f0c395ac255976567d2919d3ec38" + integrity sha512-kfW+B+kFr0Qao17rDginL0ICPwGA3t387hx5LhPIxP2p7aluaA3qyiEbM50Izz+t4mL4JdaBN8DU0kLziqVERw== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.0.tgz#c924fd6278992d8939501903347808a2ded053aa" - integrity sha512-pwbGxx/h0U0NILec6ZscHt6FBOyCUi8TTZzp1B7W9hpC3KSh4qGH1fUM2LI1mXFLl8c/exmVs7aZMN/24KgBag== +"@abp/moment@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.1.tgz#5cf7f815cc4dbe55c9c363d146592683f8a90d62" + integrity sha512-tgg4rTmAGZE+B8OBpeq1ADXJW07EdkCkQUSrLykWMaQr1PZfs9xi0tgsi4CpdITLOK48b9BueRmUdZOgmFXKiQ== dependencies: moment "^2.9.0" -"@abp/select2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.0.tgz#30522455c70059251e593cdb0228dbbf831bbb78" - integrity sha512-VPdqxjT8URm1rkwsPvutOgFPs/JTlm8KVcvdV1UsvJMxx5OIKMKcxgsL9UJl033HzVVwp/XBsMQsaNRHnW+hvw== +"@abp/select2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.1.tgz#1afa414ce68c1f35c3e7ab1beee00f924604de51" + integrity sha512-+5MMLQuXlj07VIXhVKEAmeqsfuGXHWwtpDY2LMsT15lNJbrvq0wF9KZJ0eMF8u29Nyk8IuBJf1YRUzx815PiVg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.0.tgz#7cbf9c53ab9e1db2c59d63f392ba9b62624272f6" - integrity sha512-5NL2TijufGF5Jdbed1V+s6+tCa/C/R/ZSfb7CjQnBOCSC0JNhBDHtRabOaouqr2la4xbAEHjIoyXEnWXYAidYw== +"@abp/sweetalert2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.1.tgz#9ba7578ab53af056f26ef34ae0f2fddc28722c12" + integrity sha512-8hjmEqmcRoMN3Cmk7k0lNdtsm8JytrjPzvHahjqKHIcK1Zi0RbjWJpafbvDu5IFlFrRNYHXlqpUw8e3dtCEp3A== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.0.tgz#96909f2d0d27ac977d0caf6a0e2b725681f8124e" - integrity sha512-gWDwvnVSVKPBaOaJCaqhvcqS/GwTQFzNH6dWIH19/g23rF3+s/KwTyoW5AA8uWStBx1PxZaugR0OIK/7hctUog== +"@abp/timeago@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.1.tgz#c7be25a320aa311e2e9c7a8186b51766db4523ac" + integrity sha512-FsIjAiP2dqRHwrrKx/5tWgLMZ2LboNLhrHeRb1FFol/0163uVEQGEJkxLOE5xY530mdaFFfAOc0x6aniSLE4ZQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" timeago "^1.6.7" -"@abp/toastr@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.0.tgz#c11d780c86c16835528f152aac4cbe4aa94bb810" - integrity sha512-awgpA6J65TlMK54Hdq2fyDsZ6nvD69RKfAUaGzpz685tNbvaqQfXxSlBQVEad8QZlMGFeCOAmH9GYkBHNaP/zg== +"@abp/toastr@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.1.tgz#5ef7da983a226f226d8b9b85f2fa9ff7eeed41aa" + integrity sha512-8x8FQt8BSmgI1b6JXK7N+JJJ0ksBcFSMQol0AbzTOFOBO2T77eXIuiVh8961ynaeIECjGWcazXUMuG09Drq6Ig== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" toastr "^2.1.4" -"@abp/utils@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.0.tgz#fb52fdc21e8d26a32245eefac86c512a9318ee47" - integrity sha512-CorSSUsaVug2qY6f4j2uxtAjdSq1dfdq1QdjdQaoPxoZKU74Yv/Cyh7YZ+WJa3Upmaw4V0+6ELX9RE3OjJIxIQ== +"@abp/utils@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.1.tgz#e11bc878573dd8118e42b3c1582c44d8b5c71d83" + integrity sha512-G4S0ndDUe8W525O8KUBucLcrESoSFjeqLjRZ+W7N7K9D/oLisYU9Siwxb2csTdjXz6JeQ7AtQl7ak1WpAMiJ/g== dependencies: just-compare "^1.3.0" diff --git a/modules/cms-kit/angular/package.json b/modules/cms-kit/angular/package.json index 110852edfa..307e2235c8 100644 --- a/modules/cms-kit/angular/package.json +++ b/modules/cms-kit/angular/package.json @@ -15,11 +15,11 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~7.1.0", - "@abp/ng.identity": "~7.1.0", - "@abp/ng.setting-management": "~7.1.0", - "@abp/ng.tenant-management": "~7.1.0", - "@abp/ng.theme.basic": "~7.1.0", + "@abp/ng.account": "~7.1.1", + "@abp/ng.identity": "~7.1.1", + "@abp/ng.setting-management": "~7.1.1", + "@abp/ng.tenant-management": "~7.1.1", + "@abp/ng.theme.basic": "~7.1.1", "@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 1c665f42bd..2ec7c58b9a 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": ">=7.1.0", - "@abp/ng.theme.shared": ">=7.1.0" + "@abp/ng.core": ">=7.1.1", + "@abp/ng.theme.shared": ">=7.1.1" }, "dependencies": { "tslib": "^2.0.0" diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/package.json index 85cdc791d7..61da9de6fb 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": "^7.1.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.1" } } diff --git a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock index 4a687745e9..0ad110e7ef 100644 --- a/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.IdentityServer/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.0.tgz#79b5154f041fde68ecf81a920f756d16157cb439" - integrity sha512-rmrPRviLwlAN+o48ZnzPoRRYv78Uqwd1eSX6ftaf4CPxbb+bQJAKAcL5FbAnNheLesL62sn4x11Q60F8Mp850g== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.0.tgz#af4d0b4228fb0ead0626d344a5458856103446ff" - integrity sha512-Pn6UBgSJbOCnW0OFcLZrOH4dEpSSlBDjSy6HMm0wtdgodu9TjRYY/mAwRsjhXZTX3ycpuktVhVotB4ZLvFpgUg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.1.0" - "@abp/bootstrap" "~7.1.0" - "@abp/bootstrap-datepicker" "~7.1.0" - "@abp/bootstrap-daterangepicker" "~7.1.0" - "@abp/datatables.net-bs5" "~7.1.0" - "@abp/font-awesome" "~7.1.0" - "@abp/jquery-form" "~7.1.0" - "@abp/jquery-validation-unobtrusive" "~7.1.0" - "@abp/lodash" "~7.1.0" - "@abp/luxon" "~7.1.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.1.0" - "@abp/moment" "~7.1.0" - "@abp/select2" "~7.1.0" - "@abp/sweetalert2" "~7.1.0" - "@abp/timeago" "~7.1.0" - "@abp/toastr" "~7.1.0" - -"@abp/aspnetcore.mvc.ui@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.0.tgz#a10cc69976e294587a5274f11c216e55ebb1feb7" - integrity sha512-TGCmp4rxQiTUPaZYYGvhQSm5vjcZhJUEriuNyGSKWcs8vTC4eV6Eh6JqANU42RNxohWrQczEIWWMrQz5MEfX6g== +"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.1.tgz#9368779919662a804a8119ac6cf9b731fa2a9728" + integrity sha512-xMUBHJv9pLWp3wx3Oc6+F4G8biZ+BgCskYzAgV2lLWFjQAUxe8klbP0dsVr0EZemyMctX6zlHLURRIl+Os8Z2Q== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.1.tgz#48cf683b8a147bc5955de5e812a0dfa3b7184f29" + integrity sha512-caHzC5zOr2vXY2QDRKuFQ4qIWOS/DbsJUO+UhfKSHvP/bAv7Cu10K3gHwrbfuNCChDJ9iLK0+oJYXUtYBXRA3g== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.1.1" + "@abp/bootstrap" "~7.1.1" + "@abp/bootstrap-datepicker" "~7.1.1" + "@abp/bootstrap-daterangepicker" "~7.1.1" + "@abp/datatables.net-bs5" "~7.1.1" + "@abp/font-awesome" "~7.1.1" + "@abp/jquery-form" "~7.1.1" + "@abp/jquery-validation-unobtrusive" "~7.1.1" + "@abp/lodash" "~7.1.1" + "@abp/luxon" "~7.1.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.1.1" + "@abp/moment" "~7.1.1" + "@abp/select2" "~7.1.1" + "@abp/sweetalert2" "~7.1.1" + "@abp/timeago" "~7.1.1" + "@abp/toastr" "~7.1.1" + +"@abp/aspnetcore.mvc.ui@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.1.tgz#f862b77573b5c34d9b938160669400edbf06154d" + integrity sha512-+xafeXzwnFa4Evak9Wq+jrpimWITio4Yv9WeSbKInNakIPO+wJNBClBneca1XQ+LFy4bMRuqgWYJueUct+E3tA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,158 +43,158 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.0.tgz#2a5635f35aeb5be636dfdd5a3fe68c083507cb29" - integrity sha512-ZZTsDgrbKyU/mA8ZKKiSTsd9mTHl2n3mDWrDX7rJdZ5zyGzxxk2Dc81kQP5qUdp6OAG6chiLIPLxXntjWVnyvA== +"@abp/bootstrap-datepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.1.tgz#45c9b9086b3a64ce4ba6193320afdf2e81d12136" + integrity sha512-/T2FlMlPV19J70t8yueyxj9k72+4t3b2aVDrNHCf7uPuSqClwVKEylzGr8RFc7VXHZZwwaUrbLhxYkhkCKLuLA== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.0.tgz#1bf9a27976036c8e658d104a964742410aaca691" - integrity sha512-dhOf3aU82RDYcQc+HOObqd960SmHZTDPhS+6D9QkJ9a3PocyoBzLEi/lcgjfQytMzwsebxY8vk+S2WTUucoRuQ== +"@abp/bootstrap-daterangepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.1.tgz#19349099f6c007feef1ebe73c9c1059f8d271bc1" + integrity sha512-pCTiPRNW4gnzo0rWKbu2A52dRUeXRI3MqJW7h46yNk4n1ZrnsmwH6/b/ebp89YlbNXWaatDrEpk3NbqxSDDAdQ== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.0.tgz#52063d1f577d01d17f3b67e9bdc1ea811242b41e" - integrity sha512-S8Vnpj+cUO58C79aPum9eKlj13nY/T36ReUBPwT3CPrzStM9ab5BlNwHXR3Piyx/73i/r4Utehg18hs2fVi5Jw== +"@abp/bootstrap@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.1.tgz#1481b984a7f31f92f262d6957340fcaa87eb8ece" + integrity sha512-qFNLuBExQeVDOlFKP/STa3r+8CHhPUfsOFnPaknkS2QLewmtAZw3BJFEgvpJQkSvQdaBXW+EjutaJiFGdDrkEQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" bootstrap "^5.1.3" -"@abp/core@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.0.tgz#cffbe4a166073b394850ffd9739b0a089149a3fb" - integrity sha512-+DLBAtXo5BRYwcQH3yFzya0EZj8wd0/BE2QmXTVJ+nxQly+cp7ZV98oRIzI7ArIIV52Th4CXHwZv0l0U0Rdisg== +"@abp/core@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.1.tgz#de4d666d26fba4ab5f7b3e6fff38f2f5f034d121" + integrity sha512-d/vHAAU60v6gdH3+VpchXDD1l5yXNmKsb3i92gvG9M0orjgVy3dJmb6zBVw50nnZxNSfq3Z0S1TC/QdA2C1rQg== dependencies: - "@abp/utils" "~7.1.0" + "@abp/utils" "~7.1.1" -"@abp/datatables.net-bs5@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.0.tgz#3c2289290c3667cad69604d6184fb9b77263f137" - integrity sha512-1LqROrLgFOiUN3E28s5qEu82Zdy4kLGJ6a7f1J6OAvqGXF62DRbKhoS8Rsd5DOV+JHCRnAx8PnTBhlUbl2zmoQ== +"@abp/datatables.net-bs5@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.1.tgz#b7058a0cad4119cc7391493a7d148250efc41b72" + integrity sha512-uPqHzfE9dH5nEuocvIduQYcjEa4MwBXMjtnY5tHM+PK2yB8DsDOrXVopOX0YPTgFk49pLvOVbgxsftuyPb3xKQ== dependencies: - "@abp/datatables.net" "~7.1.0" + "@abp/datatables.net" "~7.1.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.0.tgz#e26dd279276dd38dff485c68bb92b77a4737b625" - integrity sha512-vwihQI6Sxp9gktMSSQ99HwS8oHoYZh1zmZWEnVNAvMnTlxMhqwHEIK2y0XkT/jI3z5NGntz75qFSoqHGFLRAbw== +"@abp/datatables.net@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.1.tgz#a84975c8ab0d7406e524d2eae41f7a04bc00f13c" + integrity sha512-eKIxvap/bKc1G7Dev+t9V8HvHWQYza0Y4RdYmC0bPOyRthlTW9AH8jyKK5HtJlpNpj9rjB2jy3/I9D1uzD67QQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.0.tgz#65d9919c3d511197e4518ce25164f767c4776a5a" - integrity sha512-1u0zBE26iNv3YjQ1gTv8rozt6jSXDD0OISMXRT90BAGpOrEHoUB9VaRx4q7AXIrPye95RhfpccGbWE31vPEguw== +"@abp/font-awesome@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.1.tgz#da4a0be295b0acf9b62d8299d1c567ae192a320f" + integrity sha512-AVjbSFXj5IzzQwqwP/fgsuRG1NzV6/KGn5owsfn6HeKSOBjqW4h4EGyunMNoAOW4fsdFxvE4zjBpsG1/E9tuQg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.0.tgz#e1d29ea105a3c4664057fea6c03999ff9529ee59" - integrity sha512-GuJC3TTclKk47mMjtasZBkKF1KqZcvUCXTkTM165U3hN80Bn5GjbS48oXz/iHI70lWNDsycVRrrrc8guwksvzg== +"@abp/jquery-form@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.1.tgz#03c17ccb19820e0a56be58275e2ebba7e7ebaa5f" + integrity sha512-UurenNEYZRN192B70R3DR1NsFUae45h/2huAQD07OM0fyJyM6ji5N7q/Q2Aao0jqBLwRNPrEinUcP8BmJxe2Tw== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.0.tgz#0eb2364582337d530aa6f24fcbaaefa40fda6f7a" - integrity sha512-JiZvmSBt/Q8kZ15wazRDf738UjY1ZCpNm0fE47mpokE9T1YiD8DVDnv4qFDa7ActB5PsfwD1vRANNrmfUsSJcw== +"@abp/jquery-validation-unobtrusive@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.1.tgz#255146ccc553bb9f9197ccf87fa71d930698cf65" + integrity sha512-oUYvNmiGxeyJeGoG3EWAzy2Ld9EKgyK6U28gKaAMrXFlYbiEMnX5+8v1Tdb3sQuOJ68bdiyYjO3Ke9NLsTZHFg== dependencies: - "@abp/jquery-validation" "~7.1.0" + "@abp/jquery-validation" "~7.1.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.0.tgz#2c28095e4fccbaea78dc1f0c5459456380727079" - integrity sha512-rXCrd1ZZ2pse4MgF2fB6e/880UiaHuk+ZXBg/y8Yj2Ab5OVsUuCw9CpsjHOplWC6Rq5A8SjO7BCdI4juxb3xHQ== +"@abp/jquery-validation@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.1.tgz#b3af6606daaa6303c28f6a04aeaa2d6612c5248b" + integrity sha512-ZkDWUbHqF9NkczPdvEZH4gkb6NeXRI5JsROXzmx3K+QIOGUhs//4gOzSYYak0kn0Mljeg8fjJQNa55914d8Xow== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.0.tgz#5c43c7b4fff5f04f7bf9f763e6c2e57f000cbb10" - integrity sha512-JPgrVkRVnxFFm96movaOsfM4NsDghIdfAwo25Qz4t5hAeiAVusTCULML5Ds1IjHHQBjbYV/81Zno3xHzC4eU8A== +"@abp/jquery@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.1.tgz#43adacf3d345576ff7ca42a5a470eb61fb827e23" + integrity sha512-3Epxyyoz1BJge7lbimkg0Ha4DmNlZN5vYFgVKa8SOCoKfoZ7+8gmbXlUEAUe4wnsjP5tQ4/AjoqgzjPL9KQcCg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" jquery "~3.6.0" -"@abp/lodash@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.0.tgz#d187bdac06a1425737837521d09aaf998d49bd08" - integrity sha512-/PmbRfN8ACBey4r8QpwSad38n720yZG5WY/lvddCoBmhJYeUtEr0moFF4g2x0wVm7U1wVXQK6RR9GOr0Q2A7Og== +"@abp/lodash@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.1.tgz#7371484331867775adcb5f4a92d63d4cbed25f19" + integrity sha512-hwNcYcRNZZV5OgH+W775OkpJ5JmrDi+LiVFDAmelWgAXSgqxic8bDla+UUL/pjnkKxwgI4BAlOIctYN/2QM3iA== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" lodash "^4.17.21" -"@abp/luxon@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.0.tgz#e6e119736e0340df162aeaf6546ec322253fee7e" - integrity sha512-UqsJTELF9bxZgE4v9dSfuHvyhinqFPKWZD1ctzTv4At5wie5yrqa+r5y59rPRui3svBxiZXSSZKmDCZnaoFW+w== +"@abp/luxon@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.1.tgz#b0cf4a72ffe66f77d403b896ea5d1ea007ebc9b7" + integrity sha512-2RDIdHrPUDvOoowQlMInfQ0rDZA8IOf2fVs7C2bcZmhjGoK7+vsUJsw/q9awpgeKrHwqJ0o1zsFGfFFKlYMnew== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.0.tgz#f113854212adcddbb142ee54f27e8f3876a22e7c" - integrity sha512-IIbDZ/7fjcnZ05ZHbX6KrlDlkXzZLD8w7teAoMuhBcLZeP3PWythzFYbCc6LwvtgvvkfriyPSth4PCsv2mh/gw== +"@abp/malihu-custom-scrollbar-plugin@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.1.tgz#8a25f3dd78c1f0c395ac255976567d2919d3ec38" + integrity sha512-kfW+B+kFr0Qao17rDginL0ICPwGA3t387hx5LhPIxP2p7aluaA3qyiEbM50Izz+t4mL4JdaBN8DU0kLziqVERw== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.0.tgz#c924fd6278992d8939501903347808a2ded053aa" - integrity sha512-pwbGxx/h0U0NILec6ZscHt6FBOyCUi8TTZzp1B7W9hpC3KSh4qGH1fUM2LI1mXFLl8c/exmVs7aZMN/24KgBag== +"@abp/moment@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.1.tgz#5cf7f815cc4dbe55c9c363d146592683f8a90d62" + integrity sha512-tgg4rTmAGZE+B8OBpeq1ADXJW07EdkCkQUSrLykWMaQr1PZfs9xi0tgsi4CpdITLOK48b9BueRmUdZOgmFXKiQ== dependencies: moment "^2.9.0" -"@abp/select2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.0.tgz#30522455c70059251e593cdb0228dbbf831bbb78" - integrity sha512-VPdqxjT8URm1rkwsPvutOgFPs/JTlm8KVcvdV1UsvJMxx5OIKMKcxgsL9UJl033HzVVwp/XBsMQsaNRHnW+hvw== +"@abp/select2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.1.tgz#1afa414ce68c1f35c3e7ab1beee00f924604de51" + integrity sha512-+5MMLQuXlj07VIXhVKEAmeqsfuGXHWwtpDY2LMsT15lNJbrvq0wF9KZJ0eMF8u29Nyk8IuBJf1YRUzx815PiVg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.0.tgz#7cbf9c53ab9e1db2c59d63f392ba9b62624272f6" - integrity sha512-5NL2TijufGF5Jdbed1V+s6+tCa/C/R/ZSfb7CjQnBOCSC0JNhBDHtRabOaouqr2la4xbAEHjIoyXEnWXYAidYw== +"@abp/sweetalert2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.1.tgz#9ba7578ab53af056f26ef34ae0f2fddc28722c12" + integrity sha512-8hjmEqmcRoMN3Cmk7k0lNdtsm8JytrjPzvHahjqKHIcK1Zi0RbjWJpafbvDu5IFlFrRNYHXlqpUw8e3dtCEp3A== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.0.tgz#96909f2d0d27ac977d0caf6a0e2b725681f8124e" - integrity sha512-gWDwvnVSVKPBaOaJCaqhvcqS/GwTQFzNH6dWIH19/g23rF3+s/KwTyoW5AA8uWStBx1PxZaugR0OIK/7hctUog== +"@abp/timeago@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.1.tgz#c7be25a320aa311e2e9c7a8186b51766db4523ac" + integrity sha512-FsIjAiP2dqRHwrrKx/5tWgLMZ2LboNLhrHeRb1FFol/0163uVEQGEJkxLOE5xY530mdaFFfAOc0x6aniSLE4ZQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" timeago "^1.6.7" -"@abp/toastr@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.0.tgz#c11d780c86c16835528f152aac4cbe4aa94bb810" - integrity sha512-awgpA6J65TlMK54Hdq2fyDsZ6nvD69RKfAUaGzpz685tNbvaqQfXxSlBQVEad8QZlMGFeCOAmH9GYkBHNaP/zg== +"@abp/toastr@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.1.tgz#5ef7da983a226f226d8b9b85f2fa9ff7eeed41aa" + integrity sha512-8x8FQt8BSmgI1b6JXK7N+JJJ0ksBcFSMQol0AbzTOFOBO2T77eXIuiVh8961ynaeIECjGWcazXUMuG09Drq6Ig== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" toastr "^2.1.4" -"@abp/utils@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.0.tgz#fb52fdc21e8d26a32245eefac86c512a9318ee47" - integrity sha512-CorSSUsaVug2qY6f4j2uxtAjdSq1dfdq1QdjdQaoPxoZKU74Yv/Cyh7YZ+WJa3Upmaw4V0+6ELX9RE3OjJIxIQ== +"@abp/utils@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.1.tgz#e11bc878573dd8118e42b3c1582c44d8b5c71d83" + integrity sha512-G4S0ndDUe8W525O8KUBucLcrESoSFjeqLjRZ+W7N7K9D/oLisYU9Siwxb2csTdjXz6JeQ7AtQl7ak1WpAMiJ/g== dependencies: just-compare "^1.3.0" 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 0639f4712f..674131b6d3 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": "^7.1.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.1" } } 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 4a687745e9..0ad110e7ef 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Host/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.0.tgz#79b5154f041fde68ecf81a920f756d16157cb439" - integrity sha512-rmrPRviLwlAN+o48ZnzPoRRYv78Uqwd1eSX6ftaf4CPxbb+bQJAKAcL5FbAnNheLesL62sn4x11Q60F8Mp850g== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.0.tgz#af4d0b4228fb0ead0626d344a5458856103446ff" - integrity sha512-Pn6UBgSJbOCnW0OFcLZrOH4dEpSSlBDjSy6HMm0wtdgodu9TjRYY/mAwRsjhXZTX3ycpuktVhVotB4ZLvFpgUg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.1.0" - "@abp/bootstrap" "~7.1.0" - "@abp/bootstrap-datepicker" "~7.1.0" - "@abp/bootstrap-daterangepicker" "~7.1.0" - "@abp/datatables.net-bs5" "~7.1.0" - "@abp/font-awesome" "~7.1.0" - "@abp/jquery-form" "~7.1.0" - "@abp/jquery-validation-unobtrusive" "~7.1.0" - "@abp/lodash" "~7.1.0" - "@abp/luxon" "~7.1.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.1.0" - "@abp/moment" "~7.1.0" - "@abp/select2" "~7.1.0" - "@abp/sweetalert2" "~7.1.0" - "@abp/timeago" "~7.1.0" - "@abp/toastr" "~7.1.0" - -"@abp/aspnetcore.mvc.ui@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.0.tgz#a10cc69976e294587a5274f11c216e55ebb1feb7" - integrity sha512-TGCmp4rxQiTUPaZYYGvhQSm5vjcZhJUEriuNyGSKWcs8vTC4eV6Eh6JqANU42RNxohWrQczEIWWMrQz5MEfX6g== +"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.1.tgz#9368779919662a804a8119ac6cf9b731fa2a9728" + integrity sha512-xMUBHJv9pLWp3wx3Oc6+F4G8biZ+BgCskYzAgV2lLWFjQAUxe8klbP0dsVr0EZemyMctX6zlHLURRIl+Os8Z2Q== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.1.tgz#48cf683b8a147bc5955de5e812a0dfa3b7184f29" + integrity sha512-caHzC5zOr2vXY2QDRKuFQ4qIWOS/DbsJUO+UhfKSHvP/bAv7Cu10K3gHwrbfuNCChDJ9iLK0+oJYXUtYBXRA3g== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.1.1" + "@abp/bootstrap" "~7.1.1" + "@abp/bootstrap-datepicker" "~7.1.1" + "@abp/bootstrap-daterangepicker" "~7.1.1" + "@abp/datatables.net-bs5" "~7.1.1" + "@abp/font-awesome" "~7.1.1" + "@abp/jquery-form" "~7.1.1" + "@abp/jquery-validation-unobtrusive" "~7.1.1" + "@abp/lodash" "~7.1.1" + "@abp/luxon" "~7.1.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.1.1" + "@abp/moment" "~7.1.1" + "@abp/select2" "~7.1.1" + "@abp/sweetalert2" "~7.1.1" + "@abp/timeago" "~7.1.1" + "@abp/toastr" "~7.1.1" + +"@abp/aspnetcore.mvc.ui@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.1.tgz#f862b77573b5c34d9b938160669400edbf06154d" + integrity sha512-+xafeXzwnFa4Evak9Wq+jrpimWITio4Yv9WeSbKInNakIPO+wJNBClBneca1XQ+LFy4bMRuqgWYJueUct+E3tA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,158 +43,158 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.0.tgz#2a5635f35aeb5be636dfdd5a3fe68c083507cb29" - integrity sha512-ZZTsDgrbKyU/mA8ZKKiSTsd9mTHl2n3mDWrDX7rJdZ5zyGzxxk2Dc81kQP5qUdp6OAG6chiLIPLxXntjWVnyvA== +"@abp/bootstrap-datepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.1.tgz#45c9b9086b3a64ce4ba6193320afdf2e81d12136" + integrity sha512-/T2FlMlPV19J70t8yueyxj9k72+4t3b2aVDrNHCf7uPuSqClwVKEylzGr8RFc7VXHZZwwaUrbLhxYkhkCKLuLA== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.0.tgz#1bf9a27976036c8e658d104a964742410aaca691" - integrity sha512-dhOf3aU82RDYcQc+HOObqd960SmHZTDPhS+6D9QkJ9a3PocyoBzLEi/lcgjfQytMzwsebxY8vk+S2WTUucoRuQ== +"@abp/bootstrap-daterangepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.1.tgz#19349099f6c007feef1ebe73c9c1059f8d271bc1" + integrity sha512-pCTiPRNW4gnzo0rWKbu2A52dRUeXRI3MqJW7h46yNk4n1ZrnsmwH6/b/ebp89YlbNXWaatDrEpk3NbqxSDDAdQ== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.0.tgz#52063d1f577d01d17f3b67e9bdc1ea811242b41e" - integrity sha512-S8Vnpj+cUO58C79aPum9eKlj13nY/T36ReUBPwT3CPrzStM9ab5BlNwHXR3Piyx/73i/r4Utehg18hs2fVi5Jw== +"@abp/bootstrap@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.1.tgz#1481b984a7f31f92f262d6957340fcaa87eb8ece" + integrity sha512-qFNLuBExQeVDOlFKP/STa3r+8CHhPUfsOFnPaknkS2QLewmtAZw3BJFEgvpJQkSvQdaBXW+EjutaJiFGdDrkEQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" bootstrap "^5.1.3" -"@abp/core@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.0.tgz#cffbe4a166073b394850ffd9739b0a089149a3fb" - integrity sha512-+DLBAtXo5BRYwcQH3yFzya0EZj8wd0/BE2QmXTVJ+nxQly+cp7ZV98oRIzI7ArIIV52Th4CXHwZv0l0U0Rdisg== +"@abp/core@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.1.tgz#de4d666d26fba4ab5f7b3e6fff38f2f5f034d121" + integrity sha512-d/vHAAU60v6gdH3+VpchXDD1l5yXNmKsb3i92gvG9M0orjgVy3dJmb6zBVw50nnZxNSfq3Z0S1TC/QdA2C1rQg== dependencies: - "@abp/utils" "~7.1.0" + "@abp/utils" "~7.1.1" -"@abp/datatables.net-bs5@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.0.tgz#3c2289290c3667cad69604d6184fb9b77263f137" - integrity sha512-1LqROrLgFOiUN3E28s5qEu82Zdy4kLGJ6a7f1J6OAvqGXF62DRbKhoS8Rsd5DOV+JHCRnAx8PnTBhlUbl2zmoQ== +"@abp/datatables.net-bs5@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.1.tgz#b7058a0cad4119cc7391493a7d148250efc41b72" + integrity sha512-uPqHzfE9dH5nEuocvIduQYcjEa4MwBXMjtnY5tHM+PK2yB8DsDOrXVopOX0YPTgFk49pLvOVbgxsftuyPb3xKQ== dependencies: - "@abp/datatables.net" "~7.1.0" + "@abp/datatables.net" "~7.1.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.0.tgz#e26dd279276dd38dff485c68bb92b77a4737b625" - integrity sha512-vwihQI6Sxp9gktMSSQ99HwS8oHoYZh1zmZWEnVNAvMnTlxMhqwHEIK2y0XkT/jI3z5NGntz75qFSoqHGFLRAbw== +"@abp/datatables.net@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.1.tgz#a84975c8ab0d7406e524d2eae41f7a04bc00f13c" + integrity sha512-eKIxvap/bKc1G7Dev+t9V8HvHWQYza0Y4RdYmC0bPOyRthlTW9AH8jyKK5HtJlpNpj9rjB2jy3/I9D1uzD67QQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.0.tgz#65d9919c3d511197e4518ce25164f767c4776a5a" - integrity sha512-1u0zBE26iNv3YjQ1gTv8rozt6jSXDD0OISMXRT90BAGpOrEHoUB9VaRx4q7AXIrPye95RhfpccGbWE31vPEguw== +"@abp/font-awesome@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.1.tgz#da4a0be295b0acf9b62d8299d1c567ae192a320f" + integrity sha512-AVjbSFXj5IzzQwqwP/fgsuRG1NzV6/KGn5owsfn6HeKSOBjqW4h4EGyunMNoAOW4fsdFxvE4zjBpsG1/E9tuQg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.0.tgz#e1d29ea105a3c4664057fea6c03999ff9529ee59" - integrity sha512-GuJC3TTclKk47mMjtasZBkKF1KqZcvUCXTkTM165U3hN80Bn5GjbS48oXz/iHI70lWNDsycVRrrrc8guwksvzg== +"@abp/jquery-form@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.1.tgz#03c17ccb19820e0a56be58275e2ebba7e7ebaa5f" + integrity sha512-UurenNEYZRN192B70R3DR1NsFUae45h/2huAQD07OM0fyJyM6ji5N7q/Q2Aao0jqBLwRNPrEinUcP8BmJxe2Tw== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.0.tgz#0eb2364582337d530aa6f24fcbaaefa40fda6f7a" - integrity sha512-JiZvmSBt/Q8kZ15wazRDf738UjY1ZCpNm0fE47mpokE9T1YiD8DVDnv4qFDa7ActB5PsfwD1vRANNrmfUsSJcw== +"@abp/jquery-validation-unobtrusive@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.1.tgz#255146ccc553bb9f9197ccf87fa71d930698cf65" + integrity sha512-oUYvNmiGxeyJeGoG3EWAzy2Ld9EKgyK6U28gKaAMrXFlYbiEMnX5+8v1Tdb3sQuOJ68bdiyYjO3Ke9NLsTZHFg== dependencies: - "@abp/jquery-validation" "~7.1.0" + "@abp/jquery-validation" "~7.1.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.0.tgz#2c28095e4fccbaea78dc1f0c5459456380727079" - integrity sha512-rXCrd1ZZ2pse4MgF2fB6e/880UiaHuk+ZXBg/y8Yj2Ab5OVsUuCw9CpsjHOplWC6Rq5A8SjO7BCdI4juxb3xHQ== +"@abp/jquery-validation@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.1.tgz#b3af6606daaa6303c28f6a04aeaa2d6612c5248b" + integrity sha512-ZkDWUbHqF9NkczPdvEZH4gkb6NeXRI5JsROXzmx3K+QIOGUhs//4gOzSYYak0kn0Mljeg8fjJQNa55914d8Xow== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.0.tgz#5c43c7b4fff5f04f7bf9f763e6c2e57f000cbb10" - integrity sha512-JPgrVkRVnxFFm96movaOsfM4NsDghIdfAwo25Qz4t5hAeiAVusTCULML5Ds1IjHHQBjbYV/81Zno3xHzC4eU8A== +"@abp/jquery@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.1.tgz#43adacf3d345576ff7ca42a5a470eb61fb827e23" + integrity sha512-3Epxyyoz1BJge7lbimkg0Ha4DmNlZN5vYFgVKa8SOCoKfoZ7+8gmbXlUEAUe4wnsjP5tQ4/AjoqgzjPL9KQcCg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" jquery "~3.6.0" -"@abp/lodash@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.0.tgz#d187bdac06a1425737837521d09aaf998d49bd08" - integrity sha512-/PmbRfN8ACBey4r8QpwSad38n720yZG5WY/lvddCoBmhJYeUtEr0moFF4g2x0wVm7U1wVXQK6RR9GOr0Q2A7Og== +"@abp/lodash@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.1.tgz#7371484331867775adcb5f4a92d63d4cbed25f19" + integrity sha512-hwNcYcRNZZV5OgH+W775OkpJ5JmrDi+LiVFDAmelWgAXSgqxic8bDla+UUL/pjnkKxwgI4BAlOIctYN/2QM3iA== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" lodash "^4.17.21" -"@abp/luxon@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.0.tgz#e6e119736e0340df162aeaf6546ec322253fee7e" - integrity sha512-UqsJTELF9bxZgE4v9dSfuHvyhinqFPKWZD1ctzTv4At5wie5yrqa+r5y59rPRui3svBxiZXSSZKmDCZnaoFW+w== +"@abp/luxon@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.1.tgz#b0cf4a72ffe66f77d403b896ea5d1ea007ebc9b7" + integrity sha512-2RDIdHrPUDvOoowQlMInfQ0rDZA8IOf2fVs7C2bcZmhjGoK7+vsUJsw/q9awpgeKrHwqJ0o1zsFGfFFKlYMnew== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.0.tgz#f113854212adcddbb142ee54f27e8f3876a22e7c" - integrity sha512-IIbDZ/7fjcnZ05ZHbX6KrlDlkXzZLD8w7teAoMuhBcLZeP3PWythzFYbCc6LwvtgvvkfriyPSth4PCsv2mh/gw== +"@abp/malihu-custom-scrollbar-plugin@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.1.tgz#8a25f3dd78c1f0c395ac255976567d2919d3ec38" + integrity sha512-kfW+B+kFr0Qao17rDginL0ICPwGA3t387hx5LhPIxP2p7aluaA3qyiEbM50Izz+t4mL4JdaBN8DU0kLziqVERw== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.0.tgz#c924fd6278992d8939501903347808a2ded053aa" - integrity sha512-pwbGxx/h0U0NILec6ZscHt6FBOyCUi8TTZzp1B7W9hpC3KSh4qGH1fUM2LI1mXFLl8c/exmVs7aZMN/24KgBag== +"@abp/moment@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.1.tgz#5cf7f815cc4dbe55c9c363d146592683f8a90d62" + integrity sha512-tgg4rTmAGZE+B8OBpeq1ADXJW07EdkCkQUSrLykWMaQr1PZfs9xi0tgsi4CpdITLOK48b9BueRmUdZOgmFXKiQ== dependencies: moment "^2.9.0" -"@abp/select2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.0.tgz#30522455c70059251e593cdb0228dbbf831bbb78" - integrity sha512-VPdqxjT8URm1rkwsPvutOgFPs/JTlm8KVcvdV1UsvJMxx5OIKMKcxgsL9UJl033HzVVwp/XBsMQsaNRHnW+hvw== +"@abp/select2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.1.tgz#1afa414ce68c1f35c3e7ab1beee00f924604de51" + integrity sha512-+5MMLQuXlj07VIXhVKEAmeqsfuGXHWwtpDY2LMsT15lNJbrvq0wF9KZJ0eMF8u29Nyk8IuBJf1YRUzx815PiVg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.0.tgz#7cbf9c53ab9e1db2c59d63f392ba9b62624272f6" - integrity sha512-5NL2TijufGF5Jdbed1V+s6+tCa/C/R/ZSfb7CjQnBOCSC0JNhBDHtRabOaouqr2la4xbAEHjIoyXEnWXYAidYw== +"@abp/sweetalert2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.1.tgz#9ba7578ab53af056f26ef34ae0f2fddc28722c12" + integrity sha512-8hjmEqmcRoMN3Cmk7k0lNdtsm8JytrjPzvHahjqKHIcK1Zi0RbjWJpafbvDu5IFlFrRNYHXlqpUw8e3dtCEp3A== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.0.tgz#96909f2d0d27ac977d0caf6a0e2b725681f8124e" - integrity sha512-gWDwvnVSVKPBaOaJCaqhvcqS/GwTQFzNH6dWIH19/g23rF3+s/KwTyoW5AA8uWStBx1PxZaugR0OIK/7hctUog== +"@abp/timeago@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.1.tgz#c7be25a320aa311e2e9c7a8186b51766db4523ac" + integrity sha512-FsIjAiP2dqRHwrrKx/5tWgLMZ2LboNLhrHeRb1FFol/0163uVEQGEJkxLOE5xY530mdaFFfAOc0x6aniSLE4ZQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" timeago "^1.6.7" -"@abp/toastr@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.0.tgz#c11d780c86c16835528f152aac4cbe4aa94bb810" - integrity sha512-awgpA6J65TlMK54Hdq2fyDsZ6nvD69RKfAUaGzpz685tNbvaqQfXxSlBQVEad8QZlMGFeCOAmH9GYkBHNaP/zg== +"@abp/toastr@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.1.tgz#5ef7da983a226f226d8b9b85f2fa9ff7eeed41aa" + integrity sha512-8x8FQt8BSmgI1b6JXK7N+JJJ0ksBcFSMQol0AbzTOFOBO2T77eXIuiVh8961ynaeIECjGWcazXUMuG09Drq6Ig== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" toastr "^2.1.4" -"@abp/utils@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.0.tgz#fb52fdc21e8d26a32245eefac86c512a9318ee47" - integrity sha512-CorSSUsaVug2qY6f4j2uxtAjdSq1dfdq1QdjdQaoPxoZKU74Yv/Cyh7YZ+WJa3Upmaw4V0+6ELX9RE3OjJIxIQ== +"@abp/utils@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.1.tgz#e11bc878573dd8118e42b3c1582c44d8b5c71d83" + integrity sha512-G4S0ndDUe8W525O8KUBucLcrESoSFjeqLjRZ+W7N7K9D/oLisYU9Siwxb2csTdjXz6JeQ7AtQl7ak1WpAMiJ/g== 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 763218edc4..f4f746a61d 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/CmsKitWebUnifiedModule.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.IO; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; @@ -168,6 +169,16 @@ public class CmsKitWebUnifiedModule : AbpModule { options.EntityTypes.Add(new CommentEntityTypeDefinition("quote")); options.IsRecaptchaEnabled = true; + options.AllowedExternalUrls = new Dictionary> + { + { + "quote", + new List + { + "https://abp.io/" + } + } + }; }); Configure(options => 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 a38df23737..5c86b85f3d 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.0", - "@abp/cms-kit": "7.1.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.1", + "@abp/cms-kit": "7.1.1" } } 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 c91b37a95d..1dd6d78aa7 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock +++ b/modules/cms-kit/host/Volo.CmsKit.Web.Unified/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.0.tgz#79b5154f041fde68ecf81a920f756d16157cb439" - integrity sha512-rmrPRviLwlAN+o48ZnzPoRRYv78Uqwd1eSX6ftaf4CPxbb+bQJAKAcL5FbAnNheLesL62sn4x11Q60F8Mp850g== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.0.tgz#af4d0b4228fb0ead0626d344a5458856103446ff" - integrity sha512-Pn6UBgSJbOCnW0OFcLZrOH4dEpSSlBDjSy6HMm0wtdgodu9TjRYY/mAwRsjhXZTX3ycpuktVhVotB4ZLvFpgUg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.1.0" - "@abp/bootstrap" "~7.1.0" - "@abp/bootstrap-datepicker" "~7.1.0" - "@abp/bootstrap-daterangepicker" "~7.1.0" - "@abp/datatables.net-bs5" "~7.1.0" - "@abp/font-awesome" "~7.1.0" - "@abp/jquery-form" "~7.1.0" - "@abp/jquery-validation-unobtrusive" "~7.1.0" - "@abp/lodash" "~7.1.0" - "@abp/luxon" "~7.1.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.1.0" - "@abp/moment" "~7.1.0" - "@abp/select2" "~7.1.0" - "@abp/sweetalert2" "~7.1.0" - "@abp/timeago" "~7.1.0" - "@abp/toastr" "~7.1.0" - -"@abp/aspnetcore.mvc.ui@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.0.tgz#a10cc69976e294587a5274f11c216e55ebb1feb7" - integrity sha512-TGCmp4rxQiTUPaZYYGvhQSm5vjcZhJUEriuNyGSKWcs8vTC4eV6Eh6JqANU42RNxohWrQczEIWWMrQz5MEfX6g== +"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.1.tgz#9368779919662a804a8119ac6cf9b731fa2a9728" + integrity sha512-xMUBHJv9pLWp3wx3Oc6+F4G8biZ+BgCskYzAgV2lLWFjQAUxe8klbP0dsVr0EZemyMctX6zlHLURRIl+Os8Z2Q== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.1.tgz#48cf683b8a147bc5955de5e812a0dfa3b7184f29" + integrity sha512-caHzC5zOr2vXY2QDRKuFQ4qIWOS/DbsJUO+UhfKSHvP/bAv7Cu10K3gHwrbfuNCChDJ9iLK0+oJYXUtYBXRA3g== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.1.1" + "@abp/bootstrap" "~7.1.1" + "@abp/bootstrap-datepicker" "~7.1.1" + "@abp/bootstrap-daterangepicker" "~7.1.1" + "@abp/datatables.net-bs5" "~7.1.1" + "@abp/font-awesome" "~7.1.1" + "@abp/jquery-form" "~7.1.1" + "@abp/jquery-validation-unobtrusive" "~7.1.1" + "@abp/lodash" "~7.1.1" + "@abp/luxon" "~7.1.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.1.1" + "@abp/moment" "~7.1.1" + "@abp/select2" "~7.1.1" + "@abp/sweetalert2" "~7.1.1" + "@abp/timeago" "~7.1.1" + "@abp/toastr" "~7.1.1" + +"@abp/aspnetcore.mvc.ui@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.1.tgz#f862b77573b5c34d9b938160669400edbf06154d" + integrity sha512-+xafeXzwnFa4Evak9Wq+jrpimWITio4Yv9WeSbKInNakIPO+wJNBClBneca1XQ+LFy4bMRuqgWYJueUct+E3tA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,257 +43,257 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.0.tgz#2a5635f35aeb5be636dfdd5a3fe68c083507cb29" - integrity sha512-ZZTsDgrbKyU/mA8ZKKiSTsd9mTHl2n3mDWrDX7rJdZ5zyGzxxk2Dc81kQP5qUdp6OAG6chiLIPLxXntjWVnyvA== +"@abp/bootstrap-datepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.1.tgz#45c9b9086b3a64ce4ba6193320afdf2e81d12136" + integrity sha512-/T2FlMlPV19J70t8yueyxj9k72+4t3b2aVDrNHCf7uPuSqClwVKEylzGr8RFc7VXHZZwwaUrbLhxYkhkCKLuLA== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.0.tgz#1bf9a27976036c8e658d104a964742410aaca691" - integrity sha512-dhOf3aU82RDYcQc+HOObqd960SmHZTDPhS+6D9QkJ9a3PocyoBzLEi/lcgjfQytMzwsebxY8vk+S2WTUucoRuQ== +"@abp/bootstrap-daterangepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.1.tgz#19349099f6c007feef1ebe73c9c1059f8d271bc1" + integrity sha512-pCTiPRNW4gnzo0rWKbu2A52dRUeXRI3MqJW7h46yNk4n1ZrnsmwH6/b/ebp89YlbNXWaatDrEpk3NbqxSDDAdQ== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.0.tgz#52063d1f577d01d17f3b67e9bdc1ea811242b41e" - integrity sha512-S8Vnpj+cUO58C79aPum9eKlj13nY/T36ReUBPwT3CPrzStM9ab5BlNwHXR3Piyx/73i/r4Utehg18hs2fVi5Jw== +"@abp/bootstrap@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.1.tgz#1481b984a7f31f92f262d6957340fcaa87eb8ece" + integrity sha512-qFNLuBExQeVDOlFKP/STa3r+8CHhPUfsOFnPaknkS2QLewmtAZw3BJFEgvpJQkSvQdaBXW+EjutaJiFGdDrkEQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" bootstrap "^5.1.3" -"@abp/clipboard@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.1.0.tgz#21531f61322fc64114350972c9cedaa54f7114ae" - integrity sha512-1woUBwgtvsThNmEzYyIb46O13jchetY/HkYaOpwbLW6A13Qrsa0lHbABUDLpLp685T/1M/9lweOhWvNxRw2Ozw== +"@abp/clipboard@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.1.1.tgz#06985266e399a03f819585ec9b9ae17ffcbfef0b" + integrity sha512-IxlQJgNlhp6hMVAkPqRgzmB0a5bKdrZ0whVlaxNKR42geetutV+5KPo/koCmliksHLAFTfiAedQXOXsJ90p2AQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" clipboard "^2.0.8" -"@abp/cms-kit.admin@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-7.1.0.tgz#ed9c2395aff022adee8071d610cd1f24818986c6" - integrity sha512-C7Q/AvDfQrs8ZSpFwQPHn/HE3KJQhBwSw12qhAAEY8KiyI5gcr7j+iRm644iSlpo9SP+ZWuC0J6SzRtV6SNqjw== +"@abp/cms-kit.admin@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.admin/-/cms-kit.admin-7.1.1.tgz#0d5491fdff103e710a3cccbfd1cf5e408f49ac0d" + integrity sha512-n+ElAQ0cCVYZ9pPO7TaeLXO6sHErm5IIXUhrL0kJzWLAvjuUgiUFbk/Np9t64/JzWiLk9+5DR88tyP05q56srQ== dependencies: - "@abp/codemirror" "~7.1.0" - "@abp/jstree" "~7.1.0" - "@abp/slugify" "~7.1.0" - "@abp/tui-editor" "~7.1.0" - "@abp/uppy" "~7.1.0" + "@abp/codemirror" "~7.1.1" + "@abp/jstree" "~7.1.1" + "@abp/slugify" "~7.1.1" + "@abp/tui-editor" "~7.1.1" + "@abp/uppy" "~7.1.1" -"@abp/cms-kit.public@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-7.1.0.tgz#b63ed5ea3decba7ba7637f296cd3c4a522d462d3" - integrity sha512-rC0rhpUL6vPyLzbeToE/VGdcDFDLeY6IQH5TPQ18QPm21s5VVR/FVtTc8tS3TozZ6r+E2+enVoCyiGFL3JhDZQ== +"@abp/cms-kit.public@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit.public/-/cms-kit.public-7.1.1.tgz#002dac55e4a6744061a9e685b6fd2ca8cf9ba2d3" + integrity sha512-N3UYz0utsh7XP8Z2f/90xTSp7OaNiebYoRXY26aTuvqR5/q+5COju4BozaXuz+nyjxGjGP84ld8FXFAx8snS0A== dependencies: - "@abp/highlight.js" "~7.1.0" - "@abp/star-rating-svg" "~7.1.0" + "@abp/highlight.js" "~7.1.1" + "@abp/star-rating-svg" "~7.1.1" -"@abp/cms-kit@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-7.1.0.tgz#dae53646ad3307d4280f8f88e7b3c4d82e73ce95" - integrity sha512-FTNzpX5IotEc9mf6YHyxW+e4w4tIbyPZs+X0rEXkSX2qVzocDkZN8ZJgGO+iaDNykoL+luDeDlllCW6TFYH/xQ== +"@abp/cms-kit@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/cms-kit/-/cms-kit-7.1.1.tgz#cb3e20aac55cdc77d7b5975e9177ceeedd344ec0" + integrity sha512-SFuapFerhy3XnTeAU8OvQvciBqQmglpQeISeGgzMm3KUC0k/gnB6PHgacjWxIyXjb8tKTUNfW3LwRLkQo7GZxw== dependencies: - "@abp/cms-kit.admin" "~7.1.0" - "@abp/cms-kit.public" "~7.1.0" + "@abp/cms-kit.admin" "~7.1.1" + "@abp/cms-kit.public" "~7.1.1" -"@abp/codemirror@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-7.1.0.tgz#589cfb784364d1cc51636198230bae78124d0918" - integrity sha512-G0Ox1Wvkketh+5NP645GGTpl3xYVqUY+uitNF2hRZwqprPU6ZxPDa3KZIOBdl54IKsCWneHyErRXEtr/DSjo5Q== +"@abp/codemirror@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/codemirror/-/codemirror-7.1.1.tgz#81f920bbe013ea310c30b5517532c149c7b00c69" + integrity sha512-jcV4Xx9NLHags79ra+Czamu38s9HDRxnIdpZRnZ+aTbxSbyrSMz/Zp03Wwy0r9yu/nwrIyxZCQjT46JIh5Q1zg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" codemirror "^5.65.1" -"@abp/core@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.0.tgz#cffbe4a166073b394850ffd9739b0a089149a3fb" - integrity sha512-+DLBAtXo5BRYwcQH3yFzya0EZj8wd0/BE2QmXTVJ+nxQly+cp7ZV98oRIzI7ArIIV52Th4CXHwZv0l0U0Rdisg== +"@abp/core@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.1.tgz#de4d666d26fba4ab5f7b3e6fff38f2f5f034d121" + integrity sha512-d/vHAAU60v6gdH3+VpchXDD1l5yXNmKsb3i92gvG9M0orjgVy3dJmb6zBVw50nnZxNSfq3Z0S1TC/QdA2C1rQg== dependencies: - "@abp/utils" "~7.1.0" + "@abp/utils" "~7.1.1" -"@abp/datatables.net-bs5@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.0.tgz#3c2289290c3667cad69604d6184fb9b77263f137" - integrity sha512-1LqROrLgFOiUN3E28s5qEu82Zdy4kLGJ6a7f1J6OAvqGXF62DRbKhoS8Rsd5DOV+JHCRnAx8PnTBhlUbl2zmoQ== +"@abp/datatables.net-bs5@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.1.tgz#b7058a0cad4119cc7391493a7d148250efc41b72" + integrity sha512-uPqHzfE9dH5nEuocvIduQYcjEa4MwBXMjtnY5tHM+PK2yB8DsDOrXVopOX0YPTgFk49pLvOVbgxsftuyPb3xKQ== dependencies: - "@abp/datatables.net" "~7.1.0" + "@abp/datatables.net" "~7.1.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.0.tgz#e26dd279276dd38dff485c68bb92b77a4737b625" - integrity sha512-vwihQI6Sxp9gktMSSQ99HwS8oHoYZh1zmZWEnVNAvMnTlxMhqwHEIK2y0XkT/jI3z5NGntz75qFSoqHGFLRAbw== +"@abp/datatables.net@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.1.tgz#a84975c8ab0d7406e524d2eae41f7a04bc00f13c" + integrity sha512-eKIxvap/bKc1G7Dev+t9V8HvHWQYza0Y4RdYmC0bPOyRthlTW9AH8jyKK5HtJlpNpj9rjB2jy3/I9D1uzD67QQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.0.tgz#65d9919c3d511197e4518ce25164f767c4776a5a" - integrity sha512-1u0zBE26iNv3YjQ1gTv8rozt6jSXDD0OISMXRT90BAGpOrEHoUB9VaRx4q7AXIrPye95RhfpccGbWE31vPEguw== +"@abp/font-awesome@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.1.tgz#da4a0be295b0acf9b62d8299d1c567ae192a320f" + integrity sha512-AVjbSFXj5IzzQwqwP/fgsuRG1NzV6/KGn5owsfn6HeKSOBjqW4h4EGyunMNoAOW4fsdFxvE4zjBpsG1/E9tuQg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/highlight.js@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-7.1.0.tgz#b8f8f04c4c52d4f50dc08f6d6e8c95bf0505e16a" - integrity sha512-2/PcJIlZVy3KWMvPur35hehiSynXx3XgADvTKojA7fAdWxEHzcfOCzNusDHyrQkTxSYdW7uBWZRWhFjktJHPbA== +"@abp/highlight.js@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/highlight.js/-/highlight.js-7.1.1.tgz#ee914936f0045671589f8c23d69223cbf7147f28" + integrity sha512-VOVOebkM7TNioZOv6ptlzQK/Ia6xWnziwJSYsVUq1etVLmM0Bi/Qy6c8qANu0STRSktb0VCy6sg6Dd8sNrqwaQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" "@highlightjs/cdn-assets" "~11.4.0" -"@abp/jquery-form@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.0.tgz#e1d29ea105a3c4664057fea6c03999ff9529ee59" - integrity sha512-GuJC3TTclKk47mMjtasZBkKF1KqZcvUCXTkTM165U3hN80Bn5GjbS48oXz/iHI70lWNDsycVRrrrc8guwksvzg== +"@abp/jquery-form@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.1.tgz#03c17ccb19820e0a56be58275e2ebba7e7ebaa5f" + integrity sha512-UurenNEYZRN192B70R3DR1NsFUae45h/2huAQD07OM0fyJyM6ji5N7q/Q2Aao0jqBLwRNPrEinUcP8BmJxe2Tw== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.0.tgz#0eb2364582337d530aa6f24fcbaaefa40fda6f7a" - integrity sha512-JiZvmSBt/Q8kZ15wazRDf738UjY1ZCpNm0fE47mpokE9T1YiD8DVDnv4qFDa7ActB5PsfwD1vRANNrmfUsSJcw== +"@abp/jquery-validation-unobtrusive@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.1.tgz#255146ccc553bb9f9197ccf87fa71d930698cf65" + integrity sha512-oUYvNmiGxeyJeGoG3EWAzy2Ld9EKgyK6U28gKaAMrXFlYbiEMnX5+8v1Tdb3sQuOJ68bdiyYjO3Ke9NLsTZHFg== dependencies: - "@abp/jquery-validation" "~7.1.0" + "@abp/jquery-validation" "~7.1.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.0.tgz#2c28095e4fccbaea78dc1f0c5459456380727079" - integrity sha512-rXCrd1ZZ2pse4MgF2fB6e/880UiaHuk+ZXBg/y8Yj2Ab5OVsUuCw9CpsjHOplWC6Rq5A8SjO7BCdI4juxb3xHQ== +"@abp/jquery-validation@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.1.tgz#b3af6606daaa6303c28f6a04aeaa2d6612c5248b" + integrity sha512-ZkDWUbHqF9NkczPdvEZH4gkb6NeXRI5JsROXzmx3K+QIOGUhs//4gOzSYYak0kn0Mljeg8fjJQNa55914d8Xow== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.0.tgz#5c43c7b4fff5f04f7bf9f763e6c2e57f000cbb10" - integrity sha512-JPgrVkRVnxFFm96movaOsfM4NsDghIdfAwo25Qz4t5hAeiAVusTCULML5Ds1IjHHQBjbYV/81Zno3xHzC4eU8A== +"@abp/jquery@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.1.tgz#43adacf3d345576ff7ca42a5a470eb61fb827e23" + integrity sha512-3Epxyyoz1BJge7lbimkg0Ha4DmNlZN5vYFgVKa8SOCoKfoZ7+8gmbXlUEAUe4wnsjP5tQ4/AjoqgzjPL9KQcCg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" jquery "~3.6.0" -"@abp/jstree@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-7.1.0.tgz#d711d180a2b7140e11ebfff35b9e5941c16092cd" - integrity sha512-zm5n6gXbhFAk23ADFBwiktDxeRsEYxsDptPu+iAFeon68mV/T6vAa2++B1A2v1sZWcMwIfPa+e95wRitU++TqQ== +"@abp/jstree@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jstree/-/jstree-7.1.1.tgz#cb3812c7c6cb1efbe385afa90e74e1c735a26162" + integrity sha512-0xKiwnvP+ehUxB//VOHum2rERuElKQfJm6KNO2LDWUVGw7D+giFTNnjfOUnFBJhIxIShMRmCQBTqSwNOhc1nmg== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jstree "^3.3.12" -"@abp/lodash@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.0.tgz#d187bdac06a1425737837521d09aaf998d49bd08" - integrity sha512-/PmbRfN8ACBey4r8QpwSad38n720yZG5WY/lvddCoBmhJYeUtEr0moFF4g2x0wVm7U1wVXQK6RR9GOr0Q2A7Og== +"@abp/lodash@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.1.tgz#7371484331867775adcb5f4a92d63d4cbed25f19" + integrity sha512-hwNcYcRNZZV5OgH+W775OkpJ5JmrDi+LiVFDAmelWgAXSgqxic8bDla+UUL/pjnkKxwgI4BAlOIctYN/2QM3iA== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" lodash "^4.17.21" -"@abp/luxon@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.0.tgz#e6e119736e0340df162aeaf6546ec322253fee7e" - integrity sha512-UqsJTELF9bxZgE4v9dSfuHvyhinqFPKWZD1ctzTv4At5wie5yrqa+r5y59rPRui3svBxiZXSSZKmDCZnaoFW+w== +"@abp/luxon@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.1.tgz#b0cf4a72ffe66f77d403b896ea5d1ea007ebc9b7" + integrity sha512-2RDIdHrPUDvOoowQlMInfQ0rDZA8IOf2fVs7C2bcZmhjGoK7+vsUJsw/q9awpgeKrHwqJ0o1zsFGfFFKlYMnew== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.0.tgz#f113854212adcddbb142ee54f27e8f3876a22e7c" - integrity sha512-IIbDZ/7fjcnZ05ZHbX6KrlDlkXzZLD8w7teAoMuhBcLZeP3PWythzFYbCc6LwvtgvvkfriyPSth4PCsv2mh/gw== +"@abp/malihu-custom-scrollbar-plugin@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.1.tgz#8a25f3dd78c1f0c395ac255976567d2919d3ec38" + integrity sha512-kfW+B+kFr0Qao17rDginL0ICPwGA3t387hx5LhPIxP2p7aluaA3qyiEbM50Izz+t4mL4JdaBN8DU0kLziqVERw== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.0.tgz#c924fd6278992d8939501903347808a2ded053aa" - integrity sha512-pwbGxx/h0U0NILec6ZscHt6FBOyCUi8TTZzp1B7W9hpC3KSh4qGH1fUM2LI1mXFLl8c/exmVs7aZMN/24KgBag== +"@abp/moment@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.1.tgz#5cf7f815cc4dbe55c9c363d146592683f8a90d62" + integrity sha512-tgg4rTmAGZE+B8OBpeq1ADXJW07EdkCkQUSrLykWMaQr1PZfs9xi0tgsi4CpdITLOK48b9BueRmUdZOgmFXKiQ== dependencies: moment "^2.9.0" -"@abp/prismjs@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.1.0.tgz#e9dc477f5d8728532a7c27e8e1b309a20b1aa32c" - integrity sha512-7pBxUKgqYaEEsuA7AUcdYJh05x2v0NVdkOc5n7KEw/ixqzB6d40SDBKndYg8ns+Zknvh6IK6e2FjOO+y/hWloQ== +"@abp/prismjs@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.1.1.tgz#bfcee96e5a1e2f98fb29006f16aeeb227a4e773d" + integrity sha512-7o7FRzgGNPR9GxQ6CPskWL2N87LykoylKnkCm0Cz0n+x0JSrAEMv2yEiJJT2L1S+51ldCQhBmF2blOjxgUT98A== dependencies: - "@abp/clipboard" "~7.1.0" - "@abp/core" "~7.1.0" + "@abp/clipboard" "~7.1.1" + "@abp/core" "~7.1.1" prismjs "^1.26.0" -"@abp/select2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.0.tgz#30522455c70059251e593cdb0228dbbf831bbb78" - integrity sha512-VPdqxjT8URm1rkwsPvutOgFPs/JTlm8KVcvdV1UsvJMxx5OIKMKcxgsL9UJl033HzVVwp/XBsMQsaNRHnW+hvw== +"@abp/select2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.1.tgz#1afa414ce68c1f35c3e7ab1beee00f924604de51" + integrity sha512-+5MMLQuXlj07VIXhVKEAmeqsfuGXHWwtpDY2LMsT15lNJbrvq0wF9KZJ0eMF8u29Nyk8IuBJf1YRUzx815PiVg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" select2 "^4.0.13" -"@abp/slugify@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-7.1.0.tgz#a1cc7aab3291bf8b3a8890453e1ae4e14ef41b43" - integrity sha512-sP5f5qOPy4cDMZ1iSCj0Ld1ViKNW341cDOWS3ZmyjJz/QRV43FFtgvXeK/2+3YswAihvTvKXvr2zPZuPV5nUlg== +"@abp/slugify@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/slugify/-/slugify-7.1.1.tgz#d6f3aec50793fec571e75641acecd3a34177cc1b" + integrity sha512-S0FCMZ4LSM8na9QeGDEA+nIuLdgcSXD3Qxab9TN8OuxH2aOt/7Ew+qTx0UbQlyZH8UCaVWMm9LJz6WGOUc9yjw== dependencies: slugify "^1.6.5" -"@abp/star-rating-svg@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-7.1.0.tgz#d7fecc17b6c34bf75f70a36127cd6a89920b44fe" - integrity sha512-e2l4PGgPOUr9gvVuboETDtNgdVDi1hVT7UEhfASrpcPr9k3gD3vYJRaNhd71Q2RRauZmAnZAZJaAaqdv2+G1zw== +"@abp/star-rating-svg@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/star-rating-svg/-/star-rating-svg-7.1.1.tgz#677f55a171ec3b1c9699511fd1dc17b355ee18aa" + integrity sha512-pSllw0mvb1j5gz+G0IZD6scHzq1Ge90Kpk2aA1rSVve/mDczlnN/6Rb5qAYoH/OrjH7svB+K28DpO4EsmFE6JQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" star-rating-svg "^3.5.0" -"@abp/sweetalert2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.0.tgz#7cbf9c53ab9e1db2c59d63f392ba9b62624272f6" - integrity sha512-5NL2TijufGF5Jdbed1V+s6+tCa/C/R/ZSfb7CjQnBOCSC0JNhBDHtRabOaouqr2la4xbAEHjIoyXEnWXYAidYw== +"@abp/sweetalert2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.1.tgz#9ba7578ab53af056f26ef34ae0f2fddc28722c12" + integrity sha512-8hjmEqmcRoMN3Cmk7k0lNdtsm8JytrjPzvHahjqKHIcK1Zi0RbjWJpafbvDu5IFlFrRNYHXlqpUw8e3dtCEp3A== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.0.tgz#96909f2d0d27ac977d0caf6a0e2b725681f8124e" - integrity sha512-gWDwvnVSVKPBaOaJCaqhvcqS/GwTQFzNH6dWIH19/g23rF3+s/KwTyoW5AA8uWStBx1PxZaugR0OIK/7hctUog== +"@abp/timeago@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.1.tgz#c7be25a320aa311e2e9c7a8186b51766db4523ac" + integrity sha512-FsIjAiP2dqRHwrrKx/5tWgLMZ2LboNLhrHeRb1FFol/0163uVEQGEJkxLOE5xY530mdaFFfAOc0x6aniSLE4ZQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" timeago "^1.6.7" -"@abp/toastr@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.0.tgz#c11d780c86c16835528f152aac4cbe4aa94bb810" - integrity sha512-awgpA6J65TlMK54Hdq2fyDsZ6nvD69RKfAUaGzpz685tNbvaqQfXxSlBQVEad8QZlMGFeCOAmH9GYkBHNaP/zg== +"@abp/toastr@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.1.tgz#5ef7da983a226f226d8b9b85f2fa9ff7eeed41aa" + integrity sha512-8x8FQt8BSmgI1b6JXK7N+JJJ0ksBcFSMQol0AbzTOFOBO2T77eXIuiVh8961ynaeIECjGWcazXUMuG09Drq6Ig== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" toastr "^2.1.4" -"@abp/tui-editor@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-7.1.0.tgz#5d050aa6f9d427eb5bd6eae9c645ba522c8215a8" - integrity sha512-QCuP8gibxA/i36i/7dQmMTYXTkgh8eFKTWrSsfgBLLmJ+2ODd/H+wOjVcvscNXgAIu3lCtsqhbnMXswFszZMnw== +"@abp/tui-editor@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/tui-editor/-/tui-editor-7.1.1.tgz#91c330860e245c7cac3f39a08c46125b197ca201" + integrity sha512-a5rIOTVkwPlty6i4D0SmctbvJUSKfnBbKezzk4ZGBMmu2Mlw5qIpLWYe3Tz1v50c/oQtArJ/6O2yCC+LJrIx1A== dependencies: - "@abp/jquery" "~7.1.0" - "@abp/prismjs" "~7.1.0" + "@abp/jquery" "~7.1.1" + "@abp/prismjs" "~7.1.1" -"@abp/uppy@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-7.1.0.tgz#cebb7fcc53971f2d47fdcd23bdafed746b88d1bd" - integrity sha512-Ws/w1BU+uL8C7eMrEwSDxEh874SdmBzhYBaioMRJNCIl/3S6TGVn2gaEvjLup1gdo3mKm25M+8Z6rmUWk0wB3w== +"@abp/uppy@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/uppy/-/uppy-7.1.1.tgz#b1b6b64af9d6fb5b24caba7023a9c31bdff76fe0" + integrity sha512-Y8A6L3VE8I5cVLkZeYjYWPNMbliUIajqJBzuhWXlHASwTB8dj6yq7siLLbDKReroUx63VbPTHVH5NwDwpNKgPg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" uppy "^1.16.1" -"@abp/utils@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.0.tgz#fb52fdc21e8d26a32245eefac86c512a9318ee47" - integrity sha512-CorSSUsaVug2qY6f4j2uxtAjdSq1dfdq1QdjdQaoPxoZKU74Yv/Cyh7YZ+WJa3Upmaw4V0+6ELX9RE3OjJIxIQ== +"@abp/utils@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.1.tgz#e11bc878573dd8118e42b3c1582c44d8b5c71d83" + integrity sha512-G4S0ndDUe8W525O8KUBucLcrESoSFjeqLjRZ+W7N7K9D/oLisYU9Siwxb2csTdjXz6JeQ7AtQl7ak1WpAMiJ/g== dependencies: just-compare "^1.3.0" diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CmsKitCommentOptions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CmsKitCommentOptions.cs index 94d3b785ec..1346541e69 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CmsKitCommentOptions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Comments/CmsKitCommentOptions.cs @@ -13,4 +13,9 @@ public class CmsKitCommentOptions /// Default: false /// public bool IsRecaptchaEnabled { get; set; } + + /// + /// Indicates the allowed external URLs by entity types, which can be included in a comment. + /// + public Dictionary> AllowedExternalUrls { get; set; } = new(); } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json index 9bb8dd275c..2f7d8ce13d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json @@ -216,6 +216,7 @@ "CaptchaCode": "Captcha code", "CommentTextRequired": "Comment is required", "CaptchaCodeErrorMessage" : "The answer you entered for the CAPTCHA was not correct. Please try again", - "CaptchaCodeMissingMessage": "The captcha code is missing!" + "CaptchaCodeMissingMessage": "The captcha code is missing!", + "UnAllowedExternalUrlMessage": "You included an unallowed external URL. Please try again without the external URL." } } \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParameteresInput.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs similarity index 92% rename from modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParameteresInput.cs rename to modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs index 7e156ef375..bfdbd0a95d 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParameteresInput.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Comments/CreateCommentWithParametersInput.cs @@ -6,7 +6,7 @@ using Volo.CmsKit.Comments; namespace Volo.CmsKit.Public.Comments; [Serializable] -public class CreateCommentWithParameteresInput +public class CreateCommentWithParametersInput { [Required] [DynamicStringLength(typeof(CommentConsts), nameof(CommentConsts.MaxTextLength))] diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs index 05857e5db9..4a7bd8be8c 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Security; +using System.Text.RegularExpressions; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; +using Microsoft.Extensions.Options; +using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Authorization; using Volo.Abp.Data; @@ -23,24 +25,27 @@ namespace Volo.CmsKit.Public.Comments; [RequiresGlobalFeature(typeof(CommentsFeature))] public class CommentPublicAppService : CmsKitPublicAppServiceBase, ICommentPublicAppService { + protected string RegexMarkdownUrlPattern = @"\[[^\]]*\]\((?.*?)\)(?![^\x60]*\x60)"; + protected ICommentRepository CommentRepository { get; } protected ICmsUserLookupService CmsUserLookupService { get; } public IDistributedEventBus DistributedEventBus { get; } protected CommentManager CommentManager { get; } - protected IAuthorizationService AuthorizationService { get; } + + protected CmsKitCommentOptions CmsCommentOptions { get; } public CommentPublicAppService( ICommentRepository commentRepository, ICmsUserLookupService cmsUserLookupService, IDistributedEventBus distributedEventBus, CommentManager commentManager, - IAuthorizationService authorizationService) + IOptionsSnapshot cmsCommentOptions) { CommentRepository = commentRepository; CmsUserLookupService = cmsUserLookupService; DistributedEventBus = distributedEventBus; CommentManager = commentManager; - AuthorizationService = authorizationService; + CmsCommentOptions = cmsCommentOptions.Value; } public virtual async Task> GetListAsync(string entityType, string entityId) @@ -56,6 +61,8 @@ public class CommentPublicAppService : CmsKitPublicAppServiceBase, ICommentPubli [Authorize] public virtual async Task CreateAsync(string entityType, string entityId, CreateCommentInput input) { + CheckExternalUrls(entityType, input.Text); + var user = await CmsUserLookupService.GetByIdAsync(CurrentUser.GetId()); if (input.RepliedCommentId.HasValue) @@ -87,11 +94,12 @@ public class CommentPublicAppService : CmsKitPublicAppServiceBase, ICommentPubli public virtual async Task UpdateAsync(Guid id, UpdateCommentInput input) { var comment = await CommentRepository.GetAsync(id); - if (comment.CreatorId != CurrentUser.GetId()) { throw new AbpAuthorizationException(); } + + CheckExternalUrls(comment.EntityType, input.Text); comment.SetText(input.Text); comment.SetConcurrencyStampIfNotNull(input.ConcurrencyStamp); @@ -148,4 +156,46 @@ public class CommentPublicAppService : CmsKitPublicAppServiceBase, ICommentPubli { return ObjectMapper.Map(comments.Single(c => c.Comment.Id == commentId).Author); } + + private void CheckExternalUrls(string entityType, string text) + { + if (!CmsCommentOptions.AllowedExternalUrls.TryGetValue(entityType, out var allowedExternalUrls)) + { + return; + } + + var matches = Regex.Matches(text, RegexMarkdownUrlPattern, + RegexOptions.Compiled | RegexOptions.IgnoreCase); + + foreach (Match match in matches) + { + if (!match.Success || match.Groups.Count < 2) + { + continue; + } + + var url = NormalizeUrl(match.Groups[1].Value); + if (!IsExternalUrl(url)) + { + continue; + } + + if (!allowedExternalUrls.Any(allowedExternalUrl => + url.Contains(NormalizeUrl(allowedExternalUrl), StringComparison.OrdinalIgnoreCase))) + { + throw new UserFriendlyException(L["UnAllowedExternalUrlMessage"]); + } + } + } + + private static bool IsExternalUrl(string url) + { + return url.StartsWith("https", StringComparison.InvariantCultureIgnoreCase) || + url.StartsWith("http", StringComparison.InvariantCultureIgnoreCase); + } + + private static string NormalizeUrl(string url) + { + return url.Replace("www.", "").RemovePostFix("/"); + } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebAutoMapperProfile.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebAutoMapperProfile.cs index 3c44f6fa1c..744d5afbad 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebAutoMapperProfile.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/CmsKitPublicWebAutoMapperProfile.cs @@ -8,6 +8,6 @@ public class CmsKitPublicWebAutoMapperProfile : Profile { public CmsKitPublicWebAutoMapperProfile() { - CreateMap(); + CreateMap(); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicCommentsController.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicCommentsController.cs index bb2487587b..e10a606826 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicCommentsController.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Controllers/CmsKitPublicCommentsController.cs @@ -29,14 +29,14 @@ public class CmsKitPublicCommentsController : AbpController } [HttpPost] - public async Task ValidateAsync([FromBody] CreateCommentWithParameteresInput input) + public async Task ValidateAsync([FromBody] CreateCommentWithParametersInput input) { if (CmsKitCommentOptions.IsRecaptchaEnabled && input.CaptchaToken.HasValue) { SimpleMathsCaptchaGenerator.Validate(input.CaptchaToken.Value, input.CaptchaAnswer); } - var dto = ObjectMapper.Map (input); + var dto = ObjectMapper.Map (input); await CommentPublicAppService.CreateAsync(input.EntityType, input.EntityId, dto); } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs index 304cfec687..b1ea42397f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Shared/Components/Commenting/CommentingViewComponent.cs @@ -121,7 +121,7 @@ public class CommentingViewComponent : AbpViewComponent public string EntityType { get; set; } public string EntityId { get; set; } - + public IEnumerable ReferralLinks { get; set; } public string LoginUrl { get; set; } diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/CmsKitApplicationTestModule.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/CmsKitApplicationTestModule.cs index e20c222a58..e0dba22140 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/CmsKitApplicationTestModule.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/CmsKitApplicationTestModule.cs @@ -1,4 +1,6 @@ -using Volo.Abp.Modularity; +using System.Collections.Generic; +using Volo.Abp.Modularity; +using Volo.CmsKit.Comments; namespace Volo.CmsKit; @@ -8,5 +10,20 @@ namespace Volo.CmsKit; )] public class CmsKitApplicationTestModule : AbpModule { - + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.AllowedExternalUrls = new Dictionary> + { + { + "EntityName1", + new List + { + "https://abp.io/" + } + } + }; + }); + } } diff --git a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs index d0e698937d..ddd913a93f 100644 --- a/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs +++ b/modules/cms-kit/test/Volo.CmsKit.Application.Tests/Comments/CommentPublicAppService_Tests.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using NSubstitute; using Shouldly; +using Volo.Abp; using Volo.Abp.Users; using Volo.CmsKit.Public.Comments; using Xunit; @@ -62,6 +63,23 @@ public class CommentPublicAppService_Tests : CmsKitApplicationTestBase }); } + [Fact] + public async Task CreateAsync_ShouldThrowUserFriendlyException_If_Url_UnAllowed() + { + _currentUser.Id.Returns(_cmsKitTestData.User2Id); + + await Should.ThrowAsync(async () => + await _commentAppService.CreateAsync( + _cmsKitTestData.EntityType1, + _cmsKitTestData.EntityId1, + new CreateCommentInput + { + RepliedCommentId = null, + Text = "[ABP Community](https://community.abp.io/)", //not allowed URL + } + )); + } + [Fact] public async Task UpdateAsync() { @@ -80,6 +98,21 @@ public class CommentPublicAppService_Tests : CmsKitApplicationTestBase comment.Text.ShouldBe("I'm Updated"); }); } + + [Fact] + public async Task UpdateAsync_ShouldThrowUserFriendlyException_If_Url_UnAllowed() + { + _currentUser.Id.Returns(_cmsKitTestData.User1Id); + + await Should.ThrowAsync(async () => + await _commentAppService.UpdateAsync( + _cmsKitTestData.CommentWithChildId, + new UpdateCommentInput + { + Text = "[ABP Community - Update](https://community.abp.io/)", //not allowed URL + } + )); + } [Fact] public async Task DeleteAsync() diff --git a/modules/docs/app/VoloDocs.Web/package.json b/modules/docs/app/VoloDocs.Web/package.json index d6b5900ace..0382466708 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": "^7.1.0", - "@abp/docs": "^7.1.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.1", + "@abp/docs": "^7.1.1" } } diff --git a/modules/docs/app/VoloDocs.Web/yarn.lock b/modules/docs/app/VoloDocs.Web/yarn.lock index 789c02c491..0d1aa6abe8 100644 --- a/modules/docs/app/VoloDocs.Web/yarn.lock +++ b/modules/docs/app/VoloDocs.Web/yarn.lock @@ -2,47 +2,47 @@ # yarn lockfile v1 -"@abp/anchor-js@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-7.1.0.tgz#b07be633e763474d53a81c2aa7d0a904ede2116a" - integrity sha512-RogjkJPSZQf2stP8qxCpl1BPKsALFJ0W0iMqHbKvnjdmobG4TOa7Tpp7sieVUf3iEHeZKqncncScYLMiJf1TUA== +"@abp/anchor-js@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/anchor-js/-/anchor-js-7.1.1.tgz#05a75de61834a37adee91715aba0774062c053ef" + integrity sha512-+VEt2EVYoo9OzlAoiMt3somAEFo6ILIozcnA4L5NcawgZCh51G2ogzqYAKicK8PeeVQSnVLrYCoQubDU7sAEAw== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" anchor-js "^4.3.1" -"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.0.tgz#79b5154f041fde68ecf81a920f756d16157cb439" - integrity sha512-rmrPRviLwlAN+o48ZnzPoRRYv78Uqwd1eSX6ftaf4CPxbb+bQJAKAcL5FbAnNheLesL62sn4x11Q60F8Mp850g== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.0.tgz#af4d0b4228fb0ead0626d344a5458856103446ff" - integrity sha512-Pn6UBgSJbOCnW0OFcLZrOH4dEpSSlBDjSy6HMm0wtdgodu9TjRYY/mAwRsjhXZTX3ycpuktVhVotB4ZLvFpgUg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.1.0" - "@abp/bootstrap" "~7.1.0" - "@abp/bootstrap-datepicker" "~7.1.0" - "@abp/bootstrap-daterangepicker" "~7.1.0" - "@abp/datatables.net-bs5" "~7.1.0" - "@abp/font-awesome" "~7.1.0" - "@abp/jquery-form" "~7.1.0" - "@abp/jquery-validation-unobtrusive" "~7.1.0" - "@abp/lodash" "~7.1.0" - "@abp/luxon" "~7.1.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.1.0" - "@abp/moment" "~7.1.0" - "@abp/select2" "~7.1.0" - "@abp/sweetalert2" "~7.1.0" - "@abp/timeago" "~7.1.0" - "@abp/toastr" "~7.1.0" - -"@abp/aspnetcore.mvc.ui@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.0.tgz#a10cc69976e294587a5274f11c216e55ebb1feb7" - integrity sha512-TGCmp4rxQiTUPaZYYGvhQSm5vjcZhJUEriuNyGSKWcs8vTC4eV6Eh6JqANU42RNxohWrQczEIWWMrQz5MEfX6g== +"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.1.tgz#9368779919662a804a8119ac6cf9b731fa2a9728" + integrity sha512-xMUBHJv9pLWp3wx3Oc6+F4G8biZ+BgCskYzAgV2lLWFjQAUxe8klbP0dsVr0EZemyMctX6zlHLURRIl+Os8Z2Q== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.1.tgz#48cf683b8a147bc5955de5e812a0dfa3b7184f29" + integrity sha512-caHzC5zOr2vXY2QDRKuFQ4qIWOS/DbsJUO+UhfKSHvP/bAv7Cu10K3gHwrbfuNCChDJ9iLK0+oJYXUtYBXRA3g== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.1.1" + "@abp/bootstrap" "~7.1.1" + "@abp/bootstrap-datepicker" "~7.1.1" + "@abp/bootstrap-daterangepicker" "~7.1.1" + "@abp/datatables.net-bs5" "~7.1.1" + "@abp/font-awesome" "~7.1.1" + "@abp/jquery-form" "~7.1.1" + "@abp/jquery-validation-unobtrusive" "~7.1.1" + "@abp/lodash" "~7.1.1" + "@abp/luxon" "~7.1.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.1.1" + "@abp/moment" "~7.1.1" + "@abp/select2" "~7.1.1" + "@abp/sweetalert2" "~7.1.1" + "@abp/timeago" "~7.1.1" + "@abp/toastr" "~7.1.1" + +"@abp/aspnetcore.mvc.ui@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.1.tgz#f862b77573b5c34d9b938160669400edbf06154d" + integrity sha512-+xafeXzwnFa4Evak9Wq+jrpimWITio4Yv9WeSbKInNakIPO+wJNBClBneca1XQ+LFy4bMRuqgWYJueUct+E3tA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -51,194 +51,194 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.0.tgz#2a5635f35aeb5be636dfdd5a3fe68c083507cb29" - integrity sha512-ZZTsDgrbKyU/mA8ZKKiSTsd9mTHl2n3mDWrDX7rJdZ5zyGzxxk2Dc81kQP5qUdp6OAG6chiLIPLxXntjWVnyvA== +"@abp/bootstrap-datepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.1.tgz#45c9b9086b3a64ce4ba6193320afdf2e81d12136" + integrity sha512-/T2FlMlPV19J70t8yueyxj9k72+4t3b2aVDrNHCf7uPuSqClwVKEylzGr8RFc7VXHZZwwaUrbLhxYkhkCKLuLA== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.0.tgz#1bf9a27976036c8e658d104a964742410aaca691" - integrity sha512-dhOf3aU82RDYcQc+HOObqd960SmHZTDPhS+6D9QkJ9a3PocyoBzLEi/lcgjfQytMzwsebxY8vk+S2WTUucoRuQ== +"@abp/bootstrap-daterangepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.1.tgz#19349099f6c007feef1ebe73c9c1059f8d271bc1" + integrity sha512-pCTiPRNW4gnzo0rWKbu2A52dRUeXRI3MqJW7h46yNk4n1ZrnsmwH6/b/ebp89YlbNXWaatDrEpk3NbqxSDDAdQ== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.0.tgz#52063d1f577d01d17f3b67e9bdc1ea811242b41e" - integrity sha512-S8Vnpj+cUO58C79aPum9eKlj13nY/T36ReUBPwT3CPrzStM9ab5BlNwHXR3Piyx/73i/r4Utehg18hs2fVi5Jw== +"@abp/bootstrap@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.1.tgz#1481b984a7f31f92f262d6957340fcaa87eb8ece" + integrity sha512-qFNLuBExQeVDOlFKP/STa3r+8CHhPUfsOFnPaknkS2QLewmtAZw3BJFEgvpJQkSvQdaBXW+EjutaJiFGdDrkEQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" bootstrap "^5.1.3" -"@abp/clipboard@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.1.0.tgz#21531f61322fc64114350972c9cedaa54f7114ae" - integrity sha512-1woUBwgtvsThNmEzYyIb46O13jchetY/HkYaOpwbLW6A13Qrsa0lHbABUDLpLp685T/1M/9lweOhWvNxRw2Ozw== +"@abp/clipboard@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.1.1.tgz#06985266e399a03f819585ec9b9ae17ffcbfef0b" + integrity sha512-IxlQJgNlhp6hMVAkPqRgzmB0a5bKdrZ0whVlaxNKR42geetutV+5KPo/koCmliksHLAFTfiAedQXOXsJ90p2AQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" clipboard "^2.0.8" -"@abp/core@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.0.tgz#cffbe4a166073b394850ffd9739b0a089149a3fb" - integrity sha512-+DLBAtXo5BRYwcQH3yFzya0EZj8wd0/BE2QmXTVJ+nxQly+cp7ZV98oRIzI7ArIIV52Th4CXHwZv0l0U0Rdisg== +"@abp/core@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.1.tgz#de4d666d26fba4ab5f7b3e6fff38f2f5f034d121" + integrity sha512-d/vHAAU60v6gdH3+VpchXDD1l5yXNmKsb3i92gvG9M0orjgVy3dJmb6zBVw50nnZxNSfq3Z0S1TC/QdA2C1rQg== dependencies: - "@abp/utils" "~7.1.0" + "@abp/utils" "~7.1.1" -"@abp/datatables.net-bs5@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.0.tgz#3c2289290c3667cad69604d6184fb9b77263f137" - integrity sha512-1LqROrLgFOiUN3E28s5qEu82Zdy4kLGJ6a7f1J6OAvqGXF62DRbKhoS8Rsd5DOV+JHCRnAx8PnTBhlUbl2zmoQ== +"@abp/datatables.net-bs5@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.1.tgz#b7058a0cad4119cc7391493a7d148250efc41b72" + integrity sha512-uPqHzfE9dH5nEuocvIduQYcjEa4MwBXMjtnY5tHM+PK2yB8DsDOrXVopOX0YPTgFk49pLvOVbgxsftuyPb3xKQ== dependencies: - "@abp/datatables.net" "~7.1.0" + "@abp/datatables.net" "~7.1.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.0.tgz#e26dd279276dd38dff485c68bb92b77a4737b625" - integrity sha512-vwihQI6Sxp9gktMSSQ99HwS8oHoYZh1zmZWEnVNAvMnTlxMhqwHEIK2y0XkT/jI3z5NGntz75qFSoqHGFLRAbw== +"@abp/datatables.net@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.1.tgz#a84975c8ab0d7406e524d2eae41f7a04bc00f13c" + integrity sha512-eKIxvap/bKc1G7Dev+t9V8HvHWQYza0Y4RdYmC0bPOyRthlTW9AH8jyKK5HtJlpNpj9rjB2jy3/I9D1uzD67QQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" datatables.net "^1.11.4" -"@abp/docs@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-7.1.0.tgz#6a1c339feb263902572a473aee1531300b3174f1" - integrity sha512-nOj9wN8Rpe91cKYdOvi4hdsmkhXiWbN1mbrCVoBEI1afDopqvctoqezpF0be4B2/rFw0pxx/8kbn8ta2AOORiw== +"@abp/docs@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/docs/-/docs-7.1.1.tgz#1b36128d2034c616d55d48b0f3088f2207a3c1ba" + integrity sha512-43kie3W1nAdsgi624+CQ/cpsizgsSkw0ev2HH0OMoWWszuEar6SdDX8jdLqdUrraNycXFAtbybYmpHgmX0TLqg== dependencies: - "@abp/anchor-js" "~7.1.0" - "@abp/clipboard" "~7.1.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.1.0" - "@abp/popper.js" "~7.1.0" - "@abp/prismjs" "~7.1.0" + "@abp/anchor-js" "~7.1.1" + "@abp/clipboard" "~7.1.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.1.1" + "@abp/popper.js" "~7.1.1" + "@abp/prismjs" "~7.1.1" -"@abp/font-awesome@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.0.tgz#65d9919c3d511197e4518ce25164f767c4776a5a" - integrity sha512-1u0zBE26iNv3YjQ1gTv8rozt6jSXDD0OISMXRT90BAGpOrEHoUB9VaRx4q7AXIrPye95RhfpccGbWE31vPEguw== +"@abp/font-awesome@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.1.tgz#da4a0be295b0acf9b62d8299d1c567ae192a320f" + integrity sha512-AVjbSFXj5IzzQwqwP/fgsuRG1NzV6/KGn5owsfn6HeKSOBjqW4h4EGyunMNoAOW4fsdFxvE4zjBpsG1/E9tuQg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.0.tgz#e1d29ea105a3c4664057fea6c03999ff9529ee59" - integrity sha512-GuJC3TTclKk47mMjtasZBkKF1KqZcvUCXTkTM165U3hN80Bn5GjbS48oXz/iHI70lWNDsycVRrrrc8guwksvzg== +"@abp/jquery-form@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.1.tgz#03c17ccb19820e0a56be58275e2ebba7e7ebaa5f" + integrity sha512-UurenNEYZRN192B70R3DR1NsFUae45h/2huAQD07OM0fyJyM6ji5N7q/Q2Aao0jqBLwRNPrEinUcP8BmJxe2Tw== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.0.tgz#0eb2364582337d530aa6f24fcbaaefa40fda6f7a" - integrity sha512-JiZvmSBt/Q8kZ15wazRDf738UjY1ZCpNm0fE47mpokE9T1YiD8DVDnv4qFDa7ActB5PsfwD1vRANNrmfUsSJcw== +"@abp/jquery-validation-unobtrusive@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.1.tgz#255146ccc553bb9f9197ccf87fa71d930698cf65" + integrity sha512-oUYvNmiGxeyJeGoG3EWAzy2Ld9EKgyK6U28gKaAMrXFlYbiEMnX5+8v1Tdb3sQuOJ68bdiyYjO3Ke9NLsTZHFg== dependencies: - "@abp/jquery-validation" "~7.1.0" + "@abp/jquery-validation" "~7.1.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.0.tgz#2c28095e4fccbaea78dc1f0c5459456380727079" - integrity sha512-rXCrd1ZZ2pse4MgF2fB6e/880UiaHuk+ZXBg/y8Yj2Ab5OVsUuCw9CpsjHOplWC6Rq5A8SjO7BCdI4juxb3xHQ== +"@abp/jquery-validation@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.1.tgz#b3af6606daaa6303c28f6a04aeaa2d6612c5248b" + integrity sha512-ZkDWUbHqF9NkczPdvEZH4gkb6NeXRI5JsROXzmx3K+QIOGUhs//4gOzSYYak0kn0Mljeg8fjJQNa55914d8Xow== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.0.tgz#5c43c7b4fff5f04f7bf9f763e6c2e57f000cbb10" - integrity sha512-JPgrVkRVnxFFm96movaOsfM4NsDghIdfAwo25Qz4t5hAeiAVusTCULML5Ds1IjHHQBjbYV/81Zno3xHzC4eU8A== +"@abp/jquery@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.1.tgz#43adacf3d345576ff7ca42a5a470eb61fb827e23" + integrity sha512-3Epxyyoz1BJge7lbimkg0Ha4DmNlZN5vYFgVKa8SOCoKfoZ7+8gmbXlUEAUe4wnsjP5tQ4/AjoqgzjPL9KQcCg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" jquery "~3.6.0" -"@abp/lodash@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.0.tgz#d187bdac06a1425737837521d09aaf998d49bd08" - integrity sha512-/PmbRfN8ACBey4r8QpwSad38n720yZG5WY/lvddCoBmhJYeUtEr0moFF4g2x0wVm7U1wVXQK6RR9GOr0Q2A7Og== +"@abp/lodash@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.1.tgz#7371484331867775adcb5f4a92d63d4cbed25f19" + integrity sha512-hwNcYcRNZZV5OgH+W775OkpJ5JmrDi+LiVFDAmelWgAXSgqxic8bDla+UUL/pjnkKxwgI4BAlOIctYN/2QM3iA== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" lodash "^4.17.21" -"@abp/luxon@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.0.tgz#e6e119736e0340df162aeaf6546ec322253fee7e" - integrity sha512-UqsJTELF9bxZgE4v9dSfuHvyhinqFPKWZD1ctzTv4At5wie5yrqa+r5y59rPRui3svBxiZXSSZKmDCZnaoFW+w== +"@abp/luxon@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.1.tgz#b0cf4a72ffe66f77d403b896ea5d1ea007ebc9b7" + integrity sha512-2RDIdHrPUDvOoowQlMInfQ0rDZA8IOf2fVs7C2bcZmhjGoK7+vsUJsw/q9awpgeKrHwqJ0o1zsFGfFFKlYMnew== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.0.tgz#f113854212adcddbb142ee54f27e8f3876a22e7c" - integrity sha512-IIbDZ/7fjcnZ05ZHbX6KrlDlkXzZLD8w7teAoMuhBcLZeP3PWythzFYbCc6LwvtgvvkfriyPSth4PCsv2mh/gw== +"@abp/malihu-custom-scrollbar-plugin@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.1.tgz#8a25f3dd78c1f0c395ac255976567d2919d3ec38" + integrity sha512-kfW+B+kFr0Qao17rDginL0ICPwGA3t387hx5LhPIxP2p7aluaA3qyiEbM50Izz+t4mL4JdaBN8DU0kLziqVERw== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.0.tgz#c924fd6278992d8939501903347808a2ded053aa" - integrity sha512-pwbGxx/h0U0NILec6ZscHt6FBOyCUi8TTZzp1B7W9hpC3KSh4qGH1fUM2LI1mXFLl8c/exmVs7aZMN/24KgBag== +"@abp/moment@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.1.tgz#5cf7f815cc4dbe55c9c363d146592683f8a90d62" + integrity sha512-tgg4rTmAGZE+B8OBpeq1ADXJW07EdkCkQUSrLykWMaQr1PZfs9xi0tgsi4CpdITLOK48b9BueRmUdZOgmFXKiQ== dependencies: moment "^2.9.0" -"@abp/popper.js@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-7.1.0.tgz#660d42ad8b3fbb47a87a1f4e0cc406d92e6438ab" - integrity sha512-Zc8RPlTOn4IC6MU/dAcW1EDSkeTZn3plRHsiGad8IRzguVkvCPApg2wO1wJg5Ia1ef4G9ZofhbTLaqV2qxTyNg== +"@abp/popper.js@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/popper.js/-/popper.js-7.1.1.tgz#bbdded3334342aef51483461b72aa8edd12664dc" + integrity sha512-hY+/D0vajNXbSv49YdiXcr1iVTeVOUusB+dpzBgETwRgr0iwe+xF8RDnevLaa99vpjfiLgQnBFhBB5ZqwVit2Q== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" "@popperjs/core" "^2.11.2" -"@abp/prismjs@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.1.0.tgz#e9dc477f5d8728532a7c27e8e1b309a20b1aa32c" - integrity sha512-7pBxUKgqYaEEsuA7AUcdYJh05x2v0NVdkOc5n7KEw/ixqzB6d40SDBKndYg8ns+Zknvh6IK6e2FjOO+y/hWloQ== +"@abp/prismjs@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.1.1.tgz#bfcee96e5a1e2f98fb29006f16aeeb227a4e773d" + integrity sha512-7o7FRzgGNPR9GxQ6CPskWL2N87LykoylKnkCm0Cz0n+x0JSrAEMv2yEiJJT2L1S+51ldCQhBmF2blOjxgUT98A== dependencies: - "@abp/clipboard" "~7.1.0" - "@abp/core" "~7.1.0" + "@abp/clipboard" "~7.1.1" + "@abp/core" "~7.1.1" prismjs "^1.26.0" -"@abp/select2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.0.tgz#30522455c70059251e593cdb0228dbbf831bbb78" - integrity sha512-VPdqxjT8URm1rkwsPvutOgFPs/JTlm8KVcvdV1UsvJMxx5OIKMKcxgsL9UJl033HzVVwp/XBsMQsaNRHnW+hvw== +"@abp/select2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.1.tgz#1afa414ce68c1f35c3e7ab1beee00f924604de51" + integrity sha512-+5MMLQuXlj07VIXhVKEAmeqsfuGXHWwtpDY2LMsT15lNJbrvq0wF9KZJ0eMF8u29Nyk8IuBJf1YRUzx815PiVg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.0.tgz#7cbf9c53ab9e1db2c59d63f392ba9b62624272f6" - integrity sha512-5NL2TijufGF5Jdbed1V+s6+tCa/C/R/ZSfb7CjQnBOCSC0JNhBDHtRabOaouqr2la4xbAEHjIoyXEnWXYAidYw== +"@abp/sweetalert2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.1.tgz#9ba7578ab53af056f26ef34ae0f2fddc28722c12" + integrity sha512-8hjmEqmcRoMN3Cmk7k0lNdtsm8JytrjPzvHahjqKHIcK1Zi0RbjWJpafbvDu5IFlFrRNYHXlqpUw8e3dtCEp3A== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.0.tgz#96909f2d0d27ac977d0caf6a0e2b725681f8124e" - integrity sha512-gWDwvnVSVKPBaOaJCaqhvcqS/GwTQFzNH6dWIH19/g23rF3+s/KwTyoW5AA8uWStBx1PxZaugR0OIK/7hctUog== +"@abp/timeago@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.1.tgz#c7be25a320aa311e2e9c7a8186b51766db4523ac" + integrity sha512-FsIjAiP2dqRHwrrKx/5tWgLMZ2LboNLhrHeRb1FFol/0163uVEQGEJkxLOE5xY530mdaFFfAOc0x6aniSLE4ZQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" timeago "^1.6.7" -"@abp/toastr@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.0.tgz#c11d780c86c16835528f152aac4cbe4aa94bb810" - integrity sha512-awgpA6J65TlMK54Hdq2fyDsZ6nvD69RKfAUaGzpz685tNbvaqQfXxSlBQVEad8QZlMGFeCOAmH9GYkBHNaP/zg== +"@abp/toastr@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.1.tgz#5ef7da983a226f226d8b9b85f2fa9ff7eeed41aa" + integrity sha512-8x8FQt8BSmgI1b6JXK7N+JJJ0ksBcFSMQol0AbzTOFOBO2T77eXIuiVh8961ynaeIECjGWcazXUMuG09Drq6Ig== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" toastr "^2.1.4" -"@abp/utils@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.0.tgz#fb52fdc21e8d26a32245eefac86c512a9318ee47" - integrity sha512-CorSSUsaVug2qY6f4j2uxtAjdSq1dfdq1QdjdQaoPxoZKU74Yv/Cyh7YZ+WJa3Upmaw4V0+6ELX9RE3OjJIxIQ== +"@abp/utils@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.1.tgz#e11bc878573dd8118e42b3c1582c44d8b5c71d83" + integrity sha512-G4S0ndDUe8W525O8KUBucLcrESoSFjeqLjRZ+W7N7K9D/oLisYU9Siwxb2csTdjXz6JeQ7AtQl7ak1WpAMiJ/g== dependencies: just-compare "^1.3.0" diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ar.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ar.json index ada739b4d7..2af74dd224 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ar.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ar.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "رمز اللغة", "DisplayName:Version": "إصدار", "Documents": "وثائق", - "RemoveFromCache": "حذف من الذاكرة", + "RemoveFromCache": "إزالة من ذاكرة التخزين المؤقت وإعادة الفهرس", "Reindex": "إعادة الفهرسة", "ReindexCompleted": "تمت إعادة الفهرسة", - "RemovedFromCache": "تم الحذف من ذاكرة التخزين", - "RemoveFromCacheConfirmation": "هل أنت متأكد من حذف هذا العنصر من ذاكرة التخزين؟", - "ReIndexDocumentConfirmation": "هل أنت متأكد من إعادة فهرسة هذا العنصر؟", + "RemovedFromCache": "تمت إزالته من ذاكرة التخزين المؤقت وإعادة فهرسته", + "RemoveFromCacheConfirmation": "هل تريد بالتأكيد إعادة فهرسة \"{0} \"؟", + "ReIndexDocumentConfirmation": "هل تريد بالتأكيد إعادة فهرسة \"{0}\"؟", "DeleteFromDatabase": "حذف من قاعدة البيانات", "Deleted": "محذوف", "Search": "بحث", @@ -55,6 +55,7 @@ "LanguageCode": "رمز اللغة", "FileName": "اسم الملف", "LastCachedTime": "وقت ذاكرة التخزين", - "Project": "مشروع " + "Project": "مشروع ", + "RemoveCacheAndReIndexConfirmation": "ستتم إزالة المستند \"{0}\" من ذاكرة التخزين المؤقت وإعادة فهرسته. هل تؤكد؟" } } diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/cs.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/cs.json index c593147804..19fa5c257c 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/cs.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/cs.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Kód jazyka", "DisplayName:Version": "Verze", "Documents": "Dokumenty", - "RemoveFromCache": "Odebrat z mezipaměti", + "RemoveFromCache": "Odstranit z mezipaměti a znovu indexovat", "Reindex": "Reindex", "ReindexCompleted": "Reindex dokončen", - "RemovedFromCache": "Odebráno z mezipaměti", + "RemovedFromCache": "Odstraněno z mezipaměti a znovu zaindexováno", "RemoveFromCacheConfirmation": "Opravdu chcete tuto položku odebrat z mezipaměti?", - "ReIndexDocumentConfirmation": "Opravdu chcete tuto položku reindexovat?", + "ReIndexDocumentConfirmation": "Jste si jisti, že chcete znovu indexovat \"{0}\"?", "DeleteFromDatabase": "Odstranit z databáze", "Deleted": "Vymazáno", "Search": "Vyhledávání", @@ -55,6 +55,7 @@ "LanguageCode": "Kód jazyka", "FileName": "Název souboru", "LastCachedTime": "Čas uložení v mezipaměti", - "Project": "Projekt" + "Project": "Projekt", + "RemoveCacheAndReIndexConfirmation": "Dokument \"{0}\" bude odstraněn z mezipaměti a znovu zaindexován. Potvrzujete to?" } } diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de-DE.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de-DE.json index 4d92840132..ce7c8cafb0 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de-DE.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/de-DE.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Sprachcode", "DisplayName:Version": "Version", "Documents": "Dokumente", - "RemoveFromCache": "Aus dem Cache entfernen", + "RemoveFromCache": "Aus dem Cache entfernen und neu indizieren", "Reindex": "Neuindizierung", "ReindexCompleted": "Neuindizierung abgeschlossen", - "RemovedFromCache": "Aus dem Cache entfernt", + "RemovedFromCache": "Aus dem Cache entfernt und neu indiziert", "RemoveFromCacheConfirmation": "Möchten Sie dieses Element wirklich aus dem Cache entfernen?", - "ReIndexDocumentConfirmation": "Möchten Sie diesen Beitrag wirklich neu indizieren?", + "ReIndexDocumentConfirmation": "Sind Sie sicher, dass Sie \"{0}\" neu indizieren wollen?", "DeleteFromDatabase": "Aus Datenbank löschen", "Deleted": "Gelöscht", "Search": "Suchen", @@ -55,6 +55,7 @@ "LanguageCode": "Sprachcode", "FileName": "Dateiname", "LastCachedTime": "Cache-Zeit", - "Project": "Projekt" + "Project": "Projekt", + "RemoveCacheAndReIndexConfirmation": "Das Dokument \"{0}\" wird aus dem Cache entfernt und neu indiziert. Können Sie das bestätigen?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/el.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/el.json index bacdfd56de..c2a3f69a53 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/el.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/el.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Κωδικός γλώσσας", "DisplayName:Version": "Εκδοχή", "Documents": "Εγγραφα", - "RemoveFromCache": "Αφαίρεση από την προσωρινή μνήμη", + "RemoveFromCache": "Αφαίρεση από τη μνήμη cache και εκ νέου ευρετηρίαση", "Reindex": "Επανακαταγραφή", "ReindexCompleted": "Ολοκληρώθηκε η επανακαταγραφή", - "RemovedFromCache": "Καταργήθηκε από την προσωρινή μνήμη", + "RemovedFromCache": "πομακρύνεται από τη μνήμη cache και αναπροσαρμόζεται", "RemoveFromCacheConfirmation": "Είστε βέβαιοι ότι θέλετε να αφαιρέσετε αυτό το στοιχείο από την προσωρινή μνήμη;", - "ReIndexDocumentConfirmation": "Είστε βέβαιοι ότι θέλετε να αναπροσαρμόσετε αυτό το στοιχείο;", + "ReIndexDocumentConfirmation": "Είστε σίγουροι ότι θέλετε να ξαναδείξετε το \"{0}\";", "DeleteFromDatabase": "Διαγραφή από τη βάση δεδομένων", "Deleted": "Διαγραφή", "Search": "Αναζήτηση", @@ -55,6 +55,7 @@ "LanguageCode": "Κωδικός γλώσσας", "FileName": "Όνομα αρχείου", "LastCachedTime": "Χρόνος προσωρινής αποθήκευσης", - "Project": "Εργο" + "Project": "Εργο", + "RemoveCacheAndReIndexConfirmation": "Το έγγραφο \"{0}\" θα αφαιρεθεί από την προσωρινή μνήμη και θα αναπροσαρμοστεί εκ νέου. Επιβεβαιώνετε;" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en.json index 86142ceb44..5302cdcffb 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/en.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Language code", "DisplayName:Version": "Version", "Documents": "Documents", - "RemoveFromCache": "Remove from cache", + "RemoveFromCache": "Remove from cache and re-index", "Reindex": "Reindex", "ReindexCompleted": "Reindex completed", - "RemovedFromCache": "Removed from cache", + "RemovedFromCache": "Removed from cache and re-indexed", "RemoveFromCacheConfirmation": "Are you sure you want to remove this item from cache?", - "ReIndexDocumentConfirmation": "Are you sure you want to reindex this item?", + "ReIndexDocumentConfirmation": "Are you sure you want to re-index \"{0}\"?", "DeleteFromDatabase": "Delete from database", "Deleted": "Deleted", "Search": "Search", @@ -56,6 +56,7 @@ "FileName": "File name", "LastCachedTime": "Cache time", "Project": "Project", - "AdvancedFilters": "Advanced Filters" + "AdvancedFilters": "Advanced Filters", + "RemoveCacheAndReIndexConfirmation": "The document \"{0}\" will be removed from the cache and re-indexed. Do you confirm?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/es.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/es.json index 9858f9d94a..800f3efc13 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/es.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/es.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Código de idioma", "DisplayName:Version": "Versión", "Documents": "Documentos", - "RemoveFromCache": "Borrado de caché", + "RemoveFromCache": "Eliminar de la caché y volver a indexar", "Reindex": "Reindexado", "ReindexCompleted": "Reindexado completado", - "RemovedFromCache": "Borrar la caché", + "RemovedFromCache": "Eliminado de la caché y reIndexado", "RemoveFromCacheConfirmation": "¿Estás seguro que quieres borrar este elemento de la caché?", - "ReIndexDocumentConfirmation": "¿Estás seguro que quieres reindexar este elemento?", + "ReIndexDocumentConfirmation": "¿Estás seguro de que quieres reindexar \"{0}\"?", "DeleteFromDatabase": "Eliminado de la base de datos", "Deleted": "Eliminado", "Search": "Buscar", @@ -55,6 +55,7 @@ "LanguageCode": "Código de idioma", "FileName": "Nombre de fichero", "LastCachedTime": "Última actualización de caché", - "Project": "Proyecto" + "Project": "Proyecto", + "RemoveCacheAndReIndexConfirmation": "El documento \"{0}\" será eliminado de la caché y reindexado. ¿Lo confirma?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fi.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fi.json index 71af6c0402..e3e826c1b7 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fi.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fi.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Kielikoodi", "DisplayName:Version": "Versio", "Documents": "Asiakirjat", - "RemoveFromCache": "Poista välimuistista", + "RemoveFromCache": "Poista välimuistista ja indeksoi uudelleen", "Reindex": "Uudelleen indeksoi", "ReindexCompleted": "Uudelleen indeksointi valmis", - "RemovedFromCache": "Poistettu välimuistista", + "RemovedFromCache": "Poistettu välimuistista ja indeksoitu uudelleen.", "RemoveFromCacheConfirmation": "Haluatko varmasti poistaa tämän kohteen välimuistista?", - "ReIndexDocumentConfirmation": "Haluatko varmasti indeksoida tämän kohteen uudelleen?", + "ReIndexDocumentConfirmation": "Oletko varma, että haluat indeksoida \"{0}\" uudelleen?", "DeleteFromDatabase": "Poista tietokannasta", "Deleted": "Poistettu", "Search": "Hae", @@ -56,6 +56,7 @@ "FileName": "Tiedoston nimi", "LastCachedTime": "Välimuistin aika", "Project": "Projekti", - "AdvancedFilters": "Edistyneet suodattimet" + "AdvancedFilters": "Edistyneet suodattimet", + "RemoveCacheAndReIndexConfirmation": "Dokumentti \"{0}\" poistetaan välimuistista ja indeksoidaan uudelleen. Vahvistatko?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fr.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fr.json index 7a6d6a89cf..158e544742 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fr.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/fr.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Code de langue", "DisplayName:Version": "Version", "Documents": "Documents", - "RemoveFromCache": "Retirer du cache", + "RemoveFromCache": "Remove from cache and ReIndex", "Reindex": "Réindexer", "ReindexCompleted": "Réindexation terminée", - "RemovedFromCache": "Supprimé du cache", + "RemovedFromCache": "Retiré du cache et ré-indexé", "RemoveFromCacheConfirmation": "Voulez-vous vraiment supprimer cet élément du cache?", - "ReIndexDocumentConfirmation": "Voulez-vous vraiment réindexer cet élément?", + "ReIndexDocumentConfirmation": "Êtes-vous sûr de vouloir réindexer \"{0}\" ?", "DeleteFromDatabase": "Supprimer de la base de données", "Deleted": "Supprimé", "Search": "Rechercher", @@ -55,6 +55,7 @@ "LanguageCode": "Code de langue", "FileName": "Nom de fichier", "LastCachedTime": "Temps de cache", - "Project": "Projet" + "Project": "Projet", + "RemoveCacheAndReIndexConfirmation": "Le document \"{0}\" sera supprimé du cache et réindexé. Confirmez-vous ?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hi.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hi.json index a7d357e83e..d45d10992d 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hi.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hi.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "भाषा कोड", "DisplayName:Version": "संस्करण", "Documents": "दस्तावेज़", - "RemoveFromCache": "कैश से निकालें", + "RemoveFromCache": "कैश और रीइंडेक्स से निकालें", "Reindex": "अनुक्रमणः", "ReindexCompleted": "रेनडेक्स पूरा किया", - "RemovedFromCache": "कैश से निकाला गया", + "RemovedFromCache": "संचय से निकाला गया और पुनः अनुक्रमित किया गया", "RemoveFromCacheConfirmation": "क्या आप वाकई इस आइटम को कैश से निकालना चाहते हैं?", - "ReIndexDocumentConfirmation": "क्या आप वाकई इस आइटम को फिर से दिखाना चाहते हैं?", + "ReIndexDocumentConfirmation": "क्या आप वाकई \"{0}\" को फिर से अनुक्रमित करना चाहते हैं?", "DeleteFromDatabase": "डेटाबेस से हटाएं", "Deleted": "हटाए गए", "Search": "खोज", @@ -55,6 +55,7 @@ "LanguageCode": "भाषा कोड", "FileName": "फ़ाइल का नाम", "LastCachedTime": "कैश समय", - "Project": "परियोजना" + "Project": "परियोजना", + "RemoveCacheAndReIndexConfirmation": "दस्u200Dतावेज़ \"{0}\" को संचय से हटा दिया जाएगा और पुन: अनुक्रमित किया जाएगा। क्या आप पुष्टि करते हैं?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hr.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hr.json index 2469d21c4b..cf0a31368f 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hr.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hr.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Jezični kod", "DisplayName:Version": "Verzija", "Documents": "Dokumenti", - "RemoveFromCache": "Ukloni iz predmemorije", + "RemoveFromCache": "Ukloni iz predmemorije i ponovno indeksiraj", "Reindex": "Ponovno indeksiranje", "ReindexCompleted": "Ponovno indeksiranje dovršeno", - "RemovedFromCache": "Uklonjeno iz predmemorije", + "RemovedFromCache": "Uklonjeno iz predmemorije i ponovno indeksirano", "RemoveFromCacheConfirmation": "Jeste li sigurni da želite ukloniti ovu stavku iz predmemorije?", - "ReIndexDocumentConfirmation": "Jeste li sigurni da želite ponovno indeksirati ovu stavku?", + "ReIndexDocumentConfirmation": "Jeste li sigurni da želite ponovno indeksirati \"{0}\"?", "DeleteFromDatabase": "Izbriši iz baze podataka", "Deleted": "Izbrisano", "Search": "Pretraga", @@ -56,6 +56,7 @@ "FileName": "Naziv datoteke", "LastCachedTime": "Vrijeme predmemorije", "Project": "Projekt", - "AdvancedFilters": "Napredni filtri" + "AdvancedFilters": "Napredni filtri", + "RemoveCacheAndReIndexConfirmation": "Dokument \"{0}\" bit će uklonjen iz predmemorije i ponovno indeksiran. Potvrđujete li?" } } diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hu.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hu.json index fce9150db3..587f67e72c 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hu.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/hu.json @@ -38,12 +38,12 @@ "DisplayName:Version": "Verzió", "DisplayName:Role": "Szerepkör", "Documents": "Dokumentumok", - "RemoveFromCache": "Távolítsa el a gyorsítótárból", + "RemoveFromCache": "Eltávolítás a gyorsítótárból és újraindexelés", "Reindex": "Újraindexálás", "ReindexCompleted": "Újraindexálás teljes.", - "RemovedFromCache": "Távolítsa el a gyorsítótárból", + "RemovedFromCache": "Eltávolítva a gyorsítótárból és újraindexelve", "RemoveFromCacheConfirmation": "Biztosan eltávolítja ezt az elemet a gyorsítótárból?", - "ReIndexDocumentConfirmation": "Biztosan újraindexeli ezt az elemet?", + "ReIndexDocumentConfirmation": "Biztos, hogy újra akarja indexelni a \"{0}\"-t?", "DeleteFromDatabase": "Törlés az adatbázisból", "Deleted": "Törölt", "Search": "Keresés", @@ -57,6 +57,7 @@ "FileName": "Filenév", "LastCachedTime": "Cache idő", "Project": "Projekt", - "AdvancedFilters": "Speciális szűrők" + "AdvancedFilters": "Speciális szűrők", + "RemoveCacheAndReIndexConfirmation": "A \"{0}\" dokumentumot eltávolítjuk a gyorsítótárból és újraindexeljük. Megerősíti?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/is.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/is.json index c7d13791d0..ada8ff0e0c 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/is.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/is.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Túngumála kóði", "DisplayName:Version": "Útgáfa", "Documents": "Skjöl", - "RemoveFromCache": "Fjarlægja úr skyndiminni", + "RemoveFromCache": "Fjarlægðu úr skyndiminni og ReIndex", "Reindex": "Endurindexa", "ReindexCompleted": "Endurindexum lokið", - "RemovedFromCache": "Fjarlægja úr skyndiminni", + "RemovedFromCache": "Fjarlægt úr skyndiminni og endurtryggt", "RemoveFromCacheConfirmation": "Ertu viss um að þú viljir fjarlægja þetta atriði úr skyndiminni?", - "ReIndexDocumentConfirmation": "Ertu viss um að þú viljir endurindexa þennan hlut?", + "ReIndexDocumentConfirmation": "Ertu viss um að þú viljir endurskrá \"{0}\"?", "DeleteFromDatabase": "Eyða úr gagnagrunni", "Deleted": "Eyða", "Search": "Leita", @@ -55,6 +55,7 @@ "LanguageCode": "Túngumála kóði", "FileName": "Skráar nafn", "LastCachedTime": "Tími geymt í skyndiminni", - "Project": "Verkefni" + "Project": "Verkefni", + "RemoveCacheAndReIndexConfirmation": "Skjalið \"{0}\" verður fjarlægt úr skyndiminni og endurtryggt. Staðfestir þú?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/it.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/it.json index b6c95e5b58..28c66074e3 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/it.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/it.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Codice della lingua", "DisplayName:Version": "Versione", "Documents": "Documenti", - "RemoveFromCache": "Rimuovi dalla cache", + "RemoveFromCache": "Rimuovere dalla cache e reindicizzare", "Reindex": "Reindicizza", "ReindexCompleted": "Reindicizzazione completata", - "RemovedFromCache": "Rimosso dalla cache", + "RemovedFromCache": "Rimosso dalla cache e reindicizzato", "RemoveFromCacheConfirmation": "Sei sicuro di voler rimuovere questo elemento dalla cache?", - "ReIndexDocumentConfirmation": "Sei sicuro di voler reindicizzare questo articolo?", + "ReIndexDocumentConfirmation": "Siete sicuri di voler reindicizzare \"{0}\"?", "DeleteFromDatabase": "Elimina dal database", "Deleted": "Eliminato", "Search": "Ricerca", @@ -55,6 +55,7 @@ "LanguageCode": "Codice della lingua", "FileName": "Nome del file", "LastCachedTime": "Tempo di cache", - "Project": "Progetto" + "Project": "Progetto", + "RemoveCacheAndReIndexConfirmation": "Il documento \"{0}\" verrà rimosso dalla cache e reindicizzato. Confermate?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/nl.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/nl.json index e8cd5d730a..734000cc01 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/nl.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/nl.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Taalcode", "DisplayName:Version": "Versie", "Documents": "Documenten", - "RemoveFromCache": "Verwijderen uit cache", + "RemoveFromCache": "Verwijderen uit cache en opnieuw indexeren", "Reindex": "Opnieuw indexeren", "ReindexCompleted": "Opnieuw indexeren voltooid", - "RemovedFromCache": "Verwijderen uit cache", + "RemovedFromCache": "Verwijderd uit cache en opnieuw geïndexeerd", "RemoveFromCacheConfirmation": "Weet u zeker dat u dit item uit de cache wilt verwijderen?", - "ReIndexDocumentConfirmation": "Weet u zeker dat u dit item opnieuw wilt indexeren?", + "ReIndexDocumentConfirmation": "Weet u zeker dat u \"{0}\" opnieuw wilt indexeren?", "DeleteFromDatabase": "Verwijder uit database", "Deleted": "Verwijderd", "Search": "Zoeken", @@ -55,6 +55,7 @@ "LanguageCode": "Taalcode", "FileName": "Bestandsnaam", "LastCachedTime": "Cache tijd", - "Project": "Project" + "Project": "Project", + "RemoveCacheAndReIndexConfirmation": "Het document \"{0}\" wordt uit de cache verwijderd en opnieuw geïndexeerd. Bevestigt u?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pl-PL.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pl-PL.json index 5f1025a9a6..06ee3410e3 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pl-PL.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pl-PL.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Kod języka", "DisplayName:Version": "Wersja", "Documents": "Dokumenty", - "RemoveFromCache": "Usuń z pamięci podręcznej", + "RemoveFromCache": "Usunięcie z pamięci podręcznej i ponowne indeksowanie", "Reindex": "Ponowna indeksacja", "ReindexCompleted": "Ponowna indeksacja zakończona", - "RemovedFromCache": "Usunięto z pamięci podręcznej", + "RemovedFromCache": "Usunięte z pamięci podręcznej i ponownie zindeksowane", "RemoveFromCacheConfirmation": "Czy na pewno chcesz usunąć ten element z pamięci podręcznej?", - "ReIndexDocumentConfirmation": "Czy na pewno chcesz ponownie zindeksować ten element?", + "ReIndexDocumentConfirmation": "Czy na pewno chcesz przeindeksować \"{0}\"?", "DeleteFromDatabase": "Usuń z bazy danych", "Deleted": "Usunięto", "Search": "Szukaj", @@ -55,6 +55,7 @@ "LanguageCode": "Kod języka", "FileName": "Nazwa pliku", "LastCachedTime": "Czas w pamięci podręcznej", - "Project": "Projekt" + "Project": "Projekt", + "RemoveCacheAndReIndexConfirmation": "Dokument \"{0}\" zostanie usunięty z pamięci podręcznej i ponownie zaindeksowany. Czy potwierdzasz?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pt-BR.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pt-BR.json index d926dfada9..b34ab4b9ef 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pt-BR.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/pt-BR.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Código de idioma", "DisplayName:Version": "Versão", "Documents": "Documentos", - "RemoveFromCache": "Remover do cache", + "RemoveFromCache": "Remover do cache e do ReIndex", "Reindex": "Reindexar", "ReindexCompleted": "Reindexação concluída", - "RemovedFromCache": "Removido do cache", + "RemovedFromCache": "Removido do cache e reIndexado", "RemoveFromCacheConfirmation": "Tem certeza de que deseja remover este item do cache?", - "ReIndexDocumentConfirmation": "Tem certeza que deseja reindexar este item?", + "ReIndexDocumentConfirmation": "Você tem certeza de que quer re-indexar \"{0}\"?", "DeleteFromDatabase": "Excluir do banco de dados", "Deleted": "Excluído", "Search": "Procurar", @@ -56,6 +56,7 @@ "FileName": "Nome do arquivo", "LastCachedTime": "Tempo de cache", "Project": "Projeto", - "AdvancedFilters": "Filtros Avançados" + "AdvancedFilters": "Filtros Avançados", + "RemoveCacheAndReIndexConfirmation": "O documento \"{0}\" será removido do cache e indexado novamente. Você confirma?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ro-RO.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ro-RO.json index b236915665..be374b79c9 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ro-RO.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ro-RO.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Codul limbii", "DisplayName:Version": "Versiune", "Documents": "Documente", - "RemoveFromCache": "Şterge din cache", + "RemoveFromCache": "Eliminarea din memoria cache și reintroducerea indexării", "Reindex": "Reindexează", "ReindexCompleted": "Reindexare completă", - "RemovedFromCache": "Şters din cache", + "RemovedFromCache": "Eliminat din memoria cache și reintrodus în index", "RemoveFromCacheConfirmation": "Sunteţi sigur(ă) că vreţi să ştergeţi acest obiect din cache?", - "ReIndexDocumentConfirmation": "Sunteţi sigur(ă) că vreţi să reindexaţi acest obiect?", + "ReIndexDocumentConfirmation": "Sunteți sigur că doriți să re-indexați \"{0}\"?", "DeleteFromDatabase": "Şterge din baza de date", "Deleted": "Şters", "Search": "Caută", @@ -55,6 +55,7 @@ "LanguageCode": "Codul limbii", "FileName": "Nume fişier", "LastCachedTime": "Durată cache", - "Project": "Proiect" + "Project": "Proiect", + "RemoveCacheAndReIndexConfirmation": "Documentul \"{0}\" va fi eliminat din memoria cache și va fi reindexat. Confirmați?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ru.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ru.json index 16102717c2..9a93cc36c8 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ru.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/ru.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Код языка", "DisplayName:Version": "Версия", "Documents": "Документы", - "RemoveFromCache": "Удалить из кеша", + "RemoveFromCache": "Удаление из кэша и повторное индексирование", "Reindex": "Переиндексировать", "ReindexCompleted": "Переиндекс завершен", - "RemovedFromCache": "Удалено из кеша", + "RemovedFromCache": "Удалены из кэша и переиндексированы", "RemoveFromCacheConfirmation": "Вы уверены, что хотите удалить этот элемент из кеша?", - "ReIndexDocumentConfirmation": "Вы уверены, что хотите переиндексировать этот элемент?", + "ReIndexDocumentConfirmation": "Вы уверены, что хотите переиндексировать \"{0}\"?", "DeleteFromDatabase": "Удалить из базы данных", "Deleted": "Удалено", "Search": "Поиск", @@ -55,6 +55,7 @@ "LanguageCode": "Код языка", "FileName": "Имя файла", "LastCachedTime": "Время кеширования", - "Project": "Проект" + "Project": "Проект", + "RemoveCacheAndReIndexConfirmation": "Документ \"{0}\" будет удален из кэша и переиндексирован. Вы подтверждаете?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sk.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sk.json index 8041e796f0..a29d85987e 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sk.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/sk.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Kód jazyka", "DisplayName:Version": "Verzia", "Documents": "Dokumenty", - "RemoveFromCache": "Odstrániť z vyrovnávacej pamäte", + "RemoveFromCache": "Odstránenie z vyrovnávacej pamäte a opätovné indexovanie", "Reindex": "Reindexovať", "ReindexCompleted": "Reindexácia dokončená", - "RemovedFromCache": "Odstránené z vyrovnávacej pamäte", + "RemovedFromCache": "Odstránené z vyrovnávacej pamäte a znovu zaindexované", "RemoveFromCacheConfirmation": "Ste si istý, že chcete túto položku odstrániť z vyrovnávacej pamäte?", - "ReIndexDocumentConfirmation": "Ste si istý, že chcete túto položku reindexovať?", + "ReIndexDocumentConfirmation": "Ste si istí, že chcete znovu indexovať \"{0}\"?", "DeleteFromDatabase": "Zmazať z databázy", "Deleted": "Zmazané", "Search": "Hľadať", @@ -55,6 +55,7 @@ "LanguageCode": "Kód jazyka", "FileName": "Názov súboru", "LastCachedTime": "Čas vyrovnávacej pamäte", - "Project": "Projekt" + "Project": "Projekt", + "RemoveCacheAndReIndexConfirmation": "Dokument \"{0}\" sa odstráni z vyrovnávacej pamäte a znovu sa zaindexuje. Potvrdzujete?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/tr.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/tr.json index dade32b970..ab600c1db5 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/tr.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/tr.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Dil kodu", "DisplayName:Version": "versiyon", "Documents": "Dokümanlar", - "RemoveFromCache": "Önbellekten kaldır", + "RemoveFromCache": "Önbellekten kaldır ve yeniden indeksle", "Reindex": "Yeniden İndeksle", "ReindexCompleted": "Yeniden indeksleme tamamlandı", - "RemovedFromCache": "Önbellekten kaldırıldı", + "RemovedFromCache": "Önbellekten kaldırıldı ve yeniden indekslendi", "RemoveFromCacheConfirmation": "Bu maddeyi önbellekten kaldırmak istediğiniz emin misiniz?", - "ReIndexDocumentConfirmation": "Bu maddeyi yeniden indekslemek istediğinize emin misiniz?", + "ReIndexDocumentConfirmation": "\"{0}\" öğesini yeniden indekslemek istediğinizden emin misiniz?", "DeleteFromDatabase": "Veritabanından sil", "Deleted": "Silindi", "Search": "Arama", @@ -56,6 +56,7 @@ "FileName": "Dosya adı", "LastCachedTime": "Önbellek süresi", "Project": "Proje", - "AdvancedFilters": "Gelişmiş Filtre" + "AdvancedFilters": "Gelişmiş Filtre", + "RemoveCacheAndReIndexConfirmation": "\"{0}\" belgesi önbellekten kaldırılacak ve yeniden indekslenecektir. Onaylıyor musunuz?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/vi.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/vi.json index c44d2feb8f..df729a70e9 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/vi.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/vi.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "Mật ngữ", "DisplayName:Version": "Phiên bản", "Documents": "Các tài liệu", - "RemoveFromCache": "Xóa khỏi bộ nhớ cache", + "RemoveFromCache": "Xóa khỏi bộ đệm và lập chỉ mục lại", "Reindex": "Reindex", "ReindexCompleted": "Reindex đã hoàn thành", - "RemovedFromCache": "Đã xóa khỏi bộ nhớ cache", + "RemovedFromCache": "Đã xóa khỏi bộ đệm và lập chỉ mục lại", "RemoveFromCacheConfirmation": "Bạn có chắc chắn muốn xóa mục này khỏi bộ nhớ cache không?", - "ReIndexDocumentConfirmation": "Bạn có chắc chắn muốn lập chỉ mục lại mục này không?", + "ReIndexDocumentConfirmation": "Bạn có chắc chắn muốn lập chỉ mục lại \"{0}\" không?", "DeleteFromDatabase": "Xóa khỏi cơ sở dữ liệu", "Deleted": "Đã xóa", "Search": "Tìm kiếm", diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json index f81333d38e..da611a35c7 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hans.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "语言代码", "DisplayName:Version": "版本", "Documents": "文档", - "RemoveFromCache": "从缓存中删除", + "RemoveFromCache": "从缓存中清除并重新索引", "Reindex": "重新索引", "ReindexCompleted": "重新索引完成", - "RemovedFromCache": "已从缓存中删除", + "RemovedFromCache": "从缓存中删除并重新索引", "RemoveFromCacheConfirmation": "你确定要从缓存中删除该项吗?", - "ReIndexDocumentConfirmation": "你确定要为该项重新索引吗", + "ReIndexDocumentConfirmation": "您确定要重新索引“{0}”吗?", "DeleteFromDatabase": "从数据库中删除", "Deleted": "删除", "Search": "搜索", @@ -55,6 +55,7 @@ "LanguageCode": "语言代码", "FileName": "文件名称", "LastCachedTime": "缓存项", - "Project": "项目" + "Project": "项目", + "RemoveCacheAndReIndexConfirmation": "文档“{0}”将从缓存中删除并重新编制索引。 你确认吗?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json index 54d86eca33..d79055d067 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts/zh-Hant.json @@ -37,12 +37,12 @@ "DisplayName:LanguageCode": "語言代碼", "DisplayName:Version": "版本", "Documents": "文件", - "RemoveFromCache": "從緩存中移除", + "RemoveFromCache": "從緩存中刪除並重新索引", "Reindex": "重新索引", "ReindexCompleted": "重新索引完成", - "RemovedFromCache": "從緩存中刪除", + "RemovedFromCache": "從緩存中刪除並重新編入索引", "RemoveFromCacheConfirmation": "您確定要從緩存中刪除此項嗎?", - "ReIndexDocumentConfirmation": "您確定要重新索引此項目嗎?", + "ReIndexDocumentConfirmation": "您確定要重新索引“{0}”嗎?", "DeleteFromDatabase": "從數據庫中刪除", "Deleted": "已刪除", "Search": "搜索", @@ -55,6 +55,7 @@ "LanguageCode": "語言代碼", "FileName": "文檔名稱", "LastCachedTime": "緩存時間", - "Project": "项目" + "Project": "项目", + "RemoveCacheAndReIndexConfirmation": "文檔“{0}”將從緩存中刪除並重新編制索引。 你確認嗎?" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js index 18390a251a..e70086b133 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Documents/index.js @@ -173,6 +173,10 @@ $(function () { visible: abp.auth.isGranted( 'Docs.Admin.Documents' ), + confirmMessage: function (data) { + return l('RemoveCacheAndReIndexConfirmation', + data.record.name); + }, action: function (data) { service .removeFromCache(data.record.id) @@ -188,7 +192,8 @@ $(function () { 'Docs.Admin.Documents' ), confirmMessage: function (data) { - return l('ReIndexDocumentConfirmation'); + return l('ReIndexDocumentConfirmation', + data.record.name); }, action: function (data) { service diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.css b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.css index 454e6eb742..cd0ee8e064 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.css +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.css @@ -2,3 +2,7 @@ margin-top: 1.5em !important; background: rgba(233, 237, 241, 0.34) !important; padding: 1px !important; } + +.input-group .input-group-text{ + background-color: transparent!important; +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.min.css b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.min.css index 86f286308a..3f6ed60f02 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.min.css +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.min.css @@ -1 +1 @@ -.code-toolbar .line-highlight{margin-top:1.5em !important;background:rgba(233,237,241,.34) !important;padding:1px !important;} \ No newline at end of file +.code-toolbar .line-highlight{margin-top:1.5em !important;background:rgba(233,237,241,.34) !important;padding:1px !important;} .input-group .input-group-text{background-color: transparent!important;} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.scss b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.scss index 485c6cd881..384d025602 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.scss +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.scss @@ -5,3 +5,9 @@ padding: 1px !important; } } + +.input-group{ + .input-group-text{ + background-color: transparent!important; + } +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityErrorCodes.cs b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityErrorCodes.cs index ff808d9fbb..4e681c3ea1 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityErrorCodes.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/IdentityErrorCodes.cs @@ -10,4 +10,5 @@ public static class IdentityErrorCodes public const string StaticRoleDeletion = "Volo.Abp.Identity:010006"; public const string UsersCanNotChangeTwoFactor = "Volo.Abp.Identity:010007"; public const string CanNotChangeTwoFactor = "Volo.Abp.Identity:010008"; + public const string YouCannotDelegateYourself = "Volo.Abp.Identity:010009"; } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json index 523e5c91a1..490bd611df 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ar.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "لا يمكن حذف الأدوار الثابتة.", "Volo.Abp.Identity:010007": "لا يمكنك تغيير إعداد العاملين.", "Volo.Abp.Identity:010008": "لا يجوز تغيير إعداد عاملين.", + "Volo.Abp.Identity:010009": "لا يمكنك تفويض نفسك.", "Identity.OrganizationUnit.MaxUserMembershipCount": "العدد الأقصى المسموح به لعضوية الوحدة التنظيمية للمستخدم", "ThisUserIsNotActiveMessage": "هذا المستخدم غير نشط.", "Permission:IdentityManagement": "إدارة الهوية", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json index 43e0bb43dd..7f2ddde421 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/cs.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Statické role nemohou být smazány.", "Volo.Abp.Identity:010007": "Nastavení dvou faktorů nemůžete změnit.", "Volo.Abp.Identity:010008": "Není povoleno měnit nastavení dvou faktorů.", + "Volo.Abp.Identity:010009": "Nemůžete delegovat své vlastní oprávnění.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maximální povolený počet členů organizační jednotky pro uživatele", "ThisUserIsNotActiveMessage": "Tento uživatel není aktivní.", "Permission:IdentityManagement": "Správa identit", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json index 3e3dba7263..69f2e9e9b2 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/de.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Statische Rollen können nicht gelöscht werden.", "Volo.Abp.Identity:010007": "Sie können Ihre Zwei-Faktor-Einstellung nicht ändern.", "Volo.Abp.Identity:010008": "Die Zwei-Faktor-Einstellung dürfen nicht geändert werden.", + "Volo.Abp.Identity:010009": "Sie können sich nicht selbst delegieren.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maximal zulässige Anzahl an Mitgliedschaften in Organisationseinheiten für einen Benutzer", "ThisUserIsNotActiveMessage": "Dieser Benutzer ist nicht aktiv.", "Permission:IdentityManagement": "Identitätsverwaltung", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json index 409f2710a6..765d85ce09 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/el.json @@ -70,6 +70,7 @@ "Volo.Abp.Identity:010006": "Οι στατικοί ρόλοι δεν μπορούν να διαγραφούν.", "Volo.Abp.Identity:010007": "Δεν μπορείτε να αλλάξετε τη ρύθμιση δύο παραγόντων.", "Volo.Abp.Identity:010008": "Δεν επιτρέπεται η αλλαγή της ρύθμισης δύο παραγόντων.", + "Volo.Abp.Identity:010009": "Δεν μπορείτε να αναθέσετε την εξουσιοδότησή σας σε εσάς ίδιο.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Μέγιστος επιτρεπόμενος αριθμός μελών μονάδας οργανισμού για έναν χρήστη", "ThisUserIsNotActiveMessage": "Αυτός ο χρήστης δεν είναι ενεργός.", "Permission:IdentityManagement": "Διαχείριση ταυτότητας", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json index b0e8286ed8..adebfa33e8 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en-GB.json @@ -70,6 +70,7 @@ "Volo.Abp.Identity:010006": "Static roles cannot be deleted.", "Volo.Abp.Identity:010007": "You can't change your two factor setting.", "Volo.Abp.Identity:010008": "Changing the two factor setting is not allowed.", + "Volo.Abp.Identity:010009": "You cannot delegate yourself!", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maximum allowed organisation unit membership count for a user", "Permission:IdentityManagement": "Identity management", "Permission:RoleManagement": "Role management", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json index 8dadff1594..724ec04300 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/en.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Static roles can not be deleted.", "Volo.Abp.Identity:010007": "You can't change your two factor setting.", "Volo.Abp.Identity:010008": "It's not allowed to change two factor setting.", + "Volo.Abp.Identity:010009": "You can not delegate yourself.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maximum allowed organization unit membership count for a user", "ThisUserIsNotActiveMessage": "This user is not active.", "Permission:IdentityManagement": "Identity management", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json index 1cbad4abce..06c279ec73 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/es.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Los roles estáticos no pueden ser borrados.", "Volo.Abp.Identity:010007": "No puedes cambiar tu configuración de autentificación de dos pasos.", "Volo.Abp.Identity:010008": "No está permitido cambiar la configuración de autenticación de dos pasos.", + "Volo.Abp.Identity:010009": "No puedes delegar tu propia cuenta!", "Identity.OrganizationUnit.MaxUserMembershipCount": "Número máximo de unidades organizativas por usuario", "ThisUserIsNotActiveMessage": "Este usuario no está activo.", "Permission:IdentityManagement": "Gestión de identidades", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json index 5f82e64b46..7a89cebc87 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fa.json @@ -70,6 +70,7 @@ "Volo.Abp.Identity:010006": "نقش/وظیفه ی استاتیک را نمی توان حذف کرد.", "Volo.Abp.Identity:010007": "شما نمی توانید تنظیمات دو مرحله ای خود را تغییر دهید.", "Volo.Abp.Identity:010008": "تغییر دادن تنظیمات دو مرحله ای مجاز نمی باشد.", + "Volo.Abp.Identity:010009": "شما نمی توانید خودتان را معرفی کنید.", "Identity.OrganizationUnit.MaxUserMembershipCount": "حداکثر تعداد مجاز عضویت در یک واحد سازمان برای یک کاربر", "ThisUserIsNotActiveMessage": "این کاربر غیرفعال میباشد.", "Permission:IdentityManagement": "مدیریت هویت", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json index d05f8fea0d..d74257414a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fi.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Staattisia rooleja ei voi poistaa.", "Volo.Abp.Identity:010007": "Et voi muuttaa kahden tekijän asetusta.", "Volo.Abp.Identity:010008": "Kahden tekijän asetusta ei saa muuttaa.", + "Volo.Abp.Identity:010009": "Et voi delegoida itseäsi.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Suurin sallittu organisaatioyksikön jäsenmäärä käyttäjälle", "ThisUserIsNotActiveMessage": "Tämä käyttäjä ei ole aktiivinen.", "Permission:IdentityManagement": "Identiteetin hallinta", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json index 6b35b77250..80a5f90a10 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/fr.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Les rôles statiques ne peuvent pas être supprimés.", "Volo.Abp.Identity:010007": "Vous ne pouvez pas modifier votre paramètre à deux facteurs.", "Volo.Abp.Identity:010008": "Il n’est pas permis de changer deux facteurs de réglage.", + "Volo.Abp.Identity:010009": "Vous ne pouvez pas vous déléguer vous-même.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Nombre maximal d’adhésions autorisées à l’unité d’organisation pour un utilisateur", "ThisUserIsNotActiveMessage": "Cet utilisateur n'est pas actif.", "Permission:IdentityManagement": "Gestion de l’identité", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json index 30947281bb..e01e4c8e25 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hi.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "स्टेटिक भूमिकाओं को हटाया नहीं जा सकता।", "Volo.Abp.Identity:010007": "आप अपनी दो कारक सेटिंग नहीं बदल सकते।", "Volo.Abp.Identity:010008": "इसे दो कारक सेटिंग बदलने की अनुमति नहीं है।", + "Volo.Abp.Identity:010009": "आप अपने आप को अधिकृत नहीं कर सकते हैं!", "Identity.OrganizationUnit.MaxUserMembershipCount": "उपयोगकर्ता के लिए अधिकतम अनुमत संगठन इकाई सदस्यता गणना", "ThisUserIsNotActiveMessage": "यह उपयोगकर्ता सक्रिय नहीं है।", "Permission:IdentityManagement": "पहचान प्रबंधन", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json index e0f706b504..a31715fc16 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hr.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Statičke uloge nije moguće izbrisati.", "Volo.Abp.Identity:010007": "Ne možete promijeniti postavku dva faktora.", "Volo.Abp.Identity:010008": "Nije dopušteno mijenjati postavke dvofaktorske autentifikacije.", + "Volo.Abp.Identity:010009": "Ne možete delegirati sami sebi.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maksimalni dopušteni broj članstva u organizacijskoj jedinici za korisnika", "ThisUserIsNotActiveMessage": "Ovaj korisnik nije aktivan.", "Permission:IdentityManagement": "Upravljanje identitetom", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json index 106fa4cd3d..8c658c9e89 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/hu.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "A statikus szerepeket nem lehet törölni.", "Volo.Abp.Identity:010007": "Nem változtathatja meg a kétlépcsős bejelentkezés beállítását.", "Volo.Abp.Identity:010008": "Kétlépcsős bejelentkezés beállítás megváltoztatása nem megengedett.", + "Volo.Abp.Identity:010009": "Nem adhatja át a saját jogosultságait.", "Identity.OrganizationUnit.MaxUserMembershipCount": "A maximálisan megengedett szervezeti egység tagsági szám egy felhasználó számára", "ThisUserIsNotActiveMessage": "Ez a felhasználó nem aktív.", "Permission:IdentityManagement": "Identitáskezelés", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json index dbd8914612..c0bb4af19a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/is.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Ekki er hægt að eyða static hlutverkum.", "Volo.Abp.Identity:010007": "Þú getur ekki breytt tveggja þátta stillingu þinni.", "Volo.Abp.Identity:010008": "Það er ekki leyfilegt að breyta tvíþátta stillingu.", + "Volo.Abp.Identity:010009": "Þú getur ekki delegað þér sjálfum.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Hámarks leyfileg fjöldi aðildar að skipulagseiningu fyrir notanda", "ThisUserIsNotActiveMessage": "Þessi notandi er ekki virkur.", "Permission:IdentityManagement": "Auðkenninga umsjón", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json index 5b559b039f..513def4b52 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/it.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "I ruoli statici non possono essere eliminati.", "Volo.Abp.Identity:010007": "Non puoi modificare l'impostazione dei due fattori.", "Volo.Abp.Identity:010008": "Non è consentito modificare l'impostazione a due fattori.", + "Volo.Abp.Identity:010009": "Non puoi delegare te stesso.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Numero massimo consentito di membri dell'unità organizzativa per un utente", "ThisUserIsNotActiveMessage": "Questo utente non è attivo.", "Permission:IdentityManagement": "Gestione identità", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json index 496c65fdc8..472935418b 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/nl.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Statische rollen kunnen niet worden verwijderd.", "Volo.Abp.Identity:010007": "U kunt uw instelling voor tweefactor authenticatie niet wijzigen.", "Volo.Abp.Identity:010008": "Het is niet toegestaan om de instelling van tweefactor authenticatie te wijzigen.", + "Volo.Abp.Identity:010009": "U kunt uzelf niet delegeren.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maximaal toegestande aantal lidmaatschappen van organisatie-eenheden voor een gebruiker", "ThisUserIsNotActiveMessage": "Deze gebruiker is niet actief.", "Permission:IdentityManagement": "Identiteitsbeheer", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json index 59f8868c79..377c792ddf 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pl-PL.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Statyczna rola nie może zostać usunięta.", "Volo.Abp.Identity:010007": "Nie możesz zmienić ustawienia dwóch czynników.", "Volo.Abp.Identity:010008": "Nie wolno zmieniać ustawienia dwuczynnikowego.", + "Volo.Abp.Identity:010009": "Nie możesz delegować swoich uprawnień.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maksymalna dozwolona liczba członków jednostki organizacyjnej dla użytkownika", "ThisUserIsNotActiveMessage": "Ten użytkownik nie jest aktywny.", "Permission:IdentityManagement": "Zarządzanie tożsamością", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json index be6493d5f8..c8807d2792 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/pt-BR.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Perfis estáticos não podem ser excluídos.", "Volo.Abp.Identity:010007": "Você não pode alterar sua configuração de dois fatores.", "Volo.Abp.Identity:010008": "Não é permitido alterar a configuração de dois fatores.", + "Volo.Abp.Identity:010009": "Você não pode delegar a si mesmo.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Contagem máxima permitida de membros da unidade organizacional para um usuário", "ThisUserIsNotActiveMessage": "Este usuário não está ativo.", "Permission:IdentityManagement": "Acessos", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json index 789c4ededd..d86eb4f1fa 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ro-RO.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Rolurile statice nu pot fi şterse.", "Volo.Abp.Identity:010007": "Nu vă puteţi schimba setările de autentificare în doi paşi.", "Volo.Abp.Identity:010008": "Nu este permisă modificarea setărilor autentificării în doi paşi.", + "Volo.Abp.Identity:010009": "Nu vă puteţi delega singur.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Numărul maxim de unităţi organizaţionale permise pentru un utilizator", "ThisUserIsNotActiveMessage": "Acest utilizator nu este activ.", "Permission:IdentityManagement": "Administrare identităţii", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json index a3f1863e4f..73fd937af0 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/ru.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Статические роли не могут быть удалены.", "Volo.Abp.Identity:010007": "Вы не можете изменить настройку двух факторов.", "Volo.Abp.Identity:010008": "Изменение двухфакторной настройки не допускается.", + "Volo.Abp.Identity:010009": "Вы не можете делегировать свои собственные права.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Максимально допустимое количество членов организационного подразделения для пользователя", "ThisUserIsNotActiveMessage": "Этот пользователь не активен.", "Permission:IdentityManagement": "Управление идентификацией", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json index 16b483103e..83eb3850ad 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sk.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Statické roly nie je možné zmazať.", "Volo.Abp.Identity:010007": "Dvojfaktorové nastavenie nie je možné zmeniť.", "Volo.Abp.Identity:010008": "Dvojfaktorové nastavenie nie je povolené zmeniť.", + "Volo.Abp.Identity:010009": "Nemôžete delegovať svoje vlastné oprávnenia.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Maximálny povolený počet členov organizačnej jednotky pre používateľa", "ThisUserIsNotActiveMessage": "Tento používateľ nie je aktívny.", "Permission:IdentityManagement": "Správa identít", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json index 477d3ecf67..caa60a2d71 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/sl.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Statičnih vlog ni mogoče izbrisati.", "Volo.Abp.Identity:010007": "Nastavitve dveh faktorjev ne morete spremeniti.", "Volo.Abp.Identity:010008": "Ni dovoljeno spreminjati nastavitve dveh faktorjev.", + "Volo.Abp.Identity:010009": "Ne morete delegirati svojih pravic.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Največje dovoljeno število članov v organizacijski enoti za uporabnika", "ThisUserIsNotActiveMessage": "Ta uporabnik ni aktiven.", "Permission:IdentityManagement": "Upravljanje identitet", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json index 44d2576299..c8957dc3e7 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/tr.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Bir Sabit rol silinemez.", "Volo.Abp.Identity:010007": "İki faktörlü ayarınızı değiştiremezsiniz.", "Volo.Abp.Identity:010008": "İki faktörlü ayarın değiştirilmesine izin verilmez.", + "Volo.Abp.Identity:010009": "Kendinizi yetkilendiremezsiniz.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Bir kullanıcı için izin verilen en fazla organizasyon birimi sayısı", "ThisUserIsNotActiveMessage": "Bu kullanıcı aktif değil.", "Permission:IdentityManagement": "Kimlik yönetimi", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json index 52b684d745..05dbe248a0 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/vi.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "Vai trò này là cố định không được phép xóa.", "Volo.Abp.Identity:010007": "Bạn không thể thay đổi cài đặt hai yếu tố của mình.", "Volo.Abp.Identity:010008": "Không được phép thay đổi cài đặt hai yếu tố.", + "Volo.Abp.Identity:010009": "Bạn không thể ủy quyền cho chính mình.", "Identity.OrganizationUnit.MaxUserMembershipCount": "Số lượng thành viên đơn vị tổ chức tối đa được phép cho một người dùng", "ThisUserIsNotActiveMessage": "Người dùng này không hoạt động.", "Permission:IdentityManagement": "Quản lý danh tính", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json index 4c63d24158..095f5cef2f 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hans.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "无法删除静态角色.", "Volo.Abp.Identity:010007": "你不能修改你的双因素身份验证设置", "Volo.Abp.Identity:010008": "不允许修改双因素身份验证设置.", + "Volo.Abp.Identity:010009": "你不能委托给自己.", "Identity.OrganizationUnit.MaxUserMembershipCount": "组织单位最大允许的成员资格计数", "ThisUserIsNotActiveMessage": "该用户不可用.", "Permission:IdentityManagement": "身份标识管理", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json index 9767dbb3ea..936ad985f6 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json +++ b/modules/identity/src/Volo.Abp.Identity.Domain.Shared/Volo/Abp/Identity/Localization/zh-Hant.json @@ -71,6 +71,7 @@ "Volo.Abp.Identity:010006": "無法刪除靜態角色.", "Volo.Abp.Identity:010007": "你不能修改你的雙因素身份驗證設置", "Volo.Abp.Identity:010008": "不允許修改雙因素身份驗證設置.", + "Volo.Abp.Identity:010009": "你不能委派給自己", "Identity.OrganizationUnit.MaxUserMembershipCount": "允許一個使用者至多可隸屬在幾個組織單位", "ThisUserIsNotActiveMessage": "該用戶不可用.", "Permission:IdentityManagement": "身份識別管理", diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserDelegationRepository.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserDelegationRepository.cs new file mode 100644 index 0000000000..360b9c494c --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserDelegationRepository.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Repositories; + +namespace Volo.Abp.Identity; + +public interface IIdentityUserDelegationRepository: IBasicRepository +{ + Task> GetListAsync( + Guid? sourceUserId, + Guid? targetUserId, + CancellationToken cancellationToken = default); + + Task> GetActiveDelegationsAsync( + Guid targetUserId, + CancellationToken cancellationToken = default); + + Task FindActiveDelegationByIdAsync( + Guid id, + CancellationToken cancellationToken = default); +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserDelegation.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserDelegation.cs new file mode 100644 index 0000000000..8cab00f882 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserDelegation.cs @@ -0,0 +1,41 @@ +using System; +using Volo.Abp.Domain.Entities; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.Identity; + +public class IdentityUserDelegation : BasicAggregateRoot, IMultiTenant +{ + public virtual Guid? TenantId { get; protected set; } + + public virtual Guid SourceUserId { get; protected set; } + + public virtual Guid TargetUserId { get; protected set; } + + public virtual DateTime StartTime { get; protected set; } + + public virtual DateTime EndTime { get; protected set; } + + /// + /// Initializes a new instance of . + /// + protected IdentityUserDelegation() + { + } + + public IdentityUserDelegation( + Guid id, + Guid sourceUserId, + Guid targetUserId, + DateTime startTime, + DateTime endTime, + Guid? tenantId = null) + : base(id) + { + TenantId = tenantId; + SourceUserId = sourceUserId; + TargetUserId = targetUserId; + StartTime = startTime; + EndTime = endTime; + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserDelegationManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserDelegationManager.cs new file mode 100644 index 0000000000..8fd4c444f5 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserDelegationManager.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.Domain.Services; + +namespace Volo.Abp.Identity; + +public class IdentityUserDelegationManager : DomainService +{ + protected IIdentityUserDelegationRepository IdentityUserDelegationRepository { get; } + + public IdentityUserDelegationManager(IIdentityUserDelegationRepository identityUserDelegationRepository) + { + IdentityUserDelegationRepository = identityUserDelegationRepository; + } + + public virtual async Task> GetListAsync(Guid? sourceUserId = null, Guid? targetUserId = null, CancellationToken cancellationToken = default) + { + return await IdentityUserDelegationRepository.GetListAsync(sourceUserId, targetUserId, cancellationToken: cancellationToken); + } + + public virtual async Task> GetActiveDelegationsAsync(Guid targetUseId, CancellationToken cancellationToken = default) + { + return await IdentityUserDelegationRepository.GetActiveDelegationsAsync(targetUseId, cancellationToken: cancellationToken); + } + + public virtual async Task FindActiveDelegationByIdAsync(Guid id, CancellationToken cancellationToken = default) + { + return await IdentityUserDelegationRepository.FindActiveDelegationByIdAsync(id, cancellationToken: cancellationToken); + } + + public virtual async Task DelegateNewUserAsync(Guid sourceUserId, Guid targetUserId, DateTime startTime, DateTime endTime, CancellationToken cancellationToken = default) + { + if (sourceUserId == targetUserId) + { + throw new BusinessException(IdentityErrorCodes.YouCannotDelegateYourself); + } + + await IdentityUserDelegationRepository.InsertAsync( + new IdentityUserDelegation( + GuidGenerator.Create(), + sourceUserId, + targetUserId, + startTime, + endTime + ), + cancellationToken: cancellationToken + ); + } + + public virtual async Task DeleteDelegationAsync(Guid id, Guid sourceUserId, CancellationToken cancellationToken = default) + { + var delegation = await IdentityUserDelegationRepository.FindAsync(id, cancellationToken: cancellationToken); + + if (delegation != null && delegation.SourceUserId == sourceUserId) + { + await IdentityUserDelegationRepository.DeleteAsync(delegation, cancellationToken: cancellationToken); + } + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs index 4bfa96d253..a58a73a996 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/AbpIdentityEntityFrameworkCoreModule.cs @@ -19,6 +19,7 @@ public class AbpIdentityEntityFrameworkCoreModule : AbpModule options.AddRepository(); options.AddRepository(); options.AddRepository(); + options.AddRepository(); }); } } diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserDelegationRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserDelegationRepository.cs new file mode 100644 index 0000000000..cd567ffa80 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserDelegationRepository.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Domain.Repositories.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Timing; + +namespace Volo.Abp.Identity.EntityFrameworkCore; + +public class EfCoreIdentityUserDelegationRepository : EfCoreRepository, IIdentityUserDelegationRepository +{ + protected IClock Clock { get; } + + public EfCoreIdentityUserDelegationRepository(IDbContextProvider dbContextProvider, IClock clock) + : base(dbContextProvider) + { + Clock = clock; + } + + public async Task> GetListAsync(Guid? sourceUserId, Guid? targetUserId, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .AsNoTracking() + .WhereIf(sourceUserId.HasValue, x => x.SourceUserId == sourceUserId) + .WhereIf(targetUserId.HasValue, x => x.TargetUserId == targetUserId) + .ToListAsync(cancellationToken: cancellationToken); + } + + public async Task> GetActiveDelegationsAsync(Guid targetUserId, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .AsNoTracking() + .Where(x => x.TargetUserId == targetUserId && + x.StartTime <= Clock.Now && + x.EndTime >= Clock.Now) + .ToListAsync(cancellationToken: cancellationToken); + } + + public async Task FindActiveDelegationByIdAsync(Guid id, CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .AsNoTracking() + .FirstOrDefaultAsync(x => + x.Id == id && + x.StartTime <= Clock.Now && + x.EndTime >= Clock.Now + , cancellationToken: GetCancellationToken(cancellationToken)); + } +} diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs index e84b2811c5..2f409a61b2 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IIdentityDbContext.cs @@ -18,4 +18,6 @@ public interface IIdentityDbContext : IEfCoreDbContext DbSet SecurityLogs { get; } DbSet LinkUsers { get; } + + DbSet UserDelegations { get; } } diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs index bc2b4dd4b0..79adece5e1 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContext.cs @@ -22,6 +22,8 @@ public class IdentityDbContext : AbpDbContext, IIdentityDbCon public DbSet LinkUsers { get; set; } + public DbSet UserDelegations { get; set; } + public IdentityDbContext(DbContextOptions options) : base(options) { diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs index 472581fdbd..f85f72e84e 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/IdentityDbContextModelBuilderExtensions.cs @@ -270,6 +270,15 @@ public static class IdentityDbContextModelBuilderExtensions }); } + builder.Entity(b => + { + b.ToTable(AbpIdentityDbProperties.DbTablePrefix + "UserDelegations", AbpIdentityDbProperties.DbSchema); + + b.ConfigureByConvention(); + + b.ApplyObjectExtensionMappings(); + }); + builder.TryConfigureObjectExtensions(); } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs index 1acc952024..90118a534e 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContext.cs @@ -19,6 +19,8 @@ public class AbpIdentityMongoDbContext : AbpMongoDbContext, IAbpIdentityMongoDbC public IMongoCollection LinkUsers => Collection(); + public IMongoCollection UserDelegations => Collection(); + protected override void CreateModel(IMongoModelBuilder modelBuilder) { base.CreateModel(modelBuilder); diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContextExtensions.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContextExtensions.cs index 4816664d68..5ee7ffc47e 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContextExtensions.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbContextExtensions.cs @@ -37,5 +37,10 @@ public static class AbpIdentityMongoDbContextExtensions { b.CollectionName = AbpIdentityDbProperties.DbTablePrefix + "LinkUsers"; }); + + builder.Entity(b => + { + b.CollectionName = AbpIdentityDbProperties.DbTablePrefix + "UserDelegations"; + }); } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbModule.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbModule.cs index 85fc619180..35c81b25bb 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbModule.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/AbpIdentityMongoDbModule.cs @@ -20,6 +20,7 @@ public class AbpIdentityMongoDbModule : AbpModule options.AddRepository(); options.AddRepository(); options.AddRepository(); + options.AddRepository(); }); } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs index ad2ae429e1..39bcc23b50 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/IAbpIdentityMongoDbContext.cs @@ -18,4 +18,6 @@ public interface IAbpIdentityMongoDbContext : IAbpMongoDbContext IMongoCollection SecurityLogs { get; } IMongoCollection LinkUsers { get; } + + IMongoCollection UserDelegations { get; } } diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserDelegationRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserDelegationRepository.cs new file mode 100644 index 0000000000..a782dd57c9 --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserDelegationRepository.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using MongoDB.Driver; +using MongoDB.Driver.Linq; +using Volo.Abp.Domain.Repositories.MongoDB; +using Volo.Abp.MongoDB; +using Volo.Abp.Timing; + +namespace Volo.Abp.Identity.MongoDB; + +public class MongoIdentityUserDelegationRepository : MongoDbRepository, IIdentityUserDelegationRepository +{ + protected IClock Clock { get; } + + public MongoIdentityUserDelegationRepository(IMongoDbContextProvider dbContextProvider, IClock clock) + : base(dbContextProvider) + { + Clock = clock; + } + + public async Task> GetListAsync(Guid? sourceUserId, Guid? targetUserId, + CancellationToken cancellationToken = default) + { + return await (await GetMongoQueryableAsync(cancellationToken)) + .WhereIf(sourceUserId.HasValue, x => x.SourceUserId == sourceUserId) + .WhereIf(targetUserId.HasValue, x => x.TargetUserId == targetUserId) + .As>() + .ToListAsync(cancellationToken: cancellationToken); + } + + public async Task> GetActiveDelegationsAsync(Guid targetUserId, CancellationToken cancellationToken = default) + { + return await (await GetMongoQueryableAsync(cancellationToken)) + .Where(x => x.TargetUserId == targetUserId) + .Where(x => x.StartTime <= Clock.Now && x.EndTime >= Clock.Now) + .As>() + .ToListAsync(cancellationToken: cancellationToken); + } + + public async Task FindActiveDelegationByIdAsync(Guid id, CancellationToken cancellationToken = default) + { + return await (await GetMongoQueryableAsync(cancellationToken)) + .FirstOrDefaultAsync(x => + x.Id == id && + x.StartTime <= Clock.Now && + x.EndTime >= Clock.Now + , cancellationToken: GetCancellationToken(cancellationToken)); + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserDelegationManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserDelegationManager_Tests.cs new file mode 100644 index 0000000000..c85f17230f --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserDelegationManager_Tests.cs @@ -0,0 +1,69 @@ +using System; +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace Volo.Abp.Identity; + +public class IdentityUserDelegationManager_Tests : AbpIdentityDomainTestBase +{ + protected IdentityUserDelegationManager IdentityUserDelegationManager { get; } + protected IdentityTestData TestData { get; } + + public IdentityUserDelegationManager_Tests() + { + IdentityUserDelegationManager = GetRequiredService(); + TestData = GetRequiredService(); + } + + [Fact] + public async Task GetListAsync() + { + (await IdentityUserDelegationManager.GetListAsync(Guid.NewGuid(), Guid.NewGuid())).Count.ShouldBe(0); + + (await IdentityUserDelegationManager.GetListAsync(TestData.UserJohnId, null)).Count.ShouldBe(2); + + (await IdentityUserDelegationManager.GetListAsync(null, TestData.UserDavidId)).Count.ShouldBe(3); + + (await IdentityUserDelegationManager.GetListAsync(TestData.UserNeoId, TestData.UserDavidId)).Count.ShouldBe(1); + } + + [Fact] + public async Task GetActiveDelegationsAsync() + { + var activeDelegations = await IdentityUserDelegationManager.GetActiveDelegationsAsync(TestData.UserDavidId); + activeDelegations.Count.ShouldBe(2); + activeDelegations[0].SourceUserId.ShouldBe(TestData.UserJohnId); + activeDelegations[0].TargetUserId.ShouldBe(TestData.UserDavidId); + activeDelegations[1].SourceUserId.ShouldBe(TestData.UserNeoId); + activeDelegations[1].TargetUserId.ShouldBe(TestData.UserDavidId); + } + + [Fact] + public async Task FindActiveDelegationByIdAsync() + { + var activeDelegations = await IdentityUserDelegationManager.GetActiveDelegationsAsync(TestData.UserDavidId); + var activeDelegation = await IdentityUserDelegationManager.FindActiveDelegationByIdAsync(activeDelegations[0].Id); + activeDelegation.ShouldNotBeNull(); + activeDelegation.SourceUserId.ShouldBe(TestData.UserJohnId); + activeDelegation.TargetUserId.ShouldBe(TestData.UserDavidId); + } + + [Fact] + public async Task DelegateNewUserAsync() + { + await Should.ThrowAsync(IdentityUserDelegationManager.DelegateNewUserAsync( + TestData.UserJohnId, + TestData.UserJohnId, + DateTime.Now.AddDays(-1), + DateTime.Now)); + + await IdentityUserDelegationManager.DelegateNewUserAsync( + TestData.UserJohnId, + TestData.UserBobId, + DateTime.Now.AddDays(-1), + DateTime.Now.AddDays(1)); + + (await IdentityUserDelegationManager.GetActiveDelegationsAsync(TestData.UserBobId)).Count.ShouldBe(1); + } +} \ No newline at end of file diff --git a/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/IdentityUserDelegationepository_Tests.cs b/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/IdentityUserDelegationepository_Tests.cs new file mode 100644 index 0000000000..92648defe7 --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.EntityFrameworkCore.Tests/Volo/Abp/Identity/EntityFrameworkCore/IdentityUserDelegationepository_Tests.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.Identity.EntityFrameworkCore; + +public class IdentityUserDelegationepository_Tests : IdentityUserDelegationepository_Tests +{ + +} \ No newline at end of file diff --git a/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/IdentityUserDelegationepository_Tests.cs b/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/IdentityUserDelegationepository_Tests.cs new file mode 100644 index 0000000000..5fb94b614a --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.MongoDB.Tests/Volo/Abp/Identity/MongoDB/IdentityUserDelegationepository_Tests.cs @@ -0,0 +1,9 @@ +using Xunit; + +namespace Volo.Abp.Identity.MongoDB; + +[Collection(MongoTestCollection.Name)] +public class IdentityUserDelegationepository_Tests: IdentityUserDelegationepository_Tests +{ + +} \ No newline at end of file diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs index 788f974b5e..dc2b28690a 100644 --- a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs @@ -22,6 +22,7 @@ public class AbpIdentityTestDataBuilder : ITransientDependency private readonly OrganizationUnitManager _organizationUnitManager; private readonly IIdentityLinkUserRepository _identityLinkUserRepository; private readonly IdentityLinkUserManager _identityLinkUserManager; + private readonly IIdentityUserDelegationRepository _identityUserDelegationRepository; private IdentityRole _adminRole; private IdentityRole _moderatorRole; @@ -42,7 +43,8 @@ public class AbpIdentityTestDataBuilder : ITransientDependency IdentityTestData testData, OrganizationUnitManager organizationUnitManager, IIdentityLinkUserRepository identityLinkUserRepository, - IdentityLinkUserManager identityLinkUserManager) + IdentityLinkUserManager identityLinkUserManager, + IIdentityUserDelegationRepository identityUserDelegationRepository) { _guidGenerator = guidGenerator; _userRepository = userRepository; @@ -55,6 +57,7 @@ public class AbpIdentityTestDataBuilder : ITransientDependency _organizationUnitManager = organizationUnitManager; _identityLinkUserRepository = identityLinkUserRepository; _identityLinkUserManager = identityLinkUserManager; + _identityUserDelegationRepository = identityUserDelegationRepository; _identitySecurityLogRepository = identitySecurityLogRepository; } @@ -66,6 +69,7 @@ public class AbpIdentityTestDataBuilder : ITransientDependency await AddLinkUsers(); await AddClaimTypes(); await AddSecurityLogs(); + await AddUserDelegations(); } private async Task AddRoles() @@ -197,4 +201,28 @@ public class AbpIdentityTestDataBuilder : ITransientDependency CreationTime = new DateTime(2020, 01, 02, 10, 0, 0) })); } + + private async Task AddUserDelegations() + { + await _identityUserDelegationRepository.InsertAsync( + new IdentityUserDelegation(_guidGenerator.Create(), + _testData.UserJohnId, + _testData.UserDavidId, + DateTime.Now.AddDays(-2), + DateTime.Now.AddDays(-1))); + + await _identityUserDelegationRepository.InsertAsync( + new IdentityUserDelegation(_guidGenerator.Create(), + _testData.UserJohnId, + _testData.UserDavidId, + DateTime.Now.AddDays(-1), + DateTime.Now.AddDays(1))); + + await _identityUserDelegationRepository.InsertAsync( + new IdentityUserDelegation(_guidGenerator.Create(), + _testData.UserNeoId, + _testData.UserDavidId, + DateTime.Now.AddDays(-1), + DateTime.Now.AddDays(1))); + } } diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserDelegationepository_Tests.cs b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserDelegationepository_Tests.cs new file mode 100644 index 0000000000..50d5dd8a6f --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserDelegationepository_Tests.cs @@ -0,0 +1,55 @@ +using System; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Modularity; +using Xunit; + +namespace Volo.Abp.Identity; + +public abstract class IdentityUserDelegationepository_Tests : AbpIdentityTestBase + where TStartupModule : IAbpModule +{ + protected IIdentityUserRepository UserRepository { get; } + protected IIdentityUserDelegationRepository IdentityUserDelegationRepository { get; } + protected IdentityTestData TestData { get; } + + public IdentityUserDelegationepository_Tests() + { + UserRepository = GetRequiredService(); + IdentityUserDelegationRepository = GetRequiredService(); + TestData = GetRequiredService(); + } + + [Fact] + public async Task GetListAsync() + { + (await IdentityUserDelegationRepository.GetListAsync(Guid.NewGuid(), Guid.NewGuid())).Count.ShouldBe(0); + + (await IdentityUserDelegationRepository.GetListAsync(TestData.UserJohnId, null)).Count.ShouldBe(2); + + (await IdentityUserDelegationRepository.GetListAsync(null, TestData.UserDavidId)).Count.ShouldBe(3); + + (await IdentityUserDelegationRepository.GetListAsync(TestData.UserNeoId, TestData.UserDavidId)).Count.ShouldBe(1); + } + + [Fact] + public async Task GetActiveDelegationsAsync() + { + var activeDelegations = await IdentityUserDelegationRepository.GetActiveDelegationsAsync(TestData.UserDavidId); + activeDelegations.Count.ShouldBe(2); + activeDelegations[0].SourceUserId.ShouldBe(TestData.UserJohnId); + activeDelegations[0].TargetUserId.ShouldBe(TestData.UserDavidId); + activeDelegations[1].SourceUserId.ShouldBe(TestData.UserNeoId); + activeDelegations[1].TargetUserId.ShouldBe(TestData.UserDavidId); + } + + [Fact] + public async Task GetActiveDelegationOrNullAsync() + { + var activeDelegations = await IdentityUserDelegationRepository.GetActiveDelegationsAsync(TestData.UserDavidId); + var activeDelegation = await IdentityUserDelegationRepository.FindActiveDelegationByIdAsync(activeDelegations[0].Id); + activeDelegation.ShouldNotBeNull(); + activeDelegation.SourceUserId.ShouldBe(TestData.UserJohnId); + activeDelegation.TargetUserId.ShouldBe(TestData.UserDavidId); + } +} \ No newline at end of file diff --git a/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/Pages/Index.cshtml b/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/Pages/Index.cshtml index d2f8710862..ca7e62a411 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/Pages/Index.cshtml +++ b/modules/openiddict/app/OpenIddict.Demo.Client.Mvc/Pages/Index.cshtml @@ -9,7 +9,7 @@
Login - Loout + Logout @if (HttpContext.User.Identity != null && HttpContext.User.Identity.IsAuthenticated) { diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20230307054116_Initial.Designer.cs b/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20230404033745_Initial.Designer.cs similarity index 99% rename from modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20230307054116_Initial.Designer.cs rename to modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20230404033745_Initial.Designer.cs index bc14c07aec..34487a75a8 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20230307054116_Initial.Designer.cs +++ b/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20230404033745_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace OpenIddict.Demo.Server.Migrations { [DbContext(typeof(ServerDbContext))] - [Migration("20230307054116_Initial")] + [Migration("20230404033745_Initial")] partial class Initial { /// @@ -455,6 +455,9 @@ namespace OpenIddict.Demo.Server.Migrations .HasColumnType("uniqueidentifier") .HasColumnName("LastModifierId"); + b.Property("LastPasswordChangeTime") + .HasColumnType("datetimeoffset"); + b.Property("LockoutEnabled") .ValueGeneratedOnAdd() .HasColumnType("bit") diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20230307054116_Initial.cs b/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20230404033745_Initial.cs similarity index 99% rename from modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20230307054116_Initial.cs rename to modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20230404033745_Initial.cs index ab3646a62c..611109065a 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20230307054116_Initial.cs +++ b/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/20230404033745_Initial.cs @@ -283,6 +283,7 @@ namespace OpenIddict.Demo.Server.Migrations AccessFailedCount = table.Column(type: "int", nullable: false, defaultValue: 0), ShouldChangePasswordOnNextLogin = table.Column(type: "bit", nullable: false), EntityVersion = table.Column(type: "int", nullable: false), + LastPasswordChangeTime = table.Column(type: "datetimeoffset", nullable: true), 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), diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/ServerDbContextModelSnapshot.cs b/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/ServerDbContextModelSnapshot.cs index f5e599fe73..6dcdccdd99 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/ServerDbContextModelSnapshot.cs +++ b/modules/openiddict/app/OpenIddict.Demo.Server/Migrations/ServerDbContextModelSnapshot.cs @@ -452,6 +452,9 @@ namespace OpenIddict.Demo.Server.Migrations .HasColumnType("uniqueidentifier") .HasColumnName("LastModifierId"); + b.Property("LastPasswordChangeTime") + .HasColumnType("datetimeoffset"); + b.Property("LockoutEnabled") .ValueGeneratedOnAdd() .HasColumnType("bit") diff --git a/modules/openiddict/app/OpenIddict.Demo.Server/package.json b/modules/openiddict/app/OpenIddict.Demo.Server/package.json index b136c85f53..d598fa29ec 100644 --- a/modules/openiddict/app/OpenIddict.Demo.Server/package.json +++ b/modules/openiddict/app/OpenIddict.Demo.Server/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "~7.1.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "~7.1.1" } } diff --git a/modules/openiddict/app/angular/package.json b/modules/openiddict/app/angular/package.json index d4945f081d..7e337458ec 100644 --- a/modules/openiddict/app/angular/package.json +++ b/modules/openiddict/app/angular/package.json @@ -12,15 +12,15 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~7.1.0", - "@abp/ng.components": "~7.1.0", - "@abp/ng.core": "~7.1.0", - "@abp/ng.oauth": "~7.1.0", - "@abp/ng.identity": "~7.1.0", - "@abp/ng.setting-management": "~7.1.0", - "@abp/ng.tenant-management": "~7.1.0", - "@abp/ng.theme.shared": "~7.1.0", - "@abp/ng.theme.lepton-x": "~2.1.0-rc.1", + "@abp/ng.account": "~7.1.1", + "@abp/ng.components": "~7.1.1", + "@abp/ng.core": "~7.1.1", + "@abp/ng.oauth": "~7.1.1", + "@abp/ng.identity": "~7.1.1", + "@abp/ng.setting-management": "~7.1.1", + "@abp/ng.tenant-management": "~7.1.1", + "@abp/ng.theme.shared": "~7.1.1", + "@abp/ng.theme.lepton-x": "~2.1.0", "@angular/animations": "^15.0.1", "@angular/common": "^15.0.1", "@angular/compiler": "^15.0.1", @@ -36,7 +36,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~7.1.0", + "@abp/ng.schematics": "~7.1.1", "@angular-devkit/build-angular": "^15.0.1", "@angular-eslint/builder": "~15.1.0", "@angular-eslint/eslint-plugin": "~15.1.0", diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs index 8a664da5c1..3ee5dbf126 100644 --- a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/AbpOpenIddictAspNetCoreModule.cs @@ -5,6 +5,7 @@ using OpenIddict.Server; using Volo.Abp.AspNetCore.MultiTenancy; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; using Volo.Abp.Modularity; +using Volo.Abp.OpenIddict.Scopes; using Volo.Abp.OpenIddict.WildcardDomains; using Volo.Abp.Security.Claims; @@ -133,6 +134,7 @@ public class AbpOpenIddictAspNetCoreModule : AbpModule } builder.AddEventHandler(RemoveClaimsFromClientCredentialsGrantType.Descriptor); + builder.AddEventHandler(AttachScopes.Descriptor); services.ExecutePreConfiguredActions(builder); }); diff --git a/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Scopes/AttachScopes.cs b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Scopes/AttachScopes.cs new file mode 100644 index 0000000000..75401ada2b --- /dev/null +++ b/modules/openiddict/src/Volo.Abp.OpenIddict.AspNetCore/Volo/Abp/OpenIddict/Scopes/AttachScopes.cs @@ -0,0 +1,34 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using OpenIddict.Server; + +namespace Volo.Abp.OpenIddict.Scopes; + +public class AttachScopes : IOpenIddictServerHandler +{ + public static OpenIddictServerHandlerDescriptor Descriptor { get; } + = OpenIddictServerHandlerDescriptor.CreateBuilder() + .UseSingletonHandler() + .SetOrder(OpenIddictServerHandlers.Discovery.AttachScopes.Descriptor.Order + 1) + .SetType(OpenIddictServerHandlerType.Custom) + .Build(); + + private readonly IOpenIddictScopeRepository _scopeRepository; + + public AttachScopes(IOpenIddictScopeRepository scopeRepository) + { + _scopeRepository = scopeRepository; + } + + public async ValueTask HandleAsync(OpenIddictServerEvents.HandleConfigurationRequestContext context) + { + if (context is null) + { + throw new ArgumentNullException(nameof(context)); + } + + var scopes = await _scopeRepository.GetListAsync(); + context.Scopes.UnionWith(scopes.Select(x => x.Name)); + } +} 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 aed63fb8e1..7096fa4ac8 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 @@ -260,6 +260,6 @@ public partial class PermissionManagementModal var permissions = group.Permissions; var grantedProviders = permissions.SelectMany(x => x.GrantedProviders); - return permissions.All(x => x.IsGranted) && grantedProviders.All(p => p.ProviderName != _providerName); + return permissions.All(x => x.IsGranted) && grantedProviders.Any(p => p.ProviderName != _providerName); } } diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json index 38ec99db3b..2d3ac6d7e9 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/package.json @@ -3,6 +3,6 @@ "name": "demo-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.1" } } diff --git a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock index 4a687745e9..0ad110e7ef 100644 --- a/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock +++ b/modules/setting-management/app/Volo.Abp.SettingManagement.DemoApp/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.0.tgz#79b5154f041fde68ecf81a920f756d16157cb439" - integrity sha512-rmrPRviLwlAN+o48ZnzPoRRYv78Uqwd1eSX6ftaf4CPxbb+bQJAKAcL5FbAnNheLesL62sn4x11Q60F8Mp850g== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.0.tgz#af4d0b4228fb0ead0626d344a5458856103446ff" - integrity sha512-Pn6UBgSJbOCnW0OFcLZrOH4dEpSSlBDjSy6HMm0wtdgodu9TjRYY/mAwRsjhXZTX3ycpuktVhVotB4ZLvFpgUg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.1.0" - "@abp/bootstrap" "~7.1.0" - "@abp/bootstrap-datepicker" "~7.1.0" - "@abp/bootstrap-daterangepicker" "~7.1.0" - "@abp/datatables.net-bs5" "~7.1.0" - "@abp/font-awesome" "~7.1.0" - "@abp/jquery-form" "~7.1.0" - "@abp/jquery-validation-unobtrusive" "~7.1.0" - "@abp/lodash" "~7.1.0" - "@abp/luxon" "~7.1.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.1.0" - "@abp/moment" "~7.1.0" - "@abp/select2" "~7.1.0" - "@abp/sweetalert2" "~7.1.0" - "@abp/timeago" "~7.1.0" - "@abp/toastr" "~7.1.0" - -"@abp/aspnetcore.mvc.ui@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.0.tgz#a10cc69976e294587a5274f11c216e55ebb1feb7" - integrity sha512-TGCmp4rxQiTUPaZYYGvhQSm5vjcZhJUEriuNyGSKWcs8vTC4eV6Eh6JqANU42RNxohWrQczEIWWMrQz5MEfX6g== +"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.1.tgz#9368779919662a804a8119ac6cf9b731fa2a9728" + integrity sha512-xMUBHJv9pLWp3wx3Oc6+F4G8biZ+BgCskYzAgV2lLWFjQAUxe8klbP0dsVr0EZemyMctX6zlHLURRIl+Os8Z2Q== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.1.tgz#48cf683b8a147bc5955de5e812a0dfa3b7184f29" + integrity sha512-caHzC5zOr2vXY2QDRKuFQ4qIWOS/DbsJUO+UhfKSHvP/bAv7Cu10K3gHwrbfuNCChDJ9iLK0+oJYXUtYBXRA3g== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.1.1" + "@abp/bootstrap" "~7.1.1" + "@abp/bootstrap-datepicker" "~7.1.1" + "@abp/bootstrap-daterangepicker" "~7.1.1" + "@abp/datatables.net-bs5" "~7.1.1" + "@abp/font-awesome" "~7.1.1" + "@abp/jquery-form" "~7.1.1" + "@abp/jquery-validation-unobtrusive" "~7.1.1" + "@abp/lodash" "~7.1.1" + "@abp/luxon" "~7.1.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.1.1" + "@abp/moment" "~7.1.1" + "@abp/select2" "~7.1.1" + "@abp/sweetalert2" "~7.1.1" + "@abp/timeago" "~7.1.1" + "@abp/toastr" "~7.1.1" + +"@abp/aspnetcore.mvc.ui@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.1.tgz#f862b77573b5c34d9b938160669400edbf06154d" + integrity sha512-+xafeXzwnFa4Evak9Wq+jrpimWITio4Yv9WeSbKInNakIPO+wJNBClBneca1XQ+LFy4bMRuqgWYJueUct+E3tA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,158 +43,158 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.0.tgz#2a5635f35aeb5be636dfdd5a3fe68c083507cb29" - integrity sha512-ZZTsDgrbKyU/mA8ZKKiSTsd9mTHl2n3mDWrDX7rJdZ5zyGzxxk2Dc81kQP5qUdp6OAG6chiLIPLxXntjWVnyvA== +"@abp/bootstrap-datepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.1.tgz#45c9b9086b3a64ce4ba6193320afdf2e81d12136" + integrity sha512-/T2FlMlPV19J70t8yueyxj9k72+4t3b2aVDrNHCf7uPuSqClwVKEylzGr8RFc7VXHZZwwaUrbLhxYkhkCKLuLA== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.0.tgz#1bf9a27976036c8e658d104a964742410aaca691" - integrity sha512-dhOf3aU82RDYcQc+HOObqd960SmHZTDPhS+6D9QkJ9a3PocyoBzLEi/lcgjfQytMzwsebxY8vk+S2WTUucoRuQ== +"@abp/bootstrap-daterangepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.1.tgz#19349099f6c007feef1ebe73c9c1059f8d271bc1" + integrity sha512-pCTiPRNW4gnzo0rWKbu2A52dRUeXRI3MqJW7h46yNk4n1ZrnsmwH6/b/ebp89YlbNXWaatDrEpk3NbqxSDDAdQ== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.0.tgz#52063d1f577d01d17f3b67e9bdc1ea811242b41e" - integrity sha512-S8Vnpj+cUO58C79aPum9eKlj13nY/T36ReUBPwT3CPrzStM9ab5BlNwHXR3Piyx/73i/r4Utehg18hs2fVi5Jw== +"@abp/bootstrap@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.1.tgz#1481b984a7f31f92f262d6957340fcaa87eb8ece" + integrity sha512-qFNLuBExQeVDOlFKP/STa3r+8CHhPUfsOFnPaknkS2QLewmtAZw3BJFEgvpJQkSvQdaBXW+EjutaJiFGdDrkEQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" bootstrap "^5.1.3" -"@abp/core@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.0.tgz#cffbe4a166073b394850ffd9739b0a089149a3fb" - integrity sha512-+DLBAtXo5BRYwcQH3yFzya0EZj8wd0/BE2QmXTVJ+nxQly+cp7ZV98oRIzI7ArIIV52Th4CXHwZv0l0U0Rdisg== +"@abp/core@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.1.tgz#de4d666d26fba4ab5f7b3e6fff38f2f5f034d121" + integrity sha512-d/vHAAU60v6gdH3+VpchXDD1l5yXNmKsb3i92gvG9M0orjgVy3dJmb6zBVw50nnZxNSfq3Z0S1TC/QdA2C1rQg== dependencies: - "@abp/utils" "~7.1.0" + "@abp/utils" "~7.1.1" -"@abp/datatables.net-bs5@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.0.tgz#3c2289290c3667cad69604d6184fb9b77263f137" - integrity sha512-1LqROrLgFOiUN3E28s5qEu82Zdy4kLGJ6a7f1J6OAvqGXF62DRbKhoS8Rsd5DOV+JHCRnAx8PnTBhlUbl2zmoQ== +"@abp/datatables.net-bs5@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.1.tgz#b7058a0cad4119cc7391493a7d148250efc41b72" + integrity sha512-uPqHzfE9dH5nEuocvIduQYcjEa4MwBXMjtnY5tHM+PK2yB8DsDOrXVopOX0YPTgFk49pLvOVbgxsftuyPb3xKQ== dependencies: - "@abp/datatables.net" "~7.1.0" + "@abp/datatables.net" "~7.1.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.0.tgz#e26dd279276dd38dff485c68bb92b77a4737b625" - integrity sha512-vwihQI6Sxp9gktMSSQ99HwS8oHoYZh1zmZWEnVNAvMnTlxMhqwHEIK2y0XkT/jI3z5NGntz75qFSoqHGFLRAbw== +"@abp/datatables.net@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.1.tgz#a84975c8ab0d7406e524d2eae41f7a04bc00f13c" + integrity sha512-eKIxvap/bKc1G7Dev+t9V8HvHWQYza0Y4RdYmC0bPOyRthlTW9AH8jyKK5HtJlpNpj9rjB2jy3/I9D1uzD67QQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.0.tgz#65d9919c3d511197e4518ce25164f767c4776a5a" - integrity sha512-1u0zBE26iNv3YjQ1gTv8rozt6jSXDD0OISMXRT90BAGpOrEHoUB9VaRx4q7AXIrPye95RhfpccGbWE31vPEguw== +"@abp/font-awesome@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.1.tgz#da4a0be295b0acf9b62d8299d1c567ae192a320f" + integrity sha512-AVjbSFXj5IzzQwqwP/fgsuRG1NzV6/KGn5owsfn6HeKSOBjqW4h4EGyunMNoAOW4fsdFxvE4zjBpsG1/E9tuQg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.0.tgz#e1d29ea105a3c4664057fea6c03999ff9529ee59" - integrity sha512-GuJC3TTclKk47mMjtasZBkKF1KqZcvUCXTkTM165U3hN80Bn5GjbS48oXz/iHI70lWNDsycVRrrrc8guwksvzg== +"@abp/jquery-form@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.1.tgz#03c17ccb19820e0a56be58275e2ebba7e7ebaa5f" + integrity sha512-UurenNEYZRN192B70R3DR1NsFUae45h/2huAQD07OM0fyJyM6ji5N7q/Q2Aao0jqBLwRNPrEinUcP8BmJxe2Tw== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.0.tgz#0eb2364582337d530aa6f24fcbaaefa40fda6f7a" - integrity sha512-JiZvmSBt/Q8kZ15wazRDf738UjY1ZCpNm0fE47mpokE9T1YiD8DVDnv4qFDa7ActB5PsfwD1vRANNrmfUsSJcw== +"@abp/jquery-validation-unobtrusive@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.1.tgz#255146ccc553bb9f9197ccf87fa71d930698cf65" + integrity sha512-oUYvNmiGxeyJeGoG3EWAzy2Ld9EKgyK6U28gKaAMrXFlYbiEMnX5+8v1Tdb3sQuOJ68bdiyYjO3Ke9NLsTZHFg== dependencies: - "@abp/jquery-validation" "~7.1.0" + "@abp/jquery-validation" "~7.1.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.0.tgz#2c28095e4fccbaea78dc1f0c5459456380727079" - integrity sha512-rXCrd1ZZ2pse4MgF2fB6e/880UiaHuk+ZXBg/y8Yj2Ab5OVsUuCw9CpsjHOplWC6Rq5A8SjO7BCdI4juxb3xHQ== +"@abp/jquery-validation@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.1.tgz#b3af6606daaa6303c28f6a04aeaa2d6612c5248b" + integrity sha512-ZkDWUbHqF9NkczPdvEZH4gkb6NeXRI5JsROXzmx3K+QIOGUhs//4gOzSYYak0kn0Mljeg8fjJQNa55914d8Xow== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.0.tgz#5c43c7b4fff5f04f7bf9f763e6c2e57f000cbb10" - integrity sha512-JPgrVkRVnxFFm96movaOsfM4NsDghIdfAwo25Qz4t5hAeiAVusTCULML5Ds1IjHHQBjbYV/81Zno3xHzC4eU8A== +"@abp/jquery@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.1.tgz#43adacf3d345576ff7ca42a5a470eb61fb827e23" + integrity sha512-3Epxyyoz1BJge7lbimkg0Ha4DmNlZN5vYFgVKa8SOCoKfoZ7+8gmbXlUEAUe4wnsjP5tQ4/AjoqgzjPL9KQcCg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" jquery "~3.6.0" -"@abp/lodash@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.0.tgz#d187bdac06a1425737837521d09aaf998d49bd08" - integrity sha512-/PmbRfN8ACBey4r8QpwSad38n720yZG5WY/lvddCoBmhJYeUtEr0moFF4g2x0wVm7U1wVXQK6RR9GOr0Q2A7Og== +"@abp/lodash@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.1.tgz#7371484331867775adcb5f4a92d63d4cbed25f19" + integrity sha512-hwNcYcRNZZV5OgH+W775OkpJ5JmrDi+LiVFDAmelWgAXSgqxic8bDla+UUL/pjnkKxwgI4BAlOIctYN/2QM3iA== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" lodash "^4.17.21" -"@abp/luxon@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.0.tgz#e6e119736e0340df162aeaf6546ec322253fee7e" - integrity sha512-UqsJTELF9bxZgE4v9dSfuHvyhinqFPKWZD1ctzTv4At5wie5yrqa+r5y59rPRui3svBxiZXSSZKmDCZnaoFW+w== +"@abp/luxon@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.1.tgz#b0cf4a72ffe66f77d403b896ea5d1ea007ebc9b7" + integrity sha512-2RDIdHrPUDvOoowQlMInfQ0rDZA8IOf2fVs7C2bcZmhjGoK7+vsUJsw/q9awpgeKrHwqJ0o1zsFGfFFKlYMnew== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.0.tgz#f113854212adcddbb142ee54f27e8f3876a22e7c" - integrity sha512-IIbDZ/7fjcnZ05ZHbX6KrlDlkXzZLD8w7teAoMuhBcLZeP3PWythzFYbCc6LwvtgvvkfriyPSth4PCsv2mh/gw== +"@abp/malihu-custom-scrollbar-plugin@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.1.tgz#8a25f3dd78c1f0c395ac255976567d2919d3ec38" + integrity sha512-kfW+B+kFr0Qao17rDginL0ICPwGA3t387hx5LhPIxP2p7aluaA3qyiEbM50Izz+t4mL4JdaBN8DU0kLziqVERw== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.0.tgz#c924fd6278992d8939501903347808a2ded053aa" - integrity sha512-pwbGxx/h0U0NILec6ZscHt6FBOyCUi8TTZzp1B7W9hpC3KSh4qGH1fUM2LI1mXFLl8c/exmVs7aZMN/24KgBag== +"@abp/moment@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.1.tgz#5cf7f815cc4dbe55c9c363d146592683f8a90d62" + integrity sha512-tgg4rTmAGZE+B8OBpeq1ADXJW07EdkCkQUSrLykWMaQr1PZfs9xi0tgsi4CpdITLOK48b9BueRmUdZOgmFXKiQ== dependencies: moment "^2.9.0" -"@abp/select2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.0.tgz#30522455c70059251e593cdb0228dbbf831bbb78" - integrity sha512-VPdqxjT8URm1rkwsPvutOgFPs/JTlm8KVcvdV1UsvJMxx5OIKMKcxgsL9UJl033HzVVwp/XBsMQsaNRHnW+hvw== +"@abp/select2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.1.tgz#1afa414ce68c1f35c3e7ab1beee00f924604de51" + integrity sha512-+5MMLQuXlj07VIXhVKEAmeqsfuGXHWwtpDY2LMsT15lNJbrvq0wF9KZJ0eMF8u29Nyk8IuBJf1YRUzx815PiVg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.0.tgz#7cbf9c53ab9e1db2c59d63f392ba9b62624272f6" - integrity sha512-5NL2TijufGF5Jdbed1V+s6+tCa/C/R/ZSfb7CjQnBOCSC0JNhBDHtRabOaouqr2la4xbAEHjIoyXEnWXYAidYw== +"@abp/sweetalert2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.1.tgz#9ba7578ab53af056f26ef34ae0f2fddc28722c12" + integrity sha512-8hjmEqmcRoMN3Cmk7k0lNdtsm8JytrjPzvHahjqKHIcK1Zi0RbjWJpafbvDu5IFlFrRNYHXlqpUw8e3dtCEp3A== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.0.tgz#96909f2d0d27ac977d0caf6a0e2b725681f8124e" - integrity sha512-gWDwvnVSVKPBaOaJCaqhvcqS/GwTQFzNH6dWIH19/g23rF3+s/KwTyoW5AA8uWStBx1PxZaugR0OIK/7hctUog== +"@abp/timeago@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.1.tgz#c7be25a320aa311e2e9c7a8186b51766db4523ac" + integrity sha512-FsIjAiP2dqRHwrrKx/5tWgLMZ2LboNLhrHeRb1FFol/0163uVEQGEJkxLOE5xY530mdaFFfAOc0x6aniSLE4ZQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" timeago "^1.6.7" -"@abp/toastr@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.0.tgz#c11d780c86c16835528f152aac4cbe4aa94bb810" - integrity sha512-awgpA6J65TlMK54Hdq2fyDsZ6nvD69RKfAUaGzpz685tNbvaqQfXxSlBQVEad8QZlMGFeCOAmH9GYkBHNaP/zg== +"@abp/toastr@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.1.tgz#5ef7da983a226f226d8b9b85f2fa9ff7eeed41aa" + integrity sha512-8x8FQt8BSmgI1b6JXK7N+JJJ0ksBcFSMQol0AbzTOFOBO2T77eXIuiVh8961ynaeIECjGWcazXUMuG09Drq6Ig== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" toastr "^2.1.4" -"@abp/utils@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.0.tgz#fb52fdc21e8d26a32245eefac86c512a9318ee47" - integrity sha512-CorSSUsaVug2qY6f4j2uxtAjdSq1dfdq1QdjdQaoPxoZKU74Yv/Cyh7YZ+WJa3Upmaw4V0+6ELX9RE3OjJIxIQ== +"@abp/utils@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.1.tgz#e11bc878573dd8118e42b3c1582c44d8b5c71d83" + integrity sha512-G4S0ndDUe8W525O8KUBucLcrESoSFjeqLjRZ+W7N7K9D/oLisYU9Siwxb2csTdjXz6JeQ7AtQl7ak1WpAMiJ/g== dependencies: just-compare "^1.3.0" diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json index 61d8bf31c8..a9508bf55d 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json +++ b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.0", - "@abp/virtual-file-explorer": "^7.1.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.1", + "@abp/virtual-file-explorer": "^7.1.1" } } diff --git a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock index 301593a4a4..df3dcbecdc 100644 --- a/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock +++ b/modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/yarn.lock @@ -2,39 +2,39 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.0.tgz#79b5154f041fde68ecf81a920f756d16157cb439" - integrity sha512-rmrPRviLwlAN+o48ZnzPoRRYv78Uqwd1eSX6ftaf4CPxbb+bQJAKAcL5FbAnNheLesL62sn4x11Q60F8Mp850g== - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.0" - -"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.0.tgz#af4d0b4228fb0ead0626d344a5458856103446ff" - integrity sha512-Pn6UBgSJbOCnW0OFcLZrOH4dEpSSlBDjSy6HMm0wtdgodu9TjRYY/mAwRsjhXZTX3ycpuktVhVotB4ZLvFpgUg== - dependencies: - "@abp/aspnetcore.mvc.ui" "~7.1.0" - "@abp/bootstrap" "~7.1.0" - "@abp/bootstrap-datepicker" "~7.1.0" - "@abp/bootstrap-daterangepicker" "~7.1.0" - "@abp/datatables.net-bs5" "~7.1.0" - "@abp/font-awesome" "~7.1.0" - "@abp/jquery-form" "~7.1.0" - "@abp/jquery-validation-unobtrusive" "~7.1.0" - "@abp/lodash" "~7.1.0" - "@abp/luxon" "~7.1.0" - "@abp/malihu-custom-scrollbar-plugin" "~7.1.0" - "@abp/moment" "~7.1.0" - "@abp/select2" "~7.1.0" - "@abp/sweetalert2" "~7.1.0" - "@abp/timeago" "~7.1.0" - "@abp/toastr" "~7.1.0" - -"@abp/aspnetcore.mvc.ui@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.0.tgz#a10cc69976e294587a5274f11c216e55ebb1feb7" - integrity sha512-TGCmp4rxQiTUPaZYYGvhQSm5vjcZhJUEriuNyGSKWcs8vTC4eV6Eh6JqANU42RNxohWrQczEIWWMrQz5MEfX6g== +"@abp/aspnetcore.mvc.ui.theme.basic@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-7.1.1.tgz#9368779919662a804a8119ac6cf9b731fa2a9728" + integrity sha512-xMUBHJv9pLWp3wx3Oc6+F4G8biZ+BgCskYzAgV2lLWFjQAUxe8klbP0dsVr0EZemyMctX6zlHLURRIl+Os8Z2Q== + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "~7.1.1" + +"@abp/aspnetcore.mvc.ui.theme.shared@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-7.1.1.tgz#48cf683b8a147bc5955de5e812a0dfa3b7184f29" + integrity sha512-caHzC5zOr2vXY2QDRKuFQ4qIWOS/DbsJUO+UhfKSHvP/bAv7Cu10K3gHwrbfuNCChDJ9iLK0+oJYXUtYBXRA3g== + dependencies: + "@abp/aspnetcore.mvc.ui" "~7.1.1" + "@abp/bootstrap" "~7.1.1" + "@abp/bootstrap-datepicker" "~7.1.1" + "@abp/bootstrap-daterangepicker" "~7.1.1" + "@abp/datatables.net-bs5" "~7.1.1" + "@abp/font-awesome" "~7.1.1" + "@abp/jquery-form" "~7.1.1" + "@abp/jquery-validation-unobtrusive" "~7.1.1" + "@abp/lodash" "~7.1.1" + "@abp/luxon" "~7.1.1" + "@abp/malihu-custom-scrollbar-plugin" "~7.1.1" + "@abp/moment" "~7.1.1" + "@abp/select2" "~7.1.1" + "@abp/sweetalert2" "~7.1.1" + "@abp/timeago" "~7.1.1" + "@abp/toastr" "~7.1.1" + +"@abp/aspnetcore.mvc.ui@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-7.1.1.tgz#f862b77573b5c34d9b938160669400edbf06154d" + integrity sha512-+xafeXzwnFa4Evak9Wq+jrpimWITio4Yv9WeSbKInNakIPO+wJNBClBneca1XQ+LFy4bMRuqgWYJueUct+E3tA== dependencies: ansi-colors "^4.1.1" extend-object "^1.0.0" @@ -43,185 +43,185 @@ merge-stream "^2.0.0" micromatch "^4.0.2" -"@abp/bootstrap-datepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.0.tgz#2a5635f35aeb5be636dfdd5a3fe68c083507cb29" - integrity sha512-ZZTsDgrbKyU/mA8ZKKiSTsd9mTHl2n3mDWrDX7rJdZ5zyGzxxk2Dc81kQP5qUdp6OAG6chiLIPLxXntjWVnyvA== +"@abp/bootstrap-datepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-datepicker/-/bootstrap-datepicker-7.1.1.tgz#45c9b9086b3a64ce4ba6193320afdf2e81d12136" + integrity sha512-/T2FlMlPV19J70t8yueyxj9k72+4t3b2aVDrNHCf7uPuSqClwVKEylzGr8RFc7VXHZZwwaUrbLhxYkhkCKLuLA== dependencies: bootstrap-datepicker "^1.9.0" -"@abp/bootstrap-daterangepicker@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.0.tgz#1bf9a27976036c8e658d104a964742410aaca691" - integrity sha512-dhOf3aU82RDYcQc+HOObqd960SmHZTDPhS+6D9QkJ9a3PocyoBzLEi/lcgjfQytMzwsebxY8vk+S2WTUucoRuQ== +"@abp/bootstrap-daterangepicker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap-daterangepicker/-/bootstrap-daterangepicker-7.1.1.tgz#19349099f6c007feef1ebe73c9c1059f8d271bc1" + integrity sha512-pCTiPRNW4gnzo0rWKbu2A52dRUeXRI3MqJW7h46yNk4n1ZrnsmwH6/b/ebp89YlbNXWaatDrEpk3NbqxSDDAdQ== dependencies: bootstrap-daterangepicker "^3.1.0" -"@abp/bootstrap@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.0.tgz#52063d1f577d01d17f3b67e9bdc1ea811242b41e" - integrity sha512-S8Vnpj+cUO58C79aPum9eKlj13nY/T36ReUBPwT3CPrzStM9ab5BlNwHXR3Piyx/73i/r4Utehg18hs2fVi5Jw== +"@abp/bootstrap@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-7.1.1.tgz#1481b984a7f31f92f262d6957340fcaa87eb8ece" + integrity sha512-qFNLuBExQeVDOlFKP/STa3r+8CHhPUfsOFnPaknkS2QLewmtAZw3BJFEgvpJQkSvQdaBXW+EjutaJiFGdDrkEQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" bootstrap "^5.1.3" -"@abp/clipboard@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.1.0.tgz#21531f61322fc64114350972c9cedaa54f7114ae" - integrity sha512-1woUBwgtvsThNmEzYyIb46O13jchetY/HkYaOpwbLW6A13Qrsa0lHbABUDLpLp685T/1M/9lweOhWvNxRw2Ozw== +"@abp/clipboard@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/clipboard/-/clipboard-7.1.1.tgz#06985266e399a03f819585ec9b9ae17ffcbfef0b" + integrity sha512-IxlQJgNlhp6hMVAkPqRgzmB0a5bKdrZ0whVlaxNKR42geetutV+5KPo/koCmliksHLAFTfiAedQXOXsJ90p2AQ== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" clipboard "^2.0.8" -"@abp/core@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.0.tgz#cffbe4a166073b394850ffd9739b0a089149a3fb" - integrity sha512-+DLBAtXo5BRYwcQH3yFzya0EZj8wd0/BE2QmXTVJ+nxQly+cp7ZV98oRIzI7ArIIV52Th4CXHwZv0l0U0Rdisg== +"@abp/core@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-7.1.1.tgz#de4d666d26fba4ab5f7b3e6fff38f2f5f034d121" + integrity sha512-d/vHAAU60v6gdH3+VpchXDD1l5yXNmKsb3i92gvG9M0orjgVy3dJmb6zBVw50nnZxNSfq3Z0S1TC/QdA2C1rQg== dependencies: - "@abp/utils" "~7.1.0" + "@abp/utils" "~7.1.1" -"@abp/datatables.net-bs5@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.0.tgz#3c2289290c3667cad69604d6184fb9b77263f137" - integrity sha512-1LqROrLgFOiUN3E28s5qEu82Zdy4kLGJ6a7f1J6OAvqGXF62DRbKhoS8Rsd5DOV+JHCRnAx8PnTBhlUbl2zmoQ== +"@abp/datatables.net-bs5@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs5/-/datatables.net-bs5-7.1.1.tgz#b7058a0cad4119cc7391493a7d148250efc41b72" + integrity sha512-uPqHzfE9dH5nEuocvIduQYcjEa4MwBXMjtnY5tHM+PK2yB8DsDOrXVopOX0YPTgFk49pLvOVbgxsftuyPb3xKQ== dependencies: - "@abp/datatables.net" "~7.1.0" + "@abp/datatables.net" "~7.1.1" datatables.net-bs5 "^1.11.4" -"@abp/datatables.net@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.0.tgz#e26dd279276dd38dff485c68bb92b77a4737b625" - integrity sha512-vwihQI6Sxp9gktMSSQ99HwS8oHoYZh1zmZWEnVNAvMnTlxMhqwHEIK2y0XkT/jI3z5NGntz75qFSoqHGFLRAbw== +"@abp/datatables.net@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-7.1.1.tgz#a84975c8ab0d7406e524d2eae41f7a04bc00f13c" + integrity sha512-eKIxvap/bKc1G7Dev+t9V8HvHWQYza0Y4RdYmC0bPOyRthlTW9AH8jyKK5HtJlpNpj9rjB2jy3/I9D1uzD67QQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" datatables.net "^1.11.4" -"@abp/font-awesome@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.0.tgz#65d9919c3d511197e4518ce25164f767c4776a5a" - integrity sha512-1u0zBE26iNv3YjQ1gTv8rozt6jSXDD0OISMXRT90BAGpOrEHoUB9VaRx4q7AXIrPye95RhfpccGbWE31vPEguw== +"@abp/font-awesome@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-7.1.1.tgz#da4a0be295b0acf9b62d8299d1c567ae192a320f" + integrity sha512-AVjbSFXj5IzzQwqwP/fgsuRG1NzV6/KGn5owsfn6HeKSOBjqW4h4EGyunMNoAOW4fsdFxvE4zjBpsG1/E9tuQg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" "@fortawesome/fontawesome-free" "^5.15.4" -"@abp/jquery-form@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.0.tgz#e1d29ea105a3c4664057fea6c03999ff9529ee59" - integrity sha512-GuJC3TTclKk47mMjtasZBkKF1KqZcvUCXTkTM165U3hN80Bn5GjbS48oXz/iHI70lWNDsycVRrrrc8guwksvzg== +"@abp/jquery-form@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-7.1.1.tgz#03c17ccb19820e0a56be58275e2ebba7e7ebaa5f" + integrity sha512-UurenNEYZRN192B70R3DR1NsFUae45h/2huAQD07OM0fyJyM6ji5N7q/Q2Aao0jqBLwRNPrEinUcP8BmJxe2Tw== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-form "^4.3.0" -"@abp/jquery-validation-unobtrusive@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.0.tgz#0eb2364582337d530aa6f24fcbaaefa40fda6f7a" - integrity sha512-JiZvmSBt/Q8kZ15wazRDf738UjY1ZCpNm0fE47mpokE9T1YiD8DVDnv4qFDa7ActB5PsfwD1vRANNrmfUsSJcw== +"@abp/jquery-validation-unobtrusive@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-7.1.1.tgz#255146ccc553bb9f9197ccf87fa71d930698cf65" + integrity sha512-oUYvNmiGxeyJeGoG3EWAzy2Ld9EKgyK6U28gKaAMrXFlYbiEMnX5+8v1Tdb3sQuOJ68bdiyYjO3Ke9NLsTZHFg== dependencies: - "@abp/jquery-validation" "~7.1.0" + "@abp/jquery-validation" "~7.1.1" jquery-validation-unobtrusive "^3.2.12" -"@abp/jquery-validation@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.0.tgz#2c28095e4fccbaea78dc1f0c5459456380727079" - integrity sha512-rXCrd1ZZ2pse4MgF2fB6e/880UiaHuk+ZXBg/y8Yj2Ab5OVsUuCw9CpsjHOplWC6Rq5A8SjO7BCdI4juxb3xHQ== +"@abp/jquery-validation@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-7.1.1.tgz#b3af6606daaa6303c28f6a04aeaa2d6612c5248b" + integrity sha512-ZkDWUbHqF9NkczPdvEZH4gkb6NeXRI5JsROXzmx3K+QIOGUhs//4gOzSYYak0kn0Mljeg8fjJQNa55914d8Xow== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" jquery-validation "^1.19.3" -"@abp/jquery@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.0.tgz#5c43c7b4fff5f04f7bf9f763e6c2e57f000cbb10" - integrity sha512-JPgrVkRVnxFFm96movaOsfM4NsDghIdfAwo25Qz4t5hAeiAVusTCULML5Ds1IjHHQBjbYV/81Zno3xHzC4eU8A== +"@abp/jquery@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-7.1.1.tgz#43adacf3d345576ff7ca42a5a470eb61fb827e23" + integrity sha512-3Epxyyoz1BJge7lbimkg0Ha4DmNlZN5vYFgVKa8SOCoKfoZ7+8gmbXlUEAUe4wnsjP5tQ4/AjoqgzjPL9KQcCg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" jquery "~3.6.0" -"@abp/lodash@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.0.tgz#d187bdac06a1425737837521d09aaf998d49bd08" - integrity sha512-/PmbRfN8ACBey4r8QpwSad38n720yZG5WY/lvddCoBmhJYeUtEr0moFF4g2x0wVm7U1wVXQK6RR9GOr0Q2A7Og== +"@abp/lodash@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-7.1.1.tgz#7371484331867775adcb5f4a92d63d4cbed25f19" + integrity sha512-hwNcYcRNZZV5OgH+W775OkpJ5JmrDi+LiVFDAmelWgAXSgqxic8bDla+UUL/pjnkKxwgI4BAlOIctYN/2QM3iA== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" lodash "^4.17.21" -"@abp/luxon@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.0.tgz#e6e119736e0340df162aeaf6546ec322253fee7e" - integrity sha512-UqsJTELF9bxZgE4v9dSfuHvyhinqFPKWZD1ctzTv4At5wie5yrqa+r5y59rPRui3svBxiZXSSZKmDCZnaoFW+w== +"@abp/luxon@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/luxon/-/luxon-7.1.1.tgz#b0cf4a72ffe66f77d403b896ea5d1ea007ebc9b7" + integrity sha512-2RDIdHrPUDvOoowQlMInfQ0rDZA8IOf2fVs7C2bcZmhjGoK7+vsUJsw/q9awpgeKrHwqJ0o1zsFGfFFKlYMnew== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" luxon "^2.3.0" -"@abp/malihu-custom-scrollbar-plugin@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.0.tgz#f113854212adcddbb142ee54f27e8f3876a22e7c" - integrity sha512-IIbDZ/7fjcnZ05ZHbX6KrlDlkXzZLD8w7teAoMuhBcLZeP3PWythzFYbCc6LwvtgvvkfriyPSth4PCsv2mh/gw== +"@abp/malihu-custom-scrollbar-plugin@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/malihu-custom-scrollbar-plugin/-/malihu-custom-scrollbar-plugin-7.1.1.tgz#8a25f3dd78c1f0c395ac255976567d2919d3ec38" + integrity sha512-kfW+B+kFr0Qao17rDginL0ICPwGA3t387hx5LhPIxP2p7aluaA3qyiEbM50Izz+t4mL4JdaBN8DU0kLziqVERw== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" malihu-custom-scrollbar-plugin "^3.1.5" -"@abp/moment@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.0.tgz#c924fd6278992d8939501903347808a2ded053aa" - integrity sha512-pwbGxx/h0U0NILec6ZscHt6FBOyCUi8TTZzp1B7W9hpC3KSh4qGH1fUM2LI1mXFLl8c/exmVs7aZMN/24KgBag== +"@abp/moment@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/moment/-/moment-7.1.1.tgz#5cf7f815cc4dbe55c9c363d146592683f8a90d62" + integrity sha512-tgg4rTmAGZE+B8OBpeq1ADXJW07EdkCkQUSrLykWMaQr1PZfs9xi0tgsi4CpdITLOK48b9BueRmUdZOgmFXKiQ== dependencies: moment "^2.9.0" -"@abp/prismjs@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.1.0.tgz#e9dc477f5d8728532a7c27e8e1b309a20b1aa32c" - integrity sha512-7pBxUKgqYaEEsuA7AUcdYJh05x2v0NVdkOc5n7KEw/ixqzB6d40SDBKndYg8ns+Zknvh6IK6e2FjOO+y/hWloQ== +"@abp/prismjs@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/prismjs/-/prismjs-7.1.1.tgz#bfcee96e5a1e2f98fb29006f16aeeb227a4e773d" + integrity sha512-7o7FRzgGNPR9GxQ6CPskWL2N87LykoylKnkCm0Cz0n+x0JSrAEMv2yEiJJT2L1S+51ldCQhBmF2blOjxgUT98A== dependencies: - "@abp/clipboard" "~7.1.0" - "@abp/core" "~7.1.0" + "@abp/clipboard" "~7.1.1" + "@abp/core" "~7.1.1" prismjs "^1.26.0" -"@abp/select2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.0.tgz#30522455c70059251e593cdb0228dbbf831bbb78" - integrity sha512-VPdqxjT8URm1rkwsPvutOgFPs/JTlm8KVcvdV1UsvJMxx5OIKMKcxgsL9UJl033HzVVwp/XBsMQsaNRHnW+hvw== +"@abp/select2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-7.1.1.tgz#1afa414ce68c1f35c3e7ab1beee00f924604de51" + integrity sha512-+5MMLQuXlj07VIXhVKEAmeqsfuGXHWwtpDY2LMsT15lNJbrvq0wF9KZJ0eMF8u29Nyk8IuBJf1YRUzx815PiVg== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" select2 "^4.0.13" -"@abp/sweetalert2@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.0.tgz#7cbf9c53ab9e1db2c59d63f392ba9b62624272f6" - integrity sha512-5NL2TijufGF5Jdbed1V+s6+tCa/C/R/ZSfb7CjQnBOCSC0JNhBDHtRabOaouqr2la4xbAEHjIoyXEnWXYAidYw== +"@abp/sweetalert2@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/sweetalert2/-/sweetalert2-7.1.1.tgz#9ba7578ab53af056f26ef34ae0f2fddc28722c12" + integrity sha512-8hjmEqmcRoMN3Cmk7k0lNdtsm8JytrjPzvHahjqKHIcK1Zi0RbjWJpafbvDu5IFlFrRNYHXlqpUw8e3dtCEp3A== dependencies: - "@abp/core" "~7.1.0" + "@abp/core" "~7.1.1" sweetalert2 "^11.3.6" -"@abp/timeago@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.0.tgz#96909f2d0d27ac977d0caf6a0e2b725681f8124e" - integrity sha512-gWDwvnVSVKPBaOaJCaqhvcqS/GwTQFzNH6dWIH19/g23rF3+s/KwTyoW5AA8uWStBx1PxZaugR0OIK/7hctUog== +"@abp/timeago@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-7.1.1.tgz#c7be25a320aa311e2e9c7a8186b51766db4523ac" + integrity sha512-FsIjAiP2dqRHwrrKx/5tWgLMZ2LboNLhrHeRb1FFol/0163uVEQGEJkxLOE5xY530mdaFFfAOc0x6aniSLE4ZQ== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" timeago "^1.6.7" -"@abp/toastr@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.0.tgz#c11d780c86c16835528f152aac4cbe4aa94bb810" - integrity sha512-awgpA6J65TlMK54Hdq2fyDsZ6nvD69RKfAUaGzpz685tNbvaqQfXxSlBQVEad8QZlMGFeCOAmH9GYkBHNaP/zg== +"@abp/toastr@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-7.1.1.tgz#5ef7da983a226f226d8b9b85f2fa9ff7eeed41aa" + integrity sha512-8x8FQt8BSmgI1b6JXK7N+JJJ0ksBcFSMQol0AbzTOFOBO2T77eXIuiVh8961ynaeIECjGWcazXUMuG09Drq6Ig== dependencies: - "@abp/jquery" "~7.1.0" + "@abp/jquery" "~7.1.1" toastr "^2.1.4" -"@abp/utils@~7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.0.tgz#fb52fdc21e8d26a32245eefac86c512a9318ee47" - integrity sha512-CorSSUsaVug2qY6f4j2uxtAjdSq1dfdq1QdjdQaoPxoZKU74Yv/Cyh7YZ+WJa3Upmaw4V0+6ELX9RE3OjJIxIQ== +"@abp/utils@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/utils/-/utils-7.1.1.tgz#e11bc878573dd8118e42b3c1582c44d8b5c71d83" + integrity sha512-G4S0ndDUe8W525O8KUBucLcrESoSFjeqLjRZ+W7N7K9D/oLisYU9Siwxb2csTdjXz6JeQ7AtQl7ak1WpAMiJ/g== dependencies: just-compare "^1.3.0" -"@abp/virtual-file-explorer@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-7.1.0.tgz#537a7bdd9157029a075b0a71c9c3a27f72711623" - integrity sha512-mUgmergrSpoA7L1M5uXDyyFr6Iy1rWNxreQTUlKRnEYZj4yN+zXVvdoI8GSsBC30ukvw/b0QtqE6e6lVliYekA== +"@abp/virtual-file-explorer@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@abp/virtual-file-explorer/-/virtual-file-explorer-7.1.1.tgz#8d569a73cc53b8989b2c51838ae5a1e7f25e398f" + integrity sha512-YRlQIJEyKv5Ai0OAGzgm3pwRTQ9PkAb/pTxGrK12R2YIOTPPfpRfEyK6PSjlt/OGOiFHk2phhW48QjqWBDER+g== dependencies: - "@abp/clipboard" "~7.1.0" - "@abp/prismjs" "~7.1.0" + "@abp/clipboard" "~7.1.1" + "@abp/prismjs" "~7.1.1" "@fortawesome/fontawesome-free@^5.15.4": version "5.15.4" diff --git a/npm/lerna.json b/npm/lerna.json index 2b42e55404..1221175ab6 100644 --- a/npm/lerna.json +++ b/npm/lerna.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "packages": [ "packs/*" ], diff --git a/npm/ng-packs/lerna.version.json b/npm/ng-packs/lerna.version.json index 6bcc282f46..212575a752 100644 --- a/npm/ng-packs/lerna.version.json +++ b/npm/ng-packs/lerna.version.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "packages": [ "packages/*" ], diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index ac2b8c473e..5d95c63991 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -34,8 +34,8 @@ "build:schematics": "cd scripts && yarn && yarn build:schematics && cd ..", "dev:schematics": "tsc -p packages/schematics/tsconfig.json -w", "mock:schematics": "cd scripts/mock-schematic && yarn && yarn start", - "debug:schematics": "./node_modules/.bin/ng g ./packages/schematics/src/collection.json:proxy-add --module __default --apiName __default --source __default --target __default --url https://localhost:44305 --serviceType application", - "debug:schematics-dist": "./node_modules/.bin/ng g ./dist/packages/schematics/collection.json:proxy-add --module __default --apiName __default --source __default --target __default --url http://localhost:4300 --service-type application", + "debug:schematics": "./node_modules/.bin/ng g ./packages/schematics/src/collection.json:proxy-add --module __default --apiName __default --source __default --target __default --url https://localhost:44305 --serviceType application --entryPoint __default ", + "debug:schematics-dist": "./node_modules/.bin/ng g ./dist/packages/schematics/collection.json:proxy-add --module __default --apiName __default --source __default --target __default --url http://localhost:4300 --service-type application --entryPoint __default", "ci": "yarn affected:lint && yarn affected:build && yarn affected:test", "lerna": "lerna", "migrate-nx": "yarn nx migrate --run-migrations", @@ -43,7 +43,7 @@ }, "private": true, "devDependencies": { - "@abp/utils": "~7.1.0", + "@abp/utils": "~7.1.1", "@angular-devkit/build-angular": "~15.0.1", "@angular-devkit/build-ng-packagr": "^0.1002.0", "@angular-devkit/schematics-cli": "~15.0.1", @@ -62,18 +62,18 @@ "@angular/platform-browser": "~15.0.1", "@angular/platform-browser-dynamic": "~15.0.1", "@angular/router": "~15.0.1", - "@abp/ng.account": "~7.1.0", - "@abp/ng.account.core": "~7.1.0", - "@abp/ng.core": "~7.1.0", - "@abp/ng.oauth": "~7.1.0", - "@abp/ng.feature-management": "~7.1.0", - "@abp/ng.identity": "~7.1.0", - "@abp/ng.permission-management": "~7.1.0", - "@abp/ng.schematics": "~7.1.0", - "@abp/ng.setting-management": "~7.1.0", - "@abp/ng.tenant-management": "~7.1.0", - "@abp/ng.theme.basic": "~7.1.0", - "@abp/ng.theme.shared": "~7.1.0", + "@abp/ng.account": "~7.1.1", + "@abp/ng.account.core": "~7.1.1", + "@abp/ng.core": "~7.1.1", + "@abp/ng.oauth": "~7.1.1", + "@abp/ng.feature-management": "~7.1.1", + "@abp/ng.identity": "~7.1.1", + "@abp/ng.permission-management": "~7.1.1", + "@abp/ng.schematics": "~7.1.1", + "@abp/ng.setting-management": "~7.1.1", + "@abp/ng.tenant-management": "~7.1.1", + "@abp/ng.theme.basic": "~7.1.1", + "@abp/ng.theme.shared": "~7.1.1", "@fortawesome/fontawesome-free": "^5.15.4", "@ng-bootstrap/ng-bootstrap": "^14.0.0", "@ngneat/spectator": "^10.0.0", @@ -139,4 +139,4 @@ "npx prettier --write --config .prettierrc " ] } -} \ No newline at end of file +} diff --git a/npm/ng-packs/packages/account-core/package.json b/npm/ng-packs/packages/account-core/package.json index 4774d41052..9ebfaaacad 100644 --- a/npm/ng-packs/packages/account-core/package.json +++ b/npm/ng-packs/packages/account-core/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.account.core", - "version": "7.1.0", + "version": "7.1.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": "~7.1.0", - "@abp/ng.theme.shared": "~7.1.0", + "@abp/ng.core": "~7.1.1", + "@abp/ng.theme.shared": "~7.1.1", "@angular/common": ">=12.0.0", "@angular/core": ">=12.0.0" }, diff --git a/npm/ng-packs/packages/account/package.json b/npm/ng-packs/packages/account/package.json index cb0251608c..38a568ce31 100644 --- a/npm/ng-packs/packages/account/package.json +++ b/npm/ng-packs/packages/account/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.account", - "version": "7.1.0", + "version": "7.1.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~7.1.0", - "@abp/ng.theme.shared": "~7.1.0", + "@abp/ng.account.core": "~7.1.1", + "@abp/ng.theme.shared": "~7.1.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/components/package.json b/npm/ng-packs/packages/components/package.json index 4995d1f22c..8c07ea8c96 100644 --- a/npm/ng-packs/packages/components/package.json +++ b/npm/ng-packs/packages/components/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.components", - "version": "7.1.0", + "version": "7.1.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "peerDependencies": { - "@abp/ng.core": ">=7.1.0", - "@abp/ng.theme.shared": ">=7.1.0", + "@abp/ng.core": ">=7.1.1", + "@abp/ng.theme.shared": ">=7.1.1", "@ng-bootstrap/ng-bootstrap": ">=10.0.0" }, "dependencies": { diff --git a/npm/ng-packs/packages/core/package.json b/npm/ng-packs/packages/core/package.json index 311072add6..e89e42f1b5 100644 --- a/npm/ng-packs/packages/core/package.json +++ b/npm/ng-packs/packages/core/package.json @@ -1,13 +1,13 @@ { "name": "@abp/ng.core", - "version": "7.1.0", + "version": "7.1.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/utils": "~7.1.0", + "@abp/utils": "~7.1.1", "angular-oauth2-oidc": "^15.0.1", "just-clone": "^6.1.1", "just-compare": "^2.3.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 e3cd895022..c2d497ae7b 100644 --- a/npm/ng-packs/packages/core/src/lib/core.module.ts +++ b/npm/ng-packs/packages/core/src/lib/core.module.ts @@ -24,6 +24,7 @@ import { ToInjectorPipe } from './pipes/to-injector.pipe'; import { CookieLanguageProvider } from './providers/cookie-language.provider'; import { LocaleProvider } from './providers/locale.provider'; import { LocalizationService } from './services/localization.service'; +import { OTHERS_GROUP } from './tokens'; import { localizationContributor, LOCALIZATIONS } from './tokens/localization.token'; import { CORE_OPTIONS, coreOptionsFactory } from './tokens/options.token'; import { TENANT_KEY } from './tokens/tenant-key.token'; @@ -33,6 +34,7 @@ import { getInitialData, localeInitializer } from './utils/initial-utils'; import { ShortDateTimePipe } from './pipes/short-date-time.pipe'; import { ShortTimePipe } from './pipes/short-time.pipe'; import { ShortDatePipe } from './pipes/short-date.pipe'; +import { SafeHtmlPipe } from './pipes/safe-html.pipe'; import { QUEUE_MANAGER } from './tokens/queue.token'; import { DefaultQueueManager } from './utils/queue'; import { IncludeLocalizationResourcesProvider } from './providers/include-localization-resources.provider'; @@ -63,6 +65,7 @@ import { IncludeLocalizationResourcesProvider } from './providers/include-locali ReplaceableTemplateDirective, RouterOutletComponent, SortPipe, + SafeHtmlPipe, StopPropagationDirective, ToInjectorPipe, ShortDateTimePipe, @@ -90,6 +93,7 @@ import { IncludeLocalizationResourcesProvider } from './providers/include-locali ReplaceableTemplateDirective, RouterOutletComponent, SortPipe, + SafeHtmlPipe, StopPropagationDirective, ToInjectorPipe, ShortDateTimePipe, @@ -176,6 +180,10 @@ export class CoreModule { provide: QUEUE_MANAGER, useClass: DefaultQueueManager, }, + { + provide: OTHERS_GROUP, + useValue: options.othersGroup || 'AbpUi::OthersGroup', + }, IncludeLocalizationResourcesProvider, ], }; 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 12318357dd..7a285b4461 100644 --- a/npm/ng-packs/packages/core/src/lib/models/common.ts +++ b/npm/ng-packs/packages/core/src/lib/models/common.ts @@ -12,6 +12,7 @@ export namespace ABP { sendNullsAsQueryParam?: boolean; tenantKey?: string; localizations?: Localization[]; + othersGroup?: string; } export interface Child { @@ -70,6 +71,7 @@ export namespace ABP { path?: string; layout?: eLayoutType; iconClass?: string; + group?: string; } export interface Tab extends Nav { diff --git a/npm/ng-packs/packages/core/src/lib/models/rest.ts b/npm/ng-packs/packages/core/src/lib/models/rest.ts index c5517ffa98..74cc3407f0 100644 --- a/npm/ng-packs/packages/core/src/lib/models/rest.ts +++ b/npm/ng-packs/packages/core/src/lib/models/rest.ts @@ -4,6 +4,7 @@ export namespace Rest { export type Config = Partial<{ apiName: string; skipHandleError: boolean; + skipAddingHeader: boolean; observe: Observe; httpParamEncoder?: HttpParameterCodec; }>; diff --git a/npm/ng-packs/packages/core/src/lib/pipes/index.ts b/npm/ng-packs/packages/core/src/lib/pipes/index.ts index 71ce383cd3..1a981ca041 100644 --- a/npm/ng-packs/packages/core/src/lib/pipes/index.ts +++ b/npm/ng-packs/packages/core/src/lib/pipes/index.ts @@ -1,4 +1,5 @@ export * from './localization.pipe'; +export * from './safe-html.pipe'; export * from './sort.pipe'; export * from './to-injector.pipe'; export * from './short-date.pipe'; diff --git a/npm/ng-packs/packages/core/src/lib/pipes/safe-html.pipe.ts b/npm/ng-packs/packages/core/src/lib/pipes/safe-html.pipe.ts new file mode 100644 index 0000000000..c8445e8390 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/pipes/safe-html.pipe.ts @@ -0,0 +1,13 @@ +import { inject, Injectable, Pipe, PipeTransform, SecurityContext } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; + +@Injectable() +@Pipe({ name: 'abpSafeHtml' }) +export class SafeHtmlPipe implements PipeTransform { + private readonly sanitizer = inject(DomSanitizer); + + transform(value: string): string { + if (typeof value !== 'string') return ''; + return this.sanitizer.sanitize(SecurityContext.HTML, value); + } +} diff --git a/npm/ng-packs/packages/core/src/lib/services/rest.service.ts b/npm/ng-packs/packages/core/src/lib/services/rest.service.ts index e9a6e89851..a7ee7a491b 100644 --- a/npm/ng-packs/packages/core/src/lib/services/rest.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/rest.service.ts @@ -2,6 +2,7 @@ import { HttpClient, HttpParameterCodec, HttpParams, HttpRequest } from '@angula import { Inject, Injectable } from '@angular/core'; import { Observable, throwError } from 'rxjs'; import { catchError } from 'rxjs/operators'; +import { ExternalHttpClient } from '../clients/http.client'; import { ABP } from '../models/common'; import { Rest } from '../models/rest'; import { CORE_OPTIONS } from '../tokens/options.token'; @@ -16,6 +17,7 @@ export class RestService { constructor( @Inject(CORE_OPTIONS) protected options: ABP.Root, protected http: HttpClient, + protected externalHttp: ExternalHttpClient, protected environment: EnvironmentService, protected httpErrorReporter: HttpErrorReporterService, ) {} @@ -39,7 +41,9 @@ export class RestService { const { method, params, ...options } = request; const { observe = Rest.Observe.Body, skipHandleError } = config; const url = this.removeDuplicateSlashes(api + request.url); - return this.http + + const httpClient: HttpClient = this.getHttpClient(config.skipAddingHeader); + return httpClient .request(method, url, { observe, ...(params && { @@ -49,6 +53,9 @@ export class RestService { } as any) .pipe(catchError(err => (skipHandleError ? throwError(err) : this.handleError(err)))); } + private getHttpClient(isExternal: boolean) { + return isExternal ? this.externalHttp : this.http; + } private getParams(params: Rest.Params, encoder?: HttpParameterCodec): HttpParams { const filteredParams = Object.entries(params).reduce((acc, [key, value]) => { diff --git a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts index 32f8b473d0..329d2a370c 100644 --- a/npm/ng-packs/packages/core/src/lib/services/routes.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/routes.service.ts @@ -1,13 +1,20 @@ import { Injectable, Injector, OnDestroy } from '@angular/core'; -import { BehaviorSubject, Observable, Subscription } from 'rxjs'; +import { BehaviorSubject, Observable, Subscription, map } from 'rxjs'; import { ABP } from '../models/common'; +import { OTHERS_GROUP } from '../tokens'; import { pushValueTo } from '../utils/array-utils'; -import { BaseTreeNode, createTreeFromList, TreeNode } from '../utils/tree-utils'; +import { + BaseTreeNode, + createTreeFromList, + TreeNode, + RouteGroup, + createGroupMap, +} from '../utils/tree-utils'; import { ConfigStateService } from './config-state.service'; import { PermissionService } from './permission.service'; // eslint-disable-next-line @typescript-eslint/ban-types -export abstract class AbstractTreeService { +export abstract class AbstractTreeService { abstract id: string; abstract parentId: string; abstract hide: (item: T) => boolean; @@ -17,6 +24,8 @@ export abstract class AbstractTreeService[]>([]); private _visible$ = new BehaviorSubject[]>([]); + protected othersGroup: string; + get flat(): T[] { return this._flat$.value; } @@ -50,6 +59,15 @@ export abstract class AbstractTreeService[]): RouteGroup[] | undefined { + const map = createGroupMap(list, this.othersGroup); + if (!map) { + return undefined; + } + + return Array.from(map, ([key, items]) => ({ group: key, items })); + } + private filterWith(setOrMap: Set | Map): T[] { return this._flat$.value.filter(item => !setOrMap.has(item[this.id])); } @@ -157,6 +175,7 @@ export abstract class AbstractNavTreeService .createOnUpdateStream(state => state) .subscribe(() => this.refresh()); this.permissionService = injector.get(PermissionService); + this.othersGroup = injector.get(OTHERS_GROUP); } protected isGranted({ requiredPolicy }: T): boolean { @@ -180,4 +199,19 @@ export abstract class AbstractNavTreeService } @Injectable({ providedIn: 'root' }) -export class RoutesService extends AbstractNavTreeService {} +export class RoutesService extends AbstractNavTreeService { + private hasPathOrChild(item: TreeNode): boolean { + return Boolean(item.path) || this.hasChildren(item.name); + } + + get groupedVisible(): RouteGroup[] | undefined { + return this.createGroupedTree(this.visible.filter(item => this.hasPathOrChild(item))); + } + + get groupedVisible$(): Observable[] | undefined> { + return this.visible$.pipe( + map(items => items.filter(item => this.hasPathOrChild(item))), + map(visible => this.createGroupedTree(visible)), + ); + } +} diff --git a/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts index 51c81a5b3c..ab9c6a76ae 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/routes.service.spec.ts @@ -1,4 +1,4 @@ -import { Subject } from 'rxjs'; +import { Subject, lastValueFrom } from 'rxjs'; import { take } from 'rxjs/operators'; import { RoutesService } from '../services/routes.service'; import { DummyInjector } from './utils/common.utils'; @@ -10,6 +10,7 @@ export const mockRoutesService = (injectorPayload = {} as { [key: string]: any } const injector = new DummyInjector({ PermissionService: mockPermissionService(), ConfigStateService: { createOnUpdateStream: () => updateStream$ }, + OTHERS_GROUP: 'OthersGroup', ...injectorPayload, }); return new RoutesService(injector); @@ -17,6 +18,11 @@ export const mockRoutesService = (injectorPayload = {} as { [key: string]: any } describe('Routes Service', () => { let service: RoutesService; + + const fooGroup = 'FooGroup'; + const barGroup = 'BarGroup'; + const othersGroup = 'OthersGroup'; + const routes = [ { path: '/foo', name: 'foo' }, { path: '/foo/bar', name: 'bar', parentName: 'foo', invisible: true, order: 2 }, @@ -25,6 +31,14 @@ describe('Routes Service', () => { { path: '/foo/x', name: 'x', parentName: 'foo', order: 1 }, ]; + const groupedRoutes = [ + { path: '/foo', name: 'foo', group: fooGroup }, + { path: '/foo/y', name: 'y', parentName: 'foo' }, + { path: '/foo/bar', name: 'bar', group: barGroup }, + { path: '/foo/bar/baz', name: 'baz', group: barGroup }, + { path: '/foo/z', name: 'z' }, + ]; + beforeEach(() => { service = mockRoutesService(); }); @@ -33,9 +47,9 @@ describe('Routes Service', () => { it('should add given routes as flat$, tree$, and visible$', async () => { service.add(routes); - const flat = await service.flat$.pipe(take(1)).toPromise(); - const tree = await service.tree$.pipe(take(1)).toPromise(); - const visible = await service.visible$.pipe(take(1)).toPromise(); + const flat = await lastValueFrom(service.flat$.pipe(take(1))); + const tree = await lastValueFrom(service.tree$.pipe(take(1))); + const visible = await lastValueFrom(service.visible$.pipe(take(1))); expect(flat.length).toBe(5); expect(flat[0].name).toBe('baz'); @@ -59,6 +73,52 @@ describe('Routes Service', () => { }); }); + describe('#groupedVisible', () => { + it('should return undefined when there are no visible routes', async () => { + service.add(routes); + const result = await lastValueFrom(service.groupedVisible$.pipe(take(1))); + expect(result).toBeUndefined(); + }); + + it( + 'should group visible routes under "' + othersGroup + '" when no group is specified', + async () => { + service.add([ + { path: '/foo', name: 'foo' }, + { path: '/foo/bar', name: 'bar', group: '' }, + { path: '/foo/bar/baz', name: 'baz', group: undefined }, + { path: '/x', name: 'y', group: 'z' }, + ]); + + const result = await lastValueFrom(service.groupedVisible$.pipe(take(1))); + + expect(result[0].group).toBe(othersGroup); + expect(result[0].items[0].name).toBe('foo'); + expect(result[0].items[1].name).toBe('bar'); + expect(result[0].items[2].name).toBe('baz'); + }, + ); + + it('should return grouped route list', async () => { + service.add(groupedRoutes); + + const tree = await lastValueFrom(service.groupedVisible$.pipe(take(1))); + + expect(tree.length).toBe(3); + + expect(tree[0].group).toBe('FooGroup'); + expect(tree[0].items[0].name).toBe('foo'); + expect(tree[0].items[0].children[0].name).toBe('y'); + + expect(tree[1].group).toBe('BarGroup'); + expect(tree[1].items[0].name).toBe('bar'); + expect(tree[1].items[1].name).toBe('baz'); + + expect(tree[2].group).toBe(othersGroup); + expect(tree[2].items[0].name).toBe('z'); + }); + }); + describe('#find', () => { it('should return node found based on query', () => { service.add(routes); diff --git a/npm/ng-packs/packages/core/src/lib/tests/safe-html.pipe.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/safe-html.pipe.spec.ts new file mode 100644 index 0000000000..34d372ebbb --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tests/safe-html.pipe.spec.ts @@ -0,0 +1,34 @@ +import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest'; +import { SafeHtmlPipe } from '../pipes'; + +describe('SafeHtmlPipe', () => { + let pipe: SafeHtmlPipe; + let spectator: SpectatorService; + const createService = createServiceFactory(SafeHtmlPipe); + + beforeEach(() => { + spectator = createService(); + pipe = spectator.service; + }); + + it('should create an instance', () => { + expect(pipe).toBeTruthy(); + }); + + test.each([42, false, {}, []])('should return empty string for "%p" input', input => { + const result = pipe.transform(input as any); + expect(result).toBe(''); + }); + + it('should be equals with input after sanitized', () => { + const input = '

Hello world!

'; + const result = pipe.transform(input); + expect(result).toEqual(input); + }); + + it('should sanitize unsafe HTML content', () => { + const input = `

Click here!

`; + const result = pipe.transform(input); + expect(result).toBe(`

Click here!

`); + }); +}); diff --git a/npm/ng-packs/packages/core/src/lib/tests/utils/common.utils.ts b/npm/ng-packs/packages/core/src/lib/tests/utils/common.utils.ts index e568b63a17..01612a987e 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/utils/common.utils.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/utils/common.utils.ts @@ -14,6 +14,6 @@ export class DummyInjector extends Injector { ): T; get(token: any, notFoundValue?: any): any; get(token, notFoundValue?, flags?: InjectFlags): any { - return this.payload[token.name || token]; + return this.payload[token.name || token._desc || token]; } } diff --git a/npm/ng-packs/packages/core/src/lib/tokens/index.ts b/npm/ng-packs/packages/core/src/lib/tokens/index.ts index f0e724259a..d01f652b98 100644 --- a/npm/ng-packs/packages/core/src/lib/tokens/index.ts +++ b/npm/ng-packs/packages/core/src/lib/tokens/index.ts @@ -12,3 +12,4 @@ export * from './pipe-to-login.token'; export * from './set-token-response-to-storage.token'; export * from './check-authentication-state'; export * from './http-context.token'; +export * from './others-group.token' \ No newline at end of file diff --git a/npm/ng-packs/packages/core/src/lib/tokens/others-group.token.ts b/npm/ng-packs/packages/core/src/lib/tokens/others-group.token.ts new file mode 100644 index 0000000000..23d7d65b92 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tokens/others-group.token.ts @@ -0,0 +1,3 @@ +import { InjectionToken } from '@angular/core'; + +export const OTHERS_GROUP = new InjectionToken('OTHERS_GROUP'); diff --git a/npm/ng-packs/packages/core/src/lib/utils/tree-utils.ts b/npm/ng-packs/packages/core/src/lib/utils/tree-utils.ts index bfc938c158..8ea8cc504c 100644 --- a/npm/ng-packs/packages/core/src/lib/utils/tree-utils.ts +++ b/npm/ng-packs/packages/core/src/lib/utils/tree-utils.ts @@ -1,3 +1,5 @@ +import { isArray } from './common-utils'; + /* eslint-disable @typescript-eslint/ban-types */ export class BaseTreeNode { children: TreeNode[] = []; @@ -74,6 +76,28 @@ export function createTreeNodeFilterCreator( }; } +export function createGroupMap( + list: TreeNode[], + othersGroupKey: string, +) { + if (!isArray(list) || !list.some(node => Boolean(node.group))) return undefined; + + const mapGroup = new Map[]>(); + + for (const node of list) { + const group = node?.group || othersGroupKey; + if (typeof group !== 'string') { + throw new Error(`Invalid group: ${group}`); + } + + const items = mapGroup.get(group) || []; + items.push(node); + mapGroup.set(group, items); + } + + return mapGroup; +} + export type TreeNode = { [K in keyof T]: T[K]; } & { @@ -82,6 +106,11 @@ export type TreeNode = { parent?: TreeNode; }; +export type RouteGroup = { + readonly group: string; + readonly items: TreeNode[]; +}; + export type NodeKey = number | string | symbol | undefined | null; export type NodeValue any> = F extends undefined diff --git a/npm/ng-packs/packages/core/testing/src/lib/services/mock-rest.service.ts b/npm/ng-packs/packages/core/testing/src/lib/services/mock-rest.service.ts index 65e1763817..7fd171c1d4 100644 --- a/npm/ng-packs/packages/core/testing/src/lib/services/mock-rest.service.ts +++ b/npm/ng-packs/packages/core/testing/src/lib/services/mock-rest.service.ts @@ -2,6 +2,7 @@ import { ABP, CORE_OPTIONS, EnvironmentService, + ExternalHttpClient, HttpErrorReporterService, RestService, } from '@abp/ng.core'; @@ -16,9 +17,10 @@ export class MockRestService extends RestService { constructor( @Inject(CORE_OPTIONS) protected options: ABP.Root, protected http: HttpClient, + protected externalhttp: ExternalHttpClient, protected environment: EnvironmentService, ) { - super(options, http, environment, null as unknown as HttpErrorReporterService); + super(options, http,externalhttp, environment, null as unknown as HttpErrorReporterService); } handleError(err: any): Observable { diff --git a/npm/ng-packs/packages/feature-management/package.json b/npm/ng-packs/packages/feature-management/package.json index e7048b4653..c365e2fcb2 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": "7.1.0", + "version": "7.1.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~7.1.0", + "@abp/ng.theme.shared": "~7.1.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/identity/package.json b/npm/ng-packs/packages/identity/package.json index a1a1b2e0ba..47b715c5ea 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": "7.1.0", + "version": "7.1.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.permission-management": "~7.1.0", - "@abp/ng.theme.shared": "~7.1.0", + "@abp/ng.permission-management": "~7.1.1", + "@abp/ng.theme.shared": "~7.1.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/oauth/package.json b/npm/ng-packs/packages/oauth/package.json index 1627456be5..675e6879c0 100644 --- a/npm/ng-packs/packages/oauth/package.json +++ b/npm/ng-packs/packages/oauth/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.oauth", - "version": "7.1.0", + "version": "7.1.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.core": "~7.1.0", - "@abp/utils": "~7.1.0", + "@abp/ng.core": "~7.1.1", + "@abp/utils": "~7.1.1", "angular-oauth2-oidc": "^15.0.1", "just-clone": "^6.1.1", "just-compare": "^1.4.0", diff --git a/npm/ng-packs/packages/permission-management/package.json b/npm/ng-packs/packages/permission-management/package.json index 80868afdc8..0e0431c154 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": "7.1.0", + "version": "7.1.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.theme.shared": "~7.1.0", + "@abp/ng.theme.shared": "~7.1.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/schematics/package.json b/npm/ng-packs/packages/schematics/package.json index 6c63e9af86..9ae4303046 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": "7.1.0", + "version": "7.1.1", "description": "Schematics that works with ABP Backend", "keywords": [ "schematics" diff --git a/npm/ng-packs/packages/schematics/src/commands/api/files-service/proxy/__namespace@dir__/__name@kebab__.service.ts.template b/npm/ng-packs/packages/schematics/src/commands/api/files-service/proxy/__namespace@dir__/__name@kebab__.service.ts.template index 1e1cc4564a..aae3b43471 100644 --- a/npm/ng-packs/packages/schematics/src/commands/api/files-service/proxy/__namespace@dir__/__name@kebab__.service.ts.template +++ b/npm/ng-packs/packages/schematics/src/commands/api/files-service/proxy/__namespace@dir__/__name@kebab__.service.ts.template @@ -25,7 +25,7 @@ export class <%= name %>Service { if (body.body) { %> body: <%= body.body %>,<% } %> }, - { apiName: this.apiName });<% } %> + { apiName: this.apiName,...config });<% } %> constructor(private restService: RestService) {} } diff --git a/npm/ng-packs/packages/schematics/src/utils/service.ts b/npm/ng-packs/packages/schematics/src/utils/service.ts index 28ce82e3f7..0b633a8dd5 100644 --- a/npm/ng-packs/packages/schematics/src/utils/service.ts +++ b/npm/ng-packs/packages/schematics/src/utils/service.ts @@ -22,7 +22,7 @@ import { } from './type'; import { eBindingSourceId } from '../enums'; import { camelizeHyphen } from './text'; -import {VOLO_REMOTE_STREAM_CONTENT} from "../constants"; +import { VOLO_REMOTE_STREAM_CONTENT } from '../constants'; export function serializeParameters(parameters: Property[]) { return parameters.map(p => p.name + p.optional + ': ' + p.type + p.default, '').join(', '); @@ -39,9 +39,12 @@ export function createControllerToServiceMapper({ const name = controller.controllerName; const namespace = parseNamespace(solution, controller.type); const actions = Object.values(controller.actions); - const typeWithoutIRemoteStreamContent = getTypesWithoutIRemoteStreamContent(types) - const imports = actions.reduce(createActionToImportsReducer(solution, typeWithoutIRemoteStreamContent, namespace), []); - imports.push(new Import({ path: '@abp/ng.core', specifiers: ['RestService'] })); + const typeWithoutIRemoteStreamContent = getTypesWithoutIRemoteStreamContent(types); + const imports = actions.reduce( + createActionToImportsReducer(solution, typeWithoutIRemoteStreamContent, namespace), + [], + ); + imports.push(new Import({ path: '@abp/ng.core', specifiers: ['RestService', 'Rest'] })); imports.push(new Import({ path: '@angular/core', specifiers: ['Injectable'] })); sortImports(imports); const methods = actions.map(mapActionToMethod); @@ -51,9 +54,9 @@ export function createControllerToServiceMapper({ } function getTypesWithoutIRemoteStreamContent(types: Record) { - const newType = {...types} - delete newType[VOLO_REMOTE_STREAM_CONTENT] - return newType + const newType = { ...types }; + delete newType[VOLO_REMOTE_STREAM_CONTENT]; + return newType; } function sortMethods(methods: Method[]) { methods.sort((a, b) => (a.signature.name > b.signature.name ? 1 : -1)); @@ -76,7 +79,7 @@ export function createActionToBodyMapper() { return ({ httpMethod, parameters, returnValue, url }: Action) => { const responseType = adaptType(returnValue.typeSimple); const responseTypeWithNamespace = returnValue.typeSimple; - const body = new Body({ method: httpMethod, responseType, url ,responseTypeWithNamespace}); + const body = new Body({ method: httpMethod, responseType, url, responseTypeWithNamespace }); parameters.forEach(body.registerActionParameter); @@ -90,6 +93,8 @@ export function createActionToSignatureMapper() { return (action: Action) => { const signature = new Signature({ name: getMethodNameFromAction(action) }); const versionParameter = getVersionParameter(action); + const restConfig = new Property({ name: 'config', type: 'Partial' }); + restConfig.setOptional(true); const parameters = [ ...action.parametersOnMethod, ...(versionParameter ? [versionParameter] : []), @@ -101,6 +106,7 @@ export function createActionToSignatureMapper() { parameter.setOptional(p.isOptional); return parameter; }); + signature.parameters.push(restConfig); return signature; }; diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json index b4fa649cff..ebb9b30826 100644 --- a/npm/ng-packs/packages/setting-management/package.json +++ b/npm/ng-packs/packages/setting-management/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.setting-management", - "version": "7.1.0", + "version": "7.1.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.components": "~7.1.0", - "@abp/ng.theme.shared": "~7.1.0", + "@abp/ng.components": "~7.1.1", + "@abp/ng.theme.shared": "~7.1.1", "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 134a95db6f..f8dd446f3f 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": "7.1.0", + "version": "7.1.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.feature-management": "~7.1.0", - "@abp/ng.theme.shared": "~7.1.0", + "@abp/ng.feature-management": "~7.1.1", + "@abp/ng.theme.shared": "~7.1.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-basic/package.json b/npm/ng-packs/packages/theme-basic/package.json index 7a2745e858..c053c88967 100644 --- a/npm/ng-packs/packages/theme-basic/package.json +++ b/npm/ng-packs/packages/theme-basic/package.json @@ -1,14 +1,14 @@ { "name": "@abp/ng.theme.basic", - "version": "7.1.0", + "version": "7.1.1", "homepage": "https://abp.io", "repository": { "type": "git", "url": "https://github.com/abpframework/abp.git" }, "dependencies": { - "@abp/ng.account.core": "~7.1.0", - "@abp/ng.theme.shared": "~7.1.0", + "@abp/ng.account.core": "~7.1.1", + "@abp/ng.theme.shared": "~7.1.1", "tslib": "^2.0.0" }, "publishConfig": { diff --git a/npm/ng-packs/packages/theme-basic/src/lib/components/page-alert-container/page-alert-container.component.html b/npm/ng-packs/packages/theme-basic/src/lib/components/page-alert-container/page-alert-container.component.html index 53041e91dc..914e803f95 100644 --- a/npm/ng-packs/packages/theme-basic/src/lib/components/page-alert-container/page-alert-container.component.html +++ b/npm/ng-packs/packages/theme-basic/src/lib/components/page-alert-container/page-alert-container.component.html @@ -4,10 +4,14 @@ [ngClass]="{ 'alert-dismissible fade show': alert.dismissible }" role="alert" > -

- {{ alert.title | abpLocalization: alert.titleLocalizationParams }} -

- {{ alert.message | abpLocalization: alert.messageLocalizationParams }} +

+
`, - host: { - class: 'card-body', - } + template: `
+ +
`, }) export class CardBodyComponent { + @HostBinding('class') componentClass = 'card-body'; @Input() cardBodyClass: string; @Input() cardBodyStyle: string; } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-footer.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-footer.component.ts index ed5f0c64f3..d82a8725c1 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-footer.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-footer.component.ts @@ -1,19 +1,16 @@ -import { Component, Input } from '@angular/core'; +import { Component, HostBinding, Input } from '@angular/core'; @Component({ selector: 'abp-card-footer', template: ` -
- +
+
`, styles: [], - host: { - class: 'card-footer', - } }) export class CardFooterComponent { + @HostBinding('class') componentClass = 'card-footer'; @Input() cardFooterStyle: string; @Input() cardFooterClass: string; - } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-header.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-header.component.ts index 1ec374757c..7dfb75b2d9 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-header.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-header.component.ts @@ -1,18 +1,16 @@ -import { Component, Input } from '@angular/core'; +import { Component, HostBinding, Input } from '@angular/core'; @Component({ selector: 'abp-card-header', template: `
- +
`, styles: [], - host: { - class: 'card-header', - } }) export class CardHeaderComponent { + @HostBinding('class') componentClass = 'card-header'; @Input() cardHeaderClass: string; @Input() cardHeaderStyle: string; } diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-header.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-header.directive.ts index e7ecbfd881..44b8ff0eb5 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-header.directive.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-header.directive.ts @@ -1,9 +1,8 @@ -import { Directive } from "@angular/core"; +import { Directive, HostBinding } from '@angular/core'; @Directive({ selector: `abp-card-header, [abp-card-header], [abpCardHeader]`, - host: { - class: 'card-header', - }, }) -export class CardHeader {} +export class CardHeaderDirective { + @HostBinding('class') directiveClass = 'card-header'; +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-img-top.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-img-top.directive.ts index 384f9f3989..405ea1bb24 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-img-top.directive.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-img-top.directive.ts @@ -1,9 +1,8 @@ -import { Directive } from "@angular/core"; +import { Directive, HostBinding } from '@angular/core'; @Directive({ selector: `abp-card-img-top, [abp-card-img-top], [abpCardImgTop]`, - host: { - class: 'card-img-top', - }, }) -export class CardImgTop {} +export class CardImgTopDirective { + @HostBinding('class') directiveClass = 'card-img-top'; +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-subtitle.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-subtitle.directive.ts index 862a439ea8..57ba722500 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-subtitle.directive.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-subtitle.directive.ts @@ -1,9 +1,8 @@ -import { Directive } from "@angular/core"; +import { Directive, HostBinding } from '@angular/core'; @Directive({ selector: `abp-card-subtitle, [abp-card-subtitle], [abpCardSubtitle]`, - host: { - class: 'card-subtitle', - }, }) -export class CardSubtitle {} +export class CardSubtitleDirective { + @HostBinding('class') directiveClass = 'card-subtitle'; +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-title.directive.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-title.directive.ts index 143a868b64..0bb92d9263 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-title.directive.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card-title.directive.ts @@ -1,9 +1,8 @@ -import { Directive } from "@angular/core"; +import { Directive, HostBinding } from '@angular/core'; @Directive({ selector: `abp-card-title, [abp-card-title], [abpCardTitle]`, - host: { - class: 'card-title', - }, }) -export class CardTitle {} \ No newline at end of file +export class CardTitleDirective { + @HostBinding('class') directiveClass = 'card-title'; +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.component.ts index 149866bff0..fc5279be66 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.component.ts @@ -1,5 +1,4 @@ -import { Component, Directive, Input } from '@angular/core'; - +import { Component, Input } from '@angular/core'; @Component({ selector: 'abp-card', diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.module.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.module.ts index 1a3e62113c..ac7e28e568 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.module.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/card/card.module.ts @@ -4,20 +4,20 @@ import { CardBodyComponent } from './card-body.component'; import { CardComponent } from './card.component'; import { CardHeaderComponent } from './card-header.component'; import { CardFooterComponent } from './card-footer.component'; -import { CardTitle } from './card-title.directive'; -import { CardSubtitle } from './card-subtitle.directive'; -import { CardImgTop } from './card-img-top.directive'; -import { CardHeader } from './card-header.directive'; +import { CardTitleDirective } from './card-title.directive'; +import { CardSubtitleDirective } from './card-subtitle.directive'; +import { CardImgTopDirective } from './card-img-top.directive'; +import { CardHeaderDirective } from './card-header.directive'; const declarationsWithExports = [ CardComponent, CardBodyComponent, CardHeaderComponent, CardFooterComponent, - CardTitle, - CardSubtitle, - CardImgTop, - CardHeader, + CardTitleDirective, + CardSubtitleDirective, + CardImgTopDirective, + CardHeaderDirective, ]; @NgModule({ @@ -25,4 +25,4 @@ const declarationsWithExports = [ imports: [CommonModule], exports: [...declarationsWithExports], }) -export class CardModule { } +export class CardModule {} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/checkbox/checkbox.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/checkbox/checkbox.component.ts index db208354ba..ee2dd5aeac 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/checkbox/checkbox.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/checkbox/checkbox.component.ts @@ -33,7 +33,12 @@ export class FormCheckboxComponent extends AbstractNgModelComponent { @Input() label?: string; @Input() labelClass = 'form-check-label'; @Input() checkboxId!: string; - @Input() checkboxStyle = ''; + @Input() checkboxStyle: + | { + [klass: string]: any; + } + | null + | undefined; @Input() checkboxClass = 'form-check-input'; @Input() checkboxReadonly = false; @Output() checkboxBlur = new EventEmitter(); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/form-input/form-input.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/form-input/form-input.component.ts index 23b18a5486..991383fe5a 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/components/form-input/form-input.component.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/form-input/form-input.component.ts @@ -37,7 +37,12 @@ export class FormInputComponent extends AbstractNgModelComponent { @Input() labelClass = 'form-label'; @Input() inputPlaceholder = ''; @Input() inputType = 'text'; - @Input() inputStyle = ''; + @Input() inputStyle: + | { + [klass: string]: any; + } + | null + | undefined; @Input() inputClass = 'form-control'; @Output() formBlur = new EventEmitter(); @Output() formFocus = new EventEmitter(); 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 ce5647bccd..4f833fe0f1 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 @@ -147,6 +147,8 @@ export class ErrorHandler { this.navigateToLogin(); }); } + } if(err instanceof HttpErrorResponse && err.headers.get('Abp-Tenant-Resolve-Error')){ + this.authService.logout().subscribe(); } else { switch (err.status) { case 401: @@ -176,7 +178,7 @@ export class ErrorHandler { status: 403, }); break; - case 404: + case 404:{ this.canCreateCustomError(404) ? this.show404Page() : this.showError( @@ -189,7 +191,9 @@ export class ErrorHandler { defaultValue: DEFAULT_ERROR_MESSAGES.defaultError404.title, }, ); - break; + break; + } + case 500: this.createErrorComponent({ title: { diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/card-body.component.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/card-body.component.spec.ts new file mode 100644 index 0000000000..83cc302625 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/card-body.component.spec.ts @@ -0,0 +1,46 @@ +import { createHostFactory, SpectatorHost } from '@ngneat/spectator'; +import { CardBodyComponent } from '../components'; + +describe('AbpCardBodyComponent', () => { + let spectator: SpectatorHost; + + const createHost = createHostFactory(CardBodyComponent); + + beforeEach( + () => + (spectator = createHost( + ` +

Body

+
`, + { + hostProps: { attributes: { autofocus: '', name: 'abp-card-body' } }, + }, + )), + ); + + it('should create an instance', () => { + expect(spectator).toBeTruthy(); + }); + + it('should have class card-body', () => { + expect(spectator.element.classList).toContain('card-body'); + }); + + it('should have div', () => { + expect(spectator.query('div')).toBeTruthy(); + }); + + it('should have background-color red', () => { + expect((spectator.query('div') as HTMLElement).style.backgroundColor).toEqual('red'); + }); + + it('should have p tag', () => { + expect(spectator.query('p')).toBeTruthy(); + }); + + it('should have p tag with Body text', () => { + expect(spectator.query('p').textContent).toContain('Body'); + }); +}); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/card-footer.component.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/card-footer.component.spec.ts new file mode 100644 index 0000000000..2b98479b9f --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/card-footer.component.spec.ts @@ -0,0 +1,46 @@ +import { createHostFactory, SpectatorHost } from '@ngneat/spectator'; +import { CardFooterComponent } from '../components'; + +describe('AbpCardFooterComponent', () => { + let spectator: SpectatorHost; + + const createHost = createHostFactory(CardFooterComponent); + + beforeEach( + () => + (spectator = createHost( + ` +

Footer

+
`, + { + hostProps: { attributes: { autofocus: '', name: 'abp-card-footer' } }, + }, + )), + ); + + it('should create an instance', () => { + expect(spectator).toBeTruthy(); + }); + + it('should have class card-footer', () => { + expect(spectator.element.classList).toContain('card-footer'); + }); + + it('should have div', () => { + expect(spectator.query('div')).toBeTruthy(); + }); + + it('should have background-color red', () => { + expect((spectator.query('div') as HTMLElement).style.backgroundColor).toEqual('red'); + }); + + it('should have p tag', () => { + expect(spectator.query('p')).toBeTruthy(); + }); + + it('should have p tag with Footer text', () => { + expect((spectator.query('p') as HTMLElement).textContent).toContain('Footer'); + }); +}); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/card-header.component.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/card-header.component.spec.ts new file mode 100644 index 0000000000..279cfe90bf --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/card-header.component.spec.ts @@ -0,0 +1,37 @@ +import { createHostFactory, SpectatorHost } from '@ngneat/spectator'; +import { CardHeaderComponent } from '../components'; + +describe('AbpCardHeaderComponent', () => { + let spectator: SpectatorHost; + const createHost = createHostFactory(CardHeaderComponent); + + beforeEach( + () => + (spectator = createHost( + ` + Header + `, + { + hostProps: { attributes: { autofocus: '', name: 'abp-card-header' } }, + }, + )), + ); + + it('should create an instance', () => { + expect(spectator).toBeTruthy(); + }); + + it('should have class card-header', () => { + expect(spectator.element.classList).toContain('card-header'); + }); + + it('should have background-color red', () => { + expect((spectator.query('div') as HTMLElement).style.backgroundColor).toEqual('red'); + }); + + it('should have Header text', () => { + expect(spectator.element.textContent).toContain('Header'); + }); +}); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/card-header.directive.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/card-header.directive.spec.ts new file mode 100644 index 0000000000..122de05ed8 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/card-header.directive.spec.ts @@ -0,0 +1,28 @@ +import { createHostFactory, SpectatorHost } from '@ngneat/spectator'; +import { CardHeaderDirective } from '../components'; + +describe('AbpCardHeaderDirective', () => { + let spectator: SpectatorHost; + + const createHost = createHostFactory(CardHeaderDirective); + + beforeEach( + () => + (spectator = createHost( + `
+
`, + { + hostProps: { attributes: { autofocus: '', name: 'abp-card-header' } }, + }, + )), + ); + + it('should create an instance', () => { + expect(spectator).toBeTruthy(); + }); + + it('should have class card-header', () => { + expect(spectator.element.classList).toContain('card-header'); + }); +}); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/card-img-top.directive.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/card-img-top.directive.spec.ts new file mode 100644 index 0000000000..008d9a4528 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/card-img-top.directive.spec.ts @@ -0,0 +1,25 @@ +import { createHostFactory, SpectatorHost } from '@ngneat/spectator'; +import { CardImgTopDirective } from '../components'; + +describe('AbpCardImgTopDirective', () => { + let spectator: SpectatorHost; + + const createHost = createHostFactory(CardImgTopDirective); + + beforeEach( + () => + (spectator = createHost( + ``, + )), + ); + + it('should create an instance', () => { + expect(spectator).toBeTruthy(); + }); + + it('should have class card-img-top', () => { + expect(spectator.element.classList).toContain('card-img-top'); + }); +}); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/card-subtitle.directive.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/card-subtitle.directive.spec.ts new file mode 100644 index 0000000000..004beaecae --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/card-subtitle.directive.spec.ts @@ -0,0 +1,22 @@ +import { createHostFactory, SpectatorHost } from '@ngneat/spectator'; +import { CardSubtitleDirective } from '../components'; + +describe('AbpCardSubtitleDirective', () => { + let spectator: SpectatorHost; + + const createHost = createHostFactory(CardSubtitleDirective); + + beforeEach(() => (spectator = createHost(`

CardSubtitle

`))); + + it('should create an instance', () => { + expect(spectator).toBeTruthy(); + }); + + it('should have class card-subtitle', () => { + expect(spectator.element.classList).toContain('card-subtitle'); + }); + + it('should have CardSubtitle text', () => { + expect(spectator.element.textContent).toContain('CardSubtitle'); + }); +}); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/card-title.directive.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/card-title.directive.spec.ts new file mode 100644 index 0000000000..9b9688f9e0 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/card-title.directive.spec.ts @@ -0,0 +1,18 @@ +import { createHostFactory, SpectatorHost } from '@ngneat/spectator'; +import { CardTitleDirective } from '../components'; + +describe('AbpCardTitleDirective', () => { + let spectator: SpectatorHost; + + const createHost = createHostFactory(CardTitleDirective); + + beforeEach(() => (spectator = createHost(`
CardTitle
`))); + + it('should create an instance', () => { + expect(spectator).toBeTruthy(); + }); + + it('should have class card-title', () => { + expect(spectator.element.classList).toContain('card-title'); + }); +}); diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/card.component.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/card.component.spec.ts new file mode 100644 index 0000000000..a5c8a5c43b --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/card.component.spec.ts @@ -0,0 +1,75 @@ +import { createHostFactory, SpectatorHost } from '@ngneat/spectator/jest'; +import { + CardComponent, + CardBodyComponent, + CardFooterComponent, + CardHeaderComponent, + CardHeaderDirective, + CardTitleDirective, + CardImgTopDirective, + CardSubtitleDirective, +} from '../components/card'; + +describe('CardComponent', () => { + let spectator: SpectatorHost; + + const createHost = createHostFactory({ + component: CardComponent, + declarations: [ + CardHeaderComponent, + CardTitleDirective, + CardSubtitleDirective, + CardBodyComponent, + CardImgTopDirective, + CardFooterComponent, + ], + }); + + beforeEach( + () => + (spectator = createHost( + ` + + + Card title +

Card subtitle

+
+ + +

Some quick example text to build on the card title and make up the bulk of the card's content.

+
+ + Go somewhere + +
+ `, + { + hostProps: { attributes: { autofocus: '', name: 'abp-card' } }, + }, + )), + ); + + it('should display the card-header', () => { + expect(spectator.query('abp-card-header')).toBeTruthy(); + }); + + it('should display the card-title', () => { + expect(spectator.query('abp-card-title')).toBeTruthy(); + }); + + it('should display the card-subtitle', () => { + expect(spectator.query('p[abp-card-subtitle]')).toBeTruthy(); + }); + + it('should display the card-body', () => { + expect(spectator.query('abp-card-body')).toBeTruthy(); + }); + + it('should display the card-img-top', () => { + expect(spectator.query('abp-card-img-top')).toBeTruthy(); + }); + + it('should display the card-footer', () => { + expect(spectator.query('abp-card-footer')).toBeTruthy(); + }); +}); diff --git a/npm/packs/anchor-js/package.json b/npm/packs/anchor-js/package.json index 7d44ed11bd..27ba6d883d 100644 --- a/npm/packs/anchor-js/package.json +++ b/npm/packs/anchor-js/package.json @@ -1,11 +1,11 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/anchor-js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "anchor-js": "^4.3.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/aspnetcore.components.server.basictheme/package.json b/npm/packs/aspnetcore.components.server.basictheme/package.json index 08508a650f..81175b9918 100644 --- a/npm/packs/aspnetcore.components.server.basictheme/package.json +++ b/npm/packs/aspnetcore.components.server.basictheme/package.json @@ -1,11 +1,11 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/aspnetcore.components.server.basictheme", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.components.server.theming": "~7.1.0" + "@abp/aspnetcore.components.server.theming": "~7.1.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.components.server.theming/package.json b/npm/packs/aspnetcore.components.server.theming/package.json index 2c30299c16..ec3a349a56 100644 --- a/npm/packs/aspnetcore.components.server.theming/package.json +++ b/npm/packs/aspnetcore.components.server.theming/package.json @@ -1,12 +1,12 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/aspnetcore.components.server.theming", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/bootstrap": "~7.1.0", - "@abp/font-awesome": "~7.1.0" + "@abp/bootstrap": "~7.1.1", + "@abp/font-awesome": "~7.1.1" }, "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 ee80f2023c..9e360d64ef 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.basic/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/aspnetcore.mvc.ui.theme.basic", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~7.1.0" + "@abp/aspnetcore.mvc.ui.theme.shared": "~7.1.1" }, "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 9a6015a5c5..1be5bf9432 100644 --- a/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json +++ b/npm/packs/aspnetcore.mvc.ui.theme.shared/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/aspnetcore.mvc.ui.theme.shared", "repository": { "type": "git", @@ -10,22 +10,22 @@ "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui": "~7.1.0", - "@abp/bootstrap": "~7.1.0", - "@abp/bootstrap-datepicker": "~7.1.0", - "@abp/bootstrap-daterangepicker": "~7.1.0", - "@abp/datatables.net-bs5": "~7.1.0", - "@abp/font-awesome": "~7.1.0", - "@abp/jquery-form": "~7.1.0", - "@abp/jquery-validation-unobtrusive": "~7.1.0", - "@abp/lodash": "~7.1.0", - "@abp/luxon": "~7.1.0", - "@abp/malihu-custom-scrollbar-plugin": "~7.1.0", - "@abp/moment": "~7.1.0", - "@abp/select2": "~7.1.0", - "@abp/sweetalert2": "~7.1.0", - "@abp/timeago": "~7.1.0", - "@abp/toastr": "~7.1.0" + "@abp/aspnetcore.mvc.ui": "~7.1.1", + "@abp/bootstrap": "~7.1.1", + "@abp/bootstrap-datepicker": "~7.1.1", + "@abp/bootstrap-daterangepicker": "~7.1.1", + "@abp/datatables.net-bs5": "~7.1.1", + "@abp/font-awesome": "~7.1.1", + "@abp/jquery-form": "~7.1.1", + "@abp/jquery-validation-unobtrusive": "~7.1.1", + "@abp/lodash": "~7.1.1", + "@abp/luxon": "~7.1.1", + "@abp/malihu-custom-scrollbar-plugin": "~7.1.1", + "@abp/moment": "~7.1.1", + "@abp/select2": "~7.1.1", + "@abp/sweetalert2": "~7.1.1", + "@abp/timeago": "~7.1.1", + "@abp/toastr": "~7.1.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/aspnetcore.mvc.ui/package-lock.json b/npm/packs/aspnetcore.mvc.ui/package-lock.json index de4d386cae..622466d103 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": "7.1.0", + "version": "7.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/npm/packs/aspnetcore.mvc.ui/package.json b/npm/packs/aspnetcore.mvc.ui/package.json index ede408910e..1c0be4788d 100644 --- a/npm/packs/aspnetcore.mvc.ui/package.json +++ b/npm/packs/aspnetcore.mvc.ui/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/aspnetcore.mvc.ui", "repository": { "type": "git", diff --git a/npm/packs/blogging/package.json b/npm/packs/blogging/package.json index 5354a1fe38..641b231688 100644 --- a/npm/packs/blogging/package.json +++ b/npm/packs/blogging/package.json @@ -1,14 +1,14 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/blogging", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.shared": "~7.1.0", - "@abp/owl.carousel": "~7.1.0", - "@abp/prismjs": "~7.1.0", - "@abp/tui-editor": "~7.1.0" + "@abp/aspnetcore.mvc.ui.theme.shared": "~7.1.1", + "@abp/owl.carousel": "~7.1.1", + "@abp/prismjs": "~7.1.1", + "@abp/tui-editor": "~7.1.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/bootstrap-datepicker/package.json b/npm/packs/bootstrap-datepicker/package.json index ffcac03b88..b48332a0b3 100644 --- a/npm/packs/bootstrap-datepicker/package.json +++ b/npm/packs/bootstrap-datepicker/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/bootstrap-datepicker", "repository": { "type": "git", diff --git a/npm/packs/bootstrap-daterangepicker/package.json b/npm/packs/bootstrap-daterangepicker/package.json index ed6f80092c..5b74344e06 100644 --- a/npm/packs/bootstrap-daterangepicker/package.json +++ b/npm/packs/bootstrap-daterangepicker/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/bootstrap-daterangepicker", "repository": { "type": "git", diff --git a/npm/packs/bootstrap/package.json b/npm/packs/bootstrap/package.json index 96ace066ca..6f2a3cb4dd 100644 --- a/npm/packs/bootstrap/package.json +++ b/npm/packs/bootstrap/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/bootstrap", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "bootstrap": "^5.1.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/chart.js/package.json b/npm/packs/chart.js/package.json index 61420a84a4..55bf5e253c 100644 --- a/npm/packs/chart.js/package.json +++ b/npm/packs/chart.js/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/chart.js", "publishConfig": { "access": "public" diff --git a/npm/packs/clipboard/package.json b/npm/packs/clipboard/package.json index bf7de4bfff..18b874f5c8 100644 --- a/npm/packs/clipboard/package.json +++ b/npm/packs/clipboard/package.json @@ -1,11 +1,11 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/clipboard", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "clipboard": "^2.0.8" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/cms-kit.admin/package.json b/npm/packs/cms-kit.admin/package.json index e60589eef6..ad9ec270a0 100644 --- a/npm/packs/cms-kit.admin/package.json +++ b/npm/packs/cms-kit.admin/package.json @@ -1,15 +1,15 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/cms-kit.admin", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/codemirror": "~7.1.0", - "@abp/jstree": "~7.1.0", - "@abp/slugify": "~7.1.0", - "@abp/tui-editor": "~7.1.0", - "@abp/uppy": "~7.1.0" + "@abp/codemirror": "~7.1.1", + "@abp/jstree": "~7.1.1", + "@abp/slugify": "~7.1.1", + "@abp/tui-editor": "~7.1.1", + "@abp/uppy": "~7.1.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/cms-kit.public/package.json b/npm/packs/cms-kit.public/package.json index 383055a20f..bc53ebdb30 100644 --- a/npm/packs/cms-kit.public/package.json +++ b/npm/packs/cms-kit.public/package.json @@ -1,12 +1,12 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/cms-kit.public", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/highlight.js": "~7.1.0", - "@abp/star-rating-svg": "~7.1.0" + "@abp/highlight.js": "~7.1.1", + "@abp/star-rating-svg": "~7.1.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/cms-kit/package.json b/npm/packs/cms-kit/package.json index bad0f277c0..b36fa850a3 100644 --- a/npm/packs/cms-kit/package.json +++ b/npm/packs/cms-kit/package.json @@ -1,12 +1,12 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/cms-kit", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/cms-kit.admin": "~7.1.0", - "@abp/cms-kit.public": "~7.1.0" + "@abp/cms-kit.admin": "~7.1.1", + "@abp/cms-kit.public": "~7.1.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/codemirror/package.json b/npm/packs/codemirror/package.json index 094a30c74b..f8d48dfe35 100644 --- a/npm/packs/codemirror/package.json +++ b/npm/packs/codemirror/package.json @@ -1,11 +1,11 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/codemirror", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "codemirror": "^5.65.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/core/package.json b/npm/packs/core/package.json index 8519af9ffc..d52d2ec19c 100644 --- a/npm/packs/core/package.json +++ b/npm/packs/core/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/core", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/utils": "~7.1.0" + "@abp/utils": "~7.1.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/cropperjs/package.json b/npm/packs/cropperjs/package.json index 170d2f8a72..c99dcdba69 100644 --- a/npm/packs/cropperjs/package.json +++ b/npm/packs/cropperjs/package.json @@ -1,11 +1,11 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/cropperjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "cropperjs": "^1.5.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/datatables.net-bs4/package.json b/npm/packs/datatables.net-bs4/package.json index 84d3698e18..344760a74a 100644 --- a/npm/packs/datatables.net-bs4/package.json +++ b/npm/packs/datatables.net-bs4/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/datatables.net-bs4", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/datatables.net": "~7.1.0", + "@abp/datatables.net": "~7.1.1", "datatables.net-bs4": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/datatables.net-bs5/package.json b/npm/packs/datatables.net-bs5/package.json index 15b33a0bb4..3b5f0a7e69 100644 --- a/npm/packs/datatables.net-bs5/package.json +++ b/npm/packs/datatables.net-bs5/package.json @@ -1,11 +1,11 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/datatables.net-bs5", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/datatables.net": "~7.1.0", + "@abp/datatables.net": "~7.1.1", "datatables.net-bs5": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/datatables.net/package.json b/npm/packs/datatables.net/package.json index a48c1e4aff..a108d1935f 100644 --- a/npm/packs/datatables.net/package.json +++ b/npm/packs/datatables.net/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/datatables.net", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~7.1.0", + "@abp/jquery": "~7.1.1", "datatables.net": "^1.11.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/docs/package.json b/npm/packs/docs/package.json index 49bd09818a..906e452b2e 100644 --- a/npm/packs/docs/package.json +++ b/npm/packs/docs/package.json @@ -1,15 +1,15 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/docs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/anchor-js": "~7.1.0", - "@abp/clipboard": "~7.1.0", - "@abp/malihu-custom-scrollbar-plugin": "~7.1.0", - "@abp/popper.js": "~7.1.0", - "@abp/prismjs": "~7.1.0" + "@abp/anchor-js": "~7.1.1", + "@abp/clipboard": "~7.1.1", + "@abp/malihu-custom-scrollbar-plugin": "~7.1.1", + "@abp/popper.js": "~7.1.1", + "@abp/prismjs": "~7.1.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/flag-icon-css/package.json b/npm/packs/flag-icon-css/package.json index 0550376bd0..fa7d50d540 100644 --- a/npm/packs/flag-icon-css/package.json +++ b/npm/packs/flag-icon-css/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "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 afbb6c78b9..0936117c00 100644 --- a/npm/packs/font-awesome/package.json +++ b/npm/packs/font-awesome/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/font-awesome", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "@fortawesome/fontawesome-free": "^5.15.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/highlight.js/package.json b/npm/packs/highlight.js/package.json index 2484c07514..ddc346f948 100644 --- a/npm/packs/highlight.js/package.json +++ b/npm/packs/highlight.js/package.json @@ -1,11 +1,11 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/highlight.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "@highlightjs/cdn-assets": "~11.4.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery-form/package.json b/npm/packs/jquery-form/package.json index f343b77799..d8134c8e54 100644 --- a/npm/packs/jquery-form/package.json +++ b/npm/packs/jquery-form/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/jquery-form", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~7.1.0", + "@abp/jquery": "~7.1.1", "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 40b44fe4bd..a192b3cdd9 100644 --- a/npm/packs/jquery-validation-unobtrusive/package.json +++ b/npm/packs/jquery-validation-unobtrusive/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/jquery-validation-unobtrusive", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery-validation": "~7.1.0", + "@abp/jquery-validation": "~7.1.1", "jquery-validation-unobtrusive": "^3.2.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery-validation/package.json b/npm/packs/jquery-validation/package.json index eca6aef6f5..24b58bfe62 100644 --- a/npm/packs/jquery-validation/package.json +++ b/npm/packs/jquery-validation/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/jquery-validation", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~7.1.0", + "@abp/jquery": "~7.1.1", "jquery-validation": "^1.19.3" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jquery/package.json b/npm/packs/jquery/package.json index b71858f5c4..af77bb739a 100644 --- a/npm/packs/jquery/package.json +++ b/npm/packs/jquery/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/jquery", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "jquery": "~3.6.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/jstree/package.json b/npm/packs/jstree/package.json index 577c09434a..67f879d5f4 100644 --- a/npm/packs/jstree/package.json +++ b/npm/packs/jstree/package.json @@ -1,11 +1,11 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/jstree", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~7.1.0", + "@abp/jquery": "~7.1.1", "jstree": "^3.3.12" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/lodash/package.json b/npm/packs/lodash/package.json index a440c09bb4..536139af6c 100644 --- a/npm/packs/lodash/package.json +++ b/npm/packs/lodash/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/lodash", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "lodash": "^4.17.21" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/luxon/package.json b/npm/packs/luxon/package.json index d5d960236f..700051ba88 100644 --- a/npm/packs/luxon/package.json +++ b/npm/packs/luxon/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/luxon", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "luxon": "^2.3.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/malihu-custom-scrollbar-plugin/package.json b/npm/packs/malihu-custom-scrollbar-plugin/package.json index abdd090927..d7bcedd184 100644 --- a/npm/packs/malihu-custom-scrollbar-plugin/package.json +++ b/npm/packs/malihu-custom-scrollbar-plugin/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/malihu-custom-scrollbar-plugin", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "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 63a5d2508b..a4038188ae 100644 --- a/npm/packs/markdown-it/package.json +++ b/npm/packs/markdown-it/package.json @@ -1,11 +1,11 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/markdown-it", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "markdown-it": "^12.3.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/moment/package.json b/npm/packs/moment/package.json index 847a633088..4c90e3a41b 100644 --- a/npm/packs/moment/package.json +++ b/npm/packs/moment/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/moment", "repository": { "type": "git", diff --git a/npm/packs/owl.carousel/package.json b/npm/packs/owl.carousel/package.json index bcd305674c..cbae7bcb09 100644 --- a/npm/packs/owl.carousel/package.json +++ b/npm/packs/owl.carousel/package.json @@ -1,11 +1,11 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/owl.carousel", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "owl.carousel": "^2.3.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/popper.js/package.json b/npm/packs/popper.js/package.json index 01f8601edf..5e68ca747b 100644 --- a/npm/packs/popper.js/package.json +++ b/npm/packs/popper.js/package.json @@ -1,11 +1,11 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/popper.js", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "@popperjs/core": "^2.11.2" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/prismjs/package.json b/npm/packs/prismjs/package.json index 3ed336955c..bd792c2652 100644 --- a/npm/packs/prismjs/package.json +++ b/npm/packs/prismjs/package.json @@ -1,12 +1,12 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/prismjs", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~7.1.0", - "@abp/core": "~7.1.0", + "@abp/clipboard": "~7.1.1", + "@abp/core": "~7.1.1", "prismjs": "^1.26.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/qrcode/abp.resourcemapping.js b/npm/packs/qrcode/abp.resourcemapping.js new file mode 100644 index 0000000000..3758875205 --- /dev/null +++ b/npm/packs/qrcode/abp.resourcemapping.js @@ -0,0 +1,5 @@ +module.exports = { + mappings: { + "@node_modules/@abp/qrcode/src/*.*": "@libs/qrcode/" + } +} \ No newline at end of file diff --git a/npm/packs/qrcode/package.json b/npm/packs/qrcode/package.json new file mode 100644 index 0000000000..b6ad870641 --- /dev/null +++ b/npm/packs/qrcode/package.json @@ -0,0 +1,16 @@ +{ + "version": "7.1.1", + "name": "@abp/qrcode", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git", + "directory": "npm/packs/qrcode" + }, + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@abp/core": "~7.1.1" + }, + "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" +} diff --git a/npm/packs/qrcode/src/qrcode.js b/npm/packs/qrcode/src/qrcode.js new file mode 100644 index 0000000000..5507c154ff --- /dev/null +++ b/npm/packs/qrcode/src/qrcode.js @@ -0,0 +1,614 @@ +/** + * @fileoverview + * - Using the 'QRCode for Javascript library' + * - Fixed dataset of 'QRCode for Javascript library' for support full-spec. + * - this library has no dependencies. + * + * @author davidshimjs + * @see http://www.d-project.com/ + * @see http://jeromeetienne.github.com/jquery-qrcode/ + */ +var QRCode; + +(function () { + //--------------------------------------------------------------------- + // QRCode for JavaScript + // + // Copyright (c) 2009 Kazuhiko Arase + // + // URL: http://www.d-project.com/ + // + // Licensed under the MIT license: + // http://www.opensource.org/licenses/mit-license.php + // + // The word "QR Code" is registered trademark of + // DENSO WAVE INCORPORATED + // http://www.denso-wave.com/qrcode/faqpatent-e.html + // + //--------------------------------------------------------------------- + function QR8bitByte(data) { + this.mode = QRMode.MODE_8BIT_BYTE; + this.data = data; + this.parsedData = []; + + // Added to support UTF-8 Characters + for (var i = 0, l = this.data.length; i < l; i++) { + var byteArray = []; + var code = this.data.charCodeAt(i); + + if (code > 0x10000) { + byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18); + byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12); + byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6); + byteArray[3] = 0x80 | (code & 0x3F); + } else if (code > 0x800) { + byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12); + byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6); + byteArray[2] = 0x80 | (code & 0x3F); + } else if (code > 0x80) { + byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6); + byteArray[1] = 0x80 | (code & 0x3F); + } else { + byteArray[0] = code; + } + + this.parsedData.push(byteArray); + } + + this.parsedData = Array.prototype.concat.apply([], this.parsedData); + + if (this.parsedData.length != this.data.length) { + this.parsedData.unshift(191); + this.parsedData.unshift(187); + this.parsedData.unshift(239); + } + } + + QR8bitByte.prototype = { + getLength: function (buffer) { + return this.parsedData.length; + }, + write: function (buffer) { + for (var i = 0, l = this.parsedData.length; i < l; i++) { + buffer.put(this.parsedData[i], 8); + } + } + }; + + function QRCodeModel(typeNumber, errorCorrectLevel) { + this.typeNumber = typeNumber; + this.errorCorrectLevel = errorCorrectLevel; + this.modules = null; + this.moduleCount = 0; + this.dataCache = null; + this.dataList = []; + } + + QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);} + return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row=7){this.setupTypeNumber(test);} + if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);} + this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}} + return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;} + for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}} + for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}} + this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex>>bitIndex)&1)==1);} + var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;} + this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}} + row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;itotalDataCount*8){throw new Error("code length overflow. (" + +buffer.getLengthInBits() + +">" + +totalDataCount*8 + +")");} + if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);} + while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);} + while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;} + buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;} + buffer.put(QRCodeModel.PAD1,8);} + return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r=0)?modPoly.get(modIndex):0;}} + var totalCodeCount=0;for(var i=0;i=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));} + return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));} + return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;} + return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i5){lostPoint+=(3+sameCount-5);}}} + for(var row=0;row=256){n-=255;} + return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);} + if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));} + this.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]]; + + function _isSupportCanvas() { + return typeof CanvasRenderingContext2D != "undefined"; + } + + // android 2.x doesn't support Data-URI spec + function _getAndroid() { + var android = false; + var sAgent = navigator.userAgent; + + if (/android/i.test(sAgent)) { // android + android = true; + var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i); + + if (aMat && aMat[1]) { + android = parseFloat(aMat[1]); + } + } + + return android; + } + + var svgDrawer = (function() { + + var Drawing = function (el, htOption) { + this._el = el; + this._htOption = htOption; + }; + + Drawing.prototype.draw = function (oQRCode) { + var _htOption = this._htOption; + var _el = this._el; + var nCount = oQRCode.getModuleCount(); + var nWidth = Math.floor(_htOption.width / nCount); + var nHeight = Math.floor(_htOption.height / nCount); + + this.clear(); + + function makeSVG(tag, attrs) { + var el = document.createElementNS('http://www.w3.org/2000/svg', tag); + for (var k in attrs) + if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]); + return el; + } + + var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight}); + svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"); + _el.appendChild(svg); + + svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"})); + svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"})); + + for (var row = 0; row < nCount; row++) { + for (var col = 0; col < nCount; col++) { + if (oQRCode.isDark(row, col)) { + var child = makeSVG("use", {"x": String(col), "y": String(row)}); + child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template") + svg.appendChild(child); + } + } + } + }; + Drawing.prototype.clear = function () { + while (this._el.hasChildNodes()) + this._el.removeChild(this._el.lastChild); + }; + return Drawing; + })(); + + var useSVG = document.documentElement.tagName.toLowerCase() === "svg"; + + // Drawing in DOM by using Table tag + var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () { + var Drawing = function (el, htOption) { + this._el = el; + this._htOption = htOption; + }; + + /** + * Draw the QRCode + * + * @param {QRCode} oQRCode + */ + Drawing.prototype.draw = function (oQRCode) { + var _htOption = this._htOption; + var _el = this._el; + var nCount = oQRCode.getModuleCount(); + var nWidth = Math.floor(_htOption.width / nCount); + var nHeight = Math.floor(_htOption.height / nCount); + var aHTML = ['']; + + for (var row = 0; row < nCount; row++) { + aHTML.push(''); + + for (var col = 0; col < nCount; col++) { + aHTML.push(''); + } + + aHTML.push(''); + } + + aHTML.push('
'); + _el.innerHTML = aHTML.join(''); + + // Fix the margin values as real size. + var elTable = _el.childNodes[0]; + var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2; + var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2; + + if (nLeftMarginTable > 0 && nTopMarginTable > 0) { + elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px"; + } + }; + + /** + * Clear the QRCode + */ + Drawing.prototype.clear = function () { + this._el.innerHTML = ''; + }; + + return Drawing; + })() : (function () { // Drawing in Canvas + function _onMakeImage() { + this._elImage.src = this._elCanvas.toDataURL("image/png"); + this._elImage.style.display = "block"; + this._elCanvas.style.display = "none"; + } + + // Android 2.1 bug workaround + // http://code.google.com/p/android/issues/detail?id=5141 + if (this._android && this._android <= 2.1) { + var factor = 1 / window.devicePixelRatio; + var drawImage = CanvasRenderingContext2D.prototype.drawImage; + CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) { + if (("nodeName" in image) && /img/i.test(image.nodeName)) { + for (var i = arguments.length - 1; i >= 1; i--) { + arguments[i] = arguments[i] * factor; + } + } else if (typeof dw == "undefined") { + arguments[1] *= factor; + arguments[2] *= factor; + arguments[3] *= factor; + arguments[4] *= factor; + } + + drawImage.apply(this, arguments); + }; + } + + /** + * Check whether the user's browser supports Data URI or not + * + * @private + * @param {Function} fSuccess Occurs if it supports Data URI + * @param {Function} fFail Occurs if it doesn't support Data URI + */ + function _safeSetDataURI(fSuccess, fFail) { + var self = this; + self._fFail = fFail; + self._fSuccess = fSuccess; + + // Check it just once + if (self._bSupportDataURI === null) { + var el = document.createElement("img"); + var fOnError = function() { + self._bSupportDataURI = false; + + if (self._fFail) { + self._fFail.call(self); + } + }; + var fOnSuccess = function() { + self._bSupportDataURI = true; + + if (self._fSuccess) { + self._fSuccess.call(self); + } + }; + + el.onabort = fOnError; + el.onerror = fOnError; + el.onload = fOnSuccess; + el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data. + return; + } else if (self._bSupportDataURI === true && self._fSuccess) { + self._fSuccess.call(self); + } else if (self._bSupportDataURI === false && self._fFail) { + self._fFail.call(self); + } + }; + + /** + * Drawing QRCode by using canvas + * + * @constructor + * @param {HTMLElement} el + * @param {Object} htOption QRCode Options + */ + var Drawing = function (el, htOption) { + this._bIsPainted = false; + this._android = _getAndroid(); + + this._htOption = htOption; + this._elCanvas = document.createElement("canvas"); + this._elCanvas.width = htOption.width; + this._elCanvas.height = htOption.height; + el.appendChild(this._elCanvas); + this._el = el; + this._oContext = this._elCanvas.getContext("2d"); + this._bIsPainted = false; + this._elImage = document.createElement("img"); + this._elImage.alt = "Scan me!"; + this._elImage.style.display = "none"; + this._el.appendChild(this._elImage); + this._bSupportDataURI = null; + }; + + /** + * Draw the QRCode + * + * @param {QRCode} oQRCode + */ + Drawing.prototype.draw = function (oQRCode) { + var _elImage = this._elImage; + var _oContext = this._oContext; + var _htOption = this._htOption; + + var nCount = oQRCode.getModuleCount(); + var nWidth = _htOption.width / nCount; + var nHeight = _htOption.height / nCount; + var nRoundedWidth = Math.round(nWidth); + var nRoundedHeight = Math.round(nHeight); + + _elImage.style.display = "none"; + this.clear(); + + for (var row = 0; row < nCount; row++) { + for (var col = 0; col < nCount; col++) { + var bIsDark = oQRCode.isDark(row, col); + var nLeft = col * nWidth; + var nTop = row * nHeight; + _oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; + _oContext.lineWidth = 1; + _oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight; + _oContext.fillRect(nLeft, nTop, nWidth, nHeight); + + // 안티 앨리어싱 방지 처리 + _oContext.strokeRect( + Math.floor(nLeft) + 0.5, + Math.floor(nTop) + 0.5, + nRoundedWidth, + nRoundedHeight + ); + + _oContext.strokeRect( + Math.ceil(nLeft) - 0.5, + Math.ceil(nTop) - 0.5, + nRoundedWidth, + nRoundedHeight + ); + } + } + + this._bIsPainted = true; + }; + + /** + * Make the image from Canvas if the browser supports Data URI. + */ + Drawing.prototype.makeImage = function () { + if (this._bIsPainted) { + _safeSetDataURI.call(this, _onMakeImage); + } + }; + + /** + * Return whether the QRCode is painted or not + * + * @return {Boolean} + */ + Drawing.prototype.isPainted = function () { + return this._bIsPainted; + }; + + /** + * Clear the QRCode + */ + Drawing.prototype.clear = function () { + this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height); + this._bIsPainted = false; + }; + + /** + * @private + * @param {Number} nNumber + */ + Drawing.prototype.round = function (nNumber) { + if (!nNumber) { + return nNumber; + } + + return Math.floor(nNumber * 1000) / 1000; + }; + + return Drawing; + })(); + + /** + * Get the type by string length + * + * @private + * @param {String} sText + * @param {Number} nCorrectLevel + * @return {Number} type + */ + function _getTypeNumber(sText, nCorrectLevel) { + var nType = 1; + var length = _getUTF8Length(sText); + + for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) { + var nLimit = 0; + + switch (nCorrectLevel) { + case QRErrorCorrectLevel.L : + nLimit = QRCodeLimitLength[i][0]; + break; + case QRErrorCorrectLevel.M : + nLimit = QRCodeLimitLength[i][1]; + break; + case QRErrorCorrectLevel.Q : + nLimit = QRCodeLimitLength[i][2]; + break; + case QRErrorCorrectLevel.H : + nLimit = QRCodeLimitLength[i][3]; + break; + } + + if (length <= nLimit) { + break; + } else { + nType++; + } + } + + if (nType > QRCodeLimitLength.length) { + throw new Error("Too long data"); + } + + return nType; + } + + function _getUTF8Length(sText) { + var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a'); + return replacedText.length + (replacedText.length != sText ? 3 : 0); + } + + /** + * @class QRCode + * @constructor + * @example + * new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie"); + * + * @example + * var oQRCode = new QRCode("test", { + * text : "http://naver.com", + * width : 128, + * height : 128 + * }); + * + * oQRCode.clear(); // Clear the QRCode. + * oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode. + * + * @param {HTMLElement|String} el target element or 'id' attribute of element. + * @param {Object|String} vOption + * @param {String} vOption.text QRCode link data + * @param {Number} [vOption.width=256] + * @param {Number} [vOption.height=256] + * @param {String} [vOption.colorDark="#000000"] + * @param {String} [vOption.colorLight="#ffffff"] + * @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H] + */ + QRCode = function (el, vOption) { + this._htOption = { + width : 256, + height : 256, + typeNumber : 4, + colorDark : "#000000", + colorLight : "#ffffff", + correctLevel : QRErrorCorrectLevel.H + }; + + if (typeof vOption === 'string') { + vOption = { + text : vOption + }; + } + + // Overwrites options + if (vOption) { + for (var i in vOption) { + this._htOption[i] = vOption[i]; + } + } + + if (typeof el == "string") { + el = document.getElementById(el); + } + + if (this._htOption.useSVG) { + Drawing = svgDrawer; + } + + this._android = _getAndroid(); + this._el = el; + this._oQRCode = null; + this._oDrawing = new Drawing(this._el, this._htOption); + + if (this._htOption.text) { + this.makeCode(this._htOption.text); + } + }; + + /** + * Make the QRCode + * + * @param {String} sText link data + */ + QRCode.prototype.makeCode = function (sText) { + this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel); + this._oQRCode.addData(sText); + this._oQRCode.make(); + this._el.title = sText; + this._oDrawing.draw(this._oQRCode); + this.makeImage(); + }; + + /** + * Make the Image from Canvas element + * - It occurs automatically + * - Android below 3 doesn't support Data-URI spec. + * + * @private + */ + QRCode.prototype.makeImage = function () { + if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) { + this._oDrawing.makeImage(); + } + }; + + /** + * Clear the QRCode + */ + QRCode.prototype.clear = function () { + this._oDrawing.clear(); + }; + + /** + * @name QRCode.CorrectLevel + */ + QRCode.CorrectLevel = QRErrorCorrectLevel; +})(); diff --git a/npm/packs/qrcode/src/qrcode.min.js b/npm/packs/qrcode/src/qrcode.min.js new file mode 100644 index 0000000000..993e88f396 --- /dev/null +++ b/npm/packs/qrcode/src/qrcode.min.js @@ -0,0 +1 @@ +var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/npm/packs/select2/package.json b/npm/packs/select2/package.json index 9f37fdf01f..321c0a396c 100644 --- a/npm/packs/select2/package.json +++ b/npm/packs/select2/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/select2", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "select2": "^4.0.13" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/signalr/package.json b/npm/packs/signalr/package.json index 0ced914fc5..466f5caed6 100644 --- a/npm/packs/signalr/package.json +++ b/npm/packs/signalr/package.json @@ -1,11 +1,11 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/signalr", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "@microsoft/signalr": "~6.0.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/slugify/package.json b/npm/packs/slugify/package.json index 35e199abfb..2d03fe344a 100644 --- a/npm/packs/slugify/package.json +++ b/npm/packs/slugify/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/slugify", "publishConfig": { "access": "public" diff --git a/npm/packs/star-rating-svg/package.json b/npm/packs/star-rating-svg/package.json index 590ca9c625..a87f44169e 100644 --- a/npm/packs/star-rating-svg/package.json +++ b/npm/packs/star-rating-svg/package.json @@ -1,11 +1,11 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/star-rating-svg", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~7.1.0", + "@abp/jquery": "~7.1.1", "star-rating-svg": "^3.5.0" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/sweetalert2/package.json b/npm/packs/sweetalert2/package.json index 44090fe8bb..988772a888 100644 --- a/npm/packs/sweetalert2/package.json +++ b/npm/packs/sweetalert2/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/sweetalert2", "publishConfig": { "access": "public" @@ -10,7 +10,7 @@ "directory": "npm/packs/sweetalert2" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "sweetalert2": "^11.3.6" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/timeago/package.json b/npm/packs/timeago/package.json index 993fede727..9c389abd02 100644 --- a/npm/packs/timeago/package.json +++ b/npm/packs/timeago/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/timeago", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~7.1.0", + "@abp/jquery": "~7.1.1", "timeago": "^1.6.7" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/toastr/package.json b/npm/packs/toastr/package.json index beb6d16ab7..1766b7446f 100644 --- a/npm/packs/toastr/package.json +++ b/npm/packs/toastr/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/toastr", "repository": { "type": "git", @@ -10,7 +10,7 @@ "access": "public" }, "dependencies": { - "@abp/jquery": "~7.1.0", + "@abp/jquery": "~7.1.1", "toastr": "^2.1.4" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/tui-editor/package.json b/npm/packs/tui-editor/package.json index 76a47219a0..e68b17ab24 100644 --- a/npm/packs/tui-editor/package.json +++ b/npm/packs/tui-editor/package.json @@ -1,12 +1,12 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/tui-editor", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/jquery": "~7.1.0", - "@abp/prismjs": "~7.1.0" + "@abp/jquery": "~7.1.1", + "@abp/prismjs": "~7.1.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/uppy/package.json b/npm/packs/uppy/package.json index c6b09dd62c..8c038ca99f 100644 --- a/npm/packs/uppy/package.json +++ b/npm/packs/uppy/package.json @@ -1,11 +1,11 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/uppy", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/core": "~7.1.0", + "@abp/core": "~7.1.1", "uppy": "^1.16.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" diff --git a/npm/packs/utils/package.json b/npm/packs/utils/package.json index d7060a8e31..4df6a565e4 100644 --- a/npm/packs/utils/package.json +++ b/npm/packs/utils/package.json @@ -1,6 +1,6 @@ { "name": "@abp/utils", - "version": "7.1.0", + "version": "7.1.1", "scripts": { "prepublishOnly": "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 fa961a9150..03e68df0b4 100644 --- a/npm/packs/vee-validate/package.json +++ b/npm/packs/vee-validate/package.json @@ -1,11 +1,11 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/vee-validate", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/vue": "~7.1.0", + "@abp/vue": "~7.1.1", "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 f1307cbc81..f007b3a928 100644 --- a/npm/packs/virtual-file-explorer/package.json +++ b/npm/packs/virtual-file-explorer/package.json @@ -1,12 +1,12 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/virtual-file-explorer", "publishConfig": { "access": "public" }, "dependencies": { - "@abp/clipboard": "~7.1.0", - "@abp/prismjs": "~7.1.0" + "@abp/clipboard": "~7.1.1", + "@abp/prismjs": "~7.1.1" }, "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431" } diff --git a/npm/packs/vue/package.json b/npm/packs/vue/package.json index d8d3c545c2..7353dd5303 100644 --- a/npm/packs/vue/package.json +++ b/npm/packs/vue/package.json @@ -1,5 +1,5 @@ { - "version": "7.1.0", + "version": "7.1.1", "name": "@abp/vue", "publishConfig": { "access": "public" diff --git a/nupkg/pack.ps1 b/nupkg/pack.ps1 index ed4dc4630a..4c45e9e8c3 100644 --- a/nupkg/pack.ps1 +++ b/nupkg/pack.ps1 @@ -1,4 +1,6 @@ . ".\common.ps1" +# Delete existing nupkg files +del *.nupkg # Rebuild all solutions foreach($solution in $solutions) { @@ -7,9 +9,6 @@ foreach($solution in $solutions) { dotnet restore } -# Delete old packages -del *.nupkg - # Create all packages $i = 0 $projectsCount = $projects.length @@ -23,8 +22,9 @@ foreach($project in $projects) { # Create nuget pack Write-Info "[$i / $projectsCount] - Packing project: $projectName" Set-Location $projectFolder - dotnet clean - dotnet pack -c Release + + #dotnet clean + dotnet pack -c Release --no-build -- /maxcpucount if (-Not $?) { Write-Error "Packaging failed for the project: $projectName" @@ -40,4 +40,4 @@ foreach($project in $projects) { } # Go back to the pack folder -Set-Location $packFolder \ No newline at end of file +Set-Location $packFolder diff --git a/nupkg/unit_test.ps1 b/nupkg/unit_test.ps1 index 07cdfe3655..f081dd1e2f 100644 --- a/nupkg/unit_test.ps1 +++ b/nupkg/unit_test.ps1 @@ -5,6 +5,4 @@ foreach($solution in $solutions) { $solutionFolder = Join-Path $rootFolder $solution Set-Location $solutionFolder dotnet test --no-build --logger trx - - } diff --git a/source-code/SourceCodes.sln b/source-code/SourceCodes.sln new file mode 100644 index 0000000000..c905fd2676 --- /dev/null +++ b/source-code/SourceCodes.sln @@ -0,0 +1,124 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Account.SourceCode", "Volo.Abp.Account.SourceCode\Volo.Abp.Account.SourceCode.csproj", "{7EE7031D-8CE1-4AFA-8DA0-67B77971482F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AuditLogging.SourceCode", "Volo.Abp.AuditLogging.SourceCode\Volo.Abp.AuditLogging.SourceCode.csproj", "{58A1422A-68D6-4320-839E-2C29F5D57CF8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BackgroundJobs.SourceCode", "Volo.Abp.BackgroundJobs.SourceCode\Volo.Abp.BackgroundJobs.SourceCode.csproj", "{1A207FF1-CD9D-4D1C-9C60-B897DD3FF636}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BasicTheme.SourceCode", "Volo.Abp.BasicTheme.SourceCode\Volo.Abp.BasicTheme.SourceCode.csproj", "{DBA1E8B8-8889-4F45-9A0E-241DCF113829}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Database.SourceCode", "Volo.Abp.BlobStoring.Database.SourceCode\Volo.Abp.BlobStoring.Database.SourceCode.csproj", "{52BD49B3-D2D8-4591-8248-72984481E99D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.FeatureManagement.SourceCode", "Volo.Abp.FeatureManagement.SourceCode\Volo.Abp.FeatureManagement.SourceCode.csproj", "{06A55C62-1C96-4255-9D70-BDDE0C96BC82}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Identity.SourceCode", "Volo.Abp.Identity.SourceCode\Volo.Abp.Identity.SourceCode.csproj", "{896527D7-EB6F-4792-94FA-B1DDF29BEA2F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.IdentityServer.SourceCode", "Volo.Abp.IdentityServer.SourceCode\Volo.Abp.IdentityServer.SourceCode.csproj", "{41A27F5D-5338-4D51-BDE7-4F8A1268F040}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.OpenIddict.SourceCode", "Volo.Abp.OpenIddict.SourceCode\Volo.Abp.OpenIddict.SourceCode.csproj", "{2D6CCDEF-8FBA-4183-B86B-AFE5FD150AB7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.PermissionManagement.SourceCode", "Volo.Abp.PermissionManagement.SourceCode\Volo.Abp.PermissionManagement.SourceCode.csproj", "{9B180F22-C11E-4CA8-9588-E12E79761CDC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.SettingManagement.SourceCode", "Volo.Abp.SettingManagement.SourceCode\Volo.Abp.SettingManagement.SourceCode.csproj", "{2AA05D3A-A47C-460C-B5EA-C4C1942AC06F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.TenantManagement.SourceCode", "Volo.Abp.TenantManagement.SourceCode\Volo.Abp.TenantManagement.SourceCode.csproj", "{4816262C-D0D3-4B90-9FEB-B79FB5C250E5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Users.SourceCode", "Volo.Abp.Users.SourceCode\Volo.Abp.Users.SourceCode.csproj", "{ED42139F-94DB-445D-BDC5-390E0478DF02}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.VirtualFileExplorer.SourceCode", "Volo.Abp.VirtualFileExplorer.SourceCode\Volo.Abp.VirtualFileExplorer.SourceCode.csproj", "{7652CFDF-9581-46E3-B74B-19CC4E2B50BE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Blogging.SourceCode", "Volo.Blogging.SourceCode\Volo.Blogging.SourceCode.csproj", "{0FA2B096-963D-4DD7-BF30-E5382229C515}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.ClientSimulation.SourceCode", "Volo.ClientSimulation.SourceCode\Volo.ClientSimulation.SourceCode.csproj", "{C3FCB192-F270-498E-8738-BE40308E7510}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.CmsKit.SourceCode", "Volo.CmsKit.SourceCode\Volo.CmsKit.SourceCode.csproj", "{7A088623-8A15-425D-A562-9400882E6FB3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Docs.SourceCode", "Volo.Docs.SourceCode\Volo.Docs.SourceCode.csproj", "{E7D2575E-8002-4C4A-A86C-BFFF6439329A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7EE7031D-8CE1-4AFA-8DA0-67B77971482F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7EE7031D-8CE1-4AFA-8DA0-67B77971482F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7EE7031D-8CE1-4AFA-8DA0-67B77971482F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7EE7031D-8CE1-4AFA-8DA0-67B77971482F}.Release|Any CPU.Build.0 = Release|Any CPU + {58A1422A-68D6-4320-839E-2C29F5D57CF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58A1422A-68D6-4320-839E-2C29F5D57CF8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58A1422A-68D6-4320-839E-2C29F5D57CF8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58A1422A-68D6-4320-839E-2C29F5D57CF8}.Release|Any CPU.Build.0 = Release|Any CPU + {1A207FF1-CD9D-4D1C-9C60-B897DD3FF636}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A207FF1-CD9D-4D1C-9C60-B897DD3FF636}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A207FF1-CD9D-4D1C-9C60-B897DD3FF636}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A207FF1-CD9D-4D1C-9C60-B897DD3FF636}.Release|Any CPU.Build.0 = Release|Any CPU + {DBA1E8B8-8889-4F45-9A0E-241DCF113829}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DBA1E8B8-8889-4F45-9A0E-241DCF113829}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DBA1E8B8-8889-4F45-9A0E-241DCF113829}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DBA1E8B8-8889-4F45-9A0E-241DCF113829}.Release|Any CPU.Build.0 = Release|Any CPU + {52BD49B3-D2D8-4591-8248-72984481E99D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {52BD49B3-D2D8-4591-8248-72984481E99D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {52BD49B3-D2D8-4591-8248-72984481E99D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {52BD49B3-D2D8-4591-8248-72984481E99D}.Release|Any CPU.Build.0 = Release|Any CPU + {06A55C62-1C96-4255-9D70-BDDE0C96BC82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {06A55C62-1C96-4255-9D70-BDDE0C96BC82}.Debug|Any CPU.Build.0 = Debug|Any CPU + {06A55C62-1C96-4255-9D70-BDDE0C96BC82}.Release|Any CPU.ActiveCfg = Release|Any CPU + {06A55C62-1C96-4255-9D70-BDDE0C96BC82}.Release|Any CPU.Build.0 = Release|Any CPU + {896527D7-EB6F-4792-94FA-B1DDF29BEA2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {896527D7-EB6F-4792-94FA-B1DDF29BEA2F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {896527D7-EB6F-4792-94FA-B1DDF29BEA2F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {896527D7-EB6F-4792-94FA-B1DDF29BEA2F}.Release|Any CPU.Build.0 = Release|Any CPU + {41A27F5D-5338-4D51-BDE7-4F8A1268F040}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {41A27F5D-5338-4D51-BDE7-4F8A1268F040}.Debug|Any CPU.Build.0 = Debug|Any CPU + {41A27F5D-5338-4D51-BDE7-4F8A1268F040}.Release|Any CPU.ActiveCfg = Release|Any CPU + {41A27F5D-5338-4D51-BDE7-4F8A1268F040}.Release|Any CPU.Build.0 = Release|Any CPU + {2D6CCDEF-8FBA-4183-B86B-AFE5FD150AB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D6CCDEF-8FBA-4183-B86B-AFE5FD150AB7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D6CCDEF-8FBA-4183-B86B-AFE5FD150AB7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D6CCDEF-8FBA-4183-B86B-AFE5FD150AB7}.Release|Any CPU.Build.0 = Release|Any CPU + {9B180F22-C11E-4CA8-9588-E12E79761CDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9B180F22-C11E-4CA8-9588-E12E79761CDC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9B180F22-C11E-4CA8-9588-E12E79761CDC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9B180F22-C11E-4CA8-9588-E12E79761CDC}.Release|Any CPU.Build.0 = Release|Any CPU + {2AA05D3A-A47C-460C-B5EA-C4C1942AC06F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2AA05D3A-A47C-460C-B5EA-C4C1942AC06F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2AA05D3A-A47C-460C-B5EA-C4C1942AC06F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2AA05D3A-A47C-460C-B5EA-C4C1942AC06F}.Release|Any CPU.Build.0 = Release|Any CPU + {4816262C-D0D3-4B90-9FEB-B79FB5C250E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4816262C-D0D3-4B90-9FEB-B79FB5C250E5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4816262C-D0D3-4B90-9FEB-B79FB5C250E5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4816262C-D0D3-4B90-9FEB-B79FB5C250E5}.Release|Any CPU.Build.0 = Release|Any CPU + {ED42139F-94DB-445D-BDC5-390E0478DF02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ED42139F-94DB-445D-BDC5-390E0478DF02}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ED42139F-94DB-445D-BDC5-390E0478DF02}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ED42139F-94DB-445D-BDC5-390E0478DF02}.Release|Any CPU.Build.0 = Release|Any CPU + {7652CFDF-9581-46E3-B74B-19CC4E2B50BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7652CFDF-9581-46E3-B74B-19CC4E2B50BE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7652CFDF-9581-46E3-B74B-19CC4E2B50BE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7652CFDF-9581-46E3-B74B-19CC4E2B50BE}.Release|Any CPU.Build.0 = Release|Any CPU + {0FA2B096-963D-4DD7-BF30-E5382229C515}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0FA2B096-963D-4DD7-BF30-E5382229C515}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0FA2B096-963D-4DD7-BF30-E5382229C515}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0FA2B096-963D-4DD7-BF30-E5382229C515}.Release|Any CPU.Build.0 = Release|Any CPU + {C3FCB192-F270-498E-8738-BE40308E7510}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C3FCB192-F270-498E-8738-BE40308E7510}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C3FCB192-F270-498E-8738-BE40308E7510}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C3FCB192-F270-498E-8738-BE40308E7510}.Release|Any CPU.Build.0 = Release|Any CPU + {7A088623-8A15-425D-A562-9400882E6FB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A088623-8A15-425D-A562-9400882E6FB3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A088623-8A15-425D-A562-9400882E6FB3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A088623-8A15-425D-A562-9400882E6FB3}.Release|Any CPU.Build.0 = Release|Any CPU + {E7D2575E-8002-4C4A-A86C-BFFF6439329A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E7D2575E-8002-4C4A-A86C-BFFF6439329A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E7D2575E-8002-4C4A-A86C-BFFF6439329A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E7D2575E-8002-4C4A-A86C-BFFF6439329A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/source-code/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip b/source-code/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip index 888f9b3472..b20c5a2189 100644 Binary files a/source-code/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip and b/source-code/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip differ diff --git a/source-code/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip b/source-code/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip index 86cde92d87..4cbf9ac4ff 100644 Binary files a/source-code/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip and b/source-code/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip differ diff --git a/source-code/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip b/source-code/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip index da459117e3..23a2d6badd 100644 Binary files a/source-code/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip and b/source-code/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip differ diff --git a/source-code/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.zip b/source-code/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.zip index 27602a1242..c00fa0f2b8 100644 Binary files a/source-code/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.zip and b/source-code/Volo.Abp.BasicTheme.SourceCode/Volo.Abp.BasicTheme.SourceCode.zip differ diff --git a/source-code/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.zip b/source-code/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.zip index e0e2860fd7..032724e465 100644 Binary files a/source-code/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.zip and b/source-code/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.zip differ diff --git a/source-code/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.zip b/source-code/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.zip index 5d3c3a47c6..48ef5b3422 100644 Binary files a/source-code/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.zip and b/source-code/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.zip differ diff --git a/source-code/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.zip b/source-code/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.zip index 11389052f7..c48cdb333c 100644 Binary files a/source-code/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.zip and b/source-code/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.zip differ diff --git a/source-code/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.zip b/source-code/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.zip index a60ab6a1e6..e44e975181 100644 Binary files a/source-code/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.zip and b/source-code/Volo.Abp.IdentityServer.SourceCode/Volo.Abp.IdentityServer.SourceCode.zip differ diff --git a/source-code/Volo.Abp.OpenIddict.SourceCode/Volo.Abp.OpenIddict.SourceCode.zip b/source-code/Volo.Abp.OpenIddict.SourceCode/Volo.Abp.OpenIddict.SourceCode.zip index c9f81f78de..402cb27505 100644 Binary files a/source-code/Volo.Abp.OpenIddict.SourceCode/Volo.Abp.OpenIddict.SourceCode.zip and b/source-code/Volo.Abp.OpenIddict.SourceCode/Volo.Abp.OpenIddict.SourceCode.zip differ diff --git a/source-code/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.zip b/source-code/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.zip index 31aaa0b2d0..b44c560e64 100644 Binary files a/source-code/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.zip and b/source-code/Volo.Abp.PermissionManagement.SourceCode/Volo.Abp.PermissionManagement.SourceCode.zip differ diff --git a/source-code/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.zip b/source-code/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.zip index ac2402361b..12666a8314 100644 Binary files a/source-code/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.zip and b/source-code/Volo.Abp.SettingManagement.SourceCode/Volo.Abp.SettingManagement.SourceCode.zip differ diff --git a/source-code/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.zip b/source-code/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.zip index 06f8ea4ae3..6afa6219db 100644 Binary files a/source-code/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.zip and b/source-code/Volo.Abp.TenantManagement.SourceCode/Volo.Abp.TenantManagement.SourceCode.zip differ diff --git a/source-code/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.zip b/source-code/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.zip index 4f261298a4..6ee9c21c76 100644 Binary files a/source-code/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.zip and b/source-code/Volo.Abp.Users.SourceCode/Volo.Abp.Users.SourceCode.zip differ diff --git a/source-code/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.zip b/source-code/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.zip index 75bbc8aa3d..5c6e8b8a97 100644 Binary files a/source-code/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.zip and b/source-code/Volo.Abp.VirtualFileExplorer.SourceCode/Volo.Abp.VirtualFileExplorer.SourceCode.zip differ diff --git a/source-code/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.zip b/source-code/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.zip index 45bc1f9d1b..79d4fd2c57 100644 Binary files a/source-code/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.zip and b/source-code/Volo.Blogging.SourceCode/Volo.Blogging.SourceCode.zip differ diff --git a/source-code/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.zip b/source-code/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.zip index 56f406b4ec..7adceb986b 100644 Binary files a/source-code/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.zip and b/source-code/Volo.ClientSimulation.SourceCode/Volo.ClientSimulation.SourceCode.zip differ diff --git a/source-code/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.zip b/source-code/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.zip index 8b44059b79..087f68a6b7 100644 Binary files a/source-code/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.zip and b/source-code/Volo.CmsKit.SourceCode/Volo.CmsKit.SourceCode.zip differ diff --git a/source-code/Volo.Docs.SourceCode/Volo.Docs.SourceCode.zip b/source-code/Volo.Docs.SourceCode/Volo.Docs.SourceCode.zip index a5201e094f..554adc9372 100644 Binary files a/source-code/Volo.Docs.SourceCode/Volo.Docs.SourceCode.zip and b/source-code/Volo.Docs.SourceCode/Volo.Docs.SourceCode.zip differ diff --git a/templates/app-nolayers/angular/package.json b/templates/app-nolayers/angular/package.json index 820e039326..56e1d2c337 100644 --- a/templates/app-nolayers/angular/package.json +++ b/templates/app-nolayers/angular/package.json @@ -12,15 +12,15 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~7.1.0", - "@abp/ng.components": "~7.1.0", - "@abp/ng.core": "~7.1.0", - "@abp/ng.oauth": "~7.1.0", - "@abp/ng.identity": "~7.1.0", - "@abp/ng.setting-management": "~7.1.0", - "@abp/ng.tenant-management": "~7.1.0", - "@abp/ng.theme.shared": "~7.1.0", - "@abp/ng.theme.lepton-x": "~2.1.0-rc.1", + "@abp/ng.account": "~7.1.1", + "@abp/ng.components": "~7.1.1", + "@abp/ng.core": "~7.1.1", + "@abp/ng.oauth": "~7.1.1", + "@abp/ng.identity": "~7.1.1", + "@abp/ng.setting-management": "~7.1.1", + "@abp/ng.tenant-management": "~7.1.1", + "@abp/ng.theme.shared": "~7.1.1", + "@abp/ng.theme.lepton-x": "~2.1.0", "@angular/animations": "^15.0.1", "@angular/common": "^15.0.1", "@angular/compiler": "^15.0.1", @@ -36,7 +36,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~7.1.0", + "@abp/ng.schematics": "~7.1.1", "@angular-devkit/build-angular": "^15.0.1", "@angular-eslint/builder": "~15.1.0", "@angular-eslint/eslint-plugin": "~15.1.0", diff --git a/templates/app-nolayers/angular/src/app/home/home.component.spec.ts b/templates/app-nolayers/angular/src/app/home/home.component.spec.ts index 9622abc9f6..9fb41df29a 100644 --- a/templates/app-nolayers/angular/src/app/home/home.component.spec.ts +++ b/templates/app-nolayers/angular/src/app/home/home.component.spec.ts @@ -1,5 +1,4 @@ import { CoreTestingModule } from '@abp/ng.core/testing'; -import { ThemeBasicTestingModule } from '@abp/ng.theme.basic/testing'; import { ThemeSharedTestingModule } from '@abp/ng.theme.shared/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { NgxValidateCoreModule } from '@ngx-validate/core'; @@ -17,7 +16,6 @@ describe('HomeComponent', () => { imports: [ CoreTestingModule.withConfig(), ThemeSharedTestingModule.withConfig(), - ThemeBasicTestingModule.withConfig(), NgxValidateCoreModule, ], providers: [ diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json index 524214ee25..9a29077f90 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.components.server.leptonxlitetheme": "~2.1.0-rc.1", - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0-rc.1" + "@abp/aspnetcore.components.server.leptonxlitetheme": "~2.1.0", + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20230314024329_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20230324070018_Initial.Designer.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20230314024329_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20230324070018_Initial.Designer.cs index 64b3b7ecca..6baa1f955f 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20230314024329_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20230324070018_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20230314024329_Initial")] + [Migration("20230324070018_Initial")] partial class Initial { /// @@ -833,6 +833,33 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20230314024329_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20230324070018_Initial.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20230314024329_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20230324070018_Initial.cs index f2525f617b..f8e92f9d6b 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20230314024329_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/20230324070018_Initial.cs @@ -292,6 +292,22 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations table.PrimaryKey("PK_AbpTenants", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpUserDelegations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + StartTime = table.Column(type: "datetime2", nullable: false), + EndTime = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserDelegations", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpUsers", columns: table => new @@ -990,6 +1006,9 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations migrationBuilder.DropTable( name: "AbpUserClaims"); + migrationBuilder.DropTable( + name: "AbpUserDelegations"); + migrationBuilder.DropTable( name: "AbpUserLogins"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs index e0b0b2f686..3115f987ef 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -830,6 +830,33 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json index befc6512c7..7ed26336b6 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0-rc.1", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~2.1.0-rc.1" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~2.1.0" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/package.json index 7ca3e8d684..f032658a30 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server.Mongo/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0-rc.1" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20230314024404_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20230324070058_Initial.Designer.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20230314024404_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20230324070058_Initial.Designer.cs index 2a5f430902..0eba223650 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20230314024404_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20230324070058_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20230314024404_Initial")] + [Migration("20230324070058_Initial")] partial class Initial { /// @@ -833,6 +833,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20230314024404_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20230324070058_Initial.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20230314024404_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20230324070058_Initial.cs index e4e66c791a..3c62b40bf4 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20230314024404_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/20230324070058_Initial.cs @@ -292,6 +292,22 @@ namespace MyCompanyName.MyProjectName.Migrations table.PrimaryKey("PK_AbpTenants", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpUserDelegations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + StartTime = table.Column(type: "datetime2", nullable: false), + EndTime = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserDelegations", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpUsers", columns: table => new @@ -990,6 +1006,9 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpUserClaims"); + migrationBuilder.DropTable( + name: "AbpUserDelegations"); + migrationBuilder.DropTable( name: "AbpUserLogins"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs index 6ba91d04bd..60afa4e2c9 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -830,6 +830,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/package.json index 7ca3e8d684..f032658a30 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0-rc.1" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json index 7ca3e8d684..f032658a30 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0-rc.1" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20230314024402_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20230324070125_Initial.Designer.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20230314024402_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20230324070125_Initial.Designer.cs index 6a16d3f459..fe2d18ec1e 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20230314024402_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20230324070125_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Host.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20230314024402_Initial")] + [Migration("20230324070125_Initial")] partial class Initial { /// @@ -833,6 +833,33 @@ namespace MyCompanyName.MyProjectName.Host.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20230314024402_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20230324070125_Initial.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20230314024402_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20230324070125_Initial.cs index 8355eaab06..7af7c9a871 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20230314024402_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/20230324070125_Initial.cs @@ -292,6 +292,22 @@ namespace MyCompanyName.MyProjectName.Host.Migrations table.PrimaryKey("PK_AbpTenants", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpUserDelegations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + StartTime = table.Column(type: "datetime2", nullable: false), + EndTime = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserDelegations", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpUsers", columns: table => new @@ -990,6 +1006,9 @@ namespace MyCompanyName.MyProjectName.Host.Migrations migrationBuilder.DropTable( name: "AbpUserClaims"); + migrationBuilder.DropTable( + name: "AbpUserDelegations"); + migrationBuilder.DropTable( name: "AbpUserLogins"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs index 0dc839a24f..3d693cc761 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -830,6 +830,33 @@ namespace MyCompanyName.MyProjectName.Host.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json index 7ca3e8d684..f032658a30 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Host/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0-rc.1" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json index 7ca3e8d684..f032658a30 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0-rc.1" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0" } } diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20230314024433_Initial.Designer.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20230324070202_Initial.Designer.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20230314024433_Initial.Designer.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20230324070202_Initial.Designer.cs index e2cab42a1f..1f2dc7a5fb 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20230314024433_Initial.Designer.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20230324070202_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Mvc.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20230314024433_Initial")] + [Migration("20230324070202_Initial")] partial class Initial { /// @@ -833,6 +833,33 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20230314024433_Initial.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20230324070202_Initial.cs similarity index 98% rename from templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20230314024433_Initial.cs rename to templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20230324070202_Initial.cs index 64f21c71e9..1bb1b884bd 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20230314024433_Initial.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/20230324070202_Initial.cs @@ -292,6 +292,22 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations table.PrimaryKey("PK_AbpTenants", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpUserDelegations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + StartTime = table.Column(type: "datetime2", nullable: false), + EndTime = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserDelegations", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpUsers", columns: table => new @@ -990,6 +1006,9 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations migrationBuilder.DropTable( name: "AbpUserClaims"); + migrationBuilder.DropTable( + name: "AbpUserDelegations"); + migrationBuilder.DropTable( name: "AbpUserLogins"); diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs index bad5296c0c..835bdad6be 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -830,6 +830,33 @@ namespace MyCompanyName.MyProjectName.Mvc.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") diff --git a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json index 7ca3e8d684..f032658a30 100644 --- a/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json +++ b/templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json @@ -3,6 +3,6 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0-rc.1" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0" } } diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json index a7f3fc3dd3..724c102f7b 100644 --- a/templates/app/angular/package.json +++ b/templates/app/angular/package.json @@ -12,15 +12,15 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~7.1.0", - "@abp/ng.components": "~7.1.0", - "@abp/ng.core": "~7.1.0", - "@abp/ng.oauth": "~7.1.0", - "@abp/ng.identity": "~7.1.0", - "@abp/ng.setting-management": "~7.1.0", - "@abp/ng.tenant-management": "~7.1.0", - "@abp/ng.theme.shared": "~7.1.0", - "@abp/ng.theme.lepton-x": "~2.1.0-rc.1", + "@abp/ng.account": "~7.1.1", + "@abp/ng.components": "~7.1.1", + "@abp/ng.core": "~7.1.1", + "@abp/ng.oauth": "~7.1.1", + "@abp/ng.identity": "~7.1.1", + "@abp/ng.setting-management": "~7.1.1", + "@abp/ng.tenant-management": "~7.1.1", + "@abp/ng.theme.shared": "~7.1.1", + "@abp/ng.theme.lepton-x": "~2.1.0", "@angular/animations": "^15.0.1", "@angular/common": "^15.0.1", "@angular/compiler": "^15.0.1", @@ -36,7 +36,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~7.1.0", + "@abp/ng.schematics": "~7.1.1", "@angular-devkit/build-angular": "^15.0.1", "@angular-eslint/builder": "~15.1.0", "@angular-eslint/eslint-plugin": "~15.1.0", diff --git a/templates/app/angular/src/app/home/home.component.spec.ts b/templates/app/angular/src/app/home/home.component.spec.ts index 3ceff9410b..e02c272719 100644 --- a/templates/app/angular/src/app/home/home.component.spec.ts +++ b/templates/app/angular/src/app/home/home.component.spec.ts @@ -1,5 +1,4 @@ import { CoreTestingModule } from "@abp/ng.core/testing"; -import { ThemeBasicTestingModule } from "@abp/ng.theme.basic/testing"; import { ThemeSharedTestingModule } from "@abp/ng.theme.shared/testing"; import { ComponentFixture, TestBed, waitForAsync } from "@angular/core/testing"; import { NgxValidateCoreModule } from "@ngx-validate/core"; @@ -8,6 +7,7 @@ import { OAuthService } from 'angular-oauth2-oidc'; import { AuthService } from '@abp/ng.core'; + describe("HomeComponent", () => { let fixture: ComponentFixture; const mockOAuthService = jasmine.createSpyObj('OAuthService', ['hasValidAccessToken']) @@ -19,7 +19,6 @@ describe("HomeComponent", () => { imports: [ CoreTestingModule.withConfig(), ThemeSharedTestingModule.withConfig(), - ThemeBasicTestingModule.withConfig(), NgxValidateCoreModule, ], providers: [ @@ -97,4 +96,4 @@ describe("HomeComponent", () => { }) }) -}); \ No newline at end of file +}); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/package.json index cd74e444f2..3cc7d1152e 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-authserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0-rc.1" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json index befc6512c7..7ed26336b6 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0-rc.1", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~2.1.0-rc.1" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~2.1.0" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json index befc6512c7..7ed26336b6 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0-rc.1", - "@abp/aspnetcore.components.server.leptonxlitetheme": "~2.1.0-rc.1" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0", + "@abp/aspnetcore.components.server.leptonxlitetheme": "~2.1.0" } } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameDbContext.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameDbContext.cs index 46f1217ffa..e1afd1a339 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameDbContext.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameDbContext.cs @@ -45,6 +45,7 @@ public class MyProjectNameDbContext : public DbSet OrganizationUnits { get; set; } public DbSet SecurityLogs { get; set; } public DbSet LinkUsers { get; set; } + public DbSet UserDelegations { get; set; } // Tenant Management public DbSet Tenants { get; set; } diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20230314023936_Initial.Designer.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20230324065930_Initial.Designer.cs similarity index 98% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20230314023936_Initial.Designer.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20230324065930_Initial.Designer.cs index 44019ac4ca..effdc6d3ee 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20230314023936_Initial.Designer.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20230324065930_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(MyProjectNameDbContext))] - [Migration("20230314023936_Initial")] + [Migration("20230324065930_Initial")] partial class Initial { /// @@ -886,6 +886,32 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20230314023936_Initial.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20230324065930_Initial.cs similarity index 98% rename from templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20230314023936_Initial.cs rename to templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20230324065930_Initial.cs index f594ae7458..ccf3e9776c 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20230314023936_Initial.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/20230324065930_Initial.cs @@ -313,6 +313,22 @@ namespace MyCompanyName.MyProjectName.Migrations table.PrimaryKey("PK_AbpTenants", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpUserDelegations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + StartTime = table.Column(type: "datetime2", nullable: false), + EndTime = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserDelegations", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpUsers", columns: table => new @@ -1019,6 +1035,9 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpUserClaims"); + migrationBuilder.DropTable( + name: "AbpUserDelegations"); + migrationBuilder.DropTable( name: "AbpUserLogins"); diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs index db36717434..3805a9ee89 100644 --- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs +++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/Migrations/MyProjectNameDbContextModelSnapshot.cs @@ -883,6 +883,32 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") 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 7ca3e8d684..f032658a30 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.leptonxlite": "~2.1.0-rc.1" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0" } } 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 7ca3e8d684..f032658a30 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.leptonxlite": "~2.1.0-rc.1" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0" } } 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 7ca3e8d684..f032658a30 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.leptonxlite": "~2.1.0-rc.1" + "@abp/aspnetcore.mvc.ui.theme.leptonxlite": "~2.1.0" } } diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json index f02fb46988..a5738b7b9a 100644 --- a/templates/module/angular/package.json +++ b/templates/module/angular/package.json @@ -15,15 +15,15 @@ }, "private": true, "dependencies": { - "@abp/ng.account": "~7.1.0", - "@abp/ng.components": "~7.1.0", - "@abp/ng.core": "~7.1.0", - "@abp/ng.oauth": "~7.1.0", - "@abp/ng.identity": "~7.1.0", - "@abp/ng.setting-management": "~7.1.0", - "@abp/ng.tenant-management": "~7.1.0", - "@abp/ng.theme.basic": "~7.1.0", - "@abp/ng.theme.shared": "~7.1.0", + "@abp/ng.account": "~7.1.1", + "@abp/ng.components": "~7.1.1", + "@abp/ng.core": "~7.1.1", + "@abp/ng.oauth": "~7.1.1", + "@abp/ng.identity": "~7.1.1", + "@abp/ng.setting-management": "~7.1.1", + "@abp/ng.tenant-management": "~7.1.1", + "@abp/ng.theme.basic": "~7.1.1", + "@abp/ng.theme.shared": "~7.1.1", "@angular/animations": "^15.0.1", "@angular/common": "^15.0.1", "@angular/compiler": "^15.0.1", @@ -38,7 +38,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@abp/ng.schematics": "~7.1.0", + "@abp/ng.schematics": "~7.1.1", "@angular-devkit/build-angular": "^15.0.1", "@angular-eslint/builder": "~15.1.0", "@angular-eslint/eslint-plugin": "~15.1.0", diff --git a/templates/module/angular/projects/my-project-name/package.json b/templates/module/angular/projects/my-project-name/package.json index cb55596aa4..2b6ab9742a 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": ">=14", "@angular/core": ">=14", - "@abp/ng.core": ">=7.1.0", - "@abp/ng.theme.shared": ">=7.1.0" + "@abp/ng.core": ">=7.1.1", + "@abp/ng.theme.shared": ">=7.1.1" }, "dependencies": { "tslib": "^2.1.0" diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20230314024642_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20230324070230_Initial.Designer.cs similarity index 98% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20230314024642_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20230324070230_Initial.Designer.cs index 5d2f29ad1d..4c20a44d53 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20230314024642_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20230324070230_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(AuthServerDbContext))] - [Migration("20230314024642_Initial")] + [Migration("20230324070230_Initial")] partial class Initial { /// @@ -833,6 +833,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20230314024642_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20230324070230_Initial.cs similarity index 98% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20230314024642_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20230324070230_Initial.cs index e4e66c791a..3c62b40bf4 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20230314024642_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/20230324070230_Initial.cs @@ -292,6 +292,22 @@ namespace MyCompanyName.MyProjectName.Migrations table.PrimaryKey("PK_AbpTenants", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpUserDelegations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + StartTime = table.Column(type: "datetime2", nullable: false), + EndTime = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserDelegations", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpUsers", columns: table => new @@ -990,6 +1006,9 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpUserClaims"); + migrationBuilder.DropTable( + name: "AbpUserDelegations"); + migrationBuilder.DropTable( name: "AbpUserLogins"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs index db9401d3a9..931645fcd4 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/Migrations/AuthServerDbContextModelSnapshot.cs @@ -830,6 +830,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/package.json index 4704f0e553..2ec97442e8 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.AuthServer/package.json @@ -3,6 +3,6 @@ "name": "my-app-authserver", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.1" } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20230314024129_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20230324070306_Initial.Designer.cs similarity index 98% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20230314024129_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20230324070306_Initial.Designer.cs index 26b508fa35..ec67c21814 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20230314024129_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20230324070306_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20230314024129_Initial")] + [Migration("20230324070306_Initial")] partial class Initial { /// @@ -833,6 +833,33 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20230314024129_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20230324070306_Initial.cs similarity index 97% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20230314024129_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20230324070306_Initial.cs index efc30c3e7a..bb45390890 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20230314024129_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/20230324070306_Initial.cs @@ -292,6 +292,22 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations table.PrimaryKey("PK_AbpTenants", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpUserDelegations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + StartTime = table.Column(type: "datetime2", nullable: false), + EndTime = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserDelegations", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpUsers", columns: table => new @@ -827,6 +843,9 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations migrationBuilder.DropTable( name: "AbpUserClaims"); + migrationBuilder.DropTable( + name: "AbpUserDelegations"); + migrationBuilder.DropTable( name: "AbpUserLogins"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs index 2b067dbd97..82640002ba 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/Migrations/UnifiedDbContextModelSnapshot.cs @@ -830,6 +830,33 @@ namespace MyCompanyName.MyProjectName.Blazor.Server.Host.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json index d808e7f829..b153d7522c 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/package.json @@ -3,7 +3,7 @@ "name": "my-app", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.0", - "@abp/aspnetcore.components.server.basictheme": "^7.1.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.1", + "@abp/aspnetcore.components.server.basictheme": "^7.1.1" } } 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 0639f4712f..674131b6d3 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": "^7.1.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.1" } } diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20230314024104_Initial.Designer.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20230324070335_Initial.Designer.cs similarity index 98% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20230314024104_Initial.Designer.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20230324070335_Initial.Designer.cs index 60700e19ff..4f740ff8a5 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20230314024104_Initial.Designer.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20230324070335_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace MyCompanyName.MyProjectName.Migrations { [DbContext(typeof(UnifiedDbContext))] - [Migration("20230314024104_Initial")] + [Migration("20230324070335_Initial")] partial class Initial { /// @@ -833,6 +833,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20230314024104_Initial.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20230324070335_Initial.cs similarity index 97% rename from templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20230314024104_Initial.cs rename to templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20230324070335_Initial.cs index 172f52146e..fddce44b7d 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20230314024104_Initial.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/20230324070335_Initial.cs @@ -292,6 +292,22 @@ namespace MyCompanyName.MyProjectName.Migrations table.PrimaryKey("PK_AbpTenants", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpUserDelegations", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + TenantId = table.Column(type: "uniqueidentifier", nullable: true), + SourceUserId = table.Column(type: "uniqueidentifier", nullable: false), + TargetUserId = table.Column(type: "uniqueidentifier", nullable: false), + StartTime = table.Column(type: "datetime2", nullable: false), + EndTime = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpUserDelegations", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpUsers", columns: table => new @@ -827,6 +843,9 @@ namespace MyCompanyName.MyProjectName.Migrations migrationBuilder.DropTable( name: "AbpUserClaims"); + migrationBuilder.DropTable( + name: "AbpUserDelegations"); + migrationBuilder.DropTable( name: "AbpUserLogins"); diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs index 72be56741e..02398bbd56 100644 --- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs +++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/Migrations/UnifiedDbContextModelSnapshot.cs @@ -830,6 +830,33 @@ namespace MyCompanyName.MyProjectName.Migrations b.ToTable("AbpUserClaims", (string)null); }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserDelegation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("EndTime") + .HasColumnType("datetime2"); + + b.Property("SourceUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("StartTime") + .HasColumnType("datetime2"); + + b.Property("TargetUserId") + .HasColumnType("uniqueidentifier"); + + b.Property("TenantId") + .HasColumnType("uniqueidentifier") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.ToTable("AbpUserDelegations", (string)null); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => { b.Property("UserId") 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 0639f4712f..674131b6d3 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": "^7.1.0" + "@abp/aspnetcore.mvc.ui.theme.basic": "^7.1.1" } }