1<?php 2/* 3 +-------------------------------------------------------------------------+ 4 | Copyright (C) 2004-2021 The Cacti Group | 5 | | 6 | This program is free software; you can redistribute it and/or | 7 | modify it under the terms of the GNU General Public License | 8 | as published by the Free Software Foundation; either version 2 | 9 | of the License, or (at your option) any later version. | 10 | | 11 | This program is distributed in the hope that it will be useful, | 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | GNU General Public License for more details. | 15 +-------------------------------------------------------------------------+ 16 | Cacti: The Complete RRDtool-based Graphing Solution | 17 +-------------------------------------------------------------------------+ 18 | This code is designed, written, and maintained by the Cacti Group. See | 19 | about.php and/or the AUTHORS file for specific developer information. | 20 +-------------------------------------------------------------------------+ 21 | http://www.cacti.net/ | 22 +-------------------------------------------------------------------------+ 23*/ 24 25include('./include/auth.php'); 26include_once('./lib/vdef.php'); 27 28$vdef_actions = array( 29 '1' => __('Delete'), 30 '2' => __('Duplicate') 31); 32 33set_default_action(); 34 35switch (get_request_var('action')) { 36 case 'save': 37 vdef_form_save(); 38 39 break; 40 case 'actions': 41 vdef_form_actions(); 42 43 break; 44 case 'item_remove_confirm': 45 vdef_item_remove_confirm(); 46 47 break; 48 case 'item_remove': 49 vdef_item_remove(); 50 51 break; 52 case 'item_movedown': 53 get_filter_request_var('vdef_id'); 54 55 item_movedown(); 56 57 header('Location: vdef.php?header=false&action=edit&id=' . get_request_var('vdef_id')); 58 break; 59 case 'item_moveup': 60 get_filter_request_var('vdef_id'); 61 62 item_moveup(); 63 64 header('Location: vdef.php?header=false&action=edit&id=' . get_request_var('vdef_id')); 65 break; 66 case 'item_edit': 67 top_header(); 68 vdef_item_edit(); 69 bottom_footer(); 70 71 break; 72 case 'edit': 73 top_header(); 74 75 vdef_edit(); 76 77 bottom_footer(); 78 79 break; 80 case 'ajax_dnd': 81 vdef_item_dnd(); 82 83 break; 84 default: 85 top_header(); 86 87 vdef(); 88 89 bottom_footer(); 90 91 break; 92} 93 94/* -------------------------- 95 Global Form Functions 96 -------------------------- */ 97 98function draw_vdef_preview($vdef_id) { 99 ?> 100 <tr class='even'> 101 <td style='padding:4px'> 102 <pre>vdef=<?php print html_escape(get_vdef($vdef_id, true));?></pre> 103 </td> 104 </tr> 105 <?php 106} 107 108/* -------------------------- 109 The Save Function 110 -------------------------- */ 111 112function vdef_form_save() { 113 if (isset_request_var('save_component_vdef')) { 114 $save['id'] = get_filter_request_var('id'); 115 $save['hash'] = get_hash_vdef(get_request_var('id')); 116 $save['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3); 117 118 if (!is_error_message()) { 119 $vdef_id = sql_save($save, 'vdef'); 120 121 if ($vdef_id) { 122 raise_message(1); 123 } else { 124 raise_message(2); 125 } 126 } 127 128 header('Location: vdef.php?action=edit&header=false&id=' . (empty($vdef_id) ? get_request_var('id') : $vdef_id)); 129 } elseif (isset_request_var('save_component_item')) { 130 $sequence = get_sequence(get_filter_request_var('id'), 'sequence', 'vdef_items', 'vdef_id=' . get_filter_request_var('vdef_id')); 131 132 $save['id'] = get_filter_request_var('id'); 133 $save['hash'] = get_hash_vdef(get_request_var('id'), 'vdef_item'); 134 $save['vdef_id'] = get_filter_request_var('vdef_id'); 135 $save['sequence'] = $sequence; 136 $save['type'] = get_nfilter_request_var('type'); 137 $save['value'] = get_nfilter_request_var('value'); 138 139 if (!is_error_message()) { 140 $vdef_item_id = sql_save($save, 'vdef_items'); 141 142 if ($vdef_item_id) { 143 raise_message(1); 144 } else { 145 raise_message(2); 146 } 147 } 148 149 if (is_error_message()) { 150 header('Location: vdef.php?action=item_edit&header=false&vdef_id=' . get_request_var('vdef_id') . '&id=' . (empty($vdef_item_id) ? get_request_var('id') : $vdef_item_id)); 151 } else { 152 header('Location: vdef.php?action=edit&header=false&id=' . get_request_var('vdef_id')); 153 } 154 } 155} 156 157function duplicate_vdef($_vdef_id, $vdef_title) { 158 global $fields_vdef_edit; 159 160 $vdef = db_fetch_row_prepared('SELECT * FROM vdef WHERE id = ?', array($_vdef_id)); 161 $vdef_items = db_fetch_assoc_prepared('SELECT * FROM vdef_items WHERE vdef_id = ?', array($_vdef_id)); 162 163 /* substitute the title variable */ 164 $vdef['name'] = str_replace('<vdef_title>', $vdef['name'], $vdef_title); 165 166 /* create new entry: device_template */ 167 $save['id'] = 0; 168 $save['hash'] = get_hash_vdef(0); 169 170 $fields_vdef_edit = preset_vdef_form_list(); 171 foreach ($fields_vdef_edit as $field => $array) { 172 if (!preg_match('/^hidden/', $array['method'])) { 173 $save[$field] = $vdef[$field]; 174 } 175 } 176 177 $vdef_id = sql_save($save, 'vdef'); 178 179 /* create new entry(s): vdef_items */ 180 if (cacti_sizeof($vdef_items) > 0) { 181 foreach ($vdef_items as $vdef_item) { 182 unset($save); 183 184 $save['id'] = 0; 185 $save['hash'] = get_hash_vdef(0, 'vdef_item'); 186 $save['vdef_id'] = $vdef_id; 187 $save['sequence'] = $vdef_item['sequence']; 188 $save['type'] = $vdef_item['type']; 189 $save['value'] = $vdef_item['value']; 190 191 sql_save($save, 'vdef_items'); 192 } 193 } 194} 195 196/* ------------------------ 197 The 'actions' function 198 ------------------------ */ 199 200function vdef_form_actions() { 201 global $vdef_actions; 202 203 /* if we are to save this form, instead of display it */ 204 if (isset_request_var('selected_items')) { 205 $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); 206 207 if ($selected_items != false) { 208 if (get_nfilter_request_var('drp_action') === '1') { // delete 209 /* do a referential integrity check */ 210 if (cacti_sizeof($selected_items)) { 211 foreach($selected_items as $vdef_id) { 212 /* ================= input validation ================= */ 213 input_validate_input_number($vdef_id); 214 /* ==================================================== */ 215 216 $vdef_ids[] = $vdef_id; 217 } 218 } 219 220 if (isset($vdef_ids)) { 221 db_execute('DELETE FROM vdef WHERE ' . array_to_sql_or($vdef_ids, 'id')); 222 db_execute('DELETE FROM vdef_items WHERE ' . array_to_sql_or($vdef_ids, 'vdef_id')); 223 } 224 } elseif (get_nfilter_request_var('drp_action') === '2') { // duplicate 225 for ($i=0;($i<cacti_count($selected_items));$i++) { 226 /* ================= input validation ================= */ 227 input_validate_input_number($selected_items[$i]); 228 /* ==================================================== */ 229 230 duplicate_vdef($selected_items[$i], get_nfilter_request_var('title_format')); 231 } 232 } 233 } 234 235 header('Location: vdef.php?header=false'); 236 237 exit; 238 } 239 240 /* setup some variables */ 241 $vdef_list = ''; 242 243 /* loop through each of the graphs selected on the previous page and get more info about them */ 244 foreach ($_POST as $var => $val) { 245 if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { 246 /* ================= input validation ================= */ 247 input_validate_input_number($matches[1]); 248 /* ==================================================== */ 249 250 $vdef_list .= '<li>' . html_escape(db_fetch_cell_prepared('SELECT name FROM vdef WHERE id = ?', array($matches[1]))) . '</li>'; 251 $vdef_array[] = $matches[1]; 252 } 253 } 254 255 top_header(); 256 257 form_start('vdef.php', 'vdef_actions'); 258 259 html_start_box($vdef_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); 260 261 if (isset($vdef_array)) { 262 if (get_nfilter_request_var('drp_action') === '1') { // delete 263 print " <tr> 264 <td class='topBoxAlt'> 265 <p>" . __n('Click \'Continue\' to delete the following VDEF.', 'Click \'Continue\' to delete following VDEFs.', cacti_sizeof($vdef_array)) . "</p> 266 <div class='itemlist'><ul>$vdef_list</ul></div> 267 </td> 268 </tr>\n"; 269 270 $save_html = "<input type='button' class='ui-button ui-corner-all ui-widget' value='" . __esc('Cancel') . "' onClick='cactiReturnTo()'> <input type='submit' class='ui-button ui-corner-all ui-widget' value='" . __esc('Continue') . "' title='" . __esc_n('Delete VDEF', 'Delete VDEFs', cacti_sizeof($vdef_array)) . "'>"; 271 } elseif (get_nfilter_request_var('drp_action') === '2') { // duplicate 272 print " <tr> 273 <td class='topBoxAlt'> 274 <p>" . __n('Click \'Continue\' to duplicate the following VDEF. You can optionally change the title format for the new VDEF.', 'Click \'Continue\' to duplicate following VDEFs. You can optionally change the title format for the new VDEFs.', cacti_sizeof($vdef_array)) . "</p> 275 <div class='itemlist'><ul>$vdef_list</ul></div> 276 <p><strong>" . __('Title Format:') . "</strong><br>"; form_text_box('title_format', '<vdef_title> (1)', '', '255', '30', 'text'); print "</p> 277 </td> 278 </tr>\n"; 279 280 $save_html = "<input type='button' class='ui-button ui-corner-all ui-widget' value='" . __esc('Cancel') . "' onClick='cactiReturnTo()'> <input type='submit' class='ui-button ui-corner-all ui-widget' value='" . __esc('Continue') . "' title='" . __esc_n('Duplicate VDEF', 'Duplicate VDEFs', cacti_sizeof($vdef_array)) . "'>"; 281 } 282 } else { 283 raise_message(40); 284 header('Location: vdef.php?header=false'); 285 exit; 286 } 287 288 print "<tr> 289 <td class='saveRow'> 290 <input type='hidden' name='action' value='actions'> 291 <input type='hidden' name='selected_items' value='" . (isset($vdef_array) ? serialize($vdef_array) : '') . "'> 292 <input type='hidden' name='drp_action' value='" . html_escape(get_nfilter_request_var('drp_action')) . "'> 293 $save_html 294 </td> 295 </tr>\n"; 296 297 html_end_box(); 298 299 form_end(); 300 301 bottom_footer(); 302} 303 304/* -------------------------- 305 VDEF Item Functions 306 -------------------------- */ 307 308function vdef_item_remove_confirm() { 309 global $vdef_functions, $vdef_item_types, $custom_vdef_data_source_types; 310 311 /* ================= input validation ================= */ 312 get_filter_request_var('id'); 313 get_filter_request_var('vdef_id'); 314 /* ==================================================== */ 315 316 /* sort the vdef functions */ 317 asort($vdef_functions); 318 319 form_start('vdef.php'); 320 321 html_start_box('', '100%', '', '3', 'center', ''); 322 323 $vdef = db_fetch_row_prepared('SELECT * FROM vdef WHERE id = ?', array(get_request_var('id'))); 324 $vdef_item = db_fetch_row_prepared('SELECT * FROM vdef_items WHERE id = ?', array(get_request_var('vdef_id'))); 325 326 ?> 327 <tr> 328 <td class='topBoxAlt'> 329 <p><?php print __('Click \'Continue\' to delete the following VDEF\'s.'); ?></p> 330 <p><?php print __esc('VDEF Name: %s', $vdef['name']);?><br> 331 <em><?php $vdef_item_type = $vdef_item['type']; print $vdef_item_types[$vdef_item_type];?></em>: <strong><?php print html_escape(get_vdef_item_name($vdef_item['id']));?></strong></p> 332 </td> 333 </tr> 334 <tr> 335 <td class='right'> 336 <input type='button' class='ui-button ui-corner-all ui-widget' id='cancel' value='<?php print __esc('Cancel');?>' onClick='$("#cdialog").dialog("close");' name='cancel'> 337 <input type='button' class='ui-button ui-corner-all ui-widget' id='continue' value='<?php print __esc('Continue');?>' name='continue' title='<?php print __esc('Remove VDEF Item');?>'> 338 </td> 339 </tr> 340 <?php 341 342 html_end_box(); 343 344 form_end(); 345} 346 347function vdef_item_remove() { 348 /* ================= input validation ================= */ 349 get_filter_request_var('vdef_id'); 350 /* ==================================================== */ 351 352 db_execute_prepared('DELETE FROM vdef_items WHERE id = ?', array(get_request_var('vdef_id'))); 353} 354 355function vdef_item_edit() { 356 global $vdef_functions, $vdef_item_types, $custom_vdef_data_source_types; 357 358 /* ================= input validation ================= */ 359 get_filter_request_var('id'); 360 get_filter_request_var('vdef_id'); 361 get_filter_request_var('type_select'); 362 /* ==================================================== */ 363 364 /* sort the vdef functions */ 365 asort($vdef_functions); 366 367 if (!isempty_request_var('id')) { 368 $vdef = db_fetch_row_prepared('SELECT * 369 FROM vdef_items 370 WHERE id = ?', 371 array(get_request_var('id'))); 372 373 if (cacti_sizeof($vdef)) { 374 $current_type = $vdef['type']; 375 $values[$current_type] = $vdef['value']; 376 } 377 } else { 378 $vdef = array(); 379 } 380 381 html_start_box(__('VDEF Preview'), '100%', '', '3', 'center', ''); 382 draw_vdef_preview(get_request_var('vdef_id')); 383 html_end_box(); 384 385 if (!isempty_request_var('vdef_id')) { 386 $name = db_fetch_cell_prepared('SELECT name 387 FROM vdef 388 WHERE id = ?', 389 array(get_request_var('vdef_id'))); 390 391 $header_label = __esc('VDEF Items [edit: %s]', $name); 392 }else { 393 $header_label = __('VDEF Items [new]'); 394 } 395 396 form_start('vdef.php', 'chk'); 397 398 html_start_box($header_label, '100%', '', '3', 'center', ''); 399 400 if (isset_request_var('type_select')) { 401 $current_type = get_request_var('type_select'); 402 } elseif (isset($vdef['type'])) { 403 $current_type = $vdef['type']; 404 } else { 405 $current_type = CVDEF_ITEM_TYPE_FUNCTION; 406 } 407 408 $form_vdef = array( 409 'type_select' => array( 410 'method' => 'drop_array', 411 'friendly_name' => __('VDEF Item Type'), 412 'description' => __('Choose what type of VDEF item this is.'), 413 'value' => $current_type, 414 'array' => $vdef_item_types 415 ), 416 'value' => array( 417 'method' => 'drop_array', 418 'friendly_name' => __('VDEF Item Value'), 419 'description' => __('Enter a value for this VDEF item.'), 420 'value' => (isset($vdef['value']) ? $vdef['value']:'') 421 ), 422 'id' => array( 423 'method' => 'hidden', 424 'value' => isset_request_var('id') ? get_request_var('id') : '0', 425 ), 426 'type' => array( 427 'method' => 'hidden', 428 'value' => $current_type 429 ), 430 'vdef_id' => array( 431 'method' => 'hidden', 432 'value' => get_request_var('vdef_id') 433 ), 434 'save_component_item' => array( 435 'method' => 'hidden', 436 'value' => '1' 437 ) 438 ); 439 440 switch ($current_type) { 441 case '1': 442 $form_vdef['value']['array'] = $vdef_functions; 443 444 break; 445 case '4': 446 $form_vdef['value']['array'] = $custom_vdef_data_source_types; 447 448 break; 449 case '6': 450 $form_vdef['value']['method'] = 'textbox'; 451 $form_vdef['value']['max_length'] = '255'; 452 $form_vdef['value']['size'] = '30'; 453 454 break; 455 } 456 457 draw_edit_form( 458 array( 459 'config' => array('no_form_tag' => true), 460 'fields' => inject_form_variables($form_vdef, $vdef) 461 ) 462 ); 463 464 ?> 465 <script type='text/javascript'> 466 $(function() { 467 $('#type_select').unbind().change(function() { 468 strURL = 'vdef.php?action=item_edit'; 469 strURL += '&id=' + $('#id').val(); 470 strURL += '&vdef_id=' + $('#vdef_id').val(); 471 strURL += '&type_select=' + $('#type_select').val(); 472 strURL += '&header=false'; 473 loadPageNoHeader(strURL); 474 }); 475 }); 476 </script> 477 <?php 478 479 html_end_box(); 480 481 form_save_button('vdef.php?action=edit&id=' . get_request_var('vdef_id')); 482} 483 484/* --------------------- 485 VDEF Functions 486 --------------------- */ 487 488function item_movedown() { 489 /* ================= input validation ================= */ 490 get_filter_request_var('id'); 491 get_filter_request_var('vdef_id'); 492 /* ==================================================== */ 493 494 move_item_down('vdef_items', get_request_var('id'), 'vdef_id=' . get_request_var('vdef_id')); 495} 496 497function item_moveup() { 498 /* ================= input validation ================= */ 499 get_filter_request_var('id'); 500 get_filter_request_var('vdef_id'); 501 /* ==================================================== */ 502 503 move_item_up('vdef_items', get_request_var('id'), 'vdef_id=' . get_request_var('vdef_id')); 504} 505 506function vdef_item_dnd() { 507 /* ================= Input validation ================= */ 508 get_filter_request_var('id'); 509 /* ================= Input validation ================= */ 510 511 $continue = true; 512 513 if (isset_request_var('vdef_item') && is_array(get_nfilter_request_var('vdef_item'))) { 514 $vdef_ids = get_nfilter_request_var('vdef_item'); 515 516 if (cacti_sizeof($vdef_ids)) { 517 $sequence = 1; 518 foreach($vdef_ids as $vdef_id) { 519 $vdef_id = str_replace('line', '', $vdef_id); 520 input_validate_input_number($vdef_id); 521 522 db_execute_prepared('UPDATE vdef_items 523 SET sequence = ? 524 WHERE id = ?', 525 array($sequence, $vdef_id)); 526 527 $sequence++; 528 } 529 } 530 } 531 532 header('Location: vdef.php?action=edit&header=false&id=' . get_request_var('id')); 533} 534 535function vdef_edit() { 536 global $vdef_item_types; 537 538 /* ================= input validation ================= */ 539 get_filter_request_var('id'); 540 /* ==================================================== */ 541 542 if (!isempty_request_var('id')) { 543 $vdef = db_fetch_row_prepared('SELECT * 544 FROM vdef 545 WHERE id = ?', 546 array(get_request_var('id'))); 547 548 $header_label = __esc('VDEFs [edit: %s]', $vdef['name']); 549 } else { 550 $header_label = __('VDEFs [new]'); 551 } 552 553 form_start('vdef.php', 'vdef_edit'); 554 555 html_start_box($header_label, '100%', true, '3', 'center', ''); 556 557 $preset_vdef_form_list = preset_vdef_form_list(); 558 draw_edit_form( 559 array( 560 'config' => array('no_form_tag' => true), 561 'fields' => inject_form_variables($preset_vdef_form_list, (isset($vdef) ? $vdef : array())) 562 ) 563 ); 564 565 html_end_box(true, true); 566 567 form_hidden_box('id', (isset($vdef['id']) ? $vdef['id'] : '0'), ''); 568 form_hidden_box('save_component_vdef', '1', ''); 569 570 if (!isempty_request_var('id')) { 571 html_start_box('', '100%', '', '3', 'center', ''); 572 draw_vdef_preview(get_request_var('id')); 573 html_end_box(); 574 575 html_start_box(__('VDEF Items'), '100%', '', '3', 'center', 'vdef.php?action=item_edit&vdef_id=' . $vdef['id']); 576 577 $header_items = array( 578 array('display' => __('Item'), 'align' => 'left'), 579 array('display' => __('Item Value'), 'align' => 'left') 580 ); 581 582 html_header($header_items, 2); 583 584 $vdef_items = db_fetch_assoc_prepared('SELECT * 585 FROM vdef_items 586 WHERE vdef_id = ? 587 ORDER BY sequence', 588 array(get_request_var('id'))); 589 590 $i = 1; 591 $total_items = cacti_sizeof($vdef_items); 592 593 if (cacti_sizeof($vdef_items)) { 594 foreach ($vdef_items as $vdef_item) { 595 form_alternate_row('line' . $vdef_item['id'], true, true); 596 ?> 597 <td> 598 <a class='linkEditMain' href='<?php print html_escape('vdef.php?action=item_edit&id=' . $vdef_item['id'] . '&vdef_id=' . $vdef['id']);?>'><?php print __('Item #%d', $i);?></a> 599 </td> 600 <td> 601 <em><?php $vdef_item_type = $vdef_item['type']; print $vdef_item_types[$vdef_item_type];?></em>: <strong><?php print html_escape(get_vdef_item_name($vdef_item['id']));?></strong> 602 </td> 603 <td class='right'> 604 <?php 605 if (read_config_option('drag_and_drop') == '') { 606 if ($i < $total_items && $total_items > 1) { 607 echo '<a class="pic fa fa-caret-down moveArrow" href="' . html_escape('vdef.php?action=item_movedown&id=' . $vdef_item['id'] . '&vdef_id=' . $vdef_item['vdef_id']) . '" title="' . __esc('Move Down') . '"></a>'; 608 } else { 609 echo '<span class="moveArrowNone"></span>'; 610 } 611 612 if ($i > 1 && $i <= $total_items) { 613 echo '<a class="pic fa fa-caret-up moveArrow" href="' . html_escape('vdef.php?action=item_moveup&id=' . $vdef_item['id'] . '&vdef_id=' . $vdef_item['vdef_id']) . '" title="' . __esc('Move Up') . '"></a>'; 614 } else { 615 echo '<span class="moveArrowNone"></span>'; 616 } 617 } 618 ?> 619 <a id='<?php print $vdef['id'] . '_' . $vdef_item['id'];?>' class='delete deleteMarker fa fa-times' title='<?php print __esc('Delete VDEF Item');?>'></a> 620 </td> 621 <?php 622 623 form_end_row(); 624 625 $i++; 626 } 627 } 628 629 html_end_box(); 630 } 631 632 form_save_button('vdef.php', 'return'); 633 634 ?> 635 <script type='text/javascript'> 636 637 $(function() { 638 $('#vdef_edit3').find('.cactiTable').attr('id', 'vdef_item'); 639 $('.cdialog').remove(); 640 $('#main').append("<div class='cdialog' id='cdialog'></div>"); 641 642 <?php if (read_config_option('drag_and_drop') == 'on') { ?> 643 $('#vdef_item').unbind().tableDnD({ 644 onDrop: function(table, row) { 645 loadPageNoHeader('vdef.php?action=ajax_dnd&id=<?php isset_request_var('id') ? print get_request_var('id') : print 0;?>&'+$.tableDnD.serialize()); 646 } 647 }); 648 <?php } ?> 649 650 $('.delete').unbind().click(function (event) { 651 event.preventDefault(); 652 653 id = $(this).attr('id').split('_'); 654 request = 'vdef.php?action=item_remove_confirm&id='+id[0]+'&vdef_id='+id[1]; 655 $.get(request) 656 .done(function(data) { 657 $('#cdialog').html(data); 658 659 applySkin(); 660 661 $('#continue').off('click').on('click', function(data) { 662 $.post('vdef.php?action=item_remove', { 663 __csrf_magic: csrfMagicToken, 664 vdef_id: id[1], 665 id: id[0] 666 }).done(function(data) { 667 $('#cdialog').dialog('close'); 668 loadPageNoHeader('vdef.php?action=edit&header=false&id='+id[0]); 669 }); 670 }); 671 672 $('#cdialog').dialog({ 673 title: '<?php print __esc('Delete VDEF Item');?>', 674 close: function () { $('.delete').blur(); $('.selectable').removeClass('selected'); }, 675 minHeight: 80, 676 minWidth: 500 677 }); 678 }) 679 .fail(function(data) { 680 getPresentHTTPError(data); 681 }); 682 }).css('cursor', 'pointer'); 683 }); 684 685 </script> 686 <?php 687} 688 689function vdef_filter() { 690 global $item_rows; 691 692 html_start_box( __('VDEFs'), '100%', '', '3', 'center', 'vdef.php?action=edit'); 693 ?> 694 <tr class='even'> 695 <td> 696 <form id='form_vdef' action='vdef.php'> 697 <table class='filterTable'> 698 <tr> 699 <td> 700 <?php print __('Search');?> 701 </td> 702 <td> 703 <input type='text' class='ui-state-default ui-corner-all' id='filter' size='25' value='<?php print html_escape_request_var('filter');?>'> 704 </td> 705 <td> 706 <?php print __('VDEFs');?> 707 </td> 708 <td> 709 <select id='rows' onChange='applyFilter()'> 710 <option value='-1'<?php print (get_request_var('rows') == '-1' ? ' selected>':'>') . __('Default');?></option> 711 <?php 712 if (cacti_sizeof($item_rows)) { 713 foreach ($item_rows as $key => $value) { 714 print "<option value='" . $key . "'"; if (get_request_var('rows') == $key) { print ' selected'; } print '>' . $value . "</option>\n"; 715 } 716 } 717 ?> 718 </select> 719 </td> 720 <td> 721 <span> 722 <input type='checkbox' id='has_graphs' <?php print (get_request_var('has_graphs') == 'true' ? 'checked':'');?>> 723 <label for='has_graphs'><?php print __('Has Graphs');?></label> 724 </span> 725 </td> 726 <td> 727 <span> 728 <input type='button' class='ui-button ui-corner-all ui-widget' value='<?php print __esc_x('Button: use filter settings', 'Go');?>' id='refresh'> 729 <input type='button' class='ui-button ui-corner-all ui-widget' value='<?php print __esc_x('Button: reset filter settings', 'Clear');?>' id='clear'> 730 </span> 731 </td> 732 </tr> 733 </table> 734 </form> 735 <script type='text/javascript'> 736 737 function applyFilter() { 738 strURL = 'vdef.php?header=false'; 739 strURL += '&filter='+$('#filter').val(); 740 strURL += '&rows='+$('#rows').val(); 741 strURL += '&has_graphs='+$('#has_graphs').is(':checked'); 742 loadPageNoHeader(strURL); 743 } 744 745 function clearFilter() { 746 strURL = 'vdef.php?clear=1&header=false'; 747 loadPageNoHeader(strURL); 748 } 749 750 $(function() { 751 $('#refresh').click(function() { 752 applyFilter(); 753 }); 754 755 $('#has_graphs').click(function() { 756 applyFilter(); 757 }); 758 759 $('#clear').click(function() { 760 clearFilter(); 761 }); 762 763 $('#form_vdef').submit(function(event) { 764 event.preventDefault(); 765 applyFilter(); 766 }); 767 }); 768 769 </script> 770 </td> 771 </tr> 772 <?php 773 774 html_end_box(); 775} 776 777function get_vdef_records(&$total_rows, &$rows) { 778 /* form the 'where' clause for our main sql query */ 779 if (get_request_var('filter') != '') { 780 $sql_where = 'WHERE rs.name LIKE ' . db_qstr('%' . get_request_var('filter') . '%'); 781 } else { 782 $sql_where = ''; 783 } 784 785 if (get_request_var('has_graphs') == 'true') { 786 $sql_having = 'HAVING graphs>0'; 787 } else { 788 $sql_having = ''; 789 } 790 791 $total_rows = db_fetch_cell("SELECT 792 COUNT(`rows`) 793 FROM ( 794 SELECT vd.id AS `rows`, vd.name, 795 SUM(CASE WHEN local_graph_id>0 THEN 1 ELSE 0 END) AS graphs 796 FROM vdef AS vd 797 LEFT JOIN graph_templates_item AS gti 798 ON gti.vdef_id=vd.id 799 GROUP BY vd.id 800 $sql_having 801 ) AS rs 802 $sql_where"); 803 804 $sql_order = get_order_string(); 805 $sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; 806 807 return db_fetch_assoc("SELECT rs.*, 808 SUM(CASE WHEN local_graph_id=0 THEN 1 ELSE 0 END) AS templates, 809 SUM(CASE WHEN local_graph_id>0 THEN 1 ELSE 0 END) AS graphs 810 FROM ( 811 SELECT vd.*, gti.local_graph_id 812 FROM vdef AS vd 813 LEFT JOIN graph_templates_item AS gti 814 ON gti.vdef_id=vd.id 815 GROUP BY vd.id, gti.graph_template_id, gti.local_graph_id 816 ) AS rs 817 $sql_where 818 GROUP BY rs.id 819 $sql_having 820 $sql_order 821 $sql_limit"); 822} 823 824function vdef($refresh = true) { 825 global $vdef_actions; 826 827 /* ================= input validation and session storage ================= */ 828 $filters = array( 829 'rows' => array( 830 'filter' => FILTER_VALIDATE_INT, 831 'pageset' => true, 832 'default' => '-1' 833 ), 834 'page' => array( 835 'filter' => FILTER_VALIDATE_INT, 836 'default' => '1' 837 ), 838 'filter' => array( 839 'filter' => FILTER_DEFAULT, 840 'pageset' => true, 841 'default' => '' 842 ), 843 'sort_column' => array( 844 'filter' => FILTER_CALLBACK, 845 'default' => 'name', 846 'options' => array('options' => 'sanitize_search_string') 847 ), 848 'sort_direction' => array( 849 'filter' => FILTER_CALLBACK, 850 'default' => 'ASC', 851 'options' => array('options' => 'sanitize_search_string') 852 ), 853 'has_graphs' => array( 854 'filter' => FILTER_VALIDATE_REGEXP, 855 'options' => array('options' => array('regexp' => '(true|false)')), 856 'pageset' => true, 857 'default' => read_config_option('default_has') == 'on' ? 'true':'false' 858 ) 859 ); 860 861 validate_store_request_vars($filters, 'sess_vdef'); 862 /* ================= input validation ================= */ 863 864 vdef_filter(); 865 866 $total_rows = 0; 867 $vdefs = array(); 868 869 if (get_request_var('rows') == '-1') { 870 $rows = read_config_option('num_rows_table'); 871 } else { 872 $rows = get_request_var('rows'); 873 } 874 875 $vdefs = get_vdef_records($total_rows, $rows); 876 877 $nav = html_nav_bar('vdef.php?filter=' . get_request_var('filter'), MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, 5, __('VDEFs'), 'page', 'main'); 878 879 form_start('vdef.php', 'chk'); 880 881 print $nav; 882 883 html_start_box('', '100%', '', '3', 'center', ''); 884 885 $display_text = array( 886 'name' => array('display' => __('VDEF Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __esc('The name of this VDEF.') ), 887 'nosort' => array('display' => __('Deletable'), 'align' => 'right', 'tip' => __esc('VDEFs that are in use cannot be Deleted. In use is defined as being referenced by a Graph or a Graph Template.') ), 888 'graphs' => array('display' => __('Graphs Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __esc('The number of Graphs using this VDEF.') ), 889 'templates' => array('display' => __('Templates Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __esc('The number of Graphs Templates using this VDEF.') ) 890 ); 891 892 html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); 893 894 $i = 0; 895 if (cacti_sizeof($vdefs)) { 896 foreach ($vdefs as $vdef) { 897 if ($vdef['graphs'] == 0 && $vdef['templates'] == 0) { 898 $disabled = false; 899 } else { 900 $disabled = true; 901 } 902 903 form_alternate_row('line' . $vdef['id'], false, $disabled); 904 form_selectable_cell(filter_value($vdef['name'], get_request_var('filter'), 'vdef.php?action=edit&id=' . $vdef['id']), $vdef['id']); 905 form_selectable_cell($disabled ? __('No'):__('Yes'), $vdef['id'], '', 'right'); 906 form_selectable_cell(number_format_i18n($vdef['graphs'], '-1'), $vdef['id'], '', 'right'); 907 form_selectable_cell(number_format_i18n($vdef['templates'], '-1'), $vdef['id'], '', 'right'); 908 form_checkbox_cell($vdef['name'], $vdef['id'], $disabled); 909 form_end_row(); 910 } 911 } else { 912 print "<tr class='tableRow'><td colspan='" . (cacti_sizeof($display_text)+1) . "'><em>" . __('No VDEFs') . "</em></td></tr>\n"; 913 } 914 915 html_end_box(false); 916 917 if (cacti_sizeof($vdefs)) { 918 print $nav; 919 } 920 921 /* draw the dropdown containing a list of available actions for this form */ 922 draw_actions_dropdown($vdef_actions); 923 924 form_end(); 925} 926