Page 1831 Outlook Centralized Deployment, source in 29
Source29
src/Layers/W1/BaseApp/CRM/Outlook/OutlookCentralizedDeployment.Page.al499 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 Microsoft.CRM.Outlook;
using System.Environment;
using System.Environment.Configuration;
using System.Integration;
using System.Utilities;
page 1831 "Outlook Centralized Deployment"
{
Caption = 'Outlook Add-in Centralized Deployment';
DeleteAllowed = false;
InsertAllowed = false;
LinksAllowed = false;
PageType = NavigatePage;
ShowFilter = false;
SourceTable = "Office Add-in";
SourceTableTemporary = true;
ApplicationArea = Basic, Suite;
UsageCategory = Administration;
AdditionalSearchTerms = 'Outlook, Office, O365, AddIn, M365, Microsoft 365, Addon, App, Plugin, Manifest, Install Outlook, Set up Outlook';
layout
{
area(content)
{
group(TopBannerStandardGrp)
{
Editable = false;
ShowCaption = false;
Visible = TopBannerVisible and not InstructionsStepVisible;
field(MediaResourcesStandard; MediaResourcesStandard."Media Reference")
{
ApplicationArea = Basic, Suite;
Editable = false;
ShowCaption = false;
}
}
group(TopBannerDoneGrp)
{
Editable = false;
ShowCaption = false;
Visible = TopBannerVisible and InstructionsStepVisible;
field(MediaResourcesDone; MediaResourcesDone."Media Reference")
{
ApplicationArea = Basic, Suite;
Editable = false;
ShowCaption = false;
}
}
// Introduction step
group(Step1)
{
Caption = '';
Visible = IntroStepVisible;
group("Para1.1")
{
Caption = 'Business Central Outlook add-in';
group("Para1.1.1")
{
Caption = '';
InstructionalText = 'Deploy Business Central Outlook add-in for specific users, groups, or the entire organization, so users don’t have to install them themselves.';
}
group("Para1.1.2")
{
Caption = '';
Visible = IsSaaS;
field(CentralizedDeploymentRequirements; CentralizedDeploymentRequirementsLbl)
{
ApplicationArea = Basic, Suite;
Caption = '';
ShowCaption = false;
Editable = false;
Visible = IsSaas;
trigger OnDrillDown()
begin
Hyperlink(CentralizedDeploymentRequirementsFwdLinkTxt);
end;
}
}
group("Para1.1.3")
{
Caption = '';
InstructionalText = 'This doesn’t affect permissions assigned to users in Business Central.';
}
}
group("Para1.2")
{
Caption = 'Let''s go!';
Visible = IsSaas;
InstructionalText = 'Centralized Deployment requires configuring both Business Central and Microsoft 365. Choose Next to get started.';
}
group("Para1.2A")
{
Caption = 'Let''s go!';
Visible = not IsSaas;
InstructionalText = 'Centralized Deployment requires configuring Business Central along with Microsoft 365 or Exchange Server. Choose Next to get started.';
}
}
group(Step1_5)
{
Caption = '';
Visible = PrivacyNoticeStepVisible;
group(PrivacyNotice)
{
Caption = 'Your privacy is important to us';
group(PrivacyNoticeInner)
{
ShowCaption = false;
label(PrivacyNoticeLabel)
{
ApplicationArea = Basic, Suite;
Caption = 'This feature utilizes Microsoft Exchange. By continuing you are affirming that you understand that the data handling and compliance standards of Microsoft Exchange may not be the same as those provided by Microsoft Dynamics 365 Business Central. Please consult the documentation for Exchange to learn more.';
}
field(PrivacyNoticeStatement; PrivacyStatementTxt)
{
ApplicationArea = Basic, Suite;
Editable = false;
ShowCaption = false;
trigger OnDrillDown()
begin
Hyperlink('https://go.microsoft.com/fwlink/?linkid=831305');
end;
}
}
}
}
// Download manifests step
group(Step2)
{
Caption = '';
Visible = ManifestsStepVisible;
group("Para2.1")
{
Caption = '';
InstructionalText = 'Choose the add-in to download for deployment. Your choice here determines what functionality is available to users in Outlook.';
repeater(addins)
{
field(Name; Rec.Name)
{
ApplicationArea = Basic, Suite;
Editable = false;
}
field(Deploy; Rec.Deploy)
{
ApplicationArea = All;
Width = 5;
}
field(Description; Rec.Description)
{
ApplicationArea = Basic, Suite;
ToolTip = 'Specifies a description of the add-in.';
Editable = false;
}
field(Version; Rec.Version)
{
ApplicationArea = Basic, Suite;
Editable = false;
}
}
}
}
// Deploy to M365 or Exchange Server step
group(Step3)
{
Caption = '';
Visible = DeployToStepVisible;
group("Para3.1")
{
Caption = 'Where do you want to deploy to?';
field(DeployTo; DeployTo)
{
ApplicationArea = Basic, Suite;
Caption = 'Deploy Add-in to';
OptionCaption = 'Microsoft 365,Exchange Server';
ToolTip = 'Specifies the Exchange service where you want to deploy the add-in.';
}
}
}
// Instructions Step for M365
group("Step4A")
{
Caption = '';
Visible = InstructionsStepVisible and (DeployTo = DeployTo::M365);
group("Para4.1")
{
Caption = 'Now configure Microsoft 365';
group("Para4.1.1")
{
Caption = '';
InstructionalText = 'You must configure and deploy the add-in to users and groups using the Microsoft 365 admin center. It requires the Office Apps admin role or the Global admin role.';
}
group("Para4.1.2")
{
Caption = '';
InstructionalText = 'Follow these steps:';
group("Para4.1.2.1")
{
Caption = '';
InstructionalText = '1. In the Microsoft 365 admin center, go to Integrated Apps.';
}
group("Para4.1.2.2")
{
Caption = '';
InstructionalText = '2. Choose ‘Upload custom apps’ and select the XML files you downloaded earlier. If the files are zipped, you must unzip the files first.';
}
group("Para4.1.2.3")
{
Caption = '';
InstructionalText = '3. Follow the deployment instructions.';
}
}
field(IntegratedAppsSetup; IntegratedAppsLbl)
{
ApplicationArea = Basic, Suite;
ShowCaption = false;
Editable = false;
trigger OnDrillDown()
begin
Hyperlink(IntegratedAppsFwdLinkTxt);
end;
}
}
}
// Instructions Step for Exchange Server
group("Step4B")
{
Caption = '';
Visible = InstructionsStepVisible and (DeployTo = DeployTo::ExchangeServer);
group("Para4.2")
{
Caption = 'Now configure Exchange Server';
group("Para4.2.1")
{
Caption = '';
InstructionalText = 'You must configure and deploy the add-in to users and groups using the Exchange admin center. It requires the Organization Management role or the Org Apps admin role.';
}
group("Para4.2.2")
{
Caption = '';
InstructionalText = 'Follow these steps:';
group("Para4.2.2.1")
{
Caption = '';
InstructionalText = '1. Go to ‘Organization’ and choose Add-ins in the Exchange admin center.';
}
group("Para4.2.2.2")
{
Caption = '';
InstructionalText = '2. Choose ‘Add from File’ option under New section and select the XML files you downloaded earlier. If the files are zipped, you must unzip the files first.';
}
group("Para4.2.2.3")
{
Caption = '';
InstructionalText = '3. Follow the deployment instructions.';
}
}
field(LearnMore; LearnMoreLbl)
{
ApplicationArea = Basic, Suite;
ShowCaption = false;
Editable = false;
trigger OnDrillDown()
begin
Hyperlink(LearnMoreFwdLinkTxt);
end;
}
}
}
}
}
actions
{
area(processing)
{
action(ActionBack)
{
ApplicationArea = Basic, Suite;
Caption = 'Back';
Enabled = BackActionEnabled;
Image = PreviousRecord;
InFooterBar = true;
trigger OnAction()
begin
NextStep(true);
end;
}
action(ActionNext)
{
ApplicationArea = Basic, Suite;
Caption = 'Next';
Visible = NextActionVisible;
Image = NextRecord;
InFooterBar = true;
trigger OnAction()
begin
NextStep(false);
end;
}
action(ActionDownload)
{
ApplicationArea = All;
Caption = 'Download and Continue';
Visible = DownloadActionVisible;
Image = NextRecord;
InFooterBar = true;
ToolTip = 'Download the manifests for selected add-in and continue.';
trigger OnAction();
var
TempOfficeAddin: Record "Office Add-in" temporary;
AddinManifestMgt: Codeunit "Add-in Manifest Management";
begin
TempOfficeAddin.Copy(Rec, true);
TempOfficeAddin.SetRange(Deploy, true);
if TempOfficeAddin.Findset() then
AddinManifestMgt.DownloadMultipleManifestsToClient(TempOfficeAddin);
NextStep(false);
end;
}
action(ActionDone)
{
ApplicationArea = Basic, Suite;
Caption = 'Done';
Visible = DoneActionVisible;
Image = NextRecord;
InFooterBar = true;
trigger OnAction()
var
GuidedExperience: Codeunit "Guided Experience";
begin
Session.LogMessage('0000F8S', StrSubstNo(SetupTelemetryTxt, Format(DeployTo)), Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, 'Category', OfficeMgt.GetOfficeAddinTelemetryCategory());
GuidedExperience.CompleteAssistedSetup(ObjectType::Page, PAGE::"Outlook Centralized Deployment");
CurrPage.Close();
end;
}
}
}
trigger OnInit()
var
EnvironmentInformation: Codeunit "Environment Information";
begin
LoadTopBanners();
IsSaaS := EnvironmentInformation.IsSaaS();
DeployTo := DeployTo::M365;
end;
trigger OnOpenPage()
var
OfficeAddin: Record "Office Add-in";
begin
if OfficeAddin.GetAddins() then
repeat
Rec := OfficeAddin;
Rec.Insert();
until OfficeAddin.Next() = 0;
ShowIntroStep();
end;
local procedure NextStep(Backwards: Boolean)
begin
if Backwards then
Step := Step - 1
else
Step := Step + 1;
case Step of
Step::Intro:
ShowIntroStep();
Step::PrivacyNotice:
ShowPrivacyNoticeStep();
Step::Manifests:
ShowManifestsStep();
Step::DeployTo:
ShowDeployToStep(Backwards);
Step::Instructions:
ShowInstructionsStep();
end;
CurrPage.Update(true);
end;
local procedure ShowIntroStep()
begin
ResetWizardControls();
IntroStepVisible := true;
BackActionEnabled := false;
end;
local procedure ShowPrivacyNoticeStep()
begin
ResetWizardControls();
PrivacyNoticeStepVisible := true;
end;
local procedure ShowManifestsStep()
begin
ResetWizardControls();
ManifestsStepVisible := true;
NextActionVisible := false;
DownloadActionVisible := true;
end;
local procedure ShowDeployToStep(Backwards: Boolean)
begin
ResetWizardControls();
NextActionVisible := true;
DeployToStepVisible := true;
// Skip this step if SaaS
if IsSaaS then
NextStep(Backwards);
end;
local procedure ShowInstructionsStep()
begin
ResetWizardControls();
InstructionsStepVisible := true;
NextActionVisible := false;
DoneActionVisible := true;
end;
local procedure ResetWizardControls()
begin
// Buttons
BackActionEnabled := true;
NextActionVisible := true;
DoneActionVisible := false;
DownloadActionVisible := false;
// Tabs
IntroStepVisible := false;
PrivacyNoticeStepVisible := false;
ManifestsStepVisible := false;
DeployToStepVisible := false;
InstructionsStepVisible := false;
end;
local procedure LoadTopBanners()
begin
if MediaRepositoryStandard.Get('AssistedSetup-NoText-400px.png', Format(ClientTypeManagement.GetCurrentClientType())) and
MediaRepositoryDone.Get('AssistedSetupDone-NoText-400px.png', Format(ClientTypeManagement.GetCurrentClientType()))
then
if MediaResourcesStandard.Get(MediaRepositoryStandard."Media Resources Ref") and
MediaResourcesDone.Get(MediaRepositoryDone."Media Resources Ref")
then
TopBannerVisible := MediaResourcesDone."Media Reference".HasValue;
end;
var
MediaRepositoryStandard: Record "Media Repository";
MediaRepositoryDone: Record "Media Repository";
MediaResourcesStandard: Record "Media Resources";
MediaResourcesDone: Record "Media Resources";
ClientTypeManagement: Codeunit "Client Type Management";
OfficeMgt: Codeunit "Office Management";
Step: Option Intro,PrivacyNotice,Manifests,DeployTo,Instructions;
DeployTo: Option M365,ExchangeServer;
BackActionEnabled: Boolean;
NextActionVisible: Boolean;
DoneActionVisible: Boolean;
DownloadActionVisible: Boolean;
TopBannerVisible: Boolean;
IntroStepVisible: Boolean;
PrivacyNoticeStepVisible: Boolean;
ManifestsStepVisible: Boolean;
DeployToStepVisible: Boolean;
InstructionsStepVisible: Boolean;
IsSaaS: Boolean;
CentralizedDeploymentRequirementsFwdLinkTxt: Label 'https://go.microsoft.com/fwlink/?linkid=2164357', Locked = true;
CentralizedDeploymentRequirementsLbl: Label 'Requirements for Centralized Deployment of the add-in';
IntegratedAppsFwdLinkTxt: Label 'https://go.microsoft.com/fwlink/?linkid=2163967', Locked = true;
IntegratedAppsLbl: Label 'Go to Microsoft 365 (opens in a new window)';
LearnMoreFwdLinkTxt: Label 'https://go.microsoft.com/fwlink/?linkid=2165028', Locked = true;
LearnMoreLbl: Label 'Learn more about the add-in for Outlook in Exchange Server';
SetupTelemetryTxt: Label 'Centralized deployment for Outlook Add-ins setup finished with deployment to = %1', Comment = '%1 specifies either M365 or ExchangeServer ', Locked = true;
PrivacyStatementTxt: Label 'Privacy and cookies';
}