@propriety/court-calendar 1.0.161 → 1.0.164
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/CalendarNavCreateGate.test.d.ts +1 -0
- package/dist/__tests__/ReferenceDataPermissions.test.d.ts +1 -0
- package/dist/__tests__/helpers/api/permissions.test.d.ts +1 -0
- package/dist/__tests__/helpers/dayLoad.test.d.ts +1 -0
- package/dist/__tests__/hooks/UseCalendarEventsDayLoad.test.d.ts +8 -0
- package/dist/_components/Modal/DateDetails/CaseViewer.d.ts +1 -1
- package/dist/_components/Modal/DateDetails/DateDetails.d.ts +3 -1
- package/dist/_components/Modal/DateDetails/DateTabs.d.ts +2 -2
- package/dist/_components/Modal/DateDetails/MotionToPreclude.d.ts +8 -1
- package/dist/_components/Modal/Layout/ModalActions.d.ts +4 -1
- package/dist/_components/Toolbar/CalendarNav.d.ts +2 -2
- package/dist/constants.d.ts +0 -1
- package/dist/context/ReferenceDataContext.d.ts +3 -0
- package/dist/court-calendar.css +1 -1
- package/dist/helpers/CalEvent.d.ts +2 -0
- package/dist/helpers/api/courtDates.d.ts +1 -1
- package/dist/helpers/api/headers.d.ts +12 -0
- package/dist/helpers/api/people.d.ts +22 -1
- package/dist/helpers/dayLoad.d.ts +35 -0
- package/dist/helpers/eventLabel.d.ts +2 -0
- package/dist/hooks/UseCalendarEvents.d.ts +3 -1
- package/dist/index.mjs +7609 -7520
- package/dist/theme/tokens.d.ts +7 -0
- package/package.json +1 -1
- package/src/__tests__/CalendarLegend.test.tsx +7 -1
- package/src/__tests__/CalendarListLabels.test.tsx +1 -0
- package/src/__tests__/CalendarNavCreateGate.test.tsx +58 -0
- package/src/__tests__/CreateEditCaseOpenCases.test.tsx +1 -0
- package/src/__tests__/DateDetailsHearingLink.test.tsx +2 -0
- package/src/__tests__/DateDetailsMotion.test.tsx +44 -1
- package/src/__tests__/ModalActionsSaveGuard.test.tsx +2 -0
- package/src/__tests__/ReferenceDataLookups.test.tsx +4 -1
- package/src/__tests__/ReferenceDataPermissions.test.tsx +116 -0
- package/src/__tests__/WeekWidget.test.tsx +1 -0
- package/src/__tests__/helpers/api/cases.test.ts +14 -0
- package/src/__tests__/helpers/api/courtDates.test.ts +27 -0
- package/src/__tests__/helpers/api/permissions.test.ts +146 -0
- package/src/__tests__/helpers/dayLoad.test.ts +216 -0
- package/src/__tests__/helpers/eventLabel.test.ts +18 -0
- package/src/__tests__/hooks/UseCalendarEventsDayLoad.test.ts +222 -0
- package/src/__tests__/hooks/UseModalActions.test.ts +238 -12
- package/src/_components/CCalendar.css +13 -0
- package/src/_components/CCalendar.tsx +19 -5
- package/src/_components/CalendarDecorative.css +3 -0
- package/src/_components/CalendarEvents.css +29 -1
- package/src/_components/CalendarLegend.tsx +4 -2
- package/src/_components/Modal/DateDetails/CaseViewer.tsx +5 -5
- package/src/_components/Modal/DateDetails/DateDetails.tsx +4 -0
- package/src/_components/Modal/DateDetails/DateTabs.tsx +3 -3
- package/src/_components/Modal/DateDetails/MotionToPreclude.tsx +19 -3
- package/src/_components/Modal/DateEdit/CreateEditCase.tsx +8 -3
- package/src/_components/Modal/Layout/ModalActions.tsx +5 -1
- package/src/_components/Modal/Modal.tsx +9 -5
- package/src/_components/Toolbar/CalendarNav.tsx +3 -3
- package/src/constants.ts +0 -1
- package/src/context/ReferenceDataContext.tsx +43 -9
- package/src/helpers/CalEvent.ts +2 -1
- package/src/helpers/api/cases.ts +15 -2
- package/src/helpers/api/courtDates.ts +23 -5
- package/src/helpers/api/headers.ts +19 -0
- package/src/helpers/api/people.ts +46 -17
- package/src/helpers/dayLoad.ts +78 -0
- package/src/helpers/eventLabel.ts +6 -1
- package/src/hooks/UseCalendarEvents.ts +42 -15
- package/src/hooks/UseModalActions.ts +51 -5
- package/src/theme/CCThemeProvider.tsx +2 -1
- package/src/theme/tokens.ts +8 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Overbooked SCAR days, from court dates through to what FullCalendar is handed.
|
|
3
|
+
*
|
|
4
|
+
* computeDayLoad has its own unit tests. What matters here is the wiring around it:
|
|
5
|
+
* the count runs over the *visible* set, so a date hidden by a filter must not push a
|
|
6
|
+
* day over the limit — a day drawn red with three events on it reads as a bug.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
@@ -6,7 +6,7 @@ declare const CaseViewer: import('react').NamedExoticComponent<{
|
|
|
6
6
|
selectedDate: Date;
|
|
7
7
|
isVillage: boolean;
|
|
8
8
|
csvFileName?: string;
|
|
9
|
-
|
|
9
|
+
canEdit?: boolean;
|
|
10
10
|
onSelectedCasesAdjournmentChange?: (cases: Case[], date: Date | null) => Promise<boolean>;
|
|
11
11
|
onSelectedCasesClearDetermination?: (cases: Case[]) => Promise<boolean>;
|
|
12
12
|
firstChair?: number | null;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AdjournmentEntry, Case, CourtDate, DateEditItem } from '../../../types';
|
|
2
|
-
export default function DateDetails({ selectedCourtDate, cases, isVillage, isFetchingCases, onUpdateChair, adjournments, courtDateHistory, }: {
|
|
2
|
+
export default function DateDetails({ selectedCourtDate, cases, isVillage, isFetchingCases, onUpdateChair, adjournments, courtDateHistory, canFileMotion, }: {
|
|
3
3
|
selectedCourtDate: CourtDate | null;
|
|
4
4
|
cases: Case[];
|
|
5
5
|
isVillage: boolean;
|
|
@@ -7,4 +7,6 @@ export default function DateDetails({ selectedCourtDate, cases, isVillage, isFet
|
|
|
7
7
|
onUpdateChair?: (position: 'first' | 'second', userId: number | null) => void;
|
|
8
8
|
adjournments?: AdjournmentEntry[];
|
|
9
9
|
courtDateHistory?: DateEditItem[];
|
|
10
|
+
/** Passed straight to MotionToPreclude — see the note on its own prop. */
|
|
11
|
+
canFileMotion: boolean;
|
|
10
12
|
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Case, CourtDate } from '../../../types';
|
|
2
|
-
export default function DateTabs({ cases, isFetchingCases, setClickedCase, selectedDate, isVillage, csvFileName,
|
|
2
|
+
export default function DateTabs({ cases, isFetchingCases, setClickedCase, selectedDate, isVillage, csvFileName, canEdit, onSelectedCasesAdjournmentChange, onSelectedCasesClearDetermination, selectedCourtDate, }: {
|
|
3
3
|
cases: Case[];
|
|
4
4
|
isFetchingCases: boolean;
|
|
5
5
|
setClickedCase: (caseItem: Case | null) => void;
|
|
6
6
|
selectedDate: Date;
|
|
7
7
|
isVillage: boolean;
|
|
8
8
|
csvFileName?: string;
|
|
9
|
-
|
|
9
|
+
canEdit?: boolean;
|
|
10
10
|
onSelectedCasesAdjournmentChange?: (cases: Case[], date: Date | null) => Promise<boolean>;
|
|
11
11
|
onSelectedCasesClearDetermination?: (cases: Case[]) => Promise<boolean>;
|
|
12
12
|
selectedCourtDate: CourtDate | null;
|
|
@@ -12,11 +12,18 @@ export interface MotionToast {
|
|
|
12
12
|
* themselves through the status line and their tooltips.
|
|
13
13
|
*
|
|
14
14
|
* Callers gate on `isScarDate`: negotiation and collections dates never carry a motion.
|
|
15
|
+
*
|
|
16
|
+
* Download stays open to everyone — reading the draft is how a non-admin checks a motion
|
|
17
|
+
* before asking an admin to file it. Only the upload, which files with the court and
|
|
18
|
+
* cannot be undone, is restricted.
|
|
15
19
|
*/
|
|
16
|
-
export default function MotionToPreclude({ courtDate, township, adjournments, cases, onNotify, }: {
|
|
20
|
+
export default function MotionToPreclude({ courtDate, township, adjournments, cases, onNotify, canFileMotion, }: {
|
|
17
21
|
courtDate: CourtDate;
|
|
18
22
|
township: string;
|
|
19
23
|
adjournments?: AdjournmentEntry[];
|
|
20
24
|
cases?: Pick<Case, 'AdjournedDate'>[];
|
|
21
25
|
onNotify: (toast: MotionToast) => void;
|
|
26
|
+
/** Required rather than optional: a forgotten prop should fail the build, not silently
|
|
27
|
+
* hand every user an irreversible court filing. */
|
|
28
|
+
canFileMotion: boolean;
|
|
22
29
|
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { ModalMode } from '../types';
|
|
2
|
-
export default function ModalActions({ modalMode, onDelete, onSave, setModalMode, setIsOpen, isAdmin, createdBy, createdOn, }: {
|
|
2
|
+
export default function ModalActions({ modalMode, onDelete, onSave, setModalMode, setIsOpen, canEdit, isAdmin, createdBy, createdOn, }: {
|
|
3
3
|
modalMode: ModalMode;
|
|
4
4
|
onDelete: () => void | Promise<unknown>;
|
|
5
5
|
onSave: () => void | Promise<unknown>;
|
|
6
6
|
setModalMode: (mode: ModalMode) => void;
|
|
7
7
|
setIsOpen: (isOpen: boolean) => void;
|
|
8
|
+
/** Gates Edit/Save — everyone who works on cases. */
|
|
9
|
+
canEdit: boolean;
|
|
10
|
+
/** Gates Delete only. Deleting a date is not recoverable from the UI. */
|
|
8
11
|
isAdmin: boolean;
|
|
9
12
|
createdBy?: number | null;
|
|
10
13
|
createdOn?: Date | string | null;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Calendar } from '@fullcalendar/core/index.js';
|
|
2
|
-
export default function CalendarNav({ calendarApi, handleCreateClick, onPrint, onRefresh, currentView, setCurrentView, currentDate, setCurrentDate, isFetchingDates, isFetchingCases, lastFetchedAt,
|
|
2
|
+
export default function CalendarNav({ calendarApi, handleCreateClick, onPrint, onRefresh, currentView, setCurrentView, currentDate, setCurrentDate, isFetchingDates, isFetchingCases, lastFetchedAt, canEdit, }: {
|
|
3
3
|
calendarApi: Calendar | null;
|
|
4
4
|
handleCreateClick: () => void;
|
|
5
5
|
onPrint: () => void;
|
|
@@ -11,5 +11,5 @@ export default function CalendarNav({ calendarApi, handleCreateClick, onPrint, o
|
|
|
11
11
|
isFetchingDates: boolean;
|
|
12
12
|
isFetchingCases: boolean;
|
|
13
13
|
lastFetchedAt: Date | null;
|
|
14
|
-
|
|
14
|
+
canEdit: boolean;
|
|
15
15
|
}): import("react/jsx-runtime").JSX.Element;
|
package/dist/constants.d.ts
CHANGED
|
@@ -5,7 +5,6 @@ export declare const S3_NOTICES_URL = "https://aventine-court-notices.s3.us-east
|
|
|
5
5
|
export declare const S3_DOCS_URL = "https://aventine-court-docs.s3.amazonaws.com";
|
|
6
6
|
export declare const SETTLED_ACTIONS: string[];
|
|
7
7
|
export declare const EXCLUDED_USER_NAMES: string[];
|
|
8
|
-
export declare const ADMIN_GROUP = "calendar-admin";
|
|
9
8
|
export declare const PRIMARY_USER_IDS: number[];
|
|
10
9
|
export declare const CASES_CACHE_EXPIRY: number;
|
|
11
10
|
export declare const COURT_DATES_CACHE_EXPIRY: number;
|
|
@@ -9,6 +9,9 @@ interface ReferenceDataContextType {
|
|
|
9
9
|
getTownshipName: (muniCode: string) => string;
|
|
10
10
|
getCountyName: (muniCode: string) => string;
|
|
11
11
|
isLoading: boolean;
|
|
12
|
+
/** May add and edit court dates and negotiation dates. Everyone who works on cases. */
|
|
13
|
+
canEdit: boolean;
|
|
14
|
+
/** May delete a date and file a Motion to Preclude. A much smaller set than canEdit. */
|
|
12
15
|
isAdmin: boolean;
|
|
13
16
|
apiKey: string;
|
|
14
17
|
activeUser: number;
|
package/dist/court-calendar.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.pop-in-ccalendar-event{opacity:0;transform:scale(.8);transform-origin:center center;animation:popInBounce .4s cubic-bezier(.34,1.56,.64,1) forwards;will-change:opacity,transform}@keyframes popInBounce{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}#ccalendar-container *::-webkit-scrollbar{width:8px;background:var(--bg)}#ccalendar-container *::-webkit-scrollbar-thumb{background:var(--fc-border-color);border-radius:4px}#ccalendar-container *::-webkit-scrollbar-track{background:var(--bg)}#ccalendar-container *::-webkit-scrollbar-corner{background:var(--bg)}#ccalendar-container .MuiDataGrid-row:hover,#ccalendar-container .MuiDataGrid-row:hover>.MuiDataGrid-cell{background-color:var(--fc-today-bg-color)!important}.court-calendar a{color:var(--text)!important;text-decoration:none!important}.month-day-cell{background-color:var(--bg);color:var(--text);cursor:pointer;height:120px;padding:3px!important;position:relative}.month-day-cell.fc-day-other{filter:brightness(.9)}.month-day-cell.fc-day-today{background-color:var(--fc-today-bg-color)}.month-day-cell:hover:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background-color:var(--fc-today-bg-color);opacity:.5;pointer-events:none}.day-header{background-color:var(--bg);color:var(--text);border-bottom:1px solid var(--fc-border-color)}.day-header a{padding:6px 4px!important;display:inline-block}.court-calendar th[role=presentation]{background-color:var(--bg)}.day-cell-allday{background-color:var(--bg)!important;color:var(--text)!important}.fc-daygrid-day-events{max-height:100px;min-height:100px;overflow-y:inherit;margin:0!important;overflow-y:auto;scrollbar-color:var(--fc-border-color) transparent}.fc-day-today .fc-daygrid-day-events{scrollbar-color:var(--fc-event-unknown-color) transparent}.court-calendar .fc-timegrid-slot-label{background-color:var(--bg);color:var(--text)}.court-calendar .fc-timegrid-axis{border-color:var(--fc-border-color);background-color:var(--bg);color:var(--text)}.court-calendar .fc-timegrid-divider{border-color:var(--fc-border-color);background-color:var(--bg)}.fc .fc-button,.fc-button{background-color:var(--bg);color:var(--text);border:1px solid var(--fc-border-color);font-family:Roboto,Helvetica,Arial,"sans-serif";padding:.25rem .5rem;cursor:pointer}:is(.fc .fc-button,.fc-button).fc-button-primary{background-color:var(--bg);color:var(--text);border:1px solid var(--fc-border-color)}:is(.fc .fc-button,.fc-button).fc-button-active.fc-button-primary{background-color:var(--fc-today-bg-color);color:var(--text)}:is(.fc .fc-button,.fc-button):hover{background-color:var(--fc-today-bg-color)}.fc.fc-media-screen{background-color:var(--bg);color:var(--text);font-family:Roboto,Helvetica,Arial,"sans-serif"}.CCButton{background-color:var(--bg);color:var(--text);border:1px solid var(--fc-border-color);font-family:Roboto,Helvetica,Arial,"sans-serif";padding:8px 16px;margin-right:8px;border-radius:4px;cursor:pointer;-webkit-user-select:none;user-select:none}.CCButton:hover{background-color:var(--fc-today-bg-color)}.CCButton-Icon{min-width:35px;max-width:35px;min-height:35px;max-height:35px;border:none;padding:0;display:flex;align-items:center;justify-content:center}.CCDropdown-Button{width:75px}.CCDropdown-Menu{background-color:var(--bg);color:var(--text);border:1px solid var(--fc-border-color);font-family:Roboto,Helvetica,Arial,"sans-serif";box-shadow:0 2px 8px #00000026}.CCDropdown-Menu div{padding:8px 19px}.CCDropdown-Menu div:hover{background-color:var(--fc-today-bg-color)}.CCButton-Primary{background-color:#1976d2;color:#fff;border:none}.CCButton-Primary:hover{background-color:#1565c0}.CCButton-Error{background-color:#c15a5a;color:#fff;border:none}.CCButton-Error:hover{background-color:#953838}.ccdisabled{pointer-events:none;opacity:.6}.switch-track{outline:2px solid var(--fc-border-color)}.ccalendar-list-row{cursor:pointer;transition:background-color .2s ease-in-out}.CCAvatarIcon:hover{cursor:pointer;transform:scale(1.1);box-shadow:0 4px 8px #0003}#event-tooltip{background-color:var(--text);color:var(--bg);border:1px solid var(--fc-border-color);border-radius:4px;padding:8px;box-shadow:0 4px 8px #00000026;z-index:9999;font-size:16px}.court-event{cursor:pointer;padding:4px 2px}.fc-list .fc-list-day-cushion{background-color:var(--bg)!important;color:var(--text)}.fc-list .fc-list-event:hover td{background-color:var(--fc-today-bg-color)!important}.fc-list .deadline-event .fc-list-event-dot{border:none;width:1em;height:1em;vertical-align:middle;background:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><circle cx="8" cy="8" r="8" fill="%2300c853"/><path d="M4 8l3 3 5-5" stroke="white" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>') no-repeat center center;background-size:contain}.fc-list .deadline-event.inperson{--color: var(--fc-event-inperson-color)}.fc-list .deadline-event.virtual{--color: var(--fc-event-virtual-color)}.fc-list .deadline-event.unknown{--color: var(--fc-event-unknown-color)}.fc-list .deadline-event.negotiations{--color: var(--fc-event-negotiations-color)}.fc-list .deadline-event.collections{--color: var(--fc-event-collections-color)}.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event{background-color:transparent!important;border-color:transparent!important;display:flex;align-items:center;overflow-x:hidden;position:relative}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event) .fc-event-title{color:var(--text)!important}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).inperson{--color: var(--fc-event-inperson-color)}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).virtual{--color: var(--fc-event-virtual-color)}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).unknown{--color: var(--fc-event-unknown-color)}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).negotiations{--color: var(--fc-event-negotiations-color)}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).collections{--color: var(--fc-event-collections-color)}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).adjourned-no-date{--color: rgb(151, 11, 134) !important}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).status-uploaded:before{content:"";display:inline-block;width:1em;height:1em;vertical-align:middle;background:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><circle cx="8" cy="8" r="8" fill="%2300c853"/><path d="M4 8l3 3 5-5" stroke="white" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>') no-repeat center center;background-size:contain;margin:0 4px 0 0;top:.5em;border:none;position:absolute}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).status-uploaded .fc-event-main{margin-left:1.5em!important}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event):not(.status-uploaded):before{content:"";display:inline-block;border-radius:calc(var(--fc-daygrid-event-dot-width) / 2);box-sizing:content-box;height:0px;margin:0 4px;width:0px;border:calc(var(--fc-daygrid-event-dot-width) / 2) solid var(--color)}.courtdate-event,.adjournment-event{border:1px solid var(--fc-border-color)!important}:is(.courtdate-event,.adjournment-event) .fc-event-title,:is(.courtdate-event,.adjournment-event) .fc-event-time{color:#fff!important}:is(.courtdate-event,.adjournment-event).inperson{background-color:var(--fc-event-inperson-color)!important;border-color:var(--fc-event-inperson-color)!important}:is(.courtdate-event,.adjournment-event).virtual{background-color:var(--fc-event-virtual-color)!important;border-color:var(--fc-event-virtual-color)!important}:is(.courtdate-event,.adjournment-event).unknown{background-color:var(--fc-event-unknown-color)!important;border-color:var(--fc-event-unknown-color)!important}:is(.courtdate-event,.adjournment-event).negotiations{background-color:var(--fc-event-negotiations-color)!important;border-color:var(--fc-event-negotiations-color)!important}:is(.courtdate-event,.adjournment-event).collections{background-color:var(--fc-event-collections-color)!important;border-color:var(--fc-event-collections-color)!important}:is(.courtdate-event,.adjournment-event) .fc-daygrid-event-dot,:is(.courtdate-event,.adjournment-event) .fc-list-event-dot{display:none}:is(.courtdate-event,.adjournment-event).adjourned-no-date{border-color:#970b86!important;background-color:#970b86!important}.village-date.courtdate-event,.village-date.adjournment-event,.village-date.multipledate-event{border:2px solid #f59e0b!important}.deadline-due-today.courtdate-event,.deadline-due-today.multipledate-event{border:2px solid #d32f2f!important;outline:1px solid #d32f2f}.deadline-due-today.courtdate-event .fc-event-main,.deadline-due-today.multipledate-event .fc-event-main{position:relative}.deadline-due-today.courtdate-event .fc-event-main:after,.deadline-due-today.multipledate-event .fc-event-main:after{content:"!";position:absolute;top:0;right:2px;background:#d32f2f;color:#fff;border-radius:50%;width:14px;height:14px;font-size:10px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;line-height:1;z-index:99999}.fc-view:not(.fc-list) .deadline-due-today.deadline-event{border:2px solid #d32f2f!important;border-radius:2px;padding-bottom:2px}.fc-view:not(.fc-list) .deadline-due-today.deadline-event .fc-event-title{color:#d32f2f!important;font-weight:700}.fc-view:not(.fc-list) .deadline-due-today.deadline-event:after{content:"!";position:absolute;left:2px;top:.7em;background:#d32f2f;color:#fff;border-radius:50%;width:14px;height:14px;font-size:10px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;line-height:1;z-index:99999}@keyframes overdueFlash{0%,to{border-color:#b71c1c!important;box-shadow:0 0 #b71c1c00}50%{border-color:#ff1744!important;box-shadow:0 0 8px 3px #ff174499}}.deadline-overdue.courtdate-event,.deadline-overdue.multipledate-event{border:2px solid #b71c1c!important;animation:overdueFlash 1.8s ease-in-out infinite!important}.deadline-overdue.courtdate-event .fc-event-main,.deadline-overdue.multipledate-event .fc-event-main{position:relative}.deadline-overdue.courtdate-event .fc-event-main:after,.deadline-overdue.multipledate-event .fc-event-main:after{content:"⚠";position:absolute;top:0;right:2px;background:#b71c1c;color:#fff;border-radius:50%;width:16px;height:16px;font-size:10px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;line-height:1;z-index:5}.fc-view:not(.fc-list) .deadline-overdue.deadline-event{border:2px solid #b71c1c!important;border-radius:2px;padding-bottom:2px;animation:overdueFlash 1.8s ease-in-out infinite!important}.fc-view:not(.fc-list) .deadline-overdue.deadline-event .fc-event-title{color:#b71c1c!important;font-weight:700}.fc-view:not(.fc-list) .deadline-overdue.deadline-event:after{content:"⚠";position:absolute;left:2px;top:.5em;background:#b71c1c;color:#fff;border-radius:50%;width:14px;height:14px;font-size:10px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;line-height:1;z-index:99999}#ccalendar-toolbar{position:relative}#ccalendar-header{box-shadow:0 2px 12px #00000012;position:relative}#ccalendar-header:after{content:"";position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--cc-gradient);opacity:.55;pointer-events:none}#ccalendar-nav .MuiTypography-h6{background:var(--cc-gradient);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;font-weight:700!important}#ccalendar-toolbar .MuiButton-outlined:not([disabled]),#ccalendar-nav .MuiButton-outlined:not([disabled]){border:1.5px solid transparent!important;background:linear-gradient(var(--bg),var(--bg)) padding-box,var(--cc-gradient) border-box!important;transition:box-shadow .15s ease!important}#ccalendar-toolbar .MuiButton-outlined:not([disabled]):hover,#ccalendar-nav .MuiButton-outlined:not([disabled]):hover{background:linear-gradient(var(--fc-today-bg-color),var(--fc-today-bg-color)) padding-box,var(--cc-gradient) border-box!important;box-shadow:0 0 8px 1px var(--cc-glow-purple)!important}.month-day-cell.fc-day-today{background-image:linear-gradient(135deg,#3b82f612,#8b5cf612,#06b6d40d)}.courtdate-event,.adjournment-event,.multipledate-event{border-radius:4px!important;transition:filter .12s ease,box-shadow .12s ease!important}.courtdate-event:hover,.adjournment-event:hover,.multipledate-event:hover{filter:brightness(1.1)!important;box-shadow:0 2px 10px #0000004d!important;z-index:5}#event-tooltip{border:1.5px solid transparent!important;background:linear-gradient(var(--text),var(--text)) padding-box,var(--cc-gradient) border-box!important;box-shadow:0 0 14px 2px #8b5cf638,0 4px 18px #00000047!important;border-radius:10px!important;padding:0!important;font-size:16px!important;font-family:Roboto,Helvetica,Arial,sans-serif!important;min-width:240px!important;max-width:340px!important}#event-tooltip .tt-card{padding:14px 16px}#event-tooltip .tt-title{font-size:17px;font-weight:700;line-height:1.3;margin-bottom:4px}#event-tooltip .tt-date{font-size:15px;opacity:.7;margin-bottom:8px}#event-tooltip .tt-badge{display:inline-block;padding:3px 9px;border-radius:4px;font-size:13px;font-weight:600;letter-spacing:.03em;margin-bottom:8px}#event-tooltip .tt-badge--blue{background:#3b82f659}#event-tooltip .tt-badge--purple{background:#8b5cf659}#event-tooltip .tt-badge--amber{background:#f59e0b59}#event-tooltip .tt-badge--cyan{background:#06b6d459}#event-tooltip .tt-divider{height:1px;background:#80808047;margin:8px 0}#event-tooltip .tt-grid{display:grid;grid-template-columns:auto 1fr;gap:6px 14px;font-size:15px}#event-tooltip .tt-label{opacity:.58;white-space:nowrap;line-height:1.5}#event-tooltip .tt-value{font-weight:500;line-height:1.5}#event-tooltip .tt-footer{font-size:13px;opacity:.42;text-align:center;margin-top:8px;padding-top:6px;border-top:1px solid rgba(128,128,128,.22)}#ccalendar-nav .MuiToggleButtonGroup-root .MuiToggleButton-root{color:#1976d2;border:1.5px solid transparent!important;background:linear-gradient(var(--bg),var(--bg)) padding-box,var(--cc-gradient) border-box!important;transition:box-shadow .15s ease!important}#ccalendar-nav .MuiToggleButtonGroup-root .MuiToggleButton-root:hover{color:#1976d2!important;background:linear-gradient(var(--fc-today-bg-color),var(--fc-today-bg-color)) padding-box,var(--cc-gradient) border-box!important;box-shadow:0 0 8px 1px var(--cc-glow-purple)!important}#ccalendar-nav .MuiToggleButtonGroup-root .MuiToggleButton-root.Mui-selected{background:linear-gradient(var(--fc-today-bg-color),var(--fc-today-bg-color)) padding-box,var(--cc-gradient) border-box!important}#ccalendar-nav .MuiToggleButtonGroup-root .MuiToggleButton-root:not(.Mui-selected){color:#4397ecde}#ccalendar-toolbar .MuiToggleButton-root:hover:not(.Mui-selected){background-color:var(--fc-today-bg-color)!important}#ccalendar-toolbar .cc-more-btn-open{border:1.5px solid transparent!important;background:linear-gradient(var(--bg),var(--bg)) padding-box,var(--cc-gradient) border-box!important}.modal-footer .MuiButton-containedPrimary{background-image:var(--cc-gradient)!important;box-shadow:0 0 10px 1px var(--cc-glow-purple),0 2px 6px #0000002e!important;transition:opacity .15s ease,box-shadow .15s ease!important}.modal-footer .MuiButton-containedPrimary:hover:not([disabled]){background-image:var(--cc-gradient)!important;opacity:.9;box-shadow:0 0 16px 2px var(--cc-glow-purple),0 2px 8px #00000038!important}.modal-footer .MuiButton-containedPrimary{text-shadow:0 1px 3px rgba(0,0,0,.35)!important}@page{size:landscape;margin:.5in}@media print{#ccalendar-container>.MuiStack-root:first-child,#event-tooltip,.ReactModal__Overlay,.MuiDataGrid-footerContainer{display:none!important}#ccalendar-container{width:100%!important;overflow:visible!important;padding-top:10px}.fc.fc-media-screen,.fc .fc-scrollgrid,.fc .fc-scrollgrid-section>td,.fc .fc-daygrid-body,.fc table{width:100%!important;max-width:100%!important}.fc .fc-scrollgrid{overflow:visible!important}.fc colgroup col{width:auto!important}.fc-daygrid-day-events{max-height:none!important;min-height:auto!important;overflow:visible!important}.month-day-cell{height:auto!important}#ccalendar-container .MuiDataGrid-root{height:auto!important;max-height:none!important}#ccalendar-container .MuiDataGrid-virtualScroller{overflow:visible!important;height:auto!important}*{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}}@keyframes cc-crt-body{0%{transform:translate(0);filter:none;opacity:1}3%{filter:brightness(.85);opacity:.85}6%{filter:none;opacity:1}9%{filter:brightness(1.12);opacity:.75}12%{transform:translate(0);filter:none;opacity:1}15%{transform:translate(0);filter:blur(.5px) hue-rotate(80deg) brightness(.95);opacity:.95}18%{transform:translate(-3px) skew(-1.5deg);filter:blur(1px) hue-rotate(100deg) saturate(1.5);opacity:.9}22%{transform:translate(3px) skew(1.5deg);filter:blur(.5px) hue-rotate(90deg) brightness(1.1);opacity:.95}25%{transform:translate(0);filter:blur(1.5px) hue-rotate(110deg) saturate(1.8);opacity:.85}28%{transform:translate(-5px,1px) skew(-2deg);filter:blur(2px) hue-rotate(130deg) contrast(1.3);opacity:.8}31%{transform:translate(5px,-1px) skew(2deg);filter:blur(1px) hue-rotate(90deg) brightness(1.2);opacity:.88}35%{transform:translate(0);filter:blur(2px) hue-rotate(100deg) saturate(1.2);opacity:.75}38%{transform:translate(-8px,2px) skew(-4deg);filter:blur(3px) hue-rotate(160deg) contrast(1.6);opacity:.6}39%{transform:translate(8px,-2px) skew(4deg);filter:blur(1.5px) hue-rotate(60deg) brightness(1.4);opacity:.75}43%{transform:translate(-2px,1px);filter:blur(3.5px) grayscale(.2) saturate(.8);opacity:.65}47%{filter:blur(2px) brightness(.35);opacity:.18}50%{transform:translate(0);filter:blur(4px) grayscale(.4) contrast(1.4);opacity:.7}53%{transform:translate(-6px,2px) skew(-3deg);filter:blur(3px) grayscale(.3) hue-rotate(180deg);opacity:.55}55%{transform:translate(6px,-2px) skew(3deg);filter:blur(2px) brightness(1.5) contrast(1.8);opacity:.7}58%{transform:translate(0);filter:blur(5px) grayscale(.6) brightness(.6);opacity:.5}60%{filter:blur(4px) brightness(.25);opacity:.12}62%{filter:blur(3px) brightness(1.2);opacity:.6}65%{transform:translate(-10px,3px) skew(-5deg);filter:blur(6px) grayscale(.7) contrast(1.5);opacity:.45}66%{transform:translate(10px,-3px) skew(5deg);filter:blur(3px) grayscale(.5) brightness(1.8);opacity:.6}70%{transform:translate(-4px,2px);filter:blur(7px) grayscale(.8) saturate(.2);opacity:.35}73%{filter:blur(6px) brightness(.18);opacity:.08}75%{transform:translate(0);filter:blur(6px) grayscale(.85) brightness(.5);opacity:.4}78%{transform:translate(-12px,4px) skew(-6deg);filter:blur(8px) grayscale(.9) contrast(2);opacity:.3}79%{transform:translate(12px,-4px) skew(6deg);filter:blur(4px) grayscale(.7) brightness(1.6);opacity:.45}84%{transform:translate(-3px,1px);filter:blur(9px) grayscale(.95) brightness(.35);opacity:.2}88%{filter:blur(8px) brightness(.08);opacity:.04}90%{transform:translate(0);filter:blur(10px) grayscale(1) brightness(.25);opacity:.14}95%{transform:translate(0);filter:blur(12px) grayscale(1) brightness(.1);opacity:.05}to{transform:translate(0);filter:blur(14px) grayscale(1) brightness(0);opacity:0}}@keyframes cc-crt-scanlines{0%{opacity:0;background-position-y:0px}14%{opacity:0;background-position-y:0px}22%{opacity:.28;background-position-y:-4px}42%{opacity:.5;background-position-y:-18px}67%{opacity:.72;background-position-y:-42px}88%{opacity:.88;background-position-y:-66px}to{opacity:1;background-position-y:-84px}}@keyframes cc-crt-vignette{0%{opacity:0}22%{opacity:.25}to{opacity:.88}}.cc-glitch-active{position:relative;animation:cc-crt-body 2s linear forwards;pointer-events:none;overflow:hidden}.cc-glitch-active:before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(to bottom,transparent 0px,transparent 2px,rgba(0,0,0,.1) 2px,rgba(0,0,0,.1) 4px);z-index:9999;pointer-events:none;animation:cc-crt-scanlines 2s linear forwards}.cc-glitch-active:after{content:"";position:absolute;inset:0;background:radial-gradient(ellipse at center,transparent 55%,rgba(0,0,0,.6) 100%);z-index:9998;pointer-events:none;animation:cc-crt-vignette 2s linear forwards}@keyframes cc-humphrey-appear{0%{color:transparent;text-shadow:none;opacity:0;transform:skew(0)}4%{color:red;text-shadow:0 0 30px #ff0000,0 0 60px #ff0000;opacity:.9;transform:skew(-8deg)}6%{color:transparent;text-shadow:none;opacity:0;transform:skew(0)}9%{color:red;text-shadow:0 0 20px #ff0000;opacity:.7;transform:skew(5deg)}11%{color:transparent;text-shadow:none;opacity:0;transform:skew(0)}14%{color:#ff2020;text-shadow:2px 0 0 #ff0000,-2px 0 0 #00ffff;opacity:1;transform:skew(-4deg)}17%{color:#dc143c;text-shadow:0 0 12px #dc143c;opacity:.4;transform:skew(2deg)}20%{color:#ff2020;text-shadow:4px 0 0 #ff0000,-4px 0 0 #00ffff;opacity:1;transform:skew(-6deg)}23%{color:transparent;text-shadow:none;opacity:0;transform:skew(0)}26%{color:#ff2020;text-shadow:0 0 8px #ff0000;opacity:.8;transform:skew(3deg)}30%{color:#ff2020;text-shadow:3px 0 0 #ff0000,-3px 0 0 #00ffff;opacity:1;transform:skew(-3deg)}34%{color:#dc143c;text-shadow:0 0 6px #dc143c,0 0 14px #dc143c50;opacity:.6;transform:skew(0)}38%{color:#ff2020;text-shadow:1px 0 0 #ff0000,-1px 0 0 #00ffff;opacity:1;transform:skew(-2deg)}43%{color:transparent;text-shadow:none;opacity:0;transform:skew(0)}45%{color:#ff1010;text-shadow:0 0 10px #ff0000;opacity:.9;transform:skew(4deg)}48%{color:#dc143c;text-shadow:0 0 4px #dc143c;opacity:.7;transform:skew(-1deg)}53%{color:#ff2020;text-shadow:2px 0 0 #ff0000,-2px 0 0 #00ffff;opacity:1;transform:skew(2deg)}57%{color:#dc143c;text-shadow:0 0 6px #dc143c;opacity:.85;transform:skew(0)}63%{color:transparent;text-shadow:none;opacity:0}65%{color:#dc143c;text-shadow:0 0 8px #dc143c,0 0 18px #dc143c60;opacity:1;transform:skew(-1deg)}72%{color:#dc143c;text-shadow:0 0 3px #dc143c;opacity:.9;transform:skew(0)}78%{opacity:.7}84%{color:#dc143c;text-shadow:0 0 5px #dc143c,0 0 10px #dc143c70;opacity:1}91%{opacity:.85}to{color:#dc143c;text-shadow:0 0 3px #dc143c,0 0 8px #dc143c90;opacity:1;transform:skew(0)}}.cc-humphrey{display:inline-block;animation:cc-humphrey-appear 1.6s steps(1,end) forwards}@keyframes cc-crt-flicker{0%,18%,22%,24%,53%,57%,to{opacity:1}20%,55%{opacity:.91}23%{opacity:.95}56%{opacity:.93}}@keyframes cc-crt-scanroll{0%{background-position-y:0}to{background-position-y:4px}}.cc-crt-ambient{position:relative;overflow:hidden;animation:cc-crt-flicker 7s linear infinite}.cc-crt-ambient:before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(to bottom,transparent 0px,transparent 2px,rgba(0,0,0,.07) 2px,rgba(0,0,0,.07) 4px);pointer-events:none;z-index:9999;animation:cc-crt-scanroll .18s linear infinite}.cc-crt-ambient:after{content:"";position:absolute;inset:0;background:radial-gradient(ellipse at center,transparent 55%,rgba(0,0,0,.42) 100%);pointer-events:none;z-index:9998}.cc-crt-in{position:relative;overflow:hidden;animation:cc-crt-body 2s linear reverse both}.cc-crt-in:before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(to bottom,transparent 0px,transparent 2px,rgba(0,0,0,.1) 2px,rgba(0,0,0,.1) 4px);z-index:9999;pointer-events:none;animation:cc-crt-scanlines 2s linear reverse both}.cc-crt-in:after{content:"";position:absolute;inset:0;background:radial-gradient(ellipse at center,transparent 55%,rgba(0,0,0,.6) 100%);z-index:9998;pointer-events:none;animation:cc-crt-vignette 2s linear reverse both}
|
|
1
|
+
.pop-in-ccalendar-event{opacity:0;transform:scale(.8);transform-origin:center center;animation:popInBounce .4s cubic-bezier(.34,1.56,.64,1) forwards;will-change:opacity,transform}@keyframes popInBounce{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}#ccalendar-container *::-webkit-scrollbar{width:8px;background:var(--bg)}#ccalendar-container *::-webkit-scrollbar-thumb{background:var(--fc-border-color);border-radius:4px}#ccalendar-container *::-webkit-scrollbar-track{background:var(--bg)}#ccalendar-container *::-webkit-scrollbar-corner{background:var(--bg)}#ccalendar-container .MuiDataGrid-row:hover,#ccalendar-container .MuiDataGrid-row:hover>.MuiDataGrid-cell{background-color:var(--fc-today-bg-color)!important}.court-calendar a{color:var(--text)!important;text-decoration:none!important}.month-day-cell{background-color:var(--bg);color:var(--text);cursor:pointer;height:120px;padding:3px!important;position:relative}.month-day-cell.fc-day-other{filter:brightness(.9)}.month-day-cell.fc-day-today{background-color:var(--fc-today-bg-color)}.month-day-cell.overbooked-day{box-shadow:inset 0 0 0 2px #dc262673;background-color:#dc26260f}.month-day-cell.overbooked-day.fc-day-today{background-color:var(--fc-today-bg-color)}.month-day-cell:hover:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background-color:var(--fc-today-bg-color);opacity:.5;pointer-events:none}.day-header{background-color:var(--bg);color:var(--text);border-bottom:1px solid var(--fc-border-color)}.day-header a{padding:6px 4px!important;display:inline-block}.court-calendar th[role=presentation]{background-color:var(--bg)}.day-cell-allday{background-color:var(--bg)!important;color:var(--text)!important}.fc-daygrid-day-events{max-height:100px;min-height:100px;overflow-y:inherit;margin:0!important;overflow-y:auto;scrollbar-color:var(--fc-border-color) transparent}.fc-day-today .fc-daygrid-day-events{scrollbar-color:var(--fc-event-unknown-color) transparent}.court-calendar .fc-timegrid-slot-label{background-color:var(--bg);color:var(--text)}.court-calendar .fc-timegrid-axis{border-color:var(--fc-border-color);background-color:var(--bg);color:var(--text)}.court-calendar .fc-timegrid-divider{border-color:var(--fc-border-color);background-color:var(--bg)}.fc .fc-button,.fc-button{background-color:var(--bg);color:var(--text);border:1px solid var(--fc-border-color);font-family:Roboto,Helvetica,Arial,"sans-serif";padding:.25rem .5rem;cursor:pointer}:is(.fc .fc-button,.fc-button).fc-button-primary{background-color:var(--bg);color:var(--text);border:1px solid var(--fc-border-color)}:is(.fc .fc-button,.fc-button).fc-button-active.fc-button-primary{background-color:var(--fc-today-bg-color);color:var(--text)}:is(.fc .fc-button,.fc-button):hover{background-color:var(--fc-today-bg-color)}.fc.fc-media-screen{background-color:var(--bg);color:var(--text);font-family:Roboto,Helvetica,Arial,"sans-serif"}.CCButton{background-color:var(--bg);color:var(--text);border:1px solid var(--fc-border-color);font-family:Roboto,Helvetica,Arial,"sans-serif";padding:8px 16px;margin-right:8px;border-radius:4px;cursor:pointer;-webkit-user-select:none;user-select:none}.CCButton:hover{background-color:var(--fc-today-bg-color)}.CCButton-Icon{min-width:35px;max-width:35px;min-height:35px;max-height:35px;border:none;padding:0;display:flex;align-items:center;justify-content:center}.CCDropdown-Button{width:75px}.CCDropdown-Menu{background-color:var(--bg);color:var(--text);border:1px solid var(--fc-border-color);font-family:Roboto,Helvetica,Arial,"sans-serif";box-shadow:0 2px 8px #00000026}.CCDropdown-Menu div{padding:8px 19px}.CCDropdown-Menu div:hover{background-color:var(--fc-today-bg-color)}.CCButton-Primary{background-color:#1976d2;color:#fff;border:none}.CCButton-Primary:hover{background-color:#1565c0}.CCButton-Error{background-color:#c15a5a;color:#fff;border:none}.CCButton-Error:hover{background-color:#953838}.ccdisabled{pointer-events:none;opacity:.6}.switch-track{outline:2px solid var(--fc-border-color)}.ccalendar-list-row{cursor:pointer;transition:background-color .2s ease-in-out}.CCAvatarIcon:hover{cursor:pointer;transform:scale(1.1);box-shadow:0 4px 8px #0003}#event-tooltip{background-color:var(--text);color:var(--bg);border:1px solid var(--fc-border-color);border-radius:4px;padding:8px;box-shadow:0 4px 8px #00000026;z-index:9999;font-size:16px}.court-event{cursor:pointer;padding:4px 2px}.fc-list .fc-list-day-cushion{background-color:var(--bg)!important;color:var(--text)}.fc-list .fc-list-event:hover td{background-color:var(--fc-today-bg-color)!important}.fc-list .deadline-event .fc-list-event-dot{border:none;width:1em;height:1em;vertical-align:middle;background:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><circle cx="8" cy="8" r="8" fill="%2300c853"/><path d="M4 8l3 3 5-5" stroke="white" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>') no-repeat center center;background-size:contain}.fc-list .deadline-event.inperson{--color: var(--fc-event-inperson-color)}.fc-list .deadline-event.virtual{--color: var(--fc-event-virtual-color)}.fc-list .deadline-event.unknown{--color: var(--fc-event-unknown-color)}.fc-list .deadline-event.negotiations{--color: var(--fc-event-negotiations-color)}.fc-list .deadline-event.collections{--color: var(--fc-event-collections-color)}.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event{background-color:transparent!important;border-color:transparent!important;display:flex;align-items:center;overflow-x:hidden;position:relative}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event) .fc-event-title{color:var(--text)!important}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).inperson{--color: var(--fc-event-inperson-color)}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).virtual{--color: var(--fc-event-virtual-color)}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).unknown{--color: var(--fc-event-unknown-color)}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).negotiations{--color: var(--fc-event-negotiations-color)}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).collections{--color: var(--fc-event-collections-color)}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).adjourned-no-date{--color: rgb(151, 11, 134) !important}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).status-uploaded:before{content:"";display:inline-block;width:1em;height:1em;vertical-align:middle;background:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><circle cx="8" cy="8" r="8" fill="%2300c853"/><path d="M4 8l3 3 5-5" stroke="white" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg>') no-repeat center center;background-size:contain;margin:0 4px 0 0;top:.5em;border:none;position:absolute}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event).status-uploaded .fc-event-main{margin-left:1.5em!important}:is(.fc-view:not(.fc-list) .deadline-event,.fc-view:not(.fc-list) .motion-event):not(.status-uploaded):before{content:"";display:inline-block;border-radius:calc(var(--fc-daygrid-event-dot-width) / 2);box-sizing:content-box;height:0px;margin:0 4px;width:0px;border:calc(var(--fc-daygrid-event-dot-width) / 2) solid var(--color)}.courtdate-event,.adjournment-event,.multipledate-event{border:1px solid var(--fc-border-color)!important}:is(.courtdate-event,.adjournment-event,.multipledate-event) .fc-event-title,:is(.courtdate-event,.adjournment-event,.multipledate-event) .fc-event-time{color:#fff!important}:is(.courtdate-event,.adjournment-event,.multipledate-event).inperson{background-color:var(--fc-event-inperson-color)!important;border-color:var(--fc-event-inperson-color)!important}:is(.courtdate-event,.adjournment-event,.multipledate-event).virtual{background-color:var(--fc-event-virtual-color)!important;border-color:var(--fc-event-virtual-color)!important}:is(.courtdate-event,.adjournment-event,.multipledate-event).unknown{background-color:var(--fc-event-unknown-color)!important;border-color:var(--fc-event-unknown-color)!important}:is(.courtdate-event,.adjournment-event,.multipledate-event).negotiations{background-color:var(--fc-event-negotiations-color)!important;border-color:var(--fc-event-negotiations-color)!important}:is(.courtdate-event,.adjournment-event,.multipledate-event).collections{background-color:var(--fc-event-collections-color)!important;border-color:var(--fc-event-collections-color)!important}:is(.courtdate-event,.adjournment-event,.multipledate-event) .fc-daygrid-event-dot,:is(.courtdate-event,.adjournment-event,.multipledate-event) .fc-list-event-dot{display:none}:is(.courtdate-event,.adjournment-event,.multipledate-event).adjourned-no-date{border-color:#970b86!important;background-color:#970b86!important}:is(.courtdate-event,.adjournment-event,.multipledate-event).scar-overbooked{border-color:var(--fc-event-overbooked-color)!important;background-color:var(--fc-event-overbooked-color)!important}:is(.courtdate-event,.adjournment-event,.multipledate-event).adjourned-no-date.scar-overbooked{background-image:linear-gradient(to right,rgb(151,11,134) 0 30%,var(--fc-event-overbooked-color) 70% 100%)!important}.village-date.courtdate-event,.village-date.adjournment-event,.village-date.multipledate-event{border:2px solid #f59e0b!important}.deadline-due-today.courtdate-event,.deadline-due-today.multipledate-event{border:2px solid #d32f2f!important;outline:1px solid #d32f2f}.deadline-due-today.courtdate-event .fc-event-main,.deadline-due-today.multipledate-event .fc-event-main{position:relative}.deadline-due-today.courtdate-event .fc-event-main:after,.deadline-due-today.multipledate-event .fc-event-main:after{content:"!";position:absolute;top:0;right:2px;background:#d32f2f;color:#fff;border-radius:50%;width:14px;height:14px;font-size:10px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;line-height:1;z-index:99999}.fc-view:not(.fc-list) .deadline-due-today.deadline-event{border:2px solid #d32f2f!important;border-radius:2px;padding-bottom:2px}.fc-view:not(.fc-list) .deadline-due-today.deadline-event .fc-event-title{color:#d32f2f!important;font-weight:700}.fc-view:not(.fc-list) .deadline-due-today.deadline-event:after{content:"!";position:absolute;left:2px;top:.7em;background:#d32f2f;color:#fff;border-radius:50%;width:14px;height:14px;font-size:10px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;line-height:1;z-index:99999}@keyframes overdueFlash{0%,to{border-color:#b71c1c!important;box-shadow:0 0 #b71c1c00}50%{border-color:#ff1744!important;box-shadow:0 0 8px 3px #ff174499}}.deadline-overdue.courtdate-event,.deadline-overdue.multipledate-event{border:2px solid #b71c1c!important;animation:overdueFlash 1.8s ease-in-out infinite!important}.deadline-overdue.courtdate-event .fc-event-main,.deadline-overdue.multipledate-event .fc-event-main{position:relative}.deadline-overdue.courtdate-event .fc-event-main:after,.deadline-overdue.multipledate-event .fc-event-main:after{content:"⚠";position:absolute;top:0;right:2px;background:#b71c1c;color:#fff;border-radius:50%;width:16px;height:16px;font-size:10px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;line-height:1;z-index:5}.fc-view:not(.fc-list) .deadline-overdue.deadline-event{border:2px solid #b71c1c!important;border-radius:2px;padding-bottom:2px;animation:overdueFlash 1.8s ease-in-out infinite!important}.fc-view:not(.fc-list) .deadline-overdue.deadline-event .fc-event-title{color:#b71c1c!important;font-weight:700}.fc-view:not(.fc-list) .deadline-overdue.deadline-event:after{content:"⚠";position:absolute;left:2px;top:.5em;background:#b71c1c;color:#fff;border-radius:50%;width:14px;height:14px;font-size:10px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;line-height:1;z-index:99999}#ccalendar-toolbar{position:relative}#ccalendar-header{box-shadow:0 2px 12px #00000012;position:relative}#ccalendar-header:after{content:"";position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--cc-gradient);opacity:.55;pointer-events:none}#ccalendar-nav .MuiTypography-h6{background:var(--cc-gradient);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;font-weight:700!important}#ccalendar-toolbar .MuiButton-outlined:not([disabled]),#ccalendar-nav .MuiButton-outlined:not([disabled]){border:1.5px solid transparent!important;background:linear-gradient(var(--bg),var(--bg)) padding-box,var(--cc-gradient) border-box!important;transition:box-shadow .15s ease!important}#ccalendar-toolbar .MuiButton-outlined:not([disabled]):hover,#ccalendar-nav .MuiButton-outlined:not([disabled]):hover{background:linear-gradient(var(--fc-today-bg-color),var(--fc-today-bg-color)) padding-box,var(--cc-gradient) border-box!important;box-shadow:0 0 8px 1px var(--cc-glow-purple)!important}.month-day-cell.fc-day-today{background-image:linear-gradient(135deg,#3b82f612,#8b5cf612,#06b6d40d)}.courtdate-event,.adjournment-event,.multipledate-event{border-radius:4px!important;transition:filter .12s ease,box-shadow .12s ease!important}.courtdate-event:hover,.adjournment-event:hover,.multipledate-event:hover{filter:brightness(1.1)!important;box-shadow:0 2px 10px #0000004d!important;z-index:5}#event-tooltip{border:1.5px solid transparent!important;background:linear-gradient(var(--text),var(--text)) padding-box,var(--cc-gradient) border-box!important;box-shadow:0 0 14px 2px #8b5cf638,0 4px 18px #00000047!important;border-radius:10px!important;padding:0!important;font-size:16px!important;font-family:Roboto,Helvetica,Arial,sans-serif!important;min-width:240px!important;max-width:340px!important}#event-tooltip .tt-card{padding:14px 16px}#event-tooltip .tt-title{font-size:17px;font-weight:700;line-height:1.3;margin-bottom:4px}#event-tooltip .tt-date{font-size:15px;opacity:.7;margin-bottom:8px}#event-tooltip .tt-badge{display:inline-block;padding:3px 9px;border-radius:4px;font-size:13px;font-weight:600;letter-spacing:.03em;margin-bottom:8px}#event-tooltip .tt-badge--blue{background:#3b82f659}#event-tooltip .tt-badge--purple{background:#8b5cf659}#event-tooltip .tt-badge--amber{background:#f59e0b59}#event-tooltip .tt-badge--cyan{background:#06b6d459}#event-tooltip .tt-badge--red{background:#dc262659}#event-tooltip .tt-divider{height:1px;background:#80808047;margin:8px 0}#event-tooltip .tt-grid{display:grid;grid-template-columns:auto 1fr;gap:6px 14px;font-size:15px}#event-tooltip .tt-label{opacity:.58;white-space:nowrap;line-height:1.5}#event-tooltip .tt-value{font-weight:500;line-height:1.5}#event-tooltip .tt-footer{font-size:13px;opacity:.42;text-align:center;margin-top:8px;padding-top:6px;border-top:1px solid rgba(128,128,128,.22)}#ccalendar-nav .MuiToggleButtonGroup-root .MuiToggleButton-root{color:#1976d2;border:1.5px solid transparent!important;background:linear-gradient(var(--bg),var(--bg)) padding-box,var(--cc-gradient) border-box!important;transition:box-shadow .15s ease!important}#ccalendar-nav .MuiToggleButtonGroup-root .MuiToggleButton-root:hover{color:#1976d2!important;background:linear-gradient(var(--fc-today-bg-color),var(--fc-today-bg-color)) padding-box,var(--cc-gradient) border-box!important;box-shadow:0 0 8px 1px var(--cc-glow-purple)!important}#ccalendar-nav .MuiToggleButtonGroup-root .MuiToggleButton-root.Mui-selected{background:linear-gradient(var(--fc-today-bg-color),var(--fc-today-bg-color)) padding-box,var(--cc-gradient) border-box!important}#ccalendar-nav .MuiToggleButtonGroup-root .MuiToggleButton-root:not(.Mui-selected){color:#4397ecde}#ccalendar-toolbar .MuiToggleButton-root:hover:not(.Mui-selected){background-color:var(--fc-today-bg-color)!important}#ccalendar-toolbar .cc-more-btn-open{border:1.5px solid transparent!important;background:linear-gradient(var(--bg),var(--bg)) padding-box,var(--cc-gradient) border-box!important}.modal-footer .MuiButton-containedPrimary{background-image:var(--cc-gradient)!important;box-shadow:0 0 10px 1px var(--cc-glow-purple),0 2px 6px #0000002e!important;transition:opacity .15s ease,box-shadow .15s ease!important}.modal-footer .MuiButton-containedPrimary:hover:not([disabled]){background-image:var(--cc-gradient)!important;opacity:.9;box-shadow:0 0 16px 2px var(--cc-glow-purple),0 2px 8px #00000038!important}.modal-footer .MuiButton-containedPrimary{text-shadow:0 1px 3px rgba(0,0,0,.35)!important}@page{size:landscape;margin:.5in}@media print{#ccalendar-container>.MuiStack-root:first-child,#event-tooltip,.ReactModal__Overlay,.MuiDataGrid-footerContainer{display:none!important}#ccalendar-container{width:100%!important;overflow:visible!important;padding-top:10px}.fc.fc-media-screen,.fc .fc-scrollgrid,.fc .fc-scrollgrid-section>td,.fc .fc-daygrid-body,.fc table{width:100%!important;max-width:100%!important}.fc .fc-scrollgrid{overflow:visible!important}.fc colgroup col{width:auto!important}.fc-daygrid-day-events{max-height:none!important;min-height:auto!important;overflow:visible!important}.month-day-cell{height:auto!important}#ccalendar-container .MuiDataGrid-root{height:auto!important;max-height:none!important}#ccalendar-container .MuiDataGrid-virtualScroller{overflow:visible!important;height:auto!important}*{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}}@keyframes cc-crt-body{0%{transform:translate(0);filter:none;opacity:1}3%{filter:brightness(.85);opacity:.85}6%{filter:none;opacity:1}9%{filter:brightness(1.12);opacity:.75}12%{transform:translate(0);filter:none;opacity:1}15%{transform:translate(0);filter:blur(.5px) hue-rotate(80deg) brightness(.95);opacity:.95}18%{transform:translate(-3px) skew(-1.5deg);filter:blur(1px) hue-rotate(100deg) saturate(1.5);opacity:.9}22%{transform:translate(3px) skew(1.5deg);filter:blur(.5px) hue-rotate(90deg) brightness(1.1);opacity:.95}25%{transform:translate(0);filter:blur(1.5px) hue-rotate(110deg) saturate(1.8);opacity:.85}28%{transform:translate(-5px,1px) skew(-2deg);filter:blur(2px) hue-rotate(130deg) contrast(1.3);opacity:.8}31%{transform:translate(5px,-1px) skew(2deg);filter:blur(1px) hue-rotate(90deg) brightness(1.2);opacity:.88}35%{transform:translate(0);filter:blur(2px) hue-rotate(100deg) saturate(1.2);opacity:.75}38%{transform:translate(-8px,2px) skew(-4deg);filter:blur(3px) hue-rotate(160deg) contrast(1.6);opacity:.6}39%{transform:translate(8px,-2px) skew(4deg);filter:blur(1.5px) hue-rotate(60deg) brightness(1.4);opacity:.75}43%{transform:translate(-2px,1px);filter:blur(3.5px) grayscale(.2) saturate(.8);opacity:.65}47%{filter:blur(2px) brightness(.35);opacity:.18}50%{transform:translate(0);filter:blur(4px) grayscale(.4) contrast(1.4);opacity:.7}53%{transform:translate(-6px,2px) skew(-3deg);filter:blur(3px) grayscale(.3) hue-rotate(180deg);opacity:.55}55%{transform:translate(6px,-2px) skew(3deg);filter:blur(2px) brightness(1.5) contrast(1.8);opacity:.7}58%{transform:translate(0);filter:blur(5px) grayscale(.6) brightness(.6);opacity:.5}60%{filter:blur(4px) brightness(.25);opacity:.12}62%{filter:blur(3px) brightness(1.2);opacity:.6}65%{transform:translate(-10px,3px) skew(-5deg);filter:blur(6px) grayscale(.7) contrast(1.5);opacity:.45}66%{transform:translate(10px,-3px) skew(5deg);filter:blur(3px) grayscale(.5) brightness(1.8);opacity:.6}70%{transform:translate(-4px,2px);filter:blur(7px) grayscale(.8) saturate(.2);opacity:.35}73%{filter:blur(6px) brightness(.18);opacity:.08}75%{transform:translate(0);filter:blur(6px) grayscale(.85) brightness(.5);opacity:.4}78%{transform:translate(-12px,4px) skew(-6deg);filter:blur(8px) grayscale(.9) contrast(2);opacity:.3}79%{transform:translate(12px,-4px) skew(6deg);filter:blur(4px) grayscale(.7) brightness(1.6);opacity:.45}84%{transform:translate(-3px,1px);filter:blur(9px) grayscale(.95) brightness(.35);opacity:.2}88%{filter:blur(8px) brightness(.08);opacity:.04}90%{transform:translate(0);filter:blur(10px) grayscale(1) brightness(.25);opacity:.14}95%{transform:translate(0);filter:blur(12px) grayscale(1) brightness(.1);opacity:.05}to{transform:translate(0);filter:blur(14px) grayscale(1) brightness(0);opacity:0}}@keyframes cc-crt-scanlines{0%{opacity:0;background-position-y:0px}14%{opacity:0;background-position-y:0px}22%{opacity:.28;background-position-y:-4px}42%{opacity:.5;background-position-y:-18px}67%{opacity:.72;background-position-y:-42px}88%{opacity:.88;background-position-y:-66px}to{opacity:1;background-position-y:-84px}}@keyframes cc-crt-vignette{0%{opacity:0}22%{opacity:.25}to{opacity:.88}}.cc-glitch-active{position:relative;animation:cc-crt-body 2s linear forwards;pointer-events:none;overflow:hidden}.cc-glitch-active:before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(to bottom,transparent 0px,transparent 2px,rgba(0,0,0,.1) 2px,rgba(0,0,0,.1) 4px);z-index:9999;pointer-events:none;animation:cc-crt-scanlines 2s linear forwards}.cc-glitch-active:after{content:"";position:absolute;inset:0;background:radial-gradient(ellipse at center,transparent 55%,rgba(0,0,0,.6) 100%);z-index:9998;pointer-events:none;animation:cc-crt-vignette 2s linear forwards}@keyframes cc-humphrey-appear{0%{color:transparent;text-shadow:none;opacity:0;transform:skew(0)}4%{color:red;text-shadow:0 0 30px #ff0000,0 0 60px #ff0000;opacity:.9;transform:skew(-8deg)}6%{color:transparent;text-shadow:none;opacity:0;transform:skew(0)}9%{color:red;text-shadow:0 0 20px #ff0000;opacity:.7;transform:skew(5deg)}11%{color:transparent;text-shadow:none;opacity:0;transform:skew(0)}14%{color:#ff2020;text-shadow:2px 0 0 #ff0000,-2px 0 0 #00ffff;opacity:1;transform:skew(-4deg)}17%{color:#dc143c;text-shadow:0 0 12px #dc143c;opacity:.4;transform:skew(2deg)}20%{color:#ff2020;text-shadow:4px 0 0 #ff0000,-4px 0 0 #00ffff;opacity:1;transform:skew(-6deg)}23%{color:transparent;text-shadow:none;opacity:0;transform:skew(0)}26%{color:#ff2020;text-shadow:0 0 8px #ff0000;opacity:.8;transform:skew(3deg)}30%{color:#ff2020;text-shadow:3px 0 0 #ff0000,-3px 0 0 #00ffff;opacity:1;transform:skew(-3deg)}34%{color:#dc143c;text-shadow:0 0 6px #dc143c,0 0 14px #dc143c50;opacity:.6;transform:skew(0)}38%{color:#ff2020;text-shadow:1px 0 0 #ff0000,-1px 0 0 #00ffff;opacity:1;transform:skew(-2deg)}43%{color:transparent;text-shadow:none;opacity:0;transform:skew(0)}45%{color:#ff1010;text-shadow:0 0 10px #ff0000;opacity:.9;transform:skew(4deg)}48%{color:#dc143c;text-shadow:0 0 4px #dc143c;opacity:.7;transform:skew(-1deg)}53%{color:#ff2020;text-shadow:2px 0 0 #ff0000,-2px 0 0 #00ffff;opacity:1;transform:skew(2deg)}57%{color:#dc143c;text-shadow:0 0 6px #dc143c;opacity:.85;transform:skew(0)}63%{color:transparent;text-shadow:none;opacity:0}65%{color:#dc143c;text-shadow:0 0 8px #dc143c,0 0 18px #dc143c60;opacity:1;transform:skew(-1deg)}72%{color:#dc143c;text-shadow:0 0 3px #dc143c;opacity:.9;transform:skew(0)}78%{opacity:.7}84%{color:#dc143c;text-shadow:0 0 5px #dc143c,0 0 10px #dc143c70;opacity:1}91%{opacity:.85}to{color:#dc143c;text-shadow:0 0 3px #dc143c,0 0 8px #dc143c90;opacity:1;transform:skew(0)}}.cc-humphrey{display:inline-block;animation:cc-humphrey-appear 1.6s steps(1,end) forwards}@keyframes cc-crt-flicker{0%,18%,22%,24%,53%,57%,to{opacity:1}20%,55%{opacity:.91}23%{opacity:.95}56%{opacity:.93}}@keyframes cc-crt-scanroll{0%{background-position-y:0}to{background-position-y:4px}}.cc-crt-ambient{position:relative;overflow:hidden;animation:cc-crt-flicker 7s linear infinite}.cc-crt-ambient:before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(to bottom,transparent 0px,transparent 2px,rgba(0,0,0,.07) 2px,rgba(0,0,0,.07) 4px);pointer-events:none;z-index:9999;animation:cc-crt-scanroll .18s linear infinite}.cc-crt-ambient:after{content:"";position:absolute;inset:0;background:radial-gradient(ellipse at center,transparent 55%,rgba(0,0,0,.42) 100%);pointer-events:none;z-index:9998}.cc-crt-in{position:relative;overflow:hidden;animation:cc-crt-body 2s linear reverse both}.cc-crt-in:before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(to bottom,transparent 0px,transparent 2px,rgba(0,0,0,.1) 2px,rgba(0,0,0,.1) 4px);z-index:9999;pointer-events:none;animation:cc-crt-scanlines 2s linear reverse both}.cc-crt-in:after{content:"";position:absolute;inset:0;background:radial-gradient(ellipse at center,transparent 55%,rgba(0,0,0,.6) 100%);z-index:9998;pointer-events:none;animation:cc-crt-vignette 2s linear reverse both}
|
|
@@ -23,6 +23,8 @@ export interface CalEvent {
|
|
|
23
23
|
casesLoaded: boolean;
|
|
24
24
|
source: CourtDate;
|
|
25
25
|
}
|
|
26
|
+
/** 'YYYY-MM-DD' in local time — the identity of a calendar day, used to bucket by day. */
|
|
27
|
+
export declare function dateToKey(d: Date): string;
|
|
26
28
|
/**
|
|
27
29
|
* Parses a date string from the API as a local date to avoid UTC timezone shifts.
|
|
28
30
|
* "2025-04-15" and "2025-04-15T00:00:00Z" would both land on April 15 locally.
|
|
@@ -11,7 +11,7 @@ export declare function getCourtDate(courtDateId: number, apiKey: string, type?:
|
|
|
11
11
|
* edit-log trail, so both come back empty for negotiation dates rather than throwing.
|
|
12
12
|
*/
|
|
13
13
|
export declare function getCourtDateDetail(courtDateId: number, apiKey: string, type?: DateType): Promise<CourtDateDetail | null>;
|
|
14
|
-
export declare function deleteCourtDate(courtDateId: number, apiKey: string, type?: DateType): Promise<boolean>;
|
|
14
|
+
export declare function deleteCourtDate(courtDateId: number, apiKey: string, type?: DateType, user?: number): Promise<boolean>;
|
|
15
15
|
export declare function createCourtDate(courtDate: Date, muniCode: string, apiKey: string, courtCases?: string[], hearingTime?: string, multipleDates?: Date[], type?: DateType, noticeFiles?: File[], editUser?: number): Promise<number | null>;
|
|
16
16
|
export declare function snoozeUploadDeadline(courtDateId: number, apiKey: string): Promise<boolean>;
|
|
17
17
|
export declare function getDateEditLogs(courtDateId: number, apiKey: string, type?: DateType): Promise<DateEditLog | null>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headers for a mutating request.
|
|
3
|
+
*
|
|
4
|
+
* The API key is shared across the team, so it identifies the *app*, not the person. The
|
|
5
|
+
* backend resolves the caller's roles from `X-User-Id` (see ../../../utility-api/utils/roles.py),
|
|
6
|
+
* so a write that omits it is rejected once role enforcement is on.
|
|
7
|
+
*
|
|
8
|
+
* `userId` is optional because a few callers genuinely have no user — background refreshes
|
|
9
|
+
* and the automated ingest paths. Those are reads, which are never gated; if one turns out
|
|
10
|
+
* to write, the missing header is the symptom to look for.
|
|
11
|
+
*/
|
|
12
|
+
export declare function writeHeaders(apiKey: string, userId?: number, extra?: Record<string, string>): Record<string, string>;
|
|
@@ -6,4 +6,25 @@ export interface HearingOfficer {
|
|
|
6
6
|
}
|
|
7
7
|
export declare function getAllUsers(apiKey: string): Promise<Record<number, User>>;
|
|
8
8
|
export declare function getAllHearingOfficers(apiKey: string): Promise<Record<number, HearingOfficer>>;
|
|
9
|
-
|
|
9
|
+
/** What the signed-in user may do on the calendar. */
|
|
10
|
+
export interface CalendarPermissions {
|
|
11
|
+
/** Add and edit court dates and negotiation dates. An admin always may. */
|
|
12
|
+
canEdit: boolean;
|
|
13
|
+
/** Delete a date, and file a Motion to Preclude with the court. */
|
|
14
|
+
isAdmin: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolve what `userId` may do, from the roles held in `Rules.UserRoles`.
|
|
18
|
+
*
|
|
19
|
+
* Replaces an older check that asked whether the user's *email* was in the
|
|
20
|
+
* `calendar-admin` AWS Cognito group. Keying on the numeric UserID matters twice over:
|
|
21
|
+
* several active users have no email address at all, and `activeUser` already is a
|
|
22
|
+
* UserID — so permissions no longer have to wait for the user list to load before they
|
|
23
|
+
* can resolve.
|
|
24
|
+
*
|
|
25
|
+
* Fails closed on every path. The backend answers 200 with empty roles for a user who
|
|
26
|
+
* simply holds none, so any non-200 here is a genuine fault, and a fault must never read
|
|
27
|
+
* as permission. Comparisons are `=== true` because a `null` or the string `"true"`
|
|
28
|
+
* arriving from a changed backend would otherwise be truthy.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getUserPermissions(userId: number, apiKey: string): Promise<CalendarPermissions>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { CalEvent } from './CalEvent';
|
|
2
|
+
/**
|
|
3
|
+
* How many SCAR hearings the firm can actually staff in one day. Anything scheduled
|
|
4
|
+
* on top of that is flagged rather than hidden — the date is real, it just needs
|
|
5
|
+
* someone's attention.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SCAR_DAILY_LIMIT = 3;
|
|
8
|
+
export interface DayLoad {
|
|
9
|
+
/**
|
|
10
|
+
* `CalEvent.id` → its 1-based position among that day's counted SCAR dates, for the
|
|
11
|
+
* occurrences past the limit only. Absent id = within the limit, or not counted.
|
|
12
|
+
*/
|
|
13
|
+
overflowRank: Map<string, number>;
|
|
14
|
+
/** Day keys ('YYYY-MM-DD') carrying more counted SCAR dates than the limit. */
|
|
15
|
+
overbookedDays: Set<string>;
|
|
16
|
+
/** Day key → counted SCAR dates landing on it. Days with none are absent entirely. */
|
|
17
|
+
scarCountByDay: Map<string, number>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Counts SCAR occurrences per calendar day and marks the ones over the limit.
|
|
21
|
+
*
|
|
22
|
+
* Counts *occurrences*, not court dates: day 2 of a multi-date hearing and an
|
|
23
|
+
* adjournment bucket each take a slot on the day they land on, because each is a
|
|
24
|
+
* hearing someone has to cover. Negotiations and Collections are excluded — they
|
|
25
|
+
* are not SCAR hearings and do not compete for the same staffing.
|
|
26
|
+
*
|
|
27
|
+
* Two things are deliberately not load:
|
|
28
|
+
* - A date whose cases have all settled. The limit is about work to cover, not rooms
|
|
29
|
+
* booked, so a settled-out date takes no slot and is never itself flagged.
|
|
30
|
+
* - A date with no cases at all — same reasoning, nothing to appear for.
|
|
31
|
+
*
|
|
32
|
+
* @param events Only the events that survive the active filters. Counting hidden
|
|
33
|
+
* dates would paint a day red with nothing red on it to explain why.
|
|
34
|
+
*/
|
|
35
|
+
export declare function computeDayLoad(events: CalEvent[], limit?: number): DayLoad;
|
|
@@ -41,6 +41,8 @@ export interface EventTitleOptions {
|
|
|
41
41
|
unsettled?: number;
|
|
42
42
|
/** Leading verb for derived events, e.g. 'Upload' or 'Can Preclude'. */
|
|
43
43
|
prefix?: string;
|
|
44
|
+
/** This occurrence sits past the day's SCAR limit — see helpers/dayLoad.ts. */
|
|
45
|
+
overbooked?: boolean;
|
|
44
46
|
}
|
|
45
47
|
/**
|
|
46
48
|
* The FullCalendar event title.
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Case, CourtDate, CalendarFilterCtx } from '../types';
|
|
2
|
+
import { CalEvent } from '../helpers/CalEvent';
|
|
2
3
|
import { EventSourceInput, EventMountArg, Calendar } from '@fullcalendar/core/index.js';
|
|
3
4
|
/**
|
|
4
5
|
* Derives FullCalendar event objects from court dates, cases, and filter state.
|
|
@@ -34,7 +35,8 @@ export declare function useCalendarEvents({ courtDates, allCases, apiKey, modalI
|
|
|
34
35
|
filterCtx: CalendarFilterCtx;
|
|
35
36
|
}): {
|
|
36
37
|
events: EventSourceInput;
|
|
37
|
-
filteredDates:
|
|
38
|
+
filteredDates: CalEvent[];
|
|
39
|
+
overbookedDays: Set<string>;
|
|
38
40
|
handleEventMount: (info: EventMountArg, calendarApi: Calendar | null) => void;
|
|
39
41
|
getEventTooltipHtml: (eventId: string) => string;
|
|
40
42
|
firstSearchResultId: number | null;
|