ar-poncho
Version:
Base de html y css para la creación de sitios pertenecientes a la Administración Pública Nacional de la República Argentina.
1 lines • 9.98 kB
JavaScript
let calendar={oerderByDate(e){return e.sort((e,t)=>this.parseDate(e.date).dateObject-this.parseDate(t.date).dateObject)},parseDate(e){var t,a;if("string"==typeof e)return[e,t,a]=e.split("/"),{dateObject:new Date(a,t-1,e),markerDay:e,markerMonth:t,markerYear:a,markerDayInt:parseInt(e),markerMonthInt:parseInt(t),markerYearInt:parseInt(a)}},toggleText:function(a,r){"string"!=typeof a&&!a.trim()||document.querySelectorAll(`[data-${a}-${r}]`).forEach(e=>{var t=(a+"-"+r).toLowerCase().replace(/-([a-z])/g,(e,t)=>t.toUpperCase()),t=e.dataset[t];e.textContent=t,e.lang=r})},tZone(e,t="America/Argentina/Buenos_Aires"){if(e instanceof Date)return new Date(e.toLocaleString("en-US",{timeZone:t,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}));throw new TypeError("Se espera un objeto Date()")},timeZone:"America/Argentina/Buenos_Aires",dictionary:{es:{dayAnchor:"{day} de {month}",holidaysListTitle:"Listado de feriados",holidaysType:{inamovible:"Feriado inamovible",no_laborable:"Día no laborable",trasladable:"Feriado trasladable",turistico:"Feriado turístico"},calendarCaption:"Calendario de {month}",jumpToList:"Ir al listado de {month}",months:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],nextHoliday:"{day} de {month} de {year}",weekDays:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],weekDaysAbbr:["Dom","Lun","Mar","Mie","Jue","Vie","Sab"]},en:{dayAnchor:"{month} {day}th.",holidaysListTitle:"Holidays list",holidaysType:{inamovible:"Fixed Holiday",no_laborable:"Non-Working Day",trasladable:"Movable Holiday",turistico:"Tourist Holiday"},calendarCaption:"{month} calendar",jumpToList:"Jump to {month} list",months:["January","February","March","April","May","June","July","August","September","October","November","December"],nextHoliday:"{month} {day}th, {year}",weekDays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekDaysAbbr:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]}},daysOfMonth:[31,28,31,30,31,30,31,31,30,31,30,31],isValidDate(e,t,a){var r;return!![e,t,a].every(e=>!isNaN(Number(e)))&&(r=new Date(e,t-1,a)).getFullYear()===parseInt(e)&&r.getMonth()===parseInt(t)-1&&r.getDate()===parseInt(a)},isValidEntry:function(t){var e=JSON.stringify(t);if(!["date","type","label"].every(e=>Object.prototype.hasOwnProperty.call(t,e)))throw new Error("La entrada tiene claves incorrectas o errores sintácticos: "+e);var a=t.date;if(!/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/.test(a))throw new Error("El formato de la fecha es incorrecto: "+e);var{markerDayInt:a,markerMonthInt:r,markerYearInt:n}=this.parseDate(a);if(!this.isValidDate(n,r,a))throw new Error("La fecha es incorrecta: "+e);n=t.label;if("string"!=typeof n||""===n.trim())throw new Error("El label debe ser una cadena de texto y no puede estár vacío: "+e);return!0},isMultiLang:function(e){return Object.keys(e).some(e=>this.availableLanguages.includes(e))},validateMarkers:function(e){if(!e.hasOwnProperty("markers"))throw new Error("El índice `markers`, no está incluido en las opciones.");if(null==e.markers)throw new Error("El listado de eventos es incorrecto.");return!0},render:function(e){var t={containerId:"#calendar-container",templateId:"#month-tpl",allowHTML:!1,lang:"es",holidays_type:{inamovible:"primary",trasladable:"success",no_laborable:"nl",turistico:"turistico"}},e=Object.assign({},t,e);if(this.availableLanguages=Object.keys(this.dictionary),this.allowHTML=e.allowHTML,this.holidayType=e.holidays_type,this.calendarYear=e.calendarYear,this.ln=(this.availableLanguages.includes(e.lang)?e:t).lang,this.container=document.querySelector(e.containerId),this.container.innerHTML="",!this.container)throw new Error("No se encuentra la etiqueta con el id: "+e.containerId);if(this.template=document.querySelector(e.templateId),!this.template)throw new Error("No se encuentra la plantilla con id: "+e.templateId);this.validateMarkers(e),this.inputMarkers=this.isMultiLang(e.markers)?e.markers[this.ln]:e.markers[0],this.inputMarkers.forEach(e=>this.isValidEntry(e)),this.markers=this.oerderByDate(this.inputMarkers),this.dict=this.dictionary[this.ln],this.daysLeft(),this.renderCalendar()},eventsByMonth(a,r){if(!isNaN(Number(a))&&!isNaN(Number(r))&&!(a<0||12<a))return this.markers.filter(e=>{var{markerMonth:e,markerYear:t}=this.parseDate(e.date);return e==a&&t==r})},renderCalendar:function(){for(var e in[...Array(12).keys()]){var t=this.tZone(new Date(this.calendarYear,e,1,12,0,0),this.timeZone),a=this.template.content.cloneNode(!0),t=this.drawCalendarMonth(t,e,a);this.container.appendChild(t)}},createWeekDays(){var e,t=document.createElement("tr");for(e of this.dict.weekDaysAbbr){var a=document.createElement("th");a.setAttribute("scope","col"),a.textContent=e,t.appendChild(a)}return t},drawCalendarMonth:function(e,t,a){var r=e.getDay(),n=e.getDate(),e=e.getFullYear();const i=this.daysOfMonth[t];var o=this.dict.months[t],s=a.querySelector(".js-tpl-id");s.lang=this.ln,s.id="m"+o,a.querySelector(".js-table").lang=this.ln,a.querySelector(".js-tpl-caption").textContent=this.dict.calendarCaption.replace("{month}",o),a.querySelector(".js-tpl-month").textContent=o;a.querySelector(".js-tpl-weekdays").appendChild(this.createWeekDays()),1===t&&(e%100!=0&&e%4==0||e%400==0)&&(i=29);var l,s=this.eventsByMonth(parseInt(t)+1,e),d=(0<s.length&&((d=document.createElement("i")).classList.add("nh-icon","universal-access"),d.setAttribute("aria-hidden","true"),(l=document.createElement("a")).classList.add("sr-only","sr-only-focusable"),l.setAttribute("tabindex","0"),l.href="#feriados-"+(parseInt(t)+1),l.lang=this.ln,o=this.dict.jumpToList.replace("{month}",o),l.innerHTML=d.outerHTML+" "+o,(d=document.createElement("p")).className="jump-to-list",d.appendChild(l),a.querySelector(".js-jump-to-list").appendChild(d),o=a.querySelector(".js-tpl-holidays"),l=this.addLabel(t,e))&&o.appendChild(l),this.getCalendarStart(r,n));return this.renderMonth(a,d,i,s),a},renderMonth:function(e,t,a,r){var n=Array(42).fill(!1);let i=1;for(let e=t;e<t+a&&e<42;e++)n[e]=i,i++;var o=[];for(let e=0;e<n.length;e+=7)o.push(n.slice(e,e+7));var s,l=e.querySelector(".js-tpl-tbody");for(s of o){var d=this.drawCalendarRow(s,r);l.appendChild(d)}},drawCalendarRow:function(e,t){var a=t.map(e=>{var t,a;if(e)return t=e.type,{markerDayInt:e,markerMonthInt:a}=this.parseDate(e.date),[e,t,a]}),r=document.createElement("tr");for(let t of e){var n,i,o,s,l,d=document.createElement("td");t?((n=a.find(e=>e[0]===t))?([n,i,o]=n,l=this.dict.dayAnchor.replace("{month}",this.dict.months[o-1]).replace("{day}",n),(s=document.createElement("a")).href=`#feriado-${t}-`+o,s.setAttribute("tabindex","0"),s.setAttribute("aria-label",l),s.id=`feriado-cal-${t}-`+o,s.lang=this.ln,s.textContent=n,(l=document.createElement("mark")).classList.add("bg-transparent"),l.appendChild(s),d.classList.add("bg-"+this.holidayType[i]),d.appendChild(l)):d.innerHTML=t,r.appendChild(d)):(d.innerHTML=" ",r.appendChild(d))}return r},getCalendarStart:function(e,t){if(!(!Number.isInteger(e)||e<0||6<e)&&(Number.isInteger(t)&&!(t<=0)))return(e-(t-1)%7+7)%7},addLabel:function(e,t){if(!isNaN(Number(e))){t=this.eventsByMonth(parseInt(e)+1,t);if(!t)return[];var a,r=t.reduce((e,t)=>(e[t.label]?e[t.label].push(t):e[t.label]=[t],e),{}),n=document.createElement("ul");n.lang=this.ln,n.setAttribute("tabindex","0"),n.classList.add("holidays","list-unstyled"),n.id="feriados-"+(parseInt(e)+1);for(a of Object.keys(r)){var i=r[a],{label:o,type:s}=i[0],o=o.endsWith(".")?o:o+".",s=this.dict.holidaysType[s],i=i.map(e=>{var{markerDayInt:e,markerMonthInt:t}=this.parseDate(e.date),a=this.dict.dayAnchor.replace("{month}",this.dict.months[t-1]).replace("{day}",e),r=document.createElement("span");return r.textContent=e,r.setAttribute("aria-label",a),r.id=`feriado-${e}-`+t,r.outerHTML}).join(", ")+". ",s='<span class="sr-only">'+s+" — </span>",l=document.createElement("li");l.innerHTML=i+s,this.allowHTML?l.insertAdjacentHTML("beforeend",o):(i=document.createTextNode(o),l.appendChild(i)),n.appendChild(l)}return n}},dayCount:function(e,t){t=Math.abs(t.getTime()-e.getTime());return Math.ceil(t/864e5)},daysLeft:function(){let r=this.tZone(new Date,this.timeZone);var e=document.querySelectorAll("#js-hoynoes"),n=document.querySelectorAll("#js-hoyes"),i=document.querySelectorAll("#js-faltan"),o=document.querySelectorAll("#js-proximo"),s=document.querySelectorAll(".js-detalle");let l=0;if(this.calendarYear!==r.getFullYear())e.forEach(e=>e.classList.add("hidden")),n.forEach(e=>e.classList.add("hidden"));else{var d=this.markers.find(e=>{var{date:e,type:t}=e,e=this.parseDate(e).dateObject;return r.getDate()==e.getDate()&&r.getMonth()==e.getMonth()&&"no_laborable"!==t}),c=this.markers.find(e=>{var{date:e,type:t}=e,e=this.parseDate(e).dateObject;return r<e&&"no_laborable"!==t});if(c&&0<Object.keys(c).length&&!d){var{date:c,label:h}=c,{markerDay:c,markerMonth:u,markerYear:m}=this.parseDate(c),m=this.tZone(new Date(m,u-1,c),this.timeZone),u=(l=this.dayCount(r,m),i.forEach(e=>e.innerHTML=l),m.getDate()),c=this.dict.months[m.getMonth()];let t=this.dict.nextHoliday.replace("{day}",u).replace("{month}",c).replace("{year}",m.getFullYear()),a=(o.forEach(e=>{e.innerHTML=t,e.lang=this.ln}),document.createElement("a"));a.href=`#feriado-cal-${u}-`+(m.getMonth()+1),a.textContent=h,s.forEach(e=>e.innerHTML=a.outerHTML)}if(d&&0<Object.keys(d).length){i=d.label,c=a=this.parseDate(d.date);n.forEach(e=>{e.classList.remove("hidden"),e.removeAttribute("aria-hidden")}),e.forEach(e=>{e.classList.add("hidden"),e.setAttribute("aria-hidden","true")});let t=document.createElement("a");t.href="#feriado-cal-"+c.markerDayInt+"-"+c.markerMonthInt,t.textContent=i,s.forEach(e=>e.appendChild(t))}1==l?this.toggleText("text-singular",this.ln):this.toggleText("text-plural",this.ln),this.toggleText("text",this.ln)}}};"undefined"!=typeof exports&&(module.exports={calendar:calendar});