blob: d1a3b41b926d9f43447b26657fdd0a751bed4cde [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
window.Sling = window.Sling || {};
const {
Sling,
} = window;
window.Sling.CMS = {
handlers: {
handledelete(res, msg) {
if (window.location.pathname.indexOf(res.path) !== -1) {
window.top.Sling.CMS.ui.confirmMessage(msg, res.title, () => {
window.location = '/cms';
});
} else {
Sling.CMS.ui.confirmReload(res, msg);
}
},
handlemove(res, msg) {
const changes = res.changes[0];
if (changes.type === 'moved' && window.location.pathname.indexOf(changes.argument[0]) !== -1) {
window.top.Sling.CMS.ui.confirmMessage(msg, res.title, () => {
window.location = window.location.href.replace(changes.argument[0], changes.argument[1]);
});
} else {
Sling.CMS.ui.confirmReload(res, msg);
}
},
handleugc(res, msg) {
Sling.CMS.ui.confirmMessage(msg, res.title, () => {
window.location = `/cms/usergenerated/content.html${res.parentLocation}`;
});
},
},
ui: {
confirmMessage(title, message, complete) {
const modal = document.createElement('div');
modal.innerHTML = `<div class="modal-background"></div><div class="is-draggable modal-content"><div class="box"><h3 class="modal-title">${title}</h3><p>${message}</p><br/><button type="button" class="close-modal button is-primary">OK</button></div></div><button class="modal-close is-large" aria-label="close"></button>`;
document.body.appendChild(modal);
modal.classList.add('modal');
modal.classList.add('is-active');
modal.querySelectorAll('.modal-close,.close-modal,.modal-background').forEach((closer) => {
closer.addEventListener('click', () => {
modal.remove();
complete();
});
});
modal.querySelector('.delete,.close-modal').focus();
return modal;
},
confirmReload(res, msg) {
if (window.self !== window.top) {
window.top.Sling.CMS.ui.confirmMessage(msg, res.title, () => {
window.top.location.reload();
});
} else {
Sling.CMS.ui.confirmMessage(msg, res ? res.title : '', () => {
Sling.CMS.ui.reloadContext();
});
}
},
confirmReloadComponent(res, msg, path) {
window.top.Sling.CMS.ui.confirmMessage(msg, res.title, () => {
const modal = window.top.Sling.CMS.ui.loaderModal();
window.parent.window.CMSEditor.ui.reloadComponent(path, () => {
modal.remove();
});
});
},
loaderModal() {
const modal = document.createElement('div');
modal.classList.add('modal');
modal.innerHTML = `<div class="modal-background"></div><div class="loader is-loading"></div>`;
document.querySelector('body').appendChild(modal);
modal.classList.add('is-active');
return modal;
},
reloadContext() {
// close all existing modals
document.querySelectorAll('.modal').forEach((modal) => {
modal.remove();
});
// reset the actions
document.querySelectorAll('.actions-target *').forEach((child) => {
child.remove();
});
const containers = document.querySelectorAll('.reload-container');
const modal = Sling.CMS.ui.loaderModal();
let count = containers.length;
if (count !== 0) {
containers.forEach(async (container) => {
let link = container.dataset.path;
if (link.indexOf('?') === -1) {
link += `?tstamp=${Date.now()}`;
} else {
link += `&tstamp=${Date.now()}`;
}
const response = await fetch(link);
if (Sling.CMS.utils.ok(response)) {
const responseText = await response.text();
const tmp = document.createElement('div');
tmp.innerHTML = responseText;
container.replaceWith(tmp.querySelector('.reload-container'));
tmp.remove();
count -= 1;
if (count === 0) {
modal.remove();
}
}
});
} else {
window.location.reload();
}
},
},
utils: {
form2Obj(form) {
const data = {};
form.querySelectorAll('input,textarea,select').forEach((f) => {
if (!f.disabled && f.name) {
data[f.name] = f.value;
}
});
return data;
},
ok(response) {
let { CMS } = Sling;
if (window.self !== window.top) {
CMS = window.top.Sling.CMS;
}
if (response.redirected && response.url.indexOf('/system/sling/form/login?resource=') !== -1) {
CMS.ui.confirmMessage('301', 'Not logged in, please login again', () => {
window.location = `/system/sling/form/login?resource=${encodeURIComponent(window.location)}`;
});
return false;
}
if (!response.ok) {
CMS.ui.confirmMessage(response.status, response.statusText, () => {
window.location = response.url;
});
return false;
}
return true;
},
},
};
if (window.performance
&& window.performance.navigation.type
=== window.performance.navigation.TYPE_BACK_FORWARD) {
Sling.CMS.ui.reloadContext();
}
window.onbeforeunload = () => {
if (document.querySelector('.modal form')) {
return 'Are you sure you want to leave this page?';
}
return null;
};
if (document.querySelector('.breadcrumb .is-active') !== null) {
const itemTitle = document.querySelector('.breadcrumb .is-active').textContent.trim();
if (itemTitle.length > 0) {
document.title = `${itemTitle} :: ${document.title}`;
}
}
rava.bind('.sling-cms-include-config', {
callbacks: {
created() {
const container = this;
async function loadContent() {
const srcEl = document.querySelector(container.dataset.source);
const {
config,
} = srcEl.selectedOptions[0].dataset;
if (config) {
const response = await fetch(config + container.closest('form').attributes.action.value);
if (Sling.CMS.utils.ok(response)) {
const markup = await response.text();
container.innerHTML = markup;
}
window.parent.parent.postMessage({
action: 'slingcms.openmodal',
url: link,
title,
}, window.location.origin);
}
}
document.querySelector(container.dataset.source).addEventListener('change', loadContent);
loadContent();
},
},
});