Policy Tracker
v3.7: NewsletterPack now drafts the weekly Thursday Batch 1/2 emails directly via the Office 365 Outlook connector's DraftEmail action — bold HTML body built from this week's newsletter items plus a fixed footer, BCC pulled from Branch Contact Groups' BM Groups/BM Memberships SharePoint lists (per-user identity, no shared connection). Requires those two lists added as data sources before pasting. Manual step still required: paste this week's release link into the placeholder in the drafted body, and set the OFFICIAL sensitivity label before sending.
Canvas app tracking ACCT UK policy documents through the release pipeline. V2 is a complete redesign: dominant type-colour card panels, segmented type filter, inline search, owner initials circles, status dots, Newsletter Pack screen, and a new cool-grey palette throughout. Wraps the Policy Proof Tracker SharePoint list with a PolicyLinks child list.
Before You Start
- Verify your SharePoint list columns match the table below (no new columns needed for V2).
- Open Power Apps Studio → New blank canvas app (tablet landscape, 1366×768).
- Add all three data connections listed below.
- Set App → OnStart using the code block below — copy and paste the whole thing.
- Create 6 blank screens, then paste each YAML in order (see Screens section).
- Set the startup screen to
StartScreenin App → StartScreen.
Data Connections
Add these in the Data panel before pasting any screen YAML:
- SharePoint → your ACCT UK SharePoint site →
Policy Proof Tracker - SharePoint → same site →
PolicyLinks - Office365Users → used for the owner people-picker on ViewItem
SharePoint Column Reference
No new columns are required for V2. These internal names are used across the YAML — check them in SharePoint list settings if any Patch calls fail.
TrackerType— displays as “Document Type”PublishDate— displays as “Planned Publish Date”ActualPublishedDate— displays as “Published Date”ReadyForRelease— displays as “Approved by Pillar Lead (Ready to Release)”External_x0020_consultation_x002— displays as “External consultation required”Item_x0020_summary— displays as “Item summary”Title_x0020_for_x0020_Newsletter— displays as “Title for Newsletter”Approved_x0020_For_x0020_Release— displays as “Approved For Release By”Top_x0020_Item— displays as “Top Item” (Yes/No, default No)
App.OnStart
Paste into App → OnStart in Power Apps Studio. Do not put this inside any screen YAML. Run it once after pasting to populate all collections before using any screen.
colNewsletterUsers in the OnStart block below. No other change is needed anywhere in the app.
// App.OnStart — Policy Tracker V2
// Paste into App → OnStart in Power Apps Studio (not a screen YAML)
// ── State variables ──────────────────────────────────────────────────────────
Set(varSelectedState, "Current");
Set(varShowSearch, false);
Set(varSelectPolicy, "Empty");
Set(varHistoricLimit, 28);
Set(varSelectedDate, Today());
Set(varSelectedItem, Blank());
Set(varSelectedRelease, Blank());
Set(varSelectedLink, Blank());
Set(varShowDuplicateModal, false);
Set(varSaving, false);
Set(varUnsavedChanges, false);
Set(varParentSaved, false);
Set(varLoadingLinks, false);
Set(varFormSaved, false);
Set(varDeletingItem, false);
Set(varSaveMode, "");
Set(varDuplicating, false);
Set(varShowLinkModal, false);
Set(varShowMyEntries, false);
Set(varScrollDate, Blank());
Set(varSourceScreen, "Main");
Set(varDeepLinkHandled, false);
Set(varLoading, false);
Set(gblMorphTimestamp, Text(Now(), "yyyymmddhhmmss"));
// ── V2 additions ─────────────────────────────────────────────────────────────
Set(varTypeFilter, "All");
Set(varSearchText, "");
Set(varNextThursday, DateAdd(Today(), Mod(5 - Weekday(Today()) + 7, 7), "Days"));
// ── Newsletter access list (add rows here to grant access) ───────────────────
ClearCollect(
colNewsletterUsers,
{Email: "allan.hamilton775@mod.gov.uk"},
{Email: "dan.smith391@mod.gov.uk"}
);
// ── Document type colour map (V2 palette) ─────────────────────────────────────
ClearCollect(
colChoiceColors,
ForAll(
Choices('Policy Proof Tracker'.'Document Type'),
{
ChoiceValue: Value,
ColorCode: Switch(
Value,
"📄 MoD Policy", RGBA(28, 32, 48, 1),
"MoD Policy", RGBA(28, 32, 48, 1),
"📄 ACSO", RGBA(20, 60, 140, 1),
"ACSO", RGBA(20, 60, 140, 1),
"📖 Regulation", RGBA(0, 130, 140, 1),
"Regulation", RGBA(0, 130, 140, 1),
"📄 CFSO", RGBA(108, 40, 168, 1),
"CFSO", RGBA(108, 40, 168, 1),
"📄 CFI", RGBA(56, 96, 178, 1),
"CFI", RGBA(56, 96, 178, 1),
"📄 CBN", RGBA(191, 100, 30, 1),
"CBN", RGBA(191, 100, 30, 1),
"📕 SOI", RGBA(180, 50, 40, 1),
"SOI", RGBA(180, 50, 40, 1),
"📑 Internal Document", RGBA(90, 90, 115, 1),
"Internal Document", RGBA(90, 90, 115, 1),
"📗 Manual", RGBA(46, 125, 89, 1),
"Manual", RGBA(46, 125, 89, 1),
"📜 Newsletter Item", RGBA(160, 120, 0, 1),
"Newsletter Item", RGBA(160, 120, 0, 1),
RGBA(150, 150, 150, 1)
)
}
)
);
// ── App theme (V2 forest green palette) ──────────────────────────────────────
Set(
AppTheme,
{
palette: {
themePrimary: RGBA(46, 125, 89, 1),
themeSecondary: RGBA(36, 100, 70, 1),
themeTertiary: RGBA(28, 80, 55, 1),
neutralLight: RGBA(243, 244, 248, 1),
neutralDark: RGBA(28, 32, 48, 1),
white: RGBA(255, 255, 255, 1)
},
semanticColors: {
buttonBackground: RGBA(46, 125, 89, 1),
buttonBackgroundHovered: RGBA(36, 100, 70, 1),
buttonBackgroundPressed: RGBA(28, 80, 55, 1),
buttonText: RGBA(255, 255, 255, 1)
}
}
)
Screens
Create a blank screen for each, then paste in the order below. Screens marked V3 (old) still work — paste them while V2 rebuilds are in progress. Replace each one as the V2 version is released.
Test Screens (not yet promoted)
Full redesign in progress, pasted onto new screens (Main_1, ViewItem_1) rather than overwriting the real Main/ViewItem above — safe to test without risking the live screens. Once happy, delete the old screens and rename these to Main/ViewItem.
Progress control.ModernTabList control and a small live-counts caption underneath. Header and Card controls deliberately NOT used — verified against Microsoft's own docs to be unfit for this app's action-bar and card-click-target patterns.In-Place Rebuild Guides
Targeted build guides for changing the existing screens section by section instead of pasting a whole replacement screen.
Paste Order
- Create 6 blank screens in Power Apps Studio (names do not matter — YAML renames them on paste).
- Click the first blank screen. Open the three-dot menu on the screen name → Paste YAML.
- Paste each screen in order: StartScreen, Main, Overview, Historic, ViewItem, NewsletterPack.
- After pasting all screens, set App → StartScreen to
StartScreen. - Run App → OnStart once via the “Run OnStart” option to populate all collections.
V2 Design Reference
Colour Palette
| Token | RGBA | Use |
|---|---|---|
| Background | RGBA(243, 244, 248, 1) | Screen fill, controls row |
| Card | RGBA(255, 255, 255, 1) | Gallery cards, stat bar |
| Primary green | RGBA(46, 125, 89, 1) | Buttons, active states, Manual type |
| Foreground | RGBA(28, 32, 48, 1) | Primary text, card titles |
| Muted | RGBA(112, 116, 134, 1) | Secondary text, labels, dates |
| Border | RGBA(28, 32, 48, 0.12) | Card borders |
Document Type Colours
| Type | Colour | RGBA |
|---|---|---|
| MoD Policy | Dark slate | RGBA(28, 32, 48, 1) |
| ACSO | Navy | RGBA(20, 60, 140, 1) |
| Regulation | Teal | RGBA(0, 130, 140, 1) |
| CFSO | Rich purple | RGBA(108, 40, 168, 1) |
| CFI | Steel blue | RGBA(56, 96, 178, 1) |
| CBN | Amber orange | RGBA(191, 100, 30, 1) |
| Manual | Forest green | RGBA(46, 125, 89, 1) |
| Newsletter Item | Gold | RGBA(160, 120, 0, 1) |
| SOI | Terracotta | RGBA(180, 50, 40, 1) |
| Internal Document | Slate grey | RGBA(90, 90, 115, 1) |
Sort Priority Order
| Priority | Type | Notes |
|---|---|---|
| 0 | Top Item | Always first, regardless of type |
| 1 | MoD Policy | |
| 2 | ACSO | |
| 3 | Regulation | |
| 4 | CFSO | |
| 5 | CFI | |
| 6 | CBN | |
| 7 | Manual | |
| 8 | Newsletter Item | |
| 9 | SOI | |
| 10 | Internal Document |
What Changed in V2
- Card redesign: Dominant 110px type-colour left panel replacing the thin 6px stripe. White type label (Courier New, bold) centred in the panel.
- Type filter: 10-button segmented control inline below the stat bar. Replaces the old search modal trigger. Filters gallery in real time.
- Inline search: Text box in the controls row. Gallery filters live as you type. No overlay modal.
- Owned by Me: Bordered toggle button with green active state. Replaces the Fluent Toggle.
- Owner initials circle: Coloured circle with initials replaces the owner photo image.
- Status dot: Colour-coded dot + label on every card (On Track / At Risk / Blocked / Published).
- High Priority border: Amber border (2px) on high-priority cards.
- Empty state: “No releases match your filters.” shown when gallery returns 0 items.
- Newsletter Pack button: Gold button in header, only visible to users in
colNewsletterUsers. - New colour palette: Forest green primary, cool-grey background, muted slate text throughout.
- Updated OnStart: Adds
varTypeFilter,varSearchText,varNextThursday,colNewsletterUsers, and updated type colours. - Removed: Search overlay modal on Main. Classification labels (“Official”/“Official-Sensitive”) removed from all cards.
Notes
varSelectedRelease, varSelectPolicy, colLinks, etc.) are still initialised. You will not see any errors on paste.
colNewsletterUsers collection in App.OnStart to add or remove users. The button in the Main header is automatically hidden for users not in the list. No other change needed.
Top Item. Main, Overview, and ViewItem V2 still expect a future Yes/No SharePoint column displayed as Top Item, internal name Top_x0020_Item, default No. Add that column before repasting those screens.
Issues & Feedback
Found a problem or need a change? Report it in the issues tracker.