feat: update ticket management and calendar functionality with improved data handling and local storage support

This commit is contained in:
2026-03-06 20:09:07 +01:00
parent 38f5babde3
commit 61e480cc94
4 changed files with 117 additions and 24 deletions

View File

@@ -4,8 +4,8 @@
"tickets": {
"AGENTS.md": {
"type": "-",
"size": 824,
"lmtime": 1772746796821,
"size": 819,
"lmtime": 1772746840701,
"modified": false
},
"ajax.php": {
@@ -60,8 +60,8 @@
"controls": {
"class.Apanel.php": {
"type": "-",
"size": 7347,
"lmtime": 1771856674000,
"size": 9256,
"lmtime": 1772747455304,
"modified": false
},
"class.Cron.php": {
@@ -84,8 +84,8 @@
},
"class.Tickets.php": {
"type": "-",
"size": 21842,
"lmtime": 1771856674000,
"size": 23598,
"lmtime": 1772747653836,
"modified": false
},
"class.Users.php": {
@@ -122,8 +122,8 @@
},
"class.Tickets.php": {
"type": "-",
"size": 2630,
"lmtime": 0,
"size": 7784,
"lmtime": 1772747439621,
"modified": false
},
"class.Users.php": {
@@ -248,8 +248,8 @@
},
"style.scss": {
"type": "-",
"size": 26805,
"lmtime": 1771856674000,
"size": 41713,
"lmtime": 1772748650339,
"modified": false
}
},
@@ -263,8 +263,8 @@
},
"style.css": {
"type": "-",
"size": 20712,
"lmtime": 1771856674000,
"size": 33864,
"lmtime": 1772748664976,
"modified": false
},
"style.css.map": {
@@ -864,8 +864,8 @@
},
"basket-view.php": {
"type": "-",
"size": 11856,
"lmtime": 1771856674000,
"size": 12298,
"lmtime": 1772747633070,
"modified": false
},
"disabled-sell.php": {
@@ -876,8 +876,8 @@
},
"main-view.php": {
"type": "-",
"size": 13730,
"lmtime": 1771856674000,
"size": 14587,
"lmtime": 1772747912267,
"modified": false
},
"order-confirm.php": {
@@ -961,6 +961,12 @@
"size": 4615,
"lmtime": 1771856674000,
"modified": false
},
"calendar.php": {
"type": "-",
"size": 5189,
"lmtime": 1772747510115,
"modified": false
}
},
"components": {
@@ -988,8 +994,8 @@
},
"layout-logged.php": {
"type": "-",
"size": 6106,
"lmtime": 1771856674000,
"size": 6230,
"lmtime": 1772747514918,
"modified": false
},
"layout-unlogged.php": {
@@ -1070,8 +1076,8 @@
},
"upgrade.php": {
"type": "-",
"size": 1444,
"lmtime": 1771856674000,
"size": 1777,
"lmtime": 1772747640419,
"modified": false
},
"upload": {}

View File

@@ -214,15 +214,20 @@ class Apanel
static public function tickets_save()
{
global $mdb;
global $mdb, $settings;
if (empty($_POST['tickets']) || !is_array($_POST['tickets'])) {
echo json_encode(['status' => 'error', 'message' => 'Brak danych']);
exit;
}
$allowedTicketIds = array_keys($settings['tickets']);
foreach ($_POST['tickets'] as $ticketId => $data) {
$ticketId = preg_replace('/[^a-z0-9\-]/', '', $ticketId);
$ticketId = trim((string) $ticketId);
if (!in_array($ticketId, $allowedTicketIds, true)) {
continue;
}
$price = trim($data['price'] ?? '') !== '' ? (float) $data['price'] : null;
$priceWkd = trim($data['price_weekend'] ?? '') !== '' ? (float) $data['price_weekend'] : null;

View File

@@ -32,6 +32,13 @@ class Tickets {
'gift-bilet-all-open-normalny',
],
],
'bilety-rodzinne' => [
'label' => 'Bilety rodzinne',
'ticket_ids' => [
'bilet-rodzina-2+1',
'bilet-rodzina-2+2',
],
],
];
}

View File

@@ -35,6 +35,10 @@
<script type="text/javascript">
$(function() {
const storageKeys = {
selectedGroup: 'admin_calendar_selected_group',
visibleMonth: 'admin_calendar_visible_month'
};
let enabledDatesSet = new Set();
const calendarInstance = flatpickr("#admin-flatpickr", {
@@ -43,6 +47,12 @@
dateFormat: "Y-m-d",
disableMobile: true,
locale: "pl",
onMonthChange: function() {
persistVisibleMonth();
},
onYearChange: function() {
persistVisibleMonth();
},
onChange: function(selectedDates, dateStr, instance) {
syncSetWithPicker(instance);
}
@@ -62,7 +72,47 @@
}
function renderCurrentSetToPicker() {
const currentViewDate = new Date(calendarInstance.currentYear, calendarInstance.currentMonth, 1);
calendarInstance.setDate(Array.from(enabledDatesSet), false, "Y-m-d");
calendarInstance.jumpToDate(currentViewDate, false);
}
function persistSelectedGroup() {
try {
localStorage.setItem(storageKeys.selectedGroup, getCurrentGroup());
} catch (error) {}
}
function restoreSelectedGroup() {
try {
const savedGroup = localStorage.getItem(storageKeys.selectedGroup);
if (!savedGroup) {
return;
}
if ($('#ticket_group option[value="' + savedGroup + '"]').length > 0) {
$('#ticket_group').val(savedGroup);
}
} catch (error) {}
}
function persistVisibleMonth() {
try {
const month = String(calendarInstance.currentMonth + 1).padStart(2, "0");
const year = String(calendarInstance.currentYear);
localStorage.setItem(storageKeys.visibleMonth, year + "-" + month);
} catch (error) {}
}
function restoreVisibleMonth() {
try {
const savedMonth = localStorage.getItem(storageKeys.visibleMonth);
if (!savedMonth || !/^\d{4}-\d{2}$/.test(savedMonth)) {
return;
}
calendarInstance.jumpToDate(savedMonth + "-01", false);
} catch (error) {}
}
function getCurrentGroup() {
@@ -77,16 +127,33 @@
}
}
function parseServerResponse(rawResponse) {
if (rawResponse && typeof rawResponse === 'object') {
return rawResponse;
}
try {
return JSON.parse(rawResponse);
} catch (error) {
return null;
}
}
function fetchDatesForGroup() {
$.ajax({
type: 'POST',
cache: false,
url: '/apanel/calendar_dates/',
dataType: 'json',
data: {
ticket_group: getCurrentGroup()
},
success: function(rawResponse) {
const response = $.parseJSON(rawResponse);
const response = parseServerResponse(rawResponse);
if (!response) {
handleError('Nie udalo sie odczytac odpowiedzi serwera.');
return;
}
if (response.status !== 'ok') {
handleError(response.message || 'Nie udało się pobrać danych kalendarza.');
return;
@@ -124,13 +191,18 @@
type: 'POST',
cache: false,
url: '/apanel/calendar_save/',
dataType: 'json',
data: {
ticket_group: getCurrentGroup(),
dates: Array.from(enabledDatesSet),
csrf_token: $('#calendar_csrf_token').val()
},
success: function(rawResponse) {
const response = $.parseJSON(rawResponse);
const response = parseServerResponse(rawResponse);
if (!response) {
handleError('Nie udalo sie odczytac odpowiedzi serwera.');
return;
}
if (response.status !== 'ok') {
handleError(response.message || 'Nie udało się zapisać kalendarza.');
return;
@@ -147,6 +219,7 @@
}
$('body').on('change', '#ticket_group', function() {
persistSelectedGroup();
fetchDatesForGroup();
});
@@ -162,6 +235,8 @@
saveCalendar();
});
restoreSelectedGroup();
restoreVisibleMonth();
fetchDatesForGroup();
});
</script>