Activities of "berkansasmaz"

Sorry, my fault. I expected this to work, but it didn't. I tested the code below. Can you try?

    abp.libs.sweetAlert.config.error.footer = "<button type='button' id='DownloadLog' class='swal2-cancel swal2-styled'>Download Log</button>"
    abp.libs.sweetAlert.config.error.didOpen = () => {
        $("#DownloadLog").click(function() {
            console.log("Test");
        });
    }

The blog was inaccurate? You cannot do it the way they said?

I have no idea about this, I did not read the article. I tried to explain the simplest solution completely according to your requirement.

Either way I tried doing it your way. We don't have the angular UI on my project, so I added it into migrations.

Screenshots may belong to the angular interface, but there are similar pages in other user interfaces.

Does it use the key the name, "Abp.Account.EMailConfirmationLink"? I inserted a value for "Abp.Account.EMailConfirmationLink" with content for the email, but it did not use it when I send the confirmation email.

Did you try it from the user interface or did you try to change it by writing code?

Also, where are the original templates coming from? Is it a resource or something? Since database, after initial migration, does not have the list of templates shown above. The "AbpTextTemplateContents" table is empty on initial migration.

Yes, it is a resource. Resource path: Volo/Abp/Account/Emailing/Templates/EmailConfirmationLink.tpl


If you do not want to make this change through the user interface, I recommend you to read the following document if you want to do it with code. => https://docs.abp.io/en/abp/latest/Emailing#overriding-replacing-the-standard-templates

How to trigger Copy Log button click for this solution, can you give an example? Because, it can not be triggered.

I think you can do this in your globally used script file by using the id you gave to the button.

Note: If you don't have a global js file, you can do it similarly to the global.css' config.

$( "#DownloadLog" ).click(function() {
  alert( "Handler for .click() called." );
});

Unfortunately, the Suite does not support this feature. However, there is no obstacle for you to manually add the properties you want according to the requirements of your application.

Hello,

I opened a pull-reqeuest on the topic. See: https://github.com/abpframework/abp/pull/14188

Workaround solution:

Copy the code of the model class you want to override and paste it into the contents of your own model class. For example: https://github.com/abpframework/abp/blob/dev/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml.cs

Then update the model on the page to reference your customized model class. For instance: https://github.com/abpframework/abp/blob/317eb03942c49ddbdff09a7a7d7bfcf7ff3dd518/modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/Public/CmsKit/Blogs/Index.cshtml#L8

You can find the code you want below ✌️

Themes/LeptonX/Layouts/Account/Default.cshtml

@using Microsoft.Extensions.Localization
@using Microsoft.Extensions.Options
@using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX
@using Volo.Abp.Localization
@using Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook
@using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX.Bundling
@using Volo.Abp.AspNetCore.Mvc.UI.Theming
@using Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetScripts
@using Volo.Abp.AspNetCore.Mvc.UI.Widgets.Components.WidgetStyles
@using Volo.Abp.Ui.Branding
@using Volo.Abp.AspNetCore.Mvc.AntiForgery
@using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.Localization
@using Volo.Abp.AspNetCore.MultiTenancy
@using Volo.Abp.MultiTenancy
@using Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX.Themes.LeptonX.Components.Common.PageAlerts
@inject IAbpAntiForgeryManager AbpAntiForgeryManager
@inject IBrandingProvider BrandingProvider
@inject LeptonXStyleProvider LeptonXStyleProvider
@inject IStringLocalizer<AbpUiMultiTenancyResource> MultiTenancyStringLocalizer
@inject ITenantResolveResultAccessor TenantResolveResultAccessor
@inject IOptions<AbpMultiTenancyOptions> MultiTenancyOptions
@inject ICurrentTenant CurrentTenant

@{
	AbpAntiForgeryManager.SetCookie();
	var langDir = CultureHelper.IsRtl ? "rtl" : string.Empty;
	var title = ViewBag.Title == null ? BrandingProvider.AppName : ViewBag.Title;

	var logoUrl = BrandingProvider.LogoUrl == null ? null : "--lpx-logo: url(" + BrandingProvider.LogoUrl + ");";
	var logoReverseUrl = BrandingProvider.LogoReverseUrl == null ? null : "--lpx-logo: url(" +
	BrandingProvider.LogoReverseUrl + ");";
	var selectedStyle = await LeptonXStyleProvider.GetSelectedStyleAsync();

    var selectedStyleFileName = CultureHelper.IsRtl ? selectedStyle + ".rtl" : selectedStyle;
}
<!DOCTYPE html>
<html lang="@CultureInfo.CurrentCulture.Name" dir="@langDir">

<head>

	@await Component.InvokeLayoutHookAsync(LayoutHooks.Head.First, StandardLayouts.Account)

	<title>@title</title>

	<meta name="viewport" content="width=device-width,initial-scale=1.0" />
	<meta charset="UTF-8" />
	<meta name="description" content="@ViewBag.MetaDescription">

	<link rel="icon" href="~/images/favicon/logo-favicon_1.svg" type="image/svg+xml">
	<link rel="manifest" href="~/images/favicon/site.webmanifest">

	<abp-style-bundle name="@LeptonXThemeBundles.Styles.Global" />

	<link href="/Themes/LeptonX/Global/side-menu/css/bootstrap-@(selectedStyleFileName).css" type="text/css" rel="stylesheet" id="lpx-theme-bootstrap-@selectedStyle" />
	<link href="/Themes/LeptonX/Global/side-menu/css/@(selectedStyleFileName).css" type="text/css" rel="stylesheet" id="lpx-theme-color-@selectedStyle" />

	@await Component.InvokeAsync(typeof(WidgetStylesViewComponent))
	@await RenderSectionAsync("styles", false)
	@await Component.InvokeLayoutHookAsync(LayoutHooks.Head.Last, StandardLayouts.Account)

	@*TODO Removed from this layout to prevent unvisible logos*@
	@if (logoReverseUrl != null)
		{
		<style>
			:root .lpx-theme-dark {
			@logoUrl
			}
			:root .lpx-theme-dim {
			@logoUrl
			}
		</style>
	}

	@if (logoReverseUrl != null)
		{
		<style>
			:root .lpx-theme-light {
			@logoReverseUrl
			}
		</style>
	}
</head>

<body>

	@await Component.InvokeLayoutHookAsync(LayoutHooks.Body.First, StandardLayouts.Account)

	<div class="container-fluid overflow-hidden">
		<div class="row">
			<div class="col-lg-6 px-0 d-none d-lg-block overflow-hidden lpx-login-image-area">
				<img src="/Themes/LeptonX/Global/assets/img/login-bg.jpg" alt="login image" class="login-img">
				<div class="lpx-brand-logo lpx-login-big-logo"></div>
			</div>
			<div class="col-lg-6 position-relative">
				<div class="row align-items-center min-vh-100 py-5 pb-0">
					<div class="col-11 mx-auto lpx-login-form-max-width">
						<div class="lpx-brand-logo mb-4 mx-auto lpx-login-sm-logo"></div>
						<div class="card">
							<div class="card-body p-4 p-lg-5 pb-0 pb-lg-0">

								@await Component.InvokeAsync(typeof(PageAlertsViewComponent))
								
								@if (MultiTenancyOptions.Value.IsEnabled &&
										(TenantResolveResultAccessor.Result?.AppliedResolvers?.Contains(CookieTenantResolveContributor.ContributorName)
										== true ||
										TenantResolveResultAccessor.Result?.AppliedResolvers?.Contains(QueryStringTenantResolveContributor.ContributorName)
										== true))
								{
									<div class="row">
										<div class="col">
											<span style="font-size: .8em;"
											class="text-uppercase text-muted">@MultiTenancyStringLocalizer["Tenant"]</span><br />
											<h6 class="m-0 d-inline-block">
												@if (CurrentTenant.Id == null)
												{
													<span>
														@MultiTenancyStringLocalizer["NotSelected"]
													</span>
												}
												else
												{
													<strong>@(CurrentTenant.Name ??
												CurrentTenant.Id.Value.ToString())</strong>
												}
											</h6>
										</div>
										<div class="col-auto">
											<a id="AbpTenantSwitchLink" href="javascript:;"
											class="btn btn-sm btn-outline-primary">@MultiTenancyStringLocalizer["Switch"]</a>
										</div>
									</div>
								}
								<hr />
								<div class="login-wrapper">
									<div class="auth-form">
										@RenderBody()
									</div>
								</div>
							</div>
						</div>
					</div>
				</div>
				<footer>
					@await Html.PartialAsync("~/Themes/LeptonX/Layouts/Account/_Footer.cshtml")
				</footer>
			</div>
		</div>
	</div>

	
	<abp-script-bundle name="@LeptonXThemeBundles.Scripts.Global" />
    <script type="text/javascript" src="~/Abp/ApplicationConfigurationScript"></script>
    <script type="text/javascript" src="~/Abp/ServiceProxyScript"></script>

	@await Component.InvokeAsync(typeof(WidgetScriptsViewComponent))
	@await RenderSectionAsync("scripts", false)

	@await Component.InvokeLayoutHookAsync(LayoutHooks.Body.Last, StandardLayouts.Account)
</body>

</html>

Or is there a way to customize the default confirmation email?

If you want to do this through the UI, you can do it using the text-template-management module as follows.

Hi,

The account layout is defined in the Themes/LeptonX/Layouts/Account folder and you can override it by creating the file (Default.cshtml) with the same name and under the same folder. There is a partial view, its name is Footer.cshtml. You can override it by following the same way.

You can learn here how to change the account layout of the login page.

You can refer to this question to change the logo.

ABP uses abp.message.error to show errors and sweetalert2 is used in its infrastructure. So I think you can do this with Sweatalert2's configurations. For example:

$(function () {
    abp.libs.sweetAlert.config.error.footer = "<button type='button' id='Copy Log' class='swal2-cancel swal2-styled'>Download Log</button>"
    abp.libs.sweetAlert.config.error.didOpen = () => {
        var errorDetails = Swal.getHtmlContainer();
        console.log(errorDetails);
    }
});

Note: As far as I know, sweetalert2 allows you to change the entire error(or other default templates) template as well.

Result:

Note: If you want to see the detail and stack trace of the error in modal like me, you can do this as in the code below:

Configure< AbpExceptionHandlingOptions >(options =>
{
    options.SendExceptionsDetailsToClients = true;
    options.SendStackTraceToClients = true;
});

For more information:

  1. https://docs.abp.io/en/abp/latest/UI/AspNetCore/JavaScript-API/Message#sweetalert-configuration
  2. https://sweetalert2.github.io/

It is normal that you cannot use TimeOnly because MyProjectName.DomainShared targets netstandard2.0. But you can do a similar thing by adding an attribute like the code below:

   user.AddOrUpdateProperty<DateTime>(
       "OpenAt",
       options =>
       {
          options.Attributes.Add(new DataTypeAttribute(DataType.Time));
       }
   );

Result

Showing 111 to 120 of 332 entries
Made with ❤️ on ABP v9.0.0-preview Updated on September 20, 2024, 08:30