← Back to Policy Tracker guide
Thursday Date Picker, Full Build Guide
Replaces the free calendar on ViewItem's Planned Publish Date with a ranked list of upcoming Thursdays — item counts, a "this week's release" tag, and a relative-time label per row. Mockup: the approved design. Build this control by control in the real editor, same as the rest of this app — not a YAML paste.
Why the old date picker stays, hidden
dpkPublishDate1.SelectedDate is read directly by a lot of other formulas already on this screen and elsewhere — the 10-day warning banner, the Save button's date validation, the actual Patch that writes 'Planned Publish Date' when you save. Rewiring every one of those to a new variable instead would be a much bigger, riskier change for no real benefit.
Instead: dpkPublishDate1 stays exactly where it is, keeps doing exactly what it already does, just becomes invisible. Its DefaultDate gets repointed to a new variable, varPlannedPublishDate, which the new picker sets. Everything downstream keeps reading dpkPublishDate1.SelectedDate completely unchanged and never needs to know the picker UI changed.
1. Extend ViewItem.OnVisible
Adds two things: varPlannedPublishDate (defaults new entries to the nearest Thursday, keeps existing entries on their saved date — this is also what fixes "new entries should auto-pick the closest Thursday"), and colThursdayOptions, a fresh list of the next 104 Thursdays (2 years) with a live item count per week, rebuilt every time the screen opens.
Click the ViewItem screen itself in Tree view (not a control inside it), select OnVisible, select everything in the box, and paste this over the whole thing:
=Set(varLoadingLinks, true);
Set(varSaving, false);
Set(varShowLinkModal, false);
Set(varSelectedLink, Blank());
Set(varErrTitle, false);
Set(varErrOwner, false);
Set(varErrDocType, false);
Set(varErrPublishDate, false);
Set(
varOwnerDefault,
If(
IsBlank(varSelectedRelease) || IsBlank(varSelectedRelease.Owner.Email),
Table({DisplayName: User().FullName, Mail: User().Email}),
Table({DisplayName: varSelectedRelease.Owner.DisplayName, Mail: varSelectedRelease.Owner.Email})
)
);
Set(
varPlannedPublishDate,
If(
IsBlank(varSelectedRelease) || IsBlank(varSelectedRelease.'Planned Publish Date'),
DateAdd(Today(), Mod(5 - Weekday(Today()) + 7, 7), "Days"),
varSelectedRelease.'Planned Publish Date'
)
);
Set(varShowThursdayPicker, false);
ClearCollect(
colThursdayOptions,
ForAll(
Sequence(104),
With(
{_thu: DateAdd(Today(), Mod(5 - Weekday(Today()) + 7, 7) + (Value - 1) * 7, "Days")},
{
ThursdayDate: _thu,
ItemCount: CountRows(
Filter(
'Policy Proof Tracker',
Year('Planned Publish Date') = Year(_thu) &&
Month('Planned Publish Date') = Month(_thu) &&
Day('Planned Publish Date') = Day(_thu)
)
)
}
)
)
);
If(
!varDeepLinkHandled && !IsBlank(Param("ID")),
Set(varDeepLinkHandled, true);
Set(varItemID, Param("ID"));
Set(varLoading, true);
Refresh('Policy Proof Tracker');
Set(varDeepLinkItem, LookUp('Policy Proof Tracker', ID = Value(varItemID)));
If(
!IsBlank(varDeepLinkItem),
Set(varSelectedRelease, varDeepLinkItem);
Set(varSelectPolicy, "Filled");
Set(varParentSaved, true);
Set(varSelectedItem, varDeepLinkItem);
Set(varSourceScreen, "Main");
Set(varSelectedPerson, varDeepLinkItem.Owner);
Refresh(PolicyLinks);
BuildLinksForSource(varDeepLinkItem.ID);
Set(varOwnerDefault, Table({DisplayName: varDeepLinkItem.Owner.DisplayName, Mail: varDeepLinkItem.Owner.Email}));
Set(varPlannedPublishDate, varDeepLinkItem.'Planned Publish Date'),
Notify("This item could not be found. It may have been deleted or the link may be incorrect.", NotificationType.Error);
Set(varDeepLinkNotFound, true)
);
Set(varLoading, false)
);
If(
!IsBlank(varSelectedRelease.ID),
Refresh(PolicyLinks);
BuildLinksForSource(varSelectedRelease.ID);
Set(varLoadingLinks, false),
Clear(colLinks);
Set(varLoadingLinks, false)
);
Reset(txtTitle1);
Reset(drpDocType1);
Reset(dpkPublishDate1);
Reset(ckbHighPriority1);
Reset(txtReasonHighPri1);
Reset(ckbExtConsult1);
Reset(txtExtConsultDetails1);
Reset(ckbTopItem1);
Reset(txtNewsletterTitle1);
Reset(txtAudience1);
Reset(txtSummary1);
Reset(txtRemarks1);
Reset(ckbPillarLead1);
Reset(radApproval1);
Reset(ckbPublished1);
Reset(dpkPublishedDate1);
Reset(cmb_Owner1)Only additions versus what's already there: the varPlannedPublishDate block, the Set(varShowThursdayPicker, false) line, the ClearCollect(colThursdayOptions, ...) block, and one added line in the deep-link branch so that path sets varPlannedPublishDate too. Everything else is identical to your current OnVisible.
Filter over 'Policy Proof Tracker' — fine at this table's realistic size, no need for a fancier precomputed version.2. Hide the old calendar field
Three property changes, no control deletions.
| Control | Property | New value |
|---|---|---|
dpkPublishDate1 | DefaultDate | =varPlannedPublishDate |
dpkPublishDate1 | Visible | =false |
lblThursdayNote1 | Visible | =false |
recErrPublishDate1 | Visible | =false |
The last two are now dead code — lblThursdayNote1 warned about non-Thursday dates, recErrPublishDate1 was a red error highlight behind the old picker. Neither can be reached once only Thursdays are selectable; the new trigger field gets its own error styling in the next step instead of deleting these outright.
3. Build the new trigger field
In Tree view, click dpkPublishDate1 once to select it (this makes new controls Insert as siblings next to it, in the same parent), then paste this whole block — it adds all three new controls in one go: recPublishDateTrigger1, lblPublishDateTriggerText1, iconPublishDateChevron1.
recPublishDateTrigger1: this needs rounded corners, and neither Rectangle nor classic Label support any Radius* property in this app — confirmed multiple times before, documented in the Bible's known-bad-patterns list. Using Classic/Button@2.2.0 with DisplayMode.View instead, the confirmed-working substitute already used elsewhere in this app for exactly this need (the type-filter chips, the approval-stepper dots).- recPublishDateTrigger1:
Control: Classic/Button@2.2.0
Properties:
BorderColor: =If(varErrPublishDate, RGBA(163, 45, 45, 1), RGBA(223, 229, 224, 1))
BorderThickness: =1
Color: =RGBA(0, 0, 0, 0)
DisplayMode: =DisplayMode.View
Fill: =RGBA(255, 255, 255, 1)
Font: =Font.'Open Sans'
Height: =40
HoverBorderColor: =RGBA(11, 74, 54, 1)
HoverFill: =RGBA(244, 246, 243, 1)
OnSelect: =Set(varShowThursdayPicker, true)
PressedFill: =RGBA(244, 246, 243, 1)
RadiusBottomLeft: =8
RadiusBottomRight: =8
RadiusTopLeft: =8
RadiusTopRight: =8
Text: =""
Width: =Parent.Width
Y: =22
- lblPublishDateTriggerText1:
Control: ModernText@1.0.0
Properties:
Color: =RGBA(22, 33, 28, 1)
Font: =Font.'Open Sans'
FontWeight: =FontWeight.Bold
Size: =11
Height: =40
Width: =Parent.Width - 40
X: =14
Y: =22
Text: =Text(varPlannedPublishDate, "dddd, d mmm yyyy")
- iconPublishDateChevron1:
Control: ModernIcon@1.1.1
Properties:
Icon: ="ChevronDown"
IconColor: =RGBA(91, 105, 97, 1)
Height: =16
Width: =16
X: =Parent.Width - 30
Y: =344. Build the picker modal and card list
One new top-level control, containing everything else nested inside it — the modal shell, the header, the note, the gallery, and the card template all paste in as one tree. In Tree view, select the ViewItem screen itself (or right-click DeleteItemModal1 and choose "Paste after" if your version of Studio supports it), so this lands as the very last child of the screen, above everything else in paint order.
- ThursdayPickerModal1:
Control: GroupContainer@1.5.0
Variant: AutoLayout
Properties:
Fill: =RGBA(53, 61, 63, 0.84)
Height: =Parent.Height
Width: =Parent.Width
LayoutDirection: =LayoutDirection.Vertical
LayoutAlignItems: =LayoutAlignItems.Center
LayoutJustifyContent: =LayoutJustifyContent.Center
Visible: =varShowThursdayPicker
Children:
- conThuModalCard1:
Control: GroupContainer@1.5.0
Variant: AutoLayout
Properties:
AlignInContainer: =AlignInContainer.SetByContainer
FillPortions: =0
Fill: =RGBA(244, 246, 243, 1)
Width: =420
Height: =560
LayoutDirection: =LayoutDirection.Vertical
LayoutGap: =4
DropShadow: =DropShadow.Regular
RadiusBottomLeft: =16
RadiusBottomRight: =16
RadiusTopLeft: =16
RadiusTopRight: =16
PaddingBottom: =16
PaddingLeft: =16
PaddingRight: =16
PaddingTop: =16
Children:
- conThuModalHeader1:
Control: GroupContainer@1.5.0
Variant: AutoLayout
Properties:
FillPortions: =0
Height: =32
LayoutDirection: =LayoutDirection.Horizontal
LayoutJustifyContent: =LayoutJustifyContent.SpaceBetween
LayoutAlignItems: =LayoutAlignItems.Center
Width: =Parent.Width
Children:
- lblThuModalTitle1:
Control: ModernText@1.0.0
Properties:
Text: ="Pick a Thursday"
Color: =RGBA(22, 33, 28, 1)
Font: =Font.'Lato Black'
FontWeight: =FontWeight.Bold
Size: =16
- btnThuModalClose1:
Control: ModernButton@1.0.0
Properties:
Icon: ="Dismiss"
Layout: =ButtonLayout.IconOnly
Appearance: =ButtonAppearance.Subtle
OnSelect: =Set(varShowThursdayPicker, false)
- lblThuModalNote1:
Control: Label@2.5.1
Properties:
FillPortions: =0
Text: ="Only Thursdays are shown — releases only go out on a Thursday."
Color: =RGBA(91, 105, 97, 1)
Font: =Font.'Open Sans'
Size: =9
Height: =16
Width: =Parent.Width
- galThursdayOptions1:
Control: Gallery@2.15.0
Variant: VariableHeight
Properties:
FillPortions: =1
Items: =colThursdayOptions
Width: =Parent.Width
TemplateSize: =78
Children:
- conThuCard1:
Control: GroupContainer@1.5.0
Variant: ManualLayout
Properties:
Fill: |-
=If(
ThisItem.ThursdayDate = varPlannedPublishDate, RGBA(227, 239, 232, 1),
ThisItem.ThursdayDate = First(colThursdayOptions).ThursdayDate, RGBA(255, 243, 214, 1),
RGBA(255, 255, 255, 1)
)
BorderColor: |-
=If(
varSelectPolicy = "Empty" && DateDiff(Today(), ThisItem.ThursdayDate, "Days") >= 0 && DateDiff(Today(), ThisItem.ThursdayDate, "Days") < 10 && !ckbHighPriority1.Value && !ckbExtConsult1.Value, RGBA(163, 45, 45, 1),
ThisItem.ThursdayDate = varPlannedPublishDate, RGBA(11, 74, 54, 1),
ThisItem.ThursdayDate = First(colThursdayOptions).ThursdayDate, RGBA(255, 186, 8, 1),
RGBA(223, 229, 224, 1)
)
BorderThickness: |-
=If(
varSelectPolicy = "Empty" && DateDiff(Today(), ThisItem.ThursdayDate, "Days") >= 0 && DateDiff(Today(), ThisItem.ThursdayDate, "Days") < 10 && !ckbHighPriority1.Value && !ckbExtConsult1.Value, 2,
ThisItem.ThursdayDate = varPlannedPublishDate, 2,
ThisItem.ThursdayDate = First(colThursdayOptions).ThursdayDate, 2,
1
)
DropShadow: =DropShadow.None
Height: =70
Width: =Parent.TemplateWidth - 8
RadiusBottomLeft: =12
RadiusBottomRight: =12
RadiusTopLeft: =12
RadiusTopRight: =12
Y: =4
Children:
- conThuCardContent1:
Control: GroupContainer@1.5.0
Variant: AutoLayout
Properties:
LayoutDirection: =LayoutDirection.Horizontal
LayoutAlignItems: =LayoutAlignItems.Center
LayoutGap: =12
PaddingLeft: =10
PaddingRight: =10
Width: =Parent.Width
Height: =Parent.Height
X: =0
Y: =0
Children:
- conThuChip1:
Control: GroupContainer@1.5.0
Variant: ManualLayout
Properties:
FillPortions: =0
Fill: =If(ThisItem.ThursdayDate = First(colThursdayOptions).ThursdayDate, RGBA(255, 186, 8, 1), RGBA(227, 239, 232, 1))
Height: =50
Width: =56
RadiusBottomLeft: =10
RadiusBottomRight: =10
RadiusTopLeft: =10
RadiusTopRight: =10
Children:
- lblThuChipBig1:
Control: Label@2.5.1
Properties:
Text: |-
=With(
{
_thisWeekStart: DateAdd(Today(), -(Weekday(Today(), StartOfWeek.Monday) - 1), "Days"),
_thuWeekStart: DateAdd(ThisItem.ThursdayDate, -(Weekday(ThisItem.ThursdayDate, StartOfWeek.Monday) - 1), "Days")
},
With(
{_weeks: DateDiff(_thisWeekStart, _thuWeekStart, "Days") / 7},
If(
_weeks = 0, "This",
_weeks <= 8, _weeks & "wk",
Round(_weeks / 4.345, 0) & "mo"
)
)
)
Color: =If(ThisItem.ThursdayDate = First(colThursdayOptions).ThursdayDate, RGBA(80, 50, 0, 1), RGBA(11, 74, 54, 1))
Font: =Font.'Open Sans'
FontWeight: =FontWeight.Bold
Align: =Align.Center
Size: =13
Height: =24
Width: =Parent.Width
Y: =6
- lblThuChipSmall1:
Control: Label@2.5.1
Properties:
Text: |-
=With(
{
_thisWeekStart: DateAdd(Today(), -(Weekday(Today(), StartOfWeek.Monday) - 1), "Days"),
_thuWeekStart: DateAdd(ThisItem.ThursdayDate, -(Weekday(ThisItem.ThursdayDate, StartOfWeek.Monday) - 1), "Days")
},
If(DateDiff(_thisWeekStart, _thuWeekStart, "Days") = 0, "week", "ahead")
)
Color: =If(ThisItem.ThursdayDate = First(colThursdayOptions).ThursdayDate, RGBA(80, 50, 0, 1), RGBA(11, 74, 54, 1))
Font: =Font.'Open Sans'
FontWeight: =FontWeight.Bold
Align: =Align.Center
Size: =7
Height: =14
Width: =Parent.Width
Y: =30
- conThuTextCol1:
Control: GroupContainer@1.5.0
Variant: AutoLayout
Properties:
FillPortions: =1
LayoutDirection: =LayoutDirection.Vertical
LayoutGap: =2
Height: =Parent.Height
Children:
- pillThuNextTag1:
Control: ModernText@1.0.0
Properties:
FillPortions: =0
AutoHeight: =true
Align: =Align.Center
Color: =RGBA(80, 50, 0, 1)
Fill: =RGBA(255, 186, 8, 1)
Font: =Font.'Open Sans'
FontWeight: =FontWeight.Bold
Size: =8
Height: =18
RadiusBottomLeft: =9
RadiusBottomRight: =9
RadiusTopLeft: =9
RadiusTopRight: =9
Text: |-
=With(
{
_startOfWeek: DateAdd(Today(), -(Weekday(Today(), StartOfWeek.Monday) - 1), "Days"),
_thu: First(colThursdayOptions).ThursdayDate
},
If(
_thu <= _startOfWeek + 6, "THIS WEEK'S RELEASE",
_thu <= _startOfWeek + 13, "NEXT WEEK'S RELEASE",
"NEXT RELEASE"
)
)
Visible: =ThisItem.ThursdayDate = First(colThursdayOptions).ThursdayDate
Width: =Parent.Width
- pillThuTooSoonTag1:
Control: ModernText@1.0.0
Properties:
FillPortions: =0
AutoHeight: =true
Align: =Align.Center
Color: =RGBA(255, 255, 255, 1)
Fill: =RGBA(163, 45, 45, 1)
Font: =Font.'Open Sans'
FontWeight: =FontWeight.Bold
Size: =8
Height: =18
RadiusBottomLeft: =9
RadiusBottomRight: =9
RadiusTopLeft: =9
RadiusTopRight: =9
Text: ="TOO SOON — HIGH PRIORITY ONLY"
Visible: |-
=varSelectPolicy = "Empty" &&
DateDiff(Today(), ThisItem.ThursdayDate, "Days") >= 0 &&
DateDiff(Today(), ThisItem.ThursdayDate, "Days") < 10 &&
!ckbHighPriority1.Value &&
!ckbExtConsult1.Value
Width: =Parent.Width
- lblThuDate1:
Control: Label@2.5.1
Properties:
FillPortions: =0
AutoHeight: =true
Text: =Text(ThisItem.ThursdayDate, "dddd, d mmmm yyyy")
Color: =RGBA(22, 33, 28, 1)
Font: =Font.'Open Sans'
FontWeight: =FontWeight.Bold
Size: =10
Width: =Parent.Width
- pillThuLoad1:
Control: ModernText@1.0.0
Properties:
FillPortions: =0
AutoHeight: =true
Text: =ThisItem.ItemCount & " item" & If(ThisItem.ItemCount <> 1, "s", "")
Color: |-
=If(
ThisItem.ItemCount >= 5, RGBA(163, 45, 45, 1),
ThisItem.ItemCount >= 3, RGBA(160, 100, 10, 1),
RGBA(46, 125, 89, 1)
)
Fill: |-
=If(
ThisItem.ItemCount >= 5, RGBA(251, 230, 226, 1),
ThisItem.ItemCount >= 3, RGBA(250, 237, 216, 1),
RGBA(228, 243, 234, 1)
)
Font: =Font.'Open Sans'
FontWeight: =FontWeight.Bold
Size: =9
Align: =Align.Center
Height: =20
Width: =88
RadiusBottomLeft: =10
RadiusBottomRight: =10
RadiusTopLeft: =10
RadiusTopRight: =10
- iconThuCheck1:
Control: ModernIcon@1.1.1
Properties:
FillPortions: =0
Icon: ="Checkmark"
IconColor: =RGBA(11, 74, 54, 1)
Visible: =ThisItem.ThursdayDate = varPlannedPublishDate
Height: =18
Width: =18
- recThuCardHit1:
Control: Rectangle@2.3.0
Properties:
Fill: =RGBA(0, 0, 0, 0)
Height: =Parent.Height
Width: =Parent.Width
HoverFill: =RGBA(0, 0, 0, 0.02)
OnSelect: |-
=Set(varPlannedPublishDate, ThisItem.ThursdayDate);
Set(varUnsavedChanges, true);
Set(varErrPublishDate, false);
Set(varShowThursdayPicker, false);
Reset(dpkPublishDate1)GroupContainer, ModernText, or Classic/Button with DisplayMode.View — the three confirmed-working options for Radius* properties in this app. recThuCardHit1 is a bare Rectangle with no radius at all, which is fine, it's an invisible click target fully covered by conThuCard1's already-rounded corners.If your version of Studio doesn't accept a paste this deep in one go, paste ThursdayPickerModal1 down through galThursdayOptions1 first (stop before Children: under the gallery), confirm that lands, then select galThursdayOptions1 in Tree view and paste just the conThuCard1 block (from - conThuCard1: down) as its item template.
conThuCardContent1 (a horizontal AutoLayout container, sized to exactly cover the card) holds, left to right, conThuChip1 (the relative-time chip, fixed width), conThuTextCol1 (the "next release" tag + date, FillPortions: =1 so it takes whatever width is left over regardless of actual card width, no more manual width math), pillThuLoad1, then iconThuCheck1 — each fixed-width sibling explicitly FillPortions: =0. recThuCardHit1 stays a separate, absolutely-positioned invisible click target underneath, since a click-through rectangle can't itself be an AutoLayout flow item.
The relative-time chip (conThuChip1) is also now the two-line stacked look from the mockup — a big bold top line (lblThuChipBig1, e.g. "3wk") and a small caption underneath (lblThuChipSmall1, "ahead", or "week" for the nearest Thursday) — instead of one small line of combined text. It's the one place still using a couple of manual Y offsets, but only to stack two lines inside a small fixed 56×50 box, not to lay out the whole card.
Also folded in: AutoHeight: =true on every ModernText pill (without it, they show a tiny internal scrollbar instead of sizing to fit), and the gold "next release" tag is dynamic — checks whether the nearest Thursday falls in the current Monday–Sunday week or the following one, so it correctly reads "Next week's release" when that's true and flips to "This week's release" on its own once the calendar week turns over.
5. Test everything
- Open an existing item. Confirm the trigger field shows its real saved Thursday, not today's nearest one.
- Click
+ New Entry. Confirm the trigger field auto-shows the nearest upcoming Thursday with no clicking required. - Click the trigger field, confirm the modal opens with the current Thursday's card highlighted gold and "This week's release" showing on the first row only.
- Pick a different Thursday further down the list. Confirm the modal closes, the trigger field updates immediately, and the green "selected" highlight moves to that row next time you open the picker.
- Click Save. Confirm the record actually saves with the newly picked date — this proves the hidden
dpkPublishDate1is still correctly feeding the real save formula. - Reopen Main, confirm the 10-day warning banner and any other date-based behaviour on this item still work exactly as before — nothing downstream should have changed.
- Pick a Thursday you know already has several items scheduled, confirm its pill shows the right colour (green under 3, amber 3–4, red 5+).
- On a brand-new (unsaved) entry, open the picker. Confirm any Thursday within the next 10 days shows a red border and a "TOO SOON — HIGH PRIORITY ONLY" tag. Pick one anyway, confirm it's still selectable (not blocked), close the picker, confirm the existing yellow warning banner appears and Save is blocked exactly as before.
- Still on that same red-zone date, tick
ckbHighPriority1(High Priority), reopen the picker, confirm the red border and tag are now gone on that row and the yellow banner has cleared — the picker's warning always agrees with the real banner because it checks the identical condition, not a separate copy of the rule. - Open an existing item whose date happens to be within 10 days of today. Confirm the picker does not show it as red-zone — the 10-day rule only ever applies to new, unsaved entries.
ckbHighPriority1 is ticked. The picker's red border/tag use the exact same condition that banner already checks, so they can never disagree with each other; a second override control inside the modal would just be a second copy of that rule to keep in sync, which is the same class of drift that caused the Owner bug earlier in this project.6. Same design, applied to the Duplicate modal
Built from the user's own tweaked version of ThursdayPickerModal1 (not the original mockup-generated one), applied to the existing "Duplicate Entry" modal, which previously used a plain dropdown. The underlying data-building logic (colThursdays, the 52-week loop that hides Thursdays within 10 days unless the item is High Priority) is unchanged — only its output gained one field, and the modal around it is rebuilt.
What's different from the main picker, on purpose:
- No red "too soon" state here. Unlike the main picker, this list is already built to exclude risky dates entirely unless the item being duplicated is High Priority — there's nothing left to warn about once a date has made it into the list.
- Selecting a card doesn't close the modal. Duplicate still needs an explicit Cancel/Duplicate step, so tapping a card only marks it selected (green ring) via a new variable,
varSelectedDuplicateDate, instead of the immediate-commit behaviour the main picker uses. - The gold tag reads "EARLIEST AVAILABLE" instead of "this/next week's release" — different meaning here, it's the first free slot to duplicate into, not the item's own release date.
- Duplicate is disabled until a date is actually picked, not just while the save is in flight.
Step 1: btnDuplicate1, full replacement (only the OnSelect changed — ItemCount added to each collected row, and a sensible default selection set before the modal opens):
- btnDuplicate1:
Control: ModernButton@1.0.0
Properties:
AccessibleLabel: ="Duplicate entry"
Align: =Align.Center
BasePaletteColor: =RGBA(11, 74, 54, 1)
FontWeight: =""
Height: =38
Icon: ="Copy"
OnSelect: |-
=ClearCollect(
colUpcomingEntries,
AddColumns(
Filter(
'Policy Proof Tracker',
'Planned Publish Date' >= Today() &&
'Planned Publish Date' <= DateAdd(Today(), 365, "Days")
),
EntryDateKey,
Date(Year('Planned Publish Date'), Month('Planned Publish Date'), Day('Planned Publish Date'))
)
);
Set(
varDaysToNextThursday,
If(Mod(5 - Weekday(Today()) + 7, 7) = 0, 7, Mod(5 - Weekday(Today()) + 7, 7))
);
ClearCollect(
colUpcomingCounts,
GroupBy(colUpcomingEntries, EntryDateKey, GroupedEntries)
);
Clear(colThursdays);
ForAll(
Sequence(52),
If(
varSelectedRelease.'High Priority' ||
varDaysToNextThursday + (Value - 1) * 7 >= 10,
With(
{thurDate: DateAdd(Today(), varDaysToNextThursday + (Value - 1) * 7, "Days")},
With(
{matchedGroup: LookUp(colUpcomingCounts, EntryDateKey = thurDate)},
With(
{cnt: If(IsBlank(matchedGroup), 0, CountRows(matchedGroup.GroupedEntries))},
Collect(
colThursdays,
{
ThursdayDate: thurDate,
ThursdayLabel: Text(thurDate, "dddd d mmmm yyyy") &
If(
cnt = 0, " - clear",
cnt = 1, " - 1 entry already scheduled",
" - " & Text(cnt, "0") & " entries already scheduled"
),
ItemCount: cnt
}
)
)
)
)
)
);
Set(varSelectedDuplicateDate, First(colThursdays).ThursdayDate);
Set(varShowDuplicateModal1, true)
PaddingBottom: =5
PaddingLeft: =12
PaddingRight: =12
PaddingTop: =5
RadiusBottomLeft: =4
RadiusBottomRight: =4
RadiusTopLeft: =4
RadiusTopRight: =4
Text: =""
Tooltip: ="Duplicate Entry"Step 2: DuplicateModal1, full replacement (paste over the entire existing modal, from DuplicateModal1: down):
- DuplicateModal1:
Control: GroupContainer@1.5.0
Variant: AutoLayout
Properties:
Fill: =RGBA(53, 61, 63, 0.84)
Height: =Parent.Height
LayoutAlignItems: =LayoutAlignItems.Center
LayoutDirection: =LayoutDirection.Vertical
LayoutJustifyContent: =LayoutJustifyContent.Center
Visible: =varShowDuplicateModal1
Width: =Parent.Width
Children:
- conDupModalCard1:
Control: GroupContainer@1.5.0
Variant: AutoLayout
Properties:
AlignInContainer: =AlignInContainer.SetByContainer
DropShadow: =DropShadow.Regular
Fill: =RGBA(244, 246, 243, 1)
FillPortions: =0
Height: =640
LayoutDirection: =LayoutDirection.Vertical
LayoutGap: =8
PaddingBottom: =16
PaddingLeft: =16
PaddingRight: =16
PaddingTop: =16
RadiusBottomLeft: =16
RadiusBottomRight: =16
RadiusTopLeft: =16
RadiusTopRight: =16
Width: =420
Children:
- conDupModalHeader1:
Control: GroupContainer@1.5.0
Variant: AutoLayout
Properties:
FillPortions: =0
Height: =32
LayoutAlignItems: =LayoutAlignItems.Center
LayoutDirection: =LayoutDirection.Horizontal
LayoutJustifyContent: =LayoutJustifyContent.SpaceBetween
Width: =Parent.Width
Children:
- lblDupModalTitle1:
Control: ModernText@1.0.0
Properties:
Color: =RGBA(22, 33, 28, 1)
Font: =Font.'Lato Black'
FontWeight: =FontWeight.Bold
Size: =16
Text: ="Duplicate Entry"
- btnDupModalClose1:
Control: ModernButton@1.0.0
Properties:
Appearance: =ButtonAppearance.Subtle
Icon: ="Dismiss"
Layout: =ButtonLayout.IconOnly
OnSelect: =Set(varShowDuplicateModal1, false)
- lblDupInstruction1:
Control: Label@2.5.1
Properties:
FillPortions: =0
Color: =RGBA(22, 33, 28, 1)
Font: =Font.'Open Sans'
FontWeight: =FontWeight.Bold
Height: =18
Size: =10
Text: ="Select the Thursday to duplicate this entry to:"
Width: =Parent.Width
- lblDupNote1:
Control: Label@2.5.1
Properties:
AutoHeight: =true
FillPortions: =0
Color: =RGBA(91, 105, 97, 1)
Font: =Font.'Open Sans'
Size: =9
Text: =If(varSelectedRelease.'High Priority', "High Priority is active - all upcoming Thursdays are shown.", "Thursdays within 10 days are hidden. Mark this entry as High Priority to override and show all dates.")
Width: =Parent.Width
- galDupThursdays1:
Control: Gallery@2.15.0
Variant: VariableHeight
Properties:
FillPortions: =1
Items: =colThursdays
TemplateSize: =78
Width: =Parent.Width
Children:
- conDupCard1:
Control: GroupContainer@1.5.0
Variant: ManualLayout
Properties:
BorderColor: |-
=If(
ThisItem.ThursdayDate = varSelectedDuplicateDate, RGBA(11, 74, 54, 1),
ThisItem.ThursdayDate = First(colThursdays).ThursdayDate, RGBA(255, 186, 8, 1),
RGBA(223, 229, 224, 1)
)
BorderThickness: |-
=If(
ThisItem.ThursdayDate = varSelectedDuplicateDate, 2,
ThisItem.ThursdayDate = First(colThursdays).ThursdayDate, 2,
1
)
DropShadow: =DropShadow.None
Fill: |-
=If(
ThisItem.ThursdayDate = varSelectedDuplicateDate, RGBA(227, 239, 232, 1),
ThisItem.ThursdayDate = First(colThursdays).ThursdayDate, RGBA(255, 243, 214, 1),
RGBA(255, 255, 255, 1)
)
Height: =70
RadiusBottomLeft: =12
RadiusBottomRight: =12
RadiusTopLeft: =12
RadiusTopRight: =12
Width: =Parent.TemplateWidth - 8
Y: =4
Children:
- conDupCardContent1:
Control: GroupContainer@1.5.0
Variant: AutoLayout
Properties:
Height: =Parent.Height
LayoutAlignItems: =LayoutAlignItems.Center
LayoutDirection: =LayoutDirection.Horizontal
LayoutGap: =12
PaddingLeft: =10
PaddingRight: =10
Width: =Parent.Width
Children:
- conDupChip1:
Control: GroupContainer@1.5.0
Variant: ManualLayout
Properties:
AlignInContainer: =AlignInContainer.Center
Fill: =If(ThisItem.ThursdayDate = First(colThursdays).ThursdayDate, RGBA(255, 186, 8, 1), RGBA(227, 239, 232, 1))
FillPortions: =0
Height: =50
RadiusBottomLeft: =10
RadiusBottomRight: =10
RadiusTopLeft: =10
RadiusTopRight: =10
Width: =56
Children:
- lblDupChipBig1:
Control: Label@2.5.1
Properties:
Align: =Align.Center
Color: =If(ThisItem.ThursdayDate = First(colThursdays).ThursdayDate, RGBA(80, 50, 0, 1), RGBA(11, 74, 54, 1))
Font: =Font.'Open Sans'
FontWeight: =FontWeight.Bold
Height: =24
Text: |-
=With(
{
_thisWeekStart: DateAdd(Today(), -(Weekday(Today(), StartOfWeek.Monday) - 1), "Days"),
_thuWeekStart: DateAdd(ThisItem.ThursdayDate, -(Weekday(ThisItem.ThursdayDate, StartOfWeek.Monday) - 1), "Days")
},
With(
{_weeks: DateDiff(_thisWeekStart, _thuWeekStart, "Days") / 7},
If(
_weeks = 0, "This",
_weeks <= 8, _weeks & "wk",
Round(_weeks / 4.345, 0) & "mo"
)
)
)
Width: =Parent.Width
Y: =6
- lblDupChipSmall1:
Control: Label@2.5.1
Properties:
Align: =Align.Center
Color: =If(ThisItem.ThursdayDate = First(colThursdays).ThursdayDate, RGBA(80, 50, 0, 1), RGBA(11, 74, 54, 1))
Font: =Font.'Open Sans'
FontWeight: =FontWeight.Bold
Height: =14
Size: =7
Text: |-
=With(
{
_thisWeekStart: DateAdd(Today(), -(Weekday(Today(), StartOfWeek.Monday) - 1), "Days"),
_thuWeekStart: DateAdd(ThisItem.ThursdayDate, -(Weekday(ThisItem.ThursdayDate, StartOfWeek.Monday) - 1), "Days")
},
If(DateDiff(_thisWeekStart, _thuWeekStart, "Days") = 0, "week", "ahead")
)
Width: =Parent.Width
Y: =30
- conDupTextCol1:
Control: GroupContainer@1.5.0
Variant: AutoLayout
Properties:
AlignInContainer: =AlignInContainer.Center
DropShadow: =DropShadow.None
FillPortions: =0
Height: =Parent.Height
LayoutDirection: =LayoutDirection.Vertical
LayoutGap: =2
LayoutMinWidth: =190
PaddingTop: =5
Width: =175
Children:
- pillDupEarliestTag1:
Control: ModernText@1.0.0
Properties:
Align: =Align.Center
AutoHeight: =true
Color: =RGBA(80, 50, 0, 1)
Fill: =RGBA(255, 186, 8, 1)
FillPortions: =0
Font: =Font.'Open Sans'
FontWeight: =FontWeight.Bold
Height: =18
RadiusBottomLeft: =9
RadiusBottomRight: =9
RadiusTopLeft: =9
RadiusTopRight: =9
Size: =8
Text: ="EARLIEST AVAILABLE"
Visible: =ThisItem.ThursdayDate = First(colThursdays).ThursdayDate
Width: =Parent.Width
- lblDupDate1:
Control: Label@2.5.1
Properties:
AlignInContainer: =AlignInContainer.Center
AutoHeight: =true
Color: =RGBA(22, 33, 28, 1)
FillPortions: =0
Font: =Font.'Open Sans'
FontWeight: =FontWeight.Bold
Height: =20
Size: =10
Text: =Text(ThisItem.ThursdayDate, "dddd, d mmmm yyyy")
Width: =Parent.Width
- pillDupLoad1:
Control: ModernText@1.0.0
Properties:
Align: =Align.Center
AutoHeight: =true
Color: |-
=If(
ThisItem.ItemCount >= 5, RGBA(163, 45, 45, 1),
ThisItem.ItemCount >= 3, RGBA(160, 100, 10, 1),
RGBA(46, 125, 89, 1)
)
Fill: |-
=If(
ThisItem.ItemCount >= 5, RGBA(251, 230, 226, 1),
ThisItem.ItemCount >= 3, RGBA(250, 237, 216, 1),
RGBA(228, 243, 234, 1)
)
FillPortions: =1
Font: =Font.'Open Sans'
FontWeight: =FontWeight.Bold
Height: =20
LayoutMinWidth: =25
RadiusBottomLeft: =10
RadiusBottomRight: =10
RadiusTopLeft: =10
RadiusTopRight: =10
Size: =9
Text: =If(ThisItem.ItemCount = 0, "Clear", ThisItem.ItemCount & " item" & If(ThisItem.ItemCount <> 1, "s", ""))
Width: =88
- iconDupCheck1:
Control: ModernIcon@1.1.1
Properties:
FillPortions: =0
Height: =18
Icon: ="Checkmark"
IconColor: =RGBA(11, 74, 54, 1)
Visible: =ThisItem.ThursdayDate = varSelectedDuplicateDate
Width: =18
- recDupCardHit1:
Control: Rectangle@2.3.0
Properties:
Fill: =RGBA(0, 0, 0, 0)
Height: =Parent.Height
HoverFill: =RGBA(0, 0, 0, 0.08)
OnSelect: =Set(varSelectedDuplicateDate, ThisItem.ThursdayDate)
Width: =Parent.Width
- conDupButtonRow1:
Control: GroupContainer@1.5.0
Variant: AutoLayout
Properties:
FillPortions: =0
Height: =44
LayoutDirection: =LayoutDirection.Horizontal
LayoutGap: =12
LayoutJustifyContent: =LayoutJustifyContent.SpaceBetween
Width: =Parent.Width
Children:
- btnDuplicateCancel1:
Control: Classic/Button@2.2.0
Properties:
FillPortions: =0
BorderColor: =ColorFade(Self.Fill, -15%)
Color: =RGBA(50, 50, 50, 1)
DisabledBorderColor: =RGBA(166, 166, 166, 1)
Fill: =RGBA(200, 200, 200, 1)
Font: =Font.'Open Sans'
HoverBorderColor: =ColorFade(Self.BorderColor, 20%)
HoverColor: =RGBA(255, 255, 255, 1)
HoverFill: =RGBA(170, 170, 170, 1)
OnSelect: =Set(varShowDuplicateModal1, false)
PressedBorderColor: =Self.Fill
PressedColor: =Self.Fill
PressedFill: =Self.Color
RadiusBottomLeft: =4
RadiusBottomRight: =4
RadiusTopLeft: =4
RadiusTopRight: =4
Text: ="Cancel"
Width: =140
- btnDuplicateConfirm1:
Control: Classic/Button@2.2.0
Properties:
FillPortions: =0
BorderColor: =ColorFade(Self.Fill, -15%)
Color: =RGBA(255, 255, 255, 1)
DisabledBorderColor: =RGBA(166, 166, 166, 1)
DisplayMode: =If(varDuplicating || IsBlank(varSelectedDuplicateDate), DisplayMode.Disabled, DisplayMode.Edit)
Fill: =RGBA(11, 74, 54, 1)
Font: =Font.'Open Sans'
HoverBorderColor: =ColorFade(Self.BorderColor, 20%)
HoverColor: =RGBA(255, 255, 255, 1)
HoverFill: =RGBA(9, 60, 44, 1)
OnSelect: |-
=Set(varDuplicating, true);
Set(
varNewDuplicate,
Patch(
'Policy Proof Tracker',
Defaults('Policy Proof Tracker'),
{
Title: varSelectedRelease.Title,
'Document Type': varSelectedRelease.'Document Type',
'Item summary': varSelectedRelease.'Item summary',
Owner: varSelectedRelease.Owner,
Audience: varSelectedRelease.Audience,
'External consultation details': varSelectedRelease.'External consultation details',
'External consultation required': varSelectedRelease.'External consultation required',
Remarks: varSelectedRelease.Remarks,
'Title for Newsletter': varSelectedRelease.'Title for Newsletter',
'High Priority': varSelectedRelease.'High Priority',
'Reason for High Priority': varSelectedRelease.'Reason for High Priority',
'Top Item': varSelectedRelease.'Top Item',
'Planned Publish Date': varSelectedDuplicateDate,
Published: false,
'Published Date': Blank(),
'Approved by Pillar Lead (Ready to Release)': false,
'Approved For Release By': Blank(),
EmailSent: false
}
)
);
Set(varDuplicating, false);
If(
IsEmpty(Errors('Policy Proof Tracker', varNewDuplicate)),
Set(varShowDuplicateModal1, false);
ClearCollect(colUnpublishedPolicies, Filter('Policy Proof Tracker', Published = false));
Notify(
"Duplicated to " & LookUp(colThursdays, ThursdayDate = varSelectedDuplicateDate).ThursdayLabel & ". Find it on the main screen.",
NotificationType.Success
),
Notify(
"Error: " & First(Errors('Policy Proof Tracker', varNewDuplicate)).Message,
NotificationType.Error
)
)
PressedBorderColor: =Self.Fill
PressedColor: =Self.Fill
PressedFill: =Self.Color
RadiusBottomLeft: =4
RadiusBottomRight: =4
RadiusTopLeft: =4
RadiusTopRight: =4
Text: ="Duplicate"
Width: =140FillPortions explicitly wherever its parent is Variant: AutoLayout and it has its own Height/Width — four of them (conDupTextCol1, pillDupEarliestTag1, lblDupDate1, iconDupCheck1) were initially left matching your tweaked ThursdayPickerModal1 exactly, which doesn't set it on those same four, but the mandatory linter on this repo treats the omission as an error regardless of precedent, so all four now have FillPortions: =0 added. Doesn't change what they do — none of the four were ever meant to stretch — just makes it explicit instead of relying on default behaviour.