Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 80 additions & 3 deletions css/fullcalendar.scss
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
--fc-daygrid-event-dot-width: 10px !important;

--fc-event-bg-color: var(--color-primary-element);
--fc-event-border-color: var(--color-primary-element-text);
--fc-event-text-color: var(--color-primary-element-text);
--fc-event-border-color: var(--color-primary-element);
--fc-event-text-color: var(--color-main-text);
--fc-event-selected-overlay-color: var(--color-box-shadow);

--fc-event-resizer-thickness: 8px;
Expand Down Expand Up @@ -131,7 +131,40 @@
// ### FullCalendar Event adjustments
.fc-event {
padding-inline-start: 3px;
border-width: 2px;

// Only show the left border, thick and full-opacity (dot events and list events are excluded)
&:not(.fc-daygrid-dot-event):not(.fc-list-event) {
border-block-start-width: 0 !important;
border-block-end-width: 0 !important;
border-inline-end-width: 0 !important;
border-inline-start-width: var(--default-grid-baseline) !important;
border-inline-start-style: solid !important;
}

// Free (TRANSP:TRANSPARENT) events: hollow left strip — 1px accent | page-bg | 1px accent
&.fc-event-nc-free {
&:not(.fc-daygrid-dot-event):not(.fc-list-event) {
position: relative;
// Hide the solid left border; the ::before pseudo-element takes its place
border-inline-start-color: transparent !important;

&::before {
content: '';
position: absolute;
// Offset into the (transparent) border area so we start at the true left edge
inset-inline-start: calc(-1 * var(--default-grid-baseline));
top: 0;
bottom: 0;
width: var(--default-grid-baseline);
background: var(--fc-page-bg-color);
border-inline-start: 1px solid var(--nc-event-color, currentColor);
border-inline-end: 1px solid var(--nc-event-color, currentColor);
border-start-start-radius: inherit;
border-end-start-radius: inherit;
box-sizing: border-box;
}
}
}

&.fc-event-nc-task-completed,
&.fc-event-nc-cancelled {
Expand All @@ -141,6 +174,20 @@
}
}


// Participation-state events with no fill keep the thick left stripe plus a 1px frame.
&.fc-event-nc-all-declined,
&.fc-event-nc-needs-action,
&.fc-event-nc-declined {
&:not(.fc-daygrid-dot-event):not(.fc-list-event) {
background-color: transparent !important;
border-block-start-width: 1px !important;
border-block-end-width: 1px !important;
border-inline-end-width: 1px !important;
border-inline-start-width: var(--default-grid-baseline) !important;
}
}

.fc-event-title {
text-overflow: ellipsis;
font-weight: 700;
Expand Down Expand Up @@ -305,3 +352,33 @@
margin-inline-end: 2vw;
}
}

// High-contrast mode: events use plain page background so the coloured left
// border is the sole colour indicator (no transparency, no stripe patterns).
// Two triggers:
// 1. OS/browser prefers-contrast: more media feature.
// 2. Nextcloud in-app Accessibility theme, which writes
// data-themes="light-highcontrast" (or dark-highcontrast) on <body>
// without necessarily setting the OS media feature.
@mixin _fc-high-contrast-events {
.fc-event:not(.fc-daygrid-dot-event):not(.fc-list-event) {
background-color: var(--fc-page-bg-color) !important;
background-image: none !important;

.fc-event-title,
.fc-event-time {
color: var(--color-main-text) !important;
}
}
}

@media (prefers-contrast: more) {
@include _fc-high-contrast-events;
}

[data-theme-light-highcontrast],
[data-theme-dark-highcontrast],
[data-themes*="highcontrast"] {
@include _fc-high-contrast-events;
}

4 changes: 0 additions & 4 deletions src/fullcalendar/eventSources/eventSource.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@ import useFetchedTimeRangesStore from '../../store/fetchedTimeRanges.js'
* SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import {
generateTextColorForHex,
} from '../../utils/color.js'
import { getUnixTimestampFromDate } from '../../utils/date.js'
import logger from '../../utils/logger.js'
import { eventSourceFunction } from './eventSourceFunction.js'
Expand All @@ -27,7 +24,6 @@ export default function() {
// coloring
backgroundColor: calendar.color,
borderColor: calendar.color,
textColor: generateTextColorForHex(calendar.color),
// html foo
events: async ({ start, end, timeZone }, successCallback, failureCallback) => {
let timezoneObject = getTimezoneManager().getTimezoneForId(timeZone)
Expand Down
11 changes: 9 additions & 2 deletions src/fullcalendar/eventSources/eventSourceFunction.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import usePrincipalsStore from '../../store/principals.js'
import useTasksStore from '../../store/unscheduledTasks.js'
import { getAllObjectsInTimeRange } from '../../utils/calendarObject.js'
import {
generateTextColorForHex,
getHexForColorName,
hexToRGB,
isLight,
Expand Down Expand Up @@ -81,6 +80,10 @@ export function eventSourceFunction(calendarObjects, calendar, start, end, timez
classNames.push('fc-event-nc-alarms')
}

if (object.name === 'VEVENT' && object.getFirstPropertyFirstValue('TRANSP') === 'TRANSPARENT') {
classNames.push('fc-event-nc-free')
}

let jsStart, jsEnd
if (object.name === 'VEVENT') {
jsStart = object.startDate.getInTimezone(timezone).jsDate
Expand Down Expand Up @@ -140,6 +143,10 @@ export function eventSourceFunction(calendarObjects, calendar, start, end, timez
}
}

const attendeeCount = object.hasComponent('ATTENDEE')
? [...object.getPropertyIterator('ATTENDEE')].length
: 0

const fcEvent = {
id: [calendarObject.id, object.id].join('###'),
title,
Expand All @@ -165,6 +172,7 @@ export function eventSourceFunction(calendarObjects, calendar, start, end, timez
davUrl: calendarObject.dav.url,
location: object.location,
description: object.description,
attendeeCount,
},
}

Expand All @@ -173,7 +181,6 @@ export function eventSourceFunction(calendarObjects, calendar, start, end, timez
if (customColor) {
fcEvent.backgroundColor = customColor
fcEvent.borderColor = customColor
fcEvent.textColor = generateTextColorForHex(customColor)
}
}
if (object.name === 'VTODO' && object.endDate === null && object.percent !== 100 && object.status !== 'COMPLETED') {
Expand Down
Loading
Loading