diff --git a/power-apps/power-christmas/README.md b/power-apps/power-christmas/README.md new file mode 100644 index 0000000..29b7342 --- /dev/null +++ b/power-apps/power-christmas/README.md @@ -0,0 +1,39 @@ +# Power Christmass + +🎄 PowerApps Advent Calendar Component 🎄 +Discover the magic of learning with my brand‑new PowerApps Advent Calendar! +This custom component brings festive spirit into your apps while delivering 24 exclusive tips and tricks dedicated entirely to PowerApps. +Each day unlocks a new insight—ranging from clever design hacks and productivity boosters to advanced techniques that empower makers and delight users. Whether you’re a beginner or an experienced developer, the calendar offers a playful yet practical way to expand your skills step by step. +✨ Highlights: +- Interactive calendar design with daily surprises +- 24 pedagogical tips crafted for PowerApps enthusiasts +- Perfect for communities, workshops, and self‑learning journeys +- A creative blend of fun and functionality +Bring joy, knowledge, and innovation together in one engaging component. With the PowerApps Advent Calendar, every day is a chance to learn something new and celebrate the power of low‑code! + + +![power-christmass](./assets/power-christmass.gif) + + +## 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/power-christmass.yaml)** +3. Paste the code on a blank screen + + +## Code + **[YAML-file](./source/power-christmass.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/power-christmas/assets/power-christmas.gif b/power-apps/power-christmas/assets/power-christmas.gif new file mode 100644 index 0000000..143813f Binary files /dev/null and b/power-apps/power-christmas/assets/power-christmas.gif differ diff --git a/power-apps/power-christmas/assets/power-christmas.png b/power-apps/power-christmas/assets/power-christmas.png new file mode 100644 index 0000000..4477b1d Binary files /dev/null and b/power-apps/power-christmas/assets/power-christmas.png differ diff --git a/power-apps/power-christmas/assets/sample.json b/power-apps/power-christmas/assets/sample.json new file mode 100644 index 0000000..ac248e8 --- /dev/null +++ b/power-apps/power-christmas/assets/sample.json @@ -0,0 +1,52 @@ +[ + { + "$schema": "https://developer.microsoft.com/en-us/json-schemas/pnp/samples/v1.0/metadata-schema.json", + "name": "pnp-powerplatform-snippets-power-christmass", + "version": "1.0.0.0", + "source": "pnp", + "creationDateTime": "2025-04-29T00:00:00.000Z", + "updateDateTime": "2025-04-29T00:00:00.000Z", + "title": "Keyboard", + "shortDescription": "A festive custom component with 24 daily tips to boost your PowerApps skills—fun, practical, and inspiring!", + "longDescription": [ + "A festive custom component with 24 daily tips to boost your PowerApps skills—fun, practical, and inspiring!" + ], + "url": "https://github.com/pnp/powerplatform-snippets/tree/main/power-apps/power-christmass/", + "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://github.com/pnp/powerplatform-snippets/blob/6c4509330c0af3b99357cac99d6a64255ac51a3d/power-apps/power-christmas/assets/power-christmas.gif", + "alt": "Preview PNG" + } + ], + "authors": [ + { + "gitHubAccount": "SteveBourdin", + "name": "Steve Bourdin", + "pictureUrl": "https://github.com/SteveBourdin.png" + } + ] + } + +] diff --git a/power-apps/power-christmas/source/power-christmas.yaml b/power-apps/power-christmas/source/power-christmas.yaml new file mode 100644 index 0000000..14af114 --- /dev/null +++ b/power-apps/power-christmas/source/power-christmas.yaml @@ -0,0 +1,424 @@ +- ctrl_alt_christmas: + Control: GroupContainer@1.3.0 + Variant: ManualLayout + Properties: + DropShadow: =DropShadow.None + Height: =Parent.Height + Width: =Parent.Width + Children: + - aud_chrsitmas_song: + Control: Audio@2.3.1 + Properties: + AutoStart: =varPlayMusic=true + BorderColor: =RGBA(0, 18, 107, 1) + Fill: =RGBA(56, 96, 178, 1) + Media: |- + ="https://files.breakingcopyright.com/song/" & Switch( + varJour, + 1, + "silverman-sound-studios-christmas-spirit.mp3", + 2, + "batchbug-snowflake.mp3", + 3, + "myuu-santas-tricks.mp3", + 4, + "audionautix-we-wish-you-a-merry-christmas.mp3", + 5, + "alexander-nakarada-jingle-bells.mp3", + 6, + "a-himitsu-fragile.mp3", + 7, + "scott-buckley-filaments.mp3", + 8, + "scott-buckley-childhood.mp3", + 9, + "twisterium-eternal-love.mp3", + 10, + "jonny-easton-purpose.mp3", + 11, + "scott-buckley-jul.mp3", + 12, + "scott-buckley-frankincense-and-myrrh.mp3", + 13, + "roa-together.mp3", + 14, + "scott-buckley-midvinter.mp3", + 15, + "alex-productions-christmas-is-coming.mp3", + 16, + "alex-productions-merry-christmas.mp3", + 17, + "keys-of-moon-winter-joy.mp3", + 18, + "alex-productions-christmas-time.mp3", + 19, + "alex-productions-christmas-countdown.mp3", + 20, + "keys-of-moon-make-a-wish.mp3", + 21, + "alexander-nakarada-good-times.mp3", + 22, + "alexander-nakarada-good-times.mp3", + 23, + "silverman-sound-studios-christmas-spirit.mp3", + 24, + "audionautix-we-wish-you-a-merry-christmas.mp3" + ) + OnEnd: =UpdateContext({varOpenCase:0}) + Start: =varPlayMusic=true + X: =80 + Y: =80 + - img_fond: + Control: Image@2.2.3 + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Height: =Parent.Height + Image: ="https://m.media-amazon.com/images/I/819P5l0VdyL._AC_UF1000,1000_QL80_.jpg" + ImagePosition: =ImagePosition.Fill + Width: =Parent.Width + - img_snow: + Control: Image@2.2.3 + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Height: =768 + Image: "=\"data:image/svg+xml;utf8,\" & EncodeUrl(\n\"\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\")" + OnSelect: |- + =UpdateContext({varPlayMusic: Not varPlayMusic}) + Width: =1366 + - cont_calend: + Control: GroupContainer@1.3.0 + Variant: AutoLayout + Properties: + DropShadow: =DropShadow.None + Height: =Parent.Height + LayoutAlignItems: =LayoutAlignItems.Center + LayoutDirection: =LayoutDirection.Vertical + PaddingBottom: =20 + PaddingLeft: =20 + PaddingRight: =20 + PaddingTop: =20 + Width: =Parent.Width + Children: + - cont_header: + Control: GroupContainer@1.3.0 + Variant: ManualLayout + Properties: + AlignInContainer: =AlignInContainer.Center + DropShadow: =DropShadow.ExtraBold + Fill: =RGBA(0, 18, 107, 0.7) + FillPortions: =0 + Height: =Parent.Height/10 + LayoutMaxHeight: =0 + LayoutMaxWidth: =0 + LayoutMinHeight: =16 + LayoutMinWidth: =16 + RadiusBottomLeft: =20 + RadiusBottomRight: =20 + RadiusTopLeft: =20 + RadiusTopRight: =20 + Width: =Parent.Width/2 + X: =(Parent.Width-Self.Width)/2 + Children: + - img_titre: + Control: Image@2.2.3 + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Height: =77 + Image: "=\"data:image/svg+xml;utf8,\" & \r\nEncodeUrl(\r\n \"\r\n \r\n \r\n \r\n \r\n Power Christmas \"&Year(Now())&\"\r\n \r\n\"\r\n)" + OnSelect: |- + =UpdateContext({varPlayMusic: Not varPlayMusic}) + Width: =683 + - cont_body: + Control: GroupContainer@1.3.0 + Variant: ManualLayout + Properties: + AlignInContainer: =AlignInContainer.Center + LayoutMaxHeight: =0 + LayoutMaxWidth: =0 + LayoutMinHeight: =16 + LayoutMinWidth: =16 + PaddingBottom: =100 + PaddingLeft: =100 + PaddingRight: =100 + PaddingTop: =100 + Width: =Parent.Width + Children: + - gal_calendrier: + Control: Gallery@2.15.0 + Variant: BrowseLayout_Horizontal_TwoTextOneImageVariant_ver5.0 + Properties: + BorderColor: =RGBA(200,16,46,0.5) + BorderThickness: =5 + Fill: =RGBA(255, 255, 255, 0.8) + Height: =Parent.Height-Parent.PaddingTop-Parent.PaddingBottom + Items: =AddColumns(Shuffle( Sequence(24)),couleurFond,Switch(RandBetween(1,6),1,RGBA(200,16,46,0.8),2,RGBA(0,100,0,0.8),3,RGBA(255,215,0,0.8),4,RGBA(192,192,192,0.8),5,RGBA(25,25,112,0.8),6,RGBA(128,0,32,0.8))) + ShowScrollbar: =false + TemplatePadding: =20 + TemplateSize: =Parent.Width/6 -3*Self.TemplatePadding + Width: =Parent.Width-Parent.PaddingLeft-Parent.PaddingRight + WrapCount: =4 + X: =Parent.PaddingLeft + Y: =Parent.PaddingTop + Children: + - txt_day: + Control: Text@0.0.51 + Properties: + BorderColor: =RGBA(120,72,40,0.2) + BorderRadius: =20 + BorderStyle: =BorderStyle.Solid + BorderThickness: =4 + Fill: =ThisItem.couleurFond + Height: =Parent.TemplateHeight + Text: ="" + Width: =Parent.TemplateWidth + - img_calendrier: + Control: Image@2.2.3 + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Height: =Parent.TemplateHeight + Image: "=\"data:image/svg+xml;utf8,\" & \r\nEncodeUrl(\r\n \"\r\n \r\n \r\n \r\n \r\n \"&ThisItem.Value&\"\r\n \r\n\"\r\n)" + OnSelect: "=If(\n varShowBestPractice <> true,\n UpdateContext({varPlayMusic: false});\n \n UpdateContext({varPlayMusic: true});\n\n ClearCollect(\n colText,\n AddColumns(\n Filter(\n colBestPractices,\n ID = ThisItem.Value\n ),\n Value,\n If(\n lst_lang.Selected.Value = \"fr\",\n fr,\n en\n )\n )\n );\n UpdateContext({varLancementTexteDyn: true});\n UpdateContext({varBeginText: false});\n UpdateContext({varJour: ThisItem.Value});\n UpdateContext({varShowBestPractice: true})\n)" + Width: =Parent.TemplateWidth + - font_base64: + Control: Text@0.0.51 + Properties: + Text: ="data:application/font-woff;base64,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" + Visible: =false + X: =40 + Y: =40 + - tim_init_best_practice: + 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%) + Duration: =5000 + Fill: =RGBA(56, 96, 178, 1) + Font: =Font.'Open Sans' + HoverBorderColor: =ColorFade(Self.BorderColor, 20%) + HoverColor: =RGBA(255, 255, 255, 1) + HoverFill: =ColorFade(RGBA(56, 96, 178, 1), -20%) + OnTimerEnd: = + OnTimerStart: "=UpdateContext({varPlayMusic : false});\r\n\r\n\r\nClearCollect(\r\n colBestPractices,\r\n [\r\n {\r\n ID: 1,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"⚡ Optimiser les chargements avec Concurrent()\",\r\n en: \"⚡ Optimize loading with Concurrent()\"\r\n },\r\n {\r\n ID: 1,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Utilisez la fonction Concurrent() pour optimiser le chargement des données et réduire les temps d’attente.\r\nElle permet de lancer plusieurs actions en même temps, ce qui rend l’application plus fluide et agréable pour l’utilisateur.\",\r\n en: \"\U0001F680 Tip: Use the Concurrent() function to optimize data loading and reduce waiting times.\r\nIt allows multiple actions to run simultaneously, making the app smoother and more enjoyable for the user.\"\r\n },\r\n {\r\n ID: 1,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Concurrent() exécute plusieurs formules en parallèle au lieu de les traiter séquentiellement.\r\nCela évite que l’application reste bloquée sur une seule requête et améliore considérablement la performance globale.\",\r\n en: \"⚡ Concurrent() runs multiple formulas in parallel instead of processing them sequentially.\r\nThis prevents the app from being stuck on a single request and significantly improves overall performance.\"\r\n },\r\n {\r\n ID: 1,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"Concurrent(\r\n ClearCollect(colClients; '[dbo].[Clients]');\r\n ClearCollect(colCommandes; '[dbo].[Commandes]');\r\n ClearCollect(colProduits; '[dbo].[Produits]')\r\n)\",\r\n en: \"Concurrent(\r\n ClearCollect(colCustomers, '[dbo].[Customers]');\r\n ClearCollect(colOrders, '[dbo].[Orders]');\r\n ClearCollect(colProducts, '[dbo].[Products]')\r\n)\"\r\n },\r\n {\r\n ID: 1,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, trois collections (Clients, Commandes et Produits) sont chargées simultanément.\r\nRésultat : l’ouverture de l’application est plus rapide et l’utilisateur accède immédiatement aux données essentielles.\",\r\n en: \"\U0001F4C2 In this example, three collections (Customers, Orders, and Products) are loaded simultaneously.\r\nResult: the app opens faster and the user immediately accesses essential data.\"\r\n },\r\n {\r\n ID: 1,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 Cette approche est particulièrement utile lorsque vous devez charger plusieurs sources de données au démarrage.\r\nElle réduit la frustration des utilisateurs et donne une impression de réactivité professionnelle.\",\r\n en: \"\U0001F4A1 This approach is especially useful when you need to load multiple data sources at startup.\r\nIt reduces user frustration and gives a professional impression of responsiveness.\"\r\n },\r\n \r\n {\r\n ID: 2,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F4DD Mettre à jour vos données avec Patch()\",\r\n en: \"\U0001F4DD Update your data with Patch()\"\r\n },\r\n {\r\n ID: 2,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Utilisez la fonction Patch() pour créer ou modifier des enregistrements directement dans votre source de données.\r\nC’est une alternative efficace à SubmitForm, qui offre plus de flexibilité et de contrôle.\",\r\n en: \"\U0001F680 Tip: Use the Patch() function to create or modify records directly in your data source.\r\nIt’s an efficient alternative to SubmitForm, offering more flexibility and control.\"\r\n },\r\n {\r\n ID: 2,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Patch() est particulièrement utile lorsque vous souhaitez mettre à jour un seul champ sans affecter les autres,\r\nou lorsque vous devez insérer des données sans passer par un formulaire complet.\",\r\n en: \"⚡ Patch() is especially useful when you want to update a single field without affecting others,\r\nor when you need to insert data without going through a full form.\"\r\n },\r\n {\r\n ID: 2,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"Patch(\r\n '[dbo].[Clients]',\r\n LookUp('[dbo].[Clients]'; ID = 1),\r\n { Nom: \"\"Dupont\"\"; Ville: \"\"Paris\"\" }\r\n)\",\r\n en: \"Patch(\r\n '[dbo].[Customers]',\r\n LookUp('[dbo].[Customers]', ID = 1),\r\n { Name: \"\"Smith\"\", City: \"\"London\"\" }\r\n)\"\r\n },\r\n {\r\n ID: 2,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, l’enregistrement du client avec l’ID 1 est mis à jour.\r\nSeuls les champs Nom et Ville sont modifiés, les autres restent inchangés.\",\r\n en: \"\U0001F4C2 In this example, the customer record with ID 1 is updated.\r\nOnly the Name and City fields are modified, while the others remain unchanged.\"\r\n },\r\n {\r\n ID: 2,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 Patch() est une fonction incontournable pour gérer les mises à jour ciblées,\r\net elle permet de gagner du temps tout en évitant les erreurs liées aux formulaires complets.\",\r\n en: \"\U0001F4A1 Patch() is an essential function for handling targeted updates,\r\nsaving time while avoiding errors related to full forms.\"\r\n },\r\n{\r\n ID: 3,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F50E Simplifier le code avec With()\",\r\n en: \"\U0001F50E Simplify code with With()\"\r\n },\r\n {\r\n ID: 3,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Utilisez la fonction With() pour définir une valeur temporaire et la réutiliser dans votre formule.\r\nCela permet d’éviter les répétitions et rend le code plus clair et plus facile à maintenir.\",\r\n en: \"\U0001F680 Tip: Use the With() function to define a temporary value and reuse it in your formula.\r\nThis avoids repetition and makes the code clearer and easier to maintain.\"\r\n },\r\n {\r\n ID: 3,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Grâce à With(), vous pouvez calculer une valeur une seule fois et l’utiliser plusieurs fois dans la même formule,\r\nau lieu de recalculer ou de réécrire la même expression.\",\r\n en: \"⚡ With() lets you calculate a value once and use it multiple times in the same formula,\r\ninstead of recalculating or rewriting the same expression.\"\r\n },\r\n {\r\n ID: 3,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"With(\r\n { prixTotal: Quantite * PrixUnitaire },\r\n If(prixTotal > 100; \"\"Commande importante\"\"; \"\"Commande standard\"\")\r\n)\",\r\n en: \"With(\r\n { totalPrice: Quantity * UnitPrice },\r\n If(totalPrice > 100, \"\"Large order\"\", \"\"Standard order\"\")\r\n)\"\r\n },\r\n {\r\n ID: 3,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, la valeur prixTotal est calculée une seule fois.\r\nElle est ensuite réutilisée dans la condition If(), ce qui rend la formule plus lisible.\",\r\n en: \"\U0001F4C2 In this example, the value totalPrice is calculated once.\r\nIt is then reused in the If() condition, making the formula more readable.\"\r\n },\r\n {\r\n ID: 3,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 L’utilisation de With() améliore la performance et la clarté du code,\r\ntout en réduisant les risques d’erreurs lors des modifications futures.\",\r\n en: \"\U0001F4A1 Using With() improves performance and code clarity,\r\nwhile reducing the risk of errors during future updates.\"\r\n },\r\n {\r\n ID: 4,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F3F7️ Bien nommer vos variables et contrôles\",\r\n en: \"\U0001F3F7️ Name your variables and controls properly\"\r\n },\r\n {\r\n ID: 4,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Donnez des noms explicites à vos variables et contrôles pour faciliter la maintenance et la compréhension du code.\r\nUn bon nommage permet à toute l’équipe de savoir rapidement à quoi sert chaque élément.\",\r\n en: \"\U0001F680 Tip: Give explicit names to your variables and controls to make maintenance and code understanding easier.\r\nGood naming helps the whole team quickly know what each element is used for.\"\r\n },\r\n {\r\n ID: 4,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Évitez les noms par défaut comme TextInput1 ou Button2.\r\nPrivilégiez des noms descriptifs comme txtNom ou btnValider, qui indiquent clairement la fonction du contrôle.\",\r\n en: \"⚡ Avoid default names like TextInput1 or Button2.\r\nPrefer descriptive names like txtName or btnSubmit, which clearly indicate the control’s purpose.\"\r\n },\r\n {\r\n ID: 4,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"Set(varUtilisateur; User().FullName)\",\r\n en: \"Set(varUser, User().FullName)\"\r\n },\r\n {\r\n ID: 4,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, la variable varUtilisateur stocke le nom complet de l’utilisateur.\r\nLe nom choisi reflète directement son contenu, ce qui rend le code plus lisible.\",\r\n en: \"\U0001F4C2 In this example, the variable varUser stores the user’s full name.\r\nThe chosen name directly reflects its content, making the code more readable.\"\r\n },\r\n {\r\n ID: 4,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 Un bon nommage réduit les erreurs lors des évolutions futures et facilite la collaboration entre développeurs.\r\nC’est une pratique simple mais essentielle pour des applications robustes.\",\r\n en: \"\U0001F4A1 Good naming reduces errors during future updates and makes collaboration between developers easier.\r\nIt’s a simple but essential practice for building robust applications.\"\r\n },\r\n\r\n\r\n {\r\n ID: 5,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F4E6 Gérer des données locales avec ClearCollect()\",\r\n en: \"\U0001F4E6 Manage local data with ClearCollect()\"\r\n },\r\n {\r\n ID: 5,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Utilisez ClearCollect() pour stocker temporairement des données dans une collection locale.\r\nCela permet de manipuler les données sans solliciter en permanence la source externe.\",\r\n en: \"\U0001F680 Tip: Use ClearCollect() to temporarily store data in a local collection.\r\nThis allows you to manipulate data without constantly querying the external source.\"\r\n },\r\n {\r\n ID: 5,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Les collections sont idéales pour améliorer la performance et réduire les temps de chargement,\r\ncar elles évitent les appels répétés à la base de données ou aux services connectés.\",\r\n en: \"⚡ Collections are ideal for improving performance and reducing loading times,\r\nas they prevent repeated calls to the database or connected services.\"\r\n },\r\n {\r\n ID: 5,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"ClearCollect(\r\n colProduits;\r\n '[dbo].[Produits]'\r\n)\",\r\n en: \"ClearCollect(\r\n colProducts,\r\n '[dbo].[Products]'\r\n)\"\r\n },\r\n {\r\n ID: 5,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, la collection colProduits contient les données de la table Produits.\r\nVous pouvez ensuite utiliser colProduits pour afficher ou manipuler les données localement.\",\r\n en: \"\U0001F4C2 In this example, the colProducts collection contains data from the Products table.\r\nYou can then use colProducts to display or manipulate the data locally.\"\r\n },\r\n {\r\n ID: 5,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 Les collections sont très pratiques pour gérer des scénarios hors ligne,\r\nou pour préparer des données avant de les envoyer vers une source externe.\",\r\n en: \"\U0001F4A1 Collections are very useful for handling offline scenarios,\r\nor for preparing data before sending it to an external source.\"\r\n },\r\n{\r\n ID: 6,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F39B️ Gérer l’état de l’application avec UpdateContext()\",\r\n en: \"\U0001F39B️ Manage app state with UpdateContext()\"\r\n },\r\n {\r\n ID: 6,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Utilisez UpdateContext() pour créer des variables locales à l’écran.\r\nCes variables sont parfaites pour gérer l’état d’un bouton, d’un formulaire ou d’un composant sans impacter toute l’application.\",\r\n en: \"\U0001F680 Tip: Use UpdateContext() to create local screen variables.\r\nThese variables are perfect for managing the state of a button, form, or component without affecting the entire app.\"\r\n },\r\n {\r\n ID: 6,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Contrairement aux variables globales (Set), les variables contextuelles sont limitées à l’écran où elles sont définies.\r\nCela évite les conflits et rend le code plus simple à maintenir.\",\r\n en: \"⚡ Unlike global variables (Set), context variables are limited to the screen where they are defined.\r\nThis prevents conflicts and makes the code easier to maintain.\"\r\n },\r\n {\r\n ID: 6,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"UpdateContext({ isVisible: true })\",\r\n en: \"UpdateContext({ isVisible: true })\"\r\n },\r\n {\r\n ID: 6,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, la variable isVisible est définie à true.\r\nElle peut ensuite être utilisée pour afficher ou masquer un contrôle sur l’écran.\",\r\n en: \"\U0001F4C2 In this example, the variable isVisible is set to true.\r\nIt can then be used to show or hide a control on the screen.\"\r\n },\r\n {\r\n ID: 6,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 Les variables contextuelles sont idéales pour gérer des interactions locales,\r\ncomme l’ouverture d’un pop-up ou le suivi d’un état temporaire.\",\r\n en: \"\U0001F4A1 Context variables are ideal for handling local interactions,\r\nsuch as opening a pop-up or tracking a temporary state.\"\r\n },\r\n {\r\n ID: 7,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F4F1 Rendre votre application responsive avec Width et Height\",\r\n en: \"\U0001F4F1 Make your app responsive with Width and Height\"\r\n },\r\n {\r\n ID: 7,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Utilisez les propriétés App.Width et App.Height pour adapter vos contrôles en fonction de la taille de l’écran.\r\nCela permet de créer des applications qui s’affichent correctement sur mobile, tablette et ordinateur.\",\r\n en: \"\U0001F680 Tip: Use the App.Width and App.Height properties to adapt your controls based on screen size.\r\nThis allows you to build apps that display correctly on mobile, tablet, and desktop.\"\r\n },\r\n {\r\n ID: 7,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ En testant la largeur et la hauteur de l’application, vous pouvez définir des comportements conditionnels.\r\nPar exemple, afficher un menu compact sur mobile et un menu complet sur ordinateur.\",\r\n en: \"⚡ By testing the app’s width and height, you can define conditional behaviors.\r\nFor example, show a compact menu on mobile and a full menu on desktop.\"\r\n },\r\n {\r\n ID: 7,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"If(\r\n App.Width < 600;\r\n \"\"Mode Mobile\"\";\r\n \"\"Mode Bureau\"\"\r\n)\",\r\n en: \"If(\r\n App.Width < 600,\r\n \"\"Mobile Mode\"\",\r\n \"\"Desktop Mode\"\"\r\n)\"\r\n },\r\n {\r\n ID: 7,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, si la largeur de l’application est inférieure à 600 pixels,\r\nle mode Mobile est activé, sinon c’est le mode Bureau.\",\r\n en: \"\U0001F4C2 In this example, if the app’s width is less than 600 pixels,\r\nMobile Mode is activated, otherwise Desktop Mode is used.\"\r\n },\r\n {\r\n ID: 7,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 Cette approche permet de concevoir des interfaces adaptatives,\r\net garantit une meilleure expérience utilisateur quel que soit l’appareil utilisé.\",\r\n en: \"\U0001F4A1 This approach allows you to design adaptive interfaces,\r\nensuring a better user experience regardless of the device used.\"\r\n },\r\n{\r\n ID: 8,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F3A8 Optimiser la présentation avec LayoutGap, Padding et Radius\",\r\n en: \"\U0001F3A8 Optimize presentation with LayoutGap, Padding and Radius\"\r\n },\r\n {\r\n ID: 8,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Utilisez les attributs LayoutGap, Padding et Radius pour améliorer l’esthétique et la lisibilité de vos applications.\r\nCes propriétés permettent de créer des interfaces plus harmonieuses et professionnelles.\",\r\n en: \"\U0001F680 Tip: Use the LayoutGap, Padding, and Radius attributes to improve the aesthetics and readability of your apps.\r\nThese properties help create more harmonious and professional interfaces.\"\r\n },\r\n {\r\n ID: 8,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ LayoutGap définit l’espace entre les contrôles dans un conteneur.\r\nPadding ajoute de l’espace interne autour du contenu.\r\nRadius arrondit les coins pour un rendu plus moderne et agréable.\",\r\n en: \"⚡ LayoutGap defines the spacing between controls in a container.\r\nPadding adds internal space around the content.\r\nRadius rounds the corners for a more modern and pleasant look.\"\r\n },\r\n {\r\n ID: 8,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"Container.LayoutGap = 10\r\nContainer.Padding = 20\r\nButton.Radius = 8\",\r\n en: \"Container.LayoutGap = 10\r\nContainer.Padding = 20\r\nButton.Radius = 8\"\r\n },\r\n {\r\n ID: 8,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, les contrôles d’un conteneur sont espacés de 10 pixels,\r\nle contenu bénéficie d’un padding de 20 pixels, et le bouton a des coins arrondis de 8 pixels.\",\r\n en: \"\U0001F4C2 In this example, the controls in a container are spaced 10 pixels apart,\r\nthe content has 20 pixels of padding, and the button has rounded corners of 8 pixels.\"\r\n },\r\n {\r\n ID: 8,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 L’utilisation combinée de LayoutGap, Padding et Radius donne une impression de cohérence visuelle,\r\net améliore l’expérience utilisateur en rendant l’application plus agréable à parcourir.\",\r\n en: \"\U0001F4A1 Using LayoutGap, Padding, and Radius together creates a sense of visual consistency,\r\nand improves user experience by making the app more pleasant to navigate.\"\r\n },\r\n{\r\n ID: 9,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F3A8 Personnaliser vos applications avec des thèmes et couleurs\",\r\n en: \"\U0001F3A8 Customize your apps with themes and colors\"\r\n },\r\n {\r\n ID: 9,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Définissez un thème de couleurs cohérent pour vos applications afin de renforcer l’identité visuelle et offrir une expérience utilisateur harmonieuse.\",\r\n en: \"\U0001F680 Tip: Define a consistent color theme for your apps to strengthen visual identity and provide a harmonious user experience.\"\r\n },\r\n {\r\n ID: 9,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ L’utilisation de couleurs personnalisées permet de respecter la charte graphique de votre organisation et de donner un aspect professionnel à vos applications.\",\r\n en: \"⚡ Using custom colors allows you to follow your organization’s branding guidelines and give your apps a professional look.\"\r\n },\r\n {\r\n ID: 9,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"Set(varCouleurPrincipale; RGBA(0; 120; 215; 1))\r\nSet(varCouleurSecondaire; RGBA(255; 255; 255; 1))\",\r\n en: \"Set(varPrimaryColor, RGBA(0, 120, 215, 1))\r\nSet(varSecondaryColor, RGBA(255, 255, 255, 1))\"\r\n },\r\n {\r\n ID: 9,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, varCouleurPrincipale définit une couleur bleue et varCouleurSecondaire définit une couleur blanche.\r\nCes variables peuvent ensuite être utilisées pour styliser les boutons, les labels ou les fonds d’écran.\",\r\n en: \"\U0001F4C2 In this example, varPrimaryColor defines a blue color and varSecondaryColor defines a white color.\r\nThese variables can then be used to style buttons, labels, or backgrounds.\"\r\n },\r\n {\r\n ID: 9,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 En centralisant vos couleurs dans des variables, vous pouvez facilement modifier le thème de l’application sans devoir changer chaque contrôle individuellement.\",\r\n en: \"\U0001F4A1 By centralizing your colors in variables, you can easily change the app’s theme without having to update each control individually.\"\r\n },\r\n{\r\n ID: 10,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"✨ Enrichir l’interface avec des icônes SVG personnalisées\",\r\n en: \"✨ Enhance the interface with custom SVG icons\"\r\n },\r\n {\r\n ID: 10,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Intégrez des icônes SVG personnalisées dans vos applications pour offrir une expérience visuelle moderne et adaptée à votre identité graphique.\",\r\n en: \"\U0001F680 Tip: Integrate custom SVG icons into your apps to provide a modern visual experience aligned with your branding.\"\r\n },\r\n {\r\n ID: 10,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Les icônes SVG sont légères, scalables et s’adaptent parfaitement à toutes les tailles d’écran.\r\nElles permettent de remplacer les icônes par défaut et d’apporter une touche unique à vos applications.\",\r\n en: \"⚡ SVG icons are lightweight, scalable, and perfectly adapt to all screen sizes.\r\nThey allow you to replace default icons and bring a unique touch to your apps.\"\r\n },\r\n {\r\n ID: 10,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"Image = \"\"\r\n \r\n \r\n\"\"\",\r\n en: \"Image = \"\"\r\n \r\n \r\n\"\"\"\r\n },\r\n {\r\n ID: 10,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, un cercle bleu avec une coche est affiché en SVG.\r\nVous pouvez remplacer les couleurs, formes et tailles pour créer vos propres icônes.\",\r\n en: \"\U0001F4C2 In this example, a blue circle with a checkmark is displayed in SVG.\r\nYou can replace colors, shapes, and sizes to create your own icons.\"\r\n },\r\n {\r\n ID: 10,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 L’utilisation d’icônes SVG personnalisées améliore l’esthétique et permet de renforcer l’identité visuelle de vos applications.\r\nC’est une excellente manière de se démarquer et d’apporter une touche professionnelle.\",\r\n en: \"\U0001F4A1 Using custom SVG icons improves aesthetics and strengthens the visual identity of your apps.\r\nIt’s a great way to stand out and add a professional touch.\"\r\n },\r\n{\r\n ID: 11,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F9E9 Standardiser vos applications avec des composants réutilisables\",\r\n en: \"\U0001F9E9 Standardize your apps with reusable components\"\r\n },\r\n {\r\n ID: 11,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Créez des composants réutilisables pour éviter de dupliquer des contrôles et des logiques dans plusieurs écrans.\r\nCela permet de gagner du temps et d’assurer une cohérence visuelle et fonctionnelle dans toute l’application.\",\r\n en: \"\U0001F680 Tip: Create reusable components to avoid duplicating controls and logic across multiple screens.\r\nThis saves time and ensures visual and functional consistency throughout the app.\"\r\n },\r\n {\r\n ID: 11,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Les composants réutilisables sont parfaits pour des éléments comme les barres de navigation, les en-têtes, ou les boutons standards.\r\nIls centralisent la logique et facilitent les mises à jour futures.\",\r\n en: \"⚡ Reusable components are perfect for elements like navigation bars, headers, or standard buttons.\r\nThey centralize logic and make future updates easier.\"\r\n },\r\n {\r\n ID: 11,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"Composant: NavBar\r\nPropriétés: { CouleurFond: varCouleurPrincipale; Hauteur: 60; LayoutGap: 10 }\",\r\n en: \"Component: NavBar\r\nProperties: { BackgroundColor: varPrimaryColor, Height: 60, LayoutGap: 10 }\"\r\n },\r\n {\r\n ID: 11,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, un composant NavBar est défini avec une couleur de fond, une hauteur fixe et un espacement entre les éléments.\r\nCe composant peut être inséré dans plusieurs écrans sans recréer la logique.\",\r\n en: \"\U0001F4C2 In this example, a NavBar component is defined with a background color, fixed height, and spacing between elements.\r\nThis component can be inserted into multiple screens without recreating the logic.\"\r\n },\r\n {\r\n ID: 11,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 Les composants réutilisables améliorent la productivité et garantissent une expérience utilisateur uniforme.\r\nIls sont indispensables pour les applications complexes ou utilisées par de grandes équipes.\",\r\n en: \"\U0001F4A1 Reusable components improve productivity and guarantee a consistent user experience.\r\nThey are essential for complex apps or those used by large teams.\"\r\n },\r\n\r\n {\r\n ID: 13,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"⚠️ Optimiser vos requêtes avec la délégation\",\r\n en: \"⚠️ Optimize your queries with delegation\"\r\n },\r\n {\r\n ID: 13,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : La délégation permet à PowerApps d’exécuter les requêtes directement sur la source de données,\r\nplutôt que de rapatrier toutes les données dans l’application. Cela améliore considérablement les performances.\",\r\n en: \"\U0001F680 Tip: Delegation allows PowerApps to run queries directly on the data source,\r\ninstead of bringing all the data into the app. This significantly improves performance.\"\r\n },\r\n {\r\n ID: 13,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Sans délégation, PowerApps ne peut traiter qu’un nombre limité d’enregistrements (par défaut 500, extensible à 2000).\r\nAu-delà, les résultats peuvent être incomplets ou incorrects.\",\r\n en: \"⚡ Without delegation, PowerApps can only process a limited number of records (default 500, extendable to 2000).\r\nBeyond that, results may be incomplete or incorrect.\"\r\n },\r\n {\r\n ID: 13,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"Filter('[dbo].[Clients]'; Ville = \"\"Paris\"\")\",\r\n en: \"Filter('[dbo].[Customers]', City = \"\"London\"\")\"\r\n },\r\n {\r\n ID: 13,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, la fonction Filter est déléguée à la base SQL.\r\nSeuls les clients dont la ville est Paris sont renvoyés, sans charger toute la table dans l’application.\",\r\n en: \"\U0001F4C2 In this example, the Filter function is delegated to the SQL database.\r\nOnly customers whose city is London are returned, without loading the entire table into the app.\"\r\n },\r\n {\r\n ID: 13,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 Vérifiez toujours que vos fonctions sont délégables (Filter, Sort, LookUp, etc.).\r\nCela garantit des résultats fiables et des performances optimales, même avec des millions d’enregistrements.\",\r\n en: \"\U0001F4A1 Always check that your functions are delegable (Filter, Sort, LookUp, etc.).\r\nThis ensures reliable results and optimal performance, even with millions of records.\"\r\n },\r\n{\r\n ID: 14,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F4CB Optimiser vos galeries avec TemplateFill et TemplateSize\",\r\n en: \"\U0001F4CB Optimize your galleries with TemplateFill and TemplateSize\"\r\n },\r\n {\r\n ID: 14,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Utilisez les propriétés TemplateFill et TemplateSize pour améliorer la lisibilité et la performance des galeries.\r\nCela permet de mettre en valeur les éléments et d’adapter leur taille en fonction du contenu.\",\r\n en: \"\U0001F680 Tip: Use the TemplateFill and TemplateSize properties to improve readability and gallery performance.\r\nThis allows you to highlight items and adapt their size based on content.\"\r\n },\r\n {\r\n ID: 14,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ TemplateFill permet de colorer dynamiquement les éléments (par exemple, alterner les couleurs pour chaque ligne).\r\nTemplateSize ajuste la hauteur des éléments pour éviter les espaces inutiles.\",\r\n en: \"⚡ TemplateFill lets you dynamically color items (for example, alternating row colors).\r\nTemplateSize adjusts item height to avoid unnecessary spacing.\"\r\n },\r\n {\r\n ID: 14,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"Gallery.TemplateFill = If(Mod(ThisItem.ID;2)=0; Color.LightGray; Color.White)\r\nGallery.TemplateSize = 80\",\r\n en: \"Gallery.TemplateFill = If(Mod(ThisItem.ID,2)=0, Color.LightGray, Color.White)\r\nGallery.TemplateSize = 80\"\r\n },\r\n {\r\n ID: 14,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, les lignes paires de la galerie sont gris clair et les lignes impaires blanches.\r\nLa taille de chaque élément est fixée à 80 pixels pour une présentation uniforme.\",\r\n en: \"\U0001F4C2 In this example, even rows in the gallery are light gray and odd rows white.\r\nThe size of each item is set to 80 pixels for a uniform presentation.\"\r\n },\r\n {\r\n ID: 14,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 L’utilisation de TemplateFill et TemplateSize améliore la lisibilité des listes et rend l’application plus agréable à parcourir.\r\nC’est une bonne pratique pour les galeries affichant de nombreux enregistrements.\",\r\n en: \"\U0001F4A1 Using TemplateFill and TemplateSize improves list readability and makes the app more pleasant to navigate.\r\nIt’s a best practice for galleries displaying many records.\"\r\n },\r\n{\r\n ID: 15,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"⚙️ Rendre vos applications modulaires avec les variables d’environnement\",\r\n en: \"⚙️ Make your apps modular with environment variables\"\r\n },\r\n {\r\n ID: 15,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Utilisez les variables d’environnement pour stocker des paramètres comme des URLs, des clés API ou des identifiants.\r\nCela permet de déployer la même application dans plusieurs environnements sans modifier le code.\",\r\n en: \"\U0001F680 Tip: Use environment variables to store parameters such as URLs, API keys, or identifiers.\r\nThis allows you to deploy the same app across multiple environments without changing the code.\"\r\n },\r\n {\r\n ID: 15,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Les variables d’environnement sont gérées au niveau de Dataverse et peuvent être référencées directement dans vos formules.\r\nElles garantissent une meilleure gouvernance et évitent les erreurs liées aux valeurs codées en dur.\",\r\n en: \"⚡ Environment variables are managed at the Dataverse level and can be referenced directly in your formulas.\r\nThey ensure better governance and prevent errors caused by hard-coded values.\"\r\n },\r\n {\r\n ID: 15,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"Set(varApiUrl; EnvironmentVariableValue(\"\"ApiBaseUrl\"\"))\",\r\n en: \"Set(varApiUrl, EnvironmentVariableValue(\"\"ApiBaseUrl\"\"))\"\r\n },\r\n {\r\n ID: 15,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, la variable globale varApiUrl récupère la valeur de l’URL stockée dans l’environnement.\r\nVous pouvez ensuite l’utiliser dans vos appels API sans modifier le code lors du passage en production.\",\r\n en: \"\U0001F4C2 In this example, the global variable varApiUrl retrieves the URL value stored in the environment.\r\nYou can then use it in your API calls without changing the code when moving to production.\"\r\n },\r\n {\r\n ID: 15,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 L’utilisation des variables d’environnement facilite la maintenance, améliore la sécurité et rend vos applications plus flexibles.\r\nC’est une bonne pratique incontournable pour les projets professionnels.\",\r\n en: \"\U0001F4A1 Using environment variables makes maintenance easier, improves security, and makes your apps more flexible.\r\nIt’s an essential best practice for professional projects.\"\r\n },\r\n {\r\n ID: 16,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F9EE Rendre vos applications dynamiques avec des formules\",\r\n en: \"\U0001F9EE Make your apps dynamic with formulas\"\r\n },\r\n {\r\n ID: 16,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Les formules dans PowerApps permettent de contrôler le comportement des contrôles en fonction de conditions ou de données.\r\nElles transforment une interface statique en une application interactive et intelligente.\",\r\n en: \"\U0001F680 Tip: Formulas in PowerApps let you control the behavior of controls based on conditions or data.\r\nThey turn a static interface into an interactive and intelligent app.\"\r\n },\r\n {\r\n ID: 16,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Vous pouvez utiliser des formules pour modifier la visibilité, la couleur, ou le texte d’un contrôle selon des règles métier.\r\nCela améliore l’expérience utilisateur et réduit les erreurs.\",\r\n en: \"⚡ You can use formulas to change a control’s visibility, color, or text according to business rules.\r\nThis improves user experience and reduces errors.\"\r\n },\r\n {\r\n ID: 16,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"Button.DisplayMode = If(IsBlank(txtNom.Text); DisplayMode.Disabled; DisplayMode.Edit)\",\r\n en: \"Button.DisplayMode = If(IsBlank(txtName.Text), DisplayMode.Disabled, DisplayMode.Edit)\"\r\n },\r\n {\r\n ID: 16,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, le bouton est désactivé tant que le champ txtNom est vide.\r\nIl devient actif uniquement lorsque l’utilisateur saisit une valeur.\",\r\n en: \"\U0001F4C2 In this example, the button is disabled as long as the txtName field is empty.\r\nIt becomes active only when the user enters a value.\"\r\n },\r\n {\r\n ID: 16,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 Les formules conditionnelles permettent de créer des applications plus robustes,\r\nen guidant l’utilisateur et en automatisant les comportements selon le contexte.\",\r\n en: \"\U0001F4A1 Conditional formulas help build more robust apps,\r\nguiding the user and automating behaviors based on context.\"\r\n },\r\n{\r\n ID: 17,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F522 Manipuler vos données avec les fonctions Len, Left et Round\",\r\n en: \"\U0001F522 Manipulate your data with Len, Left and Round\"\r\n },\r\n {\r\n ID: 17,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Les fonctions de texte et de nombres permettent de transformer et d’adapter vos données directement dans les formules.\r\nElles sont utiles pour valider des champs, formater des valeurs ou simplifier l’affichage.\",\r\n en: \"\U0001F680 Tip: Text and number functions let you transform and adapt your data directly in formulas.\r\nThey are useful for validating fields, formatting values, or simplifying display.\"\r\n },\r\n {\r\n ID: 17,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Len() calcule la longueur d’un texte, Left() extrait les premiers caractères, et Round() arrondit un nombre.\r\nCes fonctions sont souvent combinées pour créer des règles métier plus robustes.\",\r\n en: \"⚡ Len() calculates the length of a text, Left() extracts the first characters, and Round() rounds a number.\r\nThese functions are often combined to create more robust business rules.\"\r\n },\r\n {\r\n ID: 17,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"If(Len(txtNom.Text) < 3; Notify(\"\"Nom trop court\"\"; NotificationType.Error))\r\nLabel.Text = Left(txtNom.Text; 5)\r\nLabel2.Text = Round(Slider1.Value; 2)\",\r\n en: \"If(Len(txtName.Text) < 3, Notify(\"\"Name too short\"\", NotificationType.Error))\r\nLabel.Text = Left(txtName.Text, 5)\r\nLabel2.Text = Round(Slider1.Value, 2)\"\r\n },\r\n {\r\n ID: 17,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, Len() vérifie que le nom contient au moins 3 caractères,\r\nLeft() affiche seulement les 5 premiers caractères, et Round() arrondit la valeur du slider à 2 décimales.\",\r\n en: \"\U0001F4C2 In this example, Len() checks that the name contains at least 3 characters,\r\nLeft() displays only the first 5 characters, and Round() rounds the slider value to 2 decimals.\"\r\n },\r\n {\r\n ID: 17,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 Ces fonctions sont indispensables pour contrôler la qualité des données et améliorer l’expérience utilisateur.\r\nElles permettent de créer des validations simples et efficaces directement dans l’application.\",\r\n en: \"\U0001F4A1 These functions are essential for controlling data quality and improving user experience.\r\nThey allow you to create simple and effective validations directly in the app.\"\r\n },\r\n\r\n{\r\n ID: 18,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"⏰ Gérer le temps avec Today, Now et DateAdd\",\r\n en: \"⏰ Manage time with Today, Now and DateAdd\"\r\n },\r\n {\r\n ID: 18,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Utilisez les fonctions temporelles pour afficher la date du jour, l’heure actuelle ou calculer des échéances.\r\nElles permettent de rendre vos applications interactives et adaptées aux besoins métiers.\",\r\n en: \"\U0001F680 Tip: Use time functions to display today’s date, the current time, or calculate deadlines.\r\nThey make your apps interactive and business-ready.\"\r\n },\r\n {\r\n ID: 18,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Today() renvoie la date du jour, Now() renvoie la date et l’heure exactes,\r\net DateAdd() permet d’ajouter ou de soustraire des jours, mois ou années à une date donnée.\",\r\n en: \"⚡ Today() returns today’s date, Now() returns the exact date and time,\r\nand DateAdd() lets you add or subtract days, months, or years from a given date.\"\r\n },\r\n {\r\n ID: 18,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"LabelDate.Text = Today()\r\nLabelHeure.Text = Text(Now(); \"\"hh:mm\"\")\r\nLabelEcheance.Text = DateAdd(Today(); 30; Days)\",\r\n en: \"LabelDate.Text = Today()\r\nLabelTime.Text = Text(Now(), \"\"hh:mm\"\")\r\nLabelDeadline.Text = DateAdd(Today(), 30, Days)\"\r\n },\r\n {\r\n ID: 18,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, LabelDate affiche la date du jour,\r\nLabelHeure affiche l’heure actuelle, et LabelEcheance calcule une échéance 30 jours après la date du jour.\",\r\n en: \"\U0001F4C2 In this example, LabelDate shows today’s date,\r\nLabelTime shows the current time, and LabelDeadline calculates a deadline 30 days after today.\"\r\n },\r\n {\r\n ID: 18,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 Les fonctions temporelles sont indispensables pour gérer des plannings, des rappels ou des échéances.\r\nElles rendent vos applications plus utiles et adaptées aux besoins quotidiens.\",\r\n en: \"\U0001F4A1 Time functions are essential for managing schedules, reminders, or deadlines.\r\nThey make your apps more useful and adapted to everyday needs.\"\r\n },\r\n{\r\n ID: 19,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F4D1 Partager du code Power Apps avec YAML\",\r\n en: \"\U0001F4D1 Share Power Apps code with YAML\"\r\n },\r\n {\r\n ID: 19,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Le format YAML permet de partager facilement du code Power Apps sous forme de snippets.\r\nC’est un excellent moyen de documenter vos solutions et de les rendre accessibles à la communauté.\",\r\n en: \"\U0001F680 Tip: YAML format makes it easy to share Power Apps code as snippets.\r\nIt’s a great way to document your solutions and make them accessible to the community.\"\r\n },\r\n {\r\n ID: 19,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Grâce au YAML, vous pouvez publier vos exemples de code, les réutiliser dans différents projets,\r\net inspirer d’autres développeurs en leur donnant des modèles prêts à l’emploi.\",\r\n en: \"⚡ With YAML, you can publish your code examples, reuse them in different projects,\r\nand inspire other developers by providing ready-to-use templates.\"\r\n },\r\n {\r\n ID: 19,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"\U0001F517 Exemple de mon jeu Démineur : https://powerappstools.com/snippet-details/144\r\n\U0001F517 Liste complète de mes snippets YAML : https://adoption.microsoft.com/en-us/sample-solution-gallery/SteveBourdin/\",\r\n en: \"\U0001F517 Example of my Minesweeper game: https://powerappstools.com/snippet-details/144\r\n\U0001F517 Full list of my YAML snippets: https://adoption.microsoft.com/en-us/sample-solution-gallery/SteveBourdin/\"\r\n },\r\n {\r\n ID: 19,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, vous pouvez accéder directement à mon jeu Démineur en YAML,\r\nainsi qu’à la galerie complète de mes codes partagés.\",\r\n en: \"\U0001F4C2 In this example, you can directly access my Minesweeper game in YAML,\r\nas well as the full gallery of my shared codes.\"\r\n },\r\n {\r\n ID: 19,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 Le YAML est une solution idéale pour partager, versionner et documenter vos créations Power Apps.\r\nIl facilite la collaboration et encourage la réutilisation des bonnes pratiques.\",\r\n en: \"\U0001F4A1 YAML is an ideal solution for sharing, versioning, and documenting your Power Apps creations.\r\nIt facilitates collaboration and encourages reuse of best practices.\"\r\n },\r\n{\r\n ID: 20,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F512 Renforcer la sécurité avec User() et logique basée sur les rôles\",\r\n en: \"\U0001F512 Strengthen security with User() and role-based logic\"\r\n },\r\n {\r\n ID: 20,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Utilisez la fonction User() pour identifier l’utilisateur connecté et adapter l’affichage ou les actions disponibles.\r\nVous pouvez ainsi créer des règles de sécurité simples et efficaces directement dans l’application.\",\r\n en: \"\U0001F680 Tip: Use the User() function to identify the logged-in user and adapt the display or available actions.\r\nThis lets you create simple and effective security rules directly in the app.\"\r\n },\r\n {\r\n ID: 20,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Combinez User() avec des conditions logiques (If, And, Or, Not) pour gérer les droits d’accès.\r\nPar exemple, afficher certains boutons uniquement pour les administrateurs ou masquer des données sensibles.\",\r\n en: \"⚡ Combine User() with logical conditions (If, And, Or, Not) to manage access rights.\r\nFor example, show certain buttons only to admins or hide sensitive data.\"\r\n },\r\n {\r\n ID: 20,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"If(User().Email = \"\"admin@entreprise.com\"\"; DisplayMode.Edit; DisplayMode.Disabled)\",\r\n en: \"If(User().Email = \"\"admin@company.com\"\", DisplayMode.Edit, DisplayMode.Disabled)\"\r\n },\r\n {\r\n ID: 20,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, un bouton est activé uniquement si l’utilisateur connecté est l’administrateur.\r\nSinon, il reste désactivé pour éviter toute action non autorisée.\",\r\n en: \"\U0001F4C2 In this example, a button is enabled only if the logged-in user is the administrator.\r\nOtherwise, it remains disabled to prevent unauthorized actions.\"\r\n },\r\n {\r\n ID: 20,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 L’utilisation de User() et de la logique basée sur les rôles renforce la gouvernance et protège vos données.\r\nC’est une bonne pratique incontournable pour les applications professionnelles.\",\r\n en: \"\U0001F4A1 Using User() and role-based logic strengthens governance and protects your data.\r\nIt’s an essential best practice for professional apps.\"\r\n },\r\n{\r\n ID: 21,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F3DB️ Mettre en place une gouvernance solide avec un partenaire Microsoft\",\r\n en: \"\U0001F3DB️ Establish strong governance with a Microsoft partner\"\r\n },\r\n {\r\n ID: 21,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : La gouvernance est essentielle pour assurer la sécurité, la conformité et la pérennité de vos applications Power Platform.\r\nElle définit les règles, les bonnes pratiques et les responsabilités pour l’ensemble des utilisateurs et développeurs.\",\r\n en: \"\U0001F680 Tip: Governance is essential to ensure the security, compliance, and sustainability of your Power Platform apps.\r\nIt defines rules, best practices, and responsibilities for all users and developers.\"\r\n },\r\n {\r\n ID: 21,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Une gouvernance bien pensée permet de contrôler les accès, gérer les environnements, standardiser les développements et éviter les dérives.\r\nSans gouvernance, les applications risquent de devenir difficiles à maintenir et à sécuriser.\",\r\n en: \"⚡ Well-designed governance helps control access, manage environments, standardize developments, and avoid risks.\r\nWithout governance, apps can quickly become hard to maintain and secure.\"\r\n },\r\n {\r\n ID: 21,\r\n no_ligne: 4,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 Il est fortement recommandé de se faire accompagner par un partenaire Microsoft expérimenté, comme Moca,\r\nqui possède l’expertise nécessaire pour mettre en place une gouvernance adaptée à vos besoins.\",\r\n en: \"\U0001F4A1 It is highly recommended to be supported by an experienced Microsoft partner, such as Moca,\r\nwho has the expertise to implement governance tailored to your needs.\"\r\n },\r\n {\r\n ID: 21,\r\n no_ligne: 5,\r\n type: \"Code\",\r\n fr: \"Exemple de bonnes pratiques de gouvernance :\r\n- Définir des rôles et responsabilités clairs\r\n- Mettre en place des environnements (Dev, Test, Prod)\r\n- Standardiser les modèles et composants réutilisables\r\n- Suivre les performances et la sécurité\r\n- S’appuyer sur un partenaire Microsoft (ex : Moca)\",\r\n en: \"Example of governance best practices:\r\n- Define clear roles and responsibilities\r\n- Set up environments (Dev, Test, Prod)\r\n- Standardize templates and reusable components\r\n- Monitor performance and security\r\n- Work with a Microsoft partner (e.g., Moca)\"\r\n },\r\n {\r\n ID: 21,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 La gouvernance n’est pas une contrainte mais un levier de réussite.\r\nAvec l’accompagnement d’un partenaire Microsoft, vous gagnez en efficacité, en sécurité et en sérénité.\",\r\n en: \"\U0001F4C2 Governance is not a constraint but a success enabler.\r\nWith the support of a Microsoft partner, you gain efficiency, security, and peace of mind.\"\r\n }\r\n ,\r\n {\r\n ID: 22,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F31F Suivre les principaux acteurs de la Power Platform\",\r\n en: \"\U0001F31F Follow the key Power Platform influencers\"\r\n },\r\n {\r\n ID: 22,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Abonnez-vous aux contenus des experts de la Power Platform pour rester à jour et découvrir des astuces pratiques.\r\nLeur expérience et leurs partages sont une mine d’or pour progresser rapidement.\",\r\n en: \"\U0001F680 Tip: Subscribe to Power Platform experts’ content to stay up to date and discover practical tips.\r\nTheir experience and sharing are a goldmine to progress quickly.\"\r\n },\r\n {\r\n ID: 22,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Voici quelques acteurs incontournables à suivre :\",\r\n en: \"⚡ Here are some key influencers to follow:\"\r\n },\r\n {\r\n ID: 22,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"\U0001F517 Shane Young : https://www.linkedin.com/in/cincyshane/\r\n\U0001F517 April Dunnam : https://www.linkedin.com/in/aprildunnam/\r\n\U0001F517 David Warner : https://www.linkedin.com/in/davidwarnerii/\r\n\U0001F517 Daniel Lakewitz : https://www.linkedin.com/in/laskewitz\r\n\U0001F517 Matthew Devaney : https://www.linkedin.com/in/matthew-devaney\r\n\U0001F517 Reza Dorrani : https://www.linkedin.com/in/rezadorrani\r\n\U0001F517 Steve Bourdin : https://www.linkedin.com/in/steve-bourdin-ab998762/\r\n\U0001F517 David Zoonekyndt : https://www.linkedin.com/in/david-zoonekyndt/\r\n\U0001F517 Markus Franz : https://www.linkedin.com/in/markus-franz-435759278/\r\n\U0001F517 Marcel Broschk : https://www.linkedin.com/in/marcel-broschk-85349a1b0/\",\r\n en: \"\U0001F517 Shane Young : https://www.linkedin.com/in/cincyshane/\r\n\U0001F517 April Dunnam : https://www.linkedin.com/in/aprildunnam/\r\n\U0001F517 David Warner : https://www.linkedin.com/in/davidwarnerii/\r\n\U0001F517 Daniel Lakewitz : https://www.linkedin.com/in/laskewitz\r\n\U0001F517 Matthew Devaney : https://www.linkedin.com/in/matthew-devaney\r\n\U0001F517 Reza Dorrani : https://www.linkedin.com/in/rezadorrani\r\n\U0001F517 Steve Bourdin : https://www.linkedin.com/in/steve-bourdin-ab998762/\r\n\U0001F517 David Zoonekyndt : https://www.linkedin.com/in/david-zoonekyndt/\r\n\U0001F517 Markus Franz : https://www.linkedin.com/in/markus-franz-435759278/\r\n\U0001F517 Marcel Broschk : https://www.linkedin.com/in/marcel-broschk-85349a1b0/\"\r\n },\r\n {\r\n ID: 22,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 En suivant ces experts, vous accédez à des tutoriels, des démos et des conseils pratiques.\r\nC’est un excellent moyen de rester connecté à l’évolution rapide de la Power Platform.\",\r\n en: \"\U0001F4C2 By following these experts, you gain access to tutorials, demos, and practical advice.\r\nIt’s an excellent way to stay connected to the fast evolution of the Power Platform.\"\r\n },\r\n {\r\n ID: 22,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 S’inspirer de ces acteurs vous aide à améliorer vos compétences, découvrir de nouvelles fonctionnalités et adopter les meilleures pratiques.\r\nC’est une étape clé pour progresser dans l’écosystème Power Platform.\",\r\n en: \"\U0001F4A1 Getting inspired by these influencers helps you improve your skills, discover new features, and adopt best practices.\r\nIt’s a key step to grow in the Power Platform ecosystem.\"\r\n },\r\n{\r\n ID: 23,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F680 Rien n’est impossible dans PowerApps : combinez vos composants !\",\r\n en: \"\U0001F680 Nothing is impossible in PowerApps: combine your components!\"\r\n },\r\n {\r\n ID: 23,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F4A1 Astuce : Si les composants standards ne suffisent pas, vous pouvez les combiner pour créer des expériences uniques.\r\nPowerApps offre une flexibilité incroyable qui permet d’aller au-delà des limites apparentes.\",\r\n en: \"\U0001F4A1 Tip: If standard components aren’t enough, you can combine them to create unique experiences.\r\nPowerApps offers incredible flexibility that lets you go beyond apparent limits.\"\r\n },\r\n {\r\n ID: 23,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Exemple : une liste déroulante pour proposer des choix prédéfinis,\r\net un TextInput placé par-dessus pour permettre une saisie libre à l’utilisateur.\",\r\n en: \"⚡ Example: a dropdown to offer predefined choices,\r\nand a TextInput placed on top to allow free user input.\"\r\n },\r\n {\r\n ID: 23,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"Dropdown.Items = [\"\"Option A\"\"; \"\"Option B\"\"; \"\"Option C\"\"]\r\nTextInput.Default = Dropdown.Selected.Value\",\r\n en: \"Dropdown.Items = [\"\"Option A\"\", \"\"Option B\"\", \"\"Option C\"\"]\r\nTextInput.Default = Dropdown.Selected.Value\"\r\n },\r\n {\r\n ID: 23,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple, l’utilisateur peut soit choisir une option dans la liste déroulante,\r\nsoit saisir directement son propre texte dans le champ libre.\",\r\n en: \"\U0001F4C2 In this example, the user can either pick an option from the dropdown,\r\nor directly type their own text in the free field.\"\r\n },\r\n {\r\n ID: 23,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"✨ Cette approche démontre que PowerApps permet de repousser les limites.\r\nEn combinant plusieurs composants, vous pouvez créer des solutions sur mesure adaptées à chaque besoin.\",\r\n en: \"✨ This approach shows that PowerApps lets you push boundaries.\r\nBy combining multiple components, you can build custom solutions tailored to any need.\"\r\n },\r\n{\r\n ID: 24,\r\n no_ligne: 1,\r\n type: \"Title\",\r\n fr: \"\U0001F385 Joyeux Noël et profitez de la vie !\",\r\n en: \"\U0001F385 Merry Christmas and enjoy life!\"\r\n },\r\n {\r\n ID: 24,\r\n no_ligne: 2,\r\n type: \"Text\",\r\n fr: \"\U0001F680 Astuce : Le plus important n’est pas seulement de coder ou d’optimiser vos applications,\r\nmais de profiter de la vie, de vos amis et des moments joyeux qui rechargent vos batteries.\",\r\n en: \"\U0001F680 Tip: The most important thing is not just coding or optimizing your apps,\r\nbut enjoying life, your friends, and joyful moments that recharge your batteries.\"\r\n },\r\n {\r\n ID: 24,\r\n no_ligne: 3,\r\n type: \"Text\",\r\n fr: \"⚡ Une bonne pause, un sourire partagé, un repas festif ou une soirée entre amis\r\nsont autant de sources d’énergie qui vous donneront la force de créer de belles applications par la suite.\",\r\n en: \"⚡ A good break, a shared smile, a festive meal or an evening with friends\r\nare sources of energy that will give you the strength to create great apps afterwards.\"\r\n },\r\n {\r\n ID: 24,\r\n no_ligne: 4,\r\n type: \"Code\",\r\n fr: \"Set(varBonheur;0);\r\nForAll(Cadeaux; Set(varBonheur; varBonheur + 100));\r\nNotify(\"\"\U0001F381 Tous les cadeaux sont ouverts ! Niveau de bonheur : \"\" & varBonheur; NotificationType.Success);\",\r\n en: \"Set(varHappiness,0);\r\nForAll(Gifts, Set(varHappiness, varHappiness + 100));\r\nNotify(\"\"\U0001F381 All gifts opened! Happiness level: \"\" & varHappiness, NotificationType.Success);\"\r\n },\r\n {\r\n ID: 24,\r\n no_ligne: 5,\r\n type: \"Text\",\r\n fr: \"\U0001F4C2 Dans cet exemple humoristique, chaque cadeau augmente le bonheur de 100 points.\r\nÀ la fin, une notification affiche votre niveau de bonheur total \U0001F389.\",\r\n en: \"\U0001F4C2 In this humorous example, each gift increases happiness by 100 points.\r\nAt the end, a notification shows your total happiness level \U0001F389.\"\r\n },\r\n {\r\n ID: 24,\r\n no_ligne: 6,\r\n type: \"Text\",\r\n fr: \"\U0001F384 Je vous souhaite un Joyeux Noël, plein de rires, de chaleur et de bons moments.\r\nQue cette pause festive vous apporte l’énergie pour vos futurs projets PowerApps !\",\r\n en: \"\U0001F384 I wish you a Merry Christmas, full of laughter, warmth, and good times.\r\nMay this festive break bring you the energy for your future PowerApps projects!\"\r\n },\r\n\r\n]\r\n);\r\n" + PressedBorderColor: =Self.Fill + PressedColor: =Self.Fill + PressedFill: =Self.Color + Start: =true + Visible: =false + X: =60 + Y: =60 + - lst_lang: + Control: DropDown@0.0.45 + Properties: + DefaultSelectedItems: =["en"] + Height: =27 + Items: =["en", "fr"] + Width: =70 + - txt_fond_gris: + Control: Text@0.0.51 + Properties: + Fill: =RGBA(9, 33, 98, 0.8) + Height: =App.Height + Visible: =varShowBestPractice=true + Width: =App.Width + - cont_bestpractice: + Control: GroupContainer@1.3.0 + Variant: ManualLayout + Properties: + BorderColor: =RGBA(234, 231, 229, 1) + BorderThickness: =6 + DropShadow: =DropShadow.Bold + Fill: =RGBA(247, 244, 242, 1) + Height: =gal_bestpractice.Height+img_day.Height + PaddingBottom: =20 + PaddingLeft: =20 + PaddingRight: =20 + PaddingTop: =20 + RadiusBottomLeft: =20 + RadiusBottomRight: =20 + RadiusTopLeft: =20 + RadiusTopRight: =20 + Visible: =varShowBestPractice=true + Width: =698 + X: =(Parent.Width-Self.Width)/2 + Y: =(App.Height-Self.Height)/2 + Children: + - txt_size_buffer: + Control: Text@0.0.51 + Properties: + Align: ='TextCanvas.Align'.Start + AutoHeight: =true + Font: =Font.Lato + FontColor: =RGBA(255,255,255,0) + Height: =10 + PaddingBottom: =0 + PaddingLeft: =0 + PaddingRight: =0 + PaddingTop: =0 + Text: |- + =If(CountRows(colText)>0,If(varPositionCollection<=CountRows(colText), Index(colText,varPositionCollection).fr&" + "," + ")) + VerticalAlign: =VerticalAlign.Middle + Width: =txt_best_practice.Width + X: =Parent.PaddingLeft + Y: =Parent.PaddingTop + - tim_text_buffer: + Control: Timer@2.1.0 + Properties: + AutoStart: =varLancementTexteDyn=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%) + Duration: =1 + Fill: =RGBA(56, 96, 178, 1) + Font: =Font.'Open Sans' + HoverBorderColor: =ColorFade(Self.BorderColor, 20%) + HoverColor: =RGBA(255, 255, 255, 1) + HoverFill: =ColorFade(RGBA(56, 96, 178, 1), -20%) + OnTimerStart: "=If(\n false,\n UpdateContext({varBeginText: Blank()})\n);\nIf(\n varBeginText <> true,\n UpdateContext(\n {\n varBeginText: true,\n varBuffer: \"\",\n varPosition: 0,\n varCurseur: true,\n varPositionCollection: 1\n }\n );\n ClearCollect(\n colTextBuffer,\n First(colText)\n )\n);\nUpdateContext({varPosition: varPosition + 1});\nIf(\n varPosition <= Len(\n Index(\n colText,\n varPositionCollection\n ).Value\n ),\n UpdateContext(\n {\n varBuffer: Concatenate(\n varBuffer,\n Mid(\n Index(\n colText,\n varPositionCollection\n ).Value,\n varPosition,\n 1\n )\n )\n }\n ),\n If(\n varPositionCollection < CountRows(colText),\n UpdateContext(\n {\n \n varBuffer: \"\",\n varPosition: 0,\n varCurseur: true,\n varPositionCollection: varPositionCollection + 1\n }\n );\n )\n)" + PressedBorderColor: =Self.Fill + PressedColor: =Self.Fill + PressedFill: =Self.Color + Repeat: =true + Start: =varLancementTexteDyn=true + Visible: =false + X: =8 + Y: =383 + - tim_init_curseur: + Control: Timer@2.1.0 + Properties: + AutoStart: =varLancementTexteDyn=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%) + Duration: =600 + Fill: =RGBA(56, 96, 178, 1) + Font: =Font.'Open Sans' + HoverBorderColor: =ColorFade(Self.BorderColor, 20%) + HoverColor: =RGBA(255, 255, 255, 1) + HoverFill: =ColorFade(RGBA(56, 96, 178, 1), -20%) + OnTimerStart: | + = + UpdateContext({varCurseur : Not varCurseur}); + PressedBorderColor: =Self.Fill + PressedColor: =Self.Fill + PressedFill: =Self.Color + Repeat: =true + Start: =varLancementTexteDyn=true + Visible: =false + X: =28 + Y: =403 + - gal_bestpractice: + Control: Gallery@2.15.0 + Variant: BrowseLayout_Flexible_SocialFeed_ver5.0 + Properties: + BorderColor: =RGBA(234, 231, 229, 1) + Fill: =RGBA(247, 244, 242, 1) + Height: =Sum(gal_bestpractice.AllItems,Value(txt_size.Text)) + Items: =colText + TemplatePadding: =2 + Width: =Parent.Width + Y: =img_day.Height + Children: + - cont_princ_best_practice: + Control: GroupContainer@1.3.0 + Variant: ManualLayout + Properties: + DropShadow: =DropShadow.None + Height: =cont_second_best_practice.Height+Self.PaddingBottom+Self.PaddingTop + Visible: =ThisItem.no_ligne<=varPositionCollection + Width: =Parent.TemplateWidth + Children: + - cont_second_best_practice: + Control: GroupContainer@1.3.0 + Variant: ManualLayout + Properties: + DropShadow: =If(ThisItem.type<>"Code",DropShadow.None, DropShadow.Semibold) + Fill: =If(ThisItem.type<>"Code",RGBA(0,0,0,0),Color.Black) + Height: =txt_best_practice.Height+30 + PaddingBottom: =5 + PaddingLeft: =5 + PaddingRight: =5 + PaddingTop: =5 + RadiusBottomLeft: =20 + RadiusBottomRight: =20 + RadiusTopLeft: =20 + RadiusTopRight: =20 + Width: =Parent.Width-Parent.PaddingLeft-Parent.PaddingRight + X: =Parent.PaddingLeft + Y: =Parent.PaddingTop + Children: + - ico_copy: + Control: Classic/Icon@2.5.0 + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Color: =Color.White + Height: =20 + Icon: =Icon.Copy + OnSelect: =Copy(ThisItem.fr) + Visible: =ThisItem.type="Code" + Width: =Self.Height + X: =Parent.Width-Self.Width-20 + Y: =20 + - txt_size: + Control: Text@0.0.51 + Properties: + Height: =Parent.Height + Size: =If(ThisItem.type<>"Title" , 14,18) + Text: =Self.Height+Parent.PaddingBottom+Parent.PaddingTop + Visible: =false + X: =40 + - txt_best_practice: + Control: Text@0.0.51 + Properties: + Align: =If(ThisItem.type<>"Title", "Start","Center") + AutoHeight: =If(ThisItem.no_ligne=varPositionCollection,false,true) + Font: =If(ThisItem.type<>"Code",Font.'Segoe UI',Font.'Courier New') + FontColor: =If(ThisItem.type<>"Code",Color.Black,Color.White) + Height: =If(ThisItem.no_ligne=varPositionCollection,txt_size_buffer.Height+15,If(ThisItem.type="Title",14, 10))+5 + PaddingLeft: =10 + PaddingRight: =10 + Size: =If(ThisItem.type<>"Title" , 14,18) + Text: |- + =If(ThisItem.no_ligne=varPositionCollection,varBuffer&" "&If(varCurseur = true,"■","_"),ThisItem.Value)&" + " + VerticalAlign: =VerticalAlign.Top + Weight: =If(ThisItem.type<>"Code",'TextCanvas.Weight'.Semibold,'TextCanvas.Weight'.Medium) + Width: =Parent.Width + Y: =Parent.PaddingTop + - img_day: + Control: Image@2.2.3 + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Height: =40 + Image: "=\"data:image/svg+xml;utf8,\" & \r\nEncodeUrl(\r\n \"\r\n \r\n \r\n \r\n \r\n \"& Text(DateValue(If(IsBlank(varJour),\"01\", varJour)&\"/12/\"&Year(Now()),\"fr\"),\"dddd dd mmmm yyyy\",If(lst_lang.Selected.Value=\"en\",\"en-US\",\"fr\")\r\n)&\"\r\n \r\n\"\r\n)" + Width: =Parent.Width + - ico_close: + Control: Classic/Icon@2.5.0 + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Color: =RGBA(106, 122, 127, 1) + Height: =20 + Icon: =Icon.CancelBadge + OnSelect: |- + =UpdateContext({varShowBestPractice : false}) + Width: =20 + X: =Parent.Width-Self.Width-10 + Y: =10 + - img_MOCAbyASI: + Control: Image@2.2.3 + Properties: + BorderColor: =RGBA(0, 18, 107, 1) + Height: =50 + Image: ="https://www.asi.fr/sites/default/files/styles/og_image/public/2022-02/MOCA_byASI_Lancement_Marque.jpg?itok=cjcfTEkN" + OnSelect: =Launch("https://fr.linkedin.com/company/moca-byasi",{},LaunchTarget.New) + X: =Parent.Width-Self.Width + Y: =Parent.Height-Self.Height