in modules/quanthub_core/src/Controller/QuanthubCalendarController.php [62:158]
public function ajaxUpdate(Request $request) {
$queryArgs = $request->query->all();
$langcode = $this->languageManager->getCurrentLanguage()->getId();
// Get query parameters from the request.
$start = $request->query->get('start');
$end = $request->query->get('end');
$timezone = $request->query->get('timeZone');
// @todo remove when postgres version will be 15>=.
if ($timezone == 'Europe/Kyiv') {
$timezone = 'Europe/Kiev';
}
$start_date = new DrupalDateTime($start, new \DateTimeZone($timezone));
$end_date = new DrupalDateTime($end, new \DateTimeZone($timezone));
$interval = $end_date->diff($start_date);
if ($interval->m < 2) {
// Format the dates (optional).
$start_formatted = $start_date->getTimestamp();
$end_formatted = $end_date->getTimestamp();
$query = $this->database
->select('node_field_data', 'n')
->fields('n', ['title']);
$query->join('node__field_release_date', 'nfrd', 'nfrd.entity_id = n.nid AND nfrd.langcode = :langcode', [':langcode' => $langcode]);
$query->join('node__field_rich_brief_descr', 'nrbd', 'nrbd.entity_id = n.nid AND nfrd.langcode = :langcode', [':langcode' => $langcode]);
$query->join('path_alias', 'pa', "pa.path = CONCAT('/node/', n.nid) AND nfrd.langcode = :langcode", [':langcode' => $langcode]);
$query->leftJoin('node__field_release_type', 'nfrt', 'nfrt.entity_id = n.nid AND nfrd.langcode = :langcode', [':langcode' => $langcode]);
$query->condition('n.type', 'release');
$query->condition('n.langcode', $langcode);
$query->condition('n.status', TRUE);
$query->condition('nfrd.field_release_date_value', $start_formatted, '>=');
$query->condition('nfrd.field_release_date_end_value', $end_formatted, '<=');
$query->addField('n', 'nid', 'eid');
$query->addField('n', 'nid', 'id');
$query->addField('nrbd', 'field_rich_brief_descr_value', 'des');
$query->addExpression("TO_CHAR(to_timestamp(nfrd.field_release_date_value) AT TIME ZONE :timezone, 'YYYY-MM-DD\"T\"HH24:MI:SS')", 'start', [':timezone' => $timezone]);
$query->addExpression("CONCAT('/', pa.langcode, pa.alias)", 'url');
$query->addExpression("TO_CHAR(to_timestamp(nfrd.field_release_date_end_value) AT TIME ZONE :timezone, 'YYYY-MM-DD\"T\"HH24:MI:SS')", 'end', [':timezone' => $timezone]);
$query->addExpression("FALSE", 'eventDurationEditable');
$query->addExpression("CASE nfrt.field_release_type_value
WHEN 'dataset' THEN '#0B8043'
WHEN 'press_release' THEN '#3F51B5'
WHEN 'announcement' THEN '#CC2E4F'
WHEN 'report_submission' THEN '#83226D'
WHEN 'other' THEN '#616161'
ELSE '#616161' END",
'backgroundColor'
);
$query->addExpression("CASE WHEN
TO_CHAR(to_timestamp(nfrd.field_release_date_value) AT TIME ZONE :timezone, 'HH24:MI') = '00:00'
THEN 1
ELSE 0 END",
'allDay',
[':timezone' => $timezone]
);
$data = $query->execute()->fetchAll();
// Fullcalendar.js need this value as bool.
foreach ($data as $key => $value) {
if ($data[$key]->allDay == FALSE) {
$data[$key]->allDay = FALSE;
}
else {
$data[$key]->allDay = TRUE;
}
}
$response = new CacheableJsonResponse($data);
// Create a CacheableMetadata object to hold cacheability metadata.
$cacheableMetadata = new CacheableMetadata();
if (isset($queryArgs['start'])) {
$cacheableMetadata->addCacheContexts([
'url.query_args:start',
'url.query_args:end',
'url.query_args:timeZone',
'languages:language_interface',
]);
$cacheableMetadata->addCacheTags(['node_list:release']);
$response->addCacheableDependency($cacheableMetadata);
}
}
else {
$response = new JsonResponse([]);
}
return $response;
}