Merge branch 'ent-4822-estado-de-consola-visual-mantenimiento' into 'develop'

add mode maintenance VC pandora_enterprise#4822

See merge request artica/pandorafms!5191
This commit is contained in:
Daniel Rodriguez 2022-10-31 10:02:44 +00:00
commit 41946bfda7
23 changed files with 309 additions and 39 deletions

View File

@ -1,5 +1,7 @@
START TRANSACTION;
ALTER TABLE `tlayout` ADD COLUMN `maintenance_mode` TEXT;
ALTER TABLE `tusuario` ADD COLUMN `auth_token_secret` VARCHAR(45) DEFAULT NULL;
ALTER TABLE `tmodule_inventory` ADD COLUMN `script_mode` INT NOT NULL DEFAULT 2;

View File

@ -37,6 +37,7 @@ $ajax = true;
$render_map = (bool) get_parameter('render_map', false);
$graph_javascript = (bool) get_parameter('graph_javascript', false);
$force_remote_check = (bool) get_parameter('force_remote_check', false);
$update_maintanance_mode = (bool) get_parameter('update_maintanance_mode', false);
$load_css_cv = (bool) get_parameter('load_css_cv', false);
if ($render_map) {
@ -99,3 +100,29 @@ if ($load_css_cv === true) {
echo $output;
return;
}
if ($update_maintanance_mode === true) {
$idVisualConsole = (int) get_parameter('idVisualConsole', 0);
$mode = (bool) get_parameter('mode', false);
$values = [];
if ($mode === true) {
$values['maintenance_mode'] = json_encode(
[
'user' => $config['id_user'],
'timestamp' => time(),
]
);
} else {
$values['maintenance_mode'] = null;
}
$result = db_process_sql_update(
'tlayout',
$values,
['id' => $idVisualConsole]
);
echo json_encode(['result' => $result]);
return;
}

View File

@ -3708,6 +3708,8 @@ function visual_map_print_visual_map(
// End function
// Start function
/**
* Get a list with the layouts for a user.
*
@ -3719,8 +3721,6 @@ function visual_map_print_visual_map(
*
* @return array A list of layouts the user can see.
*/
function visual_map_get_user_layouts(
$id_user=0,
$only_names=false,
@ -3729,6 +3729,7 @@ function visual_map_get_user_layouts(
$favourite=false,
$check_user_groups=true
) {
$where = '';
if (! is_array($filter)) {
$filter = [];
} else {
@ -3819,17 +3820,19 @@ function visual_map_get_user_layouts(
$retval[$layout['id']] = $layout;
}
// add_perms
if (isset($groups[$layout['id_group']]['vconsole_view'])) {
$retval[$layout['id']]['vr'] = $groups[$layout['id_group']]['vconsole_view'];
}
if ($only_names === false) {
// Aad_perms.
if (isset($groups[$layout['id_group']]['vconsole_view'])) {
$retval[$layout['id']]['vr'] = $groups[$layout['id_group']]['vconsole_view'];
}
if (isset($groups[$layout['id_group']]['vconsole_edit'])) {
$retval[$layout['id']]['vw'] = $groups[$layout['id_group']]['vconsole_edit'];
}
if (isset($groups[$layout['id_group']]['vconsole_edit'])) {
$retval[$layout['id']]['vw'] = $groups[$layout['id_group']]['vconsole_edit'];
}
if (isset($groups[$layout['id_group']]['vconsole_management'])) {
$retval[$layout['id']]['vm'] = $groups[$layout['id_group']]['vconsole_management'];
if (isset($groups[$layout['id_group']]['vconsole_management'])) {
$retval[$layout['id']]['vm'] = $groups[$layout['id_group']]['vconsole_management'];
}
}
}

View File

@ -1386,6 +1386,12 @@ function dashboardLoadVC(settings) {
: "dashboard"
);
if (settings.props.maintenanceMode != null) {
if (settings.props.maintenanceMode.user !== settings.id_user) {
visualConsoleManager.visualConsole.enableMaintenanceMode();
}
}
if (settings.mobile_view_orientation_vc === true) {
$(window).on("orientationchange", function() {
$(container).width($(window).height());

View File

@ -117,6 +117,15 @@ function createVisualConsole(
visualConsole.updateElements(items);
}
if (
visualConsole.props.maintenanceMode != null &&
visualConsole.props.maintenanceMode.user !== id_user
) {
visualConsole.enableMaintenanceMode();
} else {
visualConsole.disableMaintenanceMode();
}
// Emit the VC update event.
if (onUpdate) onUpdate(prevProps, visualConsole.props);
} catch (ignored) {} // eslint-disable-line no-empty
@ -159,6 +168,7 @@ function createVisualConsole(
// Initialize the Visual Console.
try {
visualConsole = new VisualConsole(container, props, items);
// VC Item clicked.
visualConsole.onItemClick(function(e) {
var data = e.item.props || {};
@ -357,7 +367,6 @@ function createVisualConsole(
})
.init();
});
// VC Item resized.
visualConsole.onItemResized(function(e) {
var item = e.item;
@ -473,6 +482,11 @@ function createVisualConsole(
updateVisualConsole(visualConsole.props.id, interval, null, dimensions);
}
},
forceUpdateVisualConsole: function() {
asyncTaskManager.cancel("visual-console");
asyncTaskManager.cancel("visual-console-start");
updateVisualConsole(visualConsole.props.id);
},
createItem: function(typeString) {
var type;
switch (typeString) {

View File

@ -90,6 +90,7 @@ final class Container extends Model
'backgroundURL' => static::extractBackgroundUrl($data),
'relationLineWidth' => (int) $data['relationLineWidth'],
'hash' => static::extractHash($data),
'maintenanceMode' => static::extractMaintenanceMode($data),
];
}
@ -238,6 +239,45 @@ final class Container extends Model
}
/**
* Extract a background color value.
*
* @param array $data Unknown input data structure.
*
* @return mixed String representing the color (not empty) or null.
*/
private static function extractMaintenanceMode(array $data)
{
global $config;
$maintenance_mode = static::notEmptyStringOr(
static::issetInArray(
$data,
[
'maintenanceMode',
'maintenance_mode',
]
),
null
);
$result = null;
if ($maintenance_mode !== null) {
$result = json_decode($maintenance_mode, true);
$result['date'] = date(
$config['date_format'],
$result['timestamp']
);
$result['timestamp'] = human_time_description_raw(
(time() - $result['timestamp'])
);
}
return $result;
}
/**
* Extract the "is favorite" switch value.
*

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@ -7,6 +7,14 @@
margin-top: 5px;
}
.is-maintenance {
background-image: url(maintenanceMode.png) !important;
}
.is-maintenance :nth-child(1) {
display: none;
}
.visual-console-item {
position: absolute;
display: flex;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -358,6 +358,7 @@ class Visualmap
'uniq' => $uniq,
'mobile' => true,
'vcId' => $visualConsoleId,
'id_user' => $config['id_user'],
'mobile_view_orientation_vc' => (bool) !$config['mobile_view_orientation_vc'],
]
);

View File

@ -281,6 +281,12 @@ $visualConsoleItems = VisualConsole::getItemsFromDB(
"<?php echo get_parameter('hash', ''); ?>"
);
if(props.maintenanceMode != null) {
if(props.maintenanceMode.user !== '<?php echo $config['id_user']; ?>') {
visualConsoleManager.visualConsole.enableMaintenanceMode();
}
}
var controls = document.getElementById('vc-controls');
autoHideElement(controls, 1000);

View File

@ -33,7 +33,6 @@ global $config;
check_login();
require_once $config['homedir'].'/vendor/autoload.php';
// TODO: include file functions.
require_once $config['homedir'].'/include/functions_visual_map.php';
@ -103,6 +102,9 @@ $aclRead = (bool) check_acl_restricted_all($config['id_user'], $groupId, 'VR')
$aclWrite = (bool) check_acl_restricted_all($config['id_user'], $groupId, 'VW');
$aclManage = (bool) check_acl_restricted_all($config['id_user'], $groupId, 'VM');
// Maintenance Mode.
$maintenanceMode = $visualConsoleData['maintenanceMode'];
if ($aclRead === false && $aclWrite === false && $aclManage === false) {
db_pandora_audit(
AUDIT_LOG_ACL_VIOLATION,
@ -398,18 +400,54 @@ if ($pure === false) {
echo '</div>';
if ($aclWrite === true || $aclManage === true) {
if (!is_metaconsole()) {
echo '<a id ="force_check" href="" style="margin-right: 25px;">'.html_print_image(
echo '<div class="flex-row" style="width:220px;">';
if (is_metaconsole() === false) {
echo '<div id="force_check_control" class="flex-column">';
echo html_print_label(__('Force'), 'force-mode', true);
echo '<a id ="force_check" href="">';
echo html_print_image(
'images/target.png',
true,
[
'title' => __('Force remote checks'),
'class' => 'invert_filter',
]
).'</a>';
);
echo '</a>';
echo '</div>';
}
echo html_print_checkbox_switch('edit-mode', 1, false, true);
$disabled_edit_mode = false;
if ($aclManage === true) {
$value_maintenance_mode = true;
if ($maintenanceMode === null) {
$value_maintenance_mode = false;
} else {
if ($maintenanceMode['user'] !== $config['id_user']) {
$disabled_edit_mode = true;
}
}
echo '<div id="maintenance-mode-control" class="flex-column">';
echo html_print_label(
__('Maintenance'),
'maintenance-mode',
true
);
echo html_print_checkbox_switch(
'maintenance-mode',
1,
$value_maintenance_mode,
true
);
echo '</div>';
}
echo '<div id="edit-mode-control" class="flex-column">';
echo html_print_label(__('Edit'), 'edit-mode', true);
echo html_print_checkbox_switch('edit-mode', 1, false, true, $disabled_edit_mode);
echo '</div>';
echo '</div>';
}
echo '</div>';
@ -661,6 +699,18 @@ ui_require_css_file('form');
window.history.replaceState({}, document.title, href);
}
}
if(newProps.maintenanceMode != null) {
$('input[name=maintenance-mode]').prop('checked', true);
if(newProps.maintenanceMode.user !== '<?php echo $config['id_user']; ?>') {
$('input[name=edit-mode]').prop('disabled', true);
} else {
$('input[name=edit-mode]').prop('disabled', false);
}
} else {
$('input[name=maintenance-mode]').prop('checked', false);
$('input[name=edit-mode]').prop('disabled', false);
}
}
// Add the datetime when the item was received.
@ -676,26 +726,88 @@ ui_require_css_file('form');
items,
baseUrl,
<?php echo ($refr * 1000); ?>,
handleUpdate
handleUpdate,
false,
undefined,
'<?php echo $config['id_user']; ?>',
);
if(props.maintenanceMode != null) {
if(props.maintenanceMode.user !== '<?php echo $config['id_user']; ?>') {
visualConsoleManager.visualConsole.enableMaintenanceMode();
}
}
<?php
if ($edit_capable === true) {
?>
// Enable/disable the edition mode.
$('input[name=edit-mode]').change(function(event) {
var maintenanceMode = visualConsoleManager.visualConsole.props.maintenanceMode;
if ($(this).prop('checked')) {
visualConsoleManager.visualConsole.enableEditMode();
visualConsoleManager.changeUpdateInterval(0);
$('#force_check').hide();
$('#edit-controls').css('visibility', '');
} else {
visualConsoleManager.visualConsole.disableEditMode();
visualConsoleManager.visualConsole.unSelectItems();
visualConsoleManager.changeUpdateInterval(<?php echo ($refr * 1000); ?>); // To ms.
$('#edit-controls').css('visibility', 'hidden');
$('#force_check').show();
}
resetInterval();
});
// Enable/disable the maintenance mode.
$('input[name=maintenance-mode]').click(function(event) {
event.preventDefault();
const idVisualConsole = '<?php echo $visualConsoleId; ?>';
const mode = ($(this).prop('checked') === true) ? 1 : 0;
var maintenanceMode = visualConsoleManager.visualConsole.props.maintenanceMode;
var msg = '';
if(maintenanceMode == null) {
msg = '<?php echo __('Are you sure you wish to set the visual console in maintenance mode'); ?>';
msg += '?';
} else if (maintenanceMode.user === '<?php echo $config['id_user']; ?>') {
msg += '<?php echo __('Are you sure you wish to disable maintenance mode'); ?>';
msg += '?';
} else {
msg = '<?php echo __('The visual console was set to maintenance mode'); ?>';
msg += ' ' + '<span title="'+maintenanceMode.date+'">' + maintenanceMode.timestamp + '</span>';
msg += ' ' + '<?php echo __('ago by user'); ?>';
msg += ' ' + maintenanceMode.user;
msg += '. ' + '<?php echo __('Are you sure you wish to disable maintenance mode'); ?>';
msg += '?';
}
confirmDialog({
title: '<?php echo __('Maintenance mode'); ?>',
message: msg,
onAccept: function() {
$.ajax({
type: "POST",
url: "ajax.php",
dataType: "json",
data: {
page: "include/ajax/visual_console.ajax",
update_maintanance_mode: true,
idVisualConsole: idVisualConsole,
mode: mode
},
success: function (data) {
if(data.result) {
$('input[name=maintenance-mode]').prop('checked', mode);
$('input[name=maintenance-mode]').trigger('change');
resetInterval();
}
},
error: function (err) {
console.error(err);
}
});
}
});
});
<?php
}
@ -797,6 +909,7 @@ if ($edit_capable === true) {
function resetInterval() {
visualConsoleManager.changeUpdateInterval(<?php echo ($refr * 1000); ?>);
visualConsoleManager.forceUpdateVisualConsole();
}
/**

View File

@ -1678,6 +1678,7 @@ CREATE TABLE IF NOT EXISTS `tlayout` (
`background_color` VARCHAR(50) NOT NULL DEFAULT '#FFF',
`is_favourite` INT UNSIGNED NOT NULL DEFAULT 0,
`auto_adjust` INT UNSIGNED NOT NULL DEFAULT 0,
`maintenance_mode` TEXT,
PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4;

View File

@ -1335,18 +1335,18 @@ UPDATE `tnotification_source` SET `enabled`=1 WHERE `description` = 'System&#x20
--
INSERT INTO `tlayout`
VALUES
(1, 'Demo&#x20;visual console', 0, 'fondo.jpg', 1080, 1920, 'white', 0, 0),
(2,'Demo&#x20;visual console 2',0,'fondo-keep-alive.jpg',1080,1920,'#FFF',0, 0),
(3,'Worldmap',0,'map_world.jpg',1080,1920,'white',0, 0),
(4,'Europe',0,'map_europe_1.jpg',1080,1920,'white',0, 0),
(5,'USA',0,'map_USA.jpg',1080,1920,'white',0, 0),
(6,'Spain',0,'map_spain.jpg',1080,1920,'white',0, 0),
(7,'Madrid',0,'map_madrid.jpg',1080,1920,'white',0, 0),
(8,'Germany',0,'map_germany_1.jpg',1080,1920,'white',0, 0),
(9,'France',0,'map_france.jpg',1080,1920,'white',0, 0),
(10,'Catalonia',0,'map_catalonia.jpg',1080,1920,'white',0, 0),
(11,'Basque&#x20;Country',0,'map_basque-country.jpg',1080,1920,'white',0, 0),
(12,'Andalusia',0,'map_andalusia.jpg',1080,1920,'white',0, 0)
(1, 'Demo&#x20;visual console', 0, 'fondo.jpg', 1080, 1920, 'white', 0, 0, null),
(2,'Demo&#x20;visual console 2',0,'fondo-keep-alive.jpg',1080,1920,'#FFF',0, 0, null),
(3,'Worldmap',0,'map_world.jpg',1080,1920,'white',0, 0, null),
(4,'Europe',0,'map_europe_1.jpg',1080,1920,'white',0, 0, null),
(5,'USA',0,'map_USA.jpg',1080,1920,'white',0, 0, null),
(6,'Spain',0,'map_spain.jpg',1080,1920,'white',0, 0, null),
(7,'Madrid',0,'map_madrid.jpg',1080,1920,'white',0, 0, null),
(8,'Germany',0,'map_germany_1.jpg',1080,1920,'white',0, 0, null),
(9,'France',0,'map_france.jpg',1080,1920,'white',0, 0, null),
(10,'Catalonia',0,'map_catalonia.jpg',1080,1920,'white',0, 0, null),
(11,'Basque&#x20;Country',0,'map_basque-country.jpg',1080,1920,'white',0, 0, null),
(12,'Andalusia',0,'map_andalusia.jpg',1080,1920,'white',0, 0, null)
;
--

View File

@ -591,6 +591,9 @@ abstract class VisualConsoleItem<Props extends ItemProps> {
});
// Metadata state.
if (this.meta.maintenanceMode) {
box.classList.add("is-maintenance");
}
if (this.meta.editMode) {
box.classList.add("is-editing");
}
@ -877,8 +880,12 @@ abstract class VisualConsoleItem<Props extends ItemProps> {
}
// Change metadata related things.
if (!prevMeta || prevMeta.editMode !== this.meta.editMode) {
if (this.meta.editMode) {
if (
!prevMeta ||
prevMeta.editMode !== this.meta.editMode ||
prevMeta.maintenanceMode !== this.meta.maintenanceMode
) {
if (this.meta.editMode && this.meta.maintenanceMode === false) {
this.elementRef.classList.add("is-editing");
} else {
this.elementRef.classList.remove("is-editing");

View File

@ -159,6 +159,12 @@ export interface VisualConsoleProps extends Size {
backgroundColor: string | null;
isFavorite: boolean;
relationLineWidth: number;
maintenanceMode: MaintenanceModeInterface | null;
}
export interface MaintenanceModeInterface {
user: string;
timestamp: number;
}
/**
@ -181,7 +187,8 @@ export function visualConsolePropsDecoder(
backgroundURL,
backgroundColor,
isFavorite,
relationLineWidth
relationLineWidth,
maintenanceMode
} = data;
if (id == null || isNaN(parseInt(id))) {
@ -202,6 +209,7 @@ export function visualConsolePropsDecoder(
backgroundColor: notEmptyStringOr(backgroundColor, null),
isFavorite: parseBoolean(isFavorite),
relationLineWidth: parseIntOr(relationLineWidth, 0),
maintenanceMode: maintenanceMode,
...sizePropsDecoder(data)
};
}
@ -1222,6 +1230,28 @@ export default class VisualConsole {
this.containerRef.classList.remove("is-editing");
}
/**
* Enable the maintenance mode.
*/
public enableMaintenanceMode(): void {
this.elements.forEach(item => {
item.meta = { ...item.meta, maintenanceMode: true };
});
this.containerRef.classList.add("is-maintenance");
this.containerRef.classList.remove("is-editing");
}
/**
* Disable the maintenance mode.
*/
public disableMaintenanceMode(): void {
this.elements.forEach(item => {
item.meta = { ...item.meta, maintenanceMode: false };
});
this.containerRef.classList.remove("is-maintenance");
this.containerRef.classList.add("is-editing");
}
/**
* Select an item.
* @param itemId Item Id.

View File

@ -275,6 +275,7 @@ export function itemMetaDecoder(data: UnknownObject): ItemMeta | never {
receivedAt,
error,
editMode: parseBoolean(data.editMode),
maintenanceMode: parseBoolean(data.maintenanceMode),
isFromCache: parseBoolean(data.isFromCache),
isFetching: false,
isUpdating: false,

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@ -133,6 +133,7 @@ describe("itemMetaDecoder function", () => {
isFetching: false,
isUpdating: false,
editMode: false,
maintenanceMode: false,
isBeingMoved: false,
isBeingResized: false,
isSelected: false,
@ -154,6 +155,7 @@ describe("itemMetaDecoder function", () => {
isFetching: false,
isUpdating: false,
editMode: true,
maintenanceMode: false,
isBeingMoved: false,
isBeingResized: false,
isSelected: false,

View File

@ -61,5 +61,6 @@ export interface ItemMeta {
isBeingMoved: boolean;
isBeingResized: boolean;
editMode: boolean;
maintenanceMode: boolean;
lineMode: boolean;
}

View File

@ -7,6 +7,14 @@
margin-top: 5px;
}
.is-maintenance {
background-image: url(./lib/maintenanceMode.png) !important;
}
.is-maintenance :nth-child(1) {
display: none;
}
.visual-console-item {
position: absolute;
display: flex;