Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • komasolver
  • main
  • renovate/django-5.x
  • renovate/django-debug-toolbar-5.x
  • renovate/django_csp-4.x
  • renovate/djangorestframework-3.x
  • renovate/sphinxcontrib-apidoc-0.x
  • renovate/tzdata-2025.x
  • renovate/uwsgi-2.x
9 results

Target

Select target project
  • konstantin/akplanning
  • matedealer/akplanning
  • kif/akplanning
  • mirco/akplanning
  • lordofthevoid/akplanning
  • voidptr/akplanning
  • xayomer/akplanning-fork
  • mollux/akplanning
  • neumantm/akplanning
  • mmarx/akplanning
  • nerf/akplanning
  • felix_bonn/akplanning
  • sebastian.uschmann/akplanning
13 results
Select Git revision
  • ak-import
  • feature/clear-schedule-button
  • feature/json-export-via-rest-framework
  • feature/json-schedule-import-tests
  • feature/preference-polling
  • feature/preference-polling-form
  • feature/preference-polling-form-rebased
  • feature/preference-polling-rebased
  • fix/add-room-import-only-once
  • main
  • merge-to-upstream
  • renovate/django-5.x
  • renovate/django-debug-toolbar-4.x
  • renovate/django-simple-history-3.x
  • renovate/mysqlclient-2.x
15 results
Show changes
Showing
with 0 additions and 4600 deletions
/*!
FullCalendar Moment Plugin v4.3.0
Docs & License: https://fullcalendar.io/
(c) 2019 Adam Shaw
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('moment'), require('@fullcalendar/core')) :
typeof define === 'function' && define.amd ? define(['exports', 'moment', '@fullcalendar/core'], factory) :
(global = global || self, factory(global.FullCalendarMoment = {}, global.moment, global.FullCalendar));
}(this, function (exports, momentNs, core) { 'use strict';
var moment = momentNs; // the directly callable function
function toMoment(date, calendar) {
if (!(calendar instanceof core.Calendar)) {
throw new Error('must supply a Calendar instance');
}
return convertToMoment(date, calendar.dateEnv.timeZone, null, calendar.dateEnv.locale.codes[0]);
}
function toDuration(fcDuration) {
return moment.duration(fcDuration); // moment accepts all the props that fc.Duration already has!
}
function formatWithCmdStr(cmdStr, arg) {
var cmd = parseCmdStr(cmdStr);
if (arg.end) {
var startMom = convertToMoment(arg.start.array, arg.timeZone, arg.start.timeZoneOffset, arg.localeCodes[0]);
var endMom = convertToMoment(arg.end.array, arg.timeZone, arg.end.timeZoneOffset, arg.localeCodes[0]);
return formatRange(cmd, createMomentFormatFunc(startMom), createMomentFormatFunc(endMom), arg.separator);
}
return convertToMoment(arg.date.array, arg.timeZone, arg.date.timeZoneOffset, arg.localeCodes[0]).format(cmd.whole); // TODO: test for this
}
var main = core.createPlugin({
cmdFormatter: formatWithCmdStr
});
function createMomentFormatFunc(mom) {
return function (cmdStr) {
return cmdStr ? mom.format(cmdStr) : ''; // because calling with blank string results in ISO8601 :(
};
}
function convertToMoment(input, timeZone, timeZoneOffset, locale) {
var mom;
if (timeZone === 'local') {
mom = moment(input);
}
else if (timeZone === 'UTC') {
mom = moment.utc(input);
}
else if (moment.tz) {
mom = moment.tz(input, timeZone);
}
else {
mom = moment.utc(input);
if (timeZoneOffset != null) {
mom.utcOffset(timeZoneOffset);
}
}
mom.locale(locale);
return mom;
}
function parseCmdStr(cmdStr) {
var parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
if (parts) {
var middle = parseCmdStr(parts[2]);
return {
head: parts[1],
middle: middle,
tail: parts[3],
whole: parts[1] + middle.whole + parts[3]
};
}
else {
return {
head: null,
middle: null,
tail: null,
whole: cmdStr
};
}
}
function formatRange(cmd, formatStart, formatEnd, separator) {
if (cmd.middle) {
var startHead = formatStart(cmd.head);
var startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
var startTail = formatStart(cmd.tail);
var endHead = formatEnd(cmd.head);
var endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
var endTail = formatEnd(cmd.tail);
if (startHead === endHead && startTail === endTail) {
return startHead +
(startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
startTail;
}
}
var startWhole = formatStart(cmd.whole);
var endWhole = formatEnd(cmd.whole);
if (startWhole === endWhole) {
return startWhole;
}
else {
return startWhole + separator + endWhole;
}
}
exports.default = main;
exports.toDuration = toDuration;
exports.toMoment = toMoment;
Object.defineProperty(exports, '__esModule', { value: true });
}));
/*!
FullCalendar Moment Plugin v4.3.0
Docs & License: https://fullcalendar.io/
(c) 2019 Adam Shaw
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("moment"),require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","moment","@fullcalendar/core"],t):t((e=e||self).FullCalendarMoment={},e.moment,e.FullCalendar)}(this,function(e,t,n){"use strict";var r=t;var a=n.createPlugin({cmdFormatter:function(e,t){var n=function e(t){var n=t.match(/^(.*?)\{(.*)\}(.*)$/);if(n){var r=e(n[2]);return{head:n[1],middle:r,tail:n[3],whole:n[1]+r.whole+n[3]}}return{head:null,middle:null,tail:null,whole:t}}(e);if(t.end){var r=l(t.start.array,t.timeZone,t.start.timeZoneOffset,t.localeCodes[0]),a=l(t.end.array,t.timeZone,t.end.timeZoneOffset,t.localeCodes[0]);return function e(t,n,r,a){if(t.middle){var o=n(t.head),l=e(t.middle,n,r,a),u=n(t.tail),i=r(t.head),d=e(t.middle,n,r,a),f=r(t.tail);if(o===i&&u===f)return o+(l===d?l:l+a+d)+u}var c=n(t.whole),m=r(t.whole);return c===m?c:c+a+m}(n,o(r),o(a),t.separator)}return l(t.date.array,t.timeZone,t.date.timeZoneOffset,t.localeCodes[0]).format(n.whole)}});function o(e){return function(t){return t?e.format(t):""}}function l(e,t,n,a){var o;return"local"===t?o=r(e):"UTC"===t?o=r.utc(e):r.tz?o=r.tz(e,t):(o=r.utc(e),null!=n&&o.utcOffset(n)),o.locale(a),o}e.default=a,e.toDuration=function(e){return r.duration(e)},e.toMoment=function(e,t){if(!(t instanceof n.Calendar))throw new Error("must supply a Calendar instance");return l(e,t.dateEnv.timeZone,null,t.dateEnv.locale.codes[0])},Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
{
"name": "@fullcalendar/moment",
"version": "4.3.0",
"title": "FullCalendar Moment Plugin",
"description": "A connector to the MomentJS date library",
"keywords": [
"calendar",
"event",
"full-sized"
],
"homepage": "https://fullcalendar.io/",
"docs": "https://fullcalendar.io/docs/moment-plugins",
"bugs": "https://fullcalendar.io/reporting-bugs",
"repository": {
"type": "git",
"url": "https://github.com/fullcalendar/fullcalendar.git",
"homepage": "https://github.com/fullcalendar/fullcalendar"
},
"license": "MIT",
"author": {
"name": "Adam Shaw",
"email": "arshaw@arshaw.com",
"url": "http://arshaw.com/"
},
"copyright": "2019 Adam Shaw",
"peerDependencies": {
"@fullcalendar/core": "~4.3.0",
"moment": "^2.24.0"
},
"main": "main.js",
"module": "main.esm.js",
"unpkg": "main.min.js",
"types": "main.d.ts"
}
For complete licensing information, visit:
http://fullcalendar.io/scheduler/license
FullCalendar Scheduler is tri-licensed, meaning you must choose
one of three licenses to use. Here is a summary of those licenses:
- Commercial License
(a paid license, meant for commercial use)
http://fullcalendar.io/scheduler/license-details
- Creative Commons Non-Commercial No-Derivatives
(meant for trial and non-commercial use)
https://creativecommons.org/licenses/by-nc-nd/4.0/
- GPLv3 License
(meant for open-source projects)
http://www.gnu.org/licenses/gpl-3.0.en.html
# FullCalendar Resources Common Plugin
Offers base support for resources. Required for all resource-related plugins.
[View the docs »](https://fullcalendar.io/docs/scheduler)
This package was created from the [FullCalendar monorepo »](https://github.com/fullcalendar/fullcalendar-scheduler)
// Generated by dts-bundle v0.7.3-fork.1
// Dependencies for this module:
// ambient.d.ts
declare module '@fullcalendar/resource-common' {
import '@fullcalendar/resource-common/ambient';
import '@fullcalendar/resource-common/api/EventApi';
import '@fullcalendar/resource-common/resource-sources/resource-array';
import '@fullcalendar/resource-common/resource-sources/resource-func';
import '@fullcalendar/resource-common/resource-sources/resource-json-feed';
const _default: import("@fullcalendar/core").PluginDef;
export default _default;
export { default as ResourceDayHeader } from '@fullcalendar/resource-common/common/ResourceDayHeader';
export { VResourceJoiner, AbstractResourceDayTable, ResourceDayTable, DayResourceTable, VResourceSplitter } from '@fullcalendar/resource-common/common/resource-day-table';
export { Resource, ResourceHash } from '@fullcalendar/resource-common/structs/resource';
export { ResourceViewProps } from '@fullcalendar/resource-common/View';
export { flattenResources, Group, isGroupsEqual, GroupNode, ResourceNode, buildRowNodes, buildResourceFields } from '@fullcalendar/resource-common/common/resource-hierarchy';
export { buildResourceTextFunc } from '@fullcalendar/resource-common/common/resource-rendering';
export { default as ResourceApi } from '@fullcalendar/resource-common/api/ResourceApi';
export { default as ResourceSplitter } from '@fullcalendar/resource-common/common/ResourceSplitter';
}
declare module '@fullcalendar/resource-common/ambient' {
import ResourceApi from '@fullcalendar/resource-common/api/ResourceApi';
import {ResourceSource, ResourceSourceInput} from '@fullcalendar/resource-common/structs/resource-source';
import {View} from '@fullcalendar/core';
import {ResourceHash} from '@fullcalendar/resource-common/structs/resource';
import {ResourceEntityExpansions} from '@fullcalendar/resource-common/reducers/resourceEntityExpansions';
import {ResourceAction} from '@fullcalendar/resource-common/reducers/resources';
module '@fullcalendar/core' {
interface Calendar {
addResource(input: ResourceSourceInput): ResourceApi;
getResourceById(id: string): ResourceApi | null;
getResources(): ResourceApi[];
getTopLevelResources(): ResourceApi[];
rerenderResources(): void;
refetchResources(): void;
}
interface Calendar {
dispatch(action: ResourceAction): any;
}
interface CalendarState {
resourceSource?: ResourceSource | null;
resourceStore?: ResourceHash;
resourceEntityExpansions?: ResourceEntityExpansions;
}
interface OptionsInput {
schedulerLicenseKey?: string;
resources?: ResourceSourceInput;
resourceLabelText?: string;
resourceOrder?: any;
filterResourcesWithEvents?: any;
resourceText?: any;
resourceGroupField?: any;
resourceGroupText?: any;
resourceAreaWidth?: any;
resourceColumns?: any;
resourcesInitiallyExpanded?: any;
slotWidth?: any;
datesAboveResources?: any;
eventResourceEditable?: boolean;
refetchResourcesOnNavigate?: boolean;
resourceRender?(arg: {
resource: ResourceApi;
el: HTMLElement;
view: View;
}): void;
}
interface DatePointApi {
resource?: ResourceApi;
}
interface DateSpanApi {
resource?: ResourceApi;
}
interface EventMutation {
resourceMutation?: {
matchResourceId: string;
setResourceId: string;
};
}
interface EventApi {
getResources: () => ResourceApi[];
setResources: (resources: (string | ResourceApi)[]) => void;
}
interface EventDef {
resourceIds: string[];
resourceEditable: boolean;
}
}
}
declare module '@fullcalendar/resource-common/api/EventApi' {
import '@fullcalendar/resource-common/ambient';
}
declare module '@fullcalendar/resource-common/resource-sources/resource-array' {
export {};
}
declare module '@fullcalendar/resource-common/resource-sources/resource-func' {
import {ResourceSourceError} from '@fullcalendar/resource-common/structs/resource-source';
import {ResourceInput} from '@fullcalendar/resource-common/structs/resource';
export type ResourceFunc = (arg: {
start: Date;
end: Date;
timeZone: string;
}, successCallback: (events: ResourceInput[]) => void, failureCallback: (errorObj: ResourceSourceError) => void) => any;
}
declare module '@fullcalendar/resource-common/resource-sources/resource-json-feed' {
export {};
}
declare module '@fullcalendar/resource-common/common/ResourceDayHeader' {
import {Component, ComponentContext, DateFormatter, DateMarker, DateProfile} from '@fullcalendar/core';
import {Resource} from '@fullcalendar/resource-common/structs/resource';
export interface ResourceDayHeaderProps {
dates: DateMarker[];
dateProfile: DateProfile;
datesRepDistinctDays: boolean;
resources: Resource[];
renderIntroHtml?: () => string;
}
export {ResourceDayHeader as default, ResourceDayHeader};
class ResourceDayHeader extends Component<ResourceDayHeaderProps> {
datesAboveResources: boolean;
resourceTextFunc: (resource: Resource) => string;
dateFormat: DateFormatter;
el: HTMLElement;
thead: HTMLElement;
constructor(context: ComponentContext, parentEl: HTMLElement);
destroy(): void;
render(props: ResourceDayHeaderProps): void;
renderResourceRow(resources: Resource[]): string;
renderDayAndResourceRows(dates: DateMarker[], resources: Resource[]): string;
renderResourceAndDayRows(resources: Resource[], dates: DateMarker[]): string;
renderResourceCell(resource: Resource, colspan: number, date?: DateMarker): string;
renderDateCell(date: DateMarker, colspan: number, resource?: Resource): string;
buildTr(cellHtmls: string[]): string;
processResourceEls(resources: Resource[]): void;
}
}
declare module '@fullcalendar/resource-common/common/resource-day-table' {
import {
DateSpan,
DayTable,
DayTableCell,
EventDef,
EventSegUiInteractionState,
Seg,
SlicedProps,
SplittableProps,
Splitter
} from '@fullcalendar/core';
import {Resource} from '@fullcalendar/resource-common/structs/resource';
export interface ResourceDayTableCell extends DayTableCell {
resource: Resource;
}
export abstract class AbstractResourceDayTable {
cells: ResourceDayTableCell[][];
rowCnt: number;
colCnt: number;
dayTable: DayTable;
resources: Resource[];
resourceIndex: ResourceIndex;
constructor(dayTable: DayTable, resources: Resource[]);
abstract computeCol(dateI: any, resourceI: any): number;
abstract computeColRanges(dateStartI: any, dateEndI: any, resourceI: any): {
firstCol: number;
lastCol: number;
isStart: boolean;
isEnd: boolean;
}[];
buildCells(): ResourceDayTableCell[][];
}
export class ResourceDayTable extends AbstractResourceDayTable {
computeCol(dateI: any, resourceI: any): any;
computeColRanges(dateStartI: any, dateEndI: any, resourceI: any): {
firstCol: any;
lastCol: any;
isStart: boolean;
isEnd: boolean;
}[];
}
export class DayResourceTable extends AbstractResourceDayTable {
computeCol(dateI: any, resourceI: any): any;
computeColRanges(dateStartI: any, dateEndI: any, resourceI: any): any[];
}
export class ResourceIndex {
indicesById: {
[resourceId: string]: number;
};
ids: string[];
length: number;
constructor(resources: Resource[]);
}
export interface VResourceProps extends SplittableProps {
resourceDayTable: AbstractResourceDayTable;
}
export class VResourceSplitter extends Splitter<VResourceProps> {
getKeyInfo(props: VResourceProps): any;
getKeysForDateSpan(dateSpan: DateSpan): string[];
getKeysForEventDef(eventDef: EventDef): string[];
}
export abstract class VResourceJoiner<SegType extends Seg> {
joinProps(propSets: {
[resourceId: string]: SlicedProps<SegType>;
}, resourceDayTable: AbstractResourceDayTable): SlicedProps<SegType>;
joinSegs(resourceDayTable: AbstractResourceDayTable, ...segGroups: SegType[][]): SegType[];
expandSegs(resourceDayTable: AbstractResourceDayTable, segs: SegType[]): any[];
joinInteractions(resourceDayTable: AbstractResourceDayTable, ...interactions: EventSegUiInteractionState[]): EventSegUiInteractionState;
abstract transformSeg(seg: SegType, resourceDayTable: AbstractResourceDayTable, resourceI: number): SegType[];
}
}
declare module '@fullcalendar/resource-common/structs/resource' {
import {AllowFunc, BusinessHoursInput, Calendar, ConstraintInput, EventStore, EventUi} from '@fullcalendar/core';
export interface ResourceInput {
id?: string;
parentId?: string;
children?: ResourceInput[];
title?: string;
businessHours?: BusinessHoursInput;
eventEditable?: boolean;
eventStartEditable?: boolean;
eventDurationEditable?: boolean;
eventConstraint?: ConstraintInput;
eventOverlap?: boolean;
eventAllow?: AllowFunc;
eventClassName?: string[] | string;
eventClassNames?: string[] | string;
eventBackgroundColor?: string;
eventBorderColor?: string;
eventTextColor?: string;
eventColor?: string;
extendedProps?: {
[extendedProp: string]: any;
};
[otherProp: string]: any;
}
export interface Resource {
id: string;
parentId: string;
title: string;
businessHours: EventStore | null;
ui: EventUi;
extendedProps: {
[extendedProp: string]: any;
};
}
export type ResourceHash = {
[resourceId: string]: Resource;
};
export function parseResource(input: ResourceInput, parentId: string, store: ResourceHash, calendar: Calendar): Resource;
export function getPublicId(id: string): string;
}
declare module '@fullcalendar/resource-common/View' {
import {
CalendarComponentProps,
DateRange,
EventDef,
EventDefHash,
EventStore,
EventUi,
EventUiHash,
View,
ViewProps,
ViewPropsTransformer,
ViewSpec
} from '@fullcalendar/core';
import {ResourceHash} from '@fullcalendar/resource-common/structs/resource';
import {ResourceEntityExpansions} from '@fullcalendar/resource-common/reducers/resourceEntityExpansions';
export interface ResourceViewProps extends ViewProps {
resourceStore: ResourceHash;
resourceEntityExpansions: ResourceEntityExpansions;
}
export class ResourceDataAdder implements ViewPropsTransformer {
filterResources: typeof filterResources;
transform(viewProps: ViewProps, viewSpec: ViewSpec, calendarProps: CalendarComponentProps, view: View): {
resourceStore: ResourceHash;
resourceEntityExpansions: ResourceEntityExpansions;
};
}
function filterResources(resourceStore: ResourceHash, doFilterResourcesWithEvents: boolean, eventStore: EventStore, activeRange: DateRange): ResourceHash;
export class ResourceEventConfigAdder implements ViewPropsTransformer {
buildResourceEventUis: typeof buildResourceEventUis;
injectResourceEventUis: typeof injectResourceEventUis;
transform(viewProps: ViewProps, viewSpec: ViewSpec, calendarProps: CalendarComponentProps): {
eventUiBases: {
[key: string]: EventUi;
};
};
}
function buildResourceEventUis(resourceStore: ResourceHash): {
[key: string]: EventUi;
};
function injectResourceEventUis(eventUiBases: EventUiHash, eventDefs: EventDefHash, resourceEventUis: EventUiHash): {
[key: string]: EventUi;
};
export function transformIsDraggable(val: boolean, eventDef: EventDef, eventUi: EventUi, view: View): boolean;
export {};
}
declare module '@fullcalendar/resource-common/common/resource-hierarchy' {
import {Resource, ResourceHash} from '@fullcalendar/resource-common/structs/resource';
import {ResourceEntityExpansions} from '@fullcalendar/resource-common/reducers/resourceEntityExpansions';
export interface Group {
value: any;
spec: any;
}
export interface GroupNode {
id: string;
isExpanded: boolean;
group: Group;
}
export interface ResourceNode {
id: string;
rowSpans: number[];
depth: number;
isExpanded: boolean;
hasChildren: boolean;
resource: Resource;
resourceFields: any;
}
export function flattenResources(resourceStore: ResourceHash, orderSpecs: any): Resource[];
export function buildRowNodes(resourceStore: ResourceHash, groupSpecs: any, orderSpecs: any, isVGrouping: boolean, expansions: ResourceEntityExpansions, expansionDefault: boolean): (GroupNode | ResourceNode)[];
export function buildResourceFields(resource: Resource): {
id: string;
parentId: string;
title: string;
businessHours: import("@fullcalendar/core").EventStore;
ui: import("@fullcalendar/core").EventUi;
extendedProps: {
[extendedProp: string]: any;
};
startEditable: boolean;
durationEditable: boolean;
constraints: import("@fullcalendar/core").Constraint[];
overlap: boolean;
allows: import("@fullcalendar/core").AllowFunc[];
backgroundColor: string;
borderColor: string;
textColor: string;
classNames: string[];
};
export function isGroupsEqual(group0: Group, group1: Group): boolean;
}
declare module '@fullcalendar/resource-common/common/resource-rendering' {
import {Resource} from '@fullcalendar/resource-common/structs/resource';
export function buildResourceTextFunc(resourceTextSetting: any, calendar: any): (resource: Resource) => any;
}
declare module '@fullcalendar/resource-common/api/ResourceApi' {
import {Calendar, EventApi} from '@fullcalendar/core';
import {Resource} from '@fullcalendar/resource-common/structs/resource';
export {ResourceApi as default, ResourceApi};
class ResourceApi {
_calendar: Calendar;
_resource: Resource;
constructor(calendar: Calendar, rawResource: Resource);
setProp(name: string, value: any): void;
remove(): void;
getParent(): ResourceApi | null;
getChildren(): ResourceApi[];
getEvents(): EventApi[];
readonly id: string;
readonly title: string;
readonly eventConstraint: any;
readonly eventOverlap: any;
readonly eventAllow: any;
readonly eventBackgroundColor: string;
readonly eventBorderColor: string;
readonly eventTextColor: string;
readonly eventClassNames: string[];
readonly extendedProps: any;
}
}
declare module '@fullcalendar/resource-common/common/ResourceSplitter' {
import {DateSpan, EventDef, SplittableProps, Splitter} from '@fullcalendar/core';
import {ResourceHash} from '@fullcalendar/resource-common/structs/resource';
export interface SplittableResourceProps extends SplittableProps {
resourceStore: ResourceHash;
}
export {ResourceSplitter as default, ResourceSplitter};
class ResourceSplitter extends Splitter<SplittableResourceProps> {
getKeyInfo(props: SplittableResourceProps): {
'': {};
};
getKeysForDateSpan(dateSpan: DateSpan): string[];
getKeysForEventDef(eventDef: EventDef): string[];
}
}
declare module '@fullcalendar/resource-common/structs/resource-source' {
import {Calendar, DateRange} from '@fullcalendar/core';
import {ResourceInput} from '@fullcalendar/resource-common/structs/resource';
import {ResourceFunc} from '@fullcalendar/resource-common/resource-sources/resource-func';
export type ResourceSourceError = {
message: string;
xhr?: XMLHttpRequest;
[otherProp: string]: any;
};
export type ResourceFetcher = (arg: {
resourceSource: ResourceSource;
calendar: Calendar;
range: DateRange | null;
}, success: (res: {
rawResources: ResourceInput[];
xhr?: XMLHttpRequest;
}) => void, failure: (error: ResourceSourceError) => void) => void;
export interface ExtendedResourceSourceInput {
id?: string;
resources?: ResourceInput[];
url?: string;
method?: string;
extraParams?: object | (() => object);
}
export type ResourceSourceInput = ResourceInput[] | ExtendedResourceSourceInput | ResourceFunc | string;
export interface ResourceSource {
_raw: any;
sourceId: string;
sourceDefId: number;
meta: any;
publicId: string;
isFetching: boolean;
latestFetchId: string;
fetchRange: DateRange | null;
}
export interface ResourceSourceDef {
ignoreRange?: boolean;
parseMeta: (raw: ResourceSourceInput) => object | null;
fetch: ResourceFetcher;
}
export function registerResourceSourceDef(def: ResourceSourceDef): void;
export function getResourceSourceDef(id: number): ResourceSourceDef;
export function doesSourceIgnoreRange(source: ResourceSource): boolean;
export function parseResourceSource(input: ResourceSourceInput): ResourceSource;
}
declare module '@fullcalendar/resource-common/reducers/resourceEntityExpansions' {
import {ResourceAction} from '@fullcalendar/resource-common/reducers/resources';
export type ResourceEntityExpansions = {
[id: string]: boolean;
};
export function reduceResourceEntityExpansions(expansions: ResourceEntityExpansions, action: ResourceAction): ResourceEntityExpansions;
}
declare module '@fullcalendar/resource-common/reducers/resources' {
import {Action, Calendar, CalendarState, DateRange} from '@fullcalendar/core';
import {ResourceSourceError} from '@fullcalendar/resource-common/structs/resource-source';
import {ResourceHash, ResourceInput} from '@fullcalendar/resource-common/structs/resource';
export type ResourceAction = Action | {
type: 'FETCH_RESOURCE';
} | {
type: 'RECEIVE_RESOURCES';
rawResources: ResourceInput[];
fetchId: string;
fetchRange: DateRange | null;
} | {
type: 'RECEIVE_RESOURCE_ERROR';
error: ResourceSourceError;
fetchId: string;
fetchRange: DateRange | null;
} | {
type: 'ADD_RESOURCE';
resourceHash: ResourceHash;
} | // use a hash because needs to accept children
{
type: 'REMOVE_RESOURCE';
resourceId: string;
} | {
type: 'SET_RESOURCE_PROP';
resourceId: string;
propName: string;
propValue: any;
} | {
type: 'SET_RESOURCE_ENTITY_EXPANDED';
id: string;
isExpanded: boolean;
} | {
type: 'RESET_RESOURCES';
} | {
type: 'RESET_RESOURCE_SOURCE';
resourceSourceInput: any;
} | {
type: 'REFETCH_RESOURCES';
};
export default function (state: CalendarState, action: ResourceAction, calendar: Calendar): {
resourceSource: import("@fullcalendar/resource-common/structs/resource-source").ResourceSource;
resourceStore: ResourceHash;
resourceEntityExpansions: import("@fullcalendar/resource-common/reducers/resourceEntityExpansions").ResourceEntityExpansions;
eventSources: import("@fullcalendar/core").EventSourceHash;
eventSourceLoadingLevel: number;
loadingLevel: number;
viewType: string;
currentDate: Date;
dateProfile: import("@fullcalendar/core").DateProfile;
eventStore: import("@fullcalendar/core").EventStore;
dateSelection: import("@fullcalendar/core").DateSpan;
eventSelection: string;
eventDrag: import("@fullcalendar/core").EventInteractionState;
eventResize: import("@fullcalendar/core").EventInteractionState;
};
}
/*!
FullCalendar Resources Common Plugin v4.3.1
Docs & License: https://fullcalendar.io/scheduler
(c) 2019 Adam Shaw
*/
import {
addDays,
appendToElement,
Calendar,
combineEventUis,
compareByFieldSpecs,
Component,
computeFallbackHeaderFormat,
config,
createFormatter,
createPlugin,
cssToStr,
EventApi,
filterHash,
findElements,
flexibleCompare,
htmlEscape,
htmlToElement,
isPropsEqual,
isPropsValid,
isValidDate,
mapHash,
memoize,
memoizeOutput,
mergeEventStores,
parseBusinessHours,
processScopedUiProps,
rangesEqual,
rangesIntersect,
refineProps,
removeElement,
renderDateCell,
requestJson,
Splitter,
unpromisify
} from '@fullcalendar/core';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* global Reflect, Promise */
var extendStatics = function(d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
function __extends(d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
var __assign = function() {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function massageEventDragMutation(eventMutation, hit0, hit1) {
var resource0 = hit0.dateSpan.resourceId;
var resource1 = hit1.dateSpan.resourceId;
if (resource0 && resource1 &&
resource0 !== resource1) {
eventMutation.resourceMutation = {
matchResourceId: resource0,
setResourceId: resource1
};
}
}
/*
TODO: all this would be much easier if we were using a hash!
*/
function applyEventDefMutation(eventDef, mutation, calendar) {
var resourceMutation = mutation.resourceMutation;
if (resourceMutation && computeResourceEditable(eventDef, calendar)) {
var index = eventDef.resourceIds.indexOf(resourceMutation.matchResourceId);
if (index !== -1) {
var resourceIds = eventDef.resourceIds.slice(); // copy
resourceIds.splice(index, 1); // remove
if (resourceIds.indexOf(resourceMutation.setResourceId) === -1) { // not already in there
resourceIds.push(resourceMutation.setResourceId); // add
}
eventDef.resourceIds = resourceIds;
}
}
}
/*
HACK
TODO: use EventUi system instead of this
*/
function computeResourceEditable(eventDef, calendar) {
var resourceEditable = eventDef.resourceEditable;
if (resourceEditable == null) {
var source = eventDef.sourceId && calendar.state.eventSources[eventDef.sourceId];
if (source) {
resourceEditable = source.extendedProps.resourceEditable; // used the Source::extendedProps hack
}
if (resourceEditable == null) {
resourceEditable = calendar.opt('eventResourceEditable');
if (resourceEditable == null) {
resourceEditable = calendar.opt('editable'); // TODO: use defaults system instead
}
}
}
return resourceEditable;
}
function transformEventDrop(mutation, calendar) {
var resourceMutation = mutation.resourceMutation;
if (resourceMutation) {
return {
oldResource: calendar.getResourceById(resourceMutation.matchResourceId),
newResource: calendar.getResourceById(resourceMutation.setResourceId)
};
}
else {
return {
oldResource: null,
newResource: null
};
}
}
var ResourceDataAdder = /** @class */ (function () {
function ResourceDataAdder() {
this.filterResources = memoize(filterResources);
}
ResourceDataAdder.prototype.transform = function (viewProps, viewSpec, calendarProps, view) {
if (viewSpec.class.needsResourceData) {
return {
resourceStore: this.filterResources(calendarProps.resourceStore, view.opt('filterResourcesWithEvents'), calendarProps.eventStore, calendarProps.dateProfile.activeRange),
resourceEntityExpansions: calendarProps.resourceEntityExpansions
};
}
};
return ResourceDataAdder;
}());
function filterResources(resourceStore, doFilterResourcesWithEvents, eventStore, activeRange) {
if (doFilterResourcesWithEvents) {
var instancesInRange = filterEventInstancesInRange(eventStore.instances, activeRange);
var hasEvents_1 = computeHasEvents(instancesInRange, eventStore.defs);
__assign(hasEvents_1, computeAncestorHasEvents(hasEvents_1, resourceStore));
return filterHash(resourceStore, function (resource, resourceId) {
return hasEvents_1[resourceId];
});
}
else {
return resourceStore;
}
}
function filterEventInstancesInRange(eventInstances, activeRange) {
return filterHash(eventInstances, function (eventInstance) {
return rangesIntersect(eventInstance.range, activeRange);
});
}
function computeHasEvents(eventInstances, eventDefs) {
var hasEvents = {};
for (var instanceId in eventInstances) {
var instance = eventInstances[instanceId];
for (var _i = 0, _a = eventDefs[instance.defId].resourceIds; _i < _a.length; _i++) {
var resourceId = _a[_i];
hasEvents[resourceId] = true;
}
}
return hasEvents;
}
/*
mark resources as having events if any of their ancestors have them
NOTE: resourceStore might not have all the resources that hasEvents{} has keyed
*/
function computeAncestorHasEvents(hasEvents, resourceStore) {
var res = {};
for (var resourceId in hasEvents) {
var resource = void 0;
while ((resource = resourceStore[resourceId])) {
resourceId = resource.parentId; // now functioning as the parentId
if (resourceId) {
res[resourceId] = true;
}
else {
break;
}
}
}
return res;
}
// for when non-resource view should be given EventUi info (for event coloring/constraints based off of resource data)
var ResourceEventConfigAdder = /** @class */ (function () {
function ResourceEventConfigAdder() {
this.buildResourceEventUis = memoizeOutput(buildResourceEventUis, isPropsEqual);
this.injectResourceEventUis = memoize(injectResourceEventUis);
}
ResourceEventConfigAdder.prototype.transform = function (viewProps, viewSpec, calendarProps) {
if (!viewSpec.class.needsResourceData) { // is a non-resource view?
return {
eventUiBases: this.injectResourceEventUis(viewProps.eventUiBases, viewProps.eventStore.defs, this.buildResourceEventUis(calendarProps.resourceStore))
};
}
};
return ResourceEventConfigAdder;
}());
function buildResourceEventUis(resourceStore) {
return mapHash(resourceStore, function (resource) {
return resource.ui;
});
}
function injectResourceEventUis(eventUiBases, eventDefs, resourceEventUis) {
return mapHash(eventUiBases, function (eventUi, defId) {
if (defId) { // not the '' key
return injectResourceEventUi(eventUi, eventDefs[defId], resourceEventUis);
}
else {
return eventUi;
}
});
}
function injectResourceEventUi(origEventUi, eventDef, resourceEventUis) {
var parts = [];
// first resource takes precedence, which fights with the ordering of combineEventUis, thus the unshifts
for (var _i = 0, _a = eventDef.resourceIds; _i < _a.length; _i++) {
var resourceId = _a[_i];
if (resourceEventUis[resourceId]) {
parts.unshift(resourceEventUis[resourceId]);
}
}
parts.unshift(origEventUi);
return combineEventUis(parts);
}
// for making sure events that have editable resources are always draggable in resource views
function transformIsDraggable(val, eventDef, eventUi, view) {
if (!val) {
if (view.viewSpec.class.needsResourceData) {
if (computeResourceEditable(eventDef, view.calendar)) {
return true;
}
}
}
return val;
}
var RESOURCE_SOURCE_PROPS = {
id: String
};
var defs = [];
var uid = 0;
function registerResourceSourceDef(def) {
defs.push(def);
}
function getResourceSourceDef(id) {
return defs[id];
}
function doesSourceIgnoreRange(source) {
return Boolean(defs[source.sourceDefId].ignoreRange);
}
function parseResourceSource(input) {
for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
var def = defs[i];
var meta = def.parseMeta(input);
if (meta) {
var res = parseResourceSourceProps((typeof input === 'object' && input) ? input : {}, meta, i);
res._raw = input;
return res;
}
}
return null;
}
function parseResourceSourceProps(input, meta, sourceDefId) {
var props = refineProps(input, RESOURCE_SOURCE_PROPS);
props.sourceId = String(uid++);
props.sourceDefId = sourceDefId;
props.meta = meta;
props.publicId = props.id;
props.isFetching = false;
props.latestFetchId = '';
props.fetchRange = null;
delete props.id;
return props;
}
function reduceResourceSource (source, action, dateProfile, calendar) {
switch (action.type) {
case 'INIT':
return createSource(calendar.opt('resources'), calendar);
case 'RESET_RESOURCE_SOURCE':
return createSource(action.resourceSourceInput, calendar, true);
case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
case 'NEXT':
case 'SET_DATE':
case 'SET_VIEW_TYPE':
return handleRange(source, dateProfile.activeRange, calendar);
case 'RECEIVE_RESOURCES':
case 'RECEIVE_RESOURCE_ERROR':
return receiveResponse(source, action.fetchId, action.fetchRange);
case 'REFETCH_RESOURCES':
return fetchSource(source, dateProfile.activeRange, calendar);
default:
return source;
}
}
var uid$1 = 0;
function createSource(input, calendar, forceFetch) {
if (input) {
var source = parseResourceSource(input);
if (forceFetch || !calendar.opt('refetchResourcesOnNavigate')) { // because assumes handleRange will do it later
source = fetchSource(source, null, calendar);
}
return source;
}
return null;
}
function handleRange(source, activeRange, calendar) {
if (calendar.opt('refetchResourcesOnNavigate') &&
!doesSourceIgnoreRange(source) &&
(!source.fetchRange || !rangesEqual(source.fetchRange, activeRange))) {
return fetchSource(source, activeRange, calendar);
}
else {
return source;
}
}
function fetchSource(source, fetchRange, calendar) {
var sourceDef = getResourceSourceDef(source.sourceDefId);
var fetchId = String(uid$1++);
sourceDef.fetch({
resourceSource: source,
calendar: calendar,
range: fetchRange
}, function (res) {
// HACK
// do before calling dispatch in case dispatch renders synchronously
calendar.afterSizingTriggers._resourcesRendered = [null]; // fire once
calendar.dispatch({
type: 'RECEIVE_RESOURCES',
fetchId: fetchId,
fetchRange: fetchRange,
rawResources: res.rawResources
});
}, function (error) {
calendar.dispatch({
type: 'RECEIVE_RESOURCE_ERROR',
fetchId: fetchId,
fetchRange: fetchRange,
error: error
});
});
return __assign({}, source, { isFetching: true, latestFetchId: fetchId });
}
function receiveResponse(source, fetchId, fetchRange) {
if (fetchId === source.latestFetchId) {
return __assign({}, source, { isFetching: false, fetchRange: fetchRange });
}
return source;
}
var RESOURCE_PROPS = {
id: String,
title: String,
parentId: String,
businessHours: null,
children: null,
extendedProps: null
};
var PRIVATE_ID_PREFIX = '_fc:';
var uid$2 = 0;
/*
needs a full store so that it can populate children too
*/
function parseResource(input, parentId, store, calendar) {
if (parentId === void 0) { parentId = ''; }
var leftovers0 = {};
var props = refineProps(input, RESOURCE_PROPS, {}, leftovers0);
var leftovers1 = {};
var ui = processScopedUiProps('event', leftovers0, calendar, leftovers1);
if (!props.id) {
props.id = PRIVATE_ID_PREFIX + (uid$2++);
}
if (!props.parentId) { // give precedence to the parentId property
props.parentId = parentId;
}
props.businessHours = props.businessHours ? parseBusinessHours(props.businessHours, calendar) : null;
props.ui = ui;
props.extendedProps = __assign({}, leftovers1, props.extendedProps);
// help out ResourceApi from having user modify props
Object.freeze(ui.classNames);
Object.freeze(props.extendedProps);
if (store[props.id]) ;
else {
store[props.id] = props;
if (props.children) {
for (var _i = 0, _a = props.children; _i < _a.length; _i++) {
var childInput = _a[_i];
parseResource(childInput, props.id, store, calendar);
}
delete props.children;
}
}
return props;
}
/*
TODO: use this in more places
*/
function getPublicId(id) {
if (id.indexOf(PRIVATE_ID_PREFIX) === 0) {
return '';
}
return id;
}
function reduceResourceStore (store, action, source, calendar) {
switch (action.type) {
case 'INIT':
return {};
case 'RECEIVE_RESOURCES':
return receiveRawResources(store, action.rawResources, action.fetchId, source, calendar);
case 'ADD_RESOURCE':
return addResource(store, action.resourceHash);
case 'REMOVE_RESOURCE':
return removeResource(store, action.resourceId);
case 'SET_RESOURCE_PROP':
return setResourceProp(store, action.resourceId, action.propName, action.propValue);
case 'RESET_RESOURCES':
// must make the calendar think each resource is a new object :/
return mapHash(store, function (resource) {
return __assign({}, resource);
});
default:
return store;
}
}
function receiveRawResources(existingStore, inputs, fetchId, source, calendar) {
if (source.latestFetchId === fetchId) {
var nextStore = {};
for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
var input = inputs_1[_i];
parseResource(input, '', nextStore, calendar);
}
return nextStore;
}
else {
return existingStore;
}
}
function addResource(existingStore, additions) {
// TODO: warn about duplicate IDs
return __assign({}, existingStore, additions);
}
function removeResource(existingStore, resourceId) {
var newStore = __assign({}, existingStore);
delete newStore[resourceId];
// promote children
for (var childResourceId in newStore) { // a child, *maybe* but probably not
if (newStore[childResourceId].parentId === resourceId) {
newStore[childResourceId] = __assign({}, newStore[childResourceId], { parentId: '' });
}
}
return newStore;
}
function setResourceProp(existingStore, resourceId, name, value) {
var _a, _b;
var existingResource = existingStore[resourceId];
// TODO: sanitization
if (existingResource) {
return __assign({}, existingStore, (_a = {}, _a[resourceId] = __assign({}, existingResource, (_b = {}, _b[name] = value, _b)), _a));
}
else {
return existingStore;
}
}
function reduceResourceEntityExpansions(expansions, action) {
var _a;
switch (action.type) {
case 'INIT':
return {};
case 'SET_RESOURCE_ENTITY_EXPANDED':
return __assign({}, expansions, (_a = {}, _a[action.id] = action.isExpanded, _a));
default:
return expansions;
}
}
function resourcesReducers (state, action, calendar) {
var resourceSource = reduceResourceSource(state.resourceSource, action, state.dateProfile, calendar);
var resourceStore = reduceResourceStore(state.resourceStore, action, resourceSource, calendar);
var resourceEntityExpansions = reduceResourceEntityExpansions(state.resourceEntityExpansions, action);
return __assign({}, state, { resourceSource: resourceSource,
resourceStore: resourceStore,
resourceEntityExpansions: resourceEntityExpansions });
}
var RESOURCE_RELATED_PROPS = {
resourceId: String,
resourceIds: function (items) {
return (items || []).map(function (item) {
return String(item);
});
},
resourceEditable: Boolean
};
function parseEventDef(def, props, leftovers) {
var resourceRelatedProps = refineProps(props, RESOURCE_RELATED_PROPS, {}, leftovers);
var resourceIds = resourceRelatedProps.resourceIds;
if (resourceRelatedProps.resourceId) {
resourceIds.push(resourceRelatedProps.resourceId);
}
def.resourceIds = resourceIds;
def.resourceEditable = resourceRelatedProps.resourceEditable;
}
function transformDateSelectionJoin(hit0, hit1) {
var resourceId0 = hit0.dateSpan.resourceId;
var resourceId1 = hit1.dateSpan.resourceId;
if (resourceId0 && resourceId1) {
if (hit0.component.allowAcrossResources === false &&
resourceId0 !== resourceId1) {
return false;
}
else {
return { resourceId: resourceId0 };
}
}
}
var ResourceApi = /** @class */ (function () {
function ResourceApi(calendar, rawResource) {
this._calendar = calendar;
this._resource = rawResource;
}
ResourceApi.prototype.setProp = function (name, value) {
this._calendar.dispatch({
type: 'SET_RESOURCE_PROP',
resourceId: this._resource.id,
propName: name,
propValue: value
});
};
ResourceApi.prototype.remove = function () {
this._calendar.dispatch({
type: 'REMOVE_RESOURCE',
resourceId: this._resource.id
});
};
ResourceApi.prototype.getParent = function () {
var calendar = this._calendar;
var parentId = this._resource.parentId;
if (parentId) {
return new ResourceApi(calendar, calendar.state.resourceSource[parentId]);
}
else {
return null;
}
};
ResourceApi.prototype.getChildren = function () {
var thisResourceId = this._resource.id;
var calendar = this._calendar;
var resourceStore = calendar.state.resourceStore;
var childApis = [];
for (var resourceId in resourceStore) {
if (resourceStore[resourceId].parentId === thisResourceId) {
childApis.push(new ResourceApi(calendar, resourceStore[resourceId]));
}
}
return childApis;
};
/*
this is really inefficient!
TODO: make EventApi::resourceIds a hash or keep an index in the Calendar's state
*/
ResourceApi.prototype.getEvents = function () {
var thisResourceId = this._resource.id;
var calendar = this._calendar;
var _a = calendar.state.eventStore, defs = _a.defs, instances = _a.instances;
var eventApis = [];
for (var instanceId in instances) {
var instance = instances[instanceId];
var def = defs[instance.defId];
if (def.resourceIds.indexOf(thisResourceId) !== -1) { // inefficient!!!
eventApis.push(new EventApi(calendar, def, instance));
}
}
return eventApis;
};
Object.defineProperty(ResourceApi.prototype, "id", {
get: function () { return this._resource.id; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "title", {
get: function () { return this._resource.title; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "eventConstraint", {
get: function () { return this._resource.ui.constraints[0] || null; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "eventOverlap", {
get: function () { return this._resource.ui.overlap; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "eventAllow", {
get: function () { return this._resource.ui.allows[0] || null; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "eventBackgroundColor", {
get: function () { return this._resource.ui.backgroundColor; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "eventBorderColor", {
get: function () { return this._resource.ui.borderColor; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "eventTextColor", {
get: function () { return this._resource.ui.textColor; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "eventClassNames", {
// NOTE: user can't modify these because Object.freeze was called in event-def parsing
get: function () { return this._resource.ui.classNames; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "extendedProps", {
get: function () { return this._resource.extendedProps; },
enumerable: true,
configurable: true
});
return ResourceApi;
}());
Calendar.prototype.addResource = function (input, scrollTo) {
var _a;
if (scrollTo === void 0) { scrollTo = true; }
var resourceHash;
var resource;
if (input instanceof ResourceApi) {
resource = input._resource;
resourceHash = (_a = {}, _a[resource.id] = resource, _a);
}
else {
resourceHash = {};
resource = parseResource(input, '', resourceHash, this);
}
// HACK
if (scrollTo) {
this.component.view.addScroll({ forcedRowId: resource.id });
}
this.dispatch({
type: 'ADD_RESOURCE',
resourceHash: resourceHash
});
return new ResourceApi(this, resource);
};
Calendar.prototype.getResourceById = function (id) {
id = String(id);
if (this.state.resourceStore) { // guard against calendar with no resource functionality
var rawResource = this.state.resourceStore[id];
if (rawResource) {
return new ResourceApi(this, rawResource);
}
}
return null;
};
Calendar.prototype.getResources = function () {
var resourceStore = this.state.resourceStore;
var resourceApis = [];
if (resourceStore) { // guard against calendar with no resource functionality
for (var resourceId in resourceStore) {
resourceApis.push(new ResourceApi(this, resourceStore[resourceId]));
}
}
return resourceApis;
};
Calendar.prototype.getTopLevelResources = function () {
var resourceStore = this.state.resourceStore;
var resourceApis = [];
if (resourceStore) { // guard against calendar with no resource functionality
for (var resourceId in resourceStore) {
if (!resourceStore[resourceId].parentId) {
resourceApis.push(new ResourceApi(this, resourceStore[resourceId]));
}
}
}
return resourceApis;
};
Calendar.prototype.rerenderResources = function () {
this.dispatch({
type: 'RESET_RESOURCES'
});
};
Calendar.prototype.refetchResources = function () {
this.dispatch({
type: 'REFETCH_RESOURCES'
});
};
function transformDatePoint(dateSpan, calendar) {
return dateSpan.resourceId ?
{ resource: calendar.getResourceById(dateSpan.resourceId) } :
{};
}
function transformDateSpan(dateSpan, calendar) {
return dateSpan.resourceId ?
{ resource: calendar.getResourceById(dateSpan.resourceId) } :
{};
}
/*
splits things BASED OFF OF which resources they are associated with.
creates a '' entry which is when something has NO resource.
*/
var ResourceSplitter = /** @class */ (function (_super) {
__extends(ResourceSplitter, _super);
function ResourceSplitter() {
return _super !== null && _super.apply(this, arguments) || this;
}
ResourceSplitter.prototype.getKeyInfo = function (props) {
return __assign({ '': {} }, props.resourceStore // already has `ui` and `businessHours` keys!
);
};
ResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) {
return [dateSpan.resourceId || ''];
};
ResourceSplitter.prototype.getKeysForEventDef = function (eventDef) {
var resourceIds = eventDef.resourceIds;
if (!resourceIds.length) {
return [''];
}
return resourceIds;
};
return ResourceSplitter;
}(Splitter));
function isPropsValidWithResources(props, calendar) {
var splitter = new ResourceSplitter();
var sets = splitter.splitProps(__assign({}, props, { resourceStore: calendar.state.resourceStore }));
for (var resourceId in sets) {
var props_1 = sets[resourceId];
// merge in event data from the non-resource segment
if (resourceId && sets['']) { // current segment is not the non-resource one, and there IS a non-resource one
props_1 = __assign({}, props_1, { eventStore: mergeEventStores(sets[''].eventStore, props_1.eventStore), eventUiBases: __assign({}, sets[''].eventUiBases, props_1.eventUiBases) });
}
if (!isPropsValid(props_1, calendar, { resourceId: resourceId }, filterConfig.bind(null, resourceId))) {
return false;
}
}
return true;
}
function filterConfig(resourceId, config) {
return __assign({}, config, { constraints: filterConstraints(resourceId, config.constraints) });
}
function filterConstraints(resourceId, constraints) {
return constraints.map(function (constraint) {
var defs = constraint.defs;
if (defs) { // we are dealing with an EventStore
// if any of the events define constraints to resources that are NOT this resource,
// then this resource is unconditionally prohibited, which is what a `false` value does.
for (var defId in defs) {
var resourceIds = defs[defId].resourceIds;
if (resourceIds.length && resourceIds.indexOf(resourceId) === -1) { // TODO: use a hash?!!! (for other reasons too)
return false;
}
}
}
return constraint;
});
}
function transformExternalDef(dateSpan) {
return dateSpan.resourceId ?
{ resourceId: dateSpan.resourceId } :
{};
}
function transformEventResizeJoin(hit0, hit1) {
var component = hit0.component;
if (component.allowAcrossResources === false &&
hit0.dateSpan.resourceId !== hit1.dateSpan.resourceId) {
return false;
}
}
EventApi.prototype.getResources = function () {
var calendar = this._calendar;
return this._def.resourceIds.map(function (resourceId) {
return calendar.getResourceById(resourceId);
});
};
EventApi.prototype.setResources = function (resources) {
var resourceIds = [];
// massage resources -> resourceIds
for (var _i = 0, resources_1 = resources; _i < resources_1.length; _i++) {
var resource = resources_1[_i];
var resourceId = null;
if (typeof resource === 'string') {
resourceId = resource;
}
else if (typeof resource === 'number') {
resourceId = String(resource);
}
else if (resource instanceof ResourceApi) {
resourceId = resource.id; // guaranteed to always have an ID. hmmm
}
else {
console.warn('unknown resource type: ' + resource);
}
if (resourceId) {
resourceIds.push(resourceId);
}
}
this.mutate({
standardProps: {
resourceIds: resourceIds
}
});
};
var RELEASE_DATE = '2019-08-10'; // for Scheduler
var UPGRADE_WINDOW = 365 + 7; // days. 1 week leeway, for tz shift reasons too
var LICENSE_INFO_URL = 'http://fullcalendar.io/scheduler/license/';
var PRESET_LICENSE_KEYS = [
'GPL-My-Project-Is-Open-Source',
'CC-Attribution-NonCommercial-NoDerivatives'
];
var CSS = {
position: 'absolute',
'z-index': 99999,
bottom: '1px',
left: '1px',
background: '#eee',
'border-color': '#ddd',
'border-style': 'solid',
'border-width': '1px 1px 0 0',
padding: '2px 4px',
'font-size': '12px',
'border-top-right-radius': '3px'
};
function injectLicenseWarning(containerEl, calendar) {
var key = calendar.opt('schedulerLicenseKey');
if (!isImmuneUrl(window.location.href) && !isValidKey(key)) {
appendToElement(containerEl, '<div class="fc-license-message" style="' + htmlEscape(cssToStr(CSS)) + '">' +
'Please use a valid license key. <a href="' + LICENSE_INFO_URL + '">More Info</a>' +
'</div>');
}
}
/*
This decryption is not meant to be bulletproof. Just a way to remind about an upgrade.
*/
function isValidKey(key) {
if (PRESET_LICENSE_KEYS.indexOf(key) !== -1) {
return true;
}
var parts = (key || '').match(/^(\d+)\-fcs\-(\d+)$/);
if (parts && (parts[1].length === 10)) {
var purchaseDate = new Date(parseInt(parts[2], 10) * 1000);
var releaseDate = new Date(config.mockSchedulerReleaseDate || RELEASE_DATE);
if (isValidDate(releaseDate)) { // token won't be replaced in dev mode
var minPurchaseDate = addDays(releaseDate, -UPGRADE_WINDOW);
if (minPurchaseDate < purchaseDate) {
return true;
}
}
}
return false;
}
function isImmuneUrl(url) {
return /\w+\:\/\/fullcalendar\.io\/|\/examples\/[\w-]+\.html$/.test(url);
}
var optionChangeHandlers = {
resources: handleResources
};
function handleResources(newSourceInput, calendar, deepEqual) {
var oldSourceInput = calendar.state.resourceSource._raw;
if (!deepEqual(oldSourceInput, newSourceInput)) {
calendar.dispatch({
type: 'RESET_RESOURCE_SOURCE',
resourceSourceInput: newSourceInput
});
}
}
registerResourceSourceDef({
ignoreRange: true,
parseMeta: function (raw) {
if (Array.isArray(raw)) {
return raw;
}
else if (Array.isArray(raw.resources)) {
return raw.resources;
}
return null;
},
fetch: function (arg, successCallback) {
successCallback({
rawResources: arg.resourceSource.meta
});
}
});
registerResourceSourceDef({
parseMeta: function (raw) {
if (typeof raw === 'function') {
return raw;
}
else if (typeof raw.resources === 'function') {
return raw.resources;
}
return null;
},
fetch: function (arg, success, failure) {
var dateEnv = arg.calendar.dateEnv;
var func = arg.resourceSource.meta;
var publicArg = {};
if (arg.range) {
publicArg = {
start: dateEnv.toDate(arg.range.start),
end: dateEnv.toDate(arg.range.end),
startStr: dateEnv.formatIso(arg.range.start),
endStr: dateEnv.formatIso(arg.range.end),
timeZone: dateEnv.timeZone
};
}
// TODO: make more dry with EventSourceFunc
// TODO: accept a response?
unpromisify(func.bind(null, publicArg), function (rawResources) {
success({ rawResources: rawResources }); // needs an object response
}, failure // send errorObj directly to failure callback
);
}
});
registerResourceSourceDef({
parseMeta: function (raw) {
if (typeof raw === 'string') {
raw = { url: raw };
}
else if (!raw || typeof raw !== 'object' || !raw.url) {
return null;
}
return {
url: raw.url,
method: (raw.method || 'GET').toUpperCase(),
extraParams: raw.extraParams
};
},
fetch: function (arg, successCallback, failureCallback) {
var meta = arg.resourceSource.meta;
var requestParams = buildRequestParams(meta, arg.range, arg.calendar);
requestJson(meta.method, meta.url, requestParams, function (rawResources, xhr) {
successCallback({ rawResources: rawResources, xhr: xhr });
}, function (message, xhr) {
failureCallback({ message: message, xhr: xhr });
});
}
});
// TODO: somehow consolidate with event json feed
function buildRequestParams(meta, range, calendar) {
var dateEnv = calendar.dateEnv;
var startParam;
var endParam;
var timeZoneParam;
var customRequestParams;
var params = {};
if (range) {
// startParam = meta.startParam
// if (startParam == null) {
startParam = calendar.opt('startParam');
// }
// endParam = meta.endParam
// if (endParam == null) {
endParam = calendar.opt('endParam');
// }
// timeZoneParam = meta.timeZoneParam
// if (timeZoneParam == null) {
timeZoneParam = calendar.opt('timeZoneParam');
// }
params[startParam] = dateEnv.formatIso(range.start);
params[endParam] = dateEnv.formatIso(range.end);
if (dateEnv.timeZone !== 'local') {
params[timeZoneParam] = dateEnv.timeZone;
}
}
// retrieve any outbound GET/POST data from the options
if (typeof meta.extraParams === 'function') {
// supplied as a function that returns a key/value object
customRequestParams = meta.extraParams();
}
else {
// probably supplied as a straight key/value object
customRequestParams = meta.extraParams || {};
}
__assign(params, customRequestParams);
return params;
}
function buildResourceTextFunc(resourceTextSetting, calendar) {
if (typeof resourceTextSetting === 'function') {
return function (resource) {
return resourceTextSetting(new ResourceApi(calendar, resource));
};
}
else {
return function (resource) {
return resource.title || getPublicId(resource.id);
};
}
}
var ResourceDayHeader = /** @class */ (function (_super) {
__extends(ResourceDayHeader, _super);
function ResourceDayHeader(context, parentEl) {
var _this = _super.call(this, context) || this;
_this.datesAboveResources = _this.opt('datesAboveResources');
_this.resourceTextFunc = buildResourceTextFunc(_this.opt('resourceText'), _this.calendar);
parentEl.innerHTML = ''; // because might be nbsp
parentEl.appendChild(_this.el = htmlToElement('<div class="fc-row ' + _this.theme.getClass('headerRow') + '">' +
'<table class="' + _this.theme.getClass('tableGrid') + '">' +
'<thead></thead>' +
'</table>' +
'</div>'));
_this.thead = _this.el.querySelector('thead');
return _this;
}
ResourceDayHeader.prototype.destroy = function () {
removeElement(this.el);
};
ResourceDayHeader.prototype.render = function (props) {
var html;
this.dateFormat = createFormatter(this.opt('columnHeaderFormat') ||
computeFallbackHeaderFormat(props.datesRepDistinctDays, props.dates.length));
if (props.dates.length === 1) {
html = this.renderResourceRow(props.resources);
}
else {
if (this.datesAboveResources) {
html = this.renderDayAndResourceRows(props.dates, props.resources);
}
else {
html = this.renderResourceAndDayRows(props.resources, props.dates);
}
}
this.thead.innerHTML = html;
this.processResourceEls(props.resources);
};
ResourceDayHeader.prototype.renderResourceRow = function (resources) {
var _this = this;
var cellHtmls = resources.map(function (resource) {
return _this.renderResourceCell(resource, 1);
});
return this.buildTr(cellHtmls);
};
ResourceDayHeader.prototype.renderDayAndResourceRows = function (dates, resources) {
var dateHtmls = [];
var resourceHtmls = [];
for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
var date = dates_1[_i];
dateHtmls.push(this.renderDateCell(date, resources.length));
for (var _a = 0, resources_1 = resources; _a < resources_1.length; _a++) {
var resource = resources_1[_a];
resourceHtmls.push(this.renderResourceCell(resource, 1, date));
}
}
return this.buildTr(dateHtmls) +
this.buildTr(resourceHtmls);
};
ResourceDayHeader.prototype.renderResourceAndDayRows = function (resources, dates) {
var resourceHtmls = [];
var dateHtmls = [];
for (var _i = 0, resources_2 = resources; _i < resources_2.length; _i++) {
var resource = resources_2[_i];
resourceHtmls.push(this.renderResourceCell(resource, dates.length));
for (var _a = 0, dates_2 = dates; _a < dates_2.length; _a++) {
var date = dates_2[_a];
dateHtmls.push(this.renderDateCell(date, 1, resource));
}
}
return this.buildTr(resourceHtmls) +
this.buildTr(dateHtmls);
};
// Cell Rendering Utils
// ----------------------------------------------------------------------------------------------
// a cell with the resource name. might be associated with a specific day
ResourceDayHeader.prototype.renderResourceCell = function (resource, colspan, date) {
var dateEnv = this.dateEnv;
return '<th class="fc-resource-cell"' +
' data-resource-id="' + resource.id + '"' +
(date ?
' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
'') +
(colspan > 1 ?
' colspan="' + colspan + '"' :
'') +
'>' +
htmlEscape(this.resourceTextFunc(resource)) +
'</th>';
};
// a cell with date text. might have a resource associated with it
ResourceDayHeader.prototype.renderDateCell = function (date, colspan, resource) {
var props = this.props;
return renderDateCell(date, props.dateProfile, props.datesRepDistinctDays, props.dates.length * props.resources.length, this.dateFormat, this.context, colspan, resource ? 'data-resource-id="' + resource.id + '"' : '');
};
ResourceDayHeader.prototype.buildTr = function (cellHtmls) {
if (!cellHtmls.length) {
cellHtmls = ['<td>&nbsp;</td>'];
}
if (this.props.renderIntroHtml) {
cellHtmls = [this.props.renderIntroHtml()].concat(cellHtmls);
}
if (this.isRtl) {
cellHtmls.reverse();
}
return '<tr>' +
cellHtmls.join('') +
'</tr>';
};
// Post-rendering
// ----------------------------------------------------------------------------------------------
// given a container with already rendered resource cells
ResourceDayHeader.prototype.processResourceEls = function (resources) {
var _this = this;
var view = this.view;
findElements(this.thead, '.fc-resource-cell').forEach(function (node, col) {
col = col % resources.length;
if (_this.isRtl) {
col = resources.length - 1 - col;
}
var resource = resources[col];
view.publiclyTrigger('resourceRender', [
{
resource: new ResourceApi(_this.calendar, resource),
el: node,
view: view
}
]);
});
};
return ResourceDayHeader;
}(Component));
var AbstractResourceDayTable = /** @class */ (function () {
function AbstractResourceDayTable(dayTable, resources) {
this.dayTable = dayTable;
this.resources = resources;
this.resourceIndex = new ResourceIndex(resources);
this.rowCnt = dayTable.rowCnt;
this.colCnt = dayTable.colCnt * resources.length;
this.cells = this.buildCells();
}
AbstractResourceDayTable.prototype.buildCells = function () {
var _a = this, rowCnt = _a.rowCnt, dayTable = _a.dayTable, resources = _a.resources;
var rows = [];
for (var row = 0; row < rowCnt; row++) {
var rowCells = [];
for (var dateCol = 0; dateCol < dayTable.colCnt; dateCol++) {
for (var resourceCol = 0; resourceCol < resources.length; resourceCol++) {
var resource = resources[resourceCol];
var htmlAttrs = 'data-resource-id="' + resource.id + '"';
rowCells[this.computeCol(dateCol, resourceCol)] = {
date: dayTable.cells[row][dateCol].date,
resource: resource,
htmlAttrs: htmlAttrs
};
}
}
rows.push(rowCells);
}
return rows;
};
return AbstractResourceDayTable;
}());
/*
resources over dates
*/
var ResourceDayTable = /** @class */ (function (_super) {
__extends(ResourceDayTable, _super);
function ResourceDayTable() {
return _super !== null && _super.apply(this, arguments) || this;
}
ResourceDayTable.prototype.computeCol = function (dateI, resourceI) {
return resourceI * this.dayTable.colCnt + dateI;
};
/*
all date ranges are intact
*/
ResourceDayTable.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) {
return [
{
firstCol: this.computeCol(dateStartI, resourceI),
lastCol: this.computeCol(dateEndI, resourceI),
isStart: true,
isEnd: true
}
];
};
return ResourceDayTable;
}(AbstractResourceDayTable));
/*
dates over resources
*/
var DayResourceTable = /** @class */ (function (_super) {
__extends(DayResourceTable, _super);
function DayResourceTable() {
return _super !== null && _super.apply(this, arguments) || this;
}
DayResourceTable.prototype.computeCol = function (dateI, resourceI) {
return dateI * this.resources.length + resourceI;
};
/*
every single day is broken up
*/
DayResourceTable.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) {
var segs = [];
for (var i = dateStartI; i <= dateEndI; i++) {
var col = this.computeCol(i, resourceI);
segs.push({
firstCol: col,
lastCol: col,
isStart: i === dateStartI,
isEnd: i === dateEndI
});
}
return segs;
};
return DayResourceTable;
}(AbstractResourceDayTable));
var ResourceIndex = /** @class */ (function () {
function ResourceIndex(resources) {
var indicesById = {};
var ids = [];
for (var i = 0; i < resources.length; i++) {
var id = resources[i].id;
ids.push(id);
indicesById[id] = i;
}
this.ids = ids;
this.indicesById = indicesById;
this.length = resources.length;
}
return ResourceIndex;
}());
/*
TODO: just use ResourceHash somehow? could then use the generic ResourceSplitter
*/
var VResourceSplitter = /** @class */ (function (_super) {
__extends(VResourceSplitter, _super);
function VResourceSplitter() {
return _super !== null && _super.apply(this, arguments) || this;
}
VResourceSplitter.prototype.getKeyInfo = function (props) {
var resourceDayTable = props.resourceDayTable;
var hash = mapHash(resourceDayTable.resourceIndex.indicesById, function (i) {
return resourceDayTable.resources[i]; // has `ui` AND `businessHours` keys!
}); // :(
hash[''] = {};
return hash;
};
VResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) {
return [dateSpan.resourceId || ''];
};
VResourceSplitter.prototype.getKeysForEventDef = function (eventDef) {
var resourceIds = eventDef.resourceIds;
if (!resourceIds.length) {
return [''];
}
return resourceIds;
};
return VResourceSplitter;
}(Splitter));
// joiner
var NO_SEGS = []; // for memoizing
var VResourceJoiner = /** @class */ (function () {
function VResourceJoiner() {
this.joinDateSelection = memoize(this.joinSegs);
this.joinBusinessHours = memoize(this.joinSegs);
this.joinFgEvents = memoize(this.joinSegs);
this.joinBgEvents = memoize(this.joinSegs);
this.joinEventDrags = memoize(this.joinInteractions);
this.joinEventResizes = memoize(this.joinInteractions);
}
/*
propSets also has a '' key for things with no resource
*/
VResourceJoiner.prototype.joinProps = function (propSets, resourceDayTable) {
var dateSelectionSets = [];
var businessHoursSets = [];
var fgEventSets = [];
var bgEventSets = [];
var eventDrags = [];
var eventResizes = [];
var eventSelection = '';
var keys = resourceDayTable.resourceIndex.ids.concat(['']); // add in the all-resource key
for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
var key = keys_1[_i];
var props = propSets[key];
dateSelectionSets.push(props.dateSelectionSegs);
businessHoursSets.push(key ? props.businessHourSegs : NO_SEGS); // don't include redundant all-resource businesshours
fgEventSets.push(key ? props.fgEventSegs : NO_SEGS); // don't include fg all-resource segs
bgEventSets.push(props.bgEventSegs);
eventDrags.push(props.eventDrag);
eventResizes.push(props.eventResize);
eventSelection = eventSelection || props.eventSelection;
}
return {
dateSelectionSegs: this.joinDateSelection.apply(this, [resourceDayTable].concat(dateSelectionSets)),
businessHourSegs: this.joinBusinessHours.apply(this, [resourceDayTable].concat(businessHoursSets)),
fgEventSegs: this.joinFgEvents.apply(this, [resourceDayTable].concat(fgEventSets)),
bgEventSegs: this.joinBgEvents.apply(this, [resourceDayTable].concat(bgEventSets)),
eventDrag: this.joinEventDrags.apply(this, [resourceDayTable].concat(eventDrags)),
eventResize: this.joinEventResizes.apply(this, [resourceDayTable].concat(eventResizes)),
eventSelection: eventSelection
};
};
VResourceJoiner.prototype.joinSegs = function (resourceDayTable) {
var segGroups = [];
for (var _i = 1; _i < arguments.length; _i++) {
segGroups[_i - 1] = arguments[_i];
}
var resourceCnt = resourceDayTable.resources.length;
var transformedSegs = [];
for (var i = 0; i < resourceCnt; i++) {
for (var _a = 0, _b = segGroups[i]; _a < _b.length; _a++) {
var seg = _b[_a];
transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));
}
for (var _c = 0, _d = segGroups[resourceCnt]; _c < _d.length; _c++) { // one beyond. the all-resource
var seg = _d[_c];
transformedSegs.push.apply(// one beyond. the all-resource
transformedSegs, this.transformSeg(seg, resourceDayTable, i));
}
}
return transformedSegs;
};
/*
for expanding non-resource segs to all resources.
only for public use.
no memoizing.
*/
VResourceJoiner.prototype.expandSegs = function (resourceDayTable, segs) {
var resourceCnt = resourceDayTable.resources.length;
var transformedSegs = [];
for (var i = 0; i < resourceCnt; i++) {
for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
var seg = segs_1[_i];
transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));
}
}
return transformedSegs;
};
VResourceJoiner.prototype.joinInteractions = function (resourceDayTable) {
var interactions = [];
for (var _i = 1; _i < arguments.length; _i++) {
interactions[_i - 1] = arguments[_i];
}
var resourceCnt = resourceDayTable.resources.length;
var affectedInstances = {};
var transformedSegs = [];
var isEvent = false;
var sourceSeg = null;
for (var i = 0; i < resourceCnt; i++) {
var interaction = interactions[i];
if (interaction) {
for (var _a = 0, _b = interaction.segs; _a < _b.length; _a++) {
var seg = _b[_a];
transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i) // TODO: templateify Interaction::segs
);
}
__assign(affectedInstances, interaction.affectedInstances);
isEvent = isEvent || interaction.isEvent;
sourceSeg = sourceSeg || interaction.sourceSeg;
}
if (interactions[resourceCnt]) { // one beyond. the all-resource
for (var _c = 0, _d = interactions[resourceCnt].segs; _c < _d.length; _c++) {
var seg = _d[_c];
transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i) // TODO: templateify Interaction::segs
);
}
}
}
return {
affectedInstances: affectedInstances,
segs: transformedSegs,
isEvent: isEvent,
sourceSeg: sourceSeg
};
};
return VResourceJoiner;
}());
/*
doesn't accept grouping
*/
function flattenResources(resourceStore, orderSpecs) {
return buildRowNodes(resourceStore, [], orderSpecs, false, {}, true)
.map(function (node) {
return node.resource;
});
}
function buildRowNodes(resourceStore, groupSpecs, orderSpecs, isVGrouping, expansions, expansionDefault) {
var complexNodes = buildHierarchy(resourceStore, isVGrouping ? -1 : 1, groupSpecs, orderSpecs);
var flatNodes = [];
flattenNodes(complexNodes, flatNodes, isVGrouping, [], 0, expansions, expansionDefault);
return flatNodes;
}
function flattenNodes(complexNodes, res, isVGrouping, rowSpans, depth, expansions, expansionDefault) {
for (var i = 0; i < complexNodes.length; i++) {
var complexNode = complexNodes[i];
var group = complexNode.group;
if (group) {
if (isVGrouping) {
var firstRowIndex = res.length;
var rowSpanIndex = rowSpans.length;
flattenNodes(complexNode.children, res, isVGrouping, rowSpans.concat(0), depth, expansions, expansionDefault);
if (firstRowIndex < res.length) {
var firstRow = res[firstRowIndex];
var firstRowSpans = firstRow.rowSpans = firstRow.rowSpans.slice();
firstRowSpans[rowSpanIndex] = res.length - firstRowIndex;
}
}
else {
var id = group.spec.field + ':' + group.value;
var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault;
res.push({ id: id, group: group, isExpanded: isExpanded });
if (isExpanded) {
flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault);
}
}
}
else if (complexNode.resource) {
var id = complexNode.resource.id;
var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault;
res.push({
id: id,
rowSpans: rowSpans,
depth: depth,
isExpanded: isExpanded,
hasChildren: Boolean(complexNode.children.length),
resource: complexNode.resource,
resourceFields: complexNode.resourceFields
});
if (isExpanded) {
flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault);
}
}
}
}
function buildHierarchy(resourceStore, maxDepth, groupSpecs, orderSpecs) {
var resourceNodes = buildResourceNodes(resourceStore, orderSpecs);
var builtNodes = [];
for (var resourceId in resourceNodes) {
var resourceNode = resourceNodes[resourceId];
if (!resourceNode.resource.parentId) {
insertResourceNode(resourceNode, builtNodes, groupSpecs, 0, maxDepth, orderSpecs);
}
}
return builtNodes;
}
function buildResourceNodes(resourceStore, orderSpecs) {
var nodeHash = {};
for (var resourceId in resourceStore) {
var resource = resourceStore[resourceId];
nodeHash[resourceId] = {
resource: resource,
resourceFields: buildResourceFields(resource),
children: []
};
}
for (var resourceId in resourceStore) {
var resource = resourceStore[resourceId];
if (resource.parentId) {
var parentNode = nodeHash[resource.parentId];
if (parentNode) {
insertResourceNodeInSiblings(nodeHash[resourceId], parentNode.children, orderSpecs);
}
}
}
return nodeHash;
}
function insertResourceNode(resourceNode, nodes, groupSpecs, depth, maxDepth, orderSpecs) {
if (groupSpecs.length && (maxDepth === -1 || depth <= maxDepth)) {
var groupNode = ensureGroupNodes(resourceNode, nodes, groupSpecs[0]);
insertResourceNode(resourceNode, groupNode.children, groupSpecs.slice(1), depth + 1, maxDepth, orderSpecs);
}
else {
insertResourceNodeInSiblings(resourceNode, nodes, orderSpecs);
}
}
function ensureGroupNodes(resourceNode, nodes, groupSpec) {
var groupValue = resourceNode.resourceFields[groupSpec.field];
var groupNode;
var newGroupIndex;
// find an existing group that matches, or determine the position for a new group
if (groupSpec.order) {
for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex++) {
var node = nodes[newGroupIndex];
if (node.group) {
var cmp = flexibleCompare(groupValue, node.group.value) * groupSpec.order;
if (cmp === 0) {
groupNode = node;
break;
}
else if (cmp < 0) {
break;
}
}
}
}
else { // the groups are unordered
for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex++) {
var node = nodes[newGroupIndex];
if (node.group && groupValue === node.group.value) {
groupNode = node;
break;
}
}
}
if (!groupNode) {
groupNode = {
group: {
value: groupValue,
spec: groupSpec
},
children: []
};
nodes.splice(newGroupIndex, 0, groupNode);
}
return groupNode;
}
function insertResourceNodeInSiblings(resourceNode, siblings, orderSpecs) {
var i;
for (i = 0; i < siblings.length; i++) {
var cmp = compareByFieldSpecs(siblings[i].resourceFields, resourceNode.resourceFields, orderSpecs);
if (cmp > 0) { // went 1 past. insert at i
break;
}
}
siblings.splice(i, 0, resourceNode);
}
function buildResourceFields(resource) {
var obj = __assign({}, resource.extendedProps, resource.ui, resource);
delete obj.ui;
delete obj.extendedProps;
return obj;
}
function isGroupsEqual(group0, group1) {
return group0.spec === group1.spec && group0.value === group1.value;
}
var main = createPlugin({
reducers: [resourcesReducers],
eventDefParsers: [parseEventDef],
isDraggableTransformers: [transformIsDraggable],
eventDragMutationMassagers: [massageEventDragMutation],
eventDefMutationAppliers: [applyEventDefMutation],
dateSelectionTransformers: [transformDateSelectionJoin],
datePointTransforms: [transformDatePoint],
dateSpanTransforms: [transformDateSpan],
viewPropsTransformers: [ResourceDataAdder, ResourceEventConfigAdder],
isPropsValid: isPropsValidWithResources,
externalDefTransforms: [transformExternalDef],
eventResizeJoinTransforms: [transformEventResizeJoin],
viewContainerModifiers: [injectLicenseWarning],
eventDropTransformers: [transformEventDrop],
optionChangeHandlers: optionChangeHandlers
});
export default main;
export { AbstractResourceDayTable, DayResourceTable, ResourceApi, ResourceDayHeader, ResourceDayTable, ResourceSplitter, VResourceJoiner, VResourceSplitter, buildResourceFields, buildResourceTextFunc, buildRowNodes, flattenResources, isGroupsEqual };
/*!
FullCalendar Resources Common Plugin v4.3.1
Docs & License: https://fullcalendar.io/scheduler
(c) 2019 Adam Shaw
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
(global = global || self, factory(global.FullCalendarResourceCommon = {}, global.FullCalendar));
}(this, function (exports, core) { 'use strict';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* global Reflect, Promise */
var extendStatics = function(d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
function __extends(d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
var __assign = function() {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function massageEventDragMutation(eventMutation, hit0, hit1) {
var resource0 = hit0.dateSpan.resourceId;
var resource1 = hit1.dateSpan.resourceId;
if (resource0 && resource1 &&
resource0 !== resource1) {
eventMutation.resourceMutation = {
matchResourceId: resource0,
setResourceId: resource1
};
}
}
/*
TODO: all this would be much easier if we were using a hash!
*/
function applyEventDefMutation(eventDef, mutation, calendar) {
var resourceMutation = mutation.resourceMutation;
if (resourceMutation && computeResourceEditable(eventDef, calendar)) {
var index = eventDef.resourceIds.indexOf(resourceMutation.matchResourceId);
if (index !== -1) {
var resourceIds = eventDef.resourceIds.slice(); // copy
resourceIds.splice(index, 1); // remove
if (resourceIds.indexOf(resourceMutation.setResourceId) === -1) { // not already in there
resourceIds.push(resourceMutation.setResourceId); // add
}
eventDef.resourceIds = resourceIds;
}
}
}
/*
HACK
TODO: use EventUi system instead of this
*/
function computeResourceEditable(eventDef, calendar) {
var resourceEditable = eventDef.resourceEditable;
if (resourceEditable == null) {
var source = eventDef.sourceId && calendar.state.eventSources[eventDef.sourceId];
if (source) {
resourceEditable = source.extendedProps.resourceEditable; // used the Source::extendedProps hack
}
if (resourceEditable == null) {
resourceEditable = calendar.opt('eventResourceEditable');
if (resourceEditable == null) {
resourceEditable = calendar.opt('editable'); // TODO: use defaults system instead
}
}
}
return resourceEditable;
}
function transformEventDrop(mutation, calendar) {
var resourceMutation = mutation.resourceMutation;
if (resourceMutation) {
return {
oldResource: calendar.getResourceById(resourceMutation.matchResourceId),
newResource: calendar.getResourceById(resourceMutation.setResourceId)
};
}
else {
return {
oldResource: null,
newResource: null
};
}
}
var ResourceDataAdder = /** @class */ (function () {
function ResourceDataAdder() {
this.filterResources = core.memoize(filterResources);
}
ResourceDataAdder.prototype.transform = function (viewProps, viewSpec, calendarProps, view) {
if (viewSpec.class.needsResourceData) {
return {
resourceStore: this.filterResources(calendarProps.resourceStore, view.opt('filterResourcesWithEvents'), calendarProps.eventStore, calendarProps.dateProfile.activeRange),
resourceEntityExpansions: calendarProps.resourceEntityExpansions
};
}
};
return ResourceDataAdder;
}());
function filterResources(resourceStore, doFilterResourcesWithEvents, eventStore, activeRange) {
if (doFilterResourcesWithEvents) {
var instancesInRange = filterEventInstancesInRange(eventStore.instances, activeRange);
var hasEvents_1 = computeHasEvents(instancesInRange, eventStore.defs);
__assign(hasEvents_1, computeAncestorHasEvents(hasEvents_1, resourceStore));
return core.filterHash(resourceStore, function (resource, resourceId) {
return hasEvents_1[resourceId];
});
}
else {
return resourceStore;
}
}
function filterEventInstancesInRange(eventInstances, activeRange) {
return core.filterHash(eventInstances, function (eventInstance) {
return core.rangesIntersect(eventInstance.range, activeRange);
});
}
function computeHasEvents(eventInstances, eventDefs) {
var hasEvents = {};
for (var instanceId in eventInstances) {
var instance = eventInstances[instanceId];
for (var _i = 0, _a = eventDefs[instance.defId].resourceIds; _i < _a.length; _i++) {
var resourceId = _a[_i];
hasEvents[resourceId] = true;
}
}
return hasEvents;
}
/*
mark resources as having events if any of their ancestors have them
NOTE: resourceStore might not have all the resources that hasEvents{} has keyed
*/
function computeAncestorHasEvents(hasEvents, resourceStore) {
var res = {};
for (var resourceId in hasEvents) {
var resource = void 0;
while ((resource = resourceStore[resourceId])) {
resourceId = resource.parentId; // now functioning as the parentId
if (resourceId) {
res[resourceId] = true;
}
else {
break;
}
}
}
return res;
}
// for when non-resource view should be given EventUi info (for event coloring/constraints based off of resource data)
var ResourceEventConfigAdder = /** @class */ (function () {
function ResourceEventConfigAdder() {
this.buildResourceEventUis = core.memoizeOutput(buildResourceEventUis, core.isPropsEqual);
this.injectResourceEventUis = core.memoize(injectResourceEventUis);
}
ResourceEventConfigAdder.prototype.transform = function (viewProps, viewSpec, calendarProps) {
if (!viewSpec.class.needsResourceData) { // is a non-resource view?
return {
eventUiBases: this.injectResourceEventUis(viewProps.eventUiBases, viewProps.eventStore.defs, this.buildResourceEventUis(calendarProps.resourceStore))
};
}
};
return ResourceEventConfigAdder;
}());
function buildResourceEventUis(resourceStore) {
return core.mapHash(resourceStore, function (resource) {
return resource.ui;
});
}
function injectResourceEventUis(eventUiBases, eventDefs, resourceEventUis) {
return core.mapHash(eventUiBases, function (eventUi, defId) {
if (defId) { // not the '' key
return injectResourceEventUi(eventUi, eventDefs[defId], resourceEventUis);
}
else {
return eventUi;
}
});
}
function injectResourceEventUi(origEventUi, eventDef, resourceEventUis) {
var parts = [];
// first resource takes precedence, which fights with the ordering of combineEventUis, thus the unshifts
for (var _i = 0, _a = eventDef.resourceIds; _i < _a.length; _i++) {
var resourceId = _a[_i];
if (resourceEventUis[resourceId]) {
parts.unshift(resourceEventUis[resourceId]);
}
}
parts.unshift(origEventUi);
return core.combineEventUis(parts);
}
// for making sure events that have editable resources are always draggable in resource views
function transformIsDraggable(val, eventDef, eventUi, view) {
if (!val) {
if (view.viewSpec.class.needsResourceData) {
if (computeResourceEditable(eventDef, view.calendar)) {
return true;
}
}
}
return val;
}
var RESOURCE_SOURCE_PROPS = {
id: String
};
var defs = [];
var uid = 0;
function registerResourceSourceDef(def) {
defs.push(def);
}
function getResourceSourceDef(id) {
return defs[id];
}
function doesSourceIgnoreRange(source) {
return Boolean(defs[source.sourceDefId].ignoreRange);
}
function parseResourceSource(input) {
for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
var def = defs[i];
var meta = def.parseMeta(input);
if (meta) {
var res = parseResourceSourceProps((typeof input === 'object' && input) ? input : {}, meta, i);
res._raw = input;
return res;
}
}
return null;
}
function parseResourceSourceProps(input, meta, sourceDefId) {
var props = core.refineProps(input, RESOURCE_SOURCE_PROPS);
props.sourceId = String(uid++);
props.sourceDefId = sourceDefId;
props.meta = meta;
props.publicId = props.id;
props.isFetching = false;
props.latestFetchId = '';
props.fetchRange = null;
delete props.id;
return props;
}
function reduceResourceSource (source, action, dateProfile, calendar) {
switch (action.type) {
case 'INIT':
return createSource(calendar.opt('resources'), calendar);
case 'RESET_RESOURCE_SOURCE':
return createSource(action.resourceSourceInput, calendar, true);
case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
case 'NEXT':
case 'SET_DATE':
case 'SET_VIEW_TYPE':
return handleRange(source, dateProfile.activeRange, calendar);
case 'RECEIVE_RESOURCES':
case 'RECEIVE_RESOURCE_ERROR':
return receiveResponse(source, action.fetchId, action.fetchRange);
case 'REFETCH_RESOURCES':
return fetchSource(source, dateProfile.activeRange, calendar);
default:
return source;
}
}
var uid$1 = 0;
function createSource(input, calendar, forceFetch) {
if (input) {
var source = parseResourceSource(input);
if (forceFetch || !calendar.opt('refetchResourcesOnNavigate')) { // because assumes handleRange will do it later
source = fetchSource(source, null, calendar);
}
return source;
}
return null;
}
function handleRange(source, activeRange, calendar) {
if (calendar.opt('refetchResourcesOnNavigate') &&
!doesSourceIgnoreRange(source) &&
(!source.fetchRange || !core.rangesEqual(source.fetchRange, activeRange))) {
return fetchSource(source, activeRange, calendar);
}
else {
return source;
}
}
function fetchSource(source, fetchRange, calendar) {
var sourceDef = getResourceSourceDef(source.sourceDefId);
var fetchId = String(uid$1++);
sourceDef.fetch({
resourceSource: source,
calendar: calendar,
range: fetchRange
}, function (res) {
// HACK
// do before calling dispatch in case dispatch renders synchronously
calendar.afterSizingTriggers._resourcesRendered = [null]; // fire once
calendar.dispatch({
type: 'RECEIVE_RESOURCES',
fetchId: fetchId,
fetchRange: fetchRange,
rawResources: res.rawResources
});
}, function (error) {
calendar.dispatch({
type: 'RECEIVE_RESOURCE_ERROR',
fetchId: fetchId,
fetchRange: fetchRange,
error: error
});
});
return __assign({}, source, { isFetching: true, latestFetchId: fetchId });
}
function receiveResponse(source, fetchId, fetchRange) {
if (fetchId === source.latestFetchId) {
return __assign({}, source, { isFetching: false, fetchRange: fetchRange });
}
return source;
}
var RESOURCE_PROPS = {
id: String,
title: String,
parentId: String,
businessHours: null,
children: null,
extendedProps: null
};
var PRIVATE_ID_PREFIX = '_fc:';
var uid$2 = 0;
/*
needs a full store so that it can populate children too
*/
function parseResource(input, parentId, store, calendar) {
if (parentId === void 0) { parentId = ''; }
var leftovers0 = {};
var props = core.refineProps(input, RESOURCE_PROPS, {}, leftovers0);
var leftovers1 = {};
var ui = core.processScopedUiProps('event', leftovers0, calendar, leftovers1);
if (!props.id) {
props.id = PRIVATE_ID_PREFIX + (uid$2++);
}
if (!props.parentId) { // give precedence to the parentId property
props.parentId = parentId;
}
props.businessHours = props.businessHours ? core.parseBusinessHours(props.businessHours, calendar) : null;
props.ui = ui;
props.extendedProps = __assign({}, leftovers1, props.extendedProps);
// help out ResourceApi from having user modify props
Object.freeze(ui.classNames);
Object.freeze(props.extendedProps);
if (store[props.id]) ;
else {
store[props.id] = props;
if (props.children) {
for (var _i = 0, _a = props.children; _i < _a.length; _i++) {
var childInput = _a[_i];
parseResource(childInput, props.id, store, calendar);
}
delete props.children;
}
}
return props;
}
/*
TODO: use this in more places
*/
function getPublicId(id) {
if (id.indexOf(PRIVATE_ID_PREFIX) === 0) {
return '';
}
return id;
}
function reduceResourceStore (store, action, source, calendar) {
switch (action.type) {
case 'INIT':
return {};
case 'RECEIVE_RESOURCES':
return receiveRawResources(store, action.rawResources, action.fetchId, source, calendar);
case 'ADD_RESOURCE':
return addResource(store, action.resourceHash);
case 'REMOVE_RESOURCE':
return removeResource(store, action.resourceId);
case 'SET_RESOURCE_PROP':
return setResourceProp(store, action.resourceId, action.propName, action.propValue);
case 'RESET_RESOURCES':
// must make the calendar think each resource is a new object :/
return core.mapHash(store, function (resource) {
return __assign({}, resource);
});
default:
return store;
}
}
function receiveRawResources(existingStore, inputs, fetchId, source, calendar) {
if (source.latestFetchId === fetchId) {
var nextStore = {};
for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
var input = inputs_1[_i];
parseResource(input, '', nextStore, calendar);
}
return nextStore;
}
else {
return existingStore;
}
}
function addResource(existingStore, additions) {
// TODO: warn about duplicate IDs
return __assign({}, existingStore, additions);
}
function removeResource(existingStore, resourceId) {
var newStore = __assign({}, existingStore);
delete newStore[resourceId];
// promote children
for (var childResourceId in newStore) { // a child, *maybe* but probably not
if (newStore[childResourceId].parentId === resourceId) {
newStore[childResourceId] = __assign({}, newStore[childResourceId], { parentId: '' });
}
}
return newStore;
}
function setResourceProp(existingStore, resourceId, name, value) {
var _a, _b;
var existingResource = existingStore[resourceId];
// TODO: sanitization
if (existingResource) {
return __assign({}, existingStore, (_a = {}, _a[resourceId] = __assign({}, existingResource, (_b = {}, _b[name] = value, _b)), _a));
}
else {
return existingStore;
}
}
function reduceResourceEntityExpansions(expansions, action) {
var _a;
switch (action.type) {
case 'INIT':
return {};
case 'SET_RESOURCE_ENTITY_EXPANDED':
return __assign({}, expansions, (_a = {}, _a[action.id] = action.isExpanded, _a));
default:
return expansions;
}
}
function resourcesReducers (state, action, calendar) {
var resourceSource = reduceResourceSource(state.resourceSource, action, state.dateProfile, calendar);
var resourceStore = reduceResourceStore(state.resourceStore, action, resourceSource, calendar);
var resourceEntityExpansions = reduceResourceEntityExpansions(state.resourceEntityExpansions, action);
return __assign({}, state, { resourceSource: resourceSource,
resourceStore: resourceStore,
resourceEntityExpansions: resourceEntityExpansions });
}
var RESOURCE_RELATED_PROPS = {
resourceId: String,
resourceIds: function (items) {
return (items || []).map(function (item) {
return String(item);
});
},
resourceEditable: Boolean
};
function parseEventDef(def, props, leftovers) {
var resourceRelatedProps = core.refineProps(props, RESOURCE_RELATED_PROPS, {}, leftovers);
var resourceIds = resourceRelatedProps.resourceIds;
if (resourceRelatedProps.resourceId) {
resourceIds.push(resourceRelatedProps.resourceId);
}
def.resourceIds = resourceIds;
def.resourceEditable = resourceRelatedProps.resourceEditable;
}
function transformDateSelectionJoin(hit0, hit1) {
var resourceId0 = hit0.dateSpan.resourceId;
var resourceId1 = hit1.dateSpan.resourceId;
if (resourceId0 && resourceId1) {
if (hit0.component.allowAcrossResources === false &&
resourceId0 !== resourceId1) {
return false;
}
else {
return { resourceId: resourceId0 };
}
}
}
var ResourceApi = /** @class */ (function () {
function ResourceApi(calendar, rawResource) {
this._calendar = calendar;
this._resource = rawResource;
}
ResourceApi.prototype.setProp = function (name, value) {
this._calendar.dispatch({
type: 'SET_RESOURCE_PROP',
resourceId: this._resource.id,
propName: name,
propValue: value
});
};
ResourceApi.prototype.remove = function () {
this._calendar.dispatch({
type: 'REMOVE_RESOURCE',
resourceId: this._resource.id
});
};
ResourceApi.prototype.getParent = function () {
var calendar = this._calendar;
var parentId = this._resource.parentId;
if (parentId) {
return new ResourceApi(calendar, calendar.state.resourceSource[parentId]);
}
else {
return null;
}
};
ResourceApi.prototype.getChildren = function () {
var thisResourceId = this._resource.id;
var calendar = this._calendar;
var resourceStore = calendar.state.resourceStore;
var childApis = [];
for (var resourceId in resourceStore) {
if (resourceStore[resourceId].parentId === thisResourceId) {
childApis.push(new ResourceApi(calendar, resourceStore[resourceId]));
}
}
return childApis;
};
/*
this is really inefficient!
TODO: make EventApi::resourceIds a hash or keep an index in the Calendar's state
*/
ResourceApi.prototype.getEvents = function () {
var thisResourceId = this._resource.id;
var calendar = this._calendar;
var _a = calendar.state.eventStore, defs = _a.defs, instances = _a.instances;
var eventApis = [];
for (var instanceId in instances) {
var instance = instances[instanceId];
var def = defs[instance.defId];
if (def.resourceIds.indexOf(thisResourceId) !== -1) { // inefficient!!!
eventApis.push(new core.EventApi(calendar, def, instance));
}
}
return eventApis;
};
Object.defineProperty(ResourceApi.prototype, "id", {
get: function () { return this._resource.id; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "title", {
get: function () { return this._resource.title; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "eventConstraint", {
get: function () { return this._resource.ui.constraints[0] || null; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "eventOverlap", {
get: function () { return this._resource.ui.overlap; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "eventAllow", {
get: function () { return this._resource.ui.allows[0] || null; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "eventBackgroundColor", {
get: function () { return this._resource.ui.backgroundColor; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "eventBorderColor", {
get: function () { return this._resource.ui.borderColor; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "eventTextColor", {
get: function () { return this._resource.ui.textColor; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "eventClassNames", {
// NOTE: user can't modify these because Object.freeze was called in event-def parsing
get: function () { return this._resource.ui.classNames; },
enumerable: true,
configurable: true
});
Object.defineProperty(ResourceApi.prototype, "extendedProps", {
get: function () { return this._resource.extendedProps; },
enumerable: true,
configurable: true
});
return ResourceApi;
}());
core.Calendar.prototype.addResource = function (input, scrollTo) {
var _a;
if (scrollTo === void 0) { scrollTo = true; }
var resourceHash;
var resource;
if (input instanceof ResourceApi) {
resource = input._resource;
resourceHash = (_a = {}, _a[resource.id] = resource, _a);
}
else {
resourceHash = {};
resource = parseResource(input, '', resourceHash, this);
}
// HACK
if (scrollTo) {
this.component.view.addScroll({ forcedRowId: resource.id });
}
this.dispatch({
type: 'ADD_RESOURCE',
resourceHash: resourceHash
});
return new ResourceApi(this, resource);
};
core.Calendar.prototype.getResourceById = function (id) {
id = String(id);
if (this.state.resourceStore) { // guard against calendar with no resource functionality
var rawResource = this.state.resourceStore[id];
if (rawResource) {
return new ResourceApi(this, rawResource);
}
}
return null;
};
core.Calendar.prototype.getResources = function () {
var resourceStore = this.state.resourceStore;
var resourceApis = [];
if (resourceStore) { // guard against calendar with no resource functionality
for (var resourceId in resourceStore) {
resourceApis.push(new ResourceApi(this, resourceStore[resourceId]));
}
}
return resourceApis;
};
core.Calendar.prototype.getTopLevelResources = function () {
var resourceStore = this.state.resourceStore;
var resourceApis = [];
if (resourceStore) { // guard against calendar with no resource functionality
for (var resourceId in resourceStore) {
if (!resourceStore[resourceId].parentId) {
resourceApis.push(new ResourceApi(this, resourceStore[resourceId]));
}
}
}
return resourceApis;
};
core.Calendar.prototype.rerenderResources = function () {
this.dispatch({
type: 'RESET_RESOURCES'
});
};
core.Calendar.prototype.refetchResources = function () {
this.dispatch({
type: 'REFETCH_RESOURCES'
});
};
function transformDatePoint(dateSpan, calendar) {
return dateSpan.resourceId ?
{ resource: calendar.getResourceById(dateSpan.resourceId) } :
{};
}
function transformDateSpan(dateSpan, calendar) {
return dateSpan.resourceId ?
{ resource: calendar.getResourceById(dateSpan.resourceId) } :
{};
}
/*
splits things BASED OFF OF which resources they are associated with.
creates a '' entry which is when something has NO resource.
*/
var ResourceSplitter = /** @class */ (function (_super) {
__extends(ResourceSplitter, _super);
function ResourceSplitter() {
return _super !== null && _super.apply(this, arguments) || this;
}
ResourceSplitter.prototype.getKeyInfo = function (props) {
return __assign({ '': {} }, props.resourceStore // already has `ui` and `businessHours` keys!
);
};
ResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) {
return [dateSpan.resourceId || ''];
};
ResourceSplitter.prototype.getKeysForEventDef = function (eventDef) {
var resourceIds = eventDef.resourceIds;
if (!resourceIds.length) {
return [''];
}
return resourceIds;
};
return ResourceSplitter;
}(core.Splitter));
function isPropsValidWithResources(props, calendar) {
var splitter = new ResourceSplitter();
var sets = splitter.splitProps(__assign({}, props, { resourceStore: calendar.state.resourceStore }));
for (var resourceId in sets) {
var props_1 = sets[resourceId];
// merge in event data from the non-resource segment
if (resourceId && sets['']) { // current segment is not the non-resource one, and there IS a non-resource one
props_1 = __assign({}, props_1, { eventStore: core.mergeEventStores(sets[''].eventStore, props_1.eventStore), eventUiBases: __assign({}, sets[''].eventUiBases, props_1.eventUiBases) });
}
if (!core.isPropsValid(props_1, calendar, { resourceId: resourceId }, filterConfig.bind(null, resourceId))) {
return false;
}
}
return true;
}
function filterConfig(resourceId, config) {
return __assign({}, config, { constraints: filterConstraints(resourceId, config.constraints) });
}
function filterConstraints(resourceId, constraints) {
return constraints.map(function (constraint) {
var defs = constraint.defs;
if (defs) { // we are dealing with an EventStore
// if any of the events define constraints to resources that are NOT this resource,
// then this resource is unconditionally prohibited, which is what a `false` value does.
for (var defId in defs) {
var resourceIds = defs[defId].resourceIds;
if (resourceIds.length && resourceIds.indexOf(resourceId) === -1) { // TODO: use a hash?!!! (for other reasons too)
return false;
}
}
}
return constraint;
});
}
function transformExternalDef(dateSpan) {
return dateSpan.resourceId ?
{ resourceId: dateSpan.resourceId } :
{};
}
function transformEventResizeJoin(hit0, hit1) {
var component = hit0.component;
if (component.allowAcrossResources === false &&
hit0.dateSpan.resourceId !== hit1.dateSpan.resourceId) {
return false;
}
}
core.EventApi.prototype.getResources = function () {
var calendar = this._calendar;
return this._def.resourceIds.map(function (resourceId) {
return calendar.getResourceById(resourceId);
});
};
core.EventApi.prototype.setResources = function (resources) {
var resourceIds = [];
// massage resources -> resourceIds
for (var _i = 0, resources_1 = resources; _i < resources_1.length; _i++) {
var resource = resources_1[_i];
var resourceId = null;
if (typeof resource === 'string') {
resourceId = resource;
}
else if (typeof resource === 'number') {
resourceId = String(resource);
}
else if (resource instanceof ResourceApi) {
resourceId = resource.id; // guaranteed to always have an ID. hmmm
}
else {
console.warn('unknown resource type: ' + resource);
}
if (resourceId) {
resourceIds.push(resourceId);
}
}
this.mutate({
standardProps: {
resourceIds: resourceIds
}
});
};
var RELEASE_DATE = '2019-08-10'; // for Scheduler
var UPGRADE_WINDOW = 365 + 7; // days. 1 week leeway, for tz shift reasons too
var LICENSE_INFO_URL = 'http://fullcalendar.io/scheduler/license/';
var PRESET_LICENSE_KEYS = [
'GPL-My-Project-Is-Open-Source',
'CC-Attribution-NonCommercial-NoDerivatives'
];
var CSS = {
position: 'absolute',
'z-index': 99999,
bottom: '1px',
left: '1px',
background: '#eee',
'border-color': '#ddd',
'border-style': 'solid',
'border-width': '1px 1px 0 0',
padding: '2px 4px',
'font-size': '12px',
'border-top-right-radius': '3px'
};
function injectLicenseWarning(containerEl, calendar) {
var key = calendar.opt('schedulerLicenseKey');
if (!isImmuneUrl(window.location.href) && !isValidKey(key)) {
core.appendToElement(containerEl, '<div class="fc-license-message" style="' + core.htmlEscape(core.cssToStr(CSS)) + '">' +
'Please use a valid license key. <a href="' + LICENSE_INFO_URL + '">More Info</a>' +
'</div>');
}
}
/*
This decryption is not meant to be bulletproof. Just a way to remind about an upgrade.
*/
function isValidKey(key) {
if (PRESET_LICENSE_KEYS.indexOf(key) !== -1) {
return true;
}
var parts = (key || '').match(/^(\d+)\-fcs\-(\d+)$/);
if (parts && (parts[1].length === 10)) {
var purchaseDate = new Date(parseInt(parts[2], 10) * 1000);
var releaseDate = new Date(core.config.mockSchedulerReleaseDate || RELEASE_DATE);
if (core.isValidDate(releaseDate)) { // token won't be replaced in dev mode
var minPurchaseDate = core.addDays(releaseDate, -UPGRADE_WINDOW);
if (minPurchaseDate < purchaseDate) {
return true;
}
}
}
return false;
}
function isImmuneUrl(url) {
return /\w+\:\/\/fullcalendar\.io\/|\/examples\/[\w-]+\.html$/.test(url);
}
var optionChangeHandlers = {
resources: handleResources
};
function handleResources(newSourceInput, calendar, deepEqual) {
var oldSourceInput = calendar.state.resourceSource._raw;
if (!deepEqual(oldSourceInput, newSourceInput)) {
calendar.dispatch({
type: 'RESET_RESOURCE_SOURCE',
resourceSourceInput: newSourceInput
});
}
}
registerResourceSourceDef({
ignoreRange: true,
parseMeta: function (raw) {
if (Array.isArray(raw)) {
return raw;
}
else if (Array.isArray(raw.resources)) {
return raw.resources;
}
return null;
},
fetch: function (arg, successCallback) {
successCallback({
rawResources: arg.resourceSource.meta
});
}
});
registerResourceSourceDef({
parseMeta: function (raw) {
if (typeof raw === 'function') {
return raw;
}
else if (typeof raw.resources === 'function') {
return raw.resources;
}
return null;
},
fetch: function (arg, success, failure) {
var dateEnv = arg.calendar.dateEnv;
var func = arg.resourceSource.meta;
var publicArg = {};
if (arg.range) {
publicArg = {
start: dateEnv.toDate(arg.range.start),
end: dateEnv.toDate(arg.range.end),
startStr: dateEnv.formatIso(arg.range.start),
endStr: dateEnv.formatIso(arg.range.end),
timeZone: dateEnv.timeZone
};
}
// TODO: make more dry with EventSourceFunc
// TODO: accept a response?
core.unpromisify(func.bind(null, publicArg), function (rawResources) {
success({ rawResources: rawResources }); // needs an object response
}, failure // send errorObj directly to failure callback
);
}
});
registerResourceSourceDef({
parseMeta: function (raw) {
if (typeof raw === 'string') {
raw = { url: raw };
}
else if (!raw || typeof raw !== 'object' || !raw.url) {
return null;
}
return {
url: raw.url,
method: (raw.method || 'GET').toUpperCase(),
extraParams: raw.extraParams
};
},
fetch: function (arg, successCallback, failureCallback) {
var meta = arg.resourceSource.meta;
var requestParams = buildRequestParams(meta, arg.range, arg.calendar);
core.requestJson(meta.method, meta.url, requestParams, function (rawResources, xhr) {
successCallback({ rawResources: rawResources, xhr: xhr });
}, function (message, xhr) {
failureCallback({ message: message, xhr: xhr });
});
}
});
// TODO: somehow consolidate with event json feed
function buildRequestParams(meta, range, calendar) {
var dateEnv = calendar.dateEnv;
var startParam;
var endParam;
var timeZoneParam;
var customRequestParams;
var params = {};
if (range) {
// startParam = meta.startParam
// if (startParam == null) {
startParam = calendar.opt('startParam');
// }
// endParam = meta.endParam
// if (endParam == null) {
endParam = calendar.opt('endParam');
// }
// timeZoneParam = meta.timeZoneParam
// if (timeZoneParam == null) {
timeZoneParam = calendar.opt('timeZoneParam');
// }
params[startParam] = dateEnv.formatIso(range.start);
params[endParam] = dateEnv.formatIso(range.end);
if (dateEnv.timeZone !== 'local') {
params[timeZoneParam] = dateEnv.timeZone;
}
}
// retrieve any outbound GET/POST data from the options
if (typeof meta.extraParams === 'function') {
// supplied as a function that returns a key/value object
customRequestParams = meta.extraParams();
}
else {
// probably supplied as a straight key/value object
customRequestParams = meta.extraParams || {};
}
__assign(params, customRequestParams);
return params;
}
function buildResourceTextFunc(resourceTextSetting, calendar) {
if (typeof resourceTextSetting === 'function') {
return function (resource) {
return resourceTextSetting(new ResourceApi(calendar, resource));
};
}
else {
return function (resource) {
return resource.title || getPublicId(resource.id);
};
}
}
var ResourceDayHeader = /** @class */ (function (_super) {
__extends(ResourceDayHeader, _super);
function ResourceDayHeader(context, parentEl) {
var _this = _super.call(this, context) || this;
_this.datesAboveResources = _this.opt('datesAboveResources');
_this.resourceTextFunc = buildResourceTextFunc(_this.opt('resourceText'), _this.calendar);
parentEl.innerHTML = ''; // because might be nbsp
parentEl.appendChild(_this.el = core.htmlToElement('<div class="fc-row ' + _this.theme.getClass('headerRow') + '">' +
'<table class="' + _this.theme.getClass('tableGrid') + '">' +
'<thead></thead>' +
'</table>' +
'</div>'));
_this.thead = _this.el.querySelector('thead');
return _this;
}
ResourceDayHeader.prototype.destroy = function () {
core.removeElement(this.el);
};
ResourceDayHeader.prototype.render = function (props) {
var html;
this.dateFormat = core.createFormatter(this.opt('columnHeaderFormat') ||
core.computeFallbackHeaderFormat(props.datesRepDistinctDays, props.dates.length));
if (props.dates.length === 1) {
html = this.renderResourceRow(props.resources);
}
else {
if (this.datesAboveResources) {
html = this.renderDayAndResourceRows(props.dates, props.resources);
}
else {
html = this.renderResourceAndDayRows(props.resources, props.dates);
}
}
this.thead.innerHTML = html;
this.processResourceEls(props.resources);
};
ResourceDayHeader.prototype.renderResourceRow = function (resources) {
var _this = this;
var cellHtmls = resources.map(function (resource) {
return _this.renderResourceCell(resource, 1);
});
return this.buildTr(cellHtmls);
};
ResourceDayHeader.prototype.renderDayAndResourceRows = function (dates, resources) {
var dateHtmls = [];
var resourceHtmls = [];
for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
var date = dates_1[_i];
dateHtmls.push(this.renderDateCell(date, resources.length));
for (var _a = 0, resources_1 = resources; _a < resources_1.length; _a++) {
var resource = resources_1[_a];
resourceHtmls.push(this.renderResourceCell(resource, 1, date));
}
}
return this.buildTr(dateHtmls) +
this.buildTr(resourceHtmls);
};
ResourceDayHeader.prototype.renderResourceAndDayRows = function (resources, dates) {
var resourceHtmls = [];
var dateHtmls = [];
for (var _i = 0, resources_2 = resources; _i < resources_2.length; _i++) {
var resource = resources_2[_i];
resourceHtmls.push(this.renderResourceCell(resource, dates.length));
for (var _a = 0, dates_2 = dates; _a < dates_2.length; _a++) {
var date = dates_2[_a];
dateHtmls.push(this.renderDateCell(date, 1, resource));
}
}
return this.buildTr(resourceHtmls) +
this.buildTr(dateHtmls);
};
// Cell Rendering Utils
// ----------------------------------------------------------------------------------------------
// a cell with the resource name. might be associated with a specific day
ResourceDayHeader.prototype.renderResourceCell = function (resource, colspan, date) {
var dateEnv = this.dateEnv;
return '<th class="fc-resource-cell"' +
' data-resource-id="' + resource.id + '"' +
(date ?
' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
'') +
(colspan > 1 ?
' colspan="' + colspan + '"' :
'') +
'>' +
core.htmlEscape(this.resourceTextFunc(resource)) +
'</th>';
};
// a cell with date text. might have a resource associated with it
ResourceDayHeader.prototype.renderDateCell = function (date, colspan, resource) {
var props = this.props;
return core.renderDateCell(date, props.dateProfile, props.datesRepDistinctDays, props.dates.length * props.resources.length, this.dateFormat, this.context, colspan, resource ? 'data-resource-id="' + resource.id + '"' : '');
};
ResourceDayHeader.prototype.buildTr = function (cellHtmls) {
if (!cellHtmls.length) {
cellHtmls = ['<td>&nbsp;</td>'];
}
if (this.props.renderIntroHtml) {
cellHtmls = [this.props.renderIntroHtml()].concat(cellHtmls);
}
if (this.isRtl) {
cellHtmls.reverse();
}
return '<tr>' +
cellHtmls.join('') +
'</tr>';
};
// Post-rendering
// ----------------------------------------------------------------------------------------------
// given a container with already rendered resource cells
ResourceDayHeader.prototype.processResourceEls = function (resources) {
var _this = this;
var view = this.view;
core.findElements(this.thead, '.fc-resource-cell').forEach(function (node, col) {
col = col % resources.length;
if (_this.isRtl) {
col = resources.length - 1 - col;
}
var resource = resources[col];
view.publiclyTrigger('resourceRender', [
{
resource: new ResourceApi(_this.calendar, resource),
el: node,
view: view
}
]);
});
};
return ResourceDayHeader;
}(core.Component));
var AbstractResourceDayTable = /** @class */ (function () {
function AbstractResourceDayTable(dayTable, resources) {
this.dayTable = dayTable;
this.resources = resources;
this.resourceIndex = new ResourceIndex(resources);
this.rowCnt = dayTable.rowCnt;
this.colCnt = dayTable.colCnt * resources.length;
this.cells = this.buildCells();
}
AbstractResourceDayTable.prototype.buildCells = function () {
var _a = this, rowCnt = _a.rowCnt, dayTable = _a.dayTable, resources = _a.resources;
var rows = [];
for (var row = 0; row < rowCnt; row++) {
var rowCells = [];
for (var dateCol = 0; dateCol < dayTable.colCnt; dateCol++) {
for (var resourceCol = 0; resourceCol < resources.length; resourceCol++) {
var resource = resources[resourceCol];
var htmlAttrs = 'data-resource-id="' + resource.id + '"';
rowCells[this.computeCol(dateCol, resourceCol)] = {
date: dayTable.cells[row][dateCol].date,
resource: resource,
htmlAttrs: htmlAttrs
};
}
}
rows.push(rowCells);
}
return rows;
};
return AbstractResourceDayTable;
}());
/*
resources over dates
*/
var ResourceDayTable = /** @class */ (function (_super) {
__extends(ResourceDayTable, _super);
function ResourceDayTable() {
return _super !== null && _super.apply(this, arguments) || this;
}
ResourceDayTable.prototype.computeCol = function (dateI, resourceI) {
return resourceI * this.dayTable.colCnt + dateI;
};
/*
all date ranges are intact
*/
ResourceDayTable.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) {
return [
{
firstCol: this.computeCol(dateStartI, resourceI),
lastCol: this.computeCol(dateEndI, resourceI),
isStart: true,
isEnd: true
}
];
};
return ResourceDayTable;
}(AbstractResourceDayTable));
/*
dates over resources
*/
var DayResourceTable = /** @class */ (function (_super) {
__extends(DayResourceTable, _super);
function DayResourceTable() {
return _super !== null && _super.apply(this, arguments) || this;
}
DayResourceTable.prototype.computeCol = function (dateI, resourceI) {
return dateI * this.resources.length + resourceI;
};
/*
every single day is broken up
*/
DayResourceTable.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) {
var segs = [];
for (var i = dateStartI; i <= dateEndI; i++) {
var col = this.computeCol(i, resourceI);
segs.push({
firstCol: col,
lastCol: col,
isStart: i === dateStartI,
isEnd: i === dateEndI
});
}
return segs;
};
return DayResourceTable;
}(AbstractResourceDayTable));
var ResourceIndex = /** @class */ (function () {
function ResourceIndex(resources) {
var indicesById = {};
var ids = [];
for (var i = 0; i < resources.length; i++) {
var id = resources[i].id;
ids.push(id);
indicesById[id] = i;
}
this.ids = ids;
this.indicesById = indicesById;
this.length = resources.length;
}
return ResourceIndex;
}());
/*
TODO: just use ResourceHash somehow? could then use the generic ResourceSplitter
*/
var VResourceSplitter = /** @class */ (function (_super) {
__extends(VResourceSplitter, _super);
function VResourceSplitter() {
return _super !== null && _super.apply(this, arguments) || this;
}
VResourceSplitter.prototype.getKeyInfo = function (props) {
var resourceDayTable = props.resourceDayTable;
var hash = core.mapHash(resourceDayTable.resourceIndex.indicesById, function (i) {
return resourceDayTable.resources[i]; // has `ui` AND `businessHours` keys!
}); // :(
hash[''] = {};
return hash;
};
VResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) {
return [dateSpan.resourceId || ''];
};
VResourceSplitter.prototype.getKeysForEventDef = function (eventDef) {
var resourceIds = eventDef.resourceIds;
if (!resourceIds.length) {
return [''];
}
return resourceIds;
};
return VResourceSplitter;
}(core.Splitter));
// joiner
var NO_SEGS = []; // for memoizing
var VResourceJoiner = /** @class */ (function () {
function VResourceJoiner() {
this.joinDateSelection = core.memoize(this.joinSegs);
this.joinBusinessHours = core.memoize(this.joinSegs);
this.joinFgEvents = core.memoize(this.joinSegs);
this.joinBgEvents = core.memoize(this.joinSegs);
this.joinEventDrags = core.memoize(this.joinInteractions);
this.joinEventResizes = core.memoize(this.joinInteractions);
}
/*
propSets also has a '' key for things with no resource
*/
VResourceJoiner.prototype.joinProps = function (propSets, resourceDayTable) {
var dateSelectionSets = [];
var businessHoursSets = [];
var fgEventSets = [];
var bgEventSets = [];
var eventDrags = [];
var eventResizes = [];
var eventSelection = '';
var keys = resourceDayTable.resourceIndex.ids.concat(['']); // add in the all-resource key
for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
var key = keys_1[_i];
var props = propSets[key];
dateSelectionSets.push(props.dateSelectionSegs);
businessHoursSets.push(key ? props.businessHourSegs : NO_SEGS); // don't include redundant all-resource businesshours
fgEventSets.push(key ? props.fgEventSegs : NO_SEGS); // don't include fg all-resource segs
bgEventSets.push(props.bgEventSegs);
eventDrags.push(props.eventDrag);
eventResizes.push(props.eventResize);
eventSelection = eventSelection || props.eventSelection;
}
return {
dateSelectionSegs: this.joinDateSelection.apply(this, [resourceDayTable].concat(dateSelectionSets)),
businessHourSegs: this.joinBusinessHours.apply(this, [resourceDayTable].concat(businessHoursSets)),
fgEventSegs: this.joinFgEvents.apply(this, [resourceDayTable].concat(fgEventSets)),
bgEventSegs: this.joinBgEvents.apply(this, [resourceDayTable].concat(bgEventSets)),
eventDrag: this.joinEventDrags.apply(this, [resourceDayTable].concat(eventDrags)),
eventResize: this.joinEventResizes.apply(this, [resourceDayTable].concat(eventResizes)),
eventSelection: eventSelection
};
};
VResourceJoiner.prototype.joinSegs = function (resourceDayTable) {
var segGroups = [];
for (var _i = 1; _i < arguments.length; _i++) {
segGroups[_i - 1] = arguments[_i];
}
var resourceCnt = resourceDayTable.resources.length;
var transformedSegs = [];
for (var i = 0; i < resourceCnt; i++) {
for (var _a = 0, _b = segGroups[i]; _a < _b.length; _a++) {
var seg = _b[_a];
transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));
}
for (var _c = 0, _d = segGroups[resourceCnt]; _c < _d.length; _c++) { // one beyond. the all-resource
var seg = _d[_c];
transformedSegs.push.apply(// one beyond. the all-resource
transformedSegs, this.transformSeg(seg, resourceDayTable, i));
}
}
return transformedSegs;
};
/*
for expanding non-resource segs to all resources.
only for public use.
no memoizing.
*/
VResourceJoiner.prototype.expandSegs = function (resourceDayTable, segs) {
var resourceCnt = resourceDayTable.resources.length;
var transformedSegs = [];
for (var i = 0; i < resourceCnt; i++) {
for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
var seg = segs_1[_i];
transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));
}
}
return transformedSegs;
};
VResourceJoiner.prototype.joinInteractions = function (resourceDayTable) {
var interactions = [];
for (var _i = 1; _i < arguments.length; _i++) {
interactions[_i - 1] = arguments[_i];
}
var resourceCnt = resourceDayTable.resources.length;
var affectedInstances = {};
var transformedSegs = [];
var isEvent = false;
var sourceSeg = null;
for (var i = 0; i < resourceCnt; i++) {
var interaction = interactions[i];
if (interaction) {
for (var _a = 0, _b = interaction.segs; _a < _b.length; _a++) {
var seg = _b[_a];
transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i) // TODO: templateify Interaction::segs
);
}
__assign(affectedInstances, interaction.affectedInstances);
isEvent = isEvent || interaction.isEvent;
sourceSeg = sourceSeg || interaction.sourceSeg;
}
if (interactions[resourceCnt]) { // one beyond. the all-resource
for (var _c = 0, _d = interactions[resourceCnt].segs; _c < _d.length; _c++) {
var seg = _d[_c];
transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i) // TODO: templateify Interaction::segs
);
}
}
}
return {
affectedInstances: affectedInstances,
segs: transformedSegs,
isEvent: isEvent,
sourceSeg: sourceSeg
};
};
return VResourceJoiner;
}());
/*
doesn't accept grouping
*/
function flattenResources(resourceStore, orderSpecs) {
return buildRowNodes(resourceStore, [], orderSpecs, false, {}, true)
.map(function (node) {
return node.resource;
});
}
function buildRowNodes(resourceStore, groupSpecs, orderSpecs, isVGrouping, expansions, expansionDefault) {
var complexNodes = buildHierarchy(resourceStore, isVGrouping ? -1 : 1, groupSpecs, orderSpecs);
var flatNodes = [];
flattenNodes(complexNodes, flatNodes, isVGrouping, [], 0, expansions, expansionDefault);
return flatNodes;
}
function flattenNodes(complexNodes, res, isVGrouping, rowSpans, depth, expansions, expansionDefault) {
for (var i = 0; i < complexNodes.length; i++) {
var complexNode = complexNodes[i];
var group = complexNode.group;
if (group) {
if (isVGrouping) {
var firstRowIndex = res.length;
var rowSpanIndex = rowSpans.length;
flattenNodes(complexNode.children, res, isVGrouping, rowSpans.concat(0), depth, expansions, expansionDefault);
if (firstRowIndex < res.length) {
var firstRow = res[firstRowIndex];
var firstRowSpans = firstRow.rowSpans = firstRow.rowSpans.slice();
firstRowSpans[rowSpanIndex] = res.length - firstRowIndex;
}
}
else {
var id = group.spec.field + ':' + group.value;
var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault;
res.push({ id: id, group: group, isExpanded: isExpanded });
if (isExpanded) {
flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault);
}
}
}
else if (complexNode.resource) {
var id = complexNode.resource.id;
var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault;
res.push({
id: id,
rowSpans: rowSpans,
depth: depth,
isExpanded: isExpanded,
hasChildren: Boolean(complexNode.children.length),
resource: complexNode.resource,
resourceFields: complexNode.resourceFields
});
if (isExpanded) {
flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault);
}
}
}
}
function buildHierarchy(resourceStore, maxDepth, groupSpecs, orderSpecs) {
var resourceNodes = buildResourceNodes(resourceStore, orderSpecs);
var builtNodes = [];
for (var resourceId in resourceNodes) {
var resourceNode = resourceNodes[resourceId];
if (!resourceNode.resource.parentId) {
insertResourceNode(resourceNode, builtNodes, groupSpecs, 0, maxDepth, orderSpecs);
}
}
return builtNodes;
}
function buildResourceNodes(resourceStore, orderSpecs) {
var nodeHash = {};
for (var resourceId in resourceStore) {
var resource = resourceStore[resourceId];
nodeHash[resourceId] = {
resource: resource,
resourceFields: buildResourceFields(resource),
children: []
};
}
for (var resourceId in resourceStore) {
var resource = resourceStore[resourceId];
if (resource.parentId) {
var parentNode = nodeHash[resource.parentId];
if (parentNode) {
insertResourceNodeInSiblings(nodeHash[resourceId], parentNode.children, orderSpecs);
}
}
}
return nodeHash;
}
function insertResourceNode(resourceNode, nodes, groupSpecs, depth, maxDepth, orderSpecs) {
if (groupSpecs.length && (maxDepth === -1 || depth <= maxDepth)) {
var groupNode = ensureGroupNodes(resourceNode, nodes, groupSpecs[0]);
insertResourceNode(resourceNode, groupNode.children, groupSpecs.slice(1), depth + 1, maxDepth, orderSpecs);
}
else {
insertResourceNodeInSiblings(resourceNode, nodes, orderSpecs);
}
}
function ensureGroupNodes(resourceNode, nodes, groupSpec) {
var groupValue = resourceNode.resourceFields[groupSpec.field];
var groupNode;
var newGroupIndex;
// find an existing group that matches, or determine the position for a new group
if (groupSpec.order) {
for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex++) {
var node = nodes[newGroupIndex];
if (node.group) {
var cmp = core.flexibleCompare(groupValue, node.group.value) * groupSpec.order;
if (cmp === 0) {
groupNode = node;
break;
}
else if (cmp < 0) {
break;
}
}
}
}
else { // the groups are unordered
for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex++) {
var node = nodes[newGroupIndex];
if (node.group && groupValue === node.group.value) {
groupNode = node;
break;
}
}
}
if (!groupNode) {
groupNode = {
group: {
value: groupValue,
spec: groupSpec
},
children: []
};
nodes.splice(newGroupIndex, 0, groupNode);
}
return groupNode;
}
function insertResourceNodeInSiblings(resourceNode, siblings, orderSpecs) {
var i;
for (i = 0; i < siblings.length; i++) {
var cmp = core.compareByFieldSpecs(siblings[i].resourceFields, resourceNode.resourceFields, orderSpecs);
if (cmp > 0) { // went 1 past. insert at i
break;
}
}
siblings.splice(i, 0, resourceNode);
}
function buildResourceFields(resource) {
var obj = __assign({}, resource.extendedProps, resource.ui, resource);
delete obj.ui;
delete obj.extendedProps;
return obj;
}
function isGroupsEqual(group0, group1) {
return group0.spec === group1.spec && group0.value === group1.value;
}
var main = core.createPlugin({
reducers: [resourcesReducers],
eventDefParsers: [parseEventDef],
isDraggableTransformers: [transformIsDraggable],
eventDragMutationMassagers: [massageEventDragMutation],
eventDefMutationAppliers: [applyEventDefMutation],
dateSelectionTransformers: [transformDateSelectionJoin],
datePointTransforms: [transformDatePoint],
dateSpanTransforms: [transformDateSpan],
viewPropsTransformers: [ResourceDataAdder, ResourceEventConfigAdder],
isPropsValid: isPropsValidWithResources,
externalDefTransforms: [transformExternalDef],
eventResizeJoinTransforms: [transformEventResizeJoin],
viewContainerModifiers: [injectLicenseWarning],
eventDropTransformers: [transformEventDrop],
optionChangeHandlers: optionChangeHandlers
});
exports.AbstractResourceDayTable = AbstractResourceDayTable;
exports.DayResourceTable = DayResourceTable;
exports.ResourceApi = ResourceApi;
exports.ResourceDayHeader = ResourceDayHeader;
exports.ResourceDayTable = ResourceDayTable;
exports.ResourceSplitter = ResourceSplitter;
exports.VResourceJoiner = VResourceJoiner;
exports.VResourceSplitter = VResourceSplitter;
exports.buildResourceFields = buildResourceFields;
exports.buildResourceTextFunc = buildResourceTextFunc;
exports.buildRowNodes = buildRowNodes;
exports.default = main;
exports.flattenResources = flattenResources;
exports.isGroupsEqual = isGroupsEqual;
Object.defineProperty(exports, '__esModule', { value: true });
}));
/*!
FullCalendar Resources Common Plugin v4.3.1
Docs & License: https://fullcalendar.io/scheduler
(c) 2019 Adam Shaw
*/
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],r):r((e=e||self).FullCalendarResourceCommon={},e.FullCalendar)}(this,function(e,r){"use strict";var t=function(e,r){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)r.hasOwnProperty(t)&&(e[t]=r[t])})(e,r)};function n(e,r){function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}var o=function(){return(o=Object.assign||function(e){for(var r,t=1,n=arguments.length;t<n;t++)for(var o in r=arguments[t])Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o]);return e}).apply(this,arguments)};function s(e,r){var t=e.resourceEditable;if(null==t){var n=e.sourceId&&r.state.eventSources[e.sourceId];n&&(t=n.extendedProps.resourceEditable),null==t&&null==(t=r.opt("eventResourceEditable"))&&(t=r.opt("editable"))}return t}var u=function(){function e(){this.filterResources=r.memoize(i)}return e.prototype.transform=function(e,r,t,n){if(r.class.needsResourceData)return{resourceStore:this.filterResources(t.resourceStore,n.opt("filterResourcesWithEvents"),t.eventStore,t.dateProfile.activeRange),resourceEntityExpansions:t.resourceEntityExpansions}},e}();function i(e,t,n,s){if(t){var u=function(e,r){var t={};for(var n in e)for(var o=e[n],s=0,u=r[o.defId].resourceIds;s<u.length;s++){var i=u[s];t[i]=!0}return t}(function(e,t){return r.filterHash(e,function(e){return r.rangesIntersect(e.range,t)})}(n.instances,s),n.defs);return o(u,function(e,r){var t={};for(var n in e)for(var o=void 0;(o=r[n])&&(n=o.parentId);)t[n]=!0;return t}(u,e)),r.filterHash(e,function(e,r){return u[r]})}return e}var a=function(){function e(){this.buildResourceEventUis=r.memoizeOutput(c,r.isPropsEqual),this.injectResourceEventUis=r.memoize(l)}return e.prototype.transform=function(e,r,t){if(!r.class.needsResourceData)return{eventUiBases:this.injectResourceEventUis(e.eventUiBases,e.eventStore.defs,this.buildResourceEventUis(t.resourceStore))}},e}();function c(e){return r.mapHash(e,function(e){return e.ui})}function l(e,t,n){return r.mapHash(e,function(e,o){return o?function(e,t,n){for(var o=[],s=0,u=t.resourceIds;s<u.length;s++){var i=u[s];n[i]&&o.unshift(n[i])}return o.unshift(e),r.combineEventUis(o)}(e,t[o],n):e})}var d={id:String},f=[],p=0;function h(e){f.push(e)}function v(e,t,n){var o=r.refineProps(e,d);return o.sourceId=String(p++),o.sourceDefId=n,o.meta=t,o.publicId=o.id,o.isFetching=!1,o.latestFetchId="",o.fetchRange=null,delete o.id,o}function g(e,t,n,s){switch(t.type){case"INIT":return y(s.opt("resources"),s);case"RESET_RESOURCE_SOURCE":return y(t.resourceSourceInput,s,!0);case"PREV":case"NEXT":case"SET_DATE":case"SET_VIEW_TYPE":return function(e,t,n){return!n.opt("refetchResourcesOnNavigate")||function(e){return Boolean(f[e.sourceDefId].ignoreRange)}(e)||e.fetchRange&&r.rangesEqual(e.fetchRange,t)?e:E(e,t,n)}(e,n.activeRange,s);case"RECEIVE_RESOURCES":case"RECEIVE_RESOURCE_ERROR":return function(e,r,t){if(r===e.latestFetchId)return o({},e,{isFetching:!1,fetchRange:t});return e}(e,t.fetchId,t.fetchRange);case"REFETCH_RESOURCES":return E(e,n.activeRange,s);default:return e}}var R=0;function y(e,r,t){if(e){var n=function(e){for(var r=f.length-1;r>=0;r--){var t=f[r].parseMeta(e);if(t){var n=v("object"==typeof e&&e?e:{},t,r);return n._raw=e,n}}return null}(e);return!t&&r.opt("refetchResourcesOnNavigate")||(n=E(n,null,r)),n}return null}function E(e,r,t){var n,s=(n=e.sourceDefId,f[n]),u=String(R++);return s.fetch({resourceSource:e,calendar:t,range:r},function(e){t.afterSizingTriggers._resourcesRendered=[null],t.dispatch({type:"RECEIVE_RESOURCES",fetchId:u,fetchRange:r,rawResources:e.rawResources})},function(e){t.dispatch({type:"RECEIVE_RESOURCE_ERROR",fetchId:u,fetchRange:r,error:e})}),o({},e,{isFetching:!0,latestFetchId:u})}var m={id:String,title:String,parentId:String,businessHours:null,children:null,extendedProps:null},S="_fc:",I=0;function b(e,t,n,s){void 0===t&&(t="");var u={},i=r.refineProps(e,m,{},u),a={},c=r.processScopedUiProps("event",u,s,a);if(i.id||(i.id=S+I++),i.parentId||(i.parentId=t),i.businessHours=i.businessHours?r.parseBusinessHours(i.businessHours,s):null,i.ui=c,i.extendedProps=o({},a,i.extendedProps),Object.freeze(c.classNames),Object.freeze(i.extendedProps),n[i.id]);else if(n[i.id]=i,i.children){for(var l=0,d=i.children;l<d.length;l++){b(d[l],i.id,n,s)}delete i.children}return i}function C(e,t,n,s){switch(t.type){case"INIT":return{};case"RECEIVE_RESOURCES":return function(e,r,t,n,o){if(n.latestFetchId===t){for(var s={},u=0,i=r;u<i.length;u++){var a=i[u];b(a,"",s,o)}return s}return e}(e,t.rawResources,t.fetchId,n,s);case"ADD_RESOURCE":return u=e,i=t.resourceHash,o({},u,i);case"REMOVE_RESOURCE":return function(e,r){var t=o({},e);for(var n in delete t[r],t)t[n].parentId===r&&(t[n]=o({},t[n],{parentId:""}));return t}(e,t.resourceId);case"SET_RESOURCE_PROP":return function(e,r,t,n){var s,u,i=e[r];return i?o({},e,((s={})[r]=o({},i,((u={})[t]=n,u)),s)):e}(e,t.resourceId,t.propName,t.propValue);case"RESET_RESOURCES":return r.mapHash(e,function(e){return o({},e)});default:return e}var u,i}var _={resourceId:String,resourceIds:function(e){return(e||[]).map(function(e){return String(e)})},resourceEditable:Boolean};var w=function(){function e(e,r){this._calendar=e,this._resource=r}return e.prototype.setProp=function(e,r){this._calendar.dispatch({type:"SET_RESOURCE_PROP",resourceId:this._resource.id,propName:e,propValue:r})},e.prototype.remove=function(){this._calendar.dispatch({type:"REMOVE_RESOURCE",resourceId:this._resource.id})},e.prototype.getParent=function(){var r=this._calendar,t=this._resource.parentId;return t?new e(r,r.state.resourceSource[t]):null},e.prototype.getChildren=function(){var r=this._resource.id,t=this._calendar,n=t.state.resourceStore,o=[];for(var s in n)n[s].parentId===r&&o.push(new e(t,n[s]));return o},e.prototype.getEvents=function(){var e=this._resource.id,t=this._calendar,n=t.state.eventStore,o=n.defs,s=n.instances,u=[];for(var i in s){var a=s[i],c=o[a.defId];-1!==c.resourceIds.indexOf(e)&&u.push(new r.EventApi(t,c,a))}return u},Object.defineProperty(e.prototype,"id",{get:function(){return this._resource.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"title",{get:function(){return this._resource.title},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventConstraint",{get:function(){return this._resource.ui.constraints[0]||null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventOverlap",{get:function(){return this._resource.ui.overlap},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventAllow",{get:function(){return this._resource.ui.allows[0]||null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventBackgroundColor",{get:function(){return this._resource.ui.backgroundColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventBorderColor",{get:function(){return this._resource.ui.borderColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventTextColor",{get:function(){return this._resource.ui.textColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventClassNames",{get:function(){return this._resource.ui.classNames},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extendedProps",{get:function(){return this._resource.extendedProps},enumerable:!0,configurable:!0}),e}();r.Calendar.prototype.addResource=function(e,r){var t,n,o;return void 0===r&&(r=!0),e instanceof w?((t={})[(o=e._resource).id]=o,n=t):o=b(e,"",n={},this),r&&this.component.view.addScroll({forcedRowId:o.id}),this.dispatch({type:"ADD_RESOURCE",resourceHash:n}),new w(this,o)},r.Calendar.prototype.getResourceById=function(e){if(e=String(e),this.state.resourceStore){var r=this.state.resourceStore[e];if(r)return new w(this,r)}return null},r.Calendar.prototype.getResources=function(){var e=this.state.resourceStore,r=[];if(e)for(var t in e)r.push(new w(this,e[t]));return r},r.Calendar.prototype.getTopLevelResources=function(){var e=this.state.resourceStore,r=[];if(e)for(var t in e)e[t].parentId||r.push(new w(this,e[t]));return r},r.Calendar.prototype.rerenderResources=function(){this.dispatch({type:"RESET_RESOURCES"})},r.Calendar.prototype.refetchResources=function(){this.dispatch({type:"REFETCH_RESOURCES"})};var P=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.getKeyInfo=function(e){return o({"":{}},e.resourceStore)},r.prototype.getKeysForDateSpan=function(e){return[e.resourceId||""]},r.prototype.getKeysForEventDef=function(e){var r=e.resourceIds;return r.length?r:[""]},r}(r.Splitter);function O(e,r){return o({},r,{constraints:x(e,r.constraints)})}function x(e,r){return r.map(function(r){var t=r.defs;if(t)for(var n in t){var o=t[n].resourceIds;if(o.length&&-1===o.indexOf(e))return!1}return r})}r.EventApi.prototype.getResources=function(){var e=this._calendar;return this._def.resourceIds.map(function(r){return e.getResourceById(r)})},r.EventApi.prototype.setResources=function(e){for(var r=[],t=0,n=e;t<n.length;t++){var o=n[t],s=null;"string"==typeof o?s=o:"number"==typeof o?s=String(o):o instanceof w?s=o.id:console.warn("unknown resource type: "+o),s&&r.push(s)}this.mutate({standardProps:{resourceIds:r}})};var T="2019-08-10",D=372,j="http://fullcalendar.io/scheduler/license/",F=["GPL-My-Project-Is-Open-Source","CC-Attribution-NonCommercial-NoDerivatives"],U={position:"absolute","z-index":99999,bottom:"1px",left:"1px",background:"#eee","border-color":"#ddd","border-style":"solid","border-width":"1px 1px 0 0",padding:"2px 4px","font-size":"12px","border-top-right-radius":"3px"};var A={resources:function(e,r,t){var n=r.state.resourceSource._raw;t(n,e)||r.dispatch({type:"RESET_RESOURCE_SOURCE",resourceSourceInput:e})}};function H(e,r){return"function"==typeof e?function(t){return e(new w(r,t))}:function(e){return e.title||(0===(r=e.id).indexOf(S)?"":r);var r}}h({ignoreRange:!0,parseMeta:function(e){return Array.isArray(e)?e:Array.isArray(e.resources)?e.resources:null},fetch:function(e,r){r({rawResources:e.resourceSource.meta})}}),h({parseMeta:function(e){return"function"==typeof e?e:"function"==typeof e.resources?e.resources:null},fetch:function(e,t,n){var o=e.calendar.dateEnv,s=e.resourceSource.meta,u={};e.range&&(u={start:o.toDate(e.range.start),end:o.toDate(e.range.end),startStr:o.formatIso(e.range.start),endStr:o.formatIso(e.range.end),timeZone:o.timeZone}),r.unpromisify(s.bind(null,u),function(e){t({rawResources:e})},n)}}),h({parseMeta:function(e){if("string"==typeof e)e={url:e};else if(!e||"object"!=typeof e||!e.url)return null;return{url:e.url,method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams}},fetch:function(e,t,n){var s=e.resourceSource.meta,u=function(e,r,t){var n,s,u,i,a=t.dateEnv,c={};r&&(n=t.opt("startParam"),s=t.opt("endParam"),u=t.opt("timeZoneParam"),c[n]=a.formatIso(r.start),c[s]=a.formatIso(r.end),"local"!==a.timeZone&&(c[u]=a.timeZone));i="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};return o(c,i),c}(s,e.range,e.calendar);r.requestJson(s.method,s.url,u,function(e,r){t({rawResources:e,xhr:r})},function(e,r){n({message:e,xhr:r})})}});var B=function(e){function t(t,n){var o=e.call(this,t)||this;return o.datesAboveResources=o.opt("datesAboveResources"),o.resourceTextFunc=H(o.opt("resourceText"),o.calendar),n.innerHTML="",n.appendChild(o.el=r.htmlToElement('<div class="fc-row '+o.theme.getClass("headerRow")+'"><table class="'+o.theme.getClass("tableGrid")+'"><thead></thead></table></div>')),o.thead=o.el.querySelector("thead"),o}return n(t,e),t.prototype.destroy=function(){r.removeElement(this.el)},t.prototype.render=function(e){var t;this.dateFormat=r.createFormatter(this.opt("columnHeaderFormat")||r.computeFallbackHeaderFormat(e.datesRepDistinctDays,e.dates.length)),t=1===e.dates.length?this.renderResourceRow(e.resources):this.datesAboveResources?this.renderDayAndResourceRows(e.dates,e.resources):this.renderResourceAndDayRows(e.resources,e.dates),this.thead.innerHTML=t,this.processResourceEls(e.resources)},t.prototype.renderResourceRow=function(e){var r=this,t=e.map(function(e){return r.renderResourceCell(e,1)});return this.buildTr(t)},t.prototype.renderDayAndResourceRows=function(e,r){for(var t=[],n=[],o=0,s=e;o<s.length;o++){var u=s[o];t.push(this.renderDateCell(u,r.length));for(var i=0,a=r;i<a.length;i++){var c=a[i];n.push(this.renderResourceCell(c,1,u))}}return this.buildTr(t)+this.buildTr(n)},t.prototype.renderResourceAndDayRows=function(e,r){for(var t=[],n=[],o=0,s=e;o<s.length;o++){var u=s[o];t.push(this.renderResourceCell(u,r.length));for(var i=0,a=r;i<a.length;i++){var c=a[i];n.push(this.renderDateCell(c,1,u))}}return this.buildTr(t)+this.buildTr(n)},t.prototype.renderResourceCell=function(e,t,n){var o=this.dateEnv;return'<th class="fc-resource-cell" data-resource-id="'+e.id+'"'+(n?' data-date="'+o.formatIso(n,{omitTime:!0})+'"':"")+(t>1?' colspan="'+t+'"':"")+">"+r.htmlEscape(this.resourceTextFunc(e))+"</th>"},t.prototype.renderDateCell=function(e,t,n){var o=this.props;return r.renderDateCell(e,o.dateProfile,o.datesRepDistinctDays,o.dates.length*o.resources.length,this.dateFormat,this.context,t,n?'data-resource-id="'+n.id+'"':"")},t.prototype.buildTr=function(e){return e.length||(e=["<td>&nbsp;</td>"]),this.props.renderIntroHtml&&(e=[this.props.renderIntroHtml()].concat(e)),this.isRtl&&e.reverse(),"<tr>"+e.join("")+"</tr>"},t.prototype.processResourceEls=function(e){var t=this,n=this.view;r.findElements(this.thead,".fc-resource-cell").forEach(function(r,o){o%=e.length,t.isRtl&&(o=e.length-1-o);var s=e[o];n.publiclyTrigger("resourceRender",[{resource:new w(t.calendar,s),el:r,view:n}])})},t}(r.Component),z=function(){function e(e,r){this.dayTable=e,this.resources=r,this.resourceIndex=new V(r),this.rowCnt=e.rowCnt,this.colCnt=e.colCnt*r.length,this.cells=this.buildCells()}return e.prototype.buildCells=function(){for(var e=this.rowCnt,r=this.dayTable,t=this.resources,n=[],o=0;o<e;o++){for(var s=[],u=0;u<r.colCnt;u++)for(var i=0;i<t.length;i++){var a=t[i],c='data-resource-id="'+a.id+'"';s[this.computeCol(u,i)]={date:r.cells[o][u].date,resource:a,htmlAttrs:c}}n.push(s)}return n},e}(),M=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.computeCol=function(e,r){return r*this.dayTable.colCnt+e},r.prototype.computeColRanges=function(e,r,t){return[{firstCol:this.computeCol(e,t),lastCol:this.computeCol(r,t),isStart:!0,isEnd:!0}]},r}(z),N=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.computeCol=function(e,r){return e*this.resources.length+r},r.prototype.computeColRanges=function(e,r,t){for(var n=[],o=e;o<=r;o++){var s=this.computeCol(o,t);n.push({firstCol:s,lastCol:s,isStart:o===e,isEnd:o===r})}return n},r}(z),V=function(e){for(var r={},t=[],n=0;n<e.length;n++){var o=e[n].id;t.push(o),r[o]=n}this.ids=t,this.indicesById=r,this.length=e.length},k=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getKeyInfo=function(e){var t=e.resourceDayTable,n=r.mapHash(t.resourceIndex.indicesById,function(e){return t.resources[e]});return n[""]={},n},t.prototype.getKeysForDateSpan=function(e){return[e.resourceId||""]},t.prototype.getKeysForEventDef=function(e){var r=e.resourceIds;return r.length?r:[""]},t}(r.Splitter),K=[],q=function(){function e(){this.joinDateSelection=r.memoize(this.joinSegs),this.joinBusinessHours=r.memoize(this.joinSegs),this.joinFgEvents=r.memoize(this.joinSegs),this.joinBgEvents=r.memoize(this.joinSegs),this.joinEventDrags=r.memoize(this.joinInteractions),this.joinEventResizes=r.memoize(this.joinInteractions)}return e.prototype.joinProps=function(e,r){for(var t=[],n=[],o=[],s=[],u=[],i=[],a="",c=0,l=r.resourceIndex.ids.concat([""]);c<l.length;c++){var d=l[c],f=e[d];t.push(f.dateSelectionSegs),n.push(d?f.businessHourSegs:K),o.push(d?f.fgEventSegs:K),s.push(f.bgEventSegs),u.push(f.eventDrag),i.push(f.eventResize),a=a||f.eventSelection}return{dateSelectionSegs:this.joinDateSelection.apply(this,[r].concat(t)),businessHourSegs:this.joinBusinessHours.apply(this,[r].concat(n)),fgEventSegs:this.joinFgEvents.apply(this,[r].concat(o)),bgEventSegs:this.joinBgEvents.apply(this,[r].concat(s)),eventDrag:this.joinEventDrags.apply(this,[r].concat(u)),eventResize:this.joinEventResizes.apply(this,[r].concat(i)),eventSelection:a}},e.prototype.joinSegs=function(e){for(var r=[],t=1;t<arguments.length;t++)r[t-1]=arguments[t];for(var n=e.resources.length,o=[],s=0;s<n;s++){for(var u=0,i=r[s];u<i.length;u++){var a=i[u];o.push.apply(o,this.transformSeg(a,e,s))}for(var c=0,l=r[n];c<l.length;c++){a=l[c];o.push.apply(o,this.transformSeg(a,e,s))}}return o},e.prototype.expandSegs=function(e,r){for(var t=e.resources.length,n=[],o=0;o<t;o++)for(var s=0,u=r;s<u.length;s++){var i=u[s];n.push.apply(n,this.transformSeg(i,e,o))}return n},e.prototype.joinInteractions=function(e){for(var r=[],t=1;t<arguments.length;t++)r[t-1]=arguments[t];for(var n=e.resources.length,s={},u=[],i=!1,a=null,c=0;c<n;c++){var l=r[c];if(l){for(var d=0,f=l.segs;d<f.length;d++){var p=f[d];u.push.apply(u,this.transformSeg(p,e,c))}o(s,l.affectedInstances),i=i||l.isEvent,a=a||l.sourceSeg}if(r[n])for(var h=0,v=r[n].segs;h<v.length;h++){p=v[h];u.push.apply(u,this.transformSeg(p,e,c))}}return{affectedInstances:s,segs:u,isEvent:i,sourceSeg:a}},e}();function L(e,r,t,n,o,s){var u=[];return function e(r,t,n,o,s,u,i){for(var a=0;a<r.length;a++){var c=r[a],l=c.group;if(l)if(n){var d=t.length,f=o.length;if(e(c.children,t,n,o.concat(0),s,u,i),d<t.length){var p=t[d],h=p.rowSpans=p.rowSpans.slice();h[f]=t.length-d}}else{var v=l.spec.field+":"+l.value,g=null!=u[v]?u[v]:i;t.push({id:v,group:l,isExpanded:g}),g&&e(c.children,t,n,o,s+1,u,i)}else if(c.resource){var v=c.resource.id,g=null!=u[v]?u[v]:i;t.push({id:v,rowSpans:o,depth:s,isExpanded:g,hasChildren:Boolean(c.children.length),resource:c.resource,resourceFields:c.resourceFields}),g&&e(c.children,t,n,o,s+1,u,i)}}}(function(e,r,t,n){var o=function(e,r){var t={};for(var n in e){var o=e[n];t[n]={resource:o,resourceFields:J(o),children:[]}}for(var n in e){var o=e[n];if(o.parentId){var s=t[o.parentId];s&&G(t[n],s.children,r)}}return t}(e,n),s=[];for(var u in o){var i=o[u];i.resource.parentId||Z(i,s,t,0,r,n)}return s}(e,n?-1:1,r,t),u,n,[],0,o,s),u}function Z(e,t,n,o,s,u){n.length&&(-1===s||o<=s)?Z(e,function(e,t,n){var o,s,u=e.resourceFields[n.field];if(n.order)for(s=0;s<t.length;s++){var i=t[s];if(i.group){var a=r.flexibleCompare(u,i.group.value)*n.order;if(0===a){o=i;break}if(a<0)break}}else for(s=0;s<t.length;s++){var i=t[s];if(i.group&&u===i.group.value){o=i;break}}o||(o={group:{value:u,spec:n},children:[]},t.splice(s,0,o));return o}(e,t,n[0]).children,n.slice(1),o+1,s,u):G(e,t,u)}function G(e,t,n){var o;for(o=0;o<t.length;o++){if(r.compareByFieldSpecs(t[o].resourceFields,e.resourceFields,n)>0)break}t.splice(o,0,e)}function J(e){var r=o({},e.extendedProps,e.ui,e);return delete r.ui,delete r.extendedProps,r}var W=r.createPlugin({reducers:[function(e,r,t){var n=g(e.resourceSource,r,e.dateProfile,t),s=C(e.resourceStore,r,n,t),u=function(e,r){var t;switch(r.type){case"INIT":return{};case"SET_RESOURCE_ENTITY_EXPANDED":return o({},e,((t={})[r.id]=r.isExpanded,t));default:return e}}(e.resourceEntityExpansions,r);return o({},e,{resourceSource:n,resourceStore:s,resourceEntityExpansions:u})}],eventDefParsers:[function(e,t,n){var o=r.refineProps(t,_,{},n),s=o.resourceIds;o.resourceId&&s.push(o.resourceId),e.resourceIds=s,e.resourceEditable=o.resourceEditable}],isDraggableTransformers:[function(e,r,t,n){return!(e||!n.viewSpec.class.needsResourceData||!s(r,n.calendar))||e}],eventDragMutationMassagers:[function(e,r,t){var n=r.dateSpan.resourceId,o=t.dateSpan.resourceId;n&&o&&n!==o&&(e.resourceMutation={matchResourceId:n,setResourceId:o})}],eventDefMutationAppliers:[function(e,r,t){var n=r.resourceMutation;if(n&&s(e,t)){var o=e.resourceIds.indexOf(n.matchResourceId);if(-1!==o){var u=e.resourceIds.slice();u.splice(o,1),-1===u.indexOf(n.setResourceId)&&u.push(n.setResourceId),e.resourceIds=u}}}],dateSelectionTransformers:[function(e,r){var t=e.dateSpan.resourceId,n=r.dateSpan.resourceId;if(t&&n)return(!1!==e.component.allowAcrossResources||t===n)&&{resourceId:t}}],datePointTransforms:[function(e,r){return e.resourceId?{resource:r.getResourceById(e.resourceId)}:{}}],dateSpanTransforms:[function(e,r){return e.resourceId?{resource:r.getResourceById(e.resourceId)}:{}}],viewPropsTransformers:[u,a],isPropsValid:function(e,t){var n=(new P).splitProps(o({},e,{resourceStore:t.state.resourceStore}));for(var s in n){var u=n[s];if(s&&n[""]&&(u=o({},u,{eventStore:r.mergeEventStores(n[""].eventStore,u.eventStore),eventUiBases:o({},n[""].eventUiBases,u.eventUiBases)})),!r.isPropsValid(u,t,{resourceId:s},O.bind(null,s)))return!1}return!0},externalDefTransforms:[function(e){return e.resourceId?{resourceId:e.resourceId}:{}}],eventResizeJoinTransforms:[function(e,r){if(!1===e.component.allowAcrossResources&&e.dateSpan.resourceId!==r.dateSpan.resourceId)return!1}],viewContainerModifiers:[function(e,t){var n,o=t.opt("schedulerLicenseKey");n=window.location.href,/\w+\:\/\/fullcalendar\.io\/|\/examples\/[\w-]+\.html$/.test(n)||function(e){if(-1!==F.indexOf(e))return!0;var t=(e||"").match(/^(\d+)\-fcs\-(\d+)$/);if(t&&10===t[1].length){var n=new Date(1e3*parseInt(t[2],10)),o=new Date(r.config.mockSchedulerReleaseDate||T);if(r.isValidDate(o)){var s=r.addDays(o,-D);if(s<n)return!0}}return!1}(o)||r.appendToElement(e,'<div class="fc-license-message" style="'+r.htmlEscape(r.cssToStr(U))+'">Please use a valid license key. <a href="'+j+'">More Info</a></div>')}],eventDropTransformers:[function(e,r){var t=e.resourceMutation;return t?{oldResource:r.getResourceById(t.matchResourceId),newResource:r.getResourceById(t.setResourceId)}:{oldResource:null,newResource:null}}],optionChangeHandlers:A});e.AbstractResourceDayTable=z,e.DayResourceTable=N,e.ResourceApi=w,e.ResourceDayHeader=B,e.ResourceDayTable=M,e.ResourceSplitter=P,e.VResourceJoiner=q,e.VResourceSplitter=k,e.buildResourceFields=J,e.buildResourceTextFunc=H,e.buildRowNodes=L,e.default=W,e.flattenResources=function(e,r){return L(e,[],r,!1,{},!0).map(function(e){return e.resource})},e.isGroupsEqual=function(e,r){return e.spec===r.spec&&e.value===r.value},Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
{
"name": "@fullcalendar/resource-common",
"version": "4.3.1",
"title": "FullCalendar Resources Common Plugin",
"description": "Offers base support for resources. Required for all resource-related plugins.",
"keywords": [
"calendar",
"event",
"full-sized"
],
"homepage": "https://fullcalendar.io/scheduler",
"docs": "https://fullcalendar.io/docs/scheduler",
"bugs": "https://fullcalendar.io/reporting-bugs",
"repository": {
"type": "git",
"url": "https://github.com/fullcalendar/fullcalendar-scheduler.git",
"homepage": "https://github.com/fullcalendar/fullcalendar-scheduler"
},
"license": "SEE LICENSE IN LICENSE.md",
"author": {
"name": "Adam Shaw",
"email": "arshaw@arshaw.com",
"url": "http://arshaw.com/"
},
"copyright": "2019 Adam Shaw",
"peerDependencies": {
"@fullcalendar/core": "~4.3.0"
},
"main": "main.js",
"module": "main.esm.js",
"unpkg": "main.min.js",
"types": "main.d.ts"
}
For complete licensing information, visit:
http://fullcalendar.io/scheduler/license
FullCalendar Scheduler is tri-licensed, meaning you must choose
one of three licenses to use. Here is a summary of those licenses:
- Commercial License
(a paid license, meant for commercial use)
http://fullcalendar.io/scheduler/license-details
- Creative Commons Non-Commercial No-Derivatives
(meant for trial and non-commercial use)
https://creativecommons.org/licenses/by-nc-nd/4.0/
- GPLv3 License
(meant for open-source projects)
http://www.gnu.org/licenses/gpl-3.0.en.html
# FullCalendar Resource Day Grid Plugin
Displays events in individual columns for days and resources
[View the docs &raquo;](https://fullcalendar.io/docs/resource-daygrid-view)
This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar-scheduler)
// Generated by dts-bundle v0.7.3-fork.1
// Dependencies for this module:
// ../../../../../@fullcalendar/core
// ../../../../../@fullcalendar/daygrid
// ../../../../../@fullcalendar/resource-common
declare module '@fullcalendar/resource-daygrid' {
import ResourceDayGridView from '@fullcalendar/resource-daygrid/ResourceDayGridView';
export { ResourceDayGridView };
export { default as ResourceDayGrid } from '@fullcalendar/resource-daygrid/ResourceDayGrid';
const _default: import("@fullcalendar/core").PluginDef;
export default _default;
}
declare module '@fullcalendar/resource-daygrid/ResourceDayGridView' {
import {ComponentContext, DateProfileGenerator, ViewSpec} from '@fullcalendar/core';
import {AbstractDayGridView} from '@fullcalendar/daygrid';
import {ResourceDayHeader, ResourceViewProps} from '@fullcalendar/resource-common';
import ResourceDayGrid from '@fullcalendar/resource-daygrid/ResourceDayGrid';
export {ResourceDayGridView as default, ResourceDayGridView};
class ResourceDayGridView extends AbstractDayGridView {
static needsResourceData: boolean;
props: ResourceViewProps;
header: ResourceDayHeader;
resourceDayGrid: ResourceDayGrid;
constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
destroy(): void;
render(props: ResourceViewProps): void;
}
}
declare module '@fullcalendar/resource-daygrid/ResourceDayGrid' {
import {
ComponentContext,
DateComponent,
DateProfile,
DateSpan,
Duration,
EventInteractionState,
EventStore,
EventUiHash,
Hit
} from '@fullcalendar/core';
import {DayGrid} from '@fullcalendar/daygrid';
import {AbstractResourceDayTable} from '@fullcalendar/resource-common';
export interface ResourceDayGridProps {
dateProfile: DateProfile | null;
resourceDayTable: AbstractResourceDayTable;
businessHours: EventStore;
eventStore: EventStore;
eventUiBases: EventUiHash;
dateSelection: DateSpan | null;
eventSelection: string;
eventDrag: EventInteractionState | null;
eventResize: EventInteractionState | null;
isRigid: boolean;
nextDayThreshold: Duration;
}
export { ResourceDayGrid as default, ResourceDayGrid };
class ResourceDayGrid extends DateComponent<ResourceDayGridProps> {
dayGrid: DayGrid;
constructor(context: ComponentContext, dayGrid: DayGrid);
destroy(): void;
render(props: ResourceDayGridProps): void;
buildPositionCaches(): void;
queryHit(positionLeft: number, positionTop: number): Hit;
}
}
/*!
FullCalendar Resource Day Grid Plugin v4.3.0
Docs & License: https://fullcalendar.io/scheduler
(c) 2019 Adam Shaw
*/
import {createPlugin, DateComponent, mapHash, memoize, parseFieldSpecs} from '@fullcalendar/core';
import ResourceCommonPlugin, {
DayResourceTable,
flattenResources,
ResourceDayHeader,
ResourceDayTable,
VResourceJoiner,
VResourceSplitter
} from '@fullcalendar/resource-common';
import DayGridPlugin, {AbstractDayGridView, buildBasicDayTable, DayGridSlicer} from '@fullcalendar/daygrid';
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* global Reflect, Promise */
var extendStatics = function(d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
function __extends(d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
var __assign = function() {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var ResourceDayGrid = /** @class */ (function (_super) {
__extends(ResourceDayGrid, _super);
function ResourceDayGrid(context, dayGrid) {
var _this = _super.call(this, context, dayGrid.el) || this;
_this.splitter = new VResourceSplitter();
_this.slicers = {};
_this.joiner = new ResourceDayGridJoiner();
_this.dayGrid = dayGrid;
context.calendar.registerInteractiveComponent(_this, {
el: _this.dayGrid.el
});
return _this;
}
ResourceDayGrid.prototype.destroy = function () {
_super.prototype.destroy.call(this);
this.calendar.unregisterInteractiveComponent(this);
};
ResourceDayGrid.prototype.render = function (props) {
var _this = this;
var dayGrid = this.dayGrid;
var dateProfile = props.dateProfile, resourceDayTable = props.resourceDayTable, nextDayThreshold = props.nextDayThreshold;
var splitProps = this.splitter.splitProps(props);
this.slicers = mapHash(splitProps, function (split, resourceId) {
return _this.slicers[resourceId] || new DayGridSlicer();
});
var slicedProps = mapHash(this.slicers, function (slicer, resourceId) {
return slicer.sliceProps(splitProps[resourceId], dateProfile, nextDayThreshold, dayGrid, resourceDayTable.dayTable);
});
dayGrid.allowAcrossResources = resourceDayTable.dayTable.colCnt === 1;
dayGrid.receiveProps(__assign({}, this.joiner.joinProps(slicedProps, resourceDayTable), { dateProfile: dateProfile, cells: resourceDayTable.cells, isRigid: props.isRigid }));
};
ResourceDayGrid.prototype.buildPositionCaches = function () {
this.dayGrid.buildPositionCaches();
};
ResourceDayGrid.prototype.queryHit = function (positionLeft, positionTop) {
var rawHit = this.dayGrid.positionToHit(positionLeft, positionTop);
if (rawHit) {
return {
component: this.dayGrid,
dateSpan: {
range: rawHit.dateSpan.range,
allDay: rawHit.dateSpan.allDay,
resourceId: this.props.resourceDayTable.cells[rawHit.row][rawHit.col].resource.id
},
dayEl: rawHit.dayEl,
rect: {
left: rawHit.relativeRect.left,
right: rawHit.relativeRect.right,
top: rawHit.relativeRect.top,
bottom: rawHit.relativeRect.bottom
},
layer: 0
};
}
};
return ResourceDayGrid;
}(DateComponent));
var ResourceDayGridJoiner = /** @class */ (function (_super) {
__extends(ResourceDayGridJoiner, _super);
function ResourceDayGridJoiner() {
return _super !== null && _super.apply(this, arguments) || this;
}
ResourceDayGridJoiner.prototype.transformSeg = function (seg, resourceDayTable, resourceI) {
var colRanges = resourceDayTable.computeColRanges(seg.firstCol, seg.lastCol, resourceI);
return colRanges.map(function (colRange) {
return __assign({}, seg, colRange, { isStart: seg.isStart && colRange.isStart, isEnd: seg.isEnd && colRange.isEnd });
});
};
return ResourceDayGridJoiner;
}(VResourceJoiner));
var ResourceDayGridView = /** @class */ (function (_super) {
__extends(ResourceDayGridView, _super);
function ResourceDayGridView(context, viewSpec, dateProfileGenerator, parentEl) {
var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
_this.flattenResources = memoize(flattenResources);
_this.buildResourceDayTable = memoize(buildResourceDayTable);
_this.resourceOrderSpecs = parseFieldSpecs(_this.opt('resourceOrder'));
if (_this.opt('columnHeader')) {
_this.header = new ResourceDayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
}
_this.resourceDayGrid = new ResourceDayGrid(context, _this.dayGrid);
return _this;
}
ResourceDayGridView.prototype.destroy = function () {
_super.prototype.destroy.call(this);
if (this.header) {
this.header.destroy();
}
this.resourceDayGrid.destroy();
};
ResourceDayGridView.prototype.render = function (props) {
_super.prototype.render.call(this, props); // for flags for updateSize
var resources = this.flattenResources(props.resourceStore, this.resourceOrderSpecs);
var resourceDayTable = this.buildResourceDayTable(this.props.dateProfile, this.dateProfileGenerator, resources, this.opt('datesAboveResources'));
if (this.header) {
this.header.receiveProps({
resources: resources,
dates: resourceDayTable.dayTable.headerDates,
dateProfile: props.dateProfile,
datesRepDistinctDays: true,
renderIntroHtml: this.renderHeadIntroHtml
});
}
this.resourceDayGrid.receiveProps({
dateProfile: props.dateProfile,
resourceDayTable: resourceDayTable,
businessHours: props.businessHours,
eventStore: props.eventStore,
eventUiBases: props.eventUiBases,
dateSelection: props.dateSelection,
eventSelection: props.eventSelection,
eventDrag: props.eventDrag,
eventResize: props.eventResize,
isRigid: this.hasRigidRows(),
nextDayThreshold: this.nextDayThreshold
});
};
ResourceDayGridView.needsResourceData = true; // for ResourceViewProps
return ResourceDayGridView;
}(AbstractDayGridView));
function buildResourceDayTable(dateProfile, dateProfileGenerator, resources, datesAboveResources) {
var dayTable = buildBasicDayTable(dateProfile, dateProfileGenerator);
return datesAboveResources ?
new DayResourceTable(dayTable, resources) :
new ResourceDayTable(dayTable, resources);
}
var main = createPlugin({
deps: [ResourceCommonPlugin, DayGridPlugin],
defaultView: 'resourceDayGridDay',
views: {
resourceDayGrid: ResourceDayGridView,
resourceDayGridDay: {
type: 'resourceDayGrid',
duration: { days: 1 }
},
resourceDayGridWeek: {
type: 'resourceDayGrid',
duration: { weeks: 1 }
},
resourceDayGridMonth: {
type: 'resourceDayGrid',
duration: { months: 1 },
// TODO: wish we didn't have to C&P from dayGrid's file
monthMode: true,
fixedWeekCount: true
}
}
});
export default main;
export { ResourceDayGrid, ResourceDayGridView };
/*!
FullCalendar Resource Day Grid Plugin v4.3.0
Docs & License: https://fullcalendar.io/scheduler
(c) 2019 Adam Shaw
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core'), require('@fullcalendar/resource-common'), require('@fullcalendar/daygrid')) :
typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core', '@fullcalendar/resource-common', '@fullcalendar/daygrid'], factory) :
(global = global || self, factory(global.FullCalendarResourceDayGrid = {}, global.FullCalendar, global.FullCalendarResourceCommon, global.FullCalendarDayGrid));
}(this, function (exports, core, ResourceCommonPlugin, DayGridPlugin) { 'use strict';
var ResourceCommonPlugin__default = 'default' in ResourceCommonPlugin ? ResourceCommonPlugin['default'] : ResourceCommonPlugin;
var DayGridPlugin__default = 'default' in DayGridPlugin ? DayGridPlugin['default'] : DayGridPlugin;
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* global Reflect, Promise */
var extendStatics = function(d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
function __extends(d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
var __assign = function() {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var ResourceDayGrid = /** @class */ (function (_super) {
__extends(ResourceDayGrid, _super);
function ResourceDayGrid(context, dayGrid) {
var _this = _super.call(this, context, dayGrid.el) || this;
_this.splitter = new ResourceCommonPlugin.VResourceSplitter();
_this.slicers = {};
_this.joiner = new ResourceDayGridJoiner();
_this.dayGrid = dayGrid;
context.calendar.registerInteractiveComponent(_this, {
el: _this.dayGrid.el
});
return _this;
}
ResourceDayGrid.prototype.destroy = function () {
_super.prototype.destroy.call(this);
this.calendar.unregisterInteractiveComponent(this);
};
ResourceDayGrid.prototype.render = function (props) {
var _this = this;
var dayGrid = this.dayGrid;
var dateProfile = props.dateProfile, resourceDayTable = props.resourceDayTable, nextDayThreshold = props.nextDayThreshold;
var splitProps = this.splitter.splitProps(props);
this.slicers = core.mapHash(splitProps, function (split, resourceId) {
return _this.slicers[resourceId] || new DayGridPlugin.DayGridSlicer();
});
var slicedProps = core.mapHash(this.slicers, function (slicer, resourceId) {
return slicer.sliceProps(splitProps[resourceId], dateProfile, nextDayThreshold, dayGrid, resourceDayTable.dayTable);
});
dayGrid.allowAcrossResources = resourceDayTable.dayTable.colCnt === 1;
dayGrid.receiveProps(__assign({}, this.joiner.joinProps(slicedProps, resourceDayTable), { dateProfile: dateProfile, cells: resourceDayTable.cells, isRigid: props.isRigid }));
};
ResourceDayGrid.prototype.buildPositionCaches = function () {
this.dayGrid.buildPositionCaches();
};
ResourceDayGrid.prototype.queryHit = function (positionLeft, positionTop) {
var rawHit = this.dayGrid.positionToHit(positionLeft, positionTop);
if (rawHit) {
return {
component: this.dayGrid,
dateSpan: {
range: rawHit.dateSpan.range,
allDay: rawHit.dateSpan.allDay,
resourceId: this.props.resourceDayTable.cells[rawHit.row][rawHit.col].resource.id
},
dayEl: rawHit.dayEl,
rect: {
left: rawHit.relativeRect.left,
right: rawHit.relativeRect.right,
top: rawHit.relativeRect.top,
bottom: rawHit.relativeRect.bottom
},
layer: 0
};
}
};
return ResourceDayGrid;
}(core.DateComponent));
var ResourceDayGridJoiner = /** @class */ (function (_super) {
__extends(ResourceDayGridJoiner, _super);
function ResourceDayGridJoiner() {
return _super !== null && _super.apply(this, arguments) || this;
}
ResourceDayGridJoiner.prototype.transformSeg = function (seg, resourceDayTable, resourceI) {
var colRanges = resourceDayTable.computeColRanges(seg.firstCol, seg.lastCol, resourceI);
return colRanges.map(function (colRange) {
return __assign({}, seg, colRange, { isStart: seg.isStart && colRange.isStart, isEnd: seg.isEnd && colRange.isEnd });
});
};
return ResourceDayGridJoiner;
}(ResourceCommonPlugin.VResourceJoiner));
var ResourceDayGridView = /** @class */ (function (_super) {
__extends(ResourceDayGridView, _super);
function ResourceDayGridView(context, viewSpec, dateProfileGenerator, parentEl) {
var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
_this.flattenResources = core.memoize(ResourceCommonPlugin.flattenResources);
_this.buildResourceDayTable = core.memoize(buildResourceDayTable);
_this.resourceOrderSpecs = core.parseFieldSpecs(_this.opt('resourceOrder'));
if (_this.opt('columnHeader')) {
_this.header = new ResourceCommonPlugin.ResourceDayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
}
_this.resourceDayGrid = new ResourceDayGrid(context, _this.dayGrid);
return _this;
}
ResourceDayGridView.prototype.destroy = function () {
_super.prototype.destroy.call(this);
if (this.header) {
this.header.destroy();
}
this.resourceDayGrid.destroy();
};
ResourceDayGridView.prototype.render = function (props) {
_super.prototype.render.call(this, props); // for flags for updateSize
var resources = this.flattenResources(props.resourceStore, this.resourceOrderSpecs);
var resourceDayTable = this.buildResourceDayTable(this.props.dateProfile, this.dateProfileGenerator, resources, this.opt('datesAboveResources'));
if (this.header) {
this.header.receiveProps({
resources: resources,
dates: resourceDayTable.dayTable.headerDates,
dateProfile: props.dateProfile,
datesRepDistinctDays: true,
renderIntroHtml: this.renderHeadIntroHtml
});
}
this.resourceDayGrid.receiveProps({
dateProfile: props.dateProfile,
resourceDayTable: resourceDayTable,
businessHours: props.businessHours,
eventStore: props.eventStore,
eventUiBases: props.eventUiBases,
dateSelection: props.dateSelection,
eventSelection: props.eventSelection,
eventDrag: props.eventDrag,
eventResize: props.eventResize,
isRigid: this.hasRigidRows(),
nextDayThreshold: this.nextDayThreshold
});
};
ResourceDayGridView.needsResourceData = true; // for ResourceViewProps
return ResourceDayGridView;
}(DayGridPlugin.AbstractDayGridView));
function buildResourceDayTable(dateProfile, dateProfileGenerator, resources, datesAboveResources) {
var dayTable = DayGridPlugin.buildBasicDayTable(dateProfile, dateProfileGenerator);
return datesAboveResources ?
new ResourceCommonPlugin.DayResourceTable(dayTable, resources) :
new ResourceCommonPlugin.ResourceDayTable(dayTable, resources);
}
var main = core.createPlugin({
deps: [ResourceCommonPlugin__default, DayGridPlugin__default],
defaultView: 'resourceDayGridDay',
views: {
resourceDayGrid: ResourceDayGridView,
resourceDayGridDay: {
type: 'resourceDayGrid',
duration: { days: 1 }
},
resourceDayGridWeek: {
type: 'resourceDayGrid',
duration: { weeks: 1 }
},
resourceDayGridMonth: {
type: 'resourceDayGrid',
duration: { months: 1 },
// TODO: wish we didn't have to C&P from dayGrid's file
monthMode: true,
fixedWeekCount: true
}
}
});
exports.ResourceDayGrid = ResourceDayGrid;
exports.ResourceDayGridView = ResourceDayGridView;
exports.default = main;
Object.defineProperty(exports, '__esModule', { value: true });
}));
/*!
FullCalendar Resource Day Grid Plugin v4.3.0
Docs & License: https://fullcalendar.io/scheduler
(c) 2019 Adam Shaw
*/
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@fullcalendar/core"),require("@fullcalendar/resource-common"),require("@fullcalendar/daygrid")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core","@fullcalendar/resource-common","@fullcalendar/daygrid"],r):r((e=e||self).FullCalendarResourceDayGrid={},e.FullCalendar,e.FullCalendarResourceCommon,e.FullCalendarDayGrid)}(this,function(e,r,t,o){"use strict";var i="default"in t?t.default:t,a="default"in o?o.default:o,s=function(e,r){return(s=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)r.hasOwnProperty(t)&&(e[t]=r[t])})(e,r)};function n(e,r){function t(){this.constructor=e}s(e,r),e.prototype=null===r?Object.create(r):(t.prototype=r.prototype,new t)}var l=function(){return(l=Object.assign||function(e){for(var r,t=1,o=arguments.length;t<o;t++)for(var i in r=arguments[t])Object.prototype.hasOwnProperty.call(r,i)&&(e[i]=r[i]);return e}).apply(this,arguments)},c=function(e){function i(r,o){var i=e.call(this,r,o.el)||this;return i.splitter=new t.VResourceSplitter,i.slicers={},i.joiner=new d,i.dayGrid=o,r.calendar.registerInteractiveComponent(i,{el:i.dayGrid.el}),i}return n(i,e),i.prototype.destroy=function(){e.prototype.destroy.call(this),this.calendar.unregisterInteractiveComponent(this)},i.prototype.render=function(e){var t=this,i=this.dayGrid,a=e.dateProfile,s=e.resourceDayTable,n=e.nextDayThreshold,c=this.splitter.splitProps(e);this.slicers=r.mapHash(c,function(e,r){return t.slicers[r]||new o.DayGridSlicer});var d=r.mapHash(this.slicers,function(e,r){return e.sliceProps(c[r],a,n,i,s.dayTable)});i.allowAcrossResources=1===s.dayTable.colCnt,i.receiveProps(l({},this.joiner.joinProps(d,s),{dateProfile:a,cells:s.cells,isRigid:e.isRigid}))},i.prototype.buildPositionCaches=function(){this.dayGrid.buildPositionCaches()},i.prototype.queryHit=function(e,r){var t=this.dayGrid.positionToHit(e,r);if(t)return{component:this.dayGrid,dateSpan:{range:t.dateSpan.range,allDay:t.dateSpan.allDay,resourceId:this.props.resourceDayTable.cells[t.row][t.col].resource.id},dayEl:t.dayEl,rect:{left:t.relativeRect.left,right:t.relativeRect.right,top:t.relativeRect.top,bottom:t.relativeRect.bottom},layer:0}},i}(r.DateComponent),d=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.transformSeg=function(e,r,t){return r.computeColRanges(e.firstCol,e.lastCol,t).map(function(r){return l({},e,r,{isStart:e.isStart&&r.isStart,isEnd:e.isEnd&&r.isEnd})})},r}(t.VResourceJoiner),u=function(e){function o(o,i,a,s){var n=e.call(this,o,i,a,s)||this;return n.flattenResources=r.memoize(t.flattenResources),n.buildResourceDayTable=r.memoize(y),n.resourceOrderSpecs=r.parseFieldSpecs(n.opt("resourceOrder")),n.opt("columnHeader")&&(n.header=new t.ResourceDayHeader(n.context,n.el.querySelector(".fc-head-container"))),n.resourceDayGrid=new c(o,n.dayGrid),n}return n(o,e),o.prototype.destroy=function(){e.prototype.destroy.call(this),this.header&&this.header.destroy(),this.resourceDayGrid.destroy()},o.prototype.render=function(r){e.prototype.render.call(this,r);var t=this.flattenResources(r.resourceStore,this.resourceOrderSpecs),o=this.buildResourceDayTable(this.props.dateProfile,this.dateProfileGenerator,t,this.opt("datesAboveResources"));this.header&&this.header.receiveProps({resources:t,dates:o.dayTable.headerDates,dateProfile:r.dateProfile,datesRepDistinctDays:!0,renderIntroHtml:this.renderHeadIntroHtml}),this.resourceDayGrid.receiveProps({dateProfile:r.dateProfile,resourceDayTable:o,businessHours:r.businessHours,eventStore:r.eventStore,eventUiBases:r.eventUiBases,dateSelection:r.dateSelection,eventSelection:r.eventSelection,eventDrag:r.eventDrag,eventResize:r.eventResize,isRigid:this.hasRigidRows(),nextDayThreshold:this.nextDayThreshold})},o.needsResourceData=!0,o}(o.AbstractDayGridView);function y(e,r,i,a){var s=o.buildBasicDayTable(e,r);return a?new t.DayResourceTable(s,i):new t.ResourceDayTable(s,i)}var p=r.createPlugin({deps:[i,a],defaultView:"resourceDayGridDay",views:{resourceDayGrid:u,resourceDayGridDay:{type:"resourceDayGrid",duration:{days:1}},resourceDayGridWeek:{type:"resourceDayGrid",duration:{weeks:1}},resourceDayGridMonth:{type:"resourceDayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}});e.ResourceDayGrid=c,e.ResourceDayGridView=u,e.default=p,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
{
"name": "@fullcalendar/resource-daygrid",
"version": "4.3.0",
"title": "FullCalendar Resource Day Grid Plugin",
"description": "Displays events in individual columns for days and resources",
"keywords": [
"calendar",
"event",
"full-sized"
],
"homepage": "https://fullcalendar.io/scheduler",
"docs": "https://fullcalendar.io/docs/resource-daygrid-view",
"bugs": "https://fullcalendar.io/reporting-bugs",
"repository": {
"type": "git",
"url": "https://github.com/fullcalendar/fullcalendar-scheduler.git",
"homepage": "https://github.com/fullcalendar/fullcalendar-scheduler"
},
"license": "SEE LICENSE IN LICENSE.md",
"author": {
"name": "Adam Shaw",
"email": "arshaw@arshaw.com",
"url": "http://arshaw.com/"
},
"copyright": "2019 Adam Shaw",
"dependencies": {
"@fullcalendar/resource-common": "~4.3.0",
"@fullcalendar/daygrid": "~4.3.0"
},
"peerDependencies": {
"@fullcalendar/core": "~4.3.0"
},
"main": "main.js",
"module": "main.esm.js",
"unpkg": "main.min.js",
"types": "main.d.ts"
}
For complete licensing information, visit:
http://fullcalendar.io/scheduler/license
FullCalendar Scheduler is tri-licensed, meaning you must choose
one of three licenses to use. Here is a summary of those licenses:
- Commercial License
(a paid license, meant for commercial use)
http://fullcalendar.io/scheduler/license-details
- Creative Commons Non-Commercial No-Derivatives
(meant for trial and non-commercial use)
https://creativecommons.org/licenses/by-nc-nd/4.0/
- GPLv3 License
(meant for open-source projects)
http://www.gnu.org/licenses/gpl-3.0.en.html
# FullCalendar Resource Time Grid Plugin
Displays events on a vertical resource view with time slots
[View the docs &raquo;](https://fullcalendar.io/docs/vertical-resource-view)
This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar-scheduler)
// Generated by dts-bundle v0.7.3-fork.1
// Dependencies for this module:
// ../../../../../@fullcalendar/core
// ../../../../../@fullcalendar/timegrid
// ../../../../../@fullcalendar/resource-common
// ../../../../../@fullcalendar/resource-daygrid
declare module '@fullcalendar/resource-timegrid' {
import ResourceTimeGridView from '@fullcalendar/resource-timegrid/ResourceTimeGridView';
export { ResourceTimeGridView };
export { default as ResourceTimeGrid } from '@fullcalendar/resource-timegrid/ResourceTimeGrid';
const _default: import("@fullcalendar/core").PluginDef;
export default _default;
}
declare module '@fullcalendar/resource-timegrid/ResourceTimeGridView' {
import {ComponentContext, DateProfileGenerator, ViewSpec} from '@fullcalendar/core';
import {AbstractTimeGridView} from '@fullcalendar/timegrid';
import {ResourceDayHeader, ResourceViewProps} from '@fullcalendar/resource-common';
import {ResourceDayGrid} from '@fullcalendar/resource-daygrid';
import ResourceTimeGrid from '@fullcalendar/resource-timegrid/ResourceTimeGrid';
export {ResourceTimeGridView as default, ResourceTimeGridView};
class ResourceTimeGridView extends AbstractTimeGridView {
static needsResourceData: boolean;
props: ResourceViewProps;
header: ResourceDayHeader;
resourceTimeGrid: ResourceTimeGrid;
resourceDayGrid: ResourceDayGrid;
constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
destroy(): void;
render(props: ResourceViewProps): void;
renderNowIndicator(date: any): void;
}
}
declare module '@fullcalendar/resource-timegrid/ResourceTimeGrid' {
import {
ComponentContext,
DateComponent,
DateMarker,
DateProfile,
DateSpan,
EventInteractionState,
EventStore,
EventUiHash,
Hit
} from '@fullcalendar/core';
import {TimeGrid} from '@fullcalendar/timegrid';
import {AbstractResourceDayTable} from '@fullcalendar/resource-common';
export interface ResourceTimeGridProps {
dateProfile: DateProfile | null;
resourceDayTable: AbstractResourceDayTable;
businessHours: EventStore;
eventStore: EventStore;
eventUiBases: EventUiHash;
dateSelection: DateSpan | null;
eventSelection: string;
eventDrag: EventInteractionState | null;
eventResize: EventInteractionState | null;
}
export { ResourceTimeGrid as default, ResourceTimeGrid };
class ResourceTimeGrid extends DateComponent<ResourceTimeGridProps> {
timeGrid: TimeGrid;
constructor(context: ComponentContext, timeGrid: TimeGrid);
destroy(): void;
render(props: ResourceTimeGridProps): void;
renderNowIndicator(date: DateMarker): void;
buildPositionCaches(): void;
queryHit(positionLeft: number, positionTop: number): Hit;
}
}