updated steam
This commit is contained in:
parent
8857f441e7
commit
b2b46b23db
4 changed files with 426 additions and 163 deletions
|
|
@ -1,169 +1,162 @@
|
|||
<?php
|
||||
declare(strict_types=1);
|
||||
/** @var array $lang */
|
||||
/** @var array $gameKeys */
|
||||
/** @var array $mappings */
|
||||
/** @var array $gameRows */
|
||||
/** @var array $adapterOptions */
|
||||
/** @var array $adapters */
|
||||
/** @var array $gameRows */
|
||||
/** @var array|null $adapterForm */
|
||||
/** @var string $activeGameKey */
|
||||
?>
|
||||
<div class="sw-admin">
|
||||
<h3><?php echo htmlspecialchars($lang['admin_heading_game_mapping'] ?? 'Game type adapter mapping'); ?></h3>
|
||||
<p><?php echo htmlspecialchars($lang['admin_subheading_game_mapping'] ?? 'Select which adapter will manage Steam Workshop installs for each supported game.'); ?></p>
|
||||
<div class="sw-admin__intro">
|
||||
<h3><?php echo htmlspecialchars($lang['admin_heading_game_mapping'] ?? 'Game type adapter mapping'); ?></h3>
|
||||
<p><?php echo htmlspecialchars($lang['admin_subheading_game_mapping'] ?? 'Assign an adapter and edit its XML without leaving the table.'); ?></p>
|
||||
</div>
|
||||
|
||||
<form method="post" class="sw-form">
|
||||
<form id="sw-mapping-form" method="post">
|
||||
<input type="hidden" name="admin_action" value="save_mappings">
|
||||
<table class="table sw-mods__table">
|
||||
</form>
|
||||
|
||||
<div class="sw-game-table__wrapper">
|
||||
<table class="table sw-game-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><?php echo htmlspecialchars($lang['admin_col_game_key'] ?? 'Game key'); ?></th>
|
||||
<th><?php echo htmlspecialchars($lang['admin_col_adapter'] ?? 'Adapter'); ?></th>
|
||||
<th><?php echo htmlspecialchars($lang['admin_col_adapter'] ?? 'Mapping'); ?></th>
|
||||
<th><?php echo htmlspecialchars($lang['admin_col_status'] ?? 'Adapter status'); ?></th>
|
||||
<th><?php echo htmlspecialchars($lang['admin_col_updated'] ?? 'Last updated'); ?></th>
|
||||
<th><?php echo htmlspecialchars($lang['admin_col_actions'] ?? 'Actions'); ?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if (empty($gameKeys)): ?>
|
||||
<?php if (empty($gameRows)): ?>
|
||||
<tr>
|
||||
<td colspan="2"><?php echo htmlspecialchars($lang['admin_no_game_keys'] ?? 'No game definitions were found in modules/config_games/server_configs.'); ?></td>
|
||||
<td colspan="5"><?php echo htmlspecialchars($lang['admin_no_game_keys'] ?? 'No Steam Workshop-enabled game definitions were detected.'); ?></td>
|
||||
</tr>
|
||||
<?php else: ?>
|
||||
<?php foreach ($gameKeys as $gameKey): ?>
|
||||
<tr>
|
||||
<td><?php echo htmlspecialchars($gameKey); ?></td>
|
||||
<?php foreach ($gameRows as $row): ?>
|
||||
<?php
|
||||
$groupKey = $row['group_key'];
|
||||
$primaryKey = $row['primary_game_key'];
|
||||
$selectValue = $row['selected_adapter'] ?: ($row['exists'] ? $primaryKey : '');
|
||||
$statusLabel = $row['exists']
|
||||
? ($row['adapter']['name'] ?? $primaryKey)
|
||||
: ($lang['status_no_adapter'] ?? 'No adapter');
|
||||
$isOpen = ($activeGameKey !== '' && $activeGameKey === $primaryKey);
|
||||
$formId = 'adapter-panel-' . preg_replace('/[^a-z0-9_-]/i', '', $groupKey);
|
||||
$form = $row['form'];
|
||||
?>
|
||||
<tr class="sw-game-table__row">
|
||||
<td>
|
||||
<select name="mapping[<?php echo htmlspecialchars($gameKey); ?>]">
|
||||
<div class="sw-game-label">
|
||||
<div class="sw-game-label__title">
|
||||
<span class="sw-game-label__name"><?php echo htmlspecialchars($row['game_name']); ?></span>
|
||||
<span class="sw-badge sw-badge--app">App ID <?php echo htmlspecialchars($row['app_id']); ?></span>
|
||||
<?php if ($row['exists']): ?>
|
||||
<span class="sw-badge sw-badge--custom"><?php echo htmlspecialchars($lang['badge_custom_xml'] ?? 'Custom XML'); ?></span>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="sw-game-variants">
|
||||
<?php foreach ($row['game_keys'] as $variantKey): ?>
|
||||
<span class="sw-chip"><?php echo htmlspecialchars($variantKey); ?></span>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
<small class="sw-game-label__hint"><?php echo htmlspecialchars($lang['admin_hint_inline_edit'] ?? 'Use the toggle to edit the XML inline.'); ?></small>
|
||||
</td>
|
||||
<td>
|
||||
<select form="sw-mapping-form" name="mapping[<?php echo htmlspecialchars($groupKey); ?>]">
|
||||
<option value="">--</option>
|
||||
<?php foreach ($adapterOptions as $key => $label): ?>
|
||||
<option value="<?php echo htmlspecialchars($key); ?>" <?php echo (isset($mappings[$gameKey]) && $mappings[$gameKey] === $key) ? 'selected' : ''; ?>>
|
||||
<option value="<?php echo htmlspecialchars($key); ?>" <?php echo ($selectValue === $key) ? 'selected' : ''; ?>>
|
||||
<?php echo htmlspecialchars($label); ?>
|
||||
</option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<?php if (!empty($row['mixed_mapping'])): ?>
|
||||
<small class="sw-game-label__hint sw-game-label__hint--warning"><?php echo htmlspecialchars($lang['admin_hint_mixed_mapping'] ?? 'Different adapters assigned across variants. Saving will sync them.'); ?></small>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td><?php echo htmlspecialchars($statusLabel); ?></td>
|
||||
<td>
|
||||
<?php if (!empty($row['updated_at'])): ?>
|
||||
<?php echo htmlspecialchars(date('Y-m-d H:i', (int)$row['updated_at'])); ?>
|
||||
<?php else: ?>
|
||||
—
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td class="sw-actions">
|
||||
<button type="button" class="btn secondary js-toggle-adapter" data-target="<?php echo htmlspecialchars($formId); ?>" aria-expanded="<?php echo $isOpen ? 'true' : 'false'; ?>">
|
||||
<?php echo htmlspecialchars($row['exists'] ? ($lang['button_edit_adapter'] ?? 'Edit adapter') : ($lang['button_create_adapter'] ?? 'Create adapter')); ?>
|
||||
</button>
|
||||
<?php if ($row['exists']): ?>
|
||||
<form method="post" class="sw-inline-delete">
|
||||
<input type="hidden" name="admin_action" value="delete_adapter">
|
||||
<input type="hidden" name="game_key" value="<?php echo htmlspecialchars($primaryKey); ?>">
|
||||
<button type="submit" class="btn danger" onclick="return confirm('<?php echo htmlspecialchars($lang['confirm_delete_adapter'] ?? 'Delete this adapter?'); ?>');">
|
||||
<?php echo htmlspecialchars($lang['button_delete_adapter'] ?? 'Delete'); ?>
|
||||
</button>
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="<?php echo htmlspecialchars($formId); ?>" class="sw-game-table__form-row <?php echo $isOpen ? 'is-open' : ''; ?>">
|
||||
<td colspan="5">
|
||||
<form method="post" class="sw-form sw-inline-form">
|
||||
<input type="hidden" name="admin_action" value="save_adapter">
|
||||
<input type="hidden" name="game_key" value="<?php echo htmlspecialchars($form['game_key']); ?>">
|
||||
|
||||
<div class="sw-form__grid">
|
||||
<label>
|
||||
<?php echo htmlspecialchars($lang['label_game_key'] ?? 'Game key'); ?>
|
||||
<input type="text" value="<?php echo htmlspecialchars($form['game_key']); ?>" readonly>
|
||||
</label>
|
||||
<label>
|
||||
<?php echo htmlspecialchars($lang['label_adapter_name'] ?? 'Adapter display name'); ?>
|
||||
<input type="text" name="adapter[name]" value="<?php echo htmlspecialchars($form['name']); ?>" required>
|
||||
</label>
|
||||
<label>
|
||||
<?php echo htmlspecialchars($lang['label_adapter_app_id'] ?? 'Steam App ID'); ?>
|
||||
<input type="text" name="adapter[steam_app_id]" value="<?php echo htmlspecialchars($form['steam_app_id']); ?>" required>
|
||||
</label>
|
||||
<label>
|
||||
<?php echo htmlspecialchars($lang['label_adapter_mods_dir'] ?? 'Mods directory'); ?>
|
||||
<input type="text" name="adapter[mods_dir]" value="<?php echo htmlspecialchars($form['mods_dir']); ?>" required>
|
||||
</label>
|
||||
<label>
|
||||
<?php echo htmlspecialchars($lang['label_adapter_keys_dir'] ?? 'Keys directory (optional)'); ?>
|
||||
<input type="text" name="adapter[keys_dir]" value="<?php echo htmlspecialchars($form['keys_dir']); ?>">
|
||||
</label>
|
||||
<label class="sw-checkbox">
|
||||
<input type="checkbox" name="adapter[supports_hot_reload]" value="1" <?php echo !empty($form['supports_hot_reload']) ? 'checked' : ''; ?>>
|
||||
<span><?php echo htmlspecialchars($lang['label_adapter_hot_reload'] ?? 'Supports hot reload'); ?></span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<label>
|
||||
<?php echo htmlspecialchars($lang['label_adapter_activation'] ?? 'Activation template'); ?>
|
||||
<textarea name="adapter[activation_template]" rows="3"><?php echo htmlspecialchars($form['activation_template']); ?></textarea>
|
||||
</label>
|
||||
|
||||
<label>
|
||||
<?php echo htmlspecialchars($lang['label_adapter_notes'] ?? 'Notes'); ?>
|
||||
<textarea name="adapter[notes]" rows="2"><?php echo htmlspecialchars($form['notes']); ?></textarea>
|
||||
</label>
|
||||
|
||||
<div class="sw-form__actions">
|
||||
<button class="btn primary" type="submit"><?php echo htmlspecialchars($lang['button_save_adapter'] ?? 'Save adapter'); ?></button>
|
||||
<button type="button" class="btn js-toggle-adapter" data-target="<?php echo htmlspecialchars($formId); ?>"><?php echo htmlspecialchars($lang['button_cancel'] ?? 'Cancel'); ?></button>
|
||||
</div>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="sw-form__actions">
|
||||
<button class="btn primary" type="submit"><?php echo htmlspecialchars($lang['button_save']); ?></button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<h3><?php echo htmlspecialchars($lang['admin_heading_per_game'] ?? 'Per-game adapters'); ?></h3>
|
||||
<p><?php echo htmlspecialchars($lang['admin_subheading_per_game'] ?? 'Each game key gets its own adapter XML. Create, edit, or delete them below.'); ?></p>
|
||||
|
||||
<table class="table sw-mods__table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><?php echo htmlspecialchars($lang['admin_col_game_key'] ?? 'Game key'); ?></th>
|
||||
<th><?php echo htmlspecialchars($lang['admin_col_status'] ?? 'Status'); ?></th>
|
||||
<th><?php echo htmlspecialchars($lang['admin_col_updated'] ?? 'Last updated'); ?></th>
|
||||
<th><?php echo htmlspecialchars($lang['admin_col_actions'] ?? 'Actions'); ?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if (empty($gameRows)): ?>
|
||||
<tr>
|
||||
<td colspan="4"><?php echo htmlspecialchars($lang['admin_no_game_keys'] ?? 'No game definitions were found in modules/config_games/server_configs.'); ?></td>
|
||||
</tr>
|
||||
<?php else: ?>
|
||||
<?php foreach ($gameRows as $row): ?>
|
||||
<?php $exists = !empty($row['exists']); ?>
|
||||
<tr>
|
||||
<td><?php echo htmlspecialchars($row['game_key']); ?></td>
|
||||
<td>
|
||||
<?php if ($exists): ?>
|
||||
<?php echo htmlspecialchars($row['adapter']['name'] ?? $row['game_key']); ?>
|
||||
<?php else: ?>
|
||||
<?php echo htmlspecialchars($lang['status_no_adapter'] ?? 'No adapter'); ?>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php if ($exists && !empty($row['updated_at'])): ?>
|
||||
<?php echo htmlspecialchars(date('Y-m-d H:i', (int)$row['updated_at'])); ?>
|
||||
<?php else: ?>
|
||||
—
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td class="sw-actions">
|
||||
<a class="btn secondary" href="?m=steam_workshop&p=workshop_admin&adapter_game=<?php echo urlencode($row['game_key']); ?>#adapter-form">
|
||||
<?php echo htmlspecialchars($exists ? ($lang['button_edit_adapter'] ?? 'Edit') : ($lang['button_create_adapter'] ?? 'Create')); ?>
|
||||
</a>
|
||||
<?php if ($exists): ?>
|
||||
<form method="post" style="display:inline;">
|
||||
<input type="hidden" name="admin_action" value="delete_adapter">
|
||||
<input type="hidden" name="game_key" value="<?php echo htmlspecialchars($row['game_key']); ?>">
|
||||
<button type="submit" class="btn danger" onclick="return confirm('<?php echo htmlspecialchars($lang['confirm_delete_adapter'] ?? 'Delete this adapter?'); ?>');">
|
||||
<?php echo htmlspecialchars($lang['button_delete_adapter'] ?? 'Delete'); ?>
|
||||
</button>
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div id="adapter-form" class="sw-adapter-form">
|
||||
<?php if ($adapterForm): ?>
|
||||
<h3><?php echo htmlspecialchars(sprintf($lang['admin_heading_edit_adapter'] ?? 'Editing adapter for %s', $adapterForm['game_key'])); ?></h3>
|
||||
<form method="post" class="sw-form">
|
||||
<input type="hidden" name="admin_action" value="save_adapter">
|
||||
<input type="hidden" name="game_key" value="<?php echo htmlspecialchars($adapterForm['game_key']); ?>">
|
||||
|
||||
<div class="sw-form__row">
|
||||
<label><?php echo htmlspecialchars($lang['label_game_key'] ?? 'Game key'); ?></label>
|
||||
<input type="text" value="<?php echo htmlspecialchars($adapterForm['game_key']); ?>" readonly>
|
||||
</div>
|
||||
|
||||
<div class="sw-form__row">
|
||||
<label><?php echo htmlspecialchars($lang['label_adapter_name'] ?? 'Adapter display name'); ?></label>
|
||||
<input type="text" name="adapter[name]" value="<?php echo htmlspecialchars($adapterForm['name']); ?>" required>
|
||||
</div>
|
||||
|
||||
<div class="sw-form__row">
|
||||
<label><?php echo htmlspecialchars($lang['label_adapter_app_id'] ?? 'Steam App ID'); ?></label>
|
||||
<input type="text" name="adapter[steam_app_id]" value="<?php echo htmlspecialchars($adapterForm['steam_app_id']); ?>" required>
|
||||
</div>
|
||||
|
||||
<div class="sw-form__row">
|
||||
<label><?php echo htmlspecialchars($lang['label_adapter_mods_dir'] ?? 'Mods directory'); ?></label>
|
||||
<input type="text" name="adapter[mods_dir]" value="<?php echo htmlspecialchars($adapterForm['mods_dir']); ?>" required>
|
||||
</div>
|
||||
|
||||
<div class="sw-form__row">
|
||||
<label><?php echo htmlspecialchars($lang['label_adapter_keys_dir'] ?? 'Keys directory (optional)'); ?></label>
|
||||
<input type="text" name="adapter[keys_dir]" value="<?php echo htmlspecialchars($adapterForm['keys_dir']); ?>">
|
||||
</div>
|
||||
|
||||
<div class="sw-form__row">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" name="adapter[supports_hot_reload]" value="1" <?php echo !empty($adapterForm['supports_hot_reload']) ? 'checked' : ''; ?> >
|
||||
<span><?php echo htmlspecialchars($lang['label_adapter_hot_reload'] ?? 'Supports hot reload'); ?></span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="sw-form__row">
|
||||
<label><?php echo htmlspecialchars($lang['label_adapter_activation'] ?? 'Activation template'); ?></label>
|
||||
<textarea name="adapter[activation_template]" rows="4"><?php echo htmlspecialchars($adapterForm['activation_template']); ?></textarea>
|
||||
</div>
|
||||
|
||||
<div class="sw-form__row">
|
||||
<label><?php echo htmlspecialchars($lang['label_adapter_notes'] ?? 'Notes'); ?></label>
|
||||
<textarea name="adapter[notes]" rows="3"><?php echo htmlspecialchars($adapterForm['notes']); ?></textarea>
|
||||
</div>
|
||||
|
||||
<div class="sw-form__actions">
|
||||
<button class="btn primary" type="submit"><?php echo htmlspecialchars($lang['button_save_adapter'] ?? 'Save adapter'); ?></button>
|
||||
<a class="btn" href="?m=steam_workshop&p=workshop_admin"><?php echo htmlspecialchars($lang['button_cancel'] ?? 'Cancel'); ?></a>
|
||||
</div>
|
||||
</form>
|
||||
<?php else: ?>
|
||||
<p><?php echo htmlspecialchars($lang['admin_hint_select_game'] ?? 'Select a game above to start editing its adapter.'); ?></p>
|
||||
<?php endif; ?>
|
||||
<div class="sw-form__actions sw-admin__mapping-actions">
|
||||
<button class="btn primary" type="submit" form="sw-mapping-form"><?php echo htmlspecialchars($lang['button_save']); ?></button>
|
||||
</div>
|
||||
|
||||
<h3><?php echo htmlspecialchars($lang['admin_heading_adapters'] ?? 'Available adapters'); ?></h3>
|
||||
|
|
@ -192,3 +185,36 @@ declare(strict_types=1);
|
|||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const toggleRow = function (targetId) {
|
||||
const row = document.getElementById(targetId);
|
||||
if (!row) {
|
||||
return;
|
||||
}
|
||||
|
||||
row.classList.toggle('is-open');
|
||||
const expanded = row.classList.contains('is-open');
|
||||
|
||||
const toggleButtons = document.querySelectorAll('.js-toggle-adapter[data-target="' + targetId + '"]');
|
||||
toggleButtons.forEach(btn => btn.setAttribute('aria-expanded', expanded ? 'true' : 'false'));
|
||||
|
||||
if (expanded) {
|
||||
const focusable = row.querySelector('input:not([type="hidden"]), textarea, select');
|
||||
if (focusable) {
|
||||
focusable.focus();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
document.querySelectorAll('.js-toggle-adapter').forEach(button => {
|
||||
button.addEventListener('click', function () {
|
||||
const targetId = button.getAttribute('data-target');
|
||||
if (targetId) {
|
||||
toggleRow(targetId);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue