summaryrefslogtreecommitdiffstatshomepage
path: root/scripts/minimaws/lib/assets/machine.js
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/minimaws/lib/assets/machine.js')
-rw-r--r--scripts/minimaws/lib/assets/machine.js173
1 files changed, 97 insertions, 76 deletions
diff --git a/scripts/minimaws/lib/assets/machine.js b/scripts/minimaws/lib/assets/machine.js
index 30818e643bf..052d28ba69a 100644
--- a/scripts/minimaws/lib/assets/machine.js
+++ b/scripts/minimaws/lib/assets/machine.js
@@ -6,21 +6,28 @@ var bios_sets = Object.create(null);
var machine_flags = Object.create(null);
+function make_slot_popup_id(name) { return ('select-slot-choice-' + name).replace(/:/g, '-'); }
+function get_slot_popup(name) { return document.getElementById(make_slot_popup_id(name)); }
+
+
function update_cmd_preview()
{
var result = '';
var first = true;
-
- var sysbios = document.getElementById('select-system-bios');
- if (sysbios && (sysbios.selectedOptions[0].getAttribute('data-isdefault') != 'yes'))
+ function add_option(str)
{
if (first)
first = false;
else
result += ' ';
- result += '-bios ' + sysbios.value;
+ result += str;
}
+ // add system BIOS if applicable
+ var sysbios = document.getElementById('select-system-bios');
+ if (sysbios && (sysbios.selectedOptions[0].getAttribute('data-isdefault') != 'yes'))
+ add_option('-bios ' + sysbios.value);
+
var slotslist = document.getElementById('list-slot-options');
if (slotslist)
{
@@ -28,22 +35,18 @@ function update_cmd_preview()
{
if (item.nodeName == 'DT')
{
- var selection = item.lastChild.selectedOptions[0];
- var biospopup = document.getElementById(('select-slot-bios-' + item.getAttribute('data-slotname')).replace(/:/g, '-'));
+ // need to set the slot option if it has non-default card and/or non-default card BIOS
+ var slotname = item.getAttribute('data-slotname');
+ var selection = get_slot_popup(slotname).selectedOptions[0];
+ var biospopup = document.getElementById(('select-slot-bios-' + slotname).replace(/:/g, '-'));
var defcard = selection.getAttribute('data-isdefault') == 'yes';
var defbios = !biospopup || (biospopup.selectedOptions[0].getAttribute('data-isdefault') == 'yes');
if (!defcard || !defbios)
{
- if (first)
- first = false;
- else
- result += ' ';
var card = selection.value;
if (card == '')
card = '""';
- result += '-' + item.getAttribute('data-slotname') + ' ' + card;
- if (!defbios)
- result += ',bios=' + biospopup.value;
+ add_option('-' + slotname + ' ' + card + (defbios ? '' : (',bios=' + biospopup.value)));
}
}
}
@@ -54,13 +57,19 @@ function update_cmd_preview()
function set_default_system_bios()
{
+ // search for an explicit default option
var sysbios = document.getElementById('select-system-bios');
var len = sysbios.options.length;
for (var i = 0; i < len; i++)
{
if (sysbios.options[i].getAttribute('data-isdefault') == 'yes')
{
+ // select it and add a button for restoring it
sysbios.selectedIndex = i;
+ var dflt = make_restore_default_button('default', 'btn-def-system-bios', sysbios, i);
+ sysbios.onchange = make_slot_bios_change_handler(dflt);
+ sysbios.parentNode.appendChild(document.createTextNode(' '));
+ sysbios.parentNode.appendChild(dflt);
break;
}
}
@@ -140,43 +149,32 @@ var fetch_machine_flags = (function ()
function add_flag_rows(table, device)
{
- var len, i, row, cell;
-
var sorted_features = Object.keys(machine_flags[device].features).sort();
var imperfect = [], unemulated = [];
- len = sorted_features.length;
- for (i = 0; i < len; i++)
+ var len = sorted_features.length;
+ for (var i = 0; i < len; i++)
((machine_flags[device].features[sorted_features[i]].overall == 'unemulated') ? unemulated : imperfect).push(sorted_features[i]);
- len = unemulated.length;
- if (len > 0)
+ function add_one(flags, title)
{
- row = document.createElement('tr');
- row.appendChild(document.createElement('th')).textContent = 'Unemulated features:';
- cell = row.appendChild(document.createElement('td'));
- cell.textContent = unemulated[0];
- for (i = 1; i < len; i++)
- cell.textContent += ', ' + unemulated[i];
- if (tbl.lastChild.getAttribute('class') == 'devbios')
- tbl.insertBefore(row, tbl.lastChild);
- else
- tbl.appendChild(row)
+ var len = flags.length;
+ if (len > 0)
+ {
+ var row = document.createElement('tr');
+ row.appendChild(document.createElement('th')).textContent = title;
+ var cell = row.appendChild(document.createElement('td'));
+ cell.textContent = flags[0];
+ for (i = 1; i < len; i++)
+ cell.textContent += ', ' + flags[i];
+ if (table.lastChild.getAttribute('class') == 'devbios')
+ table.insertBefore(row, table.lastChild);
+ else
+ table.appendChild(row);
+ }
}
- len = imperfect.length;
- if (len > 0)
- {
- row = document.createElement('tr');
- row.appendChild(document.createElement('th')).textContent = 'Imperfect features:';
- cell = row.appendChild(document.createElement('td'));
- cell.textContent = imperfect[0];
- for (i = 1; i < len; i++)
- cell.textContent += ', ' + unemulated[i];
- if (tbl.lastChild.getAttribute('class') == 'devbios')
- tbl.insertBefore(row, tbl.lastChild);
- else
- tbl.appendChild(row)
- }
+ add_one(unemulated, 'Unemulated features:');
+ add_one(imperfect, 'Imperfect features:');
}
@@ -186,12 +184,15 @@ function add_bios_row(slot, table, device)
var len = sorted_sets.length;
if (len > 0)
{
+ // create table row, add heading
var row = document.createElement('tr');
row.setAttribute('class', 'devbios');
row.appendChild(document.createElement('th')).textContent = 'BIOS:';
+ var cell = document.createElement('td');
+
+ // make the BIOS popul itself
var popup = document.createElement('select');
popup.setAttribute('id', ('select-slot-bios-' + slot).replace(/:/g, '-'));
- popup.onchange = slot_bios_change_handler;
for (var i = 0; i < len; i++)
{
var set = sorted_sets[i];
@@ -204,7 +205,20 @@ function add_bios_row(slot, table, device)
if (detail.isdefault)
popup.selectedIndex = i;
}
- row.appendChild(document.createElement('td')).appendChild(popup);
+ cell.appendChild(popup);
+
+ // make a button to restore the default
+ var dflt;
+ if (popup.selectedOptions[0].getAttribute('data-isdefault') == 'yes')
+ {
+ dflt = make_restore_default_button('default', ('btn-def-slot-bios-' + slot).replace(/:/g, '-'), popup, popup.selectedIndex);
+ cell.appendChild(document.createTextNode(' '))
+ cell.appendChild(dflt);
+ }
+
+ // drop the controls into a cell, add it to the table, keep the command line preview up-to-date
+ popup.onchange = make_slot_bios_change_handler(dflt);
+ row.appendChild(cell);
table.appendChild(row);
update_cmd_preview();
}
@@ -215,6 +229,7 @@ function make_slot_term(name, slot, defaults)
{
var len, i;
+ // see if we can find a default, outer layers take precedence
var defcard = '';
len = defaults.length;
for (i = 0; (i < len) && (defcard == ''); i++)
@@ -223,19 +238,25 @@ function make_slot_term(name, slot, defaults)
defcard = defaults[i][name];
}
+ // create a container with the slot name and popup
var term = document.createElement('dt');
term.setAttribute('id', ('item-slot-choice-' + name).replace(/:/g, '-'));
term.setAttribute('data-slotname', name);
term.setAttribute('data-slotcard', '');
term.textContent = name + ': ';
var popup = document.createElement('select');
- popup.setAttribute('id', ('select-slot-choice-' + name).replace(/:/g, '-'));
+ popup.setAttribute('id', make_slot_popup_id(name));
term.appendChild(popup);
+
+ // add the empty slot option
var option = document.createElement('option');
option.setAttribute('value', '');
option.setAttribute('data-isdefault', ('' == defcard) ? 'yes' : 'no');
option.textContent = '-';
popup.appendChild(option);
+ popup.selectedIndex = 0;
+
+ // add options for the cards
var sorted_choices = Object.keys(slot).sort();
len = sorted_choices.length;
for (i = 0; i < len; i++)
@@ -247,15 +268,22 @@ function make_slot_term(name, slot, defaults)
option.setAttribute('data-isdefault', (choice == defcard) ? 'yes' : 'no');
option.textContent = choice + ' - ' + card.description;
popup.appendChild(option);
+ if (choice == defcard)
+ popup.selectedIndex = i + 1;
}
- popup.selectedIndex = 0;
- popup.onchange = make_slot_change_handler(name, slot, defaults);
+
+ // make a button for restoring the default and hook up events
+ var dflt = make_restore_default_button('default', ('btn-def-slot-choice-' + name).replace(/:/g, '-'), popup, popup.selectedIndex);
+ term.appendChild(document.createTextNode(' '));
+ term.appendChild(dflt);
+ popup.onchange = make_slot_change_handler(name, slot, defaults, dflt);
return term;
}
function add_slot_items(root, device, defaults, slotslist, pos)
{
+ // add another layer of defaults for this device
var defvals = Object.create(null);
for (var key in slot_info[device].defaults)
defvals[root + key] = slot_info[device].defaults[key];
@@ -263,6 +291,7 @@ function add_slot_items(root, device, defaults, slotslist, pos)
defaults.push(defvals);
var defcnt = defaults.length;
+ // add controls for each subslot
var slots = slot_info[device].slots;
var sorted_slots = Object.keys(slots).sort();
var len = sorted_slots.length;
@@ -285,37 +314,15 @@ function add_slot_items(root, device, defaults, slotslist, pos)
slotslist.appendChild(def);
}
- for (var j = 0; j < defcnt; j++)
- {
- if (Object.prototype.hasOwnProperty.call(defaults[j], slotabs))
- {
- var card = defaults[j][slotabs];
- var sel = term.lastChild;
- var found = false;
- var choice;
- for (choice in sel.options)
- {
- if (sel.options[choice].value == card)
- {
- found = true;
- break;
- }
- }
- if (found)
- {
- sel.selectedIndex = choice;
- sel.dispatchEvent(new Event('change'));
- break;
- }
- }
- }
+ // force a change event to populate subslot controls if the default isn't empty
+ get_slot_popup(slotabs).dispatchEvent(new Event('change'));
}
update_cmd_preview();
}
-function make_slot_change_handler(name, slot, defaults)
+function make_slot_change_handler(name, slot, defaults, dfltbtn)
{
var selection = null;
return function (event)
@@ -325,7 +332,9 @@ function make_slot_change_handler(name, slot, defaults)
var def = event.target.parentNode.nextSibling;
var slotname = event.target.parentNode.getAttribute('data-slotname');
selection = (choice == '') ? null : slot[choice];
+ dfltbtn.disabled = event.target.selectedOptions[0].getAttribute('data-isdefault') == 'yes';
+ // clear out any subslots from previous selection
var prefix = slotname + ':';
for (var candidate = def.nextSibling; candidate && candidate.getAttribute('data-slotname').startsWith(prefix); )
{
@@ -337,37 +346,44 @@ function make_slot_change_handler(name, slot, defaults)
if (selection === null)
{
+ // no selection, remove the slot card details table
event.target.parentNode.setAttribute('data-slotcard', '');
if (def.firstChild)
def.removeChild(def.firstChild);
}
else
{
+ // stash the selected device where it's easy to find
event.target.parentNode.setAttribute('data-slotcard', selection.device);
+
+ // create details table and add a link to the device's page
var tbl = document.createElement('table');
tbl.setAttribute('class', 'sysinfo');
-
var row = tbl.appendChild(document.createElement('tr'));
row.appendChild(document.createElement('th')).textContent = 'Short name:';
var link = row.appendChild(document.createElement('td')).appendChild(document.createElement('a'));
link.textContent = selection.device;
link.setAttribute('href', appurl + 'machine/' + selection.device);
+ // if we have emulation flags, populate now, otherwise fetch asynchronously
if (!Object.prototype.hasOwnProperty.call(machine_flags, selection.device))
fetch_machine_flags(selection.device);
else
add_flag_rows(tbl, selection.device);
+ // if we have BIOS details, populate now, otherwise fetch asynchronously
if (!Object.prototype.hasOwnProperty.call(bios_sets, selection.device))
fetch_bios_sets(selection.device);
else
add_bios_row(slotname, tbl, selection.device);
+ // drop the details table into the list
if (def.firstChild)
def.replaceChild(tbl, def.firstChild);
else
def.appendChild(tbl);
+ // create controls for subslots
add_slot_items(slotname + ':' + choice, selection.device, defaults, slotslist, def.nextSibling);
}
update_cmd_preview();
@@ -375,9 +391,14 @@ function make_slot_change_handler(name, slot, defaults)
}
-function slot_bios_change_handler(event)
+function make_slot_bios_change_handler(dflt)
{
- update_cmd_preview();
+ return function (event)
+ {
+ if (dflt)
+ dflt.disabled = event.target.selectedOptions[0].getAttribute('data-isdefault') == 'yes';
+ update_cmd_preview();
+ }
}