* Fullcalendar unit & demo

This commit is contained in:
michael 2019-10-01 18:26:21 +00:00
parent 9640756fc2
commit 949f0181b9
5 changed files with 913 additions and 2 deletions

View File

@ -5,7 +5,7 @@ TARGETS=democomponents demobrowseconsole demoajax demoxhr restbridgeclient \
chartjs_demoline chartjs_demotime chartjs_demoscriptablebubble chartjs_demoradar \
chartjs_democustompoints chartjs_demopolararea promiseall promisestory1 \
promisestory2 promisestory demodb demoload demorest fpcunitbrowsertest \
sampleda webgl1 pdfbasic hotreload dynload bootstraptable
sampleda webgl1 pdfbasic hotreload dynload bootstraptable fullcalendar
ifneq ($(SKIPWEBCOMPILER),1)
TARGETS:=$(TARGETS) demowebcompiler
BASEDIR=$(CURDIR)/../compiler/packages
@ -105,4 +105,5 @@ dynload: ./dynload/testloader.lpr ./dynload/myform.pp
$(P2JS) ./dynload/myform.pp
bootstraptable: ./bootstrap/demobootstraptable.lpr
$(BROWSERP2JS) $<
fullcalendar: ./fullcalendar/demofullcalendar.lpr
$(BROWSERP2JS) $<

View File

@ -0,0 +1,61 @@
<!doctype html>
<html lang="en">
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"/>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" >
<!-- fullCalendar -->
<link href='https://unpkg.com/@fullcalendar/core@4.3.1/main.min.css' rel='stylesheet' />
<link href='https://unpkg.com/@fullcalendar/daygrid@4.3.0/main.min.css' rel='stylesheet' />
<link href='https://unpkg.com/@fullcalendar/timegrid@4.3.0/main.min.css' rel='stylesheet' />
<link href='https://unpkg.com/@fullcalendar/bootstrap@4.3.0/main.min.css' rel='stylesheet' />
<script src="https://code.jquery.com/jquery-3.4.1.js" ></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" ></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.js"></script>
<!-- fullCalendar -->
<script src='https://unpkg.com/@fullcalendar/core@4.3.1/main.min.js'></script>
<script src='https://unpkg.com/@fullcalendar/interaction@4.3.0/main.min.js'></script>
<script src='https://unpkg.com/@fullcalendar/daygrid@4.3.0/main.min.js'></script>
<script src='https://unpkg.com/@fullcalendar/timegrid@4.3.0/main.min.js'></script>
<script src='https://unpkg.com/@fullcalendar/bootstrap@4.3.0/main.min.js'></script>
<script src='https://unpkg.com/@fullcalendar/core@4.3.1/locales-all.js'></script>
<style>
html, body {
margin: 0;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#thecalendar {
max-width: 900px;
margin: 40px auto;
}
</style>
<title>FullCalendar.JS demo in Pas2JS</title>
<script src="demofullcalendar.js"></script>
</head>
<body>
<div class="container-fluid">
<div class="row">
<form class="form form-inline ml-auto">
<div class="form-group">
<label for="locale-selector">Locales:</label>
<select class="form-control" id="locale-selector"></select>
</div>
</form>
</div>
<div id="thecalendar">
</div>
</div>
<script>
window.addEventListener("load", rtl.run);
</script>
</body>
</html>

View File

@ -0,0 +1,96 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<MainUnitHasScaledStatement Value="False"/>
<Runnable Value="False"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="demofullcalendar"/>
<UseAppBundle Value="False"/>
<ResourceType Value="res"/>
</General>
<CustomData Count="5">
<Item0 Name="MaintainHTML" Value="1"/>
<Item1 Name="PasJSHTMLFile" Value="project1.html"/>
<Item2 Name="PasJSPort" Value="0"/>
<Item3 Name="PasJSWebBrowserProject" Value="1"/>
<Item4 Name="RunAtReady" Value="1"/>
</CustomData>
<BuildModes>
<Item Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<UseFileFilters Value="True"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
<Modes Count="0"/>
</RunParams>
<Units>
<Unit>
<Filename Value="demofullcalendar.lpr"/>
<IsPartOfProject Value="True"/>
</Unit>
<Unit>
<Filename Value="demofullcalendar.html"/>
<IsPartOfProject Value="True"/>
<CustomData Count="1">
<Item0 Name="PasJSIsProjectHTMLFile" Value="1"/>
</CustomData>
</Unit>
<Unit>
<Filename Value="../../packages/libfullcalendar/libfullcalendar.pp"/>
<IsPartOfProject Value="True"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<Target FileExt=".js">
<Filename Value="demofullcalendar"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="js"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<AllowLabel Value="False"/>
<CPPInline Value="False"/>
<UseAnsiStrings Value="False"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<TargetOS Value="browser"/>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
<UseLineInfoUnit Value="False"/>
</Debugging>
</Linking>
<Other>
<CustomOptions Value="-Jeutf-8 -Jirtl.js -Jc -Jminclude"/>
<CompilerPath Value="$(pas2js)"/>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,117 @@
program demofullcalendar;
{$mode objfpc}
uses
dateutils, browserapp, JS, Classes, SysUtils, Web, libfullcalendar;
type
{ TMyApplication }
TMyApplication = class(TBrowserApplication)
FCalendarEl : TJSHTMLElement;
FCalendar : TFullCalendar;
procedure doRun; override;
private
function CreateEvents: TBaseCalendarEventArray;
procedure ShowLocales;
end;
Function TMyApplication.CreateEvents : TBaseCalendarEventArray;
Const
BuySell : Array[1..3] of string = ('Buy','Sell','Borrow');
Articles : Array[1..10] of String = ('books','sugar','coffee','apples','bananas','smartphone','bread','meat','cabbage','tomatoes');
Colors : Array[1..10] of string = ('silver','gray','salmon','plum','mediumpurple','slateblue','lime','seagreen','darkgreen','teal');
Var
Ev,AllDay : Boolean;
D1,D2 : TDateTime;
E : TBaseCalendarEvent;
I : Integer;
begin
SetLength(Result,62);
For I:=1 to 62 do
begin
D1:=Date-31+i;
if DayOfTheWeek(D1)=7 then
D1:=D1+1;
Ev:=(DayOfTheWeek(D1) mod 2=0);
allDay:=(I mod 5)=0;
if allDay then
D2:=D1
else
begin
D1:=IncHour(D1,9+Random(12));
D1:=IncMinute(D1,Random(12)*5);
D2:=IncMinute(D1,10*Random(20));
end;
E:=TBaseCalendarEvent.event(BuySell[1+Random(3)]+' '+Articles[1+Random(10)],D1,D2);
E.color:=Colors[1+Random(10)];
E.allDay:=allDay;
Result[I-1]:=E;
end;
end;
procedure TMyApplication.ShowLocales;
Var
Locales : TStringDynArray;
CB,O : TJSHTMLElement;
S : String;
begin
CB:=GetHTMLElement('locale-selector');
Locales:=FCalendar.getAvailableLocaleCodes();
for S in Locales do
begin
O:=createHTMLElement('option');
O['value'] := S;
O.innerText :=S;
CB.appendChild(O);
end;
CB.addEventListener('change',TJSRawEventHandler (Procedure (Event: TJSEvent)
var v : String;
begin
V:=String(event.Target['value']);
if (V<>'') then
Fcalendar.setOption('locale',V);
end
));
end;
procedure TMyApplication.doRun;
Var
O : TFullCalendarOptions;
begin
// Your code here
Terminate;
FCalendarEl:=GetHTMLElement('thecalendar');
O:=TFullCalendarOptions.New;
O.Events:=CreateEvents;
O.plugins:=['interaction', 'dayGrid', 'timeGrid','bootstrap'];
O.themeSystem:='bootstrap';
O.defaultView:='dayGridMonth';
O.header:=TCalendarHeaderFooterOptions.New;
O.header.center:='title';
O.header.left:='prev,next today';
O.header.right:='dayGridMonth,timeGridWeek,timeGridDay';
FCalendar:=TFullCalendar.new(FCalendarEl,O);
FCalendar.render;
ShowLocales;
end;
var
Application : TMyApplication;
begin
Application:=TMyApplication.Create(nil);
Application.Initialize;
Application.Run;
end.

View File

@ -0,0 +1,636 @@
unit libfullcalendar;
{$mode objfpc}
{$modeswitch externalclass}
interface
uses
sysutils, types, js, web;
Const
fcViewMonth = 'dayGridMonth';
fcViewWeek = 'timeGridWeek';
fcViewDay = 'timeGridDay';
// A list of plugin names, created from the plugin index page
fcInteractionPlugin = 'interaction';
fcDayGridPlugin = 'dayGrid';
fcTimeGridPlugin = 'timeGrid';
fcListPlugin = 'list';
fcTimelinePlugin = 'timeline';
fcResourceDayGridPlugin = 'resourceDayGrid';
fcResourceTimeGridPlugin = 'resourceTimeGrid';
fcResourceTimelinePlugin = 'resourceTimeline';
fcBootstrapPlugin = 'bootstrap';
fcGoogleCalendarPlugin = 'googleCalendar';
fcRRulePlugin = 'rrule';
fcMomentPlugin = 'moment';
fcMomentTimezonePlugin = 'momentTimeZone';
fcReactPlugin = 'react';
fcAngularPlugin = 'angular';
fcVuePlugin = 'vue';
fcHeaderFooterTitle = 'title';
fcHeaderFooterPrev = 'prev';
fcHeaderFooterNext = 'next';
fcHeaderFooterPrevYear = 'prevYear';
fcHeaderFooterNextYear = 'nextYear';
fcHeaderFooterToday = 'today';
fcDateFormatNumeric = 'numeric';
fcDateFormat2Digit = '2-digit';
fcDateFormatLong = 'long';
fcDateFormatShort = 'short';
fcDateFormatNarrow = 'narrow';
Type
TProcedural = reference to procedure;
TDateFunction = reference to Function : TJSDate;
TDateFormatter = Class external name 'Object' (TJSObject)
// Use fcDateFormat* constants
year : String;
month : String;
day : String;
week : string;
meridiem : string;
weekday : String;
hour : string;
minute : string;
second : string;
hour12 : Boolean;
timeZoneName : string;
omitZeroMinute : Boolean;
omitCommas : Boolean;
end;
TDuration = Class external name 'Object' (TJSObject)
years : NativeInt;
months : NativeInt;
days : NativeInt;
milliseconds : NativeInt;
end;
TDateRange = Class external name 'Object' (TJSObject)
start : TJSDate;
startStr : string; external name 'start';
startInt : nativeInt; external name 'start';
end;
TCalendarHeaderFooterOptions = Class external name 'Object' (TJSObject)
// use the fcHeaderFooter consts
left : string;
right : string;
center : string;
end;
TDateFormatHandler = reference to function(aDate : TJSDate) : String;
TButtonText = Class external name 'Object' (TJSObject)
today : string;
month : string;
week : string;
day : string;
list : string;
end;
TButtonTextRec = record
today : string;
month : string;
week : string;
day : string;
list : string;
end;
TButtonIcons = Class external name 'Object' (TJSObject)
title : string;
prev : string;
next : string;
prevYear : string;
nextYear : string;
today : string;
end;
TButtonIconsRec = record
today : string;
title : string;
prev : string;
next : string;
prevYear : string;
nextYear : string;
end;
TCustomButtonSpec = record
text : string;
click : TJSEventHandler;
end;
TFontAwesomeSpec = Class external name 'Object' (TJSObject)
close : string;
title : string;
prev : string;
next : string;
prevYear : string;
nextYear : string;
today : string;
end;
TFontAwesomeSpecRec = record
close : string;
title : string;
prev : string;
next : string;
prevYear : string;
nextYear : string;
today : string;
end;
TCustomButtonSpecs = Class external name 'Object' (TJSObject)
private
function GetButton(Name: String): TCustomButtonSpec; external name '[]';
procedure SetButton(Name: String; const AValue: TCustomButtonSpec); external name '[]';
Public
property buttons [aIndex : string] : TCustomButtonSpec read GetButton Write SetButton;
end;
TBusinessHoursSpec = Class external name 'Object' (TJSObject)
daysOfWeek : TIntegerDynArray;
startTime : TDuration;
startTimeStr : string; external name 'startTime';
startTimeInt : nativeInt; external name 'startTime';
endTime : TDuration;
endTimeStr : string; external name 'endTime';
endTimeInt : nativeInt; external name 'endTime';
end;
TBusinessHoursSpecArray = Array of TBusinessHoursSpec;
TCalendarEvent = Class;
TCalendarResource = Class;
TFullCalendarView = class;
TAllowDropInfo = record
allDay : Boolean;
end_ : TJSDate; external name 'end';
resource : TCalendarResource;
start : TJSDate;
startStr : String;
end;
TAllowFunction = reference to function (dropInfo : TAllowDropInfo; draggedEvent : TCalendarEvent) : Boolean;
TBaseCalendarResource = Class external name 'Object' (TJSObject)
id : String;
title : string;
eventColor : string;
eventBackgroundColor : string;
eventBorderColor : string;
eventTextColor : string;
eventClassNames : String;
eventClassNamesArray : TStringDynArray; external name 'eventClassNames';
eventOverlap : Boolean;
eventAllow : TAllowFunction;
end;
TBaseCalendarResourceArray = array of TBaseCalendarResource;
TCalendarResource = Class external name 'Object' (TJSObject)
end;
TCalendarResourceArray = array of TCalendarResource;
THeightHandler = Reference to function : NativeInt;
TBaseCalendarEvent = Class external name 'Object' (TJSObject)
id : string;
idInt : NativeInt; external name 'id';
groupId : string;
groupIdInt : NativeInt; external name 'groupId';
allDay : Boolean;
start : TJSDate;
startStr : string; external name 'start';
startInt : nativeInt; external name 'start';
end_ : TJSDate; external name 'end';
endStr : string; external name 'end';
endInt : nativeInt; external name 'end';
daysOfWeek : TIntegerDynArray;
startTime : TDuration;
startTimeStr : string; external name 'startTime';
endTime : TDuration;
endTimeStr : string; external name 'endTime';
startRecur : TJSDate;
startRecurStr : string; external name 'startRecur';
startRecurInt : nativeInt; external name 'startRecur';
endRecur : TJSDate;
endRecurStr : string; external name 'endRecur';
endRecurInt : nativeInt; external name 'endRecur';
title : string;
url : string;
classNames : string;
classNamesArray : TStringDynArray; external name 'classNames';
editable : boolean;
startEditable : Boolean;
durationEditable : Boolean;
resourceEditable : Boolean;
resourceId : String;
resourceIds : TStringDynArray;
rendering : string;
overlap : boolean;
constraint : string;
constraintObj : TBusinessHoursSpec; external name 'constraint';
color : string;
backgroundColor : string;
borderColor : string;
textColor : string;
extendedProps : TJSObject;
end;
TBaseCalendarEventArray = array of TBaseCalendarEvent;
{ TBaseCalendarEventHelper }
TBaseCalendarEventHelper = class helper for TBaseCalendarEvent
class function event(const aTitle : String; aStart,aEnd : TDateTime) : TBaseCalendarEvent; static;
end;
{ TCalendarEvent }
TCalendarEvent = Class external name 'Object' (TJSObject)
private
FAllDay: Boolean; external name 'allDay';
FbackgroundColor: string; external name 'backgroundColor';
FBorderColor: string; external name 'borderColor';
FClassNames: TStringDynArray; external name 'classNames';
FdurationEditable: Boolean; external name 'durationEditable';
feditable: boolean; external name 'editable';
FEnd: TJSDate; external name 'end';
fEventConstraint: string; external name 'eventConstraint';
FExtendedProps: TJSObject; external name 'extendedProps';
FGroupID: string; external name 'groupId';
FID: string; external name 'id';
FOverLap: boolean; external name 'overlap';
FRendering: string; external name 'rendering';
FresourceEditable: Boolean; external name 'resourceEditable';
FSource: JSValue; external name 'source';
FStart: TJSDate; external name 'start';
FstartEditable: Boolean; external name 'startEditable';
FTextColor: string; external name 'textColor';
FTitle: string; external name 'title';
FURL: string; external name 'url';
Public
procedure setProp(const aName : string; aValue : JSValue);
procedure setExtendedProp(const aName : string; aValue : JSValue);
Procedure setStart(aDate : TJSDate); overload;
Procedure setStart(aDate : String); overload;
Procedure setStart(aDate : NativeInt); overload;
Procedure setStart(aDate : TJSDate; Options : TJSObject); overload;
Procedure setStart(aDate : String; Options : TJSObject); overload;
Procedure setStart(aDate : NativeInt; Options : TJSObject); overload;
Procedure setEnd(aDate : TJSDate); overload;
Procedure setEnd(aDate : String); overload;
Procedure setEnd(aDate : NativeInt); overload;
Procedure setDates(aStart,aEnd : TJSDate); overload;
Procedure setDates(aStart,aEnd : String); overload;
Procedure setDates(aStart,aEnd : NativeInt); overload;
Procedure setDates(aStart,aEnd : TJSDate; Options : TJSObject); overload;
Procedure setDates(aStart,aEnd : String; Options : TJSObject); overload;
Procedure setDates(aStart,aEnd : NativeInt; Options : TJSObject); overload;
Procedure setAllDay(aValue : Boolean); overload;
Procedure setAllDay(aValue : Boolean; Options:TJSObject); overload;
Procedure moveStart(aDelta : TDuration); overload;
Procedure moveStart(aDelta : String); overload;
Procedure moveStart(aDelta : NativeInt); overload;
Procedure moveEnd(aDelta : TDuration); overload;
Procedure moveEnd(aDelta : String); overload;
Procedure moveEnd(aDelta : NativeInt); overload;
Procedure moveDates(aDelta : TDuration); overload;
Procedure moveDates(aDelta : String); overload;
Procedure moveDates(aDelta : NativeInt); overload;
Procedure formatRange(formatter : TDateFormatter);
Procedure remove;
Function getResources : TCalendarResourceArray;
Procedure setResources(aResources : array of string); overload;
Procedure setResources(aResources : TCalendarResourceArray); overload;
Property id : string read FID;
Property groupId : string read FGroupID;
Property allDay : Boolean read FAllDay;
Property start : TJSDate read FStart;
Property end_ : TJSDate read FEnd;
Property title : string read FTitle;
Property url : string read FURL;
Property classNames : TStringDynArray read FClassNames;
Property editable : boolean read feditable;
Property startEditable : Boolean read FstartEditable;
property eventConstraint : string Read fEventConstraint;
Property durationEditable : Boolean Read FdurationEditable;
Property resourceEditable : Boolean read FresourceEditable;
Property rendering : string read FRendering;
Property overlap : boolean read FOverLap;
Property backgroundColor : string read FbackgroundColor;
Property borderColor : string read FBorderColor;
Property textColor : string Read FTextColor;
Property extendedProps : TJSObject Read FExtendedProps;
Property source : JSValue Read FSource;
end;
TCalendarEventArray = array of TCalendarEvent;
TGoogleCalendarEventsSpec = Class external name 'Object' (TJSObject)
googleCalendarId : String;
// Other options can be specified
end;
TJSONFeedSpec = Class external name 'Object' (TJSObject)
url : string;
// Other options can be specified
end;
TEventGeneratorInfo = record
start : TJSDate;
end_ : TJSDate; external name 'end';
startStr : String;
endStr : String;
timeZone : String;
end;
TSelectInfo = Record
Start : TJSDate;
end_ : TJSDate; external name 'end';
resourceId : String;
end;
TEventMouseInfo = record
event : TCalendarEvent;
el : TJSHTMLElement;
jsEvent : TJSEvent;
view : TFullCalendarView;
end;
TGenerateEventsCallBack = Procedure (Res : TBaseCalendarEventArray);
TGenerateEventsFailureCallBack = Procedure (Res : TBaseCalendarEventArray);
TCalendarEventGenerator = reference to Procedure (info : TEventGeneratorInfo; successCallBack : TGenerateEventsCallBack; FailCallBack : TGenerateEventsFailureCallBack);
TCalendarLoadingCallback = reference to procedure (isLoading : Boolean);
TSelectOverlapHandler = reference to function(Event : TJSObject) : boolean;
TSelectAllowHandler = reference to function(info : TSelectInfo) : Boolean;
TEventMouseEventHandler = reference to procedure(info : TEventMouseInfo);
TCalendarEventSource = Class external name 'Object' (TJSObject)
events : TBaseCalendarEventArray;
eventsStr : string; external name 'events'; // JSON feed
eventsFunc : TCalendarEventGenerator; external name 'events'; // JSON feed
eventsJSONFeed : TJSONFeedSpec; external name 'events'; // JSON feed
eventsArr : TCalendarEventArray; external name 'events'; // JSON feed
eventsObjList : TJSObjectDynArray ; external name 'events'; // Roll your own
Procedure refetch;
Procedure remove;
end;
TCalendarEventSourceArray = Array of TCalendarEventSource;
TFullCalendarOptions = Class external name 'Object' (TJSObject)
plugins : TStringDynArray;
pluginRaw : TJSArray; external name 'plugins';
rerenderDelay : NativeInt;
defaultDate : TJSDate;
defaultDateStr : string; external name 'defaultDate';
defaultDateInt : nativeInt; external name 'defaultDate';
dateIncrement : TDuration;
dateIncrementStr : string; external name 'dateIncrement';
dateAlignment : String;
validRange : TDateRange;
defaultView : string;
header : TCalendarHeaderFooterOptions;
headerBool : Boolean; external name 'header';
footer : TCalendarHeaderFooterOptions;
footerBool : Boolean; external name 'footer';
titleFormat : TDateFormatter;
titleFormatStr : string; external name 'titleFormat';
titleFormatFunc : TDateFormatHandler; external name 'titleFormat';
titleRangeSeparator : String;
buttonText : TButtonText;
buttonTextRec : TButtonTextRec;
buttonIcons : TButtonIcons;
buttonIconsRec : TButtonIconsRec;
customButtons : TCustomButtonSpecs;
customButtonsObj : TJSObject;
themeSystem : string;
bootstrapFontAwesome : TFontAwesomeSpec;
bootstrapFontAwesomeRec : TFontAwesomeSpecRec;
weekends : boolean;
hiddenDays : TNativeIntDynArray;
columnHeader : Boolean;
columnHeaderFormat : TDateFormatter;
columnHeaderText : TDateFormatHandler;
columnHeaderHTML : TDateFormatHandler;
slotDuration : TDuration;
slotDurationStr : string; external name 'slotDuration';
slotLabelInterval : TDuration;
slotLabelIntervalStr : string; external name 'slotLabelInterval';
slotLabelFormat : TDateFormatter;
slotLabelFormatStr : String;
minTime : TDuration;
minTimeStr : string; external name 'minTime';
maxTime : TDuration;
maxTimeStr : string; external name 'maxTime';
scrollTime : TDuration;
scrollTimeStr : string; external name 'scrollTime';
firstDay : Integer;
locale : string;
dir : string;
height : Integer;
heightStr : String; external name 'height';
heightFunc : THeightHandler; external name 'height';
contentHeight : Integer;
contentHeightStr : String; external name 'contentHeight';
contentHeightFunc : THeightHandler; external name 'contentHeight';
aspectRatio : Double;
handleWindoResize : Boolean;
windowResizeDelay : Integer;
showNonCurrentDates : Boolean;
fixedWeekCount : Boolean;
businessHours : TBusinessHoursSpec;
businessHoursBool : Boolean; external name 'businessHours';
businessHoursArray : TBusinessHoursSpecArray; external name 'businessHours';
nowIndicator : Boolean;
now : TJSDate;
nowStr : string; external name 'now';
nowInt : nativeInt; external name 'now';
nowFunc : TDateFunction; external name 'now';
events : TBaseCalendarEventArray;
eventsStr : string; external name 'events'; // JSON feed
eventsFunc : TCalendarEventGenerator; external name 'events'; // JSON feed
eventsJSONFeed : TJSONFeedSpec; external name 'events'; // JSON feed
eventsArr : TCalendarEventArray; external name 'events'; // JSON feed
eventsObjList : TJSObjectDynArray ; external name 'events'; // Roll your own
eventSources : TCalendarEventSourceArray;
startParam : string;
endParam : string;
timeZoneParam : string;
lazyFetching : Boolean;
loading : TCalendarLoadingCallback;
selectable : boolean;
selectMirror : Boolean;
unselectAuto : Boolean;
unselectCancel : string;
selectOverlap : boolean;
selectOverlapFunc : TSelectOverlapHandler; external name 'selectOverlap';
selectAllow : TSelectAllowHandler;
selectMinDistance : Integer;
selectConstraint: TBusinessHoursSpec;
eventClick : TEventMouseEventHandler;
eventMouseEnter : TEventMouseEventHandler;
eventMouseLeave : TEventMouseEventHandler;
end;
{ TFullCalendarView }
TDateSelector = Class external name 'Object' (TJSObject)
start : TJSDate;
startStr : string; external name 'start';
startInt : NativeInt; external name 'start';
end_ : TJSDate;
endStr : string; external name 'end';
endInt : NativeInt; external name 'end';
allDay : Boolean;
resourceId : String;
end;
TFullCalendarView = Class external name 'Object' (TJSObject)
private
FType: string; external name 'type';
Public
title : string;
activeStart : TJSDate;
activeEnd : TJSDate;
currentStart : TJSDate;
currentEnd : TJSDate;
Property type_ : string read FType;
end;
TFullCalendarEventInfo = record
view : TFullCalendarView;
el : TJSHTMLElement;
end;
TDayRenderInfo = record
date : TJSDate;
view : TFullCalendarView;
el : TJSHTMLElement;
end;
TDateClickInfo = record
date : TJSDate;
dateStr : string;
allDay : Boolean;
dayEl : TJSHTMLElement;
jsEvent : TJSEvent;
view : TFullCalendarView;
resource : TCalendarResource;
end;
TDateSelectInfo = record
start : TJSDate;
startStr : string;
end_ : TJSDate; external name 'end';
endStr : string;
allDay : Boolean;
jsEvent : TJSEvent;
view : TFullCalendarView;
resource : TCalendarResource;
end;
TFullCalendarEvent = reference to function(Info :TFullCalendarEventInfo) : Boolean;
TDayRenderEvent = reference to function(Info : TDayrenderInfo) : Boolean;
TViewEvent = reference to function(View : TFullCalendarView) : Boolean;
TDateClickEvent = reference to procedure (Info: TDateClickInfo);
TDateSelectEvent = reference to procedure (Info: TDateSelectInfo);
TDateUnSelectEvent = reference to procedure (event: TJSEvent; View : TFullCalendarView);
TFullCalendar = Class external name 'FullCalendar.Calendar' (TJSObject)
Constructor new(el : TJSHTMLElement; Options : TFullCalendarOptions) ; // external name 'Calendar';
class function Calendar(el : TJSHTMLElement; Options : TFullCalendarOptions) : TFullCalendar; static;
function getOption(aName : String) : JSValue;
procedure setOption(aName : string; aValue : JSValue);
procedure render;
procedure destroy;
Procedure batchRendering(aBatch : TProcedural);
Procedure prev;
Procedure next;
Procedure prevYear;
Procedure nextYear;
Procedure today;
Procedure gotoDate(aDate : string); overload;
Procedure gotoDate(aDate : NativeInt); overload;
Procedure gotoDate(aDate : TJSDate); overload;
Procedure incrementDate(aDuration : TDuration); overload;
Procedure incrementDate(aDuration : string);overload;
Procedure incrementDate(aDuration : NativeInt);overload;
Procedure on_(eventName : string; aHandler : TFullCalendarEvent); external name 'on';
Procedure on_(eventName : string; aHandler : TDayRenderEvent);external name 'on';
Procedure on_(eventName : string; aHandler : TViewEvent);external name 'on';
Procedure on_(eventName : string; aHandler : TDateSelectEvent);external name 'on';
Procedure on_(eventName : string; aHandler : TDateClickEvent);external name 'on';
Procedure on_(eventName : string; aHandler : TDateUnSelectEvent);external name 'on';
Procedure off(eventName : string); overload;
Procedure off(eventName : string; aHandler : TFullCalendarEvent); overload;
Procedure off(eventName : string; aHandler : TDayRenderEvent);
Procedure off(eventName : string; aHandler : TViewEvent);
Procedure off(eventName : string; aHandler : TDateClickEvent);
Procedure off(eventName : string; aHandler : TDateUnSelectEvent);
function GetDate : TJSDate;
function View : TFullCalendarView;
procedure changeView(aViewName : string); overload;
procedure changeView(aViewName : string; aDate : TJSDate); overload;
procedure changeView(aViewName : string; aDate : String); overload;
procedure changeView(aViewName : string; aDate : NativeInt); overload;
procedure changeView(aViewName : string; aDate : TDateRange); overload;
procedure scrollToTime(aTime : TDuration); overload;
procedure scrollToTime(aTime : String); overload;
procedure scrollToTime(aTime : NativeInt); overload;
Procedure updateSize;
Function getEvents : TCalendarEventArray;
Function getEvent(aID : NativeInt) :TCalendarEvent; overload;
Function getEvent(aID : String) : TCalendarEvent; overload;
Function addEvent(aEvent : TBaseCalendarEvent) : TCalendarEvent; overload;
Function addEvent(aEvent : TBaseCalendarEvent; Source : String) : TCalendarEvent; overload;
Function addEvent(aEvent : TBaseCalendarEvent; Source : TBaseCalendarEvent) : TCalendarEvent; overload;
Function getEventSources : TCalendarEventSourceArray;
Function getEventSourcebyId(aID: String) : TCalendarEventSource;
Procedure addEventSource(aSource : TCalendarEventGenerator);
Procedure addEventSource(aSource : TJSONFeedSpec);
Procedure addEventSource(aSource : TCalendarEventArray);
Procedure addEventSource(aSource : TBaseCalendarEventArray);
Procedure addEventSource(aSource : String);
procedure refetchEvents;
procedure Select(aStart : TJSDate; aEnd : TJSDate);
procedure Select(aStart : String; aEnd : String);
procedure Select(aStart : NativeInt; aEnd : NativeInt);
procedure Select(aStart : TJSDate);
procedure Select(aStart : String);
procedure Select(aStart : NativeInt);
procedure Select(aSel : TDateSelector);
procedure unselect;
Function getAvailableLocaleCodes : TStringDynArray;
Property Date : TJSDate Read GetDate Write GotoDate;
end;
implementation
{ TBaseCalendarEventHelper }
class function TBaseCalendarEventHelper.event(const aTitle : String; aStart,aEnd : TDateTime) : TBaseCalendarEvent;
begin
Result:=TBaseCalendarEvent.new;
Result.title:=aTitle;
Result.Start:=DateTimeToJSDate(aStart);
Result.end_:=DateTimeToJSDate(aEnd);
end;
end.