Files
Reservair/includes/Views/RsvMembershipProgramsPage.php
Martin Slachta c754e18a82 #18 - membership
2026-06-17 11:15:09 +02:00

131 lines
5.4 KiB
PHP

<?php
use Reservair\Forms\RsvFormBuilder;
use Reservair\Layout\RsvColumnLayout;
class RsvMembershipProgramsPage extends RsvAdminPage {
protected function render_content(): void {
if (isset($_GET['action']) && $_GET['action'] === 'edit' && isset($_GET['id'])) {
$this->show_edit(intval($_GET['id']));
return;
}
$this->show_list();
}
private function show_list(): void {
?>
<h1>Membership Programs</h1>
<hr>
<?php
RsvColumnLayout::split('1:2')
->column(function () {
echo RsvFormBuilder::create('add_membership_program', get_rest_url(null, 'reservations/v1/membership-program'), 'POST', 'Membership program created.')
->heading('Add Program')
->nonce('my_action', 'add_membership_program_nonce')
->text('name', 'Name')
->render();
?>
<hr>
<p class="submit">
<button type="submit" form="add_membership_program" class="button button-primary">Add Program</button>
</p>
<?php })
->column(function () { ?>
<div id="programs_table"></div>
<script>
var programs_dt = RsvDataGrid.create_data_grid(programs_table,
RsvMembershipProgramResource(), {
'id': RsvDataGrid.column('ID', false, 30),
'name': RsvDataGrid.action_column('Name', false, {
'Edit': RsvDataGrid.link_action((data) =>
`<?= menu_page_url('membership-programs', false) ?>&id=${data.id}&action=edit`
),
'Delete': RsvDataGrid.func_action(function(dt, row, data) {
if (!confirm('Delete this program? This cannot be undone.')) return;
dt.resource.delete(data.id).then(() => programs_dt.refresh()).catch(err => alert(err.message));
}),
}),
'active': RsvDataGrid.column('Active', false),
});
programs_dt.refresh();
</script>
<?php })
->output();
?>
<script>
RsvAdminForm.bind(document.getElementById('add_membership_program'), {
refresh: () => { if (typeof programs_dt !== 'undefined') programs_dt.refresh(); },
});
</script>
<?php
}
private function show_edit(int $id): void {
$repo = new RsvMembershipProgramRepository();
$program = $repo->get($id);
if ($program === null) {
echo '<div class="notice notice-error"><p>Program not found.</p></div>';
return;
}
?>
<h1>Edit Program: <?= esc_html($program['name']) ?></h1>
<a href="<?= menu_page_url('membership-programs', false) ?>">← Back to Programs</a>
<hr>
<?php
echo RsvFormBuilder::create('edit_membership_program', get_rest_url(null, 'reservations/v1/membership-program/' . $id), 'PUT', 'Program updated.')
->text('name', 'Name', '', true, $program['name'])
->checkbox('active', 'Active', '', $program['active'] ?? true)
->render();
?>
<script>
RsvAdminForm.bind(document.getElementById('edit_membership_program'));
</script>
<hr>
<h2>Roster</h2>
<p>Each member is identified by a single key. The key format depends on the active membership strategy.</p>
<?php
RsvColumnLayout::split('1:2')
->column(function () use ($id) {
echo RsvFormBuilder::create('add_membership_key', get_rest_url(null, 'reservations/v1/membership-program/' . $id . '/keys'), 'POST', 'Member added.')
->heading('Add Member')
->text('key_value', 'Key')
->render();
?>
<hr>
<p class="submit">
<button type="submit" form="add_membership_key" class="button button-primary">Add Member</button>
</p>
<?php })
->column(function () use ($id) { ?>
<div id="roster_table"></div>
<script>
var roster_dt = RsvDataGrid.create_data_grid(roster_table,
RsvMembershipKeyResource(<?= (int) $id ?>), {
'id': RsvDataGrid.column('ID', false, 30),
'key_value': RsvDataGrid.action_column('Key', false, {
'Delete': RsvDataGrid.func_action(function(dt, row, data) {
if (!confirm('Delete this member? This cannot be undone.')) return;
dt.resource.delete(data.id).then(() => roster_dt.refresh()).catch(err => alert(err.message));
}),
}),
});
roster_dt.refresh();
</script>
<?php })
->output();
?>
<script>
RsvAdminForm.bind(document.getElementById('add_membership_key'), {
refresh: () => { if (typeof roster_dt !== 'undefined') roster_dt.refresh(); },
onSuccess: () => { document.getElementById('add_membership_key')?.reset(); },
});
</script>
<?php
}
}