UNPKG

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 10.2 kB
let calendar={orderByDate(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))throw new TypeError("Se espera un objeto Date()");let a=new Intl.DateTimeFormat("en-US",{timeZone:t,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).formatToParts(e);t=t=>a.find(e=>e.type===t).value;return new Date(Date.UTC(parseInt(t("year")),parseInt(t("month"))-1,parseInt(t("day")),parseInt(t("hour")),parseInt(t("minute")),parseInt(t("second"))))},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.ln=(this.availableLanguages.includes(e.lang)?e:t).lang,this.allowHTML=e.allowHTML,this.holidayType=e.holidays_type,this.calendarYear=e.calendarYear,this.dict=this.dictionary[this.ln],this.container=document.querySelector(e.containerId),!this.container)throw new Error("No se encuentra la etiqueta con el id: "+e.containerId);if(this.container.innerHTML="",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.orderByDate(this.inputMarkers),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 s=this.dict.months[t],o=a.querySelector(".js-tpl-id");o.lang=this.ln,o.id="m"+s,a.querySelector(".js-table").lang=this.ln;a.querySelector(".js-tpl-caption").textContent=this.dict.calendarCaption.replace("{month}",s);o=a.querySelector(".js-tpl-month");o.textContent=s,o.id="mes-"+s.toLowerCase();a.querySelector(".js-tpl-weekdays").appendChild(this.createWeekDays()),1===t&&(e%100!=0&&e%4==0||e%400==0)&&(i=29);var l,o=this.eventsByMonth(parseInt(t)+1,e),d=(0<o.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,s=this.dict.jumpToList.replace("{month}",s),l.innerHTML=d.outerHTML+" "+s,(d=document.createElement("p")).className="jump-to-list",d.appendChild(l),a.querySelector(".js-jump-to-list").appendChild(d),s=a.querySelector(".js-tpl-holidays"),l=this.addLabel(t,e))&&s.appendChild(l),this.getCalendarStart(r,n));return this.renderMonth(a,d,i,o),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 s=[];for(let e=0;e<n.length;e+=7)s.push(n.slice(e,e+7));var o,l=e.querySelector(".js-tpl-tbody");for(o of s){var d=this.drawCalendarRow(o,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,s,o,l,d=document.createElement("td");t?((n=a.find(e=>e[0]===t))?([n,i,s]=n,l=this.dict.dayAnchor.replace("{month}",this.dict.months[s-1]).replace("{day}",n),(o=document.createElement("a")).href=`#feriado-${t}-`+s,o.setAttribute("tabindex","0"),o.setAttribute("aria-label",l),o.id=`feriado-cal-${t}-`+s,o.lang=this.ln,o.textContent=n,(l=document.createElement("mark")).classList.add("bg-transparent"),l.appendChild(o),d.classList.add("bg-"+this.holidayType[i]),d.appendChild(l)):d.innerHTML=t,r.appendChild(d)):(d.innerHTML="&nbsp;",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:s,type:o}=i[0],s=s.endsWith(".")?s:s+".",o=this.dict.holidaysType[o],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(", ")+". ",o='<span class="sr-only">'+o+"&nbsp;—&nbsp;</span>",l=document.createElement("li");l.innerHTML=i+o,this.allowHTML?l.insertAdjacentHTML("beforeend",s):(i=document.createTextNode(s),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"),a=document.querySelectorAll("#js-hoyes"),n=document.querySelectorAll("#js-faltan"),i=document.querySelectorAll("#js-proximo"),s=document.querySelectorAll(".js-detalle");let o=0;if(this.calendarYear!==r.getFullYear())e.forEach(e=>e.classList.add("hidden")),a.forEach(e=>e.classList.add("hidden"));else{var l=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}),d=this.markers.find(e=>{var{date:e,type:t}=e,e=this.parseDate(e).dateObject;return r<e&&"no_laborable"!==t});if(d&&0<Object.keys(d).length&&!l){var{date:d,label:h}=d,{markerDay:d,markerMonth:c,markerYear:u}=this.parseDate(d),u=this.tZone(new Date(u,c-1,d),this.timeZone),c=(o=this.dayCount(r,u),n.forEach(e=>e.innerHTML=o),u.getUTCDate()),d=this.dict.months[u.getUTCMonth()];let t=this.dict.nextHoliday.replace("{day}",c).replace("{month}",d).replace("{year}",u.getFullYear()),a=(i.forEach(e=>{e.innerHTML=t,e.lang=this.ln}),document.createElement("a"));a.href="#mes-"+d.toLowerCase(),a.textContent=h,s.forEach(e=>{e&&(e.innerHTML=a.outerHTML)})}if(l&&0<Object.keys(l).length){n=l.label,c=this.parseDate(l.date),u=this.dict.months[c.markerMonthInt];a.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="#mes-"+u.toLowerCase(),t.textContent=n,s.forEach(e=>{e&&(e.innerHTML=t.outerHTML)})}1===o?this.toggleText("text-singular",this.ln):this.toggleText("text-plural",this.ln),this.toggleText("text",this.ln)}}};"undefined"!=typeof exports&&(module.exports={calendar:calendar});