summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2018-07-04 12:35:56 +0200
committerSimon Rettberg2018-07-04 12:35:56 +0200
commitff57c086a3b868cc73f159fa29891d26a5a3e02b (patch)
treefac6f4ed2af7f2a864e2f234938c09a1639fd7a8
parent[serversetup-bwlp] Slightly nicer colors; html cleanup (diff)
downloadslx-admin-ff57c086a3b868cc73f159fa29891d26a5a3e02b.tar.gz
slx-admin-ff57c086a3b868cc73f159fa29891d26a5a3e02b.tar.xz
slx-admin-ff57c086a3b868cc73f159fa29891d26a5a3e02b.zip
[serversetup-bwlp] Fix hotkey saving, adding new entries
-rw-r--r--modules-available/serversetup-bwlp/inc/menuentry.inc.php1
-rw-r--r--modules-available/serversetup-bwlp/page.inc.php53
-rw-r--r--modules-available/serversetup-bwlp/templates/menu-edit.html116
3 files changed, 134 insertions, 36 deletions
diff --git a/modules-available/serversetup-bwlp/inc/menuentry.inc.php b/modules-available/serversetup-bwlp/inc/menuentry.inc.php
index 9736b7bb..9d9d4163 100644
--- a/modules-available/serversetup-bwlp/inc/menuentry.inc.php
+++ b/modules-available/serversetup-bwlp/inc/menuentry.inc.php
@@ -162,6 +162,7 @@ class MenuEntry
*/
public static function filterKeyName($keyName)
{
+ $data = self::getKeyArray();
if (isset($data[$keyName]))
return $keyName;
return '';
diff --git a/modules-available/serversetup-bwlp/page.inc.php b/modules-available/serversetup-bwlp/page.inc.php
index 061abfd5..00b658c4 100644
--- a/modules-available/serversetup-bwlp/page.inc.php
+++ b/modules-available/serversetup-bwlp/page.inc.php
@@ -187,25 +187,11 @@ class Page_ServerSetup extends Page
$menu['timeout'] = round($menu['timeoutms'] / 1000);
$menu['entries'] = Database::queryAll("SELECT menuentryid, entryid, hotkey, title, hidden, sortval, plainpass FROM
serversetup_menuentry WHERE menuid = :id ORDER BY sortval ASC", compact('id'));
- $keyList = array_map(function ($item) { return ['key' => $item]; }, MenuEntry::getKeyList());
- $entryList = Database::queryAll("SELECT entryid, title, hotkey FROM serversetup_bootentry ORDER BY title ASC");
+ $menu['keys'] = array_map(function ($item) { return ['key' => $item]; }, MenuEntry::getKeyList());
+ $menu['entrylist'] = Database::queryAll("SELECT entryid, title, hotkey FROM serversetup_bootentry ORDER BY title ASC");
foreach ($menu['entries'] as &$entry) {
$entry['isdefault'] = ($entry['menuentryid'] == $menu['defaultentryid']);
- $entry['keys'] = $keyList;
- foreach ($entry['keys'] as &$key) {
- if ($key['key'] === $entry['hotkey']) {
- $key['selected'] = 'selected'; // TODO: plainpass only when permissions
- }
- }
- $entry['entrylist'] = $entryList;
- foreach ($entry['entrylist'] as &$item) {
- if ($item['entryid'] == $entry['entryid']) {
- $item['selected'] = 'selected';
- }
- if (empty($item['title'])) {
- $item['title'] = $item['entryid'];
- }
- }
+ // TODO: plainpass only when permissions
}
// TODO: Make assigned locations editable
Permission::addGlobalTags($menu['perms'], 0, ['ipxe.menu.edit']);
@@ -303,7 +289,7 @@ class Page_ServerSetup extends Page
'menuid' => $id,
'title' => IPxe::sanitizeIpxeString(Request::post('title', '', 'string')),
'timeoutms' => abs(Request::post('timeoutms', 0, 'int') * 1000),
- 'defaultentryid' => Request::post('defaultentry', false, 'int'),
+ 'defaultentryid' => Request::post('defaultentry', null, 'int'),
]);
if (User::hasPermission('ipxe.menu.edit', 0)) {
Database::exec('UPDATE serversetup_menu SET isdefault = (menuid = :menuid)', ['menuid' => $id]);
@@ -313,15 +299,38 @@ class Page_ServerSetup extends Page
$entries = Request::post('entry', false, 'array');
foreach ($entries as $key => $entry) {
+ if (!isset($entry['sortval'])) {
+ error_log(print_r($entry, true));
+ continue;
+ }
+ // Fallback defaults
+ $entry += [
+ 'entryid' => null,
+ 'title' => '',
+ 'hidden' => 0,
+ 'plainpass' => '',
+ ];
$params = [
- 'entryid' => $entry['entryid'], // TODO validate
- 'hotkey' => MenuEntry::filterKeyName($entry['hotkey']),
'title' => IPxe::sanitizeIpxeString($entry['title']),
- 'hidden' => (int)$entry['hidden'],
'sortval' => (int)$entry['sortval'],
- 'plainpass' => $entry['plainpass'],
'menuid' => $menu['menuid'],
];
+ if (empty($entry['entryid'])) {
+ // Spacer
+ $params += [
+ 'entryid' => null,
+ 'hotkey' => '',
+ 'hidden' => 0, // Doesn't make any sense
+ 'plainpass' => '', // Doesn't make any sense
+ ];
+ } else {
+ $params += [
+ 'entryid' => $entry['entryid'], // TODO validate?
+ 'hotkey' => MenuEntry::filterKeyName($entry['hotkey']),
+ 'hidden' => (int)$entry['hidden'], // TODO (needs hotkey to make sense)
+ 'plainpass' => $entry['plainpass'],
+ ];
+ }
if (is_numeric($key)) {
$keepIds[] = $key;
$params['menuentryid'] = $key;
diff --git a/modules-available/serversetup-bwlp/templates/menu-edit.html b/modules-available/serversetup-bwlp/templates/menu-edit.html
index 4fabd11c..603c7425 100644
--- a/modules-available/serversetup-bwlp/templates/menu-edit.html
+++ b/modules-available/serversetup-bwlp/templates/menu-edit.html
@@ -1,5 +1,8 @@
<h2>{{lang_editMenuHead}}</h2>
+<input type="text" name="prevent_autofill" id="prevent_autofill" value="" style="position:absolute;top:-2000px" tabindex="-1">
+<input type="password" name="password_fake" id="password_fake" value="" style="position:absolute;top:-2000px" tabindex="-1">
+
<div class="panel panel-default">
<div class="panel-heading">
{{title}}
@@ -57,14 +60,15 @@
</thead>
<tbody id="table-body" style="overflow: auto;">
{{#entries}}
- <tr id="{{menuentryid}}">
+ <tr>
<input type="hidden" class="sort-val" name="entry[{{menuentryid}}][sortval]" value="{{sortval}}">
+ <input type="hidden" name="entry[{{menuentryid}}][hidden]" value="0">
<td class="drag-handler" style="cursor: pointer;text-align: center; vertical-align: middle;">
<span class="glyphicon glyphicon-th-list"></span>
</td>
<td class="slx-smallcol" style="text-align: center; vertical-align: middle;">
- <div class="radio radio-inline" style="margin: 0px;">
+ <div class="radio radio-inline" style="margin: 0">
<input type="radio" name="defaultentry" value="{{menuentryid}}"
{{#isdefault}}checked{{/isdefault}} {{perms.ipxe.menu.edit.disabled}} {{disabled}}>
<label></label>
@@ -73,11 +77,7 @@
<td class="text-nowrap">
{{#entryid}}
- <select class="form-control" name="entry[{{menuentryid}}][entryid]" {{readonly}}>
- <option value="">{{lang_spacer}}</option>
- {{#entrylist}}
- <option value="{{entryid}}" {{selected}}>{{title}}</option>
- {{/entrylist}}
+ <select class="form-control entry-list" name="entry[{{menuentryid}}][entryid]" {{readonly}} data-default="{{entryid}}">
</select>
{{/entryid}}
{{^entryid}}
@@ -85,22 +85,18 @@
{{/entryid}}
</td>
<td {{^entryid}}colspan="2"{{/entryid}}>
- <input class="form-control" name="entry[{{menuentryid}}][title]" value="{{title}}"
+ <input class="form-control title" name="entry[{{menuentryid}}][title]" value="{{title}}"
maxlength="100" {{readonly}}>
</td>
{{#entryid}}
<td>
- <select class="form-control" name="entry[{{menuentryid}}][hotkey]" {{readonly}}>
- <option value="">{{lang_none}}</option>
- {{#keys}}
- <option {{selected}}>{{key}}</option>
- {{/keys}}
+ <select class="form-control key-list" name="entry[{{menuentryid}}][hotkey]" {{readonly}} data-default="{{hotkey}}">
</select>
</td>
{{/entryid}}
<td>
- <input class="form-control" name="entry[{{menuentryid}}][plainpass]" id="panel-passwd" type="{{password_type}}"
+ <input class="form-control" name="entry[{{menuentryid}}][plainpass]" type="{{password_type}}"
value="{{plainpass}}" {{readonly}}>
</td>
</tr>
@@ -109,6 +105,10 @@
</table>
</div>
<div class="text-right">
+ <button id="add-btn" type="button" class="btn btn-success" {{disabled}}>
+ <span class="glyphicon glyphicon-plus-sign"></span>
+ {{lang_add}}
+ </button>
<button type="submit" class="btn btn-primary" {{disabled}}>
<span class="glyphicon glyphicon-floppy-disk"></span>
{{lang_save}}
@@ -117,9 +117,62 @@
</form>
</div>
</div>
+<div class="hidden">
+ <select id="entry-list-template">
+ <option value="">{{lang_spacer}}</option>
+ {{#entrylist}}
+ <option value="{{entryid}}">{{title}}</option>
+ {{/entrylist}}
+ </select>
+</div>
+<div class="hidden">
+ <select id="key-list-template">
+ <option value="">{{lang_none}}</option>
+ {{#keys}}
+ <option value="{{key}}">{{key}}</option>
+ {{/keys}}
+ </select>
+</div>
+<table class="hidden" id="row-template">
+ <tr>
+ <input type="hidden" class="sort-val" name="entry[%new%][sortval]" value="99999">
+ <td class="drag-handler" style="cursor: pointer;text-align: center; vertical-align: middle;">
+ <span class="glyphicon glyphicon-th-list"></span>
+ </td>
+
+ <td class="slx-smallcol" style="text-align: center; vertical-align: middle;">
+ <div class="radio radio-inline" style="margin: 0">
+ <input type="radio" name="defaultentry" value="%new%">
+ <label></label>
+ </div>
+ </td>
+
+ <td class="text-nowrap">
+ <select class="form-control entry-list" name="entry[%new%][entryid]">
+ </select>
+ </td>
+ <td>
+ <input class="form-control title" data-old="#new#" name="entry[%new%][title]" maxlength="100">
+ </td>
+ <td>
+ <select class="form-control key-list" name="entry[%new%][hotkey]">
+ </select>
+ </td>
+ <td>
+ <input class="form-control" name="entry[%new%][plainpass]" type="{{password_type}}">
+ </td>
+ </tr>
+</table>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function() {
+ var $ENTRY_LIST = $('#entry-list-template').find('option');
+ var $KEY_LIST = $('#key-list-template').find('option');
+ function fillEntryList($select, $source) {
+ var def = $select.data('default');
+ $select.append($source.clone(true));
+ $select.find('option[value="' + def + '"]').attr('selected', true);
+ }
$('#table-body').sortable({
opacity: 0.8,
handle: '.drag-handler',
@@ -136,5 +189,40 @@
});
}
});
+ $('.entry-list').each(function() {
+ fillEntryList($(this), $ENTRY_LIST);
+ }).change(function() {
+ var $this = $(this);
+ var $title = $this.closest('tr').find('.title');
+ var oldval = $title.data('old');
+ if (oldval === '#stop#')
+ return;
+ if (oldval !== '#new#' && oldval !== $title.val()) {
+ $title.data('old', '#stop#');
+ return;
+ }
+ var text = $this.find('option:selected').text();
+ $title.val(text).data('old', text);
+ });
+ $('.key-list').each(function() {
+ fillEntryList($(this), $KEY_LIST);
+ });
+ var newIndex = 0;
+ $('#add-btn').click(function() {
+ var $new = $('#row-template').find('tr').clone(true);
+ newIndex++;
+ $('#table-body').append($new);
+ $new.find('[name]').each(function() {
+ var $this = $(this);
+ var val = $this.val();
+ var name = $this.attr('name');
+ if (name) {
+ $this.attr('name', name.replace('%new%', 'new-' + newIndex));
+ }
+ if (val) {
+ $this.val(val.replace('%new%', 'new-' + newIndex));
+ }
+ });
+ });
});
</script> \ No newline at end of file