Skip to content
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
d30ab05
PTE Apps and Nuget for getting versions
TowerMyhrer Dec 22, 2025
f2ab3cb
Update CCMS/Translations/Cloud Customer Management Solution.nb-NO.xlf
TowerMyhrer Dec 22, 2025
69bed70
fixes NO translations
TowerMyhrer Dec 22, 2025
db35dd2
Merge branch 'PTE-Apps-and-Nuget' of https://github.com/TowerMyhrer/C…
TowerMyhrer Dec 22, 2025
27412e8
Update CCMS/Translations/Cloud Customer Management Solution.nb-NO.xlf
TowerMyhrer Dec 22, 2025
4a9813b
copilot review
TowerMyhrer Dec 22, 2025
4bc7959
Merge branch 'PTE-Apps-and-Nuget' of https://github.com/TowerMyhrer/C…
TowerMyhrer Dec 22, 2025
578132a
Update CCMS/Translations/Cloud Customer Management Solution.nb-NO.xlf
TowerMyhrer Dec 22, 2025
fe16715
Update CCMS/Translations/Cloud Customer Management Solution.nb-NO.xlf
TowerMyhrer Dec 22, 2025
c70d216
Update CCMS/Translations/Cloud Customer Management Solution.nb-NO.xlf
TowerMyhrer Dec 22, 2025
205be64
Copilot codereview
TowerMyhrer Dec 22, 2025
471a02a
Merge branch 'PTE-Apps-and-Nuget' of https://github.com/TowerMyhrer/C…
TowerMyhrer Dec 22, 2025
1d688b8
Missing permissions
TowerMyhrer Dec 22, 2025
0b0dfbb
Update CCMS/src/PTEApps/D4PBCPTEApp.Table.al
TowerMyhrer Dec 22, 2025
f7d003b
Update CCMS/src/PTEApps/D4PBCDevOpsOrgList.Page.al
TowerMyhrer Dec 22, 2025
afa8529
Update CCMS/src/PTENuget/D4PBCAzureUpdate.Codeunit.al
TowerMyhrer Dec 22, 2025
9670bd4
Update CCMS/src/PTENuget/D4PBCGitHubUpdate.Codeunit.al
TowerMyhrer Dec 22, 2025
d9c854d
Update CCMS/src/PTEApps/D4PBCPTEAppVersionCard.Page.al
TowerMyhrer Dec 22, 2025
59aeaa4
Merge branch 'main' into PTE-Apps-and-Nuget
demiliani Dec 23, 2025
d860170
copilot reviews
TowerMyhrer Dec 25, 2025
ff062e6
Merge branch 'PTE-Apps-and-Nuget' of https://github.com/TowerMyhrer/C…
TowerMyhrer Dec 25, 2025
ade7e15
objuect numbers
TowerMyhrer Dec 25, 2025
440e523
renujmbered objects
TowerMyhrer Dec 25, 2025
06aad87
translations and codereview after copilot
TowerMyhrer Jan 2, 2026
f81a8fd
unused label
TowerMyhrer Jan 2, 2026
4958802
SecretText
TowerMyhrer Jan 2, 2026
a9a59df
Merge branch 'main' into PTE-Apps-and-Nuget
TowerMyhrer Jan 2, 2026
9962c4e
Update CCMS/src/PTENuget/D4PBCNugetProcessing.Codeunit.al
TowerMyhrer Jan 2, 2026
adc9bab
renumber page
TowerMyhrer Jan 2, 2026
eabaaad
Merge branch 'PTE-Apps-and-Nuget' of https://github.com/TowerMyhrer/C…
TowerMyhrer Jan 2, 2026
c177eea
codereview
TowerMyhrer Jan 6, 2026
05e19e4
Update CCMS/src/PTEApps/D4PBCPTEApp.Table.al
TowerMyhrer Jan 6, 2026
47f7b82
Update CCMS/src/PTENuget/D4PBCNugetProcessing.Codeunit.al
TowerMyhrer Jan 6, 2026
37e3bab
confloicts
TowerMyhrer Jan 6, 2026
9b9694c
Merge branch 'PTE-Apps-and-Nuget' of https://github.com/TowerMyhrer/C…
TowerMyhrer Jan 6, 2026
7fd4a56
Merge branch 'main' into PTE-Apps-and-Nuget
TowerMyhrer Jan 6, 2026
0cdcd9f
Merge branch 'main' into PTE-Apps-and-Nuget
TowerMyhrer Jan 7, 2026
d1f3d80
Update CCMS/src/PTEApps/D4PBCPTEApp.Table.al
TowerMyhrer Jan 7, 2026
96688b1
Update CCMS/src/PTEApps/D4PBCPTEAppCard.Page.al
TowerMyhrer Jan 7, 2026
7c30ce5
Update CCMS/src/PTEApps/D4PBCDevOpsOrganization.Table.al
TowerMyhrer Jan 7, 2026
f1086d2
renumbered
TowerMyhrer Jan 8, 2026
a959d4f
Merge branch 'PTE-Apps-and-Nuget' of https://github.com/TowerMyhrer/C…
TowerMyhrer Jan 8, 2026
1797d2f
codereview
TowerMyhrer Jan 10, 2026
f868723
translations
TowerMyhrer Jan 10, 2026
3356574
codereviewsuggestions
TowerMyhrer Jan 12, 2026
2a03324
Some minor fixes
fvet Jan 12, 2026
80a3478
Typo - Apps List > App list
fvet Jan 12, 2026
81acaec
If card exists, list should not be editable
fvet Jan 12, 2026
c2e01c7
Promote action
fvet Jan 12, 2026
60b0c5a
Add action to card page
fvet Jan 12, 2026
79942d2
Do not repeat the entity name (PTE / App) in the field name
fvet Jan 12, 2026
a7b08f7
Add factbox on list
fvet Jan 12, 2026
61d9c25
Set MinValue
fvet Jan 12, 2026
b400aa6
Fix captions
fvet Jan 12, 2026
6ef799f
Fix casings
fvet Jan 12, 2026
fb1c482
Promote action
fvet Jan 12, 2026
8f28401
Make factbox not editable
fvet Jan 12, 2026
fe6b92a
Merge pull request #1 from fvet/FVE/73
TowerMyhrer Jan 13, 2026
16523f2
Merge branch 'main' into PTE-Apps-and-Nuget
TowerMyhrer Jan 13, 2026
4e34d2f
documentatioon
TowerMyhrer Feb 9, 2026
aa5fb85
Merge branch 'PTE-Apps-and-Nuget' of https://github.com/TowerMyhrer/C…
TowerMyhrer Feb 9, 2026
f4740e1
Merge branch 'main' into PTE-Apps-and-Nuget
TowerMyhrer Feb 9, 2026
71abb08
Rename page ID from 62031 to 62032
TowerMyhrer Feb 10, 2026
62c2ec0
Update page ID for D4P BC PTE App List
TowerMyhrer Feb 10, 2026
3872cd3
Update CCMS/src/PTEApps/D4PBCInputToken.Page.al
TowerMyhrer Feb 10, 2026
bd80487
Update docs/dev-ops-organization.md
TowerMyhrer Feb 10, 2026
32f299c
Update page number for D4P BC PTE App List
TowerMyhrer Feb 10, 2026
d6ced9c
Rename page ID from 62033 to 62050
TowerMyhrer Feb 10, 2026
9a04be6
Rename page from 62035 to 62051
TowerMyhrer Feb 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
343 changes: 337 additions & 6 deletions CCMS/Translations/Cloud Customer Management Solution.da-DK.xlf

Large diffs are not rendered by default.

343 changes: 336 additions & 7 deletions CCMS/Translations/Cloud Customer Management Solution.de-DE.xlf

Large diffs are not rendered by default.

343 changes: 336 additions & 7 deletions CCMS/Translations/Cloud Customer Management Solution.es-ES.xlf

Large diffs are not rendered by default.

343 changes: 337 additions & 6 deletions CCMS/Translations/Cloud Customer Management Solution.fi-FI.xlf

Large diffs are not rendered by default.

342 changes: 336 additions & 6 deletions CCMS/Translations/Cloud Customer Management Solution.fr-FR.xlf

Large diffs are not rendered by default.

343 changes: 336 additions & 7 deletions CCMS/Translations/Cloud Customer Management Solution.it-IT.xlf

Large diffs are not rendered by default.

322 changes: 291 additions & 31 deletions CCMS/Translations/Cloud Customer Management Solution.nb-NO.xlf

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions CCMS/src/Extension/D4PPTEObjectRange.table.al
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ namespace D4P.CCMS.Extension;

using D4P.CCMS.Customer;
using D4P.CCMS.Tenant;
using D4P.CCMS.PTEApps;
table 62004 "D4P PTE Object Range"
{
Caption = 'PTE Object Range';
Expand Down Expand Up @@ -56,4 +57,15 @@ table 62004 "D4P PTE Object Range"
Clustered = true;
}
}

procedure CopyValuesFromApp(PTEID: Guid)
var
PTEApp: Record "D4P BC PTE App";
begin
if not PTEApp.Get(PTEID) then
exit;
Rec."PTE Name" := PTEApp."PTE Name";
Rec."Range From" := PTEApp."Range From";
Rec."Range To" := PTEApp."Range To";
end;
}
9 changes: 9 additions & 0 deletions CCMS/src/Extension/D4PPTEObjectRangeList.page.al
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace D4P.CCMS.Extension;

using D4P.CCMS.PTEApps;
page 62009 "D4P PTE Object Ranges"
{
PageType = List;
Expand Down Expand Up @@ -28,6 +30,13 @@ page 62009 "D4P PTE Object Ranges"
{
ApplicationArea = All;
ToolTip = 'Specifies the Per Tenant Extension''s ID.';
TableRelation = "D4P BC PTE App"."PTE ID";

trigger OnValidate()
begin
if not IsNullGuid(Rec."PTE ID") then
Rec.CopyValuesFromApp(Rec."PTE ID");
end;
}
field("PTE Name"; Rec."PTE Name")
{
Expand Down
47 changes: 47 additions & 0 deletions CCMS/src/PTEApps/D4PBCDevOpsOrgList.Page.al
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
namespace D4P.CCMS.PTEApps;

page 62030 "D4P BC DevOps Org. List"
{
ApplicationArea = All;
Caption = 'D365BC DevOps Organization List';
PageType = List;
SourceTable = "D4P BC DevOps Organization";
UsageCategory = Administration;

layout
{
area(Content)
{
repeater(General)
{
field(ID; Rec.ID)
{
}
field(Name; Rec.Name)
{
}
}
}
}

actions
{
area(Processing)
{
action(ImportToken)
{
Caption = 'Import Token';
ApplicationArea = All;
Image = CodesList;
trigger OnAction()
var
InputToken: Page "D4P BC Input Token";
begin
if InputToken.RunModal() = Action::OK then begin
IsolatedStorage.Set(Rec.ID, InputToken.GetToken())
end;
end;
}
}
}
}
37 changes: 37 additions & 0 deletions CCMS/src/PTEApps/D4PBCDevOpsOrganization.Table.al
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
namespace D4P.CCMS.PTEApps;
table 62006 "D4P BC DevOps Organization"

Check failure on line 2 in CCMS/src/PTEApps/D4PBCDevOpsOrganization.Table.al

View workflow job for this annotation

GitHub Actions / Build . (Default) / . (Default)

PTE0004 Table 62006 'D4P BC DevOps Organization' is missing a matching permission set.
{
DataClassification = CustomerContent;
Caption = 'D365BC DevOps Organization';

fields
{
field(1; ID; Code[20])
{
Caption = 'ID';
ToolTip = 'Specifies the unique identifier for the DevOps organization.';
}
field(2; Name; Text[100])
{
Caption = 'Name';
ToolTip = 'Specifies the name of the DevOps organization.';
}
}

keys
{
key(PK; ID)
{
Clustered = true;
}
}

trigger OnDelete()
begin
if IsolatedStorage.Contains(Rec.ID) then
IsolatedStorage.Delete(Rec.ID);
end;



}
32 changes: 32 additions & 0 deletions CCMS/src/PTEApps/D4PBCInputToken.Page.al
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
namespace D4P.CCMS.PTEApps;

page 62031 "D4P BC Input Token"
{
ApplicationArea = All;
Caption = 'D365BC Input Token';
PageType = StandardDialog;

layout
{
area(Content)
{
group(General)
{
field(Token; Token)
{
Caption = 'Personal Access Token';
ToolTip = 'Specifies the Personal Access Token for DevOps organization access.';
MultiLine = true;
}
}
}
}

var
Token: Text[250];
Comment on lines 15 to 26
Copy link

Copilot AI Feb 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PAT is captured and stored via a plain Text[250] variable and displayed unmasked (MultiLine). This increases the risk of accidental disclosure (screen sharing, screenshots) and also relies on implicit conversion from Text to SecretText in GetToken(). Prefer capturing the token as SecretText end-to-end (or, if the UI requires Text, apply masking via ExtendedDatatype = Masked and convert explicitly to SecretText before storing).

Suggested change
field(Token; TokenPlain)
{
Caption = 'Personal Access Token';
ToolTip = 'Specifies the Personal Access Token for DevOps organization access.';
MultiLine = true;
ExtendedDatatype = Masked;
trigger OnValidate()
begin
Token := TokenPlain;
end;
}
}
}
}
var
Token: SecretText;
TokenPlain: Text[250];

Copilot uses AI. Check for mistakes.

procedure GetToken(): Text
begin
exit(Token);
end;
}
85 changes: 85 additions & 0 deletions CCMS/src/PTEApps/D4PBCPTEApp.Table.al
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
namespace D4P.CCMS.PTEApps;

using D4P.CCMS.Nuget;
table 62007 "D4P BC PTE App"

Check failure on line 4 in CCMS/src/PTEApps/D4PBCPTEApp.Table.al

View workflow job for this annotation

GitHub Actions / Build . (Default) / . (Default)

PTE0004 Table 62007 'D4P BC PTE App' is missing a matching permission set.
{
DataClassification = CustomerContent;
Caption = 'D365BC PTE App';
drilldownpageid = "D4P BC PTE Apps List";
LookupPageId = "D4P BC PTE Apps List";

fields
{
field(1; "PTE ID"; Guid)
{
Caption = 'PTE ID';
}
field(2; "PTE Name"; Text[100])
{
Caption = 'PTE Name';
}
field(4; "Range From"; Integer)
{
Caption = 'Range From';
}
field(5; "Range To"; Integer)
{
Caption = 'Range To';
}
field(6; "Latest App Version"; Text[50])
{
Caption = 'App Version';
ToolTip = 'Specifies the latest version of the PTE app.';
}
field(7; DevOps; enum "D4P BC DevOps Environments")
{
Caption = 'DevOps Environment';
ToolTip = 'Specifies the DevOps environment associated with the PTE app.';
}
field(8; "DevOps Organization"; Text[100])
{
Caption = 'Organization';
ToolTip = 'Specifies the organization associated with the PTE app.';
TableRelation = "D4P BC DevOps Organization".ID;
}
field(9; "DevOps Package"; Text[100])
{
Caption = 'Repository';
ToolTip = 'Specifies the repository associated with the PTE app.';
}
field(10; "DevOps Feed"; Text[100])
{
Caption = 'Feed';
ToolTip = 'Specifies the feed associated with the PTE app.';
}
field(11; "NuGet Package Name"; Text[250])
{
Caption = 'NuGet Package Name';
ToolTip = 'Specifies the NuGet package name of the PTE app.';
}
}

keys
{
key(PK; "PTE ID")
{
Clustered = true;
}
}

fieldgroups
{
fieldgroup(DropDown; "PTE ID", "PTE Name")
{ }
fieldgroup(Brick; "PTE ID", "PTE Name")
{ }
}
trigger OnDelete()
var
PTEAppVersion: Record "D4P BC PTE App Version";
begin
PTEAppVersion.SetRange("PTE ID", Rec."PTE ID");
if not PTEAppVersion.IsEmpty() then
PTEAppVersion.DeleteAll();
end;
}
87 changes: 87 additions & 0 deletions CCMS/src/PTEApps/D4PBCPTEAppCard.Page.al
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
namespace D4P.CCMS.PTEApps;
page 62028 "D4P BC PTE App Card"
{
ApplicationArea = All;
Caption = 'D365BC PTE Apps Card';
PageType = Card;
SourceTable = "D4P BC PTE App";

layout
{
area(Content)
{
group(General)
{
Caption = 'General';

field("PTE ID"; Rec."PTE ID")
{
}
field("PTE Name"; Rec."PTE Name")
{
}
field("App Version"; Rec."Latest App Version")
{
}
}
group(DevOpsGroup)
{
Caption = 'DevOps';

field("Range From"; Rec."Range From")
{
}
field("Range To"; Rec."Range To")
{
}
field(DevOps; Rec.DevOps)
{
}
field("DevOps Organization"; Rec."DevOps Organization")
{
}
field("DevOps Package"; Rec."DevOps Package")
{
Visible = DevOpsPackageVisible;
}
field("DevOps Feed"; Rec."DevOps Feed")
{
Visible = DevopsFeedVisible;
}
field("NuGet Package Name"; Rec."NuGet Package Name")
{
}
}
}

area(FactBoxes)
{
part(PTEAppVersionsFactBox; "D4P PTE App Versions FactBox")
{
Caption = 'Versions';
ApplicationArea = All;
SubPageLink = "PTE ID" = field("PTE ID");
}
}
}

trigger OnAfterGetRecord()
begin
SetVisibleFields();
end;

local procedure SetVisibleFields()
begin
if Rec.DevOps = Rec.DevOps::Azure then begin
DevOpsPackageVisible := true;
DevopsFeedVisible := true;
end else begin
DevOpsPackageVisible := false;
DevopsFeedVisible := false;
end;
end;

var
DevOpsPackageVisible: Boolean;
DevopsFeedVisible: Boolean;
}
Loading
Loading