@cimo/jsmvcfw
Version:
Javascript mvc framework. Light, fast and secure.
109 lines • 4.24 kB
JavaScript
import { getUrlRoot, getControllerList, renderTemplate, renderAfter, frameworkReset } from "./JsMvcFw.js";
let routeList = [];
let controller;
const cleanUrl = (urlNext) => {
const [path, queryString] = urlNext.split("?");
const queryStringCleanedList = [];
if (queryString) {
const queryStringList = queryString.split("&");
for (let a = 0; a < queryStringList.length; a++) {
const param = queryStringList[a];
const [key, value] = param.split("=");
const keyCleaned = encodeURIComponent(decodeURIComponent(key.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'")));
if (value) {
const valueCleaned = encodeURIComponent(decodeURIComponent(value.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'")));
queryStringCleanedList.push(`${keyCleaned}=${valueCleaned}`);
}
else {
queryStringCleanedList.push(keyCleaned);
}
}
}
const pathCleaned = path.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
const urlCleaned = pathCleaned + (queryStringCleanedList.length > 0 ? "?" + queryStringCleanedList.join("&") : "");
return urlCleaned;
};
const historyPush = (urlNext, parameterObject, parameterSearch, title = "") => {
const data = {
urlPrevious: window.location.pathname,
parameterObject,
parameterSearch
};
window.history.pushState(data, title, cleanUrl(urlNext));
};
const deleteController = () => {
if (controller) {
const controllerList = getControllerList();
for (let a = controllerList.length - 1; a >= 0; a--) {
for (const children of controllerList[a].childrenList) {
children.destroy();
}
}
controller.destroy();
}
};
const deleteTrail = (value) => {
return value.endsWith("/") && value.length > 1 ? value.slice(0, -1) : value;
};
const populatePage = (urlNext, isSoft, parameterObject, parameterSearch) => {
if (!isSoft) {
if (parameterSearch) {
window.location.search = parameterSearch;
}
window.location.href = cleanUrl(urlNext);
}
else {
let isNotFound = true;
const urlNextTrail = deleteTrail(urlNext);
for (const route of routeList) {
const routePathTrail = deleteTrail(`${getUrlRoot()}${route.path}`);
if (routePathTrail === urlNextTrail) {
isNotFound = false;
frameworkReset();
historyPush(urlNextTrail, parameterObject, parameterSearch, route.title);
document.title = route.title;
deleteController();
controller = route.controller();
renderTemplate(controller, undefined, () => {
controller.event();
renderAfter(controller).then(() => {
controller.rendered();
});
});
break;
}
}
if (isNotFound) {
historyPush(`${getUrlRoot()}/404`, parameterObject, parameterSearch, "404");
document.title = "404";
const elementRoot = document.getElementById("jsmvcfw_app");
if (elementRoot) {
elementRoot.innerHTML = "Route not found!";
}
}
}
};
export const route = (routeListValue) => {
routeList = routeListValue;
window.onload = (event) => {
if (event) {
populatePage(window.location.pathname, true);
}
};
window.onpopstate = (event) => {
const data = event.state;
if (data.urlPrevious) {
populatePage(data.urlPrevious, true);
}
else {
populatePage(window.location.pathname, true);
}
};
window.onbeforeunload = () => {
deleteController();
};
};
export const navigateTo = (urlNext, isSoft = true, parameterObject, parameterSearch) => {
populatePage(urlNext, isSoft, parameterObject, parameterSearch);
};
//# sourceMappingURL=JsMvcFwRoute.js.map