This is an automated email from the ASF dual-hosted git repository. jfthomps pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/vcl.git
The following commit(s) were added to refs/heads/develop by this push: new 7d9926b4 requests.php: -modified newReservationHTML: changed code around so that environment is selected first then reservation type -modified processRequestInput: added check for user submitting reservation type server when user doesn't have access to make a server reservation for the selected environment new cdac6d3d Merge branch 'develop' of https://gitbox.apache.org/repos/asf/vcl into develop 7d9926b4 is described below commit 7d9926b468bf1e0b60d17ab90861d669cf7d0d10 Author: Josh Thompson <jftho...@ncsu.edu> AuthorDate: Thu Nov 2 21:02:34 2023 -0400 requests.php: -modified newReservationHTML: changed code around so that environment is selected first then reservation type -modified processRequestInput: added check for user submitting reservation type server when user doesn't have access to make a server reservation for the selected environment requests.js: -modified showNewResDlg: commented out call to selectResType when basic radio selected -modified resetNewResDlg: removed call to checkSelectedInList -added setResTypeButtons -modified selectResType: moved some code to showHideTypeInputs -added showHideTypeInputs -removed checkSelectedInList -modified setFirstAvailableImage: added call to setResTypeButtons; added code to change max reservation duration length to max set on image only if it is <= user's max time -modified getImageDescription: added reservation type to data passed to AJAX call vcl.css: added .newResRadio:disabled+label --- web/.ht-inc/requests.php | 121 +++++++++++++++++++++--------------- web/css/vcl.css | 4 ++ web/js/requests.js | 159 ++++++++++++++++++++++++++++++----------------- 3 files changed, 175 insertions(+), 109 deletions(-) diff --git a/web/.ht-inc/requests.php b/web/.ht-inc/requests.php index c836668a..4513635a 100644 --- a/web/.ht-inc/requests.php +++ b/web/.ht-inc/requests.php @@ -1308,9 +1308,13 @@ function newReservationHTML() { 'checkout' => 1, 'maxinitialtime' => 0, 'revisions' => 0); + if(! isset($server['image'][$id])) + $images[$id]['server'] = 0; if(array_key_exists($id, $imagedata) && - ! $imagedata[$id]["forcheckout"]) + ! $imagedata[$id]["forcheckout"]) { $images[$id]['checkout'] = 0; + $images[$id]['server'] = 0; + } if(array_key_exists($id, $imagedata) && $imagingaccess && array_key_exists($id, $imaging['image'])) { if($imagedata[$id]['rootaccess'] == 1 || $imagedata[$id]['ownerid'] == $user['id']) @@ -1340,6 +1344,9 @@ function newReservationHTML() { $images[$id]['revisions'] = 1; $dorevisionscont = 1; } + if($images[$id]['imaging'] == 0 && $images[$id]['checkout'] == 0) { + unset($images[$id]); + } } } if(in_array('serverCheckOut', $user['privileges']) && @@ -1385,7 +1392,7 @@ function newReservationHTML() { } $imageid = getUsersLastImage($user['id']); - if(is_null($imageid) && count($images)) { + if((is_null($imageid) || ! isset($images[$imageid])) && count($images)) { $tmp = array_keys($images); $imageid = $tmp[0]; } @@ -1446,7 +1453,7 @@ function newReservationHTML() { $h .= "<h2>" . i("New Reservation") . "</h2>\n"; if(! count($images)) { - $h .= i("You do not have access to any images."); + $h .= i("You do not have access to any environments."); $h .= "<br><br>\n"; $h .= " <div align=\"center\"><br>\n"; $h .= " <button dojoType=\"dijit.form.Button\">\n"; @@ -1461,49 +1468,6 @@ function newReservationHTML() { return $h; } - $chk = array('base' => '', 'imaging' => '', 'server' => ''); - if(! $baseaccess && $serveraccess) - $chk['server'] = 'checked'; - elseif($forimaging) - $chk['imaging'] = 'checked'; - else - $chk['base'] = 'checked'; - - $showradios = 0; - if($baseaccess + $imagingaccess + $serveraccess > 1) - $showradios = 1; - if($showradios) - $h .= i("Reservation type:") . "<br>\n"; - $h .= "<div"; - if(! $baseaccess || $showradios == 0) - $h .= " style=\"display: none;\""; - else - $h .= " style=\"display: inline-block;\""; - $h .= "><input type=\"radio\" id=\"basicrdo\" name=\"restype\" "; - $h .= "onclick=\"selectResType();\" {$chk['base']}>\n"; - $h .= "<label for=\"basicrdo\">" . i("Basic Reservation"); - $h .= "</label></div>\n"; - $h .= "<div"; - if(! $imagingaccess || $showradios == 0) - $h .= " style=\"display: none;\""; - else - $h .= " style=\"display: inline-block;\""; - $h .= "><input type=\"radio\" id=\"imagingrdo\" name=\"restype\" "; - $h .= "onclick=\"selectResType();\" {$chk['imaging']}>\n"; - $h .= "<label for=\"imagingrdo\">" . i("Imaging Reservation"); - $h .= "</label></div>\n"; - $h .= "<div"; - if(! $serveraccess || $showradios == 0) - $h .= " style=\"display: none;\""; - else - $h .= " style=\"display: inline-block;\""; - $h .= "><input type=\"radio\" id=\"serverrdo\" name=\"restype\" "; - $h .= "onclick=\"selectResType();\" {$chk['server']}>\n"; - $h .= "<label for=\"serverrdo\">" . i("Server Reservation"); - $h .= "</label></div>\n"; - if($showradios) - $h .= "<br><br>\n"; - /*$h .= "<span id=\"deployprofileslist\" class=\"hidden\">\n"; $h .= "<div dojoType=\"dojo.data.ItemFileWriteStore\" jsId=\"profilesstore\" "; $h .= "data=\"profilesstoredata\"></div>\n"; @@ -1525,7 +1489,6 @@ function newReservationHTML() { $h .= "<input type=\"hidden\" id=\"appliedprofileid\" value=\"0\">\n"; $h .= "</span>\n"; # deployprofileslist*/ - $h .= "<div id=\"deployserverdiv\">\n"; # directions $h .= "<span id=\"nrdirections\">"; $h .= i("Please select the environment you want to use from the list:"); @@ -1564,14 +1527,57 @@ function newReservationHTML() { $h .= "<select dojoType=\"dijit.form.FilteringSelect\" id=\"deployimage\" "; $h .= "style=\"width: 95%;\" required=\"true\" store=\"imagestore\" "; $h .= "queryExpr=\"*\${0}*\" "; - if($forimaging) - $h .= "query=\"{imaging: 1}\" "; - else - $h .= "query=\"{basic: 1, checkout: 1}\" "; $h .= "highlightMatch=\"all\" autoComplete=\"false\" "; $h .= "invalidMessage=\"" . i("Please select a valid environment"); $h .= "\" onChange=\"selectEnvironment();\" tabIndex=1></select>\n"; $h .= "</span><br><br>\n"; + + $chk = array('base' => '', 'imaging' => '', 'server' => ''); + if(! $baseaccess && $serveraccess) + $chk['server'] = 'checked'; + elseif($forimaging) + $chk['imaging'] = 'checked'; + else + $chk['base'] = 'checked'; + + $h .= "<span id=\"restyperadios\">\n"; + $showradios = 0; + if($baseaccess + $imagingaccess + $serveraccess > 1) + $showradios = 1; + if($showradios) + $h .= i("Reservation type:") . "<br>\n"; + $h .= "<div"; + if(! $baseaccess || $showradios == 0) + $h .= " style=\"display: none;\""; + else + $h .= " style=\"display: inline-block;\""; + $h .= "><input type=\"radio\" id=\"basicrdo\" name=\"restype\" "; + $h .= "onclick=\"selectResType();\" {$chk['base']} class=\"newResRadio\">\n"; + $h .= "<label for=\"basicrdo\">" . i("Basic Reservation"); + $h .= "</label></div>\n"; + $h .= "<div"; + if(! $imagingaccess || $showradios == 0) + $h .= " style=\"display: none;\""; + else + $h .= " style=\"display: inline-block;\""; + $h .= "><input type=\"radio\" id=\"imagingrdo\" name=\"restype\" "; + $h .= "onclick=\"selectResType();\" {$chk['imaging']} class=\"newResRadio\">\n"; + $h .= "<label for=\"imagingrdo\">" . i("Imaging Reservation"); + $h .= "</label></div>\n"; + $h .= "<div"; + if(! $serveraccess || $showradios == 0) + $h .= " style=\"display: none;\""; + else + $h .= " style=\"display: inline-block;\""; + $h .= "><input type=\"radio\" id=\"serverrdo\" name=\"restype\" "; + $h .= "onclick=\"selectResType();\" {$chk['server']} class=\"newResRadio\">\n"; + $h .= "<label for=\"serverrdo\">" . i("Server Reservation"); + $h .= "</label></div>\n"; + if($showradios) + $h .= "<br><br>\n"; + $h .= "</span>\n"; # restyperadios + + $h .= "<div id=\"deployserverdiv\">\n"; $imagenotes = getImageNotes($imageid); $desc = ''; if(! preg_match('/^\s*$/', $imagenotes['description'])) { @@ -1700,6 +1706,7 @@ function newReservationHTML() { $h .= labeledFormItem('nousercheck', i('Disable timeout for disconnected users'), 'check', '', '', '1'); $h .= "<br></span>"; + $h .= "<div id=\"whenstartblock\">\n"; $h .= "<span id=\"whentitlebasic\">"; $h .= i("When would you like to use the environment?"); $h .= "</span>\n"; @@ -1710,8 +1717,10 @@ function newReservationHTML() { $h .= i("When would you like to deploy the server?"); $h .= "</span>"; $h .= "<br>\n"; + $h .= "</div>\n"; # whenstartblock # duration radios + $h .= "<span id=\"durationblock\">\n"; $h .= " "; $h .= "<input type=\"radio\" id=\"startnow\" name=\"deploystart\" "; $h .= "onclick=\"setStartNow();\" checked>\n"; @@ -1740,6 +1749,7 @@ function newReservationHTML() { $h .= selectInputHTML('meridian', array("am" => "a.m.", "pm" => "p.m."), 'deploymeridian', "onChange='setStartLater();'", $timeArr[2]); $h .= "</span>\n"; + $h .= "</span>\n"; # durationblock # any start $h .= "<span id=\"anystart\" class=\"hidden\">\n"; @@ -1873,6 +1883,9 @@ function AJupdateWaitTime() { ($type == 'imaging' && ! $imagingaccess) || ($type == 'server' && ! $serveraccess)) return; + + print "showHideTypeInputs();"; + if($type == 'imaging') $imaging = 1; @@ -4685,6 +4698,12 @@ function processRequestInput() { $return['errmsg'] = i('No access to submitted environment'); return $return; } + $server = getUserResources(array("serverCheckOut"), array("available")); + if($return['type'] == 'server' && ! isset($server['image'][$return['imageid']])) { + $return['err'] = 1; + $return['errmsg'] = i('Server reservation not allowed for submitted environment'); + return $return; + } # nousercheck $return['nousercheck'] = processInputVar('nousercheck', ARG_NUMERIC); diff --git a/web/css/vcl.css b/web/css/vcl.css index a1a75f8c..1d7287fd 100644 --- a/web/css/vcl.css +++ b/web/css/vcl.css @@ -181,6 +181,10 @@ body { width: 100px; } +.newResRadio:disabled+label { + color: #aaa; +} + #resStatusText { width: 100%; height: 100%; diff --git a/web/js/requests.js b/web/js/requests.js index b8272f92..3221bbca 100644 --- a/web/js/requests.js +++ b/web/js/requests.js @@ -79,7 +79,7 @@ function initViewRequests(imaging) { function showNewResDlg() { resetNewResDlg(); if(dojo.byId('basicrdo')) { - selectResType(); + //selectResType(); selectEnvironment(); } if(dijit.byId('newResDlgBtn')) @@ -140,15 +140,102 @@ function resetNewResDlg() { function setLastImage() { var sel = dijit.byId('deployimage'); sel.set('value', lastimageid); - checkSelectedInList(); +} + +function setResTypeButtons() { + var item = dijit.byId('deployimage').get('item'); + var checkout = imagestore.getValue(item, 'checkout'); + var imaging = imagestore.getValue(item, 'imaging'); + var server = imagestore.getValue(item, 'server'); + if(server) { + dojo.byId('serverrdo').disabled = false; + } + else { + if(dojo.byId('serverrdo').checked) { + if(checkout) { + dojo.byId('basicrdo').checked = true; + } + else if(imaging) { + dojo.byId('imagingrdo').checked = true; + } + } + dojo.byId('serverrdo').checked = false; + dojo.byId('serverrdo').disabled = true; + } + if(checkout) { + dojo.byId('basicrdo').disabled = false; + } + else { + if(dojo.byId('basicrdo').checked) { + if(imaging) { + dojo.byId('imagingrdo').checked = true; + } + else if(server) { + dojo.byId('serverrdo').checked = true; + } + } + dojo.byId('basicrdo').checked = false; + dojo.byId('basicrdo').disabled = true; + } + if(imaging) { + dojo.byId('imagingrdo').disabled = false; + } + else { + if(dojo.byId('imagingrdo').checked) { + if(checkout) { + dojo.byId('basicrdo').checked = true; + } + else if(server) { + dojo.byId('serverrdo').checked = true; + } + } + dojo.byId('imagingrdo').checked = false; + dojo.byId('imagingrdo').disabled = true; + } + selectResType(); } function selectResType() { + showHideTypeInputs(); + if(dojo.byId('basicrdo').checked) { + var imageid = getSelectValue('deployimage'); + var item = dijit.byId('deployimage').get('item'); + if(item) { + var max = imagestore.getValue(item, 'maxinitialtime'); + } + if(max) + setMaxRequestLength(max); + else + setMaxRequestLength(defaultMaxTime); + if(! durationchanged) + dojo.byId('reqlength').value = 60; + } + if(dojo.byId('imagingrdo').checked) { + setMaxRequestLength(maximaging); + if(! durationchanged) + dojo.byId('reqlength').value = 480; + } + if(dojo.byId('serverrdo').checked) { + dijit.byId('deploystarttime').set('required', true); + dijit.byId('deploystartdate').set('required', true); + if(dojo.byId('endat') && ! dojo.byId('endat').checked) { + dojo.byId('endindef').checked = true; + } + } + delayedUpdateWaitTime(0, 50); + resetDeployBtnLabel(); + resizeRecenterDijitDialog('newResDlg'); +} + +function showHideTypeInputs() { + dojo.removeClass('restyperadios', 'hidden'); + dojo.removeClass('whenstartblock', 'hidden'); + dojo.removeClass('durationblock', 'hidden'); + dojo.removeClass('waittime', 'hidden'); if(dojo.byId('basicrdo').checked || dojo.byId('imagingrdo').checked) { dojo.removeClass('limitstart', 'hidden'); dojo.removeClass('durationend', 'hidden'); dojo.addClass('whentitleserver', 'hidden'); - //dojo.addClass('deployprofileslist', 'hidden'); dojo.addClass('nrnamespan', 'hidden'); dojo.addClass('nrservergroupspan', 'hidden'); //dojo.addClass('nrmacaddrspan', 'hidden'); @@ -165,54 +252,22 @@ function selectResType() { dojo.addClass('endlbl', 'hidden'); dojo.addClass('specifyend', 'hidden'); } - if(dojo.byId('endat') && ! dojo.byId('endat').checked && - dojo.byId('endduration')) { - dojo.byId('endduration').checked = true; - delayedUpdateWaitTime(0, 50); - } } if(dojo.byId('basicrdo').checked) { - dijit.byId('deployimage').set('query', {basic: 1, checkout: 1}); - checkSelectedInList(); if(dijit.byId('nousercheck')) dojo.removeClass('nousercheckspan', 'hidden'); - var imageid = getSelectValue('deployimage'); - var item = dijit.byId('deployimage').get('item'); - var max = imagestore.getValue(item, 'maxinitialtime'); - if(max) - setMaxRequestLength(max); - else - setMaxRequestLength(defaultMaxTime); dojo.removeClass('whentitlebasic', 'hidden'); dojo.addClass('whentitleimaging', 'hidden'); - if(! durationchanged) - dojo.byId('reqlength').value = 60; - } - if(dojo.byId('imagingrdo').checked) { - dijit.byId('deployimage').set('query', {imaging: 1}); - checkSelectedInList(); - setMaxRequestLength(maximaging); dojo.removeClass('whentitleimaging', 'hidden'); dojo.addClass('whentitlebasic', 'hidden'); if(dijit.byId('nousercheck')) dojo.addClass('nousercheckspan', 'hidden'); - if(! durationchanged) - dojo.byId('reqlength').value = 480; } if(dojo.byId('serverrdo').checked) { - dijit.byId('deployimage').set('query', {server: 1, checkout: 1}); - checkSelectedInList(); if(dijit.byId('nousercheck')) dojo.addClass('nousercheckspan', 'hidden'); - dijit.byId('deploystarttime').set('required', true); - dijit.byId('deploystartdate').set('required', true); dojo.addClass('waittime', 'hidden'); dojo.addClass('deployerr', 'hidden'); - if(dojo.hasClass('anystart', 'hidden') && - dojo.byId('startlater') && - dojo.byId('startlater').checked) { - delayedUpdateWaitTime(0, 50); - } dojo.addClass('whentitlebasic', 'hidden'); dojo.addClass('whentitleimaging', 'hidden'); dojo.addClass('limitstart', 'hidden'); @@ -232,28 +287,7 @@ function selectResType() { dojo.removeClass('endlbl', 'hidden'); dojo.removeClass('specifyend', 'hidden'); //showDijitButton('newResDlgShowConfigBtn'); // finishconfigs - if(dojo.byId('endat') && ! dojo.byId('endat').checked) { - dojo.byId('endindef').checked = true; - delayedUpdateWaitTime(0, 50); - } } - resetDeployBtnLabel(); - resizeRecenterDijitDialog('newResDlg'); -} - -function checkSelectedInList() { - var sel = dijit.byId('deployimage'); - var q = new Object(); - for(v in sel.query) - q[v] = sel.query[v]; - q.id = sel.get('value'); - sel.store.fetch({ - query: q, - onComplete: function(items, request) { - if(items.length == 0) - setFirstAvailableImage(); - } - }); } function setFirstAvailableImage() { @@ -270,10 +304,11 @@ function setFirstAvailableImage() { function selectEnvironment() { if(! initialimageset) return; + setResTypeButtons(); var imageid = getSelectValue('deployimage'); var item = dijit.byId('deployimage').get('item'); var max = imagestore.getValue(item, 'maxinitialtime'); - if(max) + if(max && max < defaultMaxTime) setMaxRequestLength(max); else setMaxRequestLength(defaultMaxTime); @@ -549,9 +584,17 @@ function getImageDescription() { ! checkValidatedObj('deployimage')) return; dojo.byId('imgdesc').innerHTML = ''; + var type; + if(dojo.byId('basicrdo').checked) + type = 'basic'; + else if(dojo.byId('imagingrdo').checked) + type = 'imaging'; + else if(dojo.byId('serverrdo').checked) + type = 'server'; var data = {continuation: dojo.byId('waitcontinuation').value, desconly: 1, - imageid: getSelectValue('deployimage')} + type: type, + imageid: getSelectValue('deployimage')}; RPCwrapper(data, generalReqCB, 0, 30000); }