web/js/resources/computer.js (1,187 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function Computer() { Resource.apply(this, Array.prototype.slice.call(arguments)); this.selids = []; this.selectingall = false; this.restype = 'computer'; } Computer.prototype = new Resource(); var filterstore; var filtercbstores = {}; var extrafiltergrid; var savescroll = 0; var editobj; var addedit = 'edit'; var lastselected = {blade: {provisioningid: '', stateid: ''}, lab: {provisioningid: '', stateid: ''}, virtualmachine: {provisioningid: '', stateid: ''}}; var filterdelay; String.prototype.ucfirst = function() { return this.charAt(0).toUpperCase() + this.slice(1); } Computer.prototype.DeleteBtn = function(rscid, rowIndex) { var rowdata = this.grid.getItem(rowIndex); if(! ('deleted' in rowdata) || rowdata.deleted == '0') { var id = 'chkb' + rowdata.id; if(dojo.indexOf(resource.selids, id) != -1) var checked = true; else var checked = false; var cb = new dijit.form.CheckBox({ id: id, value: rowdata.id, checked: checked, onClick: selectRow }); cb._destroyOnRemove = true; return cb; } // resource has deleted set return '&nbsp;'; } Computer.prototype.EditBtn = function(rscid, rowIndex) { var rowdata = this.grid.getItem(rowIndex); if(! ('deleted' in rowdata) || rowdata.deleted == '0') { var btn = new dijit.form.Button({ label: 'Edit', onClick: function() { editResource(rscid); } }); } else { var btn = new dijit.form.Button({ label: 'Undelete', onClick: function() { toggleDeleteResource(rscid); } }); } btn._destroyOnRemove = true; return btn; } Computer.prototype.colformatter = function(value, rowIndex, obj) { if(obj.field == 'state') { if(value == 'failed') return '<span class="rederrormsg">failed</span>'; if(value == 'available') return '<span class="ready">available</span>'; if(value == 'reloading') return '<span class="wait">reloading</span>'; } else if(obj.field == 'notes' && value) { return value.replace('@', '<br>').replace(/\n/g, '<br>'); } else if(obj.field == 'deleted' || obj.field == 'natenabled' || obj.field == 'nathostenabled') { if(value == "0") return '<span class="rederrormsg">false</span>'; if(value == "1") return '<span class="ready">true</span>'; } return value; } Computer.prototype.toggleResFieldDisplay = function(obj, field) { for(var i in resourcegrid.layout.cells) { if(resourcegrid.layout.cells[i].field == field) { if(obj.checked) { resourcegrid.layout.setColumnVisibility(i, true); extrafiltergrid.layout.setColumnVisibility(i, true); } else { resourcegrid.layout.setColumnVisibility(i, false); extrafiltergrid.layout.setColumnVisibility(i, false); delete resourcegrid.query[field]; resourcegrid.setQuery(resourcegrid.query); } break; } } this.updateFieldCookie(field, obj.checked); } Computer.prototype.GridFilter = function() { if(dijit.byId('showdeleted').get('value')) { var width = '5.1em'; var showdeleted = '*'; } else { var width = '3em'; var showdeleted = '0'; } resourcegrid.setCellWidth(1, width); resourcegrid.layout.cells[1].view.update(); extrafiltergrid.setCellWidth(1, width); extrafiltergrid.layout.cells[1].view.update(); var query = resourcegrid.query; query['deleted'] = showdeleted; resourcegrid.setQuery(query); } function filterKeyDown(e) { if(e.keyCode == dojo.keys.ENTER) { dojo.stopEvent(e); dijit.byId('ownercb').focus(); var focusnext = 0; var cells = extrafiltergrid.layout.cells; for(var i = 2; i < cells.length; i++) { if(focusnext && ! cells[i].hidden) { dijit.byId(cells[i].field + 'cb').focus(); focusnext = 2; break; } if(cells[i].field + 'cb' == e.target.id) { focusnext = 1; continue; } } if(focusnext == 1) dijit.byId(cells[2].field + 'cb').focus(); } } Computer.prototype.Selection = function() { // TODO this messes up when all rows have been selected with selectAllRows // and then a row is unselected because this function only handles // rendered rows var sel = resourcegrid.selection.selected; if(! resource.selectingall) { dojo.forEach(resource.selids, function(id) { if(dijit.byId(id)) dijit.byId(id).set('checked', false); }); resource.selids = []; } for(var i = 0; i < sel.length; i++) { if(sel[i]) { var comp = resourcegrid.getItem(i); if(! resource.selectingall) { if(! parseInt(comp.deleted)) resource.selids.push('chkb' + comp.id); else resourcegrid.selection.deselect(comp); } if(dijit.byId('chkb' + comp.id)) dijit.byId('chkb' + comp.id).set('checked', true); } } if(resource.selids.length != resourcegrid.rowCount) dijit.byId('selectallchkb').set('checked', false); else dijit.byId('selectallchkb').set('checked', true); } Computer.prototype.nocasesort = function(a, b) { if(typeof a != 'string' && typeof b != 'string') return 0; if(typeof a != 'string') return -1; if(typeof b != 'string') return 1; var al = a.toLowerCase(); var bl = b.toLowerCase(); if(al.match(/[0-9]/) || bl.match(/[0-9]/)) { return resource.comparehostnames(al, bl); } if(al < bl) return -1; if(bl < al) return 1; return 0; } Computer.prototype.ipsort = function(a, b) { var aparts = a.split('.'); var bparts = b.split('.'); for(var i = 0; i < 4; i++) { aparts[i] = parseInt(aparts[i]); bparts[i] = parseInt(bparts[i]); } if(aparts[0] < bparts[0]) return -1; if(aparts[0] > bparts[0]) return 1; if(aparts[1] < bparts[1]) return -1; if(aparts[1] > bparts[1]) return 1; if(aparts[2] < bparts[2]) return -1; if(aparts[2] > bparts[2]) return 1; if(aparts[3] < bparts[3]) return -1; if(aparts[3] > bparts[3]) return 1; return 0; } Computer.prototype.comparehostnames = function(a, b) { // get hostname var tmp = a.split('.'); var h1 = tmp.shift(); var letters1 = h1.replace(/([^a-zA-Z])/g, ''); tmp = b.split('.'); var h2 = tmp.shift(); var letters2 = h2.replace(/([^a-zA-Z])/g, ''); // if non-numeric part is different, return based on that cmp = letters1.localeCompare(letters2); if(cmp) return cmp; // at this point, the only difference is in the numbers var digits1 = h1.replace(/([^\d-])/g, ''); var digits1Arr = digits1.split('-'); var digits2 = h2.replace(/([^\d-])/g, ''); var digits2Arr = digits2.split('-'); var len1 = digits1Arr.length; var len2 = digits2Arr.length; for(var i = 0; i < len1 && i < len2; i++) { if(parseInt(digits1Arr[i]) < parseInt(digits2Arr[i])) return -1; else if(parseInt(digits1Arr[i]) > parseInt(digits2Arr[i])) return 1; } return 0; } var resource = new Computer(); function initPage() { if(dojo.byId('reloadpageurl')) return; document.body.style.cursor = 'wait'; if(! ('resourcegrid' in window)) { setTimeout(function() { initPage(); }, 100); return; } else { document.body.style.cursor = 'default'; buildExtraFilters(); // set width of first column resourcegrid.setCellWidth(0, '21px'); resourcegrid.layout.cells[0].view.update(); // connect selection dojo.connect(resourcegrid, 'onSelectionChanged', this, resource.Selection); // hide resource name filter dojo.addClass('namefilter', 'hidden'); // connect scrolling stuff dojo.connect(resourcegrid, 'postrender', setScroll); dojo.connect(resourcegrid.views.views[0].scrollboxNode, 'onscroll', saveScroll); // select all computer groups for(var i = 0; i < dojo.byId('filtercompgroups').options.length; i++) { dojo.byId('filtercompgroups').options[i].selected = true; } // confirm new nathost button if(dijit.byId('newnathostid').options.length == 0) dijit.byId('newnathostbtn').set('disabled', true); clearTimeout(filterdelay); if(! resourcestore.comparatorMap) { resourcestore.comparatorMap = {}; } resourcestore.comparatorMap['ram'] = resource.nocasesort; resourcestore.comparatorMap['procnumber'] = resource.nocasesort; resourcestore.comparatorMap['procspeed'] = resource.nocasesort; resourcestore.comparatorMap['network'] = resource.nocasesort; resourcestore.comparatorMap['IPaddress'] = resource.ipsort; resourcestore.comparatorMap['privateIPaddress'] = resource.ipsort; resourcestore.comparatorMap['vmhost'] = resource.nocasesort; dojo.connect(resourcegrid, '_onFetchComplete', function() {dojo.byId('computercount').innerHTML = 'Computers in table: ' + resourcegrid.rowCount;}); } } function selectRow(e) { var id = this.id.replace('chkb', ''); if(this.checked) { resource.selids.push(this.id); resourcestore.fetchItemByIdentity({ identity: id, onItem: function(item, req) { resourcegrid.selection.addToSelection(resourcegrid.getItemIndex(item)); } }); } else { var index = resource.selids.indexOf(id); if(index > -1) resource.selids.splice(index, 1); resourcestore.fetchItemByIdentity({ identity: id, onItem: function(item, req) { resourcegrid.selection.deselect(resourcegrid.getItemIndex(item)); } }); } dojo.stopEvent(e); } function selectAllRows() { resourcestore.fetch({ query: resourcegrid.query, onComplete: function(items, request) { resource.selectingall = true; if(resource.selids.length) { dojo.forEach(resource.selids, function(id) { if(dijit.byId(id)) dijit.byId(id).set('checked', false); }); resource.selids = []; resourcegrid.selection.clear(); dijit.byId('selectallchkb').set('checked', false); } else { resource.selids = []; dojo.forEach(items, function(item) { if(! parseInt(item.deleted)) { resource.selids.push('chkb' + item.id); resourcegrid.selection.addToSelection(resourcegrid.getItemIndex(item)); } }) dijit.byId('selectallchkb').set('checked', true); } resource.selectingall = false; } }); } function buildExtraFilters() { // create grid layout var obj = {}; var layout = []; var cells = resourcegrid.layout.cells; for(var i = 0; i < cells.length; i++) { var litem = {}; obj[cells[i].field] = ''; litem['field'] = cells[i].field; if(cells[i].field == 'id') litem['name'] = '&nbsp;'; else litem['name'] = cells[i].name; litem['hidden'] = cells[i].hidden; if(i == 0) litem['width'] = '21px'; else if(typeof cells[i].width != 'undefined') litem['width'] = cells[i].width; litem['editable'] = false; if(i == 0) { litem['formatter'] = function(value, index, item) { var cb = new dijit.form.CheckBox({ id: 'selectallchkb', checked: false, onClick: selectAllRows, _destroyOnRemove: true }); return cb; } } if(i == 1) { litem['formatter'] = function(value, index, item) { item.customStyles.push('background-color: #e8e8e8'); item.customStyles.push('border: 1px solid black'); item.customStyles.push('text-align: center'); return '<span id=\"applyextrafilters\">Apply</span>'; } } else if(i > 1) { litem['formatter'] = function(value, index, item) { if(dijit.byId(item.field + 'cb')) return dijit.byId(item.field + 'cb'); if(item.field in filtercbstores) var store = filtercbstores[item.field]; else var store = dojo.data.ItemFileReadStore({}); var cb = new dijit.form.ComboBox({ selectOnClick: true, store: store, id: item.field + "cb", required: false, query: {id: '*'}, onChange: applyExtraFilters, field: item.field, queryExpr: '*${0}*', autoComplete: false, labelFunc: cbformatter, labelType: 'html', searchAttr: 'value', fetchProperties: {sort: [{attribute:"value"}]} }); if(typeof item.width != 'undefined') { if(item.width.match(/px/)) var newwidth = (parseInt(item.width) - 11) + 'px'; else var newwidth = (parseInt(item.width) - 0.6) + 'em'; cb.set('style', {width: newwidth}); } else if(typeof item.unitWidth != 'undefined') { if(item.unitWidth.match(/px/)) var newwidth = (parseInt(item.unitWidth) - 11) + 'px'; else var newwidth = (parseInt(item.unitWidth) - 0.6) + 'em'; cb.set('style', {width: newwidth}); } return cb; }; } layout.push(litem); } var data = {items: [obj]}; filterstore = new dojo.data.ItemFileReadStore({data: data}); extrafiltergrid = new dojox.grid.DataGrid({ query: {name: '*'}, store: filterstore, structure: layout, canSort: function() {return false;}, onCellClick: combofocus, autoWidth: true }, document.createElement('div')); dojo.byId('extrafiltersdiv').appendChild(extrafiltergrid.domNode); extrafiltergrid.startup(); var cells = extrafiltergrid.layout.cells; for(var i = 2; i < cells.length; i++) { dojo.connect(dijit.byId(cells[i].field + 'cb'), 'onKeyDown', null, filterKeyDown); } // create stores for comboboxes resourcestore.fetch({ onComplete: function(items, request) { var data = {}; var seen = {}; var cells = resourcegrid.layout.cells; dojo.forEach(items, function(item) { for(var i = 0; i < cells.length; i++) { if(cells[i].field == 'id') continue; var field = cells[i].field; if(! (field in seen)) { seen[field] = []; data[field] = []; } if(dojo.indexOf(seen[field], item[field]) == -1) { seen[field].push(item[field].toString()); data[field].push({id: item.id.toString(), value: item[cells[i].field].toString()}); } } }); for(var i = 0; i < cells.length; i++) { if(cells[i].field == 'id') continue; var field = cells[i].field; var store = new dojo.data.ItemFileReadStore({data: {identifier:'id', label:'value', items: data[field]}}); filtercbstores[field] = store; dijit.byId(field + 'cb').set('store', store); } } }); } function cbformatter(item, store) { var comp = new Computer(); return comp.colformatter(store.getValue(item, 'value'), '', this); } function combofocus(obj) { if(dijit.byId(obj.cell.field + "cb")) dijit.byId(obj.cell.field + "cb").focus(); } function applyExtraFilters(value) { delete resourcegrid.query[this.field]; value = value.replace('(', '\\('); value = value.replace(')', '\\)'); if(this.field == 'state' && value == 'inuse') resourcegrid.query[this.field] = value; else if(value != '') resourcegrid.query[this.field] = new RegExp('.*' + value + '.*', 'i'); resourcegrid.setQuery(resourcegrid.query); dojo.byId('computercount').innerHTML = 'Computers in table: ' + resourcegrid.rowCount; var savelist = resource.selids; resourcegrid.selection.clear(); var newselids = []; for(var i = 0; i < resourcegrid.rowCount; i++) { var row = resourcegrid.getItem(i); if(! row) continue; var id = 'chkb' + row.id; if(dojo.indexOf(savelist, id) != -1) { newselids.push(id); resourcegrid.selection.addToSelection(resourcegrid.getItemIndex(row)); dijit.byId(id).set('checked', true); } } resourcegrid.selids = newselids; } function addNewResource(title) { if(dijit.byId('scheduleid').options.length == 0) { dijit.byId('noschedulenoadd').show(); return; } dijit.byId('mode').set('value', 'single'); addedit = 'add'; resetEditResource(); dijit.byId('type').reset(); selectType(); dijit.byId('addeditdlg').set('title', title); dijit.byId('addeditbtn').set('label', title); dojo.byId('editresid').value = 0; dojo.removeClass('singlemultiplediv', 'hidden'); dojo.addClass('notesspan', 'hidden'); dojo.addClass('vmprofilespan', 'hidden'); dojo.addClass('curimgspan', 'hidden'); dojo.addClass('compidspan', 'hidden'); dijit.byId('nathostid').set('disabled', true); dijit.byId('nathostenabled').set('checked', false); dijit.byId('natpublicipaddress').set('disabled', true); dijit.byId('natinternalipaddress').set('disabled', true); dijit.byId('addeditdlg').show(); } function toggleSingleMultiple() { if(dijit.byId('mode').get('value') == 'single') toggleAddSingle(); else toggleAddMultiple(); } function toggleAddSingle() { dojo.addClass('multiplenotediv', 'hidden'); dojo.addClass('startenddiv', 'hidden'); dojo.addClass('multiipmacdiv', 'hidden'); dojo.removeClass('singleipmacdiv', 'hidden'); dojo.removeClass('nathost', 'hidden'); dijit.byId('name').set('regExp', '^([a-zA-Z0-9_][-a-zA-Z0-9_\.]{1,35})$'); dijit.byId('addeditbtn').setLabel('Add Computer'); recenterDijitDialog('addeditdlg'); } function toggleAddMultiple() { dojo.removeClass('multiplenotediv', 'hidden'); dojo.removeClass('startenddiv', 'hidden'); dojo.removeClass('multiipmacdiv', 'hidden'); dojo.addClass('singleipmacdiv', 'hidden'); dojo.addClass('nathost', 'hidden'); dijit.byId('name').set('regExp', '^([a-zA-Z0-9_%][-a-zA-Z0-9_\.%]{1,35})$'); dijit.byId('addeditbtn').setLabel('Add Computers'); recenterDijitDialog('addeditdlg'); } function toggleNAT(chkid, selid) { if(dijit.byId(chkid).checked) { dijit.byId(selid).set('disabled', false); } else { dijit.byId(selid).set('disabled', true); } if(chkid == 'natenabled' && dijit.byId(chkid).checked && dijit.byId('nathostenabled').checked) { dijit.byId('nathostenabled').set('checked', false); } } function toggleNAThost() { if(dijit.byId('nathostenabled').checked) { if(dijit.byId('natenabled').checked) dijit.byId('natenabled').set('checked', false); dijit.byId('natpublicipaddress').set('disabled', false); dijit.byId('natinternalipaddress').set('disabled', false); } else { dijit.byId('natpublicipaddress').set('disabled', true); dijit.byId('natinternalipaddress').set('disabled', true); } } function inlineEditResourceCB(data, ioArgs) { dojo.addClass('singlemultiplediv', 'hidden'); toggleAddSingle(); if(data.items.status == 'success') { addedit = 'edit'; editobj = data.items.data; dojo.addClass('cancelvmhostinuseokdiv', 'hidden'); if(data.items.showcancel) { dojo.removeClass('cancelvmhostinusediv', 'hidden'); dojo.byId('tohostcancelcont').value = data.items.tohostcancelcont; if(data.items.tohostfuture) { dojo.addClass('tohostnowspan', 'hidden'); dojo.removeClass('tohostfuturespan', 'hidden'); dojo.byId('tohostfuturetimespan').innerHTML = data.items.tohoststart; } else { dojo.removeClass('tohostnowspan', 'hidden'); dojo.addClass('tohostfuturespan', 'hidden'); } } else { dojo.addClass('cancelvmhostinusediv', 'hidden'); } dijit.byId('type').set('value', data.items.data.type); selectType(); dijit.byId('provisioningid').set('value', data.items.data.provisioningid); selectProvisioning(); lastselected[data.items.data.type]['provisioningid'] = data.items.data.provisioningid; dijit.byId('stateid').set('value', data.items.data.stateid); lastselected[data.items.data.type]['stateid'] = data.items.data.stateid; dojo.byId('saveresourcecont').value = data.items.cont; dijit.byId('addeditdlg').set('title', data.items.title); dijit.byId('addeditbtn').set('label', 'Save Changes'); dijit.byId('addeditbtn').set('disabled', false); dojo.byId('editresid').value = data.items.resid; dijit.byId('name').set('value', data.items.data.hostname); dijit.byId('owner').set('value', data.items.data.owner); dijit.byId('ipaddress').set('value', data.items.data.IPaddress); dijit.byId('privateipaddress').set('value', data.items.data.privateIPaddress); dijit.byId('publicmac').set('value', data.items.data.eth1macaddress); dijit.byId('privatemac').set('value', data.items.data.eth0macaddress); if('notes' in data.items.data && data.items.data.notes) { if(data.items.data.notes.match(/@/)) dijit.byId('notes').set('value', data.items.data.notes.split('@')[1]); else dijit.byId('notes').set('value', data.items.data.notes); } dijit.byId('vmprofileid').set('value', data.items.data.vmprofileid); dijit.byId('platformid').set('value', data.items.data.platformid); dijit.byId('scheduleid').set('value', data.items.data.scheduleid); dojo.byId('curimg').innerHTML = data.items.data.currentimg; dijit.byId('ram').set('value', data.items.data.ram); dijit.byId('cores').set('value', data.items.data.procnumber); dijit.byId('procspeed').set('value', data.items.data.procspeed); dijit.byId('network').set('value', data.items.data.network); dijit.byId('predictivemoduleid').set('value', data.items.data.predictivemoduleid); dojo.byId('compid').innerHTML = data.items.data.id; dijit.byId('location').set('value', data.items.data.location); if(data.items.data.natenabled == 1) { dijit.byId('natenabled').set('checked', true); dijit.byId('nathostid').set('disabled', false); dijit.byId('nathostid').set('value', data.items.data.nathostid); } else { dijit.byId('natenabled').set('checked', false); dijit.byId('nathostid').set('disabled', true); } if(data.items.data.nathostenabled == 1) { dijit.byId('nathostenabled').set('checked', true); dijit.byId('natpublicipaddress').set('disabled', false); dijit.byId('natinternalipaddress').set('disabled', false); dijit.byId('natpublicipaddress').set('value', data.items.data.natpublicIPaddress); dijit.byId('natinternalipaddress').set('value', data.items.data.natinternalIPaddress); } else { dijit.byId('nathostenabled').set('checked', false); dijit.byId('natpublicipaddress').set('disabled', true); dijit.byId('natinternalipaddress').set('disabled', true); dijit.byId('natpublicipaddress').set('value', ''); dijit.byId('natinternalipaddress').set('value', ''); } dojo.byId('addeditdlgerrmsg').innerHTML = ''; dijit.byId('addeditdlg').show(); } else if(data.items.status == 'noaccess') { alert('Access denied to edit this item'); } } function selectType() { var type = dijit.byId('type').get('value'); var obj = dijit.byId('provisioningid'); obj.options = []; dojo.forEach(options[type]['provisioning'], function(prov) { obj.addOption(prov); }); dijit.byId('provisioningid').set('value', lastselected[type]['provisioningid']); var obj = dijit.byId('stateid'); obj.options = []; if(addedit == 'edit') { if(type == 'virtualmachine' && parseInt(editobj.vmhostid) > 0 && editobj.state != 'available') obj.addOption({value: '2', label: 'available'}); obj.addOption({value: editobj.stateid, label: editobj.state}); } dojo.forEach(options[type]['states'], function(state) { if(addedit == 'edit' && state.value == editobj.stateid) return; if(addedit == 'add' && state.label == 'vmhostinuse' && dijit.byId('provisioningid').attr('displayedValue') != 'None') return; obj.addOption({value: state.value, label: state.label}); }); dijit.byId('stateid').set('value', lastselected[type]['stateid']); if(type == 'blade' && dijit.byId('provisioningid').attr('displayedValue') == 'None' && dijit.byId('stateid').attr('displayedValue') == 'vmhostinuse') dojo.removeClass('vmprofilespan', 'hidden'); else if(dijit.byId('stateid').attr('displayedValue') != 'vmhostinuse') dojo.addClass('vmprofilespan', 'hidden'); if(addedit == 'edit' && dijit.byId('stateid').attr('displayedValue') == 'maintenance') dojo.removeClass('notesspan', 'hidden'); else dojo.addClass('notesspan', 'hidden'); } function selectProvisioning() { lastselected[dijit.byId('type').get('value')]['provisioningid'] = dijit.byId('provisioningid').get('value'); var obj = dijit.byId('stateid'); obj.options = []; if(addedit == 'edit') { if(dijit.byId('type').get('value') == 'virtualmachine' && parseInt(editobj.vmhostid) > 0 && editobj.state != 'available') obj.addOption({value: '2', label: 'available'}); var addedexisting = false; } dojo.forEach(options[dijit.byId('type').get('value')]['states'], function(state) { if(((dijit.byId('type').get('value') == 'blade' && dijit.byId('provisioningid').attr('displayedValue') == 'None') || (addedit == 'add' && dijit.byId('type').get('value') == 'virtualmachine')) && state.label == 'available') return; if(addedit == 'add' && state.label == 'vmhostinuse' && dijit.byId('provisioningid').attr('displayedValue') != 'None') return; if(addedit == 'edit' && state.value == editobj.stateid) addedexisting = true; obj.addOption({value: state.value, label: state.label}); }); if(addedit == 'edit' && ! addedexisting) obj.addOption({value: editobj.stateid, label: editobj.state}); dijit.byId('stateid').set('value', lastselected[dijit.byId('type').get('value')]['stateid']); } function selectState() { lastselected[dijit.byId('type').get('value')]['stateid'] = dijit.byId('stateid').get('value'); if(dijit.byId('type').get('value') == 'blade' && dijit.byId('stateid').attr('displayedValue') == 'vmhostinuse') dojo.removeClass('vmprofilespan', 'hidden'); else if(dijit.byId('stateid').attr('displayedValue') != 'vmhostinuse') dojo.addClass('vmprofilespan', 'hidden'); if(addedit == 'edit' && dijit.byId('stateid').attr('displayedValue') == 'maintenance') dojo.removeClass('notesspan', 'hidden'); else dojo.addClass('notesspan', 'hidden'); } function resetEditResource() { var fields = ['name', 'owner', 'type', 'ipaddress', 'privateipaddress', 'publicmac', 'privatemac', 'provisioningid', 'stateid', 'vmprofileid', 'platformid', 'scheduleid', 'ram', 'cores', 'procspeed', 'network', 'location', 'startnum', 'endnum', 'startpubipaddress', 'endpubipaddress', 'startprivipaddress', 'endprivipaddress', 'startmac', 'notes', 'predictivemoduleid', 'natpublicipaddress', 'natinternalipaddress']; for(var i = 0; i < fields.length; i++) { dijit.byId(fields[i]).reset(); } dojo.byId('curimg').innerHTML = ''; dojo.byId('compid').innerHTML = ''; dojo.byId('addeditdlgerrmsg').innerHTML = ''; dojo.removeClass('notesspan', 'hidden'); dojo.removeClass('vmprofilespan', 'hidden'); dojo.removeClass('curimgspan', 'hidden'); dojo.removeClass('compidspan', 'hidden'); dijit.byId('natenabled').set('checked', false); dijit.byId('nathostid').set('disabled', true); } function saveResource() { var errobj = dojo.byId('addeditdlgerrmsg'); if(addedit == 'edit' || dijit.byId('mode').get('value') == 'single') var fields = ['name', 'owner', 'ipaddress', 'privateipaddress', 'publicmac', 'privatemac', 'ram', 'cores', 'procspeed', 'location', 'natpublicipaddress', 'natinternalipaddress']; else var fields = ['name', 'startnum', 'endnum', 'owner', 'startpubipaddress', 'endpubipaddress', 'startprivipaddress', 'endprivipaddress', 'startmac', 'ram', 'cores', 'procspeed', 'location', 'natpublicipaddress', 'natinternalipaddress']; for(var i = 0; i < fields.length; i++) { if(! checkValidatedObj(fields[i], errobj)) return; } if(addedit == 'add') var data = {continuation: dojo.byId('addresourcecont').value}; else var data = {continuation: dojo.byId('saveresourcecont').value}; if(addedit == 'edit' && dijit.byId('stateid').attr('displayedValue') == 'maintenance') { if(! dijit.byId('notes').get('value').match(/^([-a-zA-Z0-9_\. ,#\(\)=\+:;]{0,5000})$/)) { errobj.innerHTML = "Maintenance reason can be up to 5000 characters long and may only<br>contain letters, numbers, spaces and these characters: - , . _ # ( ) = + : ;"; return; } else data['notes'] = dijit.byId('notes').get('value'); } else data['notes'] = ''; for(var i = 0; i < fields.length; i++) { data[fields[i]] = dijit.byId(fields[i]).get('value'); } data['type'] = dijit.byId('type').get('value'); data['provisioningid'] = dijit.byId('provisioningid').get('value'); data['stateid'] = dijit.byId('stateid').get('value'); data['vmprofileid'] = dijit.byId('vmprofileid').get('value'); data['platformid'] = dijit.byId('platformid').get('value'); data['scheduleid'] = dijit.byId('scheduleid').get('value'); data['network'] = dijit.byId('network').get('value'); data['predictivemoduleid'] = dijit.byId('predictivemoduleid').get('value'); data['natenabled'] = dijit.byId('natenabled').get('value'); if(data['natenabled'] == 1) data['nathostid'] = dijit.byId('nathostid').get('value'); else { data['natenabled'] = 0; data['nathostid'] = 0; } data['nathostenabled'] = dijit.byId('nathostenabled').get('value'); if(data['nathostenabled'] == 1) { if(data['natenabled'] == 1) { errobj.innerHTML = "Connect Using NAT and Use as NAT Host cannot both be checked"; return; } } else data['nathostenabled'] = 0; data['addmode'] = dijit.byId('mode').get('value'); dijit.byId('addeditbtn').set('disabled', true); RPCwrapper(data, saveResourceCB, 1); } function saveResourceCB(data, ioArgs) { if(data.items.status == 'error') { dojo.byId('addeditdlgerrmsg').innerHTML = '<br>' + data.items.msg; dijit.byId('addeditbtn').set('disabled', false); } else if(data.items.status == 'adderror') { alert(data.items.errormsg); } else if(data.items.status == 'success') { if(data.items.action == 'add') { if(data.items.addmode == 'single') { if(typeof resourcegrid !== 'undefined') { resourcegrid.store.newItem(data.items.data); resourcegrid.sort(); if(data.items.data.nathostenabled) { dijit.byId('nathostid').addOption({label: data.items.data.hostname, value: data.items.data.nathostenabledid}); dijit.byId('newnathostid').addOption({label: data.items.data.hostname, value: data.items.data.nathostenabledid}); dijit.byId('newnathostbtn').set('disabled', false); } } dojo.forEach(dijit.findWidgets(dojo.byId('groupdlgcontent')), function(w) { w.destroyRecursive(); }); if(data.items.nogroups == 0) { dojo.byId('groupdlgcontent').innerHTML = data.items.groupingHTML; AJdojoCreate('groupdlgcontent'); dojo.byId('resources').value = data.items.data.id; populateLists('resources', 'ingroups', 'inresourcename', 'outresourcename', 'resgroupinggroupscont'); dijit.byId('groupdlg').show(); dijit.byId('groupingnote').show(); } } else { if(typeof resourcegrid !== 'undefined') { for(var i = 0; i < data.items.data.length; i++) { resourcegrid.store.newItem(data.items.data[i]); } resourcegrid.sort(); } dojo.forEach(dijit.findWidgets(dojo.byId('groupdlgcontent')), function(w) { w.destroyRecursive(); }); if(data.items.nogroups == 0) { dojo.byId('groupdlgcontent').innerHTML = data.items.groupingHTML; dojo.byId('groupbyresourcedesc').innerHTML = data.items.grouphelp; dojo.addClass('groupbyresourcesel', 'hidden'); AJdojoCreate('groupdlgcontent'); dojo.byId('resources').value = data.items.data[0].id; populateLists('resources', 'ingroups', 'inresourcename', 'outresourcename', 'resgroupinggroupscont'); dojo.byId('inresourcename').innerHTML = 'new computer set'; dojo.byId('outresourcename').innerHTML = 'new computer set'; dojo.byId('addgrpcont').value = data.items.addcont; dojo.byId('remgrpcont').value = data.items.remcont; dijit.byId('groupdlg').show(); dijit.byId('groupingnote').show(); } } } else { resourcegrid.store.fetch({ query: {id: data.items.data.id}, onItem: function(item) { var washost = resourcegrid.store.getValue(item, 'nathostenabled'); resourcegrid.store.setValue(item, 'name', data.items.data.hostname); resourcegrid.store.setValue(item, 'owner', data.items.data.owner); resourcegrid.store.setValue(item, 'state', data.items.data.state); resourcegrid.store.setValue(item, 'platform', data.items.data.platform); resourcegrid.store.setValue(item, 'schedule', data.items.data.schedule); resourcegrid.store.setValue(item, 'currentimg', data.items.data.currentimg); resourcegrid.store.setValue(item, 'imagerevision', data.items.data.imagerevision); resourcegrid.store.setValue(item, 'nextimg', data.items.data.nextimg); resourcegrid.store.setValue(item, 'ram', data.items.data.ram); resourcegrid.store.setValue(item, 'procnumber', data.items.data.procnumber); resourcegrid.store.setValue(item, 'procspeed', data.items.data.procspeed); resourcegrid.store.setValue(item, 'network', data.items.data.network); resourcegrid.store.setValue(item, 'IPaddress', data.items.data.IPaddress); resourcegrid.store.setValue(item, 'privateIPaddress', data.items.data.privateIPaddress); resourcegrid.store.setValue(item, 'eth0macaddress', data.items.data.eth0macaddress); resourcegrid.store.setValue(item, 'eth1macaddress', data.items.data.eth1macaddress); resourcegrid.store.setValue(item, 'type', data.items.data.type); resourcegrid.store.setValue(item, 'deleted', data.items.data.deleted); resourcegrid.store.setValue(item, 'notes', data.items.data.notes); resourcegrid.store.setValue(item, 'vmhost', data.items.data.vmhost); resourcegrid.store.setValue(item, 'predictivemodule', data.items.data.predictivemodule); resourcegrid.store.setValue(item, 'location', data.items.data.location); resourcegrid.store.setValue(item, 'provisioning', data.items.data.provisioning); resourcegrid.store.setValue(item, 'natenabled', data.items.data.natenabled); resourcegrid.store.setValue(item, 'nathost', data.items.data.nathost); resourcegrid.store.setValue(item, 'nathostenabled', data.items.data.nathostenabled); resourcegrid.store.setValue(item, 'natpublicIPaddress', data.items.data.natpublicIPaddress); resourcegrid.store.setValue(item, 'natinternalIPaddress', data.items.data.natinternalIPaddress); if(data.items.data.nathostenabled) { if(washost == 0) { dijit.byId('nathostid').addOption({label: data.items.data.hostname, value: data.items.data.nathostenabledid}); dijit.byId('newnathostid').addOption({label: data.items.data.hostname, value: data.items.data.nathostenabledid}); dijit.byId('newnathostbtn').set('disabled', false); } } else { dijit.byId('nathostid').options.forEach( function(node, index, nodelist) { if(node.label == data.items.data.hostname) dijit.byId('nathostid').removeOption({value: node.value}); } ); dijit.byId('newnathostid').options.forEach( function(node, index, nodelist) { if(node.label == data.items.data.hostname) dijit.byId('newnathostid').removeOption({value: node.value}); if(dijit.byId('newnathostid').options.length == 0) dijit.byId('newnathostbtn').set('disabled', true); } ); } }, onComplete: function(items, result) { // when call resourcegrid.sort directly, the table contents disappear; not sure why setTimeout(function() {resourcegrid.sort();}, 10); } }); } dijit.byId('addeditdlg').hide(); resetEditResource(); if('promptuser' in data.items) { dijit.byId('confirmactiondlg').set('title', data.items.title); dijit.byId('submitactionbtn').setLabel(data.items.btntxt); dojo.removeClass('submitactionbtnspan', 'hidden'); dijit.byId('actionmsg').set('content', data.items.msg); dojo.byId('submitcont').value = data.items.cont; dijit.byId('confirmactiondlg').show(); } else if('promptuserfail' in data.items) { dijit.byId('confirmactiondlg').set('title', data.items.title); dojo.addClass('submitactionbtnspan', 'hidden'); dijit.byId('cancelactionbtn').setLabel('Close'); dijit.byId('actionmsg').set('content', data.items.msg); dijit.byId('confirmactiondlg').show(); } else if('multirefresh' in data.items) { refreshcompdata(data.items.multirefresh); } else setTimeout(function() {dijit.byId('addeditbtn').set('disabled', false);}, 250); } } function cancelScheduledtovmhostinuse() { var data = {continuation: dojo.byId('tohostcancelcont').value}; RPCwrapper(data, cancelScheduledtovmhostinuseCB, 1); } function cancelScheduledtovmhostinuseCB(data, ioArgs) { if(data.items.status == 'success') { dojo.byId('cancelvmhostinuseokdiv').innerHTML = data.items.msg; dojo.addClass('cancelvmhostinusediv', 'hidden'); dojo.removeClass('cancelvmhostinuseokdiv', 'hidden'); } else if(data.items.status == 'failed') { dojo.byId('cancelvmhostinusediv').innerHTML = "An error was encountered that prevented the reservation to place this computer in the vmhostinuse state from being deleted."; } } function confirmReload() { var data = {continuation: dojo.byId('reloadcont').value, imageid: dijit.byId('reloadimageid').get('value')}; confirmAction(data); } function confirmDelete() { var data = {continuation: dojo.byId('deletecont').value}; confirmAction(data); } function confirmStateChange() { var data = {continuation: dojo.byId('statechangecont').value, stateid: dijit.byId('newstateid').get('value')}; confirmAction(data); } function confirmScheduleChange() { var data = {continuation: dojo.byId('schedulecont').value, schid: dijit.byId('newscheduleid').get('value')}; confirmAction(data); } function confirmProvisioningChange() { var data = {continuation: dojo.byId('provisioningchangecont').value, provisioningid: dijit.byId('newprovisioningid').get('value')}; confirmAction(data); } function confirmPredictiveModuleChange() { var data = {continuation: dojo.byId('predictivemodulechangecont').value, predictivemoduleid: dijit.byId('newpredictivemoduleid').get('value')}; confirmAction(data); } function confirmNATchange() { if(dijit.byId('newnathostid').options.length == 0) return; var data = {continuation: dojo.byId('natchangecont').value}; if(dijit.byId('newnatenabled').get('value') == 1) { data['natenabled'] = 1; data['nathostid'] = dijit.byId('newnathostid').get('value'); } else { data['natenabled'] = 0; data['nathostid'] = 0; } confirmAction(data); } function generateDHCPdata(type) { var data = {continuation: dojo.byId(type + 'dhcpcont').value, type: type}; if(dijit.byId('mnprivipaddr')) data['mnip'] = dijit.byId('mnprivipaddr').get('value'); if(type == 'private') { if(dojo.byId('preth0rdo').checked) data['nic'] = 'eth0'; else data['nic'] = 'eth1'; } else { if(dojo.byId('pueth0rdo').checked) data['nic'] = 'eth0'; else data['nic'] = 'eth1'; } confirmAction(data); } function hostsData() { var data = {continuation: dojo.byId('hostsdatacont').value}; confirmAction(data); } function showReservations() { var data = {continuation: dojo.byId('showreservationscont').value}; confirmAction(data); } function showReservationHistory() { var compids = []; dojo.forEach(resource.selids, function(id) { compids.push(id.replace('chkb', '')); }); if(compids.length > 3) { alert('Due to the load this can introduce on the database server, only a maximum of 3 computers can be selected for viewing Reservation History.'); return; } var data = {continuation: dojo.byId('showreservationhistorycont').value}; confirmAction(data); } function confirmAction(data) { dijit.popup.close(dijit.byId('actionmenu')); var compids = []; dojo.forEach(resource.selids, function(id) { compids.push(id.replace('chkb', '')); }); if(compids.length == 0) { alert('No computers selected'); return; } data['compids[]'] = compids; RPCwrapper(data, confirmActionCB, 1); } function confirmActionCB(data, ioArgs) { if(data.items.status == 'error') { dijit.byId('confirmactiondlg').set('title', 'Error'); dijit.byId('cancelactionbtn').setLabel('Close'); dojo.addClass('submitactionbtnspan', 'hidden'); dijit.byId('actionmsg').set('content', data.items.errormsg); dijit.byId('confirmactiondlg').show(); } else if(data.items.status == 'success') { dijit.byId('confirmactiondlg').set('title', data.items.title); dijit.byId('submitactionbtn').setLabel(data.items.btntxt); dijit.byId('actionmsg').set('content', data.items.actionmsg); //AJdojoCreate('actionmsg'); if('complist' in data.items) dojo.byId('complist').innerHTML = data.items.complist; dojo.byId('submitcont').value = data.items.cont; if('disablesubmit' in data.items && data.items.disablesubmit == 1) dijit.byId('submitactionbtn').set('disabled', true); dijit.byId('confirmactiondlg').show(); } else if(data.items.status == 'onestep') { dijit.byId('confirmactiondlg').set('title', data.items.title); dijit.byId('cancelactionbtn').setLabel('Close'); dojo.addClass('submitactionbtnspan', 'hidden'); dijit.byId('actionmsg').set('content', data.items.actionmsg); //AJdojoCreate('actionmsg'); if('complist' in data.items) dojo.byId('complist').innerHTML = data.items.complist; dijit.byId('confirmactiondlg').show(); } } function cancelAction() { dijit.byId('confirmactiondlg').hide(); dijit.byId('confirmactiondlg').set('title', ''); dijit.byId('actionmsg').set('content', ''); dojo.byId('complist').innerHTML = ''; dijit.byId('submitactionbtn').setLabel('Submit'); dijit.byId('submitactionbtn').set('disabled', false); dojo.removeClass('submitactionbtnspan', 'hidden'); dijit.byId('cancelactionbtn').setLabel('Cancel'); } function submitAction() { var data = {continuation: dojo.byId('submitcont').value}; if(dijit.byId('utilnotes')) data['notes'] = dijit.byId('utilnotes').get('value'); if(dijit.byId('profileid')) data['profileid'] = dijit.byId('profileid').get('value'); if(dojo.byId('modedirect')) { if(dojo.byId('modedirect').checked) data['mode'] = 'direct'; else data['mode'] = 'reload'; } RPCwrapper(data, submitActionCB, 1); } function submitActionCB(data, ioArgs) { if(data.items.status == 'error') { dijit.byId('confirmactiondlg').set('title', 'Error'); dijit.byId('cancelactionbtn').setLabel('Close'); dojo.addClass('submitactionbtnspan', 'hidden'); dijit.byId('actionmsg').set('content', data.items.errormsg); dojo.byId('complist').innerHTML = ''; dijit.byId('confirmactiondlg').show(); return; } if(('clearselection' in data.items && data.items.clearselection == 1) || (dijit.byId('statecb').value != '' && data.items.newstate != dijit.byId('statecb').value)) resourcegrid.selection.clear(); if('refreshcount' in data.items && parseInt(data.items.refreshcount) > 0) { var cnt = parseInt(data.items.refreshcount) - 1; refreshcompdata(cnt); } dijit.byId('confirmactiondlg').set('title', data.items.title); dijit.byId('cancelactionbtn').setLabel('Close'); dojo.addClass('submitactionbtnspan', 'hidden'); dijit.byId('actionmsg').set('content', data.items.msg); dojo.byId('complist').innerHTML = ''; dojo.byId('submitcont').value = ''; recenterDijitDialog('confirmactiondlg'); } function refreshcompdata(refreshcount) { var url = resourcestore.url; resourcestore.close(); resourcestore = new dojo.data.ItemFileWriteStore({url: url}); resourcestore.comparatorMap = {name: resource.nocasesort, procnumber: resource.nocasesort, procspeed: resource.nocasesort, network: resource.nocasesort, ram: resource.nocasesort, vmhost: resource.nocasesort, IPaddress: resource.ipsort, privateIPaddress: resource.ipsort}; resourcestore.fetch(); savescroll = resourcegrid.scrollTop; resourcegrid.setStore(resourcestore, resourcegrid.query); if(refreshcount) setTimeout(function() {refreshcompdata(--refreshcount);}, 5000); } function setScroll() { if(savescroll != 0) resourcegrid.scrollTo(savescroll); } function saveScroll(scrollobj) { if(resourcegrid.scrollTop != 0) savescroll = 0; } function delayedCompGroupFilterSelection() { if(filterdelay) clearTimeout(filterdelay); filterdelay = setTimeout(compGroupFilterSelection, 1500); } function compGroupFilterSelection() { var selected = new Array(); var selobj = dojo.byId('filtercompgroups'); for(var i = 0; i < selobj.options.length; i++) { if(selobj.options[i].selected) selected.push(selobj.options[i].value); } var data = {groupids: selected.join(','), continuation: dojo.byId('filtercompgroupscont').value}; RPCwrapper(data, compGroupFilterSelectionCB, 1); } function compGroupFilterSelectionCB(data, ioArgs) { if(data.items.status == 'error') { alert(data.items.errormsg); return; } var query = resourcegrid.query; query['id'] = new RegExp(data.items.regids); resourcegrid.setQuery(query); dojo.byId('computercount').innerHTML = 'Computers in table: ' + resourcegrid.rowCount; }