diff options
author | Simon Rettberg | 2018-07-04 12:35:56 +0200 |
---|---|---|
committer | Simon Rettberg | 2018-07-04 12:35:56 +0200 |
commit | ff57c086a3b868cc73f159fa29891d26a5a3e02b (patch) | |
tree | fac6f4ed2af7f2a864e2f234938c09a1639fd7a8 | |
parent | [serversetup-bwlp] Slightly nicer colors; html cleanup (diff) | |
download | slx-admin-ff57c086a3b868cc73f159fa29891d26a5a3e02b.tar.gz slx-admin-ff57c086a3b868cc73f159fa29891d26a5a3e02b.tar.xz slx-admin-ff57c086a3b868cc73f159fa29891d26a5a3e02b.zip |
[serversetup-bwlp] Fix hotkey saving, adding new entries
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 |