@@ -0,0 +1,130 @@
|
||||
<?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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user