{"id":746,"date":"2026-01-30T09:54:55","date_gmt":"2026-01-30T08:54:55","guid":{"rendered":"https:\/\/traveltennis.com\/?page_id=746"},"modified":"2026-01-30T09:56:49","modified_gmt":"2026-01-30T08:56:49","slug":"planning-test","status":"publish","type":"page","link":"https:\/\/traveltennis.com\/en\/planning-test\/","title":{"rendered":"planning test"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"746\" class=\"elementor elementor-746\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3293d60 e-flex e-con-boxed e-con e-parent\" data-id=\"3293d60\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ef304c9 elementor-widget elementor-widget-html\" data-id=\"ef304c9\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<h2>Planning \u00e9t\u00e9 (Excel)<\/h2>\n<p style=\"color:#666\">\n  Charge ton fichier Excel (structure 2025) et le planning s\u2019affiche automatiquement.\n<\/p>\n\n<input id=\"file\" type=\"file\" accept=\".xlsx,.xls\" \/>\n<input id=\"search\" type=\"search\" placeholder=\"Recherche (nom, ville\u2026)\" style=\"margin-left:10px; padding:8px\" \/>\n\n<div id=\"tabs\" style=\"margin:15px 0; display:flex; gap:8px; flex-wrap:wrap\"><\/div>\n\n<div style=\"overflow:auto; border:1px solid #ddd; border-radius:12px\">\n  <table id=\"table\" style=\"border-collapse:collapse; min-width:800px; width:100%\">\n    <thead><\/thead>\n    <tbody><\/tbody>\n  <\/table>\n<\/div>\n\n<!-- SheetJS -->\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/xlsx@0.19.3\/dist\/xlsx.full.min.js\"><\/script>\n\n<script>\nconst fileInput = document.getElementById(\"file\");\nconst tabs = document.getElementById(\"tabs\");\nconst thead = document.querySelector(\"#table thead\");\nconst tbody = document.querySelector(\"#table tbody\");\nconst search = document.getElementById(\"search\");\n\nlet sheets = [];\nlet active = 0;\n\nfunction clean(v){ return (v ?? \"\").toString().trim(); }\n\nfunction excelDate(v){\n  if (v instanceof Date) return v;\n  if (typeof v === \"number\"){\n    const d = XLSX.SSF.parse_date_code(v);\n    return new Date(d.y, d.m - 1, d.d);\n  }\n  const d = new Date(v);\n  return isNaN(d) ? null : d;\n}\n\nfunction formatDate(d){\n  return d.toLocaleDateString(\"fr-FR\",{weekday:\"long\",day:\"numeric\",month:\"long\",year:\"numeric\"});\n}\n\nfunction renderTabs(){\n  tabs.innerHTML = \"\";\n  sheets.forEach((s,i)=>{\n    const b = document.createElement(\"button\");\n    b.textContent = s.label;\n    b.style.padding = \"8px 12px\";\n    b.style.borderRadius = \"10px\";\n    b.style.border = i===active ? \"2px solid #000\" : \"1px solid #ccc\";\n    b.onclick = ()=>{ active=i; renderTabs(); renderTable(); };\n    tabs.appendChild(b);\n  });\n}\n\nfunction renderTable(){\n  const s = sheets[active];\n  const q = search.value.toLowerCase();\n\n  thead.innerHTML = \"\";\n  tbody.innerHTML = \"\";\n\n  const trh = document.createElement(\"tr\");\n  s.headers.forEach(h=>{\n    const th = document.createElement(\"th\");\n    th.textContent = h;\n    th.style.padding = \"8px\";\n    th.style.borderBottom = \"1px solid #ddd\";\n    trh.appendChild(th);\n  });\n  thead.appendChild(trh);\n\n  s.rows.forEach(r=>{\n    if(q && !r.join(\" \").toLowerCase().includes(q)) return;\n    const tr = document.createElement(\"tr\");\n    r.forEach(c=>{\n      const td = document.createElement(\"td\");\n      td.textContent = c;\n      td.style.padding = \"6px 8px\";\n      td.style.borderBottom = \"1px solid #eee\";\n      tr.appendChild(td);\n    });\n    tbody.appendChild(tr);\n  });\n}\n\nfileInput.addEventListener(\"change\", async e=>{\n  const file = e.target.files[0];\n  if(!file) return;\n\n  const buf = await file.arrayBuffer();\n  const wb = XLSX.read(buf,{type:\"array\"});\n\n  sheets = wb.SheetNames.map(name=>{\n    const ws = wb.Sheets[name];\n    const grid = XLSX.utils.sheet_to_json(ws,{header:1,defval:\"\"});\n    const date = excelDate(grid?.[0]?.[0]);\n    return {\n      label: date ? `${name} \u2013 ${formatDate(date)}` : name,\n      headers: grid[1].map(clean),\n      rows: grid.slice(2).filter(r=>r.some(c=>c))\n    };\n  });\n\n  active = 0;\n  renderTabs();\n  renderTable();\n});\n\nsearch.addEventListener(\"input\", renderTable);\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Planning \u00e9t\u00e9 (Excel) Charge ton fichier Excel (structure 2025) et le planning s\u2019affiche automatiquement.<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-746","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/pages\/746","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/comments?post=746"}],"version-history":[{"count":8,"href":"https:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/pages\/746\/revisions"}],"predecessor-version":[{"id":754,"href":"https:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/pages\/746\/revisions\/754"}],"wp:attachment":[{"href":"https:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/media?parent=746"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}