RestDataProvider
Provider class that wires Calendar mutations (add-event, update-event, move-event, delete-event) to a REST events collection. Fetches data via getData() - all events, or one range - with Date fields parsed. When a loader is supplied, it also forwards request-data to it for dynamic loading.
Usage
class RestDataProvider {
constructor(url?: string, config?: CalendarRestDataProviderConfig);
getData(range?: { startDate: Date; endDate: Date }): Promise<CalendarEvent[]>;
send(path: string, method: string, body?: any): Promise<any>;
}
Constructor
| Parameter | Type | Description |
|---|---|---|
url | string | Optional base URL of the REST endpoint serving events. |
config | CalendarRestDataProviderConfig | Optional provider settings. |
type CalendarRestDataProviderConfig = Partial<RestDataProviderConfig> & {
loader?: { request(data: RequestDataAction): Promise<void> };
parseDate?: (value: any) => Date;
serializeDate?: (date: Date) => any;
};
| Field | Type | Description |
|---|---|---|
loader | { request(data): Promise<void> } | Dynamic loader that receives request-data. Without one, request-data is a no-op. |
parseDate | (value: any) => Date | Converts incoming date strings to Date. Default: value => new Date(value). |
serializeDate | (date: Date) => any | Serializes Date values in range query URLs. Default: date => date.toISOString(). |
Endpoints
The provider issues these requests against url:
| Action | Method | Path | Body |
|---|---|---|---|
getData() | GET | /events | - |
getData({ startDate, endDate }) | GET | /events?startDate=...&endDate=... | - |
add-event | POST | /events | event payload (without id) |
update-event | PUT | /events/{id} | event payload (debounced 500ms) |
move-event | PUT | /events/{id} | move patch (immediate) |
delete-event | DELETE | /events/{id} | - |
request-data isn't a REST call - the provider forwards it to loader.request(data) when a loader was supplied, otherwise it does nothing.
On any getData call, start, end, and each exdates entry are converted to Date instances via parseDate.
Date-serialization caveat: serializeDate reliably controls the startDate/endDate values in range query URLs. It does not control dates inside CRUD request bodies - native Date#toJSON() runs before the provider's JSON replacer, so nested body dates serialize as native ISO strings even with a custom serializeDate.
Loading initial data
<script>
import { Calendar, RestDataProvider } from "@svar-ui/svelte-calendar";
const provider = new RestDataProvider("https://example.com/api");
let data = $state([]);
let date = $state(new Date());
provider.getData().then(events => {
data = events;
if (events[0]) date = events[0].start;
});
</script>
<Calendar events={data} {date} />
Forwarding mutations
Attach via api.setNext(provider) inside init to forward add/update/delete actions to the backend:
<script>
import { Calendar, Editor, RestDataProvider } from "@svar-ui/svelte-calendar";
const provider = new RestDataProvider("https://example.com/api");
let api = $state();
let data = $state([]);
provider.getData().then(events => (data = events));
function init(api) {
api.setNext(provider);
}
</script>
<Calendar bind:this={api} {init} events={data} date={new Date()} />
{#if api}<Editor {api} />{/if}
Dynamic loading
Pass a loader to load events per visible range instead of all at once. The store emits request-data when the range changes; the provider forwards it to loader.request(data). The loader fetches the range (typically via provider.getData({ startDate, endDate })) and pushes results back with provide-data. The provider itself does not cache ranges or dispatch provide-data - that's the loader's job.
const provider = new RestDataProvider("https://example.com/api", {
loader: myDynamicLoader,
});
See the dynamic loading guide for the full loader wiring and cache contract.
Related articles
setNext— chain method that attaches the provider.init— typical place to wire the provider.add-event,update-event,delete-event— actions forwarded to REST.- Saving to a backend — full integration guide.