Skip to content
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------

namespace System.Security.User;


/// <summary>
/// Used for setting date flow filters against the Last Login time field on the user details page.
/// </summary>
enum 774 "User Detail Date Filter"
{
value(0; Blank)
{
}
value(1; "7 Days")
{
Caption = '7 Days';
}
value(2; "30 Days")
{
Caption = '30 Days';
}
value(3; "90 Days")
{
Caption = '90 Days';
}
}
92 changes: 90 additions & 2 deletions src/System Application/App/User Details/src/UserDetails.Page.al
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,18 @@
namespace System.Security.User;

using System.Environment;
using System.Security.AccessControl;
using System.Utilities;

/// <summary>
/// Shows detailed user information, such as unique identifiers, information about permission sets etc.
/// </summary>
page 774 "User Details"
{
AboutText = 'View the additional information about users in a list view, which allows for easy searching and filtering.';
AboutText = 'View detailed user information, such as unique identifiers, information about permission sets, login activity etc. in a list view, which allows for easy searching and filtering.';
AboutTitle = 'About the users detailed view';
ApplicationArea = Basic, Suite;
Caption = 'Users';
Caption = 'Users (Detailed View)';
DeleteAllowed = false;
Editable = false;
InsertAllowed = false;
Expand Down Expand Up @@ -67,6 +69,36 @@ page 774 "User Details"
ToolTip = 'Specifies ID assigned to the user in Microsoft Entra.';
Visible = IsSaaS;
}
field("Last Login Date"; Rec."Last Login Date")
{
Caption = 'Last Login Date';
ToolTip = 'Specifies the date and time when the user last logged in.';
}
field("Inactive Days"; InactiveDays)
{
Caption = 'Inactive (days)';
ToolTip = 'Specifies the number of days since the user last logged in.';
}
field(SystemCreatedAt; SystemCreatedAt)
{
Caption = 'Created On';
ToolTip = 'Specifies the date and time when the user record was created.';
}
field(CreatedBy; CreatedByUser."User Name")
{
Caption = 'Created By';
ToolTip = 'Specifies the user who created the user record.';
}
field(SystemModifiedAt; SystemModifiedAt)
{
Caption = 'Modified On';
ToolTip = 'Specifies the date and time when the user record was last modified.';
}
field(ModifiedBy; ModifiedByUser."User Name")
{
Caption = 'Modified By';
ToolTip = 'Specifies the user who last modified the user record.';
}
// Can be added with "Personalize"
field("Has SUPER permission set"; Rec."Has SUPER permission set")
{
Expand All @@ -89,6 +121,21 @@ page 774 "User Details"
Caption = 'Users with SUPER permission set';
Filters = where("Has SUPER permission set" = const(true));
}
view("7 Days")
{
Caption = 'Inactive 7 days';
Filters = where("Inactive Days Date Filter" = const("7 Days"));
}
view("30 Days")
{
Caption = 'Inactive 30 days';
Filters = where("Inactive Days Date Filter" = const("30 Days"));
}
view("90 Days")
{
Caption = 'Inactive 90 days';
Filters = where("Inactive Days Date Filter" = const("90 Days"));
}
}

trigger OnOpenPage()
Expand All @@ -100,6 +147,47 @@ page 774 "User Details"
UserDetails.Get(Rec);
end;

trigger OnFindRecord(Which: Text): Boolean
var
UserDetails: Record "User Details";
begin
Rec.SetRange("Last Login Date");
if Rec.GetFilter("Inactive Days Date Filter") <> '' then
if Evaluate(UserDetails."Inactive Days Date Filter", Rec.GetFilter("Inactive Days Date Filter")) then
case UserDetails."Inactive Days Date Filter" of
Rec."Inactive Days Date Filter"::"7Days":
Rec.SetFilter("Last Login Date", '<=%1', CreateDateTime(CalcDate('<-7D>', Today()), CurrentDateTime().Time));
Rec."Inactive Days Date Filter"::"30Days":
Rec.SetFilter("Last Login Date", '<=%1', CreateDateTime(CalcDate('<-30D>', Today()), CurrentDateTime().Time));
Rec."Inactive Days Date Filter"::"90Days":
Rec.SetFilter("Last Login Date", '<=%1', CreateDateTime(CalcDate('<-90D>', Today()), CurrentDateTime().Time));
else
OnInactiveDaysFilterCaseElse(UserDetails."Inactive Days Date Filter", Rec);
end;

exit(Rec.Find(Which));
end;

trigger OnAfterGetRecord()
var
Math: Codeunit Math;
begin
if CreatedByUser.Get(Rec.SystemCreatedBy) then;
if ModifiedByUser.Get(Rec.SystemModifiedBy) then;
if Rec."Last Login Date".Date <> 0D then
InactiveDays := Math.Floor(Today() - Rec."Last Login Date".Date);
end;

var
CreatedByUser: Record User;
ModifiedByUser: Record User;
InactiveDays: Integer;

protected var
IsSaaS: Boolean;

[IntegrationEvent(false, false)]
local procedure OnInactiveDaysFilterCaseElse(DateFilter: Enum "User Detail Date Filter"; var Rec: Record "User Details")
begin
end;
}
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,27 @@ table 774 "User Details"
Editable = false;
FieldClass = FlowField;
}
/// <summary>
/// The last login date of the user.
/// </summary>
field(24; "Last Login Date"; DateTime)
{
Access = Internal;
Caption = 'Last Login Date';
Editable = false;
FieldClass = FlowField;
CalcFormula = Lookup("User Login"."Last Login Date" where("User SID" = field("User Security ID")));
}
/// <summary>
/// Flow filter for filtering users based on Last Login Date.
/// </summary>
field(25; "Inactive Days Date Filter"; Enum "User Detail Date Filter")
{
Access = Internal;
Caption = 'Inactive Days Date Filter';
Editable = false;
FieldClass = FlowFilter;
}
}

keys
Expand Down
Loading