131 lines
5.4 KiB
PHP
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
|
|
}
|
|
}
|