Page 1500 Workflows, source in 29

Source29

src/Layers/W1/BaseApp/System/Workflow/Workflows.Page.al482 lines, Copyright (c) Microsoft Corporation. MIT

namespace System.Automation;

using System.Environment;
using System.IO;
using System.Utilities;

page 1500 Workflows
{
    ApplicationArea = Suite;
    Caption = 'Workflows';
    Editable = false;
    PageType = List;
    AboutTitle = 'About Workflows';
    AboutText = 'Automate and manage business processes by designing workflows that connect tasks through triggers, conditions, and responses, enabling approvals, notifications, and system actions across your organization.';
    RefreshOnActivate = true;
    SourceTable = "Workflow Buffer";
    SourceTableTemporary = true;
    SourceTableView = where(Template = const(false));
    UsageCategory = Lists;

    layout
    {
        area(content)
        {
            repeater(Group)
            {
                IndentationColumn = Rec.Indentation;
                IndentationControls = Description;
                ShowAsTree = true;
                field(Description; Rec.Description)
                {
                    ApplicationArea = Basic, Suite;
                    StyleExpr = DescriptionStyle;
                    ToolTip = 'Specifies a description of the workflow.';
                }
                field(Source; Source)
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Source';
                    ToolTip = 'Specifies the source of the workflow.';
                }
                field("Category Code"; Rec."Category Code")
                {
                    ApplicationArea = Suite;
                    ToolTip = 'Specifies the workflow type, such as Administration or Finance.';
                    Visible = false;
                }
                field("Workflow Code"; Rec."Workflow Code")
                {
                    ApplicationArea = Suite;
                    ToolTip = 'Specifies the workflow that the workflow step belongs to.';
                    Visible = false;
                }
                field(Enabled; Rec.Enabled)
                {
                    ApplicationArea = Basic, Suite;
                    BlankZero = true;
                    ToolTip = 'Specifies if the workflow is enabled.';
                }
            }
        }
        area(factboxes)
        {
            systempart(Control7; Notes)
            {
                ApplicationArea = Notes;
                Visible = false;
            }
            systempart(Control8; Links)
            {
                ApplicationArea = RecordLinks;
                Visible = false;
            }
        }
    }

    actions
    {
        area(processing)
        {
            group(New)
            {
                Caption = 'New';
                action(NewAction)
                {
                    ApplicationArea = Suite;
                    Caption = 'New';
                    Image = NewDocument;
                    ToolTip = 'Create a new workflow.';

                    trigger OnAction()
                    var
                        Workflow: Record Workflow;
                        WorkflowPage: Page Workflow;
                    begin
                        if Rec.IsEmpty() then begin
                            Clear(Rec);
                            Rec.Insert();
                        end;
                        Workflow.SetRange(Template, false);
                        if Workflow.IsEmpty() then
                            Workflow.Insert();
                        Workflow.FilterGroup := 2;
                        WorkflowPage.SetOpenNew(true);
                        WorkflowPage.SetTableView(Workflow);
                        WorkflowPage.SetRecord(Workflow);
                        WorkflowPage.Run();
                    end;
                }
                action(CopyFromTemplate)
                {
                    ApplicationArea = Suite;
                    Caption = 'New Workflow from Template';
                    Image = Copy;
                    ToolTip = 'Create a new workflow quickly using a template.';

                    trigger OnAction()
                    var
                        TempWorkflowBuffer: Record "Workflow Buffer" temporary;
                    begin
                        if Rec.IsEmpty() then begin
                            Clear(Rec);
                            Rec.Insert();
                        end;
                        if PAGE.RunModal(PAGE::"Workflow Templates", TempWorkflowBuffer) = ACTION::LookupOK then begin
                            Rec.CopyWorkflow(TempWorkflowBuffer);

                            // If first workflow on an empty page
                            if Rec.Count = 1 then
                                Rec := TempWorkflowBuffer;

                            RefreshTempWorkflowBuffer();
                        end;
                    end;
                }
                action(CopyWorkflow)
                {
                    ApplicationArea = Suite;
                    Caption = 'Copy Workflow';
                    Enabled = Rec."Workflow Code" <> '';
                    Image = Copy;
                    ToolTip = 'Copy an existing workflow.';

                    trigger OnAction()
                    begin
                        Rec.CopyWorkflow(Rec);
                    end;
                }
            }
            group(Manage)
            {
                Caption = 'Manage';
                action(EditAction)
                {
                    ApplicationArea = Suite;
                    Caption = 'Edit';
                    Enabled = Rec."Workflow Code" <> '';
                    Image = Edit;
                    ShortCutKey = 'Return';
                    ToolTip = 'Edit an existing workflow.';

                    trigger OnAction()
                    var
                        Workflow: Record Workflow;
                    begin
                        if Workflow.Get(Rec."Workflow Code") then
                            PAGE.Run(PAGE::Workflow, Workflow);
                    end;
                }
                action(ViewAction)
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'View';
                    Enabled = Rec."Workflow Code" <> '';
                    Image = View;
                    ToolTip = 'View an existing workflow.';

                    trigger OnAction()
                    var
                        Workflow: Record Workflow;
                        WorkflowPage: Page Workflow;
                    begin
                        Workflow.Get(Rec."Workflow Code");
                        WorkflowPage.SetRecord(Workflow);
                        WorkflowPage.SetOpenView(true);
                        WorkflowPage.Run();
                    end;
                }
                action(DeleteAction)
                {
                    ApplicationArea = Suite;
                    Caption = 'Delete';
                    Enabled = Rec."Workflow Code" <> '';
                    Image = Delete;
                    ToolTip = 'Delete the record.';

                    trigger OnAction()
                    begin
                        Rec.Delete(true);
                        CurrPage.Update(false);
                    end;
                }
            }
            group(Process)
            {
                Caption = 'Process';
                action(ImportWorkflow)
                {
                    ApplicationArea = Suite;
                    Caption = 'Import from File';
                    Image = Import;
                    ToolTip = 'Import workflow from a file.';

                    trigger OnAction()
                    var
                        Workflow: Record Workflow;
                        TempBlob: Codeunit "Temp Blob";
                        FileManagement: Codeunit "File Management";
                    begin
                        if FileManagement.BLOBImport(TempBlob, '') <> '' then begin
                            Workflow.ImportFromBlob(TempBlob);
                            RefreshTempWorkflowBuffer();
                        end;
                    end;
                }
                action(ExportWorkflow)
                {
                    ApplicationArea = Suite;
                    Caption = 'Export to File';
                    Enabled = ExportEnabled;
                    Image = Export;
                    ToolTip = 'Export the workflow to a file that can be imported in another Dynamics 365 database.';

                    trigger OnAction()
                    var
                        Workflow: Record Workflow;
                        TempBlob: Codeunit "Temp Blob";
                        FileManagement: Codeunit "File Management";
                        "Filter": Text;
                    begin
                        Filter := GetFilterFromSelection();
                        if Filter = '' then
                            exit;
                        Workflow.SetFilter(Code, Filter);
                        Workflow.ExportToBlob(TempBlob);
                        FileManagement.BLOBExport(TempBlob, '*.xml', true);
                    end;
                }
            }
            group(Flow)
            {
                Caption = 'Power Automate';
                action(WebhookClientLink)
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'View';
                    Enabled = ExternalLinkEnabled;
                    Image = Flow;
                    Scope = Repeater;
                    ToolTip = 'View flow definition';
                    Visible = IsSaaS;

                    trigger OnAction()
                    var
                        WorkflowMgt: Codeunit "Workflow Management";
                    begin
                        Rec.CalcFields("External Client Type");
                        HyperLink(WorkflowMgt.GetWebhookClientLink(Rec."External Client ID", Rec."External Client Type"));
                    end;
                }
            }
        }
        area(navigation)
        {
            action(ViewTemplates)
            {
                ApplicationArea = Suite;
                Caption = 'View Templates';
                Ellipsis = true;
                Image = ViewPage;
                RunObject = Page "Workflow Templates";
                ToolTip = 'View the existing workflow templates.';
            }
            action("Approval User Overview")
            {
                ApplicationArea = All;
                Caption = 'Approval User Overview';
                Image = QualificationOverview;
                RunObject = Page "Approval User Overview";
                ToolTip = 'Displays an overview of which users are able to approve specific workflows.';
            }
        }
        area(Promoted)
        {
            group(Category_New)
            {
                Caption = 'New', Comment = 'Generated from the PromotedActionCategories property index 0.';
                ShowAs = SplitButton;

                actionref(CopyFromTemplate_Promoted; CopyFromTemplate)
                {
                }
                actionref(CopyWorkflow_Promoted; CopyWorkflow)
                {
                }
                actionref(NewAction_Promoted; NewAction)
                {
                }
            }
            group(Category_Process)
            {
                Caption = 'Process', Comment = 'Generated from the PromotedActionCategories property index 1.';

                actionref(ImportWorkflow_Promoted; ImportWorkflow)
                {
                }
                actionref(ExportWorkflow_Promoted; ExportWorkflow)
                {
                }
            }
            group(Category_Category4)
            {
                Caption = 'Manage', Comment = 'Generated from the PromotedActionCategories property index 3.';

                actionref(EditAction_Promoted; EditAction)
                {
                }
                actionref(DeleteAction_Promoted; DeleteAction)
                {
                }
                actionref(ViewAction_Promoted; ViewAction)
                {
                }
            }
            group(Category_Category5)
            {
                Caption = 'Power Automate', Comment = 'Generated from the PromotedActionCategories property index 4.';

                actionref(WebhookClientLink_Promoted; WebhookClientLink)
                {
                }
            }
            group(Category_Report)
            {
                Caption = 'Report', Comment = 'Generated from the PromotedActionCategories property index 2.';
            }
            actionref("Approval User Overview_Promoted"; "Approval User Overview")
            {
            }
        }
    }

    trigger OnAfterGetCurrRecord()
    begin
        RefreshTempWorkflowBufferRow();
    end;

    trigger OnAfterGetRecord()
    begin
        RefreshTempWorkflowBuffer();
        ExportEnabled := not Rec.IsEmpty();

        if Rec."Workflow Code" = '' then begin
            DescriptionStyle := 'Strong';
            ExternalLinkEnabled := false;
            Source := '';
        end else begin
            DescriptionStyle := 'Standard';

            // Enable/disable external links
            Rec.CalcFields("External Client ID");
            ExternalLinkEnabled := not IsNullGuid(Rec."External Client ID");

            if ExternalLinkEnabled then
                Source := PowerAutomateTxt
            else
                Source := BusinessCentralSourceTxt;
        end
    end;

    trigger OnOpenPage()
    var
        EnvironmentInfo: Codeunit "Environment Information";
    begin
        WorkflowSetup.InitWorkflow();
        if not WorkflowBufferInitialized then
            Rec.InitBufferForWorkflows(Rec);

        IsSaaS := EnvironmentInfo.IsSaaS();
    end;

    var
        WorkflowSetup: Codeunit "Workflow Setup";
        DescriptionStyle: Text;
        Refresh: Boolean;
        WorkflowBufferInitialized: Boolean;
        ExternalLinkEnabled: Boolean;
        IsSaaS: Boolean;
        Source: Text;
        BusinessCentralSourceTxt: Label 'Business Central';
        PowerAutomateTxt: Label 'Power Automate';

    protected var
        ExportEnabled: Boolean;

    procedure RefreshTempWorkflowBuffer()
    var
        Workflow: Record Workflow;
        TempWorkflowBuffer: Record "Workflow Buffer" temporary;
        WorkflowCode: Code[20];
        CurrentWorkflowChanged: Boolean;
        WorkflowCountChanged: Boolean;
    begin
        WorkflowCode := Rec."Workflow Code";
        if Workflow.Get(WorkflowCode) then
            CurrentWorkflowChanged := (Rec."Category Code" <> Workflow.Category) or (Rec.Description <> Workflow.Description)
        else
            CurrentWorkflowChanged := WorkflowCode <> '';

        Workflow.SetRange(Template, false);

        TempWorkflowBuffer.Copy(Rec, true);
        TempWorkflowBuffer.Reset();
        TempWorkflowBuffer.SetFilter("Workflow Code", '<>%1', '');
        TempWorkflowBuffer.SetRange(Template, false);

        WorkflowCountChanged := Workflow.Count <> TempWorkflowBuffer.Count();

        if CurrentWorkflowChanged or WorkflowCountChanged then begin
            Rec.InitBufferForWorkflows(Rec);
            Refresh := true;
        end;
    end;

    local procedure RefreshTempWorkflowBufferRow()
    var
        Workflow: Record Workflow;
    begin
        if Refresh then begin
            CurrPage.Update(false);
            Refresh := false;
            exit;
        end;

        if Rec."Workflow Code" = '' then
            exit;

        Workflow.Get(Rec."Workflow Code");
        Rec."Category Code" := Workflow.Category;
        Rec.Description := Workflow.Description;
        Rec.Modify();
    end;

    procedure GetFilterFromSelection() "Filter": Text
    var
        TempWorkflowBuffer: Record "Workflow Buffer" temporary;
    begin
        TempWorkflowBuffer.Copy(Rec, true);
        CurrPage.SetSelectionFilter(TempWorkflowBuffer);

        if TempWorkflowBuffer.FindSet() then
            repeat
                if TempWorkflowBuffer."Workflow Code" <> '' then
                    if Filter = '' then
                        Filter := TempWorkflowBuffer."Workflow Code"
                    else
                        Filter := StrSubstNo('%1|%2', Filter, TempWorkflowBuffer."Workflow Code");
            until TempWorkflowBuffer.Next() = 0;
    end;

    procedure SetWorkflowBufferRec(var TempWorkflowBuffer: Record "Workflow Buffer" temporary)
    begin
        WorkflowBufferInitialized := true;
        Rec.InitBufferForWorkflows(Rec);
        Rec.CopyFilters(TempWorkflowBuffer);
        if StrLen(Rec.GetFilter("Workflow Code")) > 0 then
            Rec.SetFilter("Workflow Code", TempWorkflowBuffer.GetFilter("Workflow Code") + '|''''');
        if Rec.FindLast() then;
    end;
}