Skip to content

Commit e0f18c9

Browse files
committed
Some fixes and improvements
1 parent afcad59 commit e0f18c9

File tree

4 files changed

+154
-23
lines changed

4 files changed

+154
-23
lines changed

install.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
'curl',
4040
'pcre',
4141
//'gd',
42+
'yaml',
4243
'mysqli'
4344
);
4445

modules/AnsibleAWX.php

Lines changed: 82 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,38 @@ public function parse_form_and_start_runbook($post_data, &$result_json)
379379
return $job_id;
380380
}
381381

382+
private function parse_extra_vars($extra_vars)
383+
{
384+
if(empty($extra_vars)) {
385+
return [];
386+
}
387+
388+
$parsed_data = json_decode($extra_vars, TRUE);
389+
if(json_last_error() !== JSON_ERROR_NONE)
390+
{
391+
$parsed_data = yaml_parse($extra_vars);
392+
if($yamlData === false) {
393+
return [];
394+
}
395+
}
396+
397+
$params = array();
398+
399+
foreach($parsed_data as $key => $value)
400+
{
401+
$params[] = [
402+
'name' => $key,
403+
'description' => '',
404+
'variable' => $key,
405+
'default' => $value,
406+
'flags' => RBF_FIELD_TYPE_STRING,
407+
'list' => NULL
408+
];
409+
}
410+
411+
return $params;
412+
}
413+
382414
private function param_type_to_flag($type)
383415
{
384416
switch($type)
@@ -429,12 +461,33 @@ public function retrieve_playbooks()
429461
do {
430462
$result = $this->awx_api_request('GET', $url);
431463

432-
foreach ($result['results'] as $template) {
464+
foreach($result['results'] as $template)
465+
{
466+
$params = (defined('AWX_DONT_PARSE_EXTRA_VARS') && AWX_DONT_PARSE_EXTRA_VARS) ? NULL : $this->parse_extra_vars($template['extra_vars']);
467+
468+
if($template['survey_enabled'])
469+
{
470+
$survey_params = $this->retrieve_survey_params($template['related']['survey_spec']);
471+
472+
$merged = array();
473+
foreach($params as $param)
474+
{
475+
$merged[$param['variable']] = $param;
476+
}
477+
478+
foreach ($survey_params as $param)
479+
{
480+
$merged[$param['variable']] = $param;
481+
}
482+
483+
$params = array_values($merged);
484+
}
485+
433486
$playbooks[] = [
434487
'id' => (string) $template['id'],
435488
'name' => $template['name'],
436489
'description' => $template['description'] ?? '',
437-
'params' => $template['survey_enabled'] ? $this->retrieve_survey_params($template['related']['survey_spec']) : NULL,
490+
'params' => $params,
438491
'type' => $type
439492
];
440493
}
@@ -742,15 +795,35 @@ public function get_job($id)
742795
'instances' => array()
743796
);
744797

745-
if($this->core->db->select_assoc_ex($job_params, rpv('SELECT jp.`guid`, jp.`value` FROM @runbooks_jobs_params AS jp WHERE jp.`pid` = #', $id)))
798+
// if($this->core->db->select_assoc_ex($job_params, rpv('SELECT jp.`guid`, jp.`value` FROM @runbooks_jobs_params AS jp WHERE jp.`pid` = #', $id)))
799+
// {
800+
// $job_info['input_params'] = array();
801+
// foreach($job_params as &$job_param)
802+
// {
803+
// $job_info['input_params'][] = array(
804+
// 'name' => $job_param['guid'],
805+
// 'value' => $job_param['value']
806+
// );
807+
// }
808+
// }
809+
810+
if(isset($job_data['extra_vars']))
746811
{
747-
$job_info['input_params'] = array();
748-
foreach($job_params as &$job_param)
812+
$extra_vars = json_decode($job_data['extra_vars'], TRUE);
813+
if($extra_vars !== FALSE)
749814
{
750-
$job_info['input_params'][] = array(
751-
'name' => $job_param['guid'],
752-
'value' => $job_param['value']
753-
);
815+
if(!isset($job_info['input_params']))
816+
{
817+
$job_info['input_params'] = array();
818+
}
819+
820+
foreach($extra_vars as $var => $value)
821+
{
822+
$job_info['input_params'][] = array(
823+
'name' => $var,
824+
'value' => is_array($value) ? implode(', ', $value) : $value
825+
);
826+
}
754827
}
755828
}
756829

templates/style.css

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,35 @@ body {
524524
border-radius: 3px;
525525
}
526526

527+
.tooltip-icon {
528+
display: inline-block;
529+
width: 16px;
530+
height: 16px;
531+
text-align: center;
532+
cursor: help;
533+
position: relative;
534+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23888888' d='M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z'/%3E%3C/svg%3E");
535+
/* background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z'/%3E%3C/svg%3E"); */
536+
background-repeat: no-repeat;
537+
background-position: center;
538+
background-size: contain;
539+
}
540+
541+
.tooltip-icon:hover::after {
542+
content: attr(data-tooltip);
543+
position: absolute;
544+
left: 100%;
545+
top: 50%;
546+
transform: translateY(-50%);
547+
margin-left: 5px;
548+
padding: 5px 10px;
549+
background-color: #333;
550+
color: #fff;
551+
border-radius: 4px;
552+
white-space: nowrap;
553+
z-index: 100;
554+
font-size: 14px;
555+
}
527556

528557
.notifyjs-bootstrap-base {
529558
font-weight: bold;
@@ -814,19 +843,26 @@ ul.tree-menu:before {
814843
z-index: 99;
815844
overflow: auto;
816845
max-height: 140px;
846+
background-color: white;
847+
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
848+
margin-top: -4px;
817849
}
818850
.autocomplete-items div {
819851
font-size: 8pt;
820852
padding: 3px;
821853
cursor: pointer;
822854
background-color: #f5f5f5;
823-
border-bottom: 1px solid #d4d4d4;
855+
border-bottom: 1px solid #eee;
824856
max-width: 490px;
857+
color: #333;
825858
}
826859
.autocomplete-items div:hover {
827860
background-color: #e9e9e9;
828861
}
829862
.autocomplete-active {
863+
/* background-color: #d3f2bf !important; */
864+
/* color: #333 !important; */
865+
/* border-left: 3px solid #4CAF50; */
830866
background-color: DodgerBlue !important;
831-
color: #ffffff;
867+
color: #ffffff !important;
832868
}

websco.js

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,9 @@ function f_append_fields(el, fields, form_id, spoiler_id)
529529
}
530530
else if(fields[i].type == 'list' && fields[i].list)
531531
{
532-
html = '<div class="form-title"><label for="' + escapeHtml(form_id + fields[i].name) + '"' + (fields[i].description ? ' title="' + escapeHtml(fields[i].description) + '"' : '' ) +'>' + escapeHtml(fields[i].title) + ':</label></div>'
532+
html = '<div class="form-title"><label for="' + escapeHtml(form_id + fields[i].name) + '">' + escapeHtml(fields[i].title) + ':'
533+
+ (fields[i].description ? '<span class="tooltip-icon" data-tooltip="' + escapeHtml(fields[i].description) + '"></span>' : '' )
534+
+ '</label></div>'
533535
+ '<select class="form-field" id="' + escapeHtml(form_id + fields[i].name) + '" name="'+ escapeHtml(fields[i].name) + '">'
534536
+ '<option value=""></option>';
535537
for(j = 0; j < fields[i].list.length; j++)
@@ -559,7 +561,9 @@ function f_append_fields(el, fields, form_id, spoiler_id)
559561
{
560562
value = parseInt(fields[i].value, 10);
561563

562-
html = '<div class="form-title"' + (fields[i].description ? ' title="' + escapeHtml(fields[i].description) + '"' : '' ) +'>' + escapeHtml(fields[i].title) + ':</div>';
564+
html = '<div class="form-title">' + escapeHtml(fields[i].title) + ':'
565+
+ (fields[i].description ? '<span class="tooltip-icon" data-tooltip="' + escapeHtml(fields[i].description) + '"></span>' : '' )
566+
+ '</div>';
563567
for(j = 0; j < fields[i].list.length; j++)
564568
{
565569
checked = '';
@@ -580,7 +584,9 @@ function f_append_fields(el, fields, form_id, spoiler_id)
580584
{
581585
value = parseInt(fields[i].value, 10);
582586

583-
html = '<div class="form-title"' + (fields[i].description ? ' title="' + escapeHtml(fields[i].description) + '"' : '' ) +'>' + escapeHtml(fields[i].title) + ':</div>';
587+
html = '<div class="form-title">' + escapeHtml(fields[i].title) + ':'
588+
+ (fields[i].description ? '<span class="tooltip-icon" data-tooltip="' + escapeHtml(fields[i].description) + '"></span>' : '' )
589+
+ '</div>';
584590
for(j = 0; j < fields[i].list.length; j++)
585591
{
586592
checked = '';
@@ -600,7 +606,9 @@ function f_append_fields(el, fields, form_id, spoiler_id)
600606
else if(fields[i].type == 'datetime')
601607
{
602608
var wrapper = document.createElement('div');
603-
wrapper.innerHTML = '<div class="form-title"><label for="' + escapeHtml(form_id + fields[i].name) + '"' + (fields[i].description ? ' title="' + escapeHtml(fields[i].description) + '"' : '' ) +'>' + escapeHtml(fields[i].title) + ':</label></div>'
609+
wrapper.innerHTML = '<div class="form-title"><label for="' + escapeHtml(form_id + fields[i].name) + '">' + escapeHtml(fields[i].title) + ':'
610+
+ (fields[i].description ? '<span class="tooltip-icon" data-tooltip="' + escapeHtml(fields[i].description) + '"></span>' : '' )
611+
+ '</label></div>'
604612
+ '<input class="form-field" id="'+ escapeHtml(form_id + fields[i].name) + '" name="'+ escapeHtml(fields[i].name) + '" type="edit" value="' + escapeHtml(fields[i].value) + '"/>'
605613
+ '<div id="'+ escapeHtml(form_id + fields[i].name) + '-error" class="form-error"></div>';
606614
el.appendChild(wrapper);
@@ -623,7 +631,9 @@ function f_append_fields(el, fields, form_id, spoiler_id)
623631
else if(fields[i].type == 'time')
624632
{
625633
var wrapper = document.createElement('div');
626-
wrapper.innerHTML = '<div class="form-title"><label for="' + escapeHtml(form_id + fields[i].name) + '"' + (fields[i].description ? ' title="' + escapeHtml(fields[i].description) + '"' : '' ) +'>' + escapeHtml(fields[i].title) + ':</label></div>'
634+
wrapper.innerHTML = '<div class="form-title"><label for="' + escapeHtml(form_id + fields[i].name) + '">' + escapeHtml(fields[i].title) + ':'
635+
+ (fields[i].description ? '<span class="tooltip-icon" data-tooltip="' + escapeHtml(fields[i].description) + '"></span>' : '' )
636+
+ '</label></div>'
627637
+ '<input class="form-field" id="'+ escapeHtml(form_id + fields[i].name) + '" name="'+ escapeHtml(fields[i].name) + '" type="edit" value="' + escapeHtml(fields[i].value) + '"/>'
628638
+ '<div id="'+ escapeHtml(form_id + fields[i].name) + '-error" class="form-error"></div>';
629639
el.appendChild(wrapper);
@@ -648,7 +658,9 @@ function f_append_fields(el, fields, form_id, spoiler_id)
648658
else if(fields[i].type == 'date')
649659
{
650660
var wrapper = document.createElement('div');
651-
wrapper.innerHTML = '<div class="form-title"><label for="' + escapeHtml(form_id + fields[i].name) + '"' + (fields[i].description ? ' title="' + escapeHtml(fields[i].description) + '"' : '' ) +'>' + escapeHtml(fields[i].title) + ':</label></div>'
661+
wrapper.innerHTML = '<div class="form-title"><label for="' + escapeHtml(form_id + fields[i].name) + '">' + escapeHtml(fields[i].title) + ':'
662+
+ (fields[i].description ? '<span class="tooltip-icon" data-tooltip="' + escapeHtml(fields[i].description) + '"></span>' : '' )
663+
+ '</label></div>'
652664
+ '<input class="form-field" id="'+ escapeHtml(form_id + fields[i].name) + '" name="'+ escapeHtml(fields[i].name) + '" type="edit" value="' + escapeHtml(fields[i].value) + '"/>'
653665
+ '<div id="'+ escapeHtml(form_id + fields[i].name) + '-error" class="form-error"></div>';
654666
el.appendChild(wrapper);
@@ -673,7 +685,9 @@ function f_append_fields(el, fields, form_id, spoiler_id)
673685
}
674686
else if(fields[i].type == 'password')
675687
{
676-
html = '<div class="form-title"><label for="'+ escapeHtml(form_id + fields[i].name) + '"' + (fields[i].description ? ' title="' + escapeHtml(fields[i].description) + '"' : '' ) +'>' + escapeHtml(fields[i].title) + ':</label></div>'
688+
html = '<div class="form-title"><label for="'+ escapeHtml(form_id + fields[i].name) + '">' + escapeHtml(fields[i].title) + ':'
689+
+ (fields[i].description ? '<span class="tooltip-icon" data-tooltip="' + escapeHtml(fields[i].description) + '"></span>' : '' )
690+
+ '</label></div>'
677691
+ '<input class="form-field" id="' + escapeHtml(form_id + fields[i].name) + '" name="'+ escapeHtml(fields[i].name) + '" type="password" value=""/>'
678692
+ '<div id="'+ escapeHtml(form_id + fields[i].name) + '-error" class="form-error"></div>';
679693

@@ -683,7 +697,9 @@ function f_append_fields(el, fields, form_id, spoiler_id)
683697
}
684698
else if(fields[i].type == 'tree')
685699
{
686-
html = '<div class="form-title"><label for="'+ escapeHtml(form_id + fields[i].name) + '">' + escapeHtml(fields[i].title) + ':</label></div>'
700+
html = '<div class="form-title"><label for="'+ escapeHtml(form_id + fields[i].name) + '">' + escapeHtml(fields[i].title) + ':'
701+
+ (fields[i].description ? '<span class="tooltip-icon" data-tooltip="' + escapeHtml(fields[i].description) + '"></span>' : '' )
702+
+ '</label></div>'
687703
+ '<input id="' + escapeHtml(form_id + fields[i].name) + '" name="'+ escapeHtml(fields[i].name) + '" type="hidden" value="'+ escapeHtml(fields[i].value) + '"/>'
688704
+ '<div class="tree-menu" id="' + escapeHtml(form_id + fields[i].name) + '-tree" style="float: unset; width: unset;">' + f_print_tree(fields[i].tree, form_id + fields[i].name) + '</div>'
689705
+ '<div id="' + escapeHtml(form_id + fields[i].name) + '-error" class="form-error"></div>';
@@ -694,7 +710,9 @@ function f_append_fields(el, fields, form_id, spoiler_id)
694710
}
695711
else if(fields[i].type == 'readonly')
696712
{
697-
html = '<div class="form-title"><label for="'+ escapeHtml(form_id + fields[i].name) + '">' + escapeHtml(fields[i].title) + ':</label></div>'
713+
html = '<div class="form-title"><label for="'+ escapeHtml(form_id + fields[i].name) + '">' + escapeHtml(fields[i].title) + ':'
714+
+ (fields[i].description ? '<span class="tooltip-icon" data-tooltip="' + escapeHtml(fields[i].description) + '"></span>' : '' )
715+
+ '</label></div>'
698716
+ '<input class="form-field" id="' + escapeHtml(form_id + fields[i].name) + '" name="'+ escapeHtml(fields[i].name) + '" type="text" readonly="readonly" value="'+ escapeHtml(fields[i].value) + '"/>'
699717
+ '<div id="'+ escapeHtml(form_id + fields[i].name) + '-error" class="form-error"></div>';
700718

@@ -712,7 +730,9 @@ function f_append_fields(el, fields, form_id, spoiler_id)
712730
}
713731
else if(fields[i].type == 'upload')
714732
{
715-
html = '<div class="form-title"><label for="'+ escapeHtml(form_id + fields[i].name) + '"' + (fields[i].description ? ' title="' + escapeHtml(fields[i].description) + '"' : '' ) +'>' + escapeHtml(fields[i].title) + ':</label></div>'
733+
html = '<div class="form-title"><label for="'+ escapeHtml(form_id + fields[i].name) + '">' + escapeHtml(fields[i].title) + ':'
734+
+ (fields[i].description ? '<span class="tooltip-icon" data-tooltip="' + escapeHtml(fields[i].description) + '"></span>' : '' )
735+
+ '</label></div>'
716736
+ '<span class="form-upload" id="' + escapeHtml(form_id + fields[i].name) + '-file">&nbsp;</span> <a href="#" onclick="gi(\'' + escapeHtml(form_id + fields[i].name) + '\').click(); return false;"/>' + LL.SelectFile + '</a>'
717737
+ '<input id="' + escapeHtml(form_id + fields[i].name) + '" name="'+ escapeHtml(fields[i].name) + '" type="file" accept="' + escapeHtml(fields[i].accept?fields[i].accept:'') + '" style="display: none"/>'
718738
+ '<div id="' + escapeHtml(form_id + fields[i].name) + '-error" class="form-error"></div>';
@@ -752,8 +772,9 @@ function f_append_fields(el, fields, form_id, spoiler_id)
752772
placeholder = '" placeholder="' + fields[i].placeholder;
753773
}
754774

755-
html = '<div class="form-title"><label for="'+ escapeHtml(form_id + fields[i].name) + '"' + (fields[i].description ? ' title="' + escapeHtml(fields[i].description) + '"' : '' ) +'>' + escapeHtml(fields[i].title) + ':</label></div>'
756-
+ '<input class="form-field" id="' + escapeHtml(form_id + fields[i].name) + '" name="'+ escapeHtml(fields[i].name) + '" type="edit" value="'+ escapeHtml(fields[i].value) + placeholder + '"/>'
775+
html = '<div class="form-title"><label for="'+ escapeHtml(form_id + fields[i].name) + '">' + escapeHtml(fields[i].title) + ':'
776+
+ (fields[i].description ? '<span class="tooltip-icon" data-tooltip="' + escapeHtml(fields[i].description) + '"></span>' : '' )
777+
+ '</label></div><input class="form-field" id="' + escapeHtml(form_id + fields[i].name) + '" name="'+ escapeHtml(fields[i].name) + '" type="edit" value="'+ escapeHtml(fields[i].value) + placeholder + '"/>'
757778
+ '<div id="'+ escapeHtml(form_id + fields[i].name) + '-error" class="form-error"></div>';
758779

759780
var wrapper = document.createElement('div');

0 commit comments

Comments
 (0)