Ok this will be a little complex, but I have it functional. Make a screen and set it's OnVisible to this
ClearCollect(weekendTest,
AddColumns(
GroupBy(
ForAll(
Sequence(Day(DateAdd(DateAdd(DateValue(Text(DateValue(Month(DateAdd(Now(),1,Months))&"/1/2023"), "mmmm")&" 01, "&Year(Now())),1,Months),-1,Days)),0,1) As dayStep,
Switch(
Weekday(DateAdd(DateValue(Month(DateAdd(Now(),1,Months))&" 01, "&Year(Now())), dayStep.Value, Days)),
7,
{DateTaken:DateAdd(DateValue(Month(DateAdd(Now(),1,Months))&" 01, "&Year(Now())), dayStep.Value, Days), WeekTaken:WeekNum(DateAdd(DateValue(Month(DateAdd(Now(),1,Months))&" 01, "&Year(Now())), dayStep.Value, Days),StartOfWeek.Monday)},
1,
{DateTaken:DateAdd(DateValue(Month(DateAdd(Now(),1,Months))&" 01, "&Year(Now())), dayStep.Value, Days), WeekTaken:WeekNum(DateAdd(DateValue(Month(DateAdd(Now(),1,Months))&" 01, "&Year(Now())), dayStep.Value, Days),StartOfWeek.Monday)}
)
), "WeekTaken","WeekendSet"),"Choice",Value(Blank()),"QueueSpot", Value(Blank()))
);
ClearCollect(QueueCount,{Value:1});
ForAll(weekendTest.WeekTaken As _item,
UpdateIf(weekendTest, WeekTaken=_item.WeekTaken,{QueueSpot:CountRows(QueueCount)});
Collect(QueueCount,{Value:1}));
Reset(monthChoice)
You will have some errors, ignore them, they will be resolved as we add items to the screen.
Now, add a Dropdown controld name it monthChoice.
Set it's Default property to
Text(DateValue(Month(DateAdd(Now(),1,Months))&"/1/2023"), "mmmm")
Set it's Items property to
ForAll(Sequence(12), Text(DateValue(ThisRecord.Value&"/1/2023"), "mmmm"))
Lastly set it's OnChange property to
ClearCollect(weekendTest,
AddColumns(
GroupBy(
ForAll(
Sequence(Day(DateAdd(DateAdd(DateValue(monthChoice.SelectedText.Value&" 01, "&Year(Now())),1,Months),-1,Days)),0,1) As dayStep,
Switch(
Weekday(DateAdd(DateValue(monthChoice.SelectedText.Value&" 01, "&Year(Now())), dayStep.Value, Days)),
7,
{DateTaken:DateAdd(DateValue(monthChoice.SelectedText.Value&" 01, "&Year(Now())), dayStep.Value, Days), WeekTaken:WeekNum(DateAdd(DateValue(monthChoice.SelectedText.Value&" 01, "&Year(Now())), dayStep.Value, Days),StartOfWeek.Monday)},
1,
{DateTaken:DateAdd(DateValue(monthChoice.SelectedText.Value&" 01, "&Year(Now())), dayStep.Value, Days), WeekTaken:WeekNum(DateAdd(DateValue(monthChoice.SelectedText.Value&" 01, "&Year(Now())), dayStep.Value, Days),StartOfWeek.Monday)}
)
), "WeekTaken","WeekendSet"),"Choice",Value(Blank()),"QueueSpot", Value(Blank()))
);
ClearCollect(QueueCount,{Value:1});
ForAll(weekendTest.WeekTaken As _item,
UpdateIf(weekendTest, WeekTaken=_item.WeekTaken,{QueueSpot:CountRows(QueueCount)});
Collect(QueueCount,{Value:1}));
NOW add a vertical gallery anywhere on this screen
Set it's Items property to
weekendTest
Set it's TemplateSize property to
Self.Height/CountRows(Self.AllItems)
In here we will place 2 buttons, a radio control, and a label like so

On our ResetChoices button make it's text read Start Over, or whatever you want and it's OnSelect Property should read
ClearCollect(weekendTest,
AddColumns(
GroupBy(
ForAll(
Sequence(Day(DateAdd(DateAdd(DateValue(monthChoice.SelectedText.Value&" 01, "&Year(Now())),1,Months),-1,Days)),0,1) As dayStep,
Switch(
Weekday(DateAdd(DateValue(monthChoice.SelectedText.Value&" 01, "&Year(Now())), dayStep.Value, Days)),
7,
{DateTaken:DateAdd(DateValue(monthChoice.SelectedText.Value&" 01, "&Year(Now())), dayStep.Value, Days), WeekTaken:WeekNum(DateAdd(DateValue(monthChoice.SelectedText.Value&" 01, "&Year(Now())), dayStep.Value, Days),StartOfWeek.Monday)},
1,
{DateTaken:DateAdd(DateValue(monthChoice.SelectedText.Value&" 01, "&Year(Now())), dayStep.Value, Days), WeekTaken:WeekNum(DateAdd(DateValue(monthChoice.SelectedText.Value&" 01, "&Year(Now())), dayStep.Value, Days),StartOfWeek.Monday)}
)
), "WeekTaken","WeekendSet"),"Choice",Value(Blank()),"QueueSpot", Value(Blank()))
);
ClearCollect(QueueCount,{Value:1});
ForAll(weekendTest.WeekTaken As _item,
UpdateIf(weekendTest, WeekTaken=_item.WeekTaken,{QueueSpot:CountRows(QueueCount)});
Collect(QueueCount,{Value:1}));
and set it's Visible Property to
ThisItem.QueueSpot=1
so that it only appears once in the gallery.
can also change that to
ThisItem.QueueSpot=CountRows(weekendTest)
If you prefer that appear at the bottom.
Our ResetRadio button Set its Visible property to
false
and make the OnSelect property
Reset(ChoiceRadio)
This is necessary to keep the user from selecting the week in a restricted scenario by clicking it multiple times (the logic for restrictions fires off in the onchange, so if they don't change it (ie select a restricted answer twice in a row technically is not a change) we will still be able to restrict this choice.
Now place your radio control.
It's Items property should be
ForAll(Sequence(CountRows(weekendTest)) As countItem,
Switch(countItem.Value,
1,
countItem.Value&"st Choice",
2,
countItem.Value&"nd Choice",
3,
countItem.Value&"rd Choice",
countItem.Value&"th Choice"))
Make it's OnSelect property
Select(ResetRadio)
And it's OnChange property
If(
Value(Left(Self.Selected.Value,1)) in weekendTest.Choice,
Notify("Error, Duplicate Choice Made");
Patch(weekendTest, ThisItem, {Choice: Value(Blank())});
Reset(ChoiceRadio); Reset(ChoiceRadio),
ThisItem.QueueSpot = 1 || ThisItem.QueueSpot = 2,
Patch(weekendTest, ThisItem, {Choice: Value(Left(Self.Selected.Value,1))}),
And(
Sum(LookUp(weekendTest,QueueSpot=ThisItem.QueueSpot-1).Choice-LookUp(weekendTest,QueueSpot=ThisItem.QueueSpot-2).Choice)=1,
Value(Left(Self.Selected.Value,1))=Value(LookUp(weekendTest,QueueSpot=ThisItem.QueueSpot-1).Choice)+1
),
Notify("Error, Weekends Can Only be Ranked Consecutively Twice.");
Patch(weekendTest, ThisItem, {Choice: Value(Blank())});
Reset(ChoiceRadio); Reset(ChoiceRadio),
Patch(weekendTest, ThisItem, {Choice: Value(Left(Self.Selected.Value,1))}));
Reset(Self)
Its Default property is
Switch(Value(ThisItem.Choice),
1,
ThisItem.Choice&"st Choice",
2,
ThisItem.Choice&"nd Choice",
3,
ThisItem.Choice&"rd Choice",
4,
ThisItem.Choice&"th Choice",
5,
ThisItem.Choice&"th Choice",
Blank())
And then for the label I just put this for it's Text property
Text(First(ThisItem.WeekendSet).DateTaken, "mmm d/")&Text(Last(ThisItem.WeekendSet).DateTaken, "d")
All this gives you the survey and has it start off having user rank all the weekend dates for the NEXT month. Only let's you rank consecutively 2x (and gives a warning message if you try to do 3) Only lets you pick a ranking once (warning if you try to rank two things first for example) has a button if user messes it up too much to reset and start over, and also has a month selector that you can use to rank months that aren't the next month if you want. can hide that if not.
Here's what pops up (see top of image) when I try to select first weekend as first choice, second weekend as second choice, then ATTEMPT to click third choice for 3rd weekend

And here is what happens when I try and select first choice for week 3 when it is already a rankign I gave to the first week.

I think this is just about the easiest way you can accomplish this, it's a fairly complex set of conditions I think, unless I am over complicating it in my mind. @timl you wouldn't happen to see anything I could have made easier do you?