From ab75fa9de6bdb30a264e535a8d76a74e64267e15 Mon Sep 17 00:00:00 2001 From: adisposkofh Date: Mon, 6 Jul 2026 12:58:19 +0200 Subject: [PATCH] formatting freebusy types --- .../api/frontend/v1/coodle/FreeBusy.php | 26 ++-- .../models/person/Freebusytyp_model.php | 5 + .../Cis/Coodle/Components/CoodleFreeBusy.js | 122 +++++++++--------- .../CoodleFreeBusyTableFormRow.js | 10 +- public/js/components/Cis/Coodle/Coodle.js | 18 ++- 5 files changed, 99 insertions(+), 82 deletions(-) diff --git a/application/controllers/api/frontend/v1/coodle/FreeBusy.php b/application/controllers/api/frontend/v1/coodle/FreeBusy.php index 2458dc0b6..6a68c3585 100644 --- a/application/controllers/api/frontend/v1/coodle/FreeBusy.php +++ b/application/controllers/api/frontend/v1/coodle/FreeBusy.php @@ -44,13 +44,9 @@ class FreeBusy extends FHCAPI_Controller public function getFreeBusyTypes() { - $freeBusyTypesResult = $this->FreeBusyTypeModel->getAllFreeBusyTypes(); + $freeBusyTypesResult = $this->FreeBusyTypeModel->getActiveFreeBusyTypes(); $freeBusyTypes = $this->getDataOrTerminateWithError($freeBusyTypesResult); - // todo: are we using all types? are we changing base urls? are we changing tables? - // tentatively filtering out most types, leaving only sogo and other - $freeBusyTypes = array_values(array_filter($freeBusyTypes, function ($freeBusyType) { - return in_array($freeBusyType->freebusytyp_kurzbz, ["Sonstiges", "SoGo"]); - })); + $freeBusyTypes = $this->formatDefaultUrlsInFreeBusyTypes($freeBusyTypes); $this->terminateWithSuccess($freeBusyTypes); } @@ -66,7 +62,6 @@ class FreeBusy extends FHCAPI_Controller public function createFreeBusyEntry() { $description = $this->input->post("description"); - // todo: check if defaulting to other is fine $type = $this->input->post("type") ?? "Sonstiges"; $url = $this->input->post("url"); $isActive = $this->input->post("isActive"); @@ -93,7 +88,6 @@ class FreeBusy extends FHCAPI_Controller { $id = $this->input->post("id"); $description = $this->input->post("description"); - // todo: check if defaulting to other is fine $type = $this->input->post("type") ?? "Sonstiges"; $url = $this->input->post("url"); $isActive = $this->input->post("isActive"); @@ -146,4 +140,20 @@ class FreeBusy extends FHCAPI_Controller { return !!@fopen($url, "r"); } + + private function formatDefaultUrlsInFreeBusyTypes($freeBusyTypes) + { + $uid = getAuthUID(); + return array_map(function ($freeBusyType) use ($uid) { + if (!$freeBusyType->url_vorlage || !strlen($freeBusyType->url_vorlage)) { + $freeBusyType->url_default = null; + unset($freeBusyType->url_vorlage); + return $freeBusyType; + } + + $freeBusyType->url_default = str_replace('$uid', $uid, $freeBusyType->url_vorlage); + unset($freeBusyType->url_vorlage); + return $freeBusyType; + }, $freeBusyTypes); + } } diff --git a/application/models/person/Freebusytyp_model.php b/application/models/person/Freebusytyp_model.php index edbb903c6..e5164657c 100644 --- a/application/models/person/Freebusytyp_model.php +++ b/application/models/person/Freebusytyp_model.php @@ -16,4 +16,9 @@ class Freebusytyp_model extends DB_Model { return $this->execReadOnlyQuery("SELECT * FROM " . $this->dbTable); } + + public function getActiveFreeBusyTypes() + { + return $this->execReadOnlyQuery("SELECT * FROM " . $this->dbTable . " WHERE is_active"); + } } diff --git a/public/js/components/Cis/Coodle/Components/CoodleFreeBusy.js b/public/js/components/Cis/Coodle/Components/CoodleFreeBusy.js index ab0cb2dd8..7092bc3d5 100644 --- a/public/js/components/Cis/Coodle/Components/CoodleFreeBusy.js +++ b/public/js/components/Cis/Coodle/Components/CoodleFreeBusy.js @@ -24,12 +24,12 @@ export default { externalSchedules: [], scheduleEditIndex: null, scheduleFormData: null, - scheduleTypeOptions: [], + scheduleTypes: [], }; }, methods: { getScheduleTypeText(value) { - let type = this.scheduleTypeOptions.find( + let type = this.scheduleTypes.find( (type) => type.value === value, ); return type?.text ?? "Other"; @@ -95,11 +95,12 @@ export default { const freeBusyTypesResponse = await this.$api.call( FreeBusyApi.getFreeBusyTypes(), ); - this.scheduleTypeOptions = freeBusyTypesResponse.data.map( + this.scheduleTypes = freeBusyTypesResponse.data.map( (type) => { return { value: type.freebusytyp_kurzbz, text: type.bezeichnung, + urlDefault: type.url_default, }; }, ); @@ -110,19 +111,10 @@ export default { ); this.externalSchedules = freeBusyEntriesResponse.data.map( (freeBusySchedule) => { - // todo: remove type defaulting if switch to using all types - let type = this.scheduleTypeOptions.find((type) => { - return ( - type.value === freeBusySchedule.freebusytyp_kurzbz - ); - }) - ? freeBusySchedule.freebusytyp_kurzbz - : "Sonstiges"; - return { id: freeBusySchedule.freebusy_id, description: freeBusySchedule.bezeichnung, - type, + type: freeBusySchedule.freebusytyp_kurzbz, url: freeBusySchedule.url, isActive: freeBusySchedule.aktiv, }; @@ -152,34 +144,56 @@ export default { {{ "To effectively use FreeBusy, you must carefully enter and update your calendar data. Your base schedule and planned absences will be displayed by default, but you can add additional schedules (Google, SOGo, etc)." }} - - - - - - - - - - - - - - - - - - - - -
{{ "Description" }}{{ "Type" }}{{ "URL" }}{{ "Active" }}{{ "Actions" }}
{{ defaultSchedule.description }}{{ defaultSchedule.type }}{{ "Yes" }}
-
-
- -
-
-
+ + diff --git a/public/js/components/Cis/Coodle/Components/CoodleFreeBusy/CoodleFreeBusyTableFormRow.js b/public/js/components/Cis/Coodle/Components/CoodleFreeBusy/CoodleFreeBusyTableFormRow.js index 17bd0b447..1683f477d 100644 --- a/public/js/components/Cis/Coodle/Components/CoodleFreeBusy/CoodleFreeBusyTableFormRow.js +++ b/public/js/components/Cis/Coodle/Components/CoodleFreeBusy/CoodleFreeBusyTableFormRow.js @@ -2,7 +2,7 @@ export default { name: "CoodleFreeBusyTableFormRow", props: { scheduleFormDataModelValue: Object, - scheduleTypeOptions: Array, + scheduleTypes: Array, uid: Number | null, }, emits: ["update:scheduleFormDataModelValue", "submitForm", "cancelForm"], @@ -19,10 +19,10 @@ export default { watch: { "scheduleFormData.type": { handler(newValue) { - if (newValue.toLowerCase() !== "sogo") return; + const type = this.$props.scheduleTypes.find((type) => type.value === newValue); + if (!type || !type.urlDefault?.length) return; - // todo: use base urls from db if appropriate - this.scheduleFormData.url = "sogo url placeholder"; + this.scheduleFormData.url = type.urlDefault; }, }, }, @@ -34,7 +34,7 @@ export default { diff --git a/public/js/components/Cis/Coodle/Coodle.js b/public/js/components/Cis/Coodle/Coodle.js index 8634f766e..c1c9d5b37 100644 --- a/public/js/components/Cis/Coodle/Coodle.js +++ b/public/js/components/Cis/Coodle/Coodle.js @@ -124,13 +124,15 @@ export default { template: /*html*/ `

Coodle

-
+
- +
+ +
{{ "Active surveys" }}
- +
+ +
{{ "Past surveys" }}
- +
+ +
{{ "Create new survey" }}
- +
+ +
{{ "FreeBusy Settings" }}