255 lines
6.6 KiB
JavaScript
255 lines
6.6 KiB
JavaScript
(function (window, document) {
|
|
"use strict";
|
|
|
|
var api = window.SIGBitacora = window.SIGBitacora || {};
|
|
|
|
window.SIGBitacoraFeed = api;
|
|
|
|
function hasClass(element, className) {
|
|
return element &&
|
|
element.classList &&
|
|
element.classList.contains(className);
|
|
}
|
|
|
|
function findToggle(element, container) {
|
|
var current = element;
|
|
|
|
while (current && current !== container) {
|
|
if (hasClass(current, "js-sig-bitacora-toggle")) {
|
|
return current;
|
|
}
|
|
|
|
current = current.parentNode;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
function getControlledPanel(toggle, container) {
|
|
var panelId = toggle.getAttribute("aria-controls");
|
|
var panel;
|
|
|
|
if (!panelId) {
|
|
return null;
|
|
}
|
|
|
|
panel = document.getElementById(panelId);
|
|
|
|
if (!panel ||
|
|
!hasClass(panel, "sig-bitacora-details") ||
|
|
!container.contains(panel)) {
|
|
return null;
|
|
}
|
|
|
|
return panel;
|
|
}
|
|
|
|
function setExpanded(toggle, panel, expanded) {
|
|
var label = toggle.querySelector(
|
|
".sig-bitacora-detail-toggle-label");
|
|
|
|
toggle.setAttribute(
|
|
"aria-expanded",
|
|
expanded ? "true" : "false");
|
|
toggle.setAttribute(
|
|
"title",
|
|
expanded
|
|
? "Ocultar el detalle del movimiento"
|
|
: "Mostrar el detalle del movimiento");
|
|
|
|
if (label) {
|
|
label.textContent = expanded
|
|
? "Ocultar detalle"
|
|
: "Ver detalle";
|
|
}
|
|
|
|
panel.hidden = !expanded;
|
|
panel.setAttribute(
|
|
"aria-hidden",
|
|
expanded ? "false" : "true");
|
|
}
|
|
|
|
function toggleDetails(toggle, container) {
|
|
var panel = getControlledPanel(toggle, container);
|
|
var expanded;
|
|
|
|
if (!panel) {
|
|
return;
|
|
}
|
|
|
|
expanded = toggle.getAttribute("aria-expanded") === "true";
|
|
setExpanded(toggle, panel, !expanded);
|
|
}
|
|
|
|
function isActivationKey(event) {
|
|
var key = event.key;
|
|
var keyCode = event.which || event.keyCode;
|
|
|
|
return key === "Enter" ||
|
|
key === " " ||
|
|
key === "Spacebar" ||
|
|
keyCode === 13 ||
|
|
keyCode === 32;
|
|
}
|
|
|
|
function hasNativeKeyboardActivation(element, event) {
|
|
var tagName = element.tagName;
|
|
var key = event.key;
|
|
var keyCode = event.which || event.keyCode;
|
|
|
|
if (tagName === "BUTTON" || tagName === "INPUT") {
|
|
return true;
|
|
}
|
|
|
|
return tagName === "A" &&
|
|
element.hasAttribute("href") &&
|
|
(key === "Enter" || keyCode === 13);
|
|
}
|
|
|
|
function synchronizeToggle(toggle, container) {
|
|
var panel = getControlledPanel(toggle, container);
|
|
var ariaExpanded;
|
|
var expanded;
|
|
|
|
if (!panel) {
|
|
toggle.setAttribute("aria-expanded", "false");
|
|
return;
|
|
}
|
|
|
|
ariaExpanded = toggle.getAttribute("aria-expanded");
|
|
|
|
if (ariaExpanded === "true") {
|
|
expanded = true;
|
|
} else if (ariaExpanded === "false") {
|
|
expanded = false;
|
|
} else {
|
|
expanded = !panel.hidden;
|
|
}
|
|
|
|
setExpanded(toggle, panel, expanded);
|
|
}
|
|
|
|
function initializeContainer(container) {
|
|
var toggles;
|
|
var index;
|
|
|
|
if (container.getAttribute(
|
|
"data-sig-bitacora-initialized") === "1") {
|
|
return;
|
|
}
|
|
|
|
toggles = container.querySelectorAll(
|
|
".js-sig-bitacora-toggle");
|
|
|
|
for (index = 0; index < toggles.length; index += 1) {
|
|
synchronizeToggle(toggles[index], container);
|
|
}
|
|
|
|
container.addEventListener("click", function (event) {
|
|
var toggle = findToggle(event.target, container);
|
|
|
|
if (!toggle) {
|
|
return;
|
|
}
|
|
|
|
toggleDetails(toggle, container);
|
|
});
|
|
|
|
container.addEventListener("keydown", function (event) {
|
|
var toggle = findToggle(event.target, container);
|
|
|
|
if (!toggle ||
|
|
!isActivationKey(event) ||
|
|
event.repeat ||
|
|
hasNativeKeyboardActivation(toggle, event)) {
|
|
return;
|
|
}
|
|
|
|
event.preventDefault();
|
|
toggleDetails(toggle, container);
|
|
});
|
|
|
|
container.setAttribute(
|
|
"data-sig-bitacora-initialized",
|
|
"1");
|
|
}
|
|
|
|
function collectContainers(root) {
|
|
var containers = [];
|
|
var descendants;
|
|
var index;
|
|
|
|
if (!root) {
|
|
return containers;
|
|
}
|
|
|
|
if (root.nodeType === 1 &&
|
|
hasClass(root, "js-sig-bitacora")) {
|
|
containers.push(root);
|
|
}
|
|
|
|
if (!root.querySelectorAll) {
|
|
return containers;
|
|
}
|
|
|
|
descendants = root.querySelectorAll(
|
|
".js-sig-bitacora:not([data-sig-bitacora-initialized=\"1\"])");
|
|
|
|
for (index = 0; index < descendants.length; index += 1) {
|
|
containers.push(descendants[index]);
|
|
}
|
|
|
|
return containers;
|
|
}
|
|
|
|
api.initialize = function (root) {
|
|
var containers = collectContainers(root || document);
|
|
var index;
|
|
|
|
for (index = 0; index < containers.length; index += 1) {
|
|
initializeContainer(containers[index]);
|
|
}
|
|
};
|
|
|
|
api.collapseAll = function (containerReference) {
|
|
var container = typeof containerReference === "string"
|
|
? document.querySelector(containerReference)
|
|
: containerReference;
|
|
var toggles;
|
|
var panel;
|
|
var index;
|
|
|
|
if (!container ||
|
|
!hasClass(container, "js-sig-bitacora")) {
|
|
return;
|
|
}
|
|
|
|
toggles = container.querySelectorAll(
|
|
".js-sig-bitacora-toggle");
|
|
|
|
for (index = 0; index < toggles.length; index += 1) {
|
|
panel = getControlledPanel(toggles[index], container);
|
|
|
|
if (panel) {
|
|
setExpanded(toggles[index], panel, false);
|
|
}
|
|
}
|
|
};
|
|
|
|
if (window.SIG_BITACORA_INITIALIZATION_BRIDGE_REGISTERED !== true) {
|
|
window.SIG_BITACORA_INITIALIZATION_BRIDGE_REGISTERED = true;
|
|
|
|
if (window.Sys && Sys.Application) {
|
|
Sys.Application.add_load(function () {
|
|
api.initialize(document);
|
|
});
|
|
} else if (document.readyState === "loading") {
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
api.initialize(document);
|
|
});
|
|
} else {
|
|
api.initialize(document);
|
|
}
|
|
}
|
|
}(window, document));
|