Neueste Version

This commit is contained in:
Admin committed 2026-08-18 13:35:19 +00:00
1 parent 179347a45b
commit 5cc0d238c5
31 files changed
+603 -219

No files matched your search

@@ -0,0 +1,166 @@
export default {
async openBookingWidget() {
const calendarModel = Custom5.model || {};
const selection = calendarModel.calendarSelection || null;
if (!selection) {
showAlert(
"Bitte zuerst einen Tag oder Zeitraum auswählen.",
"warning"
);
return;
}
function pad(value) {
return String(value).padStart(2, "0");
}
function parseLocalDateTime(value) {
if (!value) return null;
const text = String(value).trim();
const parts = text.split(/[-T:]/g);
if (parts.length < 3) return null;
const date = new Date(
Number(parts[0]),
Number(parts[1]) - 1,
Number(parts[2]),
Number(parts[3] || 0),
Number(parts[4] || 0),
Number(parts[5] || 0)
);
return Number.isNaN(date.getTime()) ? null : date;
}
function formatDate(date) {
return [
date.getFullYear(),
pad(date.getMonth() + 1),
pad(date.getDate())
].join("-");
}
function formatTime(date) {
return [
pad(date.getHours()),
pad(date.getMinutes())
].join(":");
}
function formatDateTimeForSql(date) {
return `${formatDate(date)} ${formatTime(date)}:00`;
}
const start = parseLocalDateTime(selection.start);
const end = parseLocalDateTime(selection.end);
if (!start || !end) {
showAlert(
"Die Kalenderauswahl enthält kein gültiges Datum.",
"error"
);
return;
}
const seatId = String(
Custom4.model?.seatId ||
appsmith.store.selectedSeatId ||
""
).trim();
const seatName = String(
Custom4.model?.seatName ||
appsmith.store.selectedSeatName ||
""
).trim();
if (!seatId) {
showAlert(
"Es wurde kein Sitzplatz ausgewählt.",
"error"
);
return;
}
const bookedBy =
appsmith.user?.email ||
appsmith.user?.username ||
null;
if (!bookedBy) {
showAlert(
"Der angemeldete Benutzer konnte nicht ermittelt werden.",
"error"
);
return;
}
const isAllDay =
selection.allDay === true ||
selection.type === "day" ||
selection.type === "days";
let endDate;
let startTime = null;
let endTime = null;
let endDateTime = end;
if (isAllDay) {
const lastSelectedDay = new Date(end);
lastSelectedDay.setDate(lastSelectedDay.getDate() - 1);
endDate = formatDate(lastSelectedDay);
endDateTime = new Date(lastSelectedDay);
endDateTime.setHours(23, 59, 59, 0);
} else {
endDate = formatDate(end);
startTime = formatTime(start);
endTime = formatTime(end);
}
const recurringCheckbox =
typeof RecurringCheckbox !== "undefined"
? RecurringCheckbox
: null;
const bookingFormData = {
seatId,
seatName,
bookedBy,
title: "Platzbuchung",
type: selection.type || null,
startDate: formatDate(start),
endDate,
startTime,
endTime,
startDateTime: formatDateTimeForSql(start),
endDateTime: formatDateTimeForSql(endDateTime),
allDay: Boolean(isAllDay),
recurring: Boolean(
recurringCheckbox?.isChecked || false
)
};
try {
await storeValue(
"bookingFormData",
bookingFormData,
false
);
await showModal("Platzbuchung");
} catch (error) {
console.error(
"Buchungsdaten konnten nicht gespeichert werden:",
error
);
showAlert(
"Die Buchungsdaten konnten nicht gespeichert werden.",
"error"
);
}
}
};
@@ -0,0 +1,11 @@
{
"gitSyncId": "6a6b5b477ebc9edeca96e2f8_7feb3701-9036-42b6-bda5-53267d59b24e",
"id": "Sitzplätze_BookingSelect",
"unpublishedCollection": {
"name": "BookingSelect",
"pageId": "Sitzplätze",
"pluginId": "js-plugin",
"pluginType": "JS",
"variables": []
}
}
@@ -1,27 +0,0 @@
SELECT
id,
platz_id,
titel AS title,
startzeit AS start,
endzeit AS end,
gebucht_von
FROM `buchungen`
WHERE platz_id = '{{appsmith.store.selectedSeatId}}'
ORDER BY startzeit;
INSERT INTO `buchungen`
(
id,
titel,
startzeit,
endzeit,
gebucht_von
)
VALUES
(
'{{appsmith.store.selectedSeatId}}',
'{{InputTitel.text}}',
'{{InputStartzeit.text}}',
'{{InputEndzeit.text}}',
'{{InputGebuchtVon.text}}'
);
@@ -0,0 +1,31 @@
{
"gitSyncId": "6a6b5b477ebc9edeca96e2f8_d245a9e2-35c3-40b1-88d9-d9af14910175",
"id": "Sitzplätze_BookingSelect.openBookingWidget",
"pluginId": "js-plugin",
"pluginType": "JS",
"unpublishedAction": {
"actionConfiguration": {
"encodeParamsToggle": true,
"jsArguments": [],
"paginationType": "NONE",
"timeoutInMillisecond": 10000
},
"collectionId": "Sitzplätze_BookingSelect",
"confirmBeforeExecute": false,
"datasource": {
"isAutoGenerated": false,
"name": "UNUSED_DATASOURCE",
"pluginId": "js-plugin"
},
"dynamicBindingPathList": [
{
"key": "body"
}
],
"fullyQualifiedName": "BookingSelect.openBookingWidget",
"name": "openBookingWidget",
"pageId": "Sitzplätze",
"runBehaviour": "MANUAL",
"userSetOnLoad": false
}
}
@@ -0,0 +1,16 @@
INSERT INTO `buchungen`
(
`platz_id`,
`titel`,
`startzeit`,
`endzeit`,
`gebucht_von`
)
VALUES
(
{{ appsmith.store.bookingFormData.seatId }},
{{ appsmith.store.bookingFormData.title }},
{{ appsmith.store.bookingFormData.startDateTime }},
{{ appsmith.store.bookingFormData.endDateTime }},
{{ appsmith.store.bookingFormData.bookedBy }}
);
@@ -1,11 +1,11 @@
{
"gitSyncId": "6a6b5b477ebc9edeca96e2f8_a4b30cc2-55bd-48f3-a541-3934d1b76d01",
"id": "Sitzplätze_BookSeatSQL",
"gitSyncId": "6a6b5b477ebc9edeca96e2f8_e0fcb986-9f0b-4eab-bcee-5d1449214ffa",
"id": "Sitzplätze_CreateBooking",
"pluginId": "mysql-plugin",
"pluginType": "DB",
"unpublishedAction": {
"actionConfiguration": {
"body": "SELECT\n id,\n platz_id,\n titel AS title,\n startzeit AS start,\n endzeit AS end,\n gebucht_von\nFROM `buchungen`\nWHERE platz_id = '{{appsmith.store.selectedSeatId}}'\nORDER BY startzeit;\n\nINSERT INTO `buchungen`\n(\n id,\n titel,\n startzeit,\n endzeit,\n gebucht_von\n)\nVALUES\n(\n '{{appsmith.store.selectedSeatId}}',\n '{{InputTitel.text}}',\n '{{InputStartzeit.text}}',\n '{{InputEndzeit.text}}',\n '{{InputGebuchtVon.text}}'\n);",
"body": "INSERT INTO `buchungen`\n(\n `platz_id`,\n `titel`,\n `startzeit`,\n `endzeit`,\n `gebucht_von`\n)\nVALUES\n(\n {{ appsmith.store.bookingFormData.seatId }},\n {{ appsmith.store.bookingFormData.title }},\n {{ appsmith.store.bookingFormData.startDateTime }},\n {{ appsmith.store.bookingFormData.endDateTime }},\n {{ appsmith.store.bookingFormData.bookedBy }}\n);",
"encodeParamsToggle": true,
"paginationType": "NONE",
"pluginSpecifiedTemplates": [
@@ -27,7 +27,7 @@
"key": "body"
}
],
"name": "BookSeatSQL",
"name": "CreateBooking",
"pageId": "Sitzplätze",
"runBehaviour": "MANUAL",
"userSetOnLoad": false
@@ -6,5 +6,6 @@ SELECT
endzeit AS end,
gebucht_von
FROM `buchungen`
WHERE platz_id = '{{appsmith.store.selectedSeatId}}'
WHERE platz_id =
{{ appsmith.store.selectedSeatId }}
ORDER BY startzeit;
@@ -1,11 +1,11 @@
{
"gitSyncId": "6a6b5b477ebc9edeca96e2f8_e0fcb986-9f0b-4eab-bcee-5d1449214ffa",
"id": "Sitzplätze_GetBookings",
"gitSyncId": "6a6b5b477ebc9edeca96e2f8_a4b30cc2-55bd-48f3-a541-3934d1b76d01",
"id": "Sitzplätze_GetSeatBookings",
"pluginId": "mysql-plugin",
"pluginType": "DB",
"unpublishedAction": {
"actionConfiguration": {
"body": "SELECT\n id,\n platz_id,\n titel AS title,\n startzeit AS start,\n endzeit AS end,\n gebucht_von\nFROM `buchungen`\nWHERE platz_id = '{{appsmith.store.selectedSeatId}}'\nORDER BY startzeit;",
"body": "SELECT\n id,\n platz_id,\n titel AS title,\n startzeit AS start,\n endzeit AS end,\n gebucht_von\nFROM `buchungen`\nWHERE platz_id =\n {{ appsmith.store.selectedSeatId }}\nORDER BY startzeit;",
"encodeParamsToggle": true,
"paginationType": "NONE",
"pluginSpecifiedTemplates": [
@@ -27,7 +27,7 @@
"key": "body"
}
],
"name": "GetBookings",
"name": "GetSeatBookings",
"pageId": "Sitzplätze",
"runBehaviour": "AUTOMATIC",
"userSetOnLoad": false
+3 -3
View File
@@ -55,11 +55,11 @@
"parentRowSpace": 10,
"renderMode": "CANVAS",
"rightColumn": 64,
"seatSelected": "{{\n storeValue(\n \"selectedSeatId\",\n Custom4.model.selectedSeat.id\n )\n .then(() =>\n storeValue(\n \"selectedSeatName\",\n Custom4.model.selectedSeat.name\n )\n )\n .then(() => GetBookings.run())\n .then(() => showModal(SeatCalendar.name))\n}}",
"seatSelected": "{{\n showModal(\n \"SeatCalendar\"\n )\n}}",
"srcDoc": {
"css": "@charset \"UTF-8\";\nhtml,\nbody {\n margin: 0;\n width: 100%;\n height: 100%;\n overflow: auto;\n font-family: Arial, sans-serif;\n}\n\n/* Bild + Overlay */\n#imgHolder {\n position: relative;\n width: 100%;\n height: 700px; /* feste Höhe, damit sicher nicht 0 */\n overflow: hidden;\n border-radius: 6px;\n background: #f3f4f6;\n}\n\n#floorplanImage {\n position: absolute;\n inset: 0;\n z-index: 1;\n display: block;\n width: 100%;\n height: 100%;\n object-fit: contain;\n}\n\n#seatLayer {\n position: absolute;\n inset: 0;\n z-index: 2;\n width: 100%;\n height: 100%;\n pointer-events: none; /* Punkte bekommen später pointer-events:auto */\n}\n\n/* Sitzpunkte */\n.seat {\n position: absolute;\n z-index: 3;\n display: block;\n width: 18px;\n height: 18px;\n padding: 0;\n transform: translate(-50%, -50%);\n border: 2px solid #ffffff;\n border-radius: 50%;\n background: #22c55e;\n color: #22c55e;\n cursor: pointer;\n pointer-events: auto;\n appearance: none;\n box-sizing: border-box;\n box-shadow: 0 0 5px currentColor, 0 0 10px currentColor;\n transition: transform 0.15s ease, box-shadow 0.15s ease;\n}\n\n.seat:hover {\n z-index: 10;\n transform: translate(-50%, -50%) scale(1.45);\n box-shadow: 0 0 8px currentColor, 0 0 16px currentColor;\n}\n\n/* Farben nach Status */\n.seat.frei {\n background: #22c55e; /* Grün */\n color: #22c55e;\n}\n\n.seat.belegt {\n background: #ef4444; /* Rot */\n color: #ef4444;\n}\n\n.seat.selected {\n outline: 3px solid #2563eb;\n outline-offset: 3px;\n}\n\n/* Legende */\n#legend {\n display: flex;\n flex-wrap: wrap;\n gap: 14px;\n margin-top: 8px;\n color: #374151;\n font-size: 13px;\n}\n\n.legendItem {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n}\n\n.legendColor {\n display: inline-block;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n}\n\n.legendColor.frei {\n background: #22c55e;\n}\n\n.legendColor.belegt {\n background: #ef4444;\n}",
"html": "<div id=\"seatPlan\">\n\n <div id=\"imgHolder\">\n <!-- Kein src hier, das Bild kommt über JavaScript -->\n <img id=\"floorplanImage\" alt=\"Büroplan\">\n\t\t<div id=\"seatLayer\"></div>\n\t\t\n\t\t\n </div>\n</div>",
"js": "let selectedSeat = null;\n\n/**\n * Base64-Bild: WICHTIG – Typ muss zum Inhalt passen!\n * Wenn dein String mit \"iVBORw0KGgo...\" beginnt, ist das PNG:\n */\nconst FLOORPLAN_IMAGE = \"data:image/jpeg;base64,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 truncated
"js": "let selectedSeat = null;\n\n/**\n * Base64-Bild: WICHTIG – Typ muss zum Inhalt passen!\n * Wenn dein String mit \"iVBORw0KGgo...\" beginnt, ist das PNG:\n */\nconst FLOORPLAN_IMAGE = \"data:image/jpeg;base64,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 truncated
},
"theme": "{{appsmith.theme}}",
"topRow": 8,
@@ -67,7 +67,7 @@
"uncompiledSrcDoc": {
"css": "html,\nbody {\n margin: 0;\n width: 100%;\n height: 100%;\n overflow: auto;\n font-family: Arial, sans-serif;\n}\n\n\n/* Bild + Overlay */\n#imgHolder {\n position: relative;\n width: 100%;\n height: 700px; /* feste Höhe, damit sicher nicht 0 */\n overflow: hidden;\n border-radius: 6px;\n background: #f3f4f6;\n}\n\n#floorplanImage {\n position: absolute;\n inset: 0;\n z-index: 1;\n display: block;\n width: 100%;\n height: 100%;\n object-fit: contain;\n}\n\n#seatLayer {\n position: absolute;\n inset: 0;\n z-index: 2;\n width: 100%;\n height: 100%;\n pointer-events: none; /* Punkte bekommen später pointer-events:auto */\n}\n\n/* Sitzpunkte */\n.seat {\n position: absolute;\n z-index: 3;\n display: block;\n width: 18px;\n height: 18px;\n padding: 0;\n transform: translate(-50%, -50%);\n border: 2px solid #ffffff;\n border-radius: 50%;\n background: #22c55e;\n color: #22c55e;\n cursor: pointer;\n pointer-events: auto;\n appearance: none;\n box-sizing: border-box;\n box-shadow:\n 0 0 5px currentColor,\n 0 0 10px currentColor;\n transition:\n transform 0.15s ease,\n box-shadow 0.15s ease;\n}\n\n.seat:hover {\n z-index: 10;\n transform: translate(-50%, -50%) scale(1.45);\n box-shadow:\n 0 0 8px currentColor,\n 0 0 16px currentColor;\n}\n\n/* Farben nach Status */\n.seat.frei {\n background: #22c55e; /* Grün */\n color: #22c55e;\n}\n\n.seat.belegt {\n background: #ef4444; /* Rot */\n color: #ef4444;\n}\n\n.seat.selected {\n outline: 3px solid #2563eb;\n outline-offset: 3px;\n}\n\n/* Legende */\n#legend {\n display: flex;\n flex-wrap: wrap;\n gap: 14px;\n margin-top: 8px;\n color: #374151;\n font-size: 13px;\n}\n\n.legendItem {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n}\n\n.legendColor {\n display: inline-block;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n}\n\n.legendColor.frei {\n background: #22c55e;\n}\n\n.legendColor.belegt {\n background: #ef4444;\n}",
"html": "<div id=\"seatPlan\">\n\n <div id=\"imgHolder\">\n <!-- Kein src hier, das Bild kommt über JavaScript -->\n <img id=\"floorplanImage\" alt=\"Büroplan\">\n\t\t<div id=\"seatLayer\"></div>\n\t\t\n\t\t\n </div>\n</div>",
"js": "let selectedSeat = null;\n\n/**\n * Base64-Bild: WICHTIG – Typ muss zum Inhalt passen!\n * Wenn dein String mit \"iVBORw0KGgo...\" beginnt, ist das PNG:\n */\nconst FLOORPLAN_IMAGE =\n \"data:image/jpeg;base64,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 truncated
"js": "let selectedSeat = null;\n\n/**\n * Base64-Bild: WICHTIG – Typ muss zum Inhalt passen!\n * Wenn dein String mit \"iVBORw0KGgo...\" beginnt, ist das PNG:\n */\nconst FLOORPLAN_IMAGE =\n \"data:image/jpeg;base64,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 truncated
},
"version": 1,
"widgetId": "londvdt302",
@@ -3,7 +3,7 @@
"alignWidget": "LEFT",
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 22,
"bottomRow": 38,
"defaultCheckedState": true,
"dynamicBindingPathList": [
{
@@ -45,9 +45,9 @@
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 43,
"topRow": 18,
"topRow": 34,
"type": "CHECKBOX_WIDGET",
"version": 1,
"widgetId": "ahhin3wdnq",
"widgetName": "Checkbox2"
"widgetName": "AllDayCheckbox"
}
@@ -0,0 +1,56 @@
{
"accentColor": "{{appsmith.theme.colors.primaryColor}}",
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 26,
"boxShadow": "none",
"closeOnSelection": true,
"dateFormat": "D MMMM, YYYY",
"datePickerType": "DATE_PICKER",
"defaultDate": "2026-08-17T09:59:18.715Z",
"dynamicBindingPathList": [
{
"key": "accentColor"
},
{
"key": "borderRadius"
}
],
"dynamicHeight": "FIXED",
"dynamicTriggerPathList": [],
"firstDayOfWeek": 0,
"isDisabled": false,
"isLoading": false,
"isRequired": false,
"isVisible": true,
"key": "vo3jwhx7du",
"label": "Buchung bis",
"labelAlignment": "left",
"labelPosition": "Top",
"labelTextSize": "0.875rem",
"labelWidth": 5,
"leftColumn": 1,
"maxDate": "2121-12-31T18:29:00.000Z",
"maxDynamicHeight": 9000,
"minDate": "1920-12-31T18:30:00.000Z",
"minDynamicHeight": 4,
"minWidth": 450,
"mobileBottomRow": 18,
"mobileLeftColumn": 1,
"mobileRightColumn": 21,
"mobileTopRow": 11,
"needsErrorInfo": false,
"parentColumnSpace": 8.875,
"parentId": "q44lz1f0e4",
"parentRowSpace": 10,
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 22,
"shortcuts": false,
"timePrecision": "None",
"topRow": 19,
"type": "DATE_PICKER_WIDGET2",
"version": 2,
"widgetId": "k0y272smyy",
"widgetName": "BookingEndDate"
}
@@ -0,0 +1,62 @@
{
"accentColor": "{{appsmith.theme.colors.primaryColor}}",
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 18,
"boxShadow": "none",
"defaultOptionValue": "GREEN",
"dynamicBindingPathList": [
{
"key": "accentColor"
},
{
"key": "borderRadius"
},
{
"key": "sourceData"
}
],
"dynamicHeight": "FIXED",
"dynamicPropertyPathList": [
{
"key": "sourceData"
}
],
"dynamicTriggerPathList": [],
"isDisabled": false,
"isFilterable": false,
"isLoading": false,
"isRequired": false,
"isVisible": true,
"key": "f8k90o33yd",
"labelAlignment": "left",
"labelPosition": "Top",
"labelText": "Endzeit",
"labelTextSize": "0.875rem",
"labelWidth": 5,
"leftColumn": 39,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minWidth": 450,
"mobileBottomRow": 15,
"mobileLeftColumn": 22,
"mobileRightColumn": 42,
"mobileTopRow": 8,
"needsErrorInfo": false,
"optionLabel": "value",
"optionValue": "value",
"parentColumnSpace": 8.875,
"parentId": "q44lz1f0e4",
"parentRowSpace": 10,
"placeholderText": "Select option",
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 53,
"serverSideFiltering": false,
"sourceData": "{{\n [\n { label: \"07:30\", value: \"07:30\" },\n { label: \"08:00\", value: \"08:00\" },\n { label: \"08:30\", value: \"08:30\" },\n { label: \"09:00\", value: \"09:00\" },\n { label: \"09:30\", value: \"09:30\" },\n { label: \"10:00\", value: \"10:00\" },\n { label: \"10:30\", value: \"10:30\" },\n { label: \"11:00\", value: \"11:00\" },\n { label: \"11:30\", value: \"11:30\" },\n { label: \"12:00\", value: \"12:00\" },\n { label: \"12:30\", value: \"12:30\" },\n { label: \"13:00\", value: \"13:00\" },\n { label: \"13:30\", value: \"13:30\" },\n { label: \"14:00\", value: \"14:00\" },\n { label: \"14:30\", value: \"14:30\" },\n { label: \"15:00\", value: \"15:00\" },\n { label: \"15:30\", value: \"15:30\" },\n { label: \"16:00\", value: \"16:00\" },\n { label: \"16:30\", value: \"16:30\" },\n { label: \"17:00\", value: \"17:00\" },\n { label: \"17:30\", value: \"17:30\" },\n { label: \"18:00\", value: \"18:00\" }\n ].filter(option => {\n const start =\n BookingStartTime.selectedOptionValue ||\n \"07:00\";\n\n return option.value > start;\n })\n}}",
"topRow": 11,
"type": "SELECT_WIDGET",
"version": 1,
"widgetId": "ffcw6h9yvt",
"widgetName": "BookingEndTime"
}
@@ -24,7 +24,7 @@
"isRequired": false,
"isVisible": true,
"key": "vo3jwhx7du",
"label": "Datum",
"label": "Buchung von",
"labelAlignment": "left",
"labelPosition": "Top",
"labelTextSize": "0.875rem",
@@ -52,5 +52,5 @@
"type": "DATE_PICKER_WIDGET2",
"version": 2,
"widgetId": "7g7p1jdnt1",
"widgetName": "DatePicker1"
"widgetName": "BookingStartDate"
}
@@ -0,0 +1,62 @@
{
"accentColor": "{{appsmith.theme.colors.primaryColor}}",
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 18,
"boxShadow": "none",
"defaultOptionValue": "GREEN",
"dynamicBindingPathList": [
{
"key": "accentColor"
},
{
"key": "borderRadius"
},
{
"key": "sourceData"
}
],
"dynamicHeight": "FIXED",
"dynamicPropertyPathList": [
{
"key": "sourceData"
}
],
"dynamicTriggerPathList": [],
"isDisabled": false,
"isFilterable": false,
"isLoading": false,
"isRequired": false,
"isVisible": true,
"key": "f8k90o33yd",
"labelAlignment": "left",
"labelPosition": "Top",
"labelText": "Startzeit",
"labelTextSize": "0.875rem",
"labelWidth": 5,
"leftColumn": 25,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minWidth": 450,
"mobileBottomRow": 15,
"mobileLeftColumn": 22,
"mobileRightColumn": 42,
"mobileTopRow": 8,
"needsErrorInfo": false,
"optionLabel": "label",
"optionValue": "value",
"parentColumnSpace": 8.875,
"parentId": "q44lz1f0e4",
"parentRowSpace": 10,
"placeholderText": "Select option",
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 39,
"serverSideFiltering": false,
"sourceData": "{{\n [\n { label: \"07:00\", value: \"07:00\" },\n { label: \"07:30\", value: \"07:30\" },\n { label: \"08:00\", value: \"08:00\" },\n { label: \"08:30\", value: \"08:30\" },\n { label: \"09:00\", value: \"09:00\" },\n { label: \"09:30\", value: \"09:30\" },\n { label: \"10:00\", value: \"10:00\" },\n { label: \"10:30\", value: \"10:30\" },\n { label: \"11:00\", value: \"11:00\" },\n { label: \"11:30\", value: \"11:30\" },\n { label: \"12:00\", value: \"12:00\" },\n { label: \"12:30\", value: \"12:30\" },\n { label: \"13:00\", value: \"13:00\" },\n { label: \"13:30\", value: \"13:30\" },\n { label: \"14:00\", value: \"14:00\" },\n { label: \"14:30\", value: \"14:30\" },\n { label: \"15:00\", value: \"15:00\" },\n { label: \"15:30\", value: \"15:30\" },\n { label: \"16:00\", value: \"16:00\" },\n { label: \"16:30\", value: \"16:30\" },\n { label: \"17:00\", value: \"17:00\" },\n { label: \"17:30\", value: \"17:30\" }\n ]\n}}",
"topRow": 11,
"type": "SELECT_WIDGET",
"version": 1,
"widgetId": "u53n2l4s54",
"widgetName": "BookingStartTime"
}
@@ -1,7 +1,7 @@
{
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 43,
"bottomRow": 70,
"boxShadow": "none",
"buttonColor": "{{appsmith.theme.colors.primaryColor}}",
"buttonStyle": "PRIMARY_BUTTON",
@@ -15,18 +15,29 @@
"key": "borderRadius"
}
],
"dynamicPropertyPathList": [
{
"key": "onClick"
}
],
"dynamicTriggerPathList": [
{
"key": "onClick"
}
],
"isDefaultClickDisabled": true,
"isDisabled": false,
"isLoading": false,
"isVisible": true,
"key": "on7g9pelq6",
"leftColumn": 46,
"leftColumn": 51,
"minWidth": 120,
"mobileBottomRow": 22,
"mobileLeftColumn": 47,
"mobileRightColumn": 63,
"mobileTopRow": 18,
"needsErrorInfo": false,
"onClick": "{{\n CreateBooking\n .run()\n .then(() => {\n return closeModal(\n \"Platzbuchung\"\n );\n })\n .then(() => {\n return GetSeatBookings.run();\n })\n .catch((error) => {\n showAlert(\n \"Die Buchung konnte nicht gespeichert werden.\",\n \"error\"\n );\n\n console.error(\n \"CreateBooking fehlgeschlagen:\",\n error\n );\n });\n}}",
"originalBottomRow": 40,
"originalTopRow": 36,
"parentId": "q44lz1f0e4",
@@ -35,11 +46,11 @@
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 62,
"text": "Confirm",
"topRow": 39,
"rightColumn": 63,
"text": "Buchen",
"topRow": 66,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "iutdgcd629",
"widgetName": "Button2"
"widgetName": "ConfirmBookingButton"
}
@@ -1,6 +1,6 @@
{
"animateLoading": true,
"bottomRow": 26,
"bottomRow": 42,
"capSide": 0,
"capType": "nc",
"dividerColor": "#d4d4d8",
@@ -27,7 +27,7 @@
"rightColumn": 63,
"strokeStyle": "solid",
"thickness": 2,
"topRow": 22,
"topRow": 38,
"type": "DIVIDER_WIDGET",
"version": 1,
"widgetId": "7wun775rq0",
@@ -31,7 +31,7 @@
"mobileRightColumn": 64,
"mobileTopRow": 0,
"needsErrorInfo": false,
"onClick": "{{closeModal(Platzbuchung.name);}}",
"onClick": "{{closeModal(Platzbuchung.name);\nshowModal(SeatCalendar.name);}}",
"parentId": "q44lz1f0e4",
"renderMode": "CANVAS",
"responsiveBehavior": "hug",
@@ -1,14 +1,14 @@
{
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 465,
"bottomRow": 72,
"boxShadow": "none",
"canEscapeKeyClose": true,
"canOutsideClickClose": true,
"children": [
{
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 450,
"bottomRow": 720,
"boxShadow": "{{appsmith.theme.boxShadow.appBoxShadow}}",
"canExtend": true,
"detachFromLayout": true,
@@ -29,7 +29,7 @@
"leftColumn": 0,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minHeight": 478,
"minHeight": 720,
"minWidth": 450,
"mobileBottomRow": 240,
"mobileLeftColumn": 0,
@@ -58,14 +58,14 @@
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicTriggerPathList": [],
"height": 450,
"height": 720,
"isCanvas": true,
"isLoading": false,
"key": "tfld9k9m85",
"leftColumn": 19,
"maxDynamicHeight": 9000,
"minDynamicHeight": 10,
"minHeight": 410,
"minHeight": 720,
"mobileBottomRow": 39,
"mobileLeftColumn": 19,
"mobileRightColumn": 43,
@@ -84,5 +84,5 @@
"version": 2,
"widgetId": "lywapf93mj",
"widgetName": "Platzbuchung",
"width": 580
"width": 1199.85
}
@@ -3,7 +3,7 @@
"alignWidget": "LEFT",
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 30,
"bottomRow": 46,
"defaultCheckedState": false,
"dynamicBindingPathList": [
{
@@ -39,9 +39,9 @@
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 45,
"topRow": 26,
"topRow": 42,
"type": "CHECKBOX_WIDGET",
"version": 1,
"widgetId": "s2wg7tlv6m",
"widgetName": "Checkbox1"
"widgetName": "RecurringCheckbox"
}
@@ -1,7 +1,7 @@
{
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 38,
"bottomRow": 10,
"boxShadow": "none",
"buttonColor": "{{appsmith.theme.colors.primaryColor}}",
"buttonVariant": "PRIMARY",
@@ -30,16 +30,16 @@
"originalBottomRow": 36,
"originalTopRow": 32,
"parentColumnSpace": 8.875,
"parentId": "q44lz1f0e4",
"parentId": "nxgzciev9f",
"parentRowSpace": 10,
"placement": "CENTER",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 7,
"rightColumn": 12,
"text": "Mo",
"topRow": 34,
"topRow": 6,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "94tiejotz5",
@@ -1,7 +1,7 @@
{
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 38,
"bottomRow": 10,
"boxShadow": "none",
"buttonColor": "{{appsmith.theme.colors.primaryColor}}",
"buttonVariant": "PRIMARY",
@@ -20,7 +20,7 @@
"isLoading": false,
"isVisible": true,
"key": "on7g9pelq6",
"leftColumn": 7,
"leftColumn": 12,
"minWidth": 120,
"mobileBottomRow": 38,
"mobileLeftColumn": 2,
@@ -30,16 +30,16 @@
"originalBottomRow": 36,
"originalTopRow": 32,
"parentColumnSpace": 8.875,
"parentId": "q44lz1f0e4",
"parentId": "nxgzciev9f",
"parentRowSpace": 10,
"placement": "CENTER",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 14,
"rightColumn": 24,
"text": "Di",
"topRow": 34,
"topRow": 6,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "ghkjz9swkj",
@@ -1,7 +1,7 @@
{
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 38,
"bottomRow": 10,
"boxShadow": "none",
"buttonColor": "{{appsmith.theme.colors.primaryColor}}",
"buttonVariant": "PRIMARY",
@@ -20,7 +20,7 @@
"isLoading": false,
"isVisible": true,
"key": "on7g9pelq6",
"leftColumn": 14,
"leftColumn": 24,
"minWidth": 120,
"mobileBottomRow": 38,
"mobileLeftColumn": 2,
@@ -30,16 +30,16 @@
"originalBottomRow": 36,
"originalTopRow": 32,
"parentColumnSpace": 8.875,
"parentId": "q44lz1f0e4",
"parentId": "nxgzciev9f",
"parentRowSpace": 10,
"placement": "CENTER",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 21,
"rightColumn": 36,
"text": "Mi",
"topRow": 34,
"topRow": 6,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "26qk30tfsj",
@@ -1,7 +1,7 @@
{
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 38,
"bottomRow": 10,
"boxShadow": "none",
"buttonColor": "{{appsmith.theme.colors.primaryColor}}",
"buttonVariant": "PRIMARY",
@@ -20,7 +20,7 @@
"isLoading": false,
"isVisible": true,
"key": "on7g9pelq6",
"leftColumn": 21,
"leftColumn": 36,
"minWidth": 120,
"mobileBottomRow": 38,
"mobileLeftColumn": 2,
@@ -30,16 +30,16 @@
"originalBottomRow": 36,
"originalTopRow": 32,
"parentColumnSpace": 8.875,
"parentId": "q44lz1f0e4",
"parentId": "nxgzciev9f",
"parentRowSpace": 10,
"placement": "CENTER",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 28,
"rightColumn": 49,
"text": "Do",
"topRow": 34,
"topRow": 6,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "chvxisz1qb",
@@ -1,7 +1,7 @@
{
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 38,
"bottomRow": 10,
"boxShadow": "none",
"buttonColor": "{{appsmith.theme.colors.primaryColor}}",
"buttonVariant": "PRIMARY",
@@ -20,7 +20,7 @@
"isLoading": false,
"isVisible": true,
"key": "on7g9pelq6",
"leftColumn": 28,
"leftColumn": 49,
"minWidth": 120,
"mobileBottomRow": 38,
"mobileLeftColumn": 2,
@@ -30,16 +30,16 @@
"originalBottomRow": 36,
"originalTopRow": 32,
"parentColumnSpace": 8.875,
"parentId": "q44lz1f0e4",
"parentId": "nxgzciev9f",
"parentRowSpace": 10,
"placement": "CENTER",
"recaptchaType": "V3",
"renderMode": "CANVAS",
"resetFormOnClick": false,
"responsiveBehavior": "hug",
"rightColumn": 35,
"rightColumn": 61,
"text": "Fr",
"topRow": 34,
"topRow": 6,
"type": "BUTTON_WIDGET",
"version": 1,
"widgetId": "nb3yusumzy",
@@ -0,0 +1,100 @@
{
"animateLoading": true,
"backgroundColor": "#FFFFFF",
"borderColor": "#E0DEDE",
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"borderWidth": "1",
"bottomRow": 60,
"boxShadow": "{{appsmith.theme.boxShadow.appBoxShadow}}",
"children": [
{
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 120,
"boxShadow": "{{appsmith.theme.boxShadow.appBoxShadow}}",
"canExtend": false,
"containerStyle": "none",
"detachFromLayout": true,
"dynamicBindingPathList": [
{
"key": "borderRadius"
},
{
"key": "boxShadow"
}
],
"dynamicHeight": "AUTO_HEIGHT",
"flexLayers": [],
"isLoading": false,
"isVisible": true,
"key": "y8l6muyhfx",
"leftColumn": 0,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minHeight": 100,
"minWidth": 450,
"mobileBottomRow": 100,
"mobileLeftColumn": 0,
"mobileRightColumn": 445.44374999999997,
"mobileTopRow": 0,
"needsErrorInfo": false,
"parentColumnSpace": 1,
"parentId": "iky8iz4l6e",
"parentRowSpace": 1,
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 445.44374999999997,
"topRow": 0,
"type": "CANVAS_WIDGET",
"version": 1,
"widgetId": "nxgzciev9f",
"widgetName": "Canvas8"
}
],
"containerStyle": "card",
"dynamicBindingPathList": [
{
"key": "borderRadius"
},
{
"key": "boxShadow"
},
{
"key": "isVisible"
}
],
"dynamicHeight": "AUTO_HEIGHT",
"dynamicPropertyPathList": [
{
"key": "isVisible"
}
],
"dynamicTriggerPathList": [],
"flexVerticalAlignment": "stretch",
"isCanvas": true,
"isLoading": false,
"isVisible": "{{ RecurringCheckbox.isChecked }}",
"key": "tlqlxo30ex",
"leftColumn": 1,
"maxDynamicHeight": 9000,
"minDynamicHeight": 10,
"minWidth": 450,
"mobileBottomRow": 68,
"mobileLeftColumn": 2,
"mobileRightColumn": 26,
"mobileTopRow": 58,
"needsErrorInfo": false,
"originalBottomRow": 60,
"originalTopRow": 48,
"parentColumnSpace": 18.56015625,
"parentId": "q44lz1f0e4",
"parentRowSpace": 10,
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 38,
"shouldScrollContents": true,
"topRow": 48,
"type": "CONTAINER_WIDGET",
"version": 1,
"widgetId": "iky8iz4l6e",
"widgetName": "RecurringContainer"
}
@@ -2,7 +2,7 @@
"accentColor": "{{appsmith.theme.colors.primaryColor}}",
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 34,
"bottomRow": 4,
"boxShadow": "none",
"defaultOptionValue": "Woche",
"dynamicBindingPathList": [
@@ -31,7 +31,7 @@
"labelText": "",
"labelTextSize": "0.875rem",
"labelWidth": 5,
"leftColumn": 28,
"leftColumn": 29,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minWidth": 450,
@@ -45,15 +45,15 @@
"originalBottomRow": 32,
"originalTopRow": 28,
"parentColumnSpace": 8.875,
"parentId": "q44lz1f0e4",
"parentId": "nxgzciev9f",
"parentRowSpace": 10,
"placeholderText": "Woche",
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 43,
"rightColumn": 44,
"serverSideFiltering": false,
"sourceData": "[\n {\n \"name\": \"Tag\",\n \"code\": \"Tag\"\n },\n {\n \"name\": \"Woche\",\n \"code\": \"Woche\"\n },\n {\n \"name\": \"Monat\",\n \"code\": \"Monat\"\n }\n]",
"topRow": 30,
"topRow": 0,
"type": "SELECT_WIDGET",
"version": 1,
"widgetId": "2woyknsibz",
@@ -2,7 +2,7 @@
"accentColor": "{{appsmith.theme.colors.primaryColor}}",
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 34,
"bottomRow": 4,
"boxShadow": "none",
"defaultOptionValue": "1",
"dynamicBindingPathList": [
@@ -45,7 +45,7 @@
"originalBottomRow": 32,
"originalTopRow": 28,
"parentColumnSpace": 8.875,
"parentId": "q44lz1f0e4",
"parentId": "nxgzciev9f",
"parentRowSpace": 10,
"placeholderText": "Select option",
"renderMode": "CANVAS",
@@ -53,7 +53,7 @@
"rightColumn": 28,
"serverSideFiltering": false,
"sourceData": "[\n {\n \"name\": \"1\",\n \"code\": \"1\"\n },\n {\n \"name\": \"2\",\n \"code\": \"2\"\n },\n {\n \"name\": \"3\",\n \"code\": \"3\"\n },\n\t{\n \"name\": \"4\",\n \"code\": \"4\"\n },\n\t{\n \"name\": \"5\",\n \"code\": \"5\"\n },\n\t{\n \"name\": \"6\",\n \"code\": \"6\"\n },\n\t{\n \"name\": \"7\",\n \"code\": \"7\"\n },\n\t{\n \"name\": \"8\",\n \"code\": \"8\"\n },\n\t{\n \"name\": \"9\",\n \"code\": \"9\"\n },\n\t{\n \"name\": \"10\",\n \"code\": \"10\"\n }\n]",
"topRow": 30,
"topRow": 0,
"type": "SELECT_WIDGET",
"version": 1,
"widgetId": "0cpd4km3ko",
@@ -1,59 +0,0 @@
{
"accentColor": "{{appsmith.theme.colors.primaryColor}}",
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 18,
"boxShadow": "none",
"defaultOptionValue": "GREEN",
"dynamicBindingPathList": [
{
"key": "accentColor"
},
{
"key": "borderRadius"
}
],
"dynamicHeight": "FIXED",
"dynamicPropertyPathList": [
{
"key": "sourceData"
}
],
"dynamicTriggerPathList": [],
"isDisabled": false,
"isFilterable": false,
"isLoading": false,
"isRequired": false,
"isVisible": true,
"key": "f8k90o33yd",
"labelAlignment": "left",
"labelPosition": "Top",
"labelText": "Label",
"labelTextSize": "0.875rem",
"labelWidth": 5,
"leftColumn": 25,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minWidth": 450,
"mobileBottomRow": 15,
"mobileLeftColumn": 22,
"mobileRightColumn": 42,
"mobileTopRow": 8,
"needsErrorInfo": false,
"optionLabel": "code",
"optionValue": "value",
"parentColumnSpace": 8.875,
"parentId": "q44lz1f0e4",
"parentRowSpace": 10,
"placeholderText": "Select option",
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 39,
"serverSideFiltering": false,
"sourceData": "[\n { \"value\": \"00:00\", \"code\": \"00:00\" },\n { \"value\": \"00:30\", \"code\": \"00:30\" },\n { \"value\": \"01:00\", \"code\": \"01:00\" },\n { \"value\": \"01:30\", \"code\": \"01:30\" },\n { \"value\": \"02:00\", \"code\": \"02:00\" },\n { \"value\": \"02:30\", \"code\": \"02:30\" },\n { \"value\": \"03:00\", \"code\": \"03:00\" },\n { \"value\": \"03:30\", \"code\": \"03:30\" },\n { \"value\": \"04:00\", \"code\": \"04:00\" },\n { \"value\": \"04:30\", \"code\": \"04:30\" },\n { \"value\": \"05:00\", \"code\": \"05:00\" },\n { \"value\": \"05:30\", \"code\": \"05:30\" },\n { \"value\": \"06:00\", \"code\": \"06:00\" },\n { \"value\": \"06:30\", \"code\": \"06:30\" },\n { \"value\": \"07:00\", \"code\": \"07:00\" },\n { \"value\": \"07:30\", \"code\": \"07:30\" },\n { \"value\": \"08:00\", \"code\": \"08:00\" },\n { \"value\": \"08:30\", \"code\": \"08:30\" },\n { \"value\": \"09:00\", \"code\": \"09:00\" },\n { \"value\": \"09:30\", \"code\": \"09:30\" },\n { \"value\": \"10:00\", \"code\": \"10:00\" },\n { \"value\": \"10:30\", \"code\": \"10:30\" },\n { \"value\": \"11:00\", \"code\": \"11:00\" },\n { \"value\": \"11:30\", \"code\": \"11:30\" },\n { \"value\": \"12:00\", \"code\": \"12:00\" },\n { \"value\": \"12:30\", \"code\": \"12:30\" },\n { \"value\": \"13:00\", \"code\": \"13:00\" },\n { \"value\": \"13:30\", \"code\": \"13:30\" },\n { \"value\": \"14:00\", \"code\": \"14:00\" },\n { \"value\": \"14:30\", \"code\": \"14:30\" },\n { \"value\": \"15:00\", \"code\": \"15:00\" },\n { \"value\": \"15:30\", \"code\": \"15:30\" },\n { \"value\": \"16:00\", \"code\": \"16:00\" },\n { \"value\": \"16:30\", \"code\": \"16:30\" },\n { \"value\": \"17:00\", \"code\": \"17:00\" },\n { \"value\": \"17:30\", \"code\": \"17:30\" },\n { \"value\": \"18:00\", \"code\": \"18:00\" },\n { \"value\": \"18:30\", \"code\": \"18:30\" },\n { \"value\": \"19:00\", \"code\": \"19:00\" },\n { \"value\": \"19:30\", \"code\": \"19:30\" },\n { \"value\": \"20:00\", \"code\": \"20:00\" },\n { \"value\": \"20:30\", \"code\": \"20:30\" },\n { \"value\": \"21:00\", \"code\": \"21:00\" },\n { \"value\": \"21:30\", \"code\": \"21:30\" },\n { \"value\": \"22:00\", \"code\": \"22:00\" },\n { \"value\": \"22:30\", \"code\": \"22:30\" },\n { \"value\": \"23:00\", \"code\": \"23:00\" },\n { \"value\": \"23:30\", \"code\": \"23:30\" }\n]",
"topRow": 11,
"type": "SELECT_WIDGET",
"version": 1,
"widgetId": "u53n2l4s54",
"widgetName": "Select3"
}
@@ -1,59 +0,0 @@
{
"accentColor": "{{appsmith.theme.colors.primaryColor}}",
"animateLoading": true,
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"bottomRow": 18,
"boxShadow": "none",
"defaultOptionValue": "GREEN",
"dynamicBindingPathList": [
{
"key": "accentColor"
},
{
"key": "borderRadius"
}
],
"dynamicHeight": "FIXED",
"dynamicPropertyPathList": [
{
"key": "sourceData"
}
],
"dynamicTriggerPathList": [],
"isDisabled": false,
"isFilterable": false,
"isLoading": false,
"isRequired": false,
"isVisible": true,
"key": "f8k90o33yd",
"labelAlignment": "left",
"labelPosition": "Top",
"labelText": "Label",
"labelTextSize": "0.875rem",
"labelWidth": 5,
"leftColumn": 39,
"maxDynamicHeight": 9000,
"minDynamicHeight": 4,
"minWidth": 450,
"mobileBottomRow": 15,
"mobileLeftColumn": 22,
"mobileRightColumn": 42,
"mobileTopRow": 8,
"needsErrorInfo": false,
"optionLabel": "code",
"optionValue": "value",
"parentColumnSpace": 8.875,
"parentId": "q44lz1f0e4",
"parentRowSpace": 10,
"placeholderText": "Select option",
"renderMode": "CANVAS",
"responsiveBehavior": "fill",
"rightColumn": 53,
"serverSideFiltering": false,
"sourceData": "[\n { \"value\": \"00:00\", \"code\": \"00:00\" },\n { \"value\": \"00:30\", \"code\": \"00:30\" },\n { \"value\": \"01:00\", \"code\": \"01:00\" },\n { \"value\": \"01:30\", \"code\": \"01:30\" },\n { \"value\": \"02:00\", \"code\": \"02:00\" },\n { \"value\": \"02:30\", \"code\": \"02:30\" },\n { \"value\": \"03:00\", \"code\": \"03:00\" },\n { \"value\": \"03:30\", \"code\": \"03:30\" },\n { \"value\": \"04:00\", \"code\": \"04:00\" },\n { \"value\": \"04:30\", \"code\": \"04:30\" },\n { \"value\": \"05:00\", \"code\": \"05:00\" },\n { \"value\": \"05:30\", \"code\": \"05:30\" },\n { \"value\": \"06:00\", \"code\": \"06:00\" },\n { \"value\": \"06:30\", \"code\": \"06:30\" },\n { \"value\": \"07:00\", \"code\": \"07:00\" },\n { \"value\": \"07:30\", \"code\": \"07:30\" },\n { \"value\": \"08:00\", \"code\": \"08:00\" },\n { \"value\": \"08:30\", \"code\": \"08:30\" },\n { \"value\": \"09:00\", \"code\": \"09:00\" },\n { \"value\": \"09:30\", \"code\": \"09:30\" },\n { \"value\": \"10:00\", \"code\": \"10:00\" },\n { \"value\": \"10:30\", \"code\": \"10:30\" },\n { \"value\": \"11:00\", \"code\": \"11:00\" },\n { \"value\": \"11:30\", \"code\": \"11:30\" },\n { \"value\": \"12:00\", \"code\": \"12:00\" },\n { \"value\": \"12:30\", \"code\": \"12:30\" },\n { \"value\": \"13:00\", \"code\": \"13:00\" },\n { \"value\": \"13:30\", \"code\": \"13:30\" },\n { \"value\": \"14:00\", \"code\": \"14:00\" },\n { \"value\": \"14:30\", \"code\": \"14:30\" },\n { \"value\": \"15:00\", \"code\": \"15:00\" },\n { \"value\": \"15:30\", \"code\": \"15:30\" },\n { \"value\": \"16:00\", \"code\": \"16:00\" },\n { \"value\": \"16:30\", \"code\": \"16:30\" },\n { \"value\": \"17:00\", \"code\": \"17:00\" },\n { \"value\": \"17:30\", \"code\": \"17:30\" },\n { \"value\": \"18:00\", \"code\": \"18:00\" },\n { \"value\": \"18:30\", \"code\": \"18:30\" },\n { \"value\": \"19:00\", \"code\": \"19:00\" },\n { \"value\": \"19:30\", \"code\": \"19:30\" },\n { \"value\": \"20:00\", \"code\": \"20:00\" },\n { \"value\": \"20:30\", \"code\": \"20:30\" },\n { \"value\": \"21:00\", \"code\": \"21:00\" },\n { \"value\": \"21:30\", \"code\": \"21:30\" },\n { \"value\": \"22:00\", \"code\": \"22:00\" },\n { \"value\": \"22:30\", \"code\": \"22:30\" },\n { \"value\": \"23:00\", \"code\": \"23:00\" },\n { \"value\": \"23:30\", \"code\": \"23:30\" }\n]",
"topRow": 11,
"type": "SELECT_WIDGET",
"version": 1,
"widgetId": "ffcw6h9yvt",
"widgetName": "Select3Copy"
}
@@ -36,7 +36,7 @@
"responsiveBehavior": "fill",
"rightColumn": 41,
"shouldTruncate": false,
"text": "Neue Temrinbuchung",
"text": "Neue Terminbuchung",
"textAlign": "LEFT",
"textColor": "#231F20",
"topRow": 1,
@@ -1,11 +1,12 @@
{
"backgroundColor": "#FFFFFF",
"bookingSelected": "{{ BookingSelect.openBookingWidget() }}",
"borderColor": "#E0DEDE",
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"borderWidth": "1",
"bottomRow": 69,
"boxShadow": "{{appsmith.theme.boxShadow.appBoxShadow}}",
"defaultModel": "{{\n {\n events: GetBookings.data || [],\n seatId: appsmith.store.selectedSeatId,\n seatName: appsmith.store.selectedSeatName\n }\n}}",
"defaultModel": "{{\n {\n seatId:\n appsmith.store.selectedSeatId || \"\",\n\n seatName:\n appsmith.store.selectedSeatName || \"\",\n\n events:\n GetSeatBookings.data || []\n }\n}}",
"dynamicBindingPathList": [
{
"key": "theme"
@@ -24,15 +25,26 @@
"dynamicPropertyPathList": [
{
"key": "seatSelected"
},
{
"key": "bookingSelected"
}
],
"dynamicTriggerPathList": [
{
"key": "seatSelected"
},
{
"key": "bookingSelected"
},
{
"key": "timeSelected"
}
],
"events": [
"seatSelected"
"seatSelected",
"bookingSelected",
"timeSelected"
],
"isCanvas": false,
"isLoading": false,
@@ -51,20 +63,21 @@
"parentId": "ekq4ry46pv",
"parentRowSpace": 10,
"renderMode": "CANVAS",
"rightColumn": 63,
"seatSelected": "{{\n storeValue(\n \"selectedSeatId\",\n Custom4.model.selectedSeat.id\n )\n .then(() =>\n storeValue(\n \"selectedSeatName\",\n Custom4.model.selectedSeat.name\n )\n )\n .then(() => GetBookings.run())\n .then(() => showModal(SeatCalendar.name))\n}}",
"rightColumn": 64,
"seatSelected": "{{\n storeValue(\n \"selectedSeatId\",\n Custom4.model.selectedSeat.id\n )\n .then(() =>\n storeValue(\n \"selectedSeatName\",\n Custom4.model.selectedSeat.name\n )\n )\n .then(() => CreateBooking.run())\n .then(() => showModal(SeatCalendar.name))\n}}",
"srcDoc": {
"css": "@charset \"UTF-8\";\nhtml,\nbody {\n margin: 0;\n padding: 0;\n width: 100%;\n min-height: 100%;\n font-family: Arial, sans-serif;\n overflow: hidden;\n}\n\n/* Äußerer Custom-Widget-Bereich */\n#calendarWrapper {\n width: 100%;\n min-height: 0;\n box-sizing: border-box;\n padding: 10px;\n background: #ffffff;\n overflow: visible;\n}\n\n/* Kopfbereich */\n#calendarHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 10px;\n padding: 8px 10px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n background: #f9fafb;\n}\n\n#calendarSeatTitle {\n font-size: 15px;\n font-weight: 600;\n color: #374151;\n}\n\n/* Kalender */\n#calendar {\n width: 100%;\n min-height: 0;\n box-sizing: border-box;\n --calendar-selection-color: rgba(\n 11,\n 116,\n 222,\n 0.12\n );\n --fc-highlight-color: rgba(\n 11,\n 116,\n 222,\n 0.12\n );\n --fc-today-bg-color: transparent;\n}\n\n/* Auswahltext */\n#calendarSelection {\n margin-top: 10px;\n padding: 8px 10px;\n border: 1px solid #d1d5db;\n border-radius: 5px;\n background: #f9fafb;\n color: #374151;\n font-size: 13px;\n}\n\n/* FullCalendar-Grundformatierung */\n#calendar .fc {\n width: 100%;\n font-size: 13px;\n --fc-highlight-color: rgba(\n 11,\n 116,\n 222,\n 0.12\n );\n --fc-today-bg-color: transparent;\n}\n\n#calendar .fc .fc-button {\n background: #374151;\n border-color: #374151;\n}\n\n#calendar .fc .fc-button:hover,\n#calendar .fc .fc-button-active {\n background: #111827;\n border-color: #111827;\n}\n\n#calendar .fc .fc-event {\n cursor: pointer;\n}\n\n/*\n * EINHEITLICHE AUSWAHLFARBE\n *\n * Gilt für:\n * - einen Tag\n * - mehrere Tage\n * - einen Timeslot\n *\n * Wichtig: FullCalendar verwendet background.\n */\n#calendar .fc .fc-highlight,\n#calendar .fc .fc-highlight-skeleton,\n#calendar .fc .fc-highlight-skeleton td,\n#calendar .fc .fc-highlight-container,\n#calendar .fc .fc-highlight-container td {\n background: var(--calendar-selection-color) !important;\n background-color: var(--calendar-selection-color) !important;\n opacity: 1 !important;\n border: 0 !important;\n box-shadow: none !important;\n}\n\n/*\n * Tagesansicht:\n * mögliche Auswahlcontainer ebenfalls\n * auf dieselbe Farbe setzen.\n */\n#calendar .fc-timegrid .fc-timegrid-col-bg,\n#calendar .fc-timegrid .fc-timegrid-col-bg-container,\n#calendar .fc-timegrid .fc-timegrid-col-bg-container table,\n#calendar .fc-timegrid .fc-timegrid-col-bg-container td,\n#calendar .fc-timegrid .fc-highlight-skeleton,\n#calendar .fc-timegrid .fc-highlight-container {\n background: transparent !important;\n background-color: transparent !important;\n}\n\n/*\n * Die tatsächliche Auswahlfläche\n * in der Tagesansicht.\n */\n#calendar .fc-timegrid .fc-highlight,\n#calendar .fc-timegrid .fc-highlight-skeleton td,\n#calendar .fc-timegrid .fc-highlight-container td {\n background: var(--calendar-selection-color) !important;\n background-color: var(--calendar-selection-color) !important;\n opacity: 1 !important;\n border: 0 !important;\n box-shadow: none !important;\n}\n\n/*\n * Aktueller Tag in der Monatsansicht:\n * transparenter Hintergrund,\n * nur schmaler roter Rahmen.\n */\n#calendar .fc-daygrid-day.fc-day-today {\n background: transparent !important;\n background-color: transparent !important;\n box-shadow: inset 0 0 0 1px #dc2626 !important;\n}\n\n#calendar .fc-daygrid-day.fc-day-today .fc-daygrid-day-frame {\n background: transparent !important;\n background-color: transparent !important;\n box-shadow: none !important;\n}\n\n/*\n * Kopfzelle des aktuellen Tages\n * ohne Hintergrund und ohne Rahmen.\n */\n#calendar .fc-col-header-cell.fc-day-today {\n background: transparent !important;\n background-color: transparent !important;\n box-shadow: none !important;\n}\n\n/*\n * Tagesansicht:\n * aktueller Tag ohne Hintergrund\n * und ohne roten Rahmen.\n */\n#calendar .fc-timegrid-col.fc-day-today {\n background: transparent !important;\n background-color: transparent !important;\n box-shadow: none !important;\n border: none !important;\n}\n\n#calendar .fc-timegrid-col.fc-day-today .fc-timegrid-col-frame {\n background: transparent !important;\n background-color: transparent !important;\n box-shadow: none !important;\n border: none !important;\n}\n\n/* Wochenenden grau */\n#calendar td.fc-day-sat,\n#calendar td.fc-day-sun,\n#calendar .fc-timegrid-col.fc-day-sat,\n#calendar .fc-timegrid-col.fc-day-sun {\n background-color: #eeeeee !important;\n}\n\n/* Wochenend-Kopfzellen */\n#calendar .fc-col-header-cell.fc-day-sat,\n#calendar .fc-col-header-cell.fc-day-sun {\n background-color: #d6d6d6 !important;\n}\n\n/*\n * Monatsansicht:\n * kein Scrollen innerhalb des Monats.\n */\n#calendar .fc-daygrid .fc-scroller {\n height: auto !important;\n max-height: none !important;\n overflow-y: visible !important;\n overflow-x: visible !important;\n}\nLine truncated
"html": "<div id=\"calendarWrapper\">\n <div id=\"calendarHeader\">\n <div id=\"calendarSeatTitle\">\n Kalender\n </div>\n </div>\n\n <div id=\"calendar\"></div>\n\n <div id=\"calendarSelection\">\n Keine Auswahl\n </div>\n</div>\n\n<link\n rel=\"stylesheet\"\n href=\"https://cdn.jsdelivr.net/npm/[email protected]/index.global.min.css\"\n>\n\n<script\n src=\"https://cdn.jsdelivr.net/npm/[email protected]/index.global.min.js\">\n</script>",
"js": "let calendar = null;\nlet resizeTimer = null;\nconst MONTH_HEIGHT = 620;\nconst MONTH_CONTENT_HEIGHT = 550;\nconst DAY_HEIGHT = 600;\nconst DAY_CONTENT_HEIGHT = 480;\nconst BUSINESS_START_MINUTES = 7 * 60;\nconst BUSINESS_END_MINUTES = 18 * 60;\nconst SLOT_MINUTES = 30;\nfunction getModel() {\n const model = appsmith.model || {};\n if (typeof model === \"string\") {\n try {\n return JSON.parse(model);\n } catch (error) {\n return {};\n }\n }\n return model;\n}\nfunction getEvents() {\n const model = getModel();\n return Array.isArray(model.events) ? model.events : [];\n}\nfunction getSeatName() {\n const model = getModel();\n return model.seatName || model.seatId || \"Kein Platz ausgewählt\";\n}\nfunction updateSeatTitle() {\n const element = document.getElementById(\"calendarSeatTitle\");\n if (!element) {\n return;\n }\n element.textContent = `Kalender für ${getSeatName()}`;\n}\nfunction updateSelectionText(text) {\n const element = document.getElementById(\"calendarSelection\");\n if (!element) {\n return;\n }\n const isDayView = calendar && calendar.view && calendar.view.type === \"timeGridDay\";\n if (isDayView) {\n element.textContent = \"\";\n element.style.display = \"none\";\n return;\n }\n element.style.display = \"block\";\n element.textContent = text;\n}\nfunction updateCalendarViewSettings(viewType) {\n if (!calendar) {\n return;\n }\n const isDayView = viewType === \"timeGridDay\";\n calendar.setOption(\"height\", isDayView ? DAY_HEIGHT : MONTH_HEIGHT);\n calendar.setOption(\"contentHeight\", isDayView ? DAY_CONTENT_HEIGHT : MONTH_CONTENT_HEIGHT);\n calendar.setOption(\"expandRows\", !isDayView);\n if (typeof calendar.updateSize === \"function\") {\n calendar.updateSize();\n }\n}\nfunction scheduleResize() {\n window.clearTimeout(resizeTimer);\n resizeTimer = window.setTimeout(() => {\n if (calendar) {\n calendar.updateSize();\n }\n }, 250);\n}\nfunction isWeekend(date) {\n const day = date.getDay();\n return day === 0 || day === 6;\n}\nfunction isBusinessDay(date) {\n const day = date.getDay();\n return day >= 1 && day <= 5;\n}\nfunction getMinutesOfDay(date) {\n return date.getHours() * 60 + date.getMinutes();\n}\nfunction isBusinessTimeRange(start, end) {\n if (!start || !end) {\n return false;\n }\n if (!isBusinessDay(start)) {\n return false;\n }\n if (start.toDateString() !== end.toDateString()) {\n return false;\n }\n const startMinutes = getMinutesOfDay(start);\n const endMinutes = getMinutesOfDay(end);\n return startMinutes >= BUSINESS_START_MINUTES && endMinutes <= BUSINESS_END_MINUTES && endMinutes > startMinutes;\n}\nfunction isBusinessDayRange(start, end) {\n if (!start || !end) {\n return false;\n }\n const lastSelectedDay = new Date(end.getTime() - 1);\n const current = new Date(start);\n current.setHours(12, 0, 0, 0);\n lastSelectedDay.setHours(12, 0, 0, 0);\n while (current <= lastSelectedDay) {\n if (!isBusinessDay(current)) {\n return false;\n }\n current.setDate(current.getDate() + 1);\n }\n return true;\n}\nfunction showWeekendMessage() {\n updateSelectionText(\"Samstag und Sonntag sind nicht buchbar.\");\n}\nfunction showBusinessHoursMessage() {\n updateSelectionText(\"Reservierungen sind Montag bis Freitag von 07:00 bis 18:00 Uhr möglich.\");\n}\nfunction openDayView(date) {\n if (!calendar) {\n return;\n }\n if (isWeekend(date)) {\n showWeekendMessage();\n return;\n }\n calendar.changeView(\"timeGridDay\", date);\n}\nfunction isDayNumberClick(info) {\n const target = info.jsEvent && info.jsEvent.target;\n if (!target || typeof target.closest !== \"function\") {\n return false;\n }\n return Boolean(target.closest(\".fc-daygrid-day-number\"));\n}\nfunction roundToHalfHour(date) {\n const result = new Date(date);\n const minutes = result.getMinutes();\n result.setSeconds(0, 0);\n result.setMinutes(minutes < 30 ? 0 : 30);\n return result;\n}\nfunction pad(value) {\n return String(value).padStart(2, \"0\");\n}\n\n/*\n * Lokales Datum ohne UTC-Verschiebung.\n * Beispiel: 17.08.2026\n */\nfunction formatLocalDate(date) {\n return [date.getFullYear(), pad(date.getMonth() + 1), pad(date.getDate())].join(\"-\");\n}\n\n/*\n * Lokale Uhrzeit ohne UTC-Verschiebung.\n * Beispiel: 09:00:00\n */\nfunction formatLocalTime(date) {\n return [pad(date.getHours()), pad(date.getMinutes()), pad(date.getSeconds())].join(\":\");\n}\n\n/*\n * Lokaler ISO-ähnlicher Wert ohne Z.\n * Beispiel: 2026-08-17T09:00:00\n *\n * Wichtig:\n * Nicht toISOString() verwenden.\n */\nfunction formatLocalDateTime(date) {\n return `${formatLocalDate(date)}T` + `${formatLocalTime(date)}`;\n}\nfunction formatDateTime(date) {\n if (!date) {\n return \"\";\n }\n return new Intl.DateTimeFormat(\"de-DE\", {\n dateStyle: \"short\",\n timeStyle: \"short\"\n }).format(date);\n}\nfunction saveCalendarSelection(type, start, end) {\n coLine truncated
"js": "let calendar = null;\nlet resizeTimer = null;\nlet modelChangeRegistered = false;\nlet resizeRegistered = false;\nconst MONTH_HEIGHT = 620;\nconst MONTH_CONTENT_HEIGHT = 550;\nconst DAY_HEIGHT = 600;\nconst DAY_CONTENT_HEIGHT = 480;\nconst BUSINESS_START_MINUTES = 7 * 60;\nconst BUSINESS_END_MINUTES = 18 * 60;\nconst SLOT_MINUTES = 30;\nfunction getModel() {\n const model = appsmith.model || {};\n if (typeof model === \"string\") {\n try {\n return JSON.parse(model);\n } catch (error) {\n return {};\n }\n }\n return model;\n}\nfunction getEvents() {\n const model = getModel();\n return Array.isArray(model.events) ? model.events : [];\n}\nfunction getSeatName() {\n const model = getModel();\n return model.seatName || model.seatId || \"Kein Platz ausgewählt\";\n}\nfunction updateSeatTitle() {\n const element = document.getElementById(\"calendarSeatTitle\");\n if (!element) {\n return;\n }\n element.textContent = `Kalender für ${getSeatName()}`;\n}\nfunction isDayView() {\n return Boolean(calendar && calendar.view && calendar.view.type === \"timeGridDay\");\n}\nfunction updateSelectionText(text) {\n const element = document.getElementById(\"calendarSelection\");\n if (!element) {\n return;\n }\n if (isDayView()) {\n element.textContent = \"\";\n element.style.display = \"none\";\n return;\n }\n element.style.display = \"block\";\n element.textContent = text;\n}\nfunction updateCalendarViewSettings(viewType) {\n if (!calendar) {\n return;\n }\n const dayView = viewType === \"timeGridDay\";\n calendar.setOption(\"height\", dayView ? DAY_HEIGHT : MONTH_HEIGHT);\n calendar.setOption(\"contentHeight\", dayView ? DAY_CONTENT_HEIGHT : MONTH_CONTENT_HEIGHT);\n calendar.setOption(\"expandRows\", !dayView);\n if (typeof calendar.updateSize === \"function\") {\n calendar.updateSize();\n }\n}\nfunction scheduleResize() {\n window.clearTimeout(resizeTimer);\n resizeTimer = window.setTimeout(() => {\n if (calendar) {\n calendar.updateSize();\n }\n }, 250);\n}\nfunction isWeekend(date) {\n const day = date.getDay();\n return day === 0 || day === 6;\n}\nfunction isBusinessDay(date) {\n const day = date.getDay();\n return day >= 1 && day <= 5;\n}\nfunction getMinutesOfDay(date) {\n return date.getHours() * 60 + date.getMinutes();\n}\nfunction isBusinessTimeRange(start, end) {\n if (!start || !end) {\n return false;\n }\n if (!isBusinessDay(start)) {\n return false;\n }\n if (start.toDateString() !== end.toDateString()) {\n return false;\n }\n const startMinutes = getMinutesOfDay(start);\n const endMinutes = getMinutesOfDay(end);\n return startMinutes >= BUSINESS_START_MINUTES && endMinutes <= BUSINESS_END_MINUTES && endMinutes > startMinutes;\n}\nfunction isBusinessDayRange(start, end) {\n if (!start || !end || end <= start) {\n return false;\n }\n const lastSelectedDay = new Date(end.getTime() - 1);\n const current = new Date(start);\n current.setHours(12, 0, 0, 0);\n lastSelectedDay.setHours(12, 0, 0, 0);\n while (current <= lastSelectedDay) {\n if (!isBusinessDay(current)) {\n return false;\n }\n current.setDate(current.getDate() + 1);\n }\n return true;\n}\nfunction showWeekendMessage() {\n updateSelectionText(\"Samstag und Sonntag sind nicht buchbar.\");\n}\nfunction showBusinessHoursMessage() {\n updateSelectionText(\"Reservierungen sind Montag bis Freitag von 07:00 bis 18:00 Uhr möglich.\");\n}\nfunction openDayView(date) {\n if (!calendar) {\n return;\n }\n if (isWeekend(date)) {\n showWeekendMessage();\n return;\n }\n calendar.changeView(\"timeGridDay\", date);\n}\nfunction isDayNumberClick(info) {\n const target = info.jsEvent && info.jsEvent.target;\n if (!target || typeof target.closest !== \"function\") {\n return false;\n }\n return Boolean(target.closest(\".fc-daygrid-day-number\"));\n}\nfunction roundToHalfHour(date) {\n const result = new Date(date);\n const minutes = result.getMinutes();\n result.setSeconds(0, 0);\n result.setMinutes(minutes < 30 ? 0 : 30);\n return result;\n}\nfunction pad(value) {\n return String(value).padStart(2, \"0\");\n}\nfunction formatLocalDate(date) {\n return [date.getFullYear(), pad(date.getMonth() + 1), pad(date.getDate())].join(\"-\");\n}\nfunction formatLocalTime(date) {\n return [pad(date.getHours()), pad(date.getMinutes()), pad(date.getSeconds())].join(\":\");\n}\nfunction formatLocalDateTime(date) {\n return `${formatLocalDate(date)}T${formatLocalTime(date)}`;\n}\nfunction formatDateTime(date) {\n if (!date) {\n return \"\";\n }\n return new Intl.DateTimeFormat(\"de-DE\", {\n dateStyle: \"short\",\n timeStyle: \"short\"\n }).format(date);\n}\nfunction triggerAppsmithEvent(eventName) {\n try {\n appsmith.triggerEvent(eventName);\n } catch (error) {\n console.warn(`Event ${eventName} ist nicht konfiguriert.`, error);\n }\n}\nfunction saveCalendarSelection(type, start, end) {\n ifLine truncated
},
"theme": "{{appsmith.theme}}",
"timeSelected": "{{showModal(Platzbuchung.name);}}",
"topRow": 0,
"type": "CUSTOM_WIDGET",
"uncompiledSrcDoc": {
"css": "html,\nbody {\n margin: 0;\n padding: 0;\n width: 100%;\n min-height: 100%;\n font-family: Arial, sans-serif;\n overflow: hidden;\n}\n\n/* Äußerer Custom-Widget-Bereich */\n\n#calendarWrapper {\n width: 100%;\n min-height: 0;\n box-sizing: border-box;\n padding: 10px;\n background: #ffffff;\n overflow: visible;\n}\n\n/* Kopfbereich */\n\n#calendarHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 10px;\n padding: 8px 10px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n background: #f9fafb;\n}\n\n#calendarSeatTitle {\n font-size: 15px;\n font-weight: 600;\n color: #374151;\n}\n\n/* Kalender */\n\n#calendar {\n width: 100%;\n min-height: 0;\n box-sizing: border-box;\n\n --calendar-selection-color: rgba(\n 11,\n 116,\n 222,\n 0.12\n );\n\n --fc-highlight-color: rgba(\n 11,\n 116,\n 222,\n 0.12\n );\n\n --fc-today-bg-color: transparent;\n}\n\n/* Auswahltext */\n\n#calendarSelection {\n margin-top: 10px;\n padding: 8px 10px;\n border: 1px solid #d1d5db;\n border-radius: 5px;\n background: #f9fafb;\n color: #374151;\n font-size: 13px;\n}\n\n/* FullCalendar-Grundformatierung */\n\n#calendar .fc {\n width: 100%;\n font-size: 13px;\n\n --fc-highlight-color: rgba(\n 11,\n 116,\n 222,\n 0.12\n );\n\n --fc-today-bg-color: transparent;\n}\n\n#calendar .fc .fc-button {\n background: #374151;\n border-color: #374151;\n}\n\n#calendar .fc .fc-button:hover,\n#calendar .fc .fc-button-active {\n background: #111827;\n border-color: #111827;\n}\n\n#calendar .fc .fc-event {\n cursor: pointer;\n}\n\n/*\n * EINHEITLICHE AUSWAHLFARBE\n *\n * Gilt für:\n * - einen Tag\n * - mehrere Tage\n * - einen Timeslot\n *\n * Wichtig: FullCalendar verwendet background.\n */\n#calendar .fc .fc-highlight,\n#calendar .fc .fc-highlight-skeleton,\n#calendar .fc .fc-highlight-skeleton td,\n#calendar .fc .fc-highlight-container,\n#calendar .fc .fc-highlight-container td {\n background: var(\n --calendar-selection-color\n ) !important;\n\n background-color: var(\n --calendar-selection-color\n ) !important;\n\n opacity: 1 !important;\n border: 0 !important;\n box-shadow: none !important;\n}\n\n/*\n * Tagesansicht:\n * mögliche Auswahlcontainer ebenfalls\n * auf dieselbe Farbe setzen.\n */\n#calendar .fc-timegrid .fc-timegrid-col-bg,\n#calendar .fc-timegrid .fc-timegrid-col-bg-container,\n#calendar .fc-timegrid .fc-timegrid-col-bg-container table,\n#calendar .fc-timegrid .fc-timegrid-col-bg-container td,\n#calendar .fc-timegrid .fc-highlight-skeleton,\n#calendar .fc-timegrid .fc-highlight-container {\n background: transparent !important;\n background-color: transparent !important;\n}\n\n/*\n * Die tatsächliche Auswahlfläche\n * in der Tagesansicht.\n */\n#calendar .fc-timegrid .fc-highlight,\n#calendar .fc-timegrid .fc-highlight-skeleton td,\n#calendar .fc-timegrid .fc-highlight-container td {\n background: var(\n --calendar-selection-color\n ) !important;\n\n background-color: var(\n --calendar-selection-color\n ) !important;\n\n opacity: 1 !important;\n border: 0 !important;\n box-shadow: none !important;\n}\n\n/*\n * Aktueller Tag in der Monatsansicht:\n * transparenter Hintergrund,\n * nur schmaler roter Rahmen.\n */\n#calendar .fc-daygrid-day.fc-day-today {\n background: transparent !important;\n background-color: transparent !important;\n box-shadow: inset 0 0 0 1px #dc2626 !important;\n}\n\n#calendar\n .fc-daygrid-day.fc-day-today\n .fc-daygrid-day-frame {\n background: transparent !important;\n background-color: transparent !important;\n box-shadow: none !important;\n}\n\n/*\n * Kopfzelle des aktuellen Tages\n * ohne Hintergrund und ohne Rahmen.\n */\n#calendar .fc-col-header-cell.fc-day-today {\n background: transparent !important;\n background-color: transparent !important;\n box-shadow: none !important;\n}\n\n/*\n * Tagesansicht:\n * aktueller Tag ohne Hintergrund\n * und ohne roten Rahmen.\n */\n#calendar .fc-timegrid-col.fc-day-today {\n background: transparent !important;\n background-color: transparent !important;\n box-shadow: none !important;\n border: none !important;\n}\n\n#calendar\n .fc-timegrid-col.fc-day-today\n .fc-timegrid-col-frame {\n background: transparent !important;\n background-color: transparent !important;\n box-shadow: none !important;\n border: none !important;\n}\n\n/* Wochenenden grau */\n\n#calendar td.fc-day-sat,\n#calendar td.fc-day-sun,\n#calendar .fc-timegrid-col.fc-day-sat,\n#calendar .fc-timegrid-col.fc-day-sun {\n background-color: #eeeeee !important;\n}\n\n/* Wochenend-Kopfzellen */\n\n#calendar .fc-col-header-cell.fc-day-sat,\n#calendar .fc-col-header-cell.fc-day-sun {\n background-color: #d6d6d6 !important;\n}\n\n/*\n * Monatsansicht:\n * kein Scrollen innerhalb des Monats.\n */\n#calendar .fc-daygrid .fc-scroller {\n height: auto !important;\n max-height: none !important;\n overflowLine truncated
"html": "<div id=\"calendarWrapper\">\n <div id=\"calendarHeader\">\n <div id=\"calendarSeatTitle\">\n Kalender\n </div>\n </div>\n\n <div id=\"calendar\"></div>\n\n <div id=\"calendarSelection\">\n Keine Auswahl\n </div>\n</div>\n\n<link\n rel=\"stylesheet\"\n href=\"https://cdn.jsdelivr.net/npm/[email protected]/index.global.min.css\"\n>\n\n<script\n src=\"https://cdn.jsdelivr.net/npm/[email protected]/index.global.min.js\">\n</script>",
"js": "let calendar = null;\nlet resizeTimer = null;\n\nconst MONTH_HEIGHT = 620;\nconst MONTH_CONTENT_HEIGHT = 550;\n\nconst DAY_HEIGHT = 600;\nconst DAY_CONTENT_HEIGHT = 480;\n\nconst BUSINESS_START_MINUTES = 7 * 60;\nconst BUSINESS_END_MINUTES = 18 * 60;\n\nconst SLOT_MINUTES = 30;\n\nfunction getModel() {\n const model = appsmith.model || {};\n\n if (typeof model === \"string\") {\n try {\n return JSON.parse(model);\n } catch (error) {\n return {};\n }\n }\n\n return model;\n}\n\nfunction getEvents() {\n const model = getModel();\n\n return Array.isArray(model.events)\n ? model.events\n : [];\n}\n\nfunction getSeatName() {\n const model = getModel();\n\n return (\n model.seatName ||\n model.seatId ||\n \"Kein Platz ausgewählt\"\n );\n}\n\nfunction updateSeatTitle() {\n const element =\n document.getElementById(\n \"calendarSeatTitle\"\n );\n\n if (!element) {\n return;\n }\n\n element.textContent =\n `Kalender für ${getSeatName()}`;\n}\n\nfunction updateSelectionText(text) {\n const element =\n document.getElementById(\n \"calendarSelection\"\n );\n\n if (!element) {\n return;\n }\n\n const isDayView =\n calendar &&\n calendar.view &&\n calendar.view.type ===\n \"timeGridDay\";\n\n if (isDayView) {\n element.textContent = \"\";\n element.style.display = \"none\";\n return;\n }\n\n element.style.display = \"block\";\n element.textContent = text;\n}\n\nfunction updateCalendarViewSettings(viewType) {\n if (!calendar) {\n return;\n }\n\n const isDayView =\n viewType === \"timeGridDay\";\n\n calendar.setOption(\n \"height\",\n isDayView\n ? DAY_HEIGHT\n : MONTH_HEIGHT\n );\n\n calendar.setOption(\n \"contentHeight\",\n isDayView\n ? DAY_CONTENT_HEIGHT\n : MONTH_CONTENT_HEIGHT\n );\n\n calendar.setOption(\n \"expandRows\",\n !isDayView\n );\n\n if (\n typeof calendar.updateSize ===\n \"function\"\n ) {\n calendar.updateSize();\n }\n}\n\nfunction scheduleResize() {\n window.clearTimeout(\n resizeTimer\n );\n\n resizeTimer =\n window.setTimeout(() => {\n if (calendar) {\n calendar.updateSize();\n }\n }, 250);\n}\n\nfunction isWeekend(date) {\n const day =\n date.getDay();\n\n return (\n day === 0 ||\n day === 6\n );\n}\n\nfunction isBusinessDay(date) {\n const day =\n date.getDay();\n\n return (\n day >= 1 &&\n day <= 5\n );\n}\n\nfunction getMinutesOfDay(date) {\n return (\n date.getHours() * 60 +\n date.getMinutes()\n );\n}\n\nfunction isBusinessTimeRange(\n start,\n end\n) {\n if (!start || !end) {\n return false;\n }\n\n if (!isBusinessDay(start)) {\n return false;\n }\n\n if (\n start.toDateString() !==\n end.toDateString()\n ) {\n return false;\n }\n\n const startMinutes =\n getMinutesOfDay(start);\n\n const endMinutes =\n getMinutesOfDay(end);\n\n return (\n startMinutes >=\n BUSINESS_START_MINUTES &&\n endMinutes <=\n BUSINESS_END_MINUTES &&\n endMinutes > startMinutes\n );\n}\n\nfunction isBusinessDayRange(\n start,\n end\n) {\n if (!start || !end) {\n return false;\n }\n\n const lastSelectedDay =\n new Date(\n end.getTime() - 1\n );\n\n const current =\n new Date(start);\n\n current.setHours(\n 12,\n 0,\n 0,\n 0\n );\n\n lastSelectedDay.setHours(\n 12,\n 0,\n 0,\n 0\n );\n\n while (\n current <=\n lastSelectedDay\n ) {\n if (!isBusinessDay(current)) {\n return false;\n }\n\n current.setDate(\n current.getDate() + 1\n );\n }\n\n return true;\n}\n\nfunction showWeekendMessage() {\n updateSelectionText(\n \"Samstag und Sonntag sind nicht buchbar.\"\n );\n}\n\nfunction showBusinessHoursMessage() {\n updateSelectionText(\n \"Reservierungen sind Montag bis Freitag von 07:00 bis 18:00 Uhr möglich.\"\n );\n}\n\nfunction openDayView(date) {\n if (!calendar) {\n return;\n }\n\n if (isWeekend(date)) {\n showWeekendMessage();\n return;\n }\n\n calendar.changeView(\n \"timeGridDay\",\n date\n );\n}\n\nfunction isDayNumberClick(info) {\n const target =\n info.jsEvent &&\n info.jsEvent.target;\n\n if (\n !target ||\n typeof target.closest !==\n \"function\"\n ) {\n return false;\n }\n\n return Boolean(\n target.closest(\n \".fc-daygrid-day-number\"\n )\n );\n}\n\nfunction roundToHalfHour(date) {\n const result =\n new Date(date);\n\n const minutes =\n result.getMinutes();\n\n result.setSeconds(\n 0,\n 0\n );\n\n result.setMinutes(\n minutes < 30\n ? 0\n : 30\n );\n\n return result;\n}\n\nfunction pad(value) {\n return String(value).padStart(\n 2,\n \"0\"\n );\n}\n\n/*\n * Lokales Datum ohne UTC-Verschiebung.\n * Beispiel: 17.08.2026\n */\nfunction formatLocalDate(date) {\n return [\n date.getFullYear(),\n pad(date.getMonth() + 1),\Line truncated
"js": "let calendar = null;\nlet resizeTimer = null;\nlet modelChangeRegistered = false;\nlet resizeRegistered = false;\n\nconst MONTH_HEIGHT = 620;\nconst MONTH_CONTENT_HEIGHT = 550;\n\nconst DAY_HEIGHT = 600;\nconst DAY_CONTENT_HEIGHT = 480;\n\nconst BUSINESS_START_MINUTES = 7 * 60;\nconst BUSINESS_END_MINUTES = 18 * 60;\nconst SLOT_MINUTES = 30;\n\nfunction getModel() {\n const model = appsmith.model || {};\n\n if (typeof model === \"string\") {\n try {\n return JSON.parse(model);\n } catch (error) {\n return {};\n }\n }\n\n return model;\n}\n\nfunction getEvents() {\n const model = getModel();\n return Array.isArray(model.events) ? model.events : [];\n}\n\nfunction getSeatName() {\n const model = getModel();\n return model.seatName || model.seatId || \"Kein Platz ausgewählt\";\n}\n\nfunction updateSeatTitle() {\n const element = document.getElementById(\"calendarSeatTitle\");\n\n if (!element) {\n return;\n }\n\n element.textContent = `Kalender für ${getSeatName()}`;\n}\n\nfunction isDayView() {\n return Boolean(\n calendar &&\n calendar.view &&\n calendar.view.type === \"timeGridDay\"\n );\n}\n\nfunction updateSelectionText(text) {\n const element = document.getElementById(\"calendarSelection\");\n\n if (!element) {\n return;\n }\n\n if (isDayView()) {\n element.textContent = \"\";\n element.style.display = \"none\";\n return;\n }\n\n element.style.display = \"block\";\n element.textContent = text;\n}\n\nfunction updateCalendarViewSettings(viewType) {\n if (!calendar) {\n return;\n }\n\n const dayView = viewType === \"timeGridDay\";\n\n calendar.setOption(\"height\", dayView ? DAY_HEIGHT : MONTH_HEIGHT);\n calendar.setOption(\n \"contentHeight\",\n dayView ? DAY_CONTENT_HEIGHT : MONTH_CONTENT_HEIGHT\n );\n calendar.setOption(\"expandRows\", !dayView);\n\n if (typeof calendar.updateSize === \"function\") {\n calendar.updateSize();\n }\n}\n\nfunction scheduleResize() {\n window.clearTimeout(resizeTimer);\n\n resizeTimer = window.setTimeout(() => {\n if (calendar) {\n calendar.updateSize();\n }\n }, 250);\n}\n\nfunction isWeekend(date) {\n const day = date.getDay();\n return day === 0 || day === 6;\n}\n\nfunction isBusinessDay(date) {\n const day = date.getDay();\n return day >= 1 && day <= 5;\n}\n\nfunction getMinutesOfDay(date) {\n return date.getHours() * 60 + date.getMinutes();\n}\n\nfunction isBusinessTimeRange(start, end) {\n if (!start || !end) {\n return false;\n }\n\n if (!isBusinessDay(start)) {\n return false;\n }\n\n if (start.toDateString() !== end.toDateString()) {\n return false;\n }\n\n const startMinutes = getMinutesOfDay(start);\n const endMinutes = getMinutesOfDay(end);\n\n return (\n startMinutes >= BUSINESS_START_MINUTES &&\n endMinutes <= BUSINESS_END_MINUTES &&\n endMinutes > startMinutes\n );\n}\n\nfunction isBusinessDayRange(start, end) {\n if (!start || !end || end <= start) {\n return false;\n }\n\n const lastSelectedDay = new Date(end.getTime() - 1);\n const current = new Date(start);\n\n current.setHours(12, 0, 0, 0);\n lastSelectedDay.setHours(12, 0, 0, 0);\n\n while (current <= lastSelectedDay) {\n if (!isBusinessDay(current)) {\n return false;\n }\n\n current.setDate(current.getDate() + 1);\n }\n\n return true;\n}\n\nfunction showWeekendMessage() {\n updateSelectionText(\"Samstag und Sonntag sind nicht buchbar.\");\n}\n\nfunction showBusinessHoursMessage() {\n updateSelectionText(\n \"Reservierungen sind Montag bis Freitag von 07:00 bis 18:00 Uhr möglich.\"\n );\n}\n\nfunction openDayView(date) {\n if (!calendar) {\n return;\n }\n\n if (isWeekend(date)) {\n showWeekendMessage();\n return;\n }\n\n calendar.changeView(\"timeGridDay\", date);\n}\n\nfunction isDayNumberClick(info) {\n const target = info.jsEvent && info.jsEvent.target;\n\n if (!target || typeof target.closest !== \"function\") {\n return false;\n }\n\n return Boolean(target.closest(\".fc-daygrid-day-number\"));\n}\n\nfunction roundToHalfHour(date) {\n const result = new Date(date);\n const minutes = result.getMinutes();\n\n result.setSeconds(0, 0);\n result.setMinutes(minutes < 30 ? 0 : 30);\n\n return result;\n}\n\nfunction pad(value) {\n return String(value).padStart(2, \"0\");\n}\n\nfunction formatLocalDate(date) {\n return [\n date.getFullYear(),\n pad(date.getMonth() + 1),\n pad(date.getDate())\n ].join(\"-\");\n}\n\nfunction formatLocalTime(date) {\n return [\n pad(date.getHours()),\n pad(date.getMinutes()),\n pad(date.getSeconds())\n ].join(\":\");\n}\n\nfunction formatLocalDateTime(date) {\n return `${formatLocalDate(date)}T${formatLocalTime(date)}`;\n}\n\nfunction formatDateTime(date) {\n if (!date) {\n return \"\";\n }\n\n return new Intl.DateTimeFormat(\"de-DE\", {\n dateStyle: \"short\",\n timeStyle: \"short\"\n }).format(date);\n}\n\nfunction triggerAppsmithEvent(evenLine truncated
},
"version": 1,
"widgetId": "ad7fob2vs9",