@ -1,4 +1,5 @@
using System.Linq ;
using System ;
using System.Linq ;
using Microsoft.AspNetCore.Razor.TagHelpers ;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Popover
@ -13,44 +14,67 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Popover
SetDataPlacement ( context , output ) ;
SetPopoverData ( context , output ) ;
SetDataTriggerIfDismissible ( context , output ) ;
SetDataTriggerIfHoverable ( context , output ) ;
}
else
{
SetDisabled ( context , output ) ;
}
}
}
protected virtual void SetDisabled ( TagHelperContext context , TagHelperOutput output )
{
var triggerAsHtml = TagHelper . Dismissible ? ? false ? "datatrigger=\"focus\" " : "" ;
// If not dismissable for hoverable condition
if ( string . IsNullOrEmpty ( triggerAsHtml ) )
var triggerAsHtml = TagHelper . Dismissible ? ? false ? "data-trigger=\"focus\" " : "" ;
if ( TagHelper . Hoverable ? ? false )
{
triggerAsHtml = TagHelper . Hoverable ? ? false ? "data-trigger=\"hover\" " : string . Empty ;
if ( triggerAsHtml . Contains ( "focus" ) )
{
triggerAsHtml = triggerAsHtml . Replace ( "focus" , "focus hover" ) ;
}
else
{
triggerAsHtml = "data-trigger=\"hover\" " ;
}
}
var dataPlacementAsHtml = "data-placement=\"" + GetDirectory ( ) . ToString ( ) . ToLowerInvariant ( ) + "\" " ;
// data-placement="default" with data-trigger="focus" causes Cannot read property 'indexOf' of undefined at computeAutoPlacement(bootstrap.bundle.js?_v=637146714627330435:2185) error
if ( IsDismissibleOrHoverable ( ) & & GetDirectory ( ) = = PopoverDirectory . Default )
{
//dataPlacementAsHtml = string.Empty; //bootstrap default placement is right, abp's is top.
dataPlacementAsHtml = dataPlacementAsHtml . Replace ( "default" , "top" ) ;
}
var titleAttribute = output . Attributes . FirstOrDefault ( at = > at . Name = = "title" ) ;
var titleAsHtml = titleAttribute = = null ? "" : "title=\"" + titleAttribute . Value + "\" " ;
var preElementHtml = "<span class=\"d-inline-block\" " + titleAsHtml + triggerAsHtml + dataPlacementAsHtml + "data-toggle=\"popover\" data-content=\"" + GetDataContent ( ) + "\">" ;
var preElementHtml = "<span tabindex=\"0\" class=\"d-inline-block\" " + titleAsHtml + triggerAsHtml + dataPlacementAsHtml + "data-toggle=\"popover\" data-content=\"" + GetDataContent ( ) + "\">" ;
var postElementHtml = "</span>" ;
output . PreElement . SetHtmlContent ( preElementHtml ) ;
output . PostElement . SetHtmlContent ( postElementHtml ) ;
output . Attributes . Add ( "style" , "pointer-events: none;" ) ;
}
}
protected virtual void SetDataTriggerIfDismissible ( TagHelperContext context , TagHelperOutput output )
{
if ( TagHelper . Dismissible ? ? false )
{
output . Attributes . Add ( "data-trigger" , "focus" ) ;
}
// Dismissible has priority over hoverable
else if ( TagHelper . Hoverable ? ? false )
{
output . Attributes . Add ( "data-trigger" , "hover" ) ;
}
}
protected virtual void SetDataTriggerIfHoverable ( TagHelperContext context , TagHelperOutput output )
{
if ( TagHelper . Hoverable ? ? false )
{
//If already has focus data trigger
if ( output . Attributes . TryGetAttribute ( "data-trigger" , out _ ) )
{
output . Attributes . SetAttribute ( new TagHelperAttribute ( "data-trigger" , "focus hover" ) ) ;
}
else
{
output . Attributes . Add ( "data-trigger" , "hover" ) ;
}
}
}
protected virtual void SetDataToggle ( TagHelperContext context , TagHelperOutput output )
@ -111,5 +135,17 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Popover
return PopoverDirectory . Default ;
}
protected virtual bool IsDismissibleOrHoverable ( )
{
if ( TagHelper . Dismissible ? ? false )
{
return true ;
}
if ( TagHelper . Hoverable ? ? false )
{
return true ;
}
return false ;
}
}
}