|
@@ -38,7 +38,10 @@ Type
|
|
FHeaderImage: String;
|
|
FHeaderImage: String;
|
|
FHideDelay: Integer;
|
|
FHideDelay: Integer;
|
|
FMinWidth: Integer;
|
|
FMinWidth: Integer;
|
|
|
|
+ FOnHide: TNotifyEvent;
|
|
|
|
+ FShowing: Boolean;
|
|
FSmallHeader: String;
|
|
FSmallHeader: String;
|
|
|
|
+ FUnrenderOnHide: Boolean;
|
|
procedure SetAnimate(AValue: Boolean);
|
|
procedure SetAnimate(AValue: Boolean);
|
|
procedure SetAutoHide(AValue: Boolean);
|
|
procedure SetAutoHide(AValue: Boolean);
|
|
procedure SetBody(AValue: String);
|
|
procedure SetBody(AValue: String);
|
|
@@ -49,15 +52,19 @@ Type
|
|
procedure SetHideDelay(AValue: Integer);
|
|
procedure SetHideDelay(AValue: Integer);
|
|
procedure SetMinWidth(AValue: Integer);
|
|
procedure SetMinWidth(AValue: Integer);
|
|
procedure SetSmallHeader(AValue: String);
|
|
procedure SetSmallHeader(AValue: String);
|
|
|
|
+ procedure SetUnrenderOnHide(AValue: Boolean);
|
|
Protected
|
|
Protected
|
|
|
|
+ function BootstrapHide(aEvent: TJSEvent): Boolean; virtual;
|
|
function BodyHTML: String; virtual;
|
|
function BodyHTML: String; virtual;
|
|
function CloseButtonHTML: String; virtual;
|
|
function CloseButtonHTML: String; virtual;
|
|
function HeaderHTML: String; virtual;
|
|
function HeaderHTML: String; virtual;
|
|
Function GetTemplateHTML: String; override;
|
|
Function GetTemplateHTML: String; override;
|
|
Function DoRenderHTML(aParent, aElement: TJSHTMLElement): TJSHTMLElement; override;
|
|
Function DoRenderHTML(aParent, aElement: TJSHTMLElement): TJSHTMLElement; override;
|
|
|
|
+ procedure ApplyWidgetSettings(aElement: TJSHTMLElement); override;
|
|
Public
|
|
Public
|
|
Constructor Create(aOwner : TComponent); override;
|
|
Constructor Create(aOwner : TComponent); override;
|
|
Procedure Hide;
|
|
Procedure Hide;
|
|
|
|
+ Property Showing : Boolean Read FShowing;
|
|
Published
|
|
Published
|
|
Property Header : String Read FHeader Write SetHeader;
|
|
Property Header : String Read FHeader Write SetHeader;
|
|
Property SmallHeader : String Read FSmallHeader Write SetSmallHeader;
|
|
Property SmallHeader : String Read FSmallHeader Write SetSmallHeader;
|
|
@@ -69,8 +76,12 @@ Type
|
|
Property AutoHide : Boolean Read FAutoHide Write SetAutoHide default True;
|
|
Property AutoHide : Boolean Read FAutoHide Write SetAutoHide default True;
|
|
Property Animate : Boolean Read FAnimate Write SetAnimate default False;
|
|
Property Animate : Boolean Read FAnimate Write SetAnimate default False;
|
|
Property MinWidth : Integer Read FMinWidth Write SetMinWidth default 200;
|
|
Property MinWidth : Integer Read FMinWidth Write SetMinWidth default 200;
|
|
|
|
+ Property UnrenderOnHide : Boolean Read FUnrenderOnHide Write SetUnrenderOnHide;
|
|
|
|
+ Property OnHide : TNotifyEvent Read FOnHide Write FOnHide;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+ TBootstrapToastWidget = class (TSimpleToastWidget);
|
|
|
|
+
|
|
// Encapsulates the global tag where the toasts are shown.
|
|
// Encapsulates the global tag where the toasts are shown.
|
|
|
|
|
|
{ TToastManager }
|
|
{ TToastManager }
|
|
@@ -92,6 +103,7 @@ Type
|
|
procedure SetMultiToast(AValue: Boolean);
|
|
procedure SetMultiToast(AValue: Boolean);
|
|
Protected
|
|
Protected
|
|
Class Function DefaultParentElement : TJSHTMLElement; override;
|
|
Class Function DefaultParentElement : TJSHTMLElement; override;
|
|
|
|
+ Function BootstrapHide(Event : TJSEvent) : Boolean;
|
|
Function DoRenderHTML(aParent, aElement: TJSHTMLElement): TJSHTMLElement; override;
|
|
Function DoRenderHTML(aParent, aElement: TJSHTMLElement): TJSHTMLElement; override;
|
|
Function GetContentElement: TJSHTMLELement; override;
|
|
Function GetContentElement: TJSHTMLELement; override;
|
|
Procedure InvalidateElement; override;
|
|
Procedure InvalidateElement; override;
|
|
@@ -209,6 +221,7 @@ Type
|
|
Function BootstrapHide(Event : TJSEvent) : Boolean;
|
|
Function BootstrapHide(Event : TJSEvent) : Boolean;
|
|
Function DoRenderHTML(aParent, aElement: TJSHTMLElement): TJSHTMLElement; override;
|
|
Function DoRenderHTML(aParent, aElement: TJSHTMLElement): TJSHTMLElement; override;
|
|
Function GetTemplateHTML: String; override;
|
|
Function GetTemplateHTML: String; override;
|
|
|
|
+ procedure ApplyWidgetSettings(aElement: TJSHTMLElement); override;
|
|
Procedure RefreshReferences; override;
|
|
Procedure RefreshReferences; override;
|
|
function GetTemplateManager: TCustomTemplateLoader; virtual;
|
|
function GetTemplateManager: TCustomTemplateLoader; virtual;
|
|
procedure DoShow; virtual;
|
|
procedure DoShow; virtual;
|
|
@@ -241,6 +254,7 @@ Implementation
|
|
|
|
|
|
Resourcestring
|
|
Resourcestring
|
|
SErrNoTemplateSet = '%s: No template set';
|
|
SErrNoTemplateSet = '%s: No template set';
|
|
|
|
+ SErrCannotUnrenderFixedElementID = 'Cannot unrender when ElementID (%s) is set';
|
|
|
|
|
|
function Toasts: TToastManager;
|
|
function Toasts: TToastManager;
|
|
begin
|
|
begin
|
|
@@ -385,6 +399,11 @@ begin
|
|
Result:=TJSHTMLElement(Document.body);
|
|
Result:=TJSHTMLElement(Document.body);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+function TToastManager.BootstrapHide(Event: TJSEvent): Boolean;
|
|
|
|
+begin
|
|
|
|
+
|
|
|
|
+end;
|
|
|
|
+
|
|
function TToastManager.DoRenderHTML(aParent, aElement: TJSHTMLElement): TJSHTMLElement;
|
|
function TToastManager.DoRenderHTML(aParent, aElement: TJSHTMLElement): TJSHTMLElement;
|
|
|
|
|
|
Var
|
|
Var
|
|
@@ -467,15 +486,20 @@ begin
|
|
S:=ContextualNames[Contextual];
|
|
S:=ContextualNames[Contextual];
|
|
if S<>'' then
|
|
if S<>'' then
|
|
S:='text-'+S;
|
|
S:='text-'+S;
|
|
- Result:=Result+ '<button type="button" class="ml-2 mb-1 close '+S+'" data-dismiss="toast" aria-label="Close">';
|
|
|
|
- Result:=Result+ ' <span aria-hidden="true">×</span>';
|
|
|
|
|
|
+ if BootStrapVersion=bv4 then
|
|
|
|
+ S:=S+' close'
|
|
|
|
+ else
|
|
|
|
+ S:=S+' btn-close';
|
|
|
|
+ Result:=Result+ '<button type="button" class="xml-2 xmb-1 close '+S+'" data-dismiss="toast" data-bs-dismiss="toast" aria-label="Close">';
|
|
|
|
+ if BootstrapVersion=bv4 then
|
|
|
|
+ Result:=Result+ ' <span aria-hidden="true">×</span>';
|
|
Result:=Result+ '</button>';
|
|
Result:=Result+ '</button>';
|
|
end;
|
|
end;
|
|
|
|
|
|
function TSimpleToastWidget.HeaderHTML: String;
|
|
function TSimpleToastWidget.HeaderHTML: String;
|
|
|
|
|
|
Var
|
|
Var
|
|
- S : String;
|
|
|
|
|
|
+ me,S : String;
|
|
|
|
|
|
begin
|
|
begin
|
|
S:=ContextualNames[Contextual];
|
|
S:=ContextualNames[Contextual];
|
|
@@ -484,7 +508,11 @@ begin
|
|
Result:='<div class="toast-header '+S+'">';
|
|
Result:='<div class="toast-header '+S+'">';
|
|
if HeaderImage<>'' then
|
|
if HeaderImage<>'' then
|
|
Result:=Result+'<img src="'+HeaderImage+'" class="rounded mr-2">';
|
|
Result:=Result+'<img src="'+HeaderImage+'" class="rounded mr-2">';
|
|
- Result:=Result+'<div class="mr-auto">'+Header+'</div>';
|
|
|
|
|
|
+ if BootStrapVersion=bv4 then
|
|
|
|
+ me:='mr'
|
|
|
|
+ else
|
|
|
|
+ me:='me';
|
|
|
|
+ Result:=Result+'<div class="'+me+'-auto">'+Header+'</div>';
|
|
if (SmallHeader<>'') then
|
|
if (SmallHeader<>'') then
|
|
Result:=Result+'<small>'+SmallHeader+'</small>';
|
|
Result:=Result+'<small>'+SmallHeader+'</small>';
|
|
if CloseButton then
|
|
if CloseButton then
|
|
@@ -562,6 +590,25 @@ begin
|
|
if isRendered then Refresh;
|
|
if isRendered then Refresh;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+procedure TSimpleToastWidget.SetUnrenderOnHide(AValue: Boolean);
|
|
|
|
+begin
|
|
|
|
+ if FUnrenderOnHide=AValue then Exit;
|
|
|
|
+ if FixedElementID and aValue then
|
|
|
|
+ Raise EWidgets.CreateFmt(SErrCannotUnrenderFixedElementID,[ElementID]);
|
|
|
|
+ FUnrenderOnHide:=AValue;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TSimpleToastWidget.BootstrapHide(aEvent: TJSEvent) : Boolean;
|
|
|
|
+
|
|
|
|
+begin
|
|
|
|
+ FShowing:=False;
|
|
|
|
+ // Writeln('In bootstraphide callback ', assigned(onhide));
|
|
|
|
+ If Assigned(OnHide) then
|
|
|
|
+ OnHide(Self);
|
|
|
|
+ if UnrenderOnHide then
|
|
|
|
+ Unrender;
|
|
|
|
+end;
|
|
|
|
+
|
|
function TSimpleToastWidget.BodyHTML: String;
|
|
function TSimpleToastWidget.BodyHTML: String;
|
|
|
|
|
|
Var
|
|
Var
|
|
@@ -591,8 +638,14 @@ end;
|
|
function TSimpleToastWidget.DoRenderHTML(aParent, aElement: TJSHTMLElement): TJSHTMLElement;
|
|
function TSimpleToastWidget.DoRenderHTML(aParent, aElement: TJSHTMLElement): TJSHTMLElement;
|
|
begin
|
|
begin
|
|
Result:=inherited DoRenderHTML(aParent, aElement);
|
|
Result:=inherited DoRenderHTML(aParent, aElement);
|
|
- JQuery(Result).toast(New(['animation',FAnimate,'autohide',autohide,'delay',FHideDelay]));
|
|
|
|
- JQuery(Result).ToastShow;
|
|
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TSimpleToastWidget.ApplyWidgetSettings(aElement: TJSHTMLElement);
|
|
|
|
+begin
|
|
|
|
+ inherited ApplyWidgetSettings(aElement);
|
|
|
|
+ JQuery(aElement).toast(New(['animation',FAnimate,'autohide',autohide,'delay',FHideDelay]));
|
|
|
|
+ JQuery(aElement).ToastShow;
|
|
|
|
+ jQuery(aElement).on_('hidden.bs.toast',@BootstrapHide);
|
|
end;
|
|
end;
|
|
|
|
|
|
constructor TSimpleToastWidget.Create(aOwner: TComponent);
|
|
constructor TSimpleToastWidget.Create(aOwner: TComponent);
|
|
@@ -738,6 +791,8 @@ Var
|
|
begin
|
|
begin
|
|
Result:=False;
|
|
Result:=False;
|
|
FShowing:=False;
|
|
FShowing:=False;
|
|
|
|
+ if FHideEl=Nil then
|
|
|
|
+ FHideEl:=TJSHTMLElement(Event.targetElement);
|
|
// Writeln('In bootstraphide callback ', assigned(onhide));
|
|
// Writeln('In bootstraphide callback ', assigned(onhide));
|
|
If Assigned(OnHide) then
|
|
If Assigned(OnHide) then
|
|
begin
|
|
begin
|
|
@@ -763,13 +818,18 @@ function TBootstrapModal.DoRenderHTML(aParent, aElement: TJSHTMLElement): TJSHTM
|
|
begin
|
|
begin
|
|
FHideEl:=Nil;
|
|
FHideEl:=Nil;
|
|
Result:=inherited DoRenderHTML(aParent, aElement);
|
|
Result:=inherited DoRenderHTML(aParent, aElement);
|
|
- JQuery(Result).modal(New([
|
|
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TBootstrapModal.ApplyWidgetSettings(aElement: TJSHTMLElement);
|
|
|
|
+
|
|
|
|
+begin
|
|
|
|
+ JQuery(aElement).modal(New([
|
|
'backdrop', BackDrop,
|
|
'backdrop', BackDrop,
|
|
'keyboard', keyboard,
|
|
'keyboard', keyboard,
|
|
'focus',Focus,
|
|
'focus',Focus,
|
|
'show',ShowOnRender
|
|
'show',ShowOnRender
|
|
]));
|
|
]));
|
|
- jQuery(Result).on_('hidden.bs.modal',@BootstrapHide);
|
|
|
|
|
|
+ jQuery(aElement).on_('hidden.bs.modal',@BootstrapHide);
|
|
end;
|
|
end;
|
|
|
|
|
|
function TBootstrapModal.GetTemplateHTML: String;
|
|
function TBootstrapModal.GetTemplateHTML: String;
|
|
@@ -841,7 +901,7 @@ procedure TBootstrapModal.Show;
|
|
end;
|
|
end;
|
|
|
|
|
|
begin
|
|
begin
|
|
- if (Template<>'') Then
|
|
|
|
|
|
+ if (Template<>'') or (ElementID<>'') Then
|
|
DoShow
|
|
DoShow
|
|
else if TemplateName<>'' then
|
|
else if TemplateName<>'' then
|
|
GetTemplateManager.IfTemplate(TemplateName,@DoShowTemplate)
|
|
GetTemplateManager.IfTemplate(TemplateName,@DoShowTemplate)
|