You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

287 lines
7.2 KiB

1 year ago
<?php
/*
** Zabbix
** Copyright (C) 2001-2023 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
/**
* @var CView $this
*/
?>
window.popup_import = new class {
constructor() {
this.overlay = null;
this.dialogue = null;
this.form = null;
}
init() {
this.overlay = overlays_stack.getById('popup_import');
this.dialogue = this.overlay.$dialogue[0];
this.form = this.overlay.$dialogue.$body[0].querySelector('form');
this.warningListeners();
this.advancedConfigurationListeners();
}
warningListeners() {
const rules_images = document.getElementById('rules_images_updateExisting')
if (rules_images) {
rules_images.addEventListener('change', (e) => {
this.updateWarning(e.target, <?= json_encode(_('Images for all maps will be updated!')) ?>)
})
}
}
advancedConfigurationListeners() {
const advanced_configuration = document.getElementById('advanced_options');
if (!advanced_configuration) {
return;
}
advanced_configuration.addEventListener('change', () => {
this.form.querySelectorAll('.js-advanced-configuration').forEach((e) => {
return e.classList.toggle("display-none");
});
});
document
.getElementById('update_all')
.addEventListener('change', () => { this.toggleCheckboxColumn('update')})
document
.getElementById('create_all')
.addEventListener('change', () => { this.toggleCheckboxColumn('create')})
document
.getElementById('delete_all')
.addEventListener('change', () => { this.toggleCheckboxColumn('delete')})
this.form.addEventListener('change', (e) => {
if (e.target.classList.contains('js-delete')) {
this.updateMainCheckbox('delete');
}
else if (e.target.classList.contains('js-create')) {
this.updateMainCheckbox('create');
}
else if (e.target.classList.contains('js-update')) {
this.updateMainCheckbox('update');
}
})
}
submitPopup() {
if (document.getElementById('rules_preset').value === 'template') {
return this.openImportComparePopup();
}
if (this.isDeleteMissingChecked()) {
return this.confirmSubmit();
}
return this.submitImportPopup();
}
isDeleteMissingChecked() {
return this.form.querySelectorAll('.js-delete:checked').length > 0;
}
confirmSubmit(compare_overlay) {
overlayDialogue({
class: 'position-middle',
content: document.createElement('span')
.innerText = (<?= json_encode(_('Delete all elements that are not present in the import file?')) ?>),
buttons: [
{
title: <?= json_encode(_('OK')) ?>,
focused: true,
action: function() {
if (compare_overlay !== undefined) {
overlayDialogueDestroy(compare_overlay.dialogueid);
}
popup_import.submitImportPopup();
}
},
{
title: <?= json_encode(_('Cancel')) ?>,
cancel: true,
class: '<?= ZBX_STYLE_BTN_ALT ?>',
action: function() {
(compare_overlay || popup_import.overlay).unsetLoading();
return true;
}
}
]
}, (compare_overlay || this.overlay).$btn_submit);
}
openImportComparePopup() {
const url = new Curl('zabbix.php');
url.setArgument('action', 'popup.import.compare');
fetch(url.getUrl(), {
method: 'post',
body: new FormData(this.form)
})
.then((response) => response.json())
.then((response) => {
if ('error' in response) {
throw {error: response.error};
}
overlayDialogue({
title: response.header,
class: response.no_changes ? 'position-middle' : 'modal-popup modal-popup-fullscreen',
dialogueid: 'popup_import_compare',
content: response.body,
buttons: response.buttons,
script_inline: response.script_inline,
debug: response.debug
}, this.overlay.$btn_submit);
})
.catch((exception) => {
document.getElementById('import_file').value = '';
const msg_bad = this.dialogue.querySelector('.<?= ZBX_STYLE_MSG_BAD ?>');
if (msg_bad) {
msg_bad.remove();
}
let title, messages;
if (typeof exception === 'object' && 'error' in exception) {
title = exception.error.title;
messages = exception.error.messages;
}
else {
messages = [<?= json_encode(_('Unexpected server error.')) ?>];
}
const message_box = makeMessageBox('bad', messages, title);
message_box.insertBefore(this.form);
})
.finally(() => {
this.overlay.unsetLoading();
});
}
submitImportPopup() {
const url = new Curl('zabbix.php');
url.setArgument('action', 'popup.import');
this.overlay.setLoading();
fetch(url.getUrl(), {
method: 'post',
body: new FormData(this.form)
})
.then((response) => response.json())
.then((response) => {
if ('error' in response) {
throw {error: response.error};
}
postMessageOk(response.success.title);
if ('messages' in response.success) {
postMessageDetails('success', response.success.messages);
}
overlayDialogueDestroy(this.overlay.dialogueid);
location.href = location.href.split('#')[0];
})
.catch((exception) => {
document.getElementById('import_file').value = '';
const msg_bad = this.dialogue.querySelector('.<?= ZBX_STYLE_MSG_BAD ?>');
if (msg_bad) {
msg_bad.remove();
}
let title, messages;
if (typeof exception === 'object' && 'error' in exception) {
title = exception.error.title;
messages = exception.error.messages;
}
else {
messages = [<?= json_encode(_('Unexpected server error.')) ?>];
}
const message_box = makeMessageBox('bad', messages, title);
message_box.insertBefore(this.form);
})
.finally(() => {
this.overlay.unsetLoading();
});
}
updateWarning(obj, content) {
if (obj.checked) {
overlayDialogue({
class: 'position-middle',
content: document.createElement('span').innerText = content,
buttons: [
{
title: <?= json_encode(_('OK')) ?>,
focused: true,
action: function() {}
},
{
title: <?= json_encode(_('Cancel')) ?>,
cancel: true,
class: '<?= ZBX_STYLE_BTN_ALT ?>',
action: function() {
obj.checked = false;
}
}
]
}, obj);
}
}
updateMainCheckbox(action) {
const all_checkbox = document.getElementById(action + '_all');
all_checkbox.checked = true;
this.form.querySelectorAll('.js-' + action).forEach(function (checkbox) {
if (!checkbox.checked) {
all_checkbox.checked = false;
}
})
}
toggleCheckboxColumn(action) {
const check = document.getElementById(action + '_all').checked;
this.form.querySelectorAll('.js-' + action).forEach(function (checkbox) {
if (checkbox.checked !== check) {
checkbox.checked = check;
}
});
}
}