{"id":761,"date":"2026-09-19T14:19:57","date_gmt":"2026-09-19T13:19:57","guid":{"rendered":"https:\/\/lepanierdelatourpenchee.org\/?p=761"},"modified":"2026-09-19T14:22:17","modified_gmt":"2026-09-19T13:22:17","slug":"calendrier-amap-dans-votre-telephone","status":"publish","type":"post","link":"https:\/\/lepanierdelatourpenchee.org\/?p=761","title":{"rendered":"Calendrier AMAP dans votre t\u00e9l\u00e9phone"},"content":{"rendered":"\n<div id=\"amap-rdv-widget\" style=\"max-width:640px;margin:0 auto;font-family:Arial,Helvetica,sans-serif;\">\n  <style>\n    #amap-rdv-widget * { box-sizing: border-box; }\n    #amap-rdv-widget h3 { margin: 0 0 10px; font-size: 1.2em; color: #2c3e30; }\n    #amap-rdv-widget p.amap-intro { margin: 0 0 16px; color: #444; font-size: 0.95em; }\n    #amap-rdv-widget .amap-grid {\n      display: grid;\n      grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n      gap: 8px 14px;\n      margin-bottom: 18px;\n      padding: 14px;\n      background: #f6f8f5;\n      border: 1px solid #dde3da;\n      border-radius: 8px;\n    }\n    #amap-rdv-widget label.amap-check {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      font-size: 0.95em;\n      color: #2c2c2c;\n      cursor: pointer;\n      user-select: none;\n    }\n    #amap-rdv-widget input[type=\"checkbox\"] {\n      width: 17px;\n      height: 17px;\n      accent-color: #4a7c3f;\n      cursor: pointer;\n      flex-shrink: 0;\n    }\n    #amap-rdv-widget .amap-actions {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 10px;\n      align-items: center;\n      margin-bottom: 10px;\n    }\n    #amap-rdv-widget button {\n      cursor: pointer;\n      border: none;\n      border-radius: 6px;\n      font-size: 0.95em;\n      padding: 10px 18px;\n      font-weight: bold;\n    }\n    #amap-rdv-widget #amap-generate-btn {\n      background: #4a7c3f;\n      color: #fff;\n    }\n    #amap-rdv-widget #amap-generate-btn:hover { background: #3d6634; }\n    #amap-rdv-widget #amap-generate-btn:disabled {\n      background: #a9b8a4;\n      cursor: not-allowed;\n    }\n    #amap-rdv-widget .amap-link-btn {\n      background: transparent;\n      color: #4a7c3f;\n      text-decoration: underline;\n      padding: 6px 4px;\n      font-weight: normal;\n    }\n    #amap-rdv-widget #amap-status {\n      margin-top: 10px;\n      font-size: 0.9em;\n      min-height: 1.4em;\n    }\n    #amap-rdv-widget #amap-status.amap-ok { color: #2c6b2f; }\n    #amap-rdv-widget #amap-status.amap-error { color: #b23b3b; }\n  <\/style>\n\n  <h3>G\u00e9n\u00e9rer mes rendez-vous AMAP<\/h3>\n  <p class=\"amap-intro\">\n    Cochez le ou les contrats que vous avez souscrits, puis cliquez sur \u00ab G\u00e9n\u00e9rer le fichier \u00bb.\n    Un fichier sera t\u00e9l\u00e9charg\u00e9 : ouvrez-le sur votre t\u00e9l\u00e9phone (iOS ou Android) pour ajouter\n    automatiquement tous les rendez-vous de distribution correspondants \u00e0 votre agenda\n    (chaque jeudi concern\u00e9, de 18h00 \u00e0 19h30).\n  <\/p>\n\n  <div class=\"amap-actions\">\n    <button type=\"button\" class=\"amap-link-btn\" id=\"amap-select-all\">Tout cocher<\/button>\n    <button type=\"button\" class=\"amap-link-btn\" id=\"amap-select-none\">Tout d\u00e9cocher<\/button>\n  <\/div>\n\n  <div class=\"amap-grid\" id=\"amap-checkboxes\"><\/div>\n\n  <div class=\"amap-actions\">\n    <button type=\"button\" id=\"amap-generate-btn\">G\u00e9n\u00e9rer le fichier pour mon agenda<\/button>\n  <\/div>\n  <div id=\"amap-status\"><\/div>\n<\/div>\n\n<script>\n(function () {\n  \/\/ ---- Donn\u00e9es : jours de distribution ---------------------------------\n  \/\/ Chaque entr\u00e9e : [date ISO du jeudi, { cle_contrat: \"X\" ou \"A\"\/\"B\"\/\"C\"\/\"D\" }]\n  var DISTRIB_DATA = [[\"2026-09-24\",{\"legumes\":\"X\",\"cresson\":\"X\"}],[\"2026-10-01\",{\"legumes\":\"X\",\"oeufs\":\"X\",\"pain\":\"A\"}],[\"2026-10-08\",{\"legumes\":\"X\",\"pain\":\"B\",\"fruits\":\"X\",\"pdt\":\"X\"}],[\"2026-10-15\",{\"legumes\":\"X\",\"oeufs\":\"X\",\"pain\":\"C\"}],[\"2026-10-22\",{\"legumes\":\"X\",\"pain\":\"D\",\"cresson\":\"X\",\"fruits\":\"X\"}],[\"2026-10-29\",{\"legumes\":\"X\",\"pain\":\"A\"}],[\"2026-11-05\",{\"legumes\":\"X\",\"oeufs\":\"X\",\"pain\":\"B\",\"fruits\":\"X\",\"pdt\":\"X\"}],[\"2026-11-12\",{\"legumes\":\"X\",\"pain\":\"C\"}],[\"2026-11-19\",{\"legumes\":\"X\",\"pain\":\"D\",\"cresson\":\"X\",\"fruits\":\"X\"}],[\"2026-11-26\",{\"legumes\":\"X\",\"oeufs\":\"X\",\"pain\":\"A\"}],[\"2026-12-03\",{\"legumes\":\"X\",\"pain\":\"B\",\"fruits\":\"X\",\"pdt\":\"X\"}],[\"2026-12-10\",{\"legumes\":\"X\",\"oeufs\":\"X\",\"pain\":\"C\"}],[\"2026-12-17\",{\"legumes\":\"X\",\"oeufs\":\"X\",\"pain\":\"D\",\"cresson\":\"X\",\"fruits\":\"X\"}],[\"2027-01-07\",{\"legumes\":\"X\",\"oeufs\":\"X\"}],[\"2027-01-14\",{\"legumes\":\"X\",\"fruits\":\"X\",\"pdt\":\"X\"}],[\"2027-01-21\",{\"legumes\":\"X\",\"oeufs\":\"X\",\"cresson\":\"X\"}],[\"2027-01-28\",{\"legumes\":\"X\",\"fruits\":\"X\"}],[\"2027-02-04\",{\"legumes\":\"X\"}],[\"2027-02-11\",{\"legumes\":\"X\",\"oeufs\":\"X\",\"pdt\":\"X\"}],[\"2027-02-18\",{\"legumes\":\"X\",\"cresson\":\"X\"}],[\"2027-02-25\",{\"legumes\":\"X\"}],[\"2027-03-04\",{\"legumes\":\"X\",\"oeufs\":\"X\"}],[\"2027-03-11\",{\"legumes\":\"X\",\"pdt\":\"X\"}],[\"2027-03-18\",{\"legumes\":\"X\",\"oeufs\":\"X\",\"cresson\":\"X\"}],[\"2027-03-25\",{\"legumes\":\"X\"}],[\"2027-04-01\",{\"legumes\":\"X\",\"oeufs\":\"X\"}],[\"2027-04-08\",{\"legumes\":\"X\"}],[\"2027-04-15\",{\"legumes\":\"X\",\"oeufs\":\"X\",\"cresson\":\"X\"}],[\"2027-04-22\",{\"legumes\":\"X\"}],[\"2027-04-29\",{\"oeufs\":\"X\"}],[\"2027-05-06\",{}],[\"2027-05-13\",{\"oeufs\":\"X\",\"cresson\":\"X\"}],[\"2027-05-20\",{\"legumes\":\"X\"}],[\"2027-05-27\",{\"legumes\":\"X\",\"oeufs\":\"X\"}],[\"2027-06-03\",{\"legumes\":\"X\"}],[\"2027-06-10\",{\"legumes\":\"X\",\"oeufs\":\"X\"}],[\"2027-06-17\",{\"legumes\":\"X\"}],[\"2027-06-24\",{\"legumes\":\"X\",\"oeufs\":\"X\"}],[\"2027-07-01\",{\"legumes\":\"X\"}],[\"2027-07-08\",{\"legumes\":\"X\",\"oeufs\":\"X\"}],[\"2027-07-15\",{\"legumes\":\"X\"}],[\"2027-07-22\",{\"legumes\":\"X\",\"oeufs\":\"X\"}],[\"2027-07-29\",{\"legumes\":\"X\"}],[\"2027-08-05\",{\"legumes\":\"X\",\"oeufs\":\"X\"}],[\"2027-08-12\",{\"legumes\":\"X\"}],[\"2027-08-19\",{\"legumes\":\"X\",\"oeufs\":\"X\"}],[\"2027-08-26\",{\"legumes\":\"X\"}],[\"2027-09-02\",{\"legumes\":\"X\",\"oeufs\":\"X\"}],[\"2027-09-09\",{\"legumes\":\"X\"}],[\"2027-09-16\",{\"legumes\":\"X\",\"oeufs\":\"X\"}],[\"2027-09-23\",{\"legumes\":\"X\"}],[\"2027-09-30\",{\"legumes\":\"X\",\"oeufs\":\"X\"}]];\n\n  \/\/ Liste des contrats : [cle, libell\u00e9 affich\u00e9]\n  var CONTRACTS = [[\"legumes\",\"L\u00e9gumes\"],[\"oeufs\",\"\u0152ufs\"],[\"pain\",\"Pain\"],[\"cresson\",\"Cresson\"],[\"volailles\",\"Volailles et graines\"],[\"fruits\",\"Fruits\"],[\"tisanes\",\"Tisanes\"],[\"chevre\",\"Ch\u00e8vre\"],[\"viande\",\"Viande\"],[\"asperges\",\"Asperges\"],[\"bieres\",\"Bi\u00e8res\"],[\"legumineuses\",\"L\u00e9gumineuses\"],[\"pdt\",\"Pommes de terre\"]];\n\n  var HEURE_DEBUT = \"180000\"; \/\/ 18h00\n  var HEURE_FIN   = \"193000\"; \/\/ 19h30\n\n  \/\/ ---- Construction des cases \u00e0 cocher ----------------------------------\n  var grid = document.getElementById(\"amap-checkboxes\");\n  CONTRACTS.forEach(function (c) {\n    var key = c[0], label = c[1];\n    var wrapper = document.createElement(\"label\");\n    wrapper.className = \"amap-check\";\n    var input = document.createElement(\"input\");\n    input.type = \"checkbox\";\n    input.value = key;\n    input.className = \"amap-contract-checkbox\";\n    wrapper.appendChild(input);\n    wrapper.appendChild(document.createTextNode(label));\n    grid.appendChild(wrapper);\n  });\n\n  document.getElementById(\"amap-select-all\").addEventListener(\"click\", function () {\n    document.querySelectorAll(\".amap-contract-checkbox\").forEach(function (cb) { cb.checked = true; });\n  });\n  document.getElementById(\"amap-select-none\").addEventListener(\"click\", function () {\n    document.querySelectorAll(\".amap-contract-checkbox\").forEach(function (cb) { cb.checked = false; });\n  });\n\n  \/\/ ---- Utilitaires ICS ----------------------------------------------------\n  function pad(n) { return (n < 10 ? \"0\" : \"\") + n; }\n\n  function icsEscape(str) {\n    return String(str)\n      .replace(\/\\\\\/g, \"\\\\\\\\\")\n      .replace(\/;\/g, \"\\\\;\")\n      .replace(\/,\/g, \"\\\\,\")\n      .replace(\/\\n\/g, \"\\\\n\");\n  }\n\n  function foldLine(line) {\n    \/\/ RFC5545: lignes limit\u00e9es \u00e0 75 octets, repli\u00e9es avec CRLF + espace\n    var out = \"\";\n    var cur = line;\n    while (cur.length > 74) {\n      out += cur.substring(0, 74) + \"\\r\\n \";\n      cur = cur.substring(74);\n    }\n    out += cur;\n    return out;\n  }\n\n  function dtStamp() {\n    var d = new Date();\n    return d.getUTCFullYear() + pad(d.getUTCMonth() + 1) + pad(d.getUTCDate()) + \"T\" +\n           pad(d.getUTCHours()) + pad(d.getUTCMinutes()) + pad(d.getUTCSeconds()) + \"Z\";\n  }\n\n  function buildICS(selectedKeys) {\n    var lines = [];\n    lines.push(\"BEGIN:VCALENDAR\");\n    lines.push(\"VERSION:2.0\");\n    lines.push(\"PRODID:-\/\/AMAP\/\/Formulaire RDV\/\/FR\");\n    lines.push(\"CALSCALE:GREGORIAN\");\n    lines.push(\"METHOD:PUBLISH\");\n\n    var stamp = dtStamp();\n    var nbEvents = 0;\n\n    DISTRIB_DATA.forEach(function (entry) {\n      var isoDate = entry[0];\n      var values = entry[1];\n      var descLines = [];\n\n      selectedKeys.forEach(function (key) {\n        var val = values[key];\n        if (val) {\n          var label = CONTRACTS.filter(function (c) { return c[0] === key; })[0][1];\n          if (val === \"X\") {\n            descLines.push(label);\n          } else {\n            descLines.push(label + \" \" + val);\n          }\n        }\n      });\n\n      if (descLines.length === 0) return; \/\/ rien pour cette date -> pas d'\u00e9v\u00e8nement\n\n      var ymd = isoDate.replace(\/-\/g, \"\");\n      var uid = \"amap-\" + ymd + \"-\" + Math.random().toString(36).substring(2, 8) + \"@amap-widget\";\n\n      lines.push(\"BEGIN:VEVENT\");\n      lines.push(foldLine(\"UID:\" + uid));\n      lines.push(\"DTSTAMP:\" + stamp);\n      lines.push(\"DTSTART:\" + ymd + \"T\" + HEURE_DEBUT);\n      lines.push(\"DTEND:\" + ymd + \"T\" + HEURE_FIN);\n      lines.push(\"SUMMARY:AMAP\");\n      lines.push(foldLine(\"DESCRIPTION:\" + icsEscape(descLines.join(\"\\n\"))));\n      lines.push(\"END:VEVENT\");\n      nbEvents++;\n    });\n\n    lines.push(\"END:VCALENDAR\");\n\n    return { ics: lines.join(\"\\r\\n\"), count: nbEvents };\n  }\n\n  \/\/ ---- Action du bouton ---------------------------------------------------\n  document.getElementById(\"amap-generate-btn\").addEventListener(\"click\", function () {\n    var statusEl = document.getElementById(\"amap-status\");\n    var selected = Array.prototype.slice\n      .call(document.querySelectorAll(\".amap-contract-checkbox:checked\"))\n      .map(function (cb) { return cb.value; });\n\n    if (selected.length === 0) {\n      statusEl.className = \"amap-error\";\n      statusEl.textContent = \"Veuillez cocher au moins un contrat avant de g\u00e9n\u00e9rer le fichier.\";\n      return;\n    }\n\n    var result = buildICS(selected);\n\n    if (result.count === 0) {\n      statusEl.className = \"amap-error\";\n      statusEl.textContent = \"Aucune date de distribution trouv\u00e9e pour les contrats s\u00e9lectionn\u00e9s.\";\n      return;\n    }\n\n    var blob = new Blob([result.ics], { type: \"text\/calendar;charset=utf-8\" });\n    var url = URL.createObjectURL(blob);\n    var a = document.createElement(\"a\");\n    a.href = url;\n    a.download = \"rendez-vous-amap.ics\";\n    document.body.appendChild(a);\n    a.click();\n    document.body.removeChild(a);\n    setTimeout(function () { URL.revokeObjectURL(url); }, 2000);\n\n    statusEl.className = \"amap-ok\";\n    statusEl.textContent = result.count + \" rendez-vous g\u00e9n\u00e9r\u00e9s dans le fichier t\u00e9l\u00e9charg\u00e9. \" +\n      \"Ouvrez-le depuis votre t\u00e9l\u00e9phone pour l'ajouter \u00e0 votre agenda.\";\n  });\n})();\n<\/script>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>G\u00e9n\u00e9rer mes rendez-vous AMAP Cochez le ou les contrats que vous avez souscrits, puis cliquez sur \u00ab G\u00e9n\u00e9rer le fichier \u00bb. Un fichier sera t\u00e9l\u00e9charg\u00e9 : ouvrez-le sur votre t\u00e9l\u00e9phone (iOS ou Android) pour ajouter automatiquement tous les rendez-vous de distribution correspondants \u00e0 votre agenda (chaque jeudi concern\u00e9, de 18h00 \u00e0 19h30). Tout cocher Tout [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-761","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/lepanierdelatourpenchee.org\/index.php?rest_route=\/wp\/v2\/posts\/761","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lepanierdelatourpenchee.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lepanierdelatourpenchee.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lepanierdelatourpenchee.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lepanierdelatourpenchee.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=761"}],"version-history":[{"count":2,"href":"https:\/\/lepanierdelatourpenchee.org\/index.php?rest_route=\/wp\/v2\/posts\/761\/revisions"}],"predecessor-version":[{"id":763,"href":"https:\/\/lepanierdelatourpenchee.org\/index.php?rest_route=\/wp\/v2\/posts\/761\/revisions\/763"}],"wp:attachment":[{"href":"https:\/\/lepanierdelatourpenchee.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=761"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lepanierdelatourpenchee.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=761"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lepanierdelatourpenchee.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=761"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}