From 689a8bc21677a45e33c7e7990e52849cf7048cf6 Mon Sep 17 00:00:00 2001 From: Steve BOURDIN Date: Wed, 9 Jul 2025 11:58:40 +0000 Subject: [PATCH 1/4] Date Range Picker --- power-apps/date-range-picker/README.md | 31 + .../assets/date-range-picker.png | Bin 0 -> 31022 bytes .../date-range-picker/assets/sample.json | 51 ++ .../source/date-range-picker.yaml | 623 ++++++++++++++++++ 4 files changed, 705 insertions(+) create mode 100644 power-apps/date-range-picker/README.md create mode 100644 power-apps/date-range-picker/assets/date-range-picker.png create mode 100644 power-apps/date-range-picker/assets/sample.json create mode 100644 power-apps/date-range-picker/source/date-range-picker.yaml diff --git a/power-apps/date-range-picker/README.md b/power-apps/date-range-picker/README.md new file mode 100644 index 0000000..e21c9cc --- /dev/null +++ b/power-apps/date-range-picker/README.md @@ -0,0 +1,31 @@ +# Date Range Picker + +This snippet implements a date range picker, enabling users to select a start and end date, thus improving the overall UX. + + +![date-range-picker](./assets/date-range-picker.png) + + +## Authors + +Snippet|Author +--------|--------- +Steve Bourdin | [GitHub](https://github.com/SteveBourdin) ([LinkedIn](https://www.linkedin.com/in/steve-bourdin-ab998762/) ) + +## Minimal path to awesome + +1. Open your canvas app in **Power Apps** +2. Copy the contents of the **[YAML-file](./source/date-range-picker.yaml)** +3. Click on the three dots of the screen where you want to add the snippet and select "Paste code" + + + +## Code + **[YAML-file](./source/date-range-picker.yaml)** + + +## Disclaimer + +**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** + + diff --git a/power-apps/date-range-picker/assets/date-range-picker.png b/power-apps/date-range-picker/assets/date-range-picker.png new file mode 100644 index 0000000000000000000000000000000000000000..48f83e35bf830fb2823729572485b349f38aa1b5 GIT binary patch literal 31022 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

&<<@m2jIY(ed^jBB1I2 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 literal 0 HcmV?d00001 diff --git a/power-apps/date-range-picker/assets/sample.json b/power-apps/date-range-picker/assets/sample.json new file mode 100644 index 0000000..b1fd620 --- /dev/null +++ b/power-apps/date-range-picker/assets/sample.json @@ -0,0 +1,51 @@ +[ + { + "$schema": "https://developer.microsoft.com/en-us/json-schemas/pnp/samples/v1.0/metadata-schema.json", + "name": "pnp-powerplatform-snippets-date-range-picker", + "version": "1.0.0.0", + "source": "pnp", + "creationDateTime": "2025-04-29T00:00:00.000Z", + "updateDateTime": "2025-04-29T00:00:00.000Z", + "title": "pnp-powerplatform-snippets-date-range-picker", + "shortDescription": "This snippet implements a date range picker, enabling users to select a start and end date, thus improving the overall UX", + "longDescription": [ + "This snippet implements a date range picker, enabling users to select a start and end date, thus improving the overall UX" + ], + "url": "https://github.com/pnp/powerplatform-snippets/tree/main/power-apps/date-range-picker/", + "products": [ + "Power Platform", + "Power Apps", + "powerplatform-snippets", + "power-apps-snippets" + ], + "tags": [ + ], + "categories": [ + ], + "metadata": [ + { + "key": "Product", + "value": "Power Apps" + }, + { + "key": "Type", + "value": "Snippet" + } + ], + "thumbnails": [ + { + "type": "image", + "order": 100, + "url": "https://raw.githubusercontent.com/pnp/powerplatform-snippets/main/power-apps/date-range-picker/assets/date-range-picker.png", + "alt": "Preview PNG" + } + ], + "authors": [ + { + "gitHubAccount": "SteveBourdin", + "name": "Steve Bourdin", + "pictureUrl": "https://github.com/SteveBourdin.png" + } + ] + } +] \ No newline at end of file diff --git a/power-apps/date-range-picker/source/date-range-picker.yaml b/power-apps/date-range-picker/source/date-range-picker.yaml new file mode 100644 index 0000000..8673c24 --- /dev/null +++ b/power-apps/date-range-picker/source/date-range-picker.yaml @@ -0,0 +1,623 @@ +- cont_dateInput: + Control: GroupContainer@1.3.0 + Variant: ManualLayout + Group: snippet_dateRangePicker + Properties: + BorderColor: |- + =/* Steve BOURDIN MOCA by ASI Juillet 2025*/ + RGBA(0, 0, 0, 1) + Height: =32 + Width: =378 + X: =300 + Y: =260 + Children: + - inp_dates: + Control: TextInput@0.0.54 + Properties: + Align: =Align.Center + FontColor: |- + =If( + IsBlank(var_RangeDatePicker_DateStart) || IsBlank(var_RangeDatePicker_DateStart),Color.Gray,Color.Black) + FontSize: =17 + FontWeight: =FontWeight.Semibold + Height: =Parent.Height + Value: |- + =If( + IsBlank(var_RangeDatePicker_DateStart) || IsBlank(var_RangeDatePicker_DateStart), + "Select your dates", + DateValue(var_RangeDatePicker_DateStart) & " " & DateValue(var_RangeDatePicker_DateEnd) + ) + Width: =Parent.Width + - ico_calendar: + Control: Icon@0.0.7 + Properties: + Height: =Parent.Height + Icon: ="Calendar" + IconStyle: ='Icon.IconStyle'.Outline + Width: =Parent.Height + X: =Parent.Width-Self.Width + - tim_initialization: + Control: Timer@2.1.0 + Properties: + AutoStart: =true + BorderColor: =ColorFade(Self.Fill, -15%) + Color: =RGBA(255, 255, 255, 1) + DisabledBorderColor: =ColorFade(Self.BorderColor, 70%) + DisabledColor: =ColorFade(Self.Fill, 90%) + DisabledFill: =ColorFade(Self.Fill, 70%) + Fill: =RGBA(56, 96, 178, 1) + Font: =Font.'Open Sans' + Height: =32 + HoverBorderColor: =ColorFade(Self.BorderColor, 20%) + HoverColor: =RGBA(255, 255, 255, 1) + HoverFill: =ColorFade(RGBA(56, 96, 178, 1), -20%) + OnTimerStart: |- + =UpdateContext( + { + var_RangeDatePickerDayTab: [ + { + legend: "Mon", + no: 2, + pos: 1, + color : Color.Black + }, + { + legend: "Tue", + no: 3, + pos: 2, + color : Color.Black + }, + { + legend: "Wed", + no: 4, + pos: 3, + color : Color.Black + }, + { + legend: "Thu", + no: 5, + pos: 4, + color : Color.Black + }, + { + legend: "Fri", + no: 6, + pos: 5, + color : Color.Black + }, + { + legend: "Sat", + no: 7, + pos: 6, + color : Color.Red + }, + { + legend: "Sun", + no: 1, + pos: 7, + color : Color.Black + } + ] + ,tabYear : Sort(AddColumns (Sequence(300),colYear,Value+1950),colYear,SortOrder.Descending)} + ); + If(false,UpdateContext({var_RangeDatePicker_DateEnd : Today()})); + If(false,UpdateContext({var_RangeDatePicker_DateStart : Today()})) + PressedBorderColor: =Self.Fill + PressedColor: =Self.Fill + PressedFill: =Self.Color + Start: =true + Visible: =false + X: =40 + - ico_separatorDate: + Control: Icon@0.0.7 + Properties: + Height: =2*Parent.Height/3 + Icon: ="Send" + Visible: =ico_eraser.Visible + Width: =Parent.Width + Y: =Parent.Height/6 + - btn_changeDates: + Control: Classic/Button@2.2.0 + Properties: + BorderColor: =ColorFade(Self.Fill, -15%) + Color: =RGBA(122, 138, 143, 1) + DisabledBorderColor: =RGBA(166, 166, 166, 1) + Fill: =RGBA(255, 255, 255, 0) + Font: =Font.'Open Sans' + Height: =Parent.Height + HoverBorderColor: =ColorFade(Self.BorderColor, 20%) + HoverColor: =RGBA(255, 255, 255, 1) + HoverFill: =RGBA(56, 96, 178, 0.2) + OnSelect: |- + = + UpdateContext( + { + var_RangeDatePicker: true, + var_RangePickerDateRef: DateValue("01/" & Month(Now()) & "/" & Year(Now())), + var_RangeDatePicker_DateStart_Modify : var_RangeDatePicker_DateStart, + var_RangeDatePicker_DateEnd_Modify : var_RangeDatePicker_DateEnd + } + ); + + Select(ico_refreshMonth) + PressedBorderColor: =Self.Fill + PressedColor: =Self.Fill + PressedFill: =Self.Color + Text: ="" + Width: =Parent.Width + - ico_eraser: + Control: Classic/Icon@2.5.0 + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Color: =RGBA(215, 58, 60, 1) + Height: =Parent.Height + HoverFill: =ColorFade( Self.Color,80%) + Icon: =Icon.Erase + OnSelect: =UpdateContext({var_RangeDatePicker_DateStart:Blank(),var_RangeDatePicker_DateEnd:Blank()}) + PaddingBottom: =7 + PaddingLeft: =7 + PaddingRight: =7 + PaddingTop: =7 + Visible: =IsBlank(var_RangeDatePicker_DateStart)=false && IsBlank(var_RangeDatePicker_DateEnd)=false + Width: =Parent.Height +- cont_calendar: + Control: GroupContainer@1.3.0 + Variant: AutoLayout + Group: snippet_dateRangePicker + Properties: + BorderColor: |- + =/* Steve BOURDIN MOCA by ASI Juillet 2025*/ + RGBA(0, 0, 0, 1) + DropShadow: =DropShadow.Semibold + Fill: =RGBA(255, 255, 255, 0.95) + Height: =Self.Width + LayoutDirection: =LayoutDirection.Vertical + Visible: =var_RangeDatePicker=true&&var_RangeDatePicker_SelectMonthYear<>true + Width: =cont_dateInput.Width + X: =300 + Y: =292 + Children: + - cont_monthYear: + Control: GroupContainer@1.3.0 + Variant: AutoLayout + Properties: + DropShadow: =DropShadow.None + FillPortions: =0 + Height: =Parent.Height/10 + LayoutAlignItems: =LayoutAlignItems.Center + LayoutDirection: =LayoutDirection.Horizontal + LayoutJustifyContent: =LayoutJustifyContent.SpaceBetween + Width: =Parent.Width + Children: + - ico_previousMonth: + Control: Classic/Icon@2.5.0 + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Color: =RGBA(0, 18, 107, 1) + Height: =Parent.Height + Icon: =Icon.BackArrow + OnSelect: |- + =UpdateContext( + { + var_RangePickerDateRef: DateAdd( + var_RangePickerDateRef, + -1, + TimeUnit.Months + ) + } + ); + Select(ico_refreshMonth) + PaddingBottom: =7 + PaddingLeft: =7 + PaddingRight: =7 + PaddingTop: =7 + Width: =Parent.Height + - btn_monthyear: + Control: Button@0.0.45 + Properties: + Appearance: ='ButtonCanvas.Appearance'.Outline + BorderThickness: '=0 ' + Height: =Parent.Height-2 + OnSelect: |- + =UpdateContext({var_RangeDatePicker_SelectMonthYear : true}) + Text: =Proper(Text(var_RangePickerDateRef,"mmmm"))&" "&Text(var_RangePickerDateRef,"yyyy") + Width: =Parent.Width-2*ico_previousMonth.Width + - ico_nextMonth: + Control: Classic/Icon@2.5.0 + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Color: =RGBA(0, 18, 107, 1) + Height: =Parent.Height + Icon: =Icon.NextArrow + OnSelect: |- + =UpdateContext( + { + var_RangePickerDateRef: DateAdd( + var_RangePickerDateRef, + 1, + TimeUnit.Months + ) + } + ); + Select(ico_refreshMonth) + PaddingBottom: =7 + PaddingLeft: =7 + PaddingRight: =7 + PaddingTop: =7 + Width: =Parent.Height + - cont_rangePicker: + Control: GroupContainer@1.3.0 + Variant: ManualLayout + Properties: + DropShadow: =DropShadow.None + Children: + - gal_daysOfWeek: + Control: Gallery@2.15.0 + Variant: Horizontal + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Height: =Parent.Height + Items: |- + =AddColumns( + var_RangeDatePickerDayTab, + DateDeb, + DateAdd( + var_RangeDatePicker_dateDebCalend, + pos - 1, + TimeUnit.Days + ) + ) + TemplatePadding: =0 + TemplateSize: =Self.Width/If(Self.AllItemsCount>0,Self.AllItemsCount,1) + Width: =Self.Height + X: =(Parent.Width-Self.Width)/2 + Children: + - lbl_legendDayOfWeek: + Control: Text@0.0.51 + Properties: + Align: ='TextCanvas.Align'.Center + FontColor: =ThisItem.color + Height: =Self.Width + Text: =Proper(Left(Text(ThisItem.DateDeb,"dddd"),3)) + VerticalAlign: =VerticalAlign.Middle + Weight: ='TextCanvas.Weight'.Semibold + Width: =Parent.TemplateWidth + - gal_days: + Control: Gallery@2.15.0 + Variant: Vertical + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Height: =Parent.Height-lbl_legendDayOfWeek.Height + Items: |- + =AddColumns( + [ + ThisItem.DateDeb, + DateAdd( + ThisItem.DateDeb, + 7, + TimeUnit.Days + ), + DateAdd( + ThisItem.DateDeb, + 14, + TimeUnit.Days + ), + DateAdd( + ThisItem.DateDeb, + 21, + TimeUnit.Days + ), + DateAdd( + ThisItem.DateDeb, + 28, + TimeUnit.Days + ), + DateAdd( + ThisItem.DateDeb, + 35, + TimeUnit.Days + ) + ], + color, + ThisItem.color + ) + TemplatePadding: =0 + TemplateSize: =Self.Height/If(Self.AllItemsCount>0,Self.AllItemsCount,1) + Width: =Parent.TemplateWidth + Y: =lbl_legendDayOfWeek.Height + Children: + - lbl_selectedDate: + Control: Label@2.5.1 + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Color: =RGBA(180, 214, 250, 1) + Fill: =RGBA(180, 214, 250, 1) + Font: =Font.'Open Sans' + Height: =Parent.TemplateHeight/2 + OnSelect: =Select(Parent) + Text: ="" + Visible: |- + =(var_RangeDatePicker_DateEnd_Modify = ThisItem.Value || var_RangeDatePicker_DateStart_Modify = ThisItem.Value) || (IsBlank(var_RangeDatePicker_DateEnd_Modify) = false && IsBlank(var_RangeDatePicker_DateStart_Modify) = false) && DateDiff( + var_RangeDatePicker_DateEnd_Modify, + ThisItem.Value, + TimeUnit.Days + ) < 0 && DateDiff( + ThisItem.Value, + var_RangeDatePicker_DateStart_Modify, + TimeUnit.Days + ) < 0 + Width: =Parent.TemplateWidth + X: |- + =If ( + var_RangeDatePicker_DateEnd_Modify = ThisItem.Value, + -1 * Self.Width / 2, + If ( + var_RangeDatePicker_DateStart_Modify = ThisItem.Value, + Self.Width / 2, + 0 + ) + ) + Y: =Parent.TemplateHeight/3 + - btn_date: + Control: Classic/Button@2.2.0 + Properties: + BorderColor: =ColorFade(Self.Fill, -15%) + BorderThickness: =If(var_RangeDatePicker_DateEnd = ThisItem.Value,0,If(var_RangeDatePicker_DateStart = ThisItem.Value||var_RangeDatePicker_DateEnd = ThisItem.Value|| DateDiff(var_RangeDatePicker_DateEnd,ThisItem.Value,TimeUnit.Days)<0 && DateDiff(ThisItem.Value,var_RangeDatePicker_DateStart,TimeUnit.Days)<0,0,3)) + Color: |- + =If( + Month(ThisItem.Value) = Month(var_RangePickerDateRef), + If( + var_RangeDatePicker_DateEnd_Modify = ThisItem.Value || var_RangeDatePicker_DateStart_Modify = ThisItem.Value, + Color.White, + ThisItem.color + ), + Color.LightGray + ) + DisabledBorderColor: =RGBA(166, 166, 166, 1) + Fill: |- + =If( + var_RangeDatePicker_DateEnd_Modify = ThisItem.Value || var_RangeDatePicker_DateStart_Modify = ThisItem.Value, + Color.Blue, + RGBA( + 0, + 0, + 0, + 0 + ) + ) + Font: =Font.'Open Sans' + Height: =If(Self.Fill<>Color.LightBlue&&Self.Fill<>Color.Blue, 2*Parent.TemplateHeight/3,2*Parent.TemplateHeight/3) + HoverBorderColor: =If(Month(ThisItem.Value)=Month(var_RangePickerDateRef), If(var_RangeDatePicker_DateEnd = ThisItem.Value || var_RangeDatePicker_DateStart = ThisItem.Value,Color.Blue,Color.Blue),Color.White) + HoverColor: =Self.Color + HoverFill: =Self.Fill + OnSelect: |- + =If( + IsBlank(var_RangeDatePicker_DateStart_Modify) = false && ThisItem.Value = var_RangeDatePicker_DateStart_Modify, + /*When the user clicks on the previously selected start date, it gets deselected*/ + UpdateContext({var_RangeDatePicker_DateStart_Modify: Blank()}), + If( + IsBlank(var_RangeDatePicker_DateEnd_Modify) = false && ThisItem.Value = var_RangeDatePicker_DateEnd_Modify, + /*When the user clicks on the previously selected end date, it gets deselected*/ + UpdateContext({var_RangeDatePicker_DateEnd_Modify: Blank()}), + If( + IsBlank(var_RangeDatePicker_DateStart_Modify), + UpdateContext({var_RangeDatePicker_DateStart_Modify: ThisItem.Value}), + If ( + IsBlank(var_RangeDatePicker_DateEnd_Modify), + UpdateContext({var_RangeDatePicker_DateEnd_Modify: ThisItem.Value}), + UpdateContext( + { + var_RangeDatePickerDiffDeb: DateDiff( + var_RangeDatePicker_DateStart_Modify, + ThisItem.Value + ) + } + ); + UpdateContext( + { + var_RangeDatePickerDiffFin: DateDiff( + ThisItem.Value, + var_RangeDatePicker_DateEnd_Modify + ) + } + ); + If( + var_RangeDatePickerDiffDeb < 0 || var_RangeDatePickerDiffDeb > 0 && var_RangeDatePickerDiffDeb < var_RangeDatePickerDiffFin, + UpdateContext({var_RangeDatePicker_DateStart_Modify: ThisItem.Value}), + UpdateContext({var_RangeDatePicker_DateEnd_Modify: ThisItem.Value}) + ) + ); + If( + DateDiff( + var_RangeDatePicker_DateEnd_Modify, + var_RangeDatePicker_DateStart_Modify, + TimeUnit.Days + ) > 0, + UpdateContext( + { + var_RangeDatePickerDateTmp: var_RangeDatePicker_DateStart_Modify, + var_RangeDatePicker_DateEnd_Modify: var_RangeDatePicker_DateStart_Modify, + var_RangeDatePicker_DateStart_Modify: var_RangeDatePicker_DateEnd_Modify + } + ) + ) + ) + ) + ) + PaddingBottom: =0 + PaddingLeft: =0 + PaddingRight: =0 + PaddingTop: =0 + PressedBorderColor: =Self.Fill + PressedColor: =Self.Fill + PressedFill: =Self.Color + RadiusBottomLeft: =90 + RadiusBottomRight: =90 + RadiusTopLeft: =90 + RadiusTopRight: =90 + Size: =10 + Text: =Day(ThisItem.Value) + Width: =Self.Height + X: =Self.Width/6 + Y: =If(Self.Fill<>Color.LightBlue&&Self.Fill<>Color.Blue, Parent.TemplateHeight/4,Parent.TemplateHeight/4) + - cont_buttons: + Control: GroupContainer@1.3.0 + Variant: AutoLayout + Properties: + DropShadow: =DropShadow.None + FillPortions: =0 + Height: =cont_monthYear.Height + LayoutAlignItems: =LayoutAlignItems.Center + LayoutDirection: =LayoutDirection.Horizontal + LayoutGap: =btn_cancel.Width + LayoutJustifyContent: =LayoutJustifyContent.Center + Width: =Parent.Width + Children: + - btn_cancel: + Control: Button@0.0.45 + Properties: + BasePaletteColor: =RGBA(249, 83, 109, 1) + Height: =2*Parent.Height/3 + OnSelect: =UpdateContext({var_RangeDatePicker:false}) + Text: ="Cancel" + - btn_validate: + Control: Button@0.0.45 + Properties: + BasePaletteColor: =RGBA(141, 229, 250, 1) + Height: =btn_cancel.Height + OnSelect: |- + =UpdateContext( + { + var_RangeDatePicker_DateStart: var_RangeDatePicker_DateStart_Modify, + var_RangeDatePicker_DateEnd: var_RangeDatePicker_DateEnd_Modify, + var_RangeDatePicker:false + } + ) + Text: ="OK" + - ico_refreshMonth: + Control: Classic/Icon@2.5.0 + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Color: =RGBA(0, 18, 107, 1) + Height: =28 + Icon: =Icon.Reload + OnSelect: | + =UpdateContext({var_RangeDatePickerChargement: true}); + If( + Weekday(var_RangePickerDateRef) > First(var_RangeDatePickerDayTab).no, + UpdateContext( + { + var_RangeDatePicker_dateDebCalend: DateAdd( + var_RangePickerDateRef, + (Weekday(var_RangePickerDateRef) - First(var_RangeDatePickerDayTab).no)*-1, + TimeUnit.Days + ) + } + ), + If( + Weekday(var_RangePickerDateRef) = First(var_RangeDatePickerDayTab).no, + UpdateContext({var_RangeDatePicker_dateDebCalend: var_RangePickerDateRef}), + UpdateContext( + { + var_RangeDatePicker_dateDebCalend: DateAdd( + var_RangePickerDateRef, + (Weekday(var_RangePickerDateRef)+7 - First(var_RangeDatePickerDayTab).no)*-1, + TimeUnit.Days + ) + } + ) + ) + ); + UpdateContext({var_RangeDatePickerChargement: false}); + PaddingBottom: =7 + PaddingLeft: =7 + PaddingRight: =7 + PaddingTop: =7 + Visible: =false + Width: =32 + X: =61 + Y: =5 +- cont_modifMonthYears: + Control: GroupContainer@1.3.0 + Variant: AutoLayout + Group: snippet_dateRangePicker + Properties: + BorderColor: |- + =/* Steve BOURDIN MOCA by ASI Juillet 2025*/ + RGBA(0, 0, 0, 1) + Fill: =RGBA(255, 255, 255, 0.95) + Height: =cont_calendar.Height + LayoutAlignItems: =LayoutAlignItems.Stretch + LayoutDirection: =LayoutDirection.Horizontal + Visible: =var_RangeDatePicker_SelectMonthYear=true + Width: =cont_calendar.Width + X: =300 + Y: =cont_calendar.Y + Children: + - gal_changeMonth: + Control: Gallery@2.15.0 + Variant: Vertical + Properties: + AlignInContainer: =AlignInContainer.SetByContainer + BorderColor: =RGBA(0, 18, 107, 1) + Height: =Parent.Height + Items: |- + =/*This functionality enables month names to appear in the user's language setting.*/ + AddColumns( + Sequence(12), + colMonth, + DateTimeValue( + "01/" & Value & "/" & Year(var_RangePickerDateRef), + "fr" + ) + ) + LayoutMinWidth: =Parent.Width/3 + TemplateSize: =Self.Height/12 - Self.TemplatePadding -1 + Width: =Parent.Width/2 + Children: + - btn_month: + Control: Button@0.0.45 + Properties: + BasePaletteColor: =RGBA(141, 229, 250, 1) + Height: =Parent.TemplateHeight + OnSelect: |- + =UpdateContext( + { + var_RangePickerDateRef: ThisItem.colMonth + } + ); + Select(ico_refreshMonth); + UpdateContext({var_RangeDatePicker_SelectMonthYear : false}) + Text: =Proper(Text(ThisItem.colMonth,"mmmm")) + Width: =Parent.Width-2*Parent.TemplatePadding + - gal_changeYear: + Control: Gallery@2.15.0 + Variant: Horizontal + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Default: =LookUp(tabYear,colYear=Year(var_RangePickerDateRef)+10) + Items: =tabYear + LayoutMinWidth: =2*Parent.Width/3 + TabIndex: =20 + TemplateSize: =Self.Width/3-Self.TemplatePadding + WrapCount: =10 + Children: + - btn_year: + Control: Button@0.0.45 + Properties: + Appearance: ='ButtonCanvas.Appearance'.Secondary + BasePaletteColor: =RGBA(5, 102, 178, 1) + FontColor: =If(Year(var_RangePickerDateRef) = ThisItem.colYear,Color.Red) + Height: =Parent.TemplateHeight-Parent.TemplatePadding + IconStyle: ='ButtonCanvas.IconStyle'.Outline + OnSelect: |- + =UpdateContext( + { + var_RangePickerDateRef: DateValue("01/"&Month(var_RangePickerDateRef)&"/"& ThisItem.colYear,"fr") + } + ); + Select(ico_refreshMonth); + UpdateContext({var_RangeDatePicker_SelectMonthYear : false}) + Text: =ThisItem.colYear + Width: =Parent.TemplateWidth-2 + Y: = From 74a4bbd419041ce5b2ed8bf412bad890bdcf38c6 Mon Sep 17 00:00:00 2001 From: Steve BOURDIN Date: Wed, 9 Jul 2025 12:05:32 +0000 Subject: [PATCH 2/4] modif date --- power-apps/date-range-picker/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/power-apps/date-range-picker/README.md b/power-apps/date-range-picker/README.md index e21c9cc..be8961b 100644 --- a/power-apps/date-range-picker/README.md +++ b/power-apps/date-range-picker/README.md @@ -28,4 +28,4 @@ Steve Bourdin | [GitHub](https://github.com/SteveBourdin) ([LinkedIn](https://ww **THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.** - + From 669cd5c52070e6c563883f3ee4816a7e9f7eabb4 Mon Sep 17 00:00:00 2001 From: Steve BOURDIN Date: Wed, 9 Jul 2025 12:08:26 +0000 Subject: [PATCH 3/4] change url --- power-apps/date-range-picker/assets/sample.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/power-apps/date-range-picker/assets/sample.json b/power-apps/date-range-picker/assets/sample.json index b1fd620..14d2b55 100644 --- a/power-apps/date-range-picker/assets/sample.json +++ b/power-apps/date-range-picker/assets/sample.json @@ -36,7 +36,7 @@ { "type": "image", "order": 100, - "url": "https://raw.githubusercontent.com/pnp/powerplatform-snippets/main/power-apps/date-range-picker/assets/date-range-picker.png", + "url": "https://github.com/pnp/powerplatform-snippets/blob/689a8bc21677a45e33c7e7990e52849cf7048cf6/power-apps/date-range-picker/assets/date-range-picker.png", "alt": "Preview PNG" } ], From ac8487d751a8d099e0694859c424b83b939a8fd6 Mon Sep 17 00:00:00 2001 From: Daniel Laskewitz Date: Sun, 13 Jul 2025 14:06:23 +0200 Subject: [PATCH 4/4] Update README.md --- power-apps/date-range-picker/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/power-apps/date-range-picker/README.md b/power-apps/date-range-picker/README.md index be8961b..f68499b 100644 --- a/power-apps/date-range-picker/README.md +++ b/power-apps/date-range-picker/README.md @@ -16,7 +16,7 @@ Steve Bourdin | [GitHub](https://github.com/SteveBourdin) ([LinkedIn](https://ww 1. Open your canvas app in **Power Apps** 2. Copy the contents of the **[YAML-file](./source/date-range-picker.yaml)** -3. Click on the three dots of the screen where you want to add the snippet and select "Paste code" +3. Click on the three dots of the screen where you want to add the snippet and select "Paste"