@svar-ui/calendar-provider 2.6.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -21,25 +21,22 @@ declare class EventBus<T, A extends keyof T> {
21
21
  setNext(next: IEventBus<T>): IEventBus<T>;
22
22
  }
23
23
  //#endregion
24
- //#region ../../node_modules/.pnpm/@svar-ui+lib-data-provider@1.7.2/node_modules/@svar-ui/lib-data-provider/dist/index.d.ts
25
- type Action = {
24
+ //#region ../../node_modules/.pnpm/@svar-ui+lib-data-provider@1.7.3/node_modules/@svar-ui/lib-data-provider/dist/index.d.ts
25
+ type Action<T = DataObj> = {
26
26
  ignoreID?: boolean;
27
27
  debounce?: number;
28
- handler: Handler;
28
+ kind?: number;
29
+ handler: Handler<T>;
29
30
  };
30
- type ActionMap<T> = { [P in keyof T]?: Action };
31
+ type ActionMap<T> = { [P in keyof T]?: Action<T[P]> };
31
32
  type DataObj = {
32
33
  [key: string]: any;
33
34
  };
34
- type Handler = (data: DataObj, action: string, ev: any) => Promise<any>;
35
- type HandlerConfig = {
35
+ type Handler<T = DataObj> = (data: T, action: string, ev: any) => Promise<any>;
36
+ type HandlerConfig<T = DataObj> = Action<T> & {
36
37
  resolve?: (v: boolean) => void;
37
38
  reject?: (e: any) => void;
38
39
  timer?: number;
39
- kind?: number;
40
- debounce?: number;
41
- ignoreID?: boolean;
42
- handler: Handler;
43
40
  };
44
41
  type RestDataProviderConfig = {
45
42
  batchURL?: string;
@@ -87,6 +84,7 @@ declare class Rest<T> extends EventBus<T, keyof T> {
87
84
  }
88
85
  //#endregion
89
86
  //#region ../store/dist/index.d.mts
87
+ type RecurringEditMode = "series" | "single" | "following";
90
88
  interface StoreActions {
91
89
  ["navigate-to"]: {
92
90
  date?: Date;
@@ -99,29 +97,91 @@ interface StoreActions {
99
97
  event: Partial<CalendarEvent>;
100
98
  edit?: boolean;
101
99
  id?: EventID;
100
+ rawId?: EventID;
102
101
  };
103
102
  ["update-event"]: {
104
103
  id: EventID;
104
+ rawId?: EventID;
105
105
  event: Partial<CalendarEvent>;
106
106
  mode?: "single" | "following";
107
- originalDate?: string;
108
107
  };
109
108
  ["delete-event"]: {
110
109
  id: EventID;
110
+ rawId?: EventID;
111
+ cascade?: boolean;
111
112
  };
112
113
  ["select-event"]: {
113
114
  id: EventID | null;
115
+ rawId?: EventID | null;
116
+ mode?: RecurringEditMode | null;
114
117
  };
115
118
  ["move-event"]: {
116
119
  id: EventID;
117
- x: number;
118
- y: number;
120
+ rawId?: EventID;
121
+ event: Partial<CalendarEvent>;
122
+ mode?: "single" | "following";
119
123
  };
120
124
  ["filter-events"]: {
121
125
  filter?: ((obj: any) => boolean) | null;
122
126
  tag?: string;
123
127
  };
128
+ ["request-data"]: RequestDataAction;
129
+ ["provide-data"]: ProvideDataAction;
130
+ ["export-data"]: ExportConfig;
131
+ ["undo"]: Record<string, never>;
132
+ ["redo"]: Record<string, never>;
124
133
  }
134
+ type ExportConfig = {
135
+ url?: string | ((data: ExportConfig, records: CalendarEvent[], helpers: ExportHelpers) => void);
136
+ format?: string;
137
+ fileName?: string;
138
+ skin?: string;
139
+ paper?: {
140
+ fitSize?: boolean;
141
+ size?: string | {
142
+ width: number;
143
+ height: number;
144
+ };
145
+ landscape?: boolean;
146
+ styles?: string | string[];
147
+ margins?: {
148
+ top?: number;
149
+ bottom?: number;
150
+ left?: number;
151
+ right?: number;
152
+ };
153
+ header?: string;
154
+ footer?: string;
155
+ scale?: number;
156
+ };
157
+ excel?: {
158
+ sheetNames?: string[];
159
+ dateFormat?: string;
160
+ columns?: {
161
+ id: string;
162
+ label?: string;
163
+ width?: number;
164
+ hidden?: boolean;
165
+ }[];
166
+ };
167
+ data?: Record<string, any>;
168
+ };
169
+ type ExportHelpers = {
170
+ post: (url: string, data: Record<string, string>) => void;
171
+ serialize: (value: any) => string;
172
+ };
173
+ type RequestDataAction = {
174
+ startDate: Date;
175
+ endDate: Date;
176
+ date: Date;
177
+ view: string;
178
+ };
179
+ type ProvideDataAction = {
180
+ data: {
181
+ events: CalendarEvent[];
182
+ };
183
+ reset?: boolean;
184
+ };
125
185
  type EventID = string | number;
126
186
  interface CalendarEvent {
127
187
  id: EventID;
@@ -132,13 +192,29 @@ interface CalendarEvent {
132
192
  }
133
193
  //#endregion
134
194
  //#region src/RestDataProvider.d.ts
135
- type TMethodsConfig = Pick<StoreActions, "add-event" | "update-event" | "delete-event">;
195
+ type TMethodsConfig = Pick<StoreActions, "add-event" | "update-event" | "move-event" | "delete-event" | "request-data">;
196
+ type CalendarRestDataProviderConfig = Partial<RestDataProviderConfig> & {
197
+ loader?: DynamicLoader;
198
+ parseDate?: (v: any) => Date;
199
+ serializeDate?: (date: Date) => any;
200
+ };
201
+ type DynamicLoader = {
202
+ request: (data: RequestDataAction) => Promise<void>;
203
+ };
204
+ type Range = {
205
+ startDate: Date;
206
+ endDate: Date;
207
+ };
136
208
  declare class RestDataProvider extends Rest<TMethodsConfig> {
209
+ private _loader;
210
+ private _parseDate;
211
+ private _serializeDate;
212
+ constructor(url?: string, config?: CalendarRestDataProviderConfig);
137
213
  getHandlers(): ActionMap<TMethodsConfig>;
138
- getData(): Promise<CalendarEvent[]>;
214
+ getData(range?: Range): Promise<CalendarEvent[]>;
139
215
  parseDates(data: CalendarEvent[]): CalendarEvent[];
140
216
  protected toPayload(obj: object): string;
141
- formatDate(date: Date): string;
217
+ private handleDynamicRequest;
142
218
  }
143
219
  //#endregion
144
- export { RestDataProvider };
220
+ export { type CalendarRestDataProviderConfig, type ProvideDataAction, type RequestDataAction, RestDataProvider };
package/dist/index.mjs CHANGED
@@ -45,7 +45,7 @@ var EventBus = class {
45
45
  }
46
46
  };
47
47
  //#endregion
48
- //#region ../../node_modules/.pnpm/@svar-ui+lib-data-provider@1.7.2/node_modules/@svar-ui/lib-data-provider/dist/index.js
48
+ //#region ../../node_modules/.pnpm/@svar-ui+lib-data-provider@1.7.3/node_modules/@svar-ui/lib-data-provider/dist/index.js
49
49
  var cantSendYet = Symbol();
50
50
  var ActionQueue = class {
51
51
  constructor() {
@@ -183,7 +183,7 @@ var ActionQueue = class {
183
183
  if (hasRealID) {
184
184
  if (copy === null) copy = { ...obj };
185
185
  copy[key] = hasRealID;
186
- } else if (!ignore) return cantSendYet;
186
+ } else if (test !== ignore) return cantSendYet;
187
187
  }
188
188
  }
189
189
  return copy || obj;
@@ -276,6 +276,15 @@ var Rest = class extends EventBus {
276
276
  //#endregion
277
277
  //#region src/RestDataProvider.ts
278
278
  var RestDataProvider = class extends Rest {
279
+ _loader = null;
280
+ _parseDate;
281
+ _serializeDate;
282
+ constructor(url, config = {}) {
283
+ super(url, config);
284
+ this._loader = config.loader ?? null;
285
+ this._parseDate = config.parseDate || ((v) => new Date(v));
286
+ this._serializeDate = config.serializeDate || ((date) => date.toISOString());
287
+ }
279
288
  getHandlers() {
280
289
  return {
281
290
  "add-event": {
@@ -292,29 +301,38 @@ var RestDataProvider = class extends Rest {
292
301
  return this.send(`events/${data.id}`, "PUT", data.event);
293
302
  }
294
303
  },
295
- "delete-event": { handler: async (data) => this.send(`events/${data.id}`, "DELETE") }
304
+ "move-event": { handler: async (data) => {
305
+ return this.send(`events/${data.id}`, "PUT", data.event);
306
+ } },
307
+ "delete-event": { handler: async (data) => this.send(`events/${data.id}`, "DELETE") },
308
+ "request-data": { handler: async (data) => this.handleDynamicRequest(data) }
296
309
  };
297
310
  }
298
- async getData() {
299
- const events = await this.send("events", "GET");
311
+ async getData(range) {
312
+ let events;
313
+ if (range) {
314
+ const query = [`startDate=${encodeURIComponent(this._serializeDate(range.startDate))}`, `endDate=${encodeURIComponent(this._serializeDate(range.endDate))}`].join("&");
315
+ events = await this.send(`events?${query}`, "GET");
316
+ } else events = await this.send("events", "GET");
300
317
  return this.parseDates(events);
301
318
  }
302
319
  parseDates(data) {
303
320
  data.forEach((item) => {
304
- item.start = new Date(item.start);
305
- item.end = new Date(item.end);
306
- if (item.exdates) item.exdates = item.exdates.map((d) => new Date(d));
321
+ item.start = this._parseDate(item.start);
322
+ item.end = this._parseDate(item.end);
323
+ if (item.exdates) item.exdates = item.exdates.map((d) => this._parseDate(d));
307
324
  });
308
325
  return data;
309
326
  }
310
327
  toPayload(obj) {
311
328
  return JSON.stringify(obj, (_key, value) => {
312
- if (value instanceof Date) return this.formatDate(value);
329
+ if (value instanceof Date) return this._serializeDate(value);
313
330
  return value;
314
331
  });
315
332
  }
316
- formatDate(date) {
317
- return date.toISOString();
333
+ handleDynamicRequest(data) {
334
+ if (!this._loader) return;
335
+ return this._loader.request(data);
318
336
  }
319
337
  };
320
338
  //#endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svar-ui/calendar-provider",
3
- "version": "2.6.0",
3
+ "version": "2.7.0",
4
4
  "description": "Data provider and REST proxy for the SVAR Calendar",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -16,19 +16,19 @@
16
16
  "access": "public"
17
17
  },
18
18
  "devDependencies": {
19
- "@svar-ui/lib-data-provider": "1.7.2",
19
+ "@svar-ui/lib-data-provider": "1.7.3",
20
20
  "@typescript/native-preview": "7.0.0-dev.20260316.1",
21
21
  "typescript": "^5.9.3",
22
22
  "vite-plus": "0.1.16",
23
- "@svar-ui/calendar-store": "2.6.0"
23
+ "@svar-ui/calendar-store": "2.7.0"
24
24
  },
25
25
  "inlinedDependencies": {
26
- "@svar-ui/lib-data-provider": "1.7.2",
26
+ "@svar-ui/lib-data-provider": "1.7.3",
27
27
  "@svar-ui/lib-state": "1.9.6"
28
28
  },
29
29
  "scripts": {
30
30
  "build": "vp pack",
31
- "watch": "vp pack --watch",
31
+ "dev": "vp pack --watch",
32
32
  "test": "vp test",
33
33
  "check": "vp check"
34
34
  }