setTitle(_('Items')) ->setDocUrl(CDocHelper::getUrl($data['context'] === 'host' ? CDocHelper::DATA_COLLECTION_HOST_ITEM_LIST : CDocHelper::DATA_COLLECTION_TEMPLATE_ITEM_LIST )) ->setControls( (new CTag('nav', true, (new CList()) ->addItem( $data['hostid'] != 0 ? new CRedirectButton(_('Create item'), (new CUrl('items.php')) ->setArgument('form', 'create') ->setArgument('hostid', $data['hostid']) ->setArgument('context', $data['context']) ) : (new CButton('form', $data['context'] === 'host' ? _('Create item (select host first)') : _('Create item (select template first)') ))->setEnabled(false) ) ))->setAttribute('aria-label', _('Content controls')) ); if ($data['hostid'] != 0) { $html_page->setNavigation(getHostNavigation('items', $data['hostid'])); } $html_page->addItem(new CPartial('configuration.filter.items', [ 'filter_data' => $data['filter_data'], 'subfilter' => $data['subfilter'], 'context' => $data['context'] ])); $url = (new CUrl('items.php')) ->setArgument('context', $data['context']) ->getUrl(); // create form $itemForm = (new CForm('post', $url)) ->setName('items') ->addVar('checkbox_hash', $data['checkbox_hash']) ->addVar('context', $data['context'], 'form_context'); if (!empty($data['hostid'])) { $itemForm->addVar('hostid', $data['hostid']); } // create table $itemTable = (new CTableInfo()) ->setHeader([ (new CColHeader( (new CCheckBox('all_items'))->onClick("checkAll('".$itemForm->getName()."', 'all_items', 'group_itemid');") ))->addClass(ZBX_STYLE_CELL_WIDTH), '', ($data['hostid'] == 0) ? ($data['context'] === 'host') ? _('Host') : _('Template') : null, make_sorting_header(_('Name'), 'name', $data['sort'], $data['sortorder'], $url), _('Triggers'), make_sorting_header(_('Key'), 'key_', $data['sort'], $data['sortorder'], $url), make_sorting_header(_('Interval'), 'delay', $data['sort'], $data['sortorder'], $url), make_sorting_header(_('History'), 'history', $data['sort'], $data['sortorder'], $url), make_sorting_header(_('Trends'), 'trends', $data['sort'], $data['sortorder'], $url), make_sorting_header(_('Type'), 'type', $data['sort'], $data['sortorder'], $url), make_sorting_header(_('Status'), 'status', $data['sort'], $data['sortorder'], $url), _('Tags'), ($data['context'] === 'host') ? _('Info') : null ]); $current_time = time(); $data['itemTriggers'] = CMacrosResolverHelper::resolveTriggerExpressions($data['itemTriggers'], [ 'html' => true, 'sources' => ['expression', 'recovery_expression'], 'context' => $data['context'] ]); $update_interval_parser = new CUpdateIntervalParser(['usermacros' => true]); $csrf_token = CCsrfTokenHelper::get('items.php'); foreach ($data['items'] as $item) { // description $description = []; $description[] = makeItemTemplatePrefix($item['itemid'], $data['parent_templates'], ZBX_FLAG_DISCOVERY_NORMAL, $data['allowed_ui_conf_templates'] ); if (!empty($item['discoveryRule'])) { $description[] = (new CLink($item['discoveryRule']['name'], (new CUrl('disc_prototypes.php')) ->setArgument('parent_discoveryid', $item['discoveryRule']['itemid']) ->setArgument('context', $data['context']) )) ->addClass(ZBX_STYLE_LINK_ALT) ->addClass(ZBX_STYLE_ORANGE); $description[] = NAME_DELIMITER; } if ($item['type'] == ITEM_TYPE_DEPENDENT) { if ($item['master_item']['type'] == ITEM_TYPE_HTTPTEST) { $description[] = $item['master_item']['name']; } else { $description[] = (new CLink($item['master_item']['name'], (new CUrl('items.php')) ->setArgument('form', 'update') ->setArgument('hostid', $item['hostid']) ->setArgument('itemid', $item['master_item']['itemid']) ->setArgument('context', $data['context']) )) ->addClass(ZBX_STYLE_LINK_ALT) ->addClass(ZBX_STYLE_TEAL); } $description[] = NAME_DELIMITER; } $description[] = new CLink($item['name'], (new CUrl('items.php')) ->setArgument('form', 'update') ->setArgument('hostid', $item['hostid']) ->setArgument('itemid', $item['itemid']) ->setArgument('context', $data['context']) ); // status $status = new CCol((new CLink( itemIndicator($item['status'], $item['state']), (new CUrl('items.php')) ->setArgument('group_itemid[]', $item['itemid']) ->setArgument('hostid', $item['hostid']) ->setArgument('action', ($item['status'] == ITEM_STATUS_DISABLED) ? 'item.massenable' : 'item.massdisable' ) ->setArgument('context', $data['context']) ->setArgument('checkbox_hash', $data['checkbox_hash']) ->getUrl() )) ->addCsrfToken($csrf_token) ->addClass(ZBX_STYLE_LINK_ACTION) ->addClass(itemIndicatorStyle($item['status'], $item['state'])) ); // triggers info $triggerHintTable = (new CTableInfo())->setHeader([_('Severity'), _('Name'), _('Expression'), _('Status')]); $backurl = (new CUrl('items.php')) ->setArgument('context', $data['context']) ->getUrl(); foreach ($item['triggers'] as $num => &$trigger) { $trigger = $data['itemTriggers'][$trigger['triggerid']]; $trigger_description = []; $trigger_description[] = makeTriggerTemplatePrefix($trigger['triggerid'], $data['trigger_parent_templates'], ZBX_FLAG_DISCOVERY_NORMAL, $data['allowed_ui_conf_templates'] ); $trigger['hosts'] = zbx_toHash($trigger['hosts'], 'hostid'); $trigger_description[] = new CLink( $trigger['description'], (new CUrl('triggers.php')) ->setArgument('form', 'update') ->setArgument('hostid', key($trigger['hosts'])) ->setArgument('triggerid', $trigger['triggerid']) ->setArgument('context', $data['context']) ->setArgument('backurl', $backurl) ); if ($trigger['state'] == TRIGGER_STATE_UNKNOWN) { $trigger['error'] = ''; } if ($trigger['recovery_mode'] == ZBX_RECOVERY_MODE_RECOVERY_EXPRESSION) { $expression = [ _('Problem'), ': ', $trigger['expression'], BR(), _('Recovery'), ': ', $trigger['recovery_expression'] ]; } else { $expression = $trigger['expression']; } $triggerHintTable->addRow([ CSeverityHelper::makeSeverityCell((int) $trigger['priority']), $trigger_description, (new CDiv($expression))->addClass(ZBX_STYLE_WORDWRAP), (new CSpan(triggerIndicator($trigger['status'], $trigger['state']))) ->addClass(triggerIndicatorStyle($trigger['status'], $trigger['state'])) ]); } unset($trigger); if ($triggerHintTable->getNumRows()) { $triggerInfo = (new CLinkAction(_('Triggers')))->setHint($triggerHintTable); $triggerInfo = [$triggerInfo]; $triggerInfo[] = CViewHelper::showNum($triggerHintTable->getNumRows()); $triggerHintTable = []; } else { $triggerInfo = ''; } $wizard = (new CButtonIcon(ZBX_ICON_MORE)) ->setMenuPopup( CMenuPopupHelper::getItem([ 'itemid' => $item['itemid'], 'context' => $data['context'], 'backurl' => $backurl ]) ); if (in_array($item['value_type'], [ITEM_VALUE_TYPE_STR, ITEM_VALUE_TYPE_LOG, ITEM_VALUE_TYPE_TEXT])) { $item['trends'] = ''; } // Hide zeros for trapper, SNMP trap and dependent items. if ($item['type'] == ITEM_TYPE_TRAPPER || $item['type'] == ITEM_TYPE_SNMPTRAP || $item['type'] == ITEM_TYPE_DEPENDENT || ($item['type'] == ITEM_TYPE_ZABBIX_ACTIVE && strncmp($item['key_'], 'mqtt.get', 8) === 0)) { $item['delay'] = ''; } elseif ($update_interval_parser->parse($item['delay']) == CParser::PARSE_SUCCESS) { $item['delay'] = $update_interval_parser->getDelay(); } // info if ($data['context'] === 'host') { $info_icons = []; if ($item['status'] == ITEM_STATUS_ACTIVE && !zbx_empty($item['error'])) { $info_icons[] = makeErrorIcon($item['error']); } // discovered item lifetime indicator if ($item['flags'] == ZBX_FLAG_DISCOVERY_CREATED && $item['itemDiscovery']['ts_delete'] != 0) { $info_icons[] = getItemLifetimeIndicator($current_time, (int) $item['itemDiscovery']['ts_delete']); } } $checkbox = new CCheckBox('group_itemid['.$item['itemid'].']', $item['itemid']); if (in_array($item['type'], checkNowAllowedTypes()) && $item['status'] == ITEM_STATUS_ACTIVE && $item['hosts'][0]['status'] == HOST_STATUS_MONITORED) { $checkbox->setAttribute('data-actions', 'execute'); } $itemTable->addRow([ $checkbox, $wizard, ($data['hostid'] == 0) ? $item['host'] : null, (new CCol($description))->addClass(ZBX_STYLE_WORDBREAK), $triggerInfo, (new CDiv($item['key_']))->addClass(ZBX_STYLE_WORDWRAP), $item['delay'], $item['history'], $item['trends'], item_type2str($item['type']), $status, $data['tags'][$item['itemid']], ($data['context'] === 'host') ? makeInformationList($info_icons) : null ]); } $button_list = [ 'item.massenable' => [ 'name' => _('Enable'), 'confirm_singular' => _('Enable selected item?'), 'confirm_plural' => _('Enable selected items?'), 'csrf_token' => $csrf_token ], 'item.massdisable' => [ 'name' => _('Disable'), 'confirm_singular' => _('Disable selected item?'), 'confirm_plural' => _('Disable selected items?'), 'csrf_token' => $csrf_token ] ]; if ($data['context'] === 'host') { $massclearhistory = [ 'name' => _('Clear history'), 'confirm_singular' => _('Delete history of selected item?'), 'confirm_plural' => _('Delete history of selected items?'), 'csrf_token' => $csrf_token ]; if ($data['config']['compression_status']) { unset($massclearhistory['confirm_singular']); unset($massclearhistory['confirm_plural']); } $button_list += [ 'item.masscheck_now' => [ 'content' => (new CSimpleButton(_('Execute now'))) ->addClass('js-execute-now') ->addClass(ZBX_STYLE_BTN_ALT) ->setAttribute('data-required', 'execute') ], 'item.massclearhistory' => $massclearhistory ]; } $button_list += [ 'item.masscopyto' => [ 'content' => (new CSimpleButton(_('Copy'))) ->addClass(ZBX_STYLE_BTN_ALT) ->addClass('js-copy') ], 'popup.massupdate.item' => [ 'content' => (new CSimpleButton(_('Mass update'))) ->addClass(ZBX_STYLE_BTN_ALT) ->onClick( "openMassupdatePopup('popup.massupdate.item', {". CCsrfTokenHelper::CSRF_TOKEN_NAME.": '".CCsrfTokenHelper::get('item'). "'}, { dialogue_class: 'modal-popup-preprocessing', trigger_element: this });" ) ], 'item.massdelete' => [ 'name' => _('Delete'), 'confirm_singular' => _('Delete selected item?'), 'confirm_plural' => _('Delete selected items?'), 'csrf_token' => $csrf_token ] ]; // Append table to form. $itemForm->addItem([ $itemTable, $data['paging'], new CActionButtonList('action', 'group_itemid', $button_list, $data['checkbox_hash']) ]); $html_page ->addItem($itemForm) ->show(); (new CScriptTag(' view.init('.json_encode([ 'checkbox_hash' => $data['checkbox_hash'], 'checkbox_object' => 'group_itemid', 'context' => $data['context'] ]).'); ')) ->setOnDocumentReady() ->show();