Page 9451 File Account Wizard, source in 27

Source26272829metadata in 27

src/System Application/App/External File Storage/src/Account/FileAccountWizard.Page.al492 lines, Copyright (c) Microsoft Corporation. MIT

// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------

namespace System.ExternalFileStorage;

using System.Apps;
using System.Environment;
using System.Telemetry;

/// <summary>
/// Step by step guide for adding a new file account in Business Central
/// </summary>
page 9451 "File Account Wizard"
{
    PageType = NavigatePage;
    ApplicationArea = All;
    UsageCategory = Administration;
    Caption = 'Set Up External File Accounts';
    SourceTable = "Ext. File Storage Connector";
    SourceTableTemporary = true;
    InsertAllowed = false;
    ModifyAllowed = false;
    DeleteAllowed = false;
    Editable = true;
    ShowFilter = false;
    LinksAllowed = false;
    InherentPermissions = X;
    InherentEntitlements = X;
    Permissions = tabledata Media = r,
                  tabledata "Media Resources" = r;

    layout
    {
        area(Content)
        {
            group(Done)
            {
                Editable = false;
                ShowCaption = false;
                Visible = not DoneVisible and TopBannerVisible;
                field(NotDoneIcon; MediaResourcesStandard."Media Reference")
                {
                    Editable = false;
                    ShowCaption = false;
                    ToolTip = ' ', Locked = true;
                }
            }
            group(NotDone)
            {
                Editable = false;
                ShowCaption = false;
                Visible = DoneVisible and TopBannerVisible;
                field(DoneIcon; MediaResourcesDone."Media Reference")
                {
                    Editable = false;
                    ShowCaption = false;
                    ToolTip = ' ', Locked = true;
                }
            }

            group(Header)
            {
                ShowCaption = false;
                Visible = WelcomeVisible;

                group(HeaderText)
                {
                    Caption = 'Welcome to file in Business Central';
                    InstructionalText = 'Make file communications easier by connecting file accounts to Business Central. For example, store sales quotes and orders pdfs without opening an file app.';
                }
                field(LearnMoreHeader; LearnMoreTok)
                {
                    Editable = false;
                    ShowCaption = false;
                    ToolTip = 'View information about how to set up the file capabilities.';

                    trigger OnDrillDown()
                    begin
                        Hyperlink(LearnMoreURLTxt);
                    end;
                }
                group(Privacy)
                {
                    Caption = 'Privacy notice';
                    InstructionalText = 'By adding a file account you acknowledge that the file provider might be able to access the data you send in files from Business Central.';
                }
                group(GetStartedText)
                {
                    Caption = 'Let''s go!';
                    InstructionalText = 'Choose Next to get started.';
                }
            }

            group(ConnectorHeader)
            {
                ShowCaption = false;
                Visible = ChooseConnectorVisible and ConnectorsAvailable;

                label(UsageWarning)
                {
                    Caption = 'Use caution when adding file accounts. Depending on your setup, accounts can be available to all users.';
                }
            }

            group(ConnectorsGroup)
            {
                Visible = ChooseConnectorVisible and ConnectorsAvailable;
                label("Specify the type of file account to add")
                {
                    Caption = 'Specify the type of file account to add';
                }
                repeater(Connectors)
                {
                    ShowCaption = false;
                    Visible = ChooseConnectorVisible and ConnectorsAvailable;
                    FreezeColumn = Name;
                    Editable = false;

                    field(Logo; Rec.Logo)
                    {
                        Caption = ' ';
                        Editable = false;
                        Visible = ChooseConnectorVisible;
                        ToolTip = 'Specifies the type of the account you want to create.';
                        ShowCaption = false;
                        Width = 1;
                    }
                    field(Name; Rec.Connector)
                    {
                        Caption = 'Account Type';
                        ToolTip = 'Specifies the type of the account you want to create.';
                        Editable = false;
                    }
                    field(Details; Rec.Description)
                    {
                        Caption = 'Details';
                        ToolTip = 'Specifies more details about the account type.';
                        Editable = false;
                        Width = 50;
                    }
                }
            }

            group(NoConnectorsAvailableGroup)
            {
                Visible = ChooseConnectorVisible and not ConnectorsAvailable;
                label(NoConnectorsAvailable)
                {
                    Caption = 'There are no file apps available. To use this feature you must install an file app.';
                }
                label(NoConnectorsAvailable2)
                {
                    Caption = 'File apps are available in Extension Management and AppSource.';
                }
                field(ExtensionManagement; ExtensionManagementTok)
                {
                    Editable = false;
                    ShowCaption = false;
                    Caption = ' ';
                    ToolTip = 'Navigate to Extension Management page.';

                    trigger OnDrillDown()
                    begin
                        Page.Run(Page::"Extension Management");
                    end;
                }
                field(AppSource; AppSourceTok)
                {
                    Editable = false;
                    ShowCaption = false;
                    Visible = AppSourceAvailable;
                    Caption = ' ';
                    ToolTip = 'Navigate to AppSource.';

                    trigger OnDrillDown()
                    begin
                        AppSource := AppSource.Create();
                        AppSource.ShowAppSource();
                    end;
                }
                label(NoConnectorsAvailable3)
                {
                    Caption = 'View a list of the available file apps';
                }
                field(LearnMore; LearnMoreTok)
                {
                    Editable = false;
                    ShowCaption = false;
                    Caption = ' ';
                    ToolTip = 'View information about how to set up the file capabilities.';

                    trigger OnDrillDown()
                    begin
                        Hyperlink(LearnMoreURLTxt);
                    end;
                }
            }

            group(LastPage)
            {
                Visible = DoneVisible;

                group(AllSet)
                {
                    Caption = 'Congratulations!';
                    InstructionalText = 'You have successfully added the file account. To check that it is working, send a test file.';
                }
                group(Account)
                {
                    Caption = 'Account';
                    field(NameField; TempRegisteredAccount.Name)
                    {
                        Editable = false;
                        Caption = 'Name';
                        ToolTip = 'Specifies the name of the account registered.';
                    }
                }
                group(Default)
                {
                    Caption = '';

                    field(DefaultField; SetAsDefault)
                    {
                        Editable = true;
                        Enabled = true;
                        Caption = 'Set as default';
                        ToolTip = 'Specifies the the account for all scenarios.';
                    }
                }
            }
        }
    }

    actions
    {
        area(Processing)
        {
            action(Cancel)
            {
                Visible = CancelActionVisible;
                Caption = 'Cancel';
                ToolTip = 'Cancel';
                InFooterBar = true;
                Image = Cancel;

                trigger OnAction()
                begin
                    CurrPage.Close();
                end;
            }

            action(Back)
            {
                Visible = BackActionVisible;
                Enabled = BackActionEnabled;
                Caption = 'Back';
                ToolTip = 'Back';
                InFooterBar = true;
                Image = PreviousRecord;

                trigger OnAction()
                begin
                    NextStep(true);
                end;
            }

            action(Next)
            {
                Visible = NextActionVisible;
                Enabled = NextActionEnabled;
                Caption = 'Next';
                ToolTip = 'Next';
                InFooterBar = true;
                Image = NextRecord;

                trigger OnAction()
                begin
                    NextStep(false);
                end;
            }

            action(Finish)
            {
                Visible = FinishActionVisible;
                Caption = 'Finish';
                ToolTip = 'Finish';
                InFooterBar = true;
                Image = NextRecord;

                trigger OnAction()
                var
                    FileAccountImpl: Codeunit "File Account Impl.";
                begin
                    if SetAsDefault then
                        FileAccountImpl.MakeDefault(TempRegisteredAccount);

                    CurrPage.Close();
                end;
            }
        }
    }

    trigger OnOpenPage()
    begin
        StartTime := CurrentDateTime();
    end;

    trigger OnQueryClosePage(CloseAction: Action): Boolean
    var
        FeatureTelemetry: Codeunit "Feature Telemetry";
        DurationAsInt: Integer;
    begin
        DurationAsInt := CurrentDateTime() - StartTime;
        if Step = Step::Done then begin
            Session.LogMessage('0000OPM', StrSubstNo(AccountCreationSuccessfullyCompletedDurationLbl, DurationAsInt), Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, 'Category', FileCategoryLbl);
            FeatureTelemetry.LogUptake('0000OPI', 'External File Storage', Enum::"Feature Uptake Status"::"Set up");
        end else
            Session.LogMessage('0000OPN', StrSubstNo(AccountCreationFailureDurationLbl, DurationAsInt), Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, 'Category', FileCategoryLbl);
    end;

    trigger OnInit()
    var
        TempDefaultAccount: Record "File Account" temporary;
        FileAccountImpl: Codeunit "File Account Impl.";
        FileScenario: Codeunit "File Scenario";
    begin
        FileAccountImpl.CheckPermissions();

        Step := Step::Welcome;
        SetDefaultControls();
        ShowWelcomeStep();

        FileAccountImpl.FindAllConnectors(Rec);

        FileRateLimitDisplay := NoLimitTxt;

        if not FileScenario.GetDefaultFileAccount(TempDefaultAccount) then
            SetAsDefault := true;

        ConnectorsAvailable := Rec.FindFirst(); // Set the focus on the first record
        AppSourceAvailable := AppSource.IsAvailable();
        LoadTopBanners();
    end;

    local procedure NextStep(Backwards: Boolean)
    begin
        if Backwards then
            Step -= 1
        else
            Step += 1;

        SetDefaultControls();

        case Step of
            Step::Welcome:
                ShowWelcomeStep();
            Step::"Choose Connector":
                ShowChooseConnectorStep();
            Step::"Register Account":
                ShowRegisterAccountStep();
            Step::Done:
                ShowDoneStep();
        end;
    end;

    local procedure ShowWelcomeStep()
    begin
        WelcomeVisible := true;
        BackActionEnabled := false;
    end;

    local procedure ShowChooseConnectorStep()
    begin
        if not ConnectorsAvailable then
            NextActionEnabled := false;

        ChooseConnectorVisible := true;
    end;

    local procedure ShowRegisterAccountStep()
    var
        FeatureTelemetry: Codeunit "Feature Telemetry";
        Telemetry: Codeunit Telemetry;
        AccountWasRegistered: Boolean;
        ConnectorSucceeded: Boolean;
        CustomDimensions: Dictionary of [Text, Text];
        TelemetryAccountRegisteredLbl: Label '%1 account has been setup.', Locked = true;
        TelemetryAccountFailedtoRegisterLbl: Label '%1 account has failed to setup. Error: %2', Locked = true;
    begin
        ConnectorSucceeded := TryRegisterAccount(AccountWasRegistered);
        CustomDimensions.Add('Category', FileCategoryLbl);

        if AccountWasRegistered then begin
            FeatureTelemetry.LogUptake('0000OPJ', 'File Access', Enum::"Feature Uptake Status"::"Set up");
            Telemetry.LogMessage('0000OPK', StrSubstNo(TelemetryAccountRegisteredLbl, Rec.Connector), Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, CustomDimensions);
            NextStep(false);
        end else begin
            Telemetry.LogMessage('0000OPL', StrSubstNo(TelemetryAccountFailedtoRegisterLbl, Rec.Connector, GetLastErrorCallStack()), Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, CustomDimensions);
            NextStep(true);
        end;

        if not ConnectorSucceeded then
            Error(GetLastErrorText());
    end;

    [TryFunction]
    local procedure TryRegisterAccount(var AccountWasRegistered: Boolean)
    var
        FileAccountImpl: Codeunit "File Account Impl.";
        FileConnector: Interface "External File Storage Connector";
    begin
        // Check to validate that the connector is still installed
        // The connector could have been uninstalled by another user/session
        if not FileAccountImpl.IsValidConnector(Rec.Connector) then
            Error(FileConnectorHasBeenUninstalledMsg);

        FileConnector := Rec.Connector;

        ClearLastError();
        AccountWasRegistered := FileConnector.RegisterAccount(TempRegisteredAccount);
        TempRegisteredAccount.Connector := Rec.Connector;
    end;

    local procedure ShowDoneStep()
    begin
        DoneVisible := true;
        BackActionVisible := false;
        NextActionVisible := false;
        CancelActionVisible := false;
        FinishActionVisible := true;
    end;

    local procedure SetDefaultControls()
    begin
        // Actions
        BackActionVisible := true;
        BackActionEnabled := true;
        NextActionVisible := true;
        NextActionEnabled := true;
        CancelActionVisible := true;
        FinishActionVisible := false;

        // Groups
        WelcomeVisible := false;
        ChooseConnectorVisible := false;
        DoneVisible := false;
    end;

    local procedure LoadTopBanners()
    var
        AssistedSetupLogoTok: Label 'ASSISTEDSETUP-NOTEXT-400PX.PNG', Locked = true;
    begin
        if MediaResourcesStandard.Get(AssistedSetupLogoTok) and
            MediaResourcesDone.Get(AssistedSetupLogoTok) and (CurrentClientType() = ClientType::Web)
        then
            TopBannerVisible := MediaResourcesDone."Media Reference".HasValue();
    end;

    var
        TempRegisteredAccount: Record "File Account" temporary;
        MediaResourcesStandard: Record "Media Resources";
        MediaResourcesDone: Record "Media Resources";
        [RunOnClient]
        AppSource: DotNet AppSource;
        Step: Option Welcome,"Choose Connector","Register Account",Done;
        AppSourceTok: Label 'AppSource';
        ExtensionManagementTok: Label 'Extension Management';
        FileCategoryLbl: Label 'File', Locked = true;
        LearnMoreURLTxt: Label 'https://go.microsoft.com/fwlink/?linkid=2134520', Locked = true;  //TODO Replace with correct URL to new documentation
        LearnMoreTok: Label 'Learn more';
        NoLimitTxt: Label 'No limit';
        AccountCreationSuccessfullyCompletedDurationLbl: Label 'Successful creation of account completed. Duration: %1 milliseconds.', Comment = '%1 - Duration', Locked = true;
        AccountCreationFailureDurationLbl: Label 'Creation of account failed. Duration: %1 milliseconds.', Comment = '%1 - Duration', Locked = true;
        FileConnectorHasBeenUninstalledMsg: Label 'The selected file extension has been uninstalled. You must reinstall the extension to add an account with it.';
        AppSourceAvailable: Boolean;
        TopBannerVisible: Boolean;
        BackActionVisible: Boolean;
        BackActionEnabled: Boolean;
        NextActionVisible: Boolean;
        NextActionEnabled: Boolean;
        CancelActionVisible: Boolean;
        FinishActionVisible: Boolean;
        WelcomeVisible: Boolean;
        ChooseConnectorVisible: Boolean;
        DoneVisible: Boolean;
        ConnectorsAvailable: Boolean;
        SetAsDefault: Boolean;
        StartTime: DateTime;
        FileRateLimitDisplay: Text[250];
}