forked from DefinitelyTyped/DefinitelyTyped
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cal-heatmap.d.ts
514 lines (458 loc) · 20.5 KB
/
cal-heatmap.d.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
// Type definitions for cal-heatmap v3.5.4
// Project: https://github.com/wa0x6e/cal-heatmap
// Definitions by: Chris Baker <https://github.com/RetroChrisB/>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
/// <reference path="../d3/d3.d.ts" />
declare namespace CalHeatMap
{
interface CalHeatMapStatic
{
new (): CalHeatMap;
}
interface CalHeatMap
{
/**
* Initialise the CalHeatMap with the specified options
* @param {InitOptions} options The CalHeatMap options
*/
init(options?: InitOptions): void;
options: RuntimeOptions;
// Various update mode when using the update() API
/** Reset the whole calendar data before inserting the new data. */
RESET_ALL_ON_UPDATE: number;
/**
* Update only the dates (subDomain) you pass in the data argument, replace their value by the new ones.
* All other dates are leaved untouched.
*/
RESET_SINGLE_ON_UPDATE: number;
/**
* Instead of replacing a date's value by a new one, increment it by the new value. All other dates are leaved untouched.
* That's the one you want to use of you're populating the calendar in realtime!
*/
APPEND_ON_UPDATE: number;
/**
* Shift the calendar n domains back
* @param {number} n The number of domains to shift back. The default is 1.
*/
previous(n?: number): void;
/**
* Shift the calendar n domains forward
* @param {number} n The number of domains to shift forward. The default is 1.
*/
next(n?: number): void;
/**
* Jump the calendar to the specified date
* This method will shift the calendar backward or forward, until the domain containing the specified date is visible.
* @param {Date} date The date to jump to.
* @param {boolean} reset Whether to set the domain with the specified as the calendar's first domain.
*/
jumpTo(date: Date, reset?: boolean): void;
/** Reset the calendar back to the start date */
rewind(): void;
/**
* Update the calendar with new data
* Use update() when you want to refresh the calendar with a new set of data.
* Particularly useful if you're filling the calendar in realtime, or if you want to display a subset of the current data.
* @param {string|Object} data Accept the same format as the data option.
* @param {} afterLoad Whether to execute the afterLoad() callback to convert your data into the json object, expected by cal-heatmap.
* It can also directly takes a function, in case your data can not be converted with the afterLoad() function you defined.
* @param {} updateMode Define how to insert the new data into the calendar.
* Accepted values are:
* Instance.RESET_ALL_ON_UPDATE (default) Reset the whole calendar data before inserting the new data.
* Instance.RESET_SINGLE_ON_UPDATE Update only the dates (subDomain) you pass in the data argument,
* replace their value by the new ones. All other dates are leaved untouched.
* Instance.APPEND_ON_UPDATE Instead of replacing a date's value by a new one, increment it by the new value.
* All other dates are leaved untouched. That's the one you want to use of you're
* populating the calendar in realtime!
*/
update(data: string | Object, afterLoad?: boolean | Function, updateMode?: number): void;
/**
* Change the highlighted dates.
* Takes an array of Date object. Can also accepts the now string, equivalent to Date.now().
* @param {string|Date|Date[]} dates The date or dates to highlight.
*/
highlight(dates: string | Date | Date[]): void;
/**
* Return the SVG source code with the appropriate CSS
* The returned string code is valid and ready to be placed in a .svg file.
* @returns SVG source code with the appropriate CSS.
*/
getSVG(): string;
/**
* Change the legend settings and/or threshold
* When called without arguments, setLegend() will just redraw the legend.
* @param {} legend Same as legend : an array of thresholds
* @param {} legendColor Same as legendColors : an object with the heatmap's colors, or an array of 2 colors
*/
setLegend(legend?: number[], legendColors?: LegendColor | string[]): void;
/**
* Remove the legend from the calendar
* Settings are kept and you can re-add the legend with the same settings using showLegend().
*/
removeLegend(): void;
/** Display the legend, if not already shown. */
showLegend(): void;
/**
* Remove the calendar from the DOM
* Remember to self-assign the result of destroy() to your calendar instance, or it'll lead to a memory leak.
* @param {Function} callback function that will be executed when the calendar is removed from the DOM, at the end of the animation.
* @returns always returns null.
*/
destroy(callback?: Function): CalHeatMap;
}
interface LegendColor
{
/** Color of the smallest value on the legend */
min: string;
/** Color of the highest value on the legend */
max: string;
/** Color for the dates with value == 0 */
empty?: string;
/** Base color of the date cells */
base?: string;
/** Color for the special value */
overflow?: string;
}
interface InitOptions
{
// ================================================
// Presentation
// ================================================
/** DOM node to insert the calendar in. Default: "#cal-heatmap" */
itemSelector?: string | HTMLElement | Element | EventTarget;
/**
* Type of domain. Default: "hour"
* Valid domains: {"hour", "day", "week", "month", "year"}
*/
domain?: string;
/**
* Type of subDomain. Default: "min"
* Valid subDomains: {"min", "x_min", "hour", "x_hour", "day", "x_day", "week", "x_week", "month", "x_month"}
*/
subDomain?: string;
/** Number of domain to display. Default: 12 */
range?: number;
/** Size of each subDomain cell, in pixels. Default: 10 */
cellSize?: number;
/** Space between each subDomain cell, in pixel. Default: 2 */
cellPadding?: number;
/** subDomain cell's border radius, for rounder corner, in pixel. Default: 0 */
cellRadius?: number;
/** Space between each domain, in pixel. Default: 2 */
domainGutter?: number;
/**
* Margin around each domain, in pixel. Default: [0,0,0,0]
* Ordered like in CSS (top, right, bottom, left), it also accepts CSS like values
*/
domainMargin?: number | number[];
/**
* Whether to enable domain dynamic width and height. Default: true
* Some domain>subdomain couple, like month>days, doesn't always have the same number of
* subDomain cells. Some months have 6 weeks, some only 4.
* With dynamic dimension enabled, the domain width and height will be adjusted to fit the
* domain content, whereas when it's disabled, all domains will have the same dimension : the biggest.
*/
domainDynamicDimension?: boolean;
/** To display the calendar vertically, with each domain one under the other. Default: false */
verticalOrientation?: boolean;
/** Position and alignment of the domain label. */
label?: Label;
/**
* Control the number of columns to split the domain dates into. Default: null
* Each domain is split into an arbitrary number of columns (or rows depending on the
* reading direction). You can overwrite that number with colLimit, and force all dates on the
* same line, or split them into more columns.
* That setting limit the maximum number of columns, and doesn't necessary means that each rows will
* contains that number of columns.
*/
colLimit?: number;
/** Control the number of rows to split the domain dates into. Default: null
* If rowLimit and colLimit are both used, rowLimit will be ignored. */
rowLimit?: number;
/** Whether to display a tooltip when hovering over a date. Default: false */
tooltip?: boolean;
// ================================================
// Data
// ================================================
/**
* Starting date of the calendar. Default: new Date()
* It doesn't have to be precise, the calendar will not start at that date, but at the first domain containing that date.
*/
start?: Date;
/**
* Data used to fill the calendar. Default: ""
* String is interpreted as a URL to an API, which should be returning the data used to fill the calendar.
*/
data?: string | Object;
/**
* Engine used to parse the data. Default: json
* Valid values:
* "json" - Interpret the data as json.
* "csv" - Interpret the data as csv.
* "tsv" - Interpret the data exactly like csv, but are delimited with a tab character, instead of comma.
* "txt" - Just return the data as a string.
*/
dataType?: string;
/**
* Highlight selected subDomain cells. Default: false
* Takes an array of Date object. Can also accepts the now string, equivalent to Date.now().
*/
highlight?: string | string[] | Date[] | any[];
/** Whether to start the week on Monday, instead of Sunday. Default: true */
weekStartOnMonday?: boolean;
/**
* Lower limit of the domain navigation, preventing navigating beyond a certain date. Default: null
* When set, calling previous() will only work only until the leftmost domain containing minDate.
* Like with start, minDate does not have to be precise, and just have to be a date inside the domain.
* previous() will always return true, unless the domain containing minDate is reached, in which case, it'll return false.
*/
minDate?: Date;
/** Upper limit of the domain navigation, preventing navigating beyond a certain date. Default: null */
maxDate?: Date;
/**
* Whether to consider missing date:value couple in the data source as equal to 0. Default: false
* By default, when the a date is not associated to a value, it's considered as null, and rendered as a no value cell.
* You should ask yourself, if the API is not returning result for a date, is it because there is really no value
* associated to this date, or because it's supposed to be equal to 0, and it's skipped in order to save bandwidth ?
*/
considerMissingDataAsZero?: boolean;
// ================================================
// Legend
// ================================================
/** Assign each range of values to a color. Default: [10, 20, 30, 40] */
legend?: number[];
/** Whether to display the legend. Default: true */
displayLegend?: boolean;
/** Size of the legend cells, in pixels. Default: 10 */
legendCellSize?: number;
/** Padding between each legend cell, in pixels. Default: 2 */
legendCellPadding?: number;
/** Margin around the legend, in pixels. Default: [10, 0, 0, 0] */
legendMargin?: number | number[];
/**
* Vertical position of the legend. Default: "bottom"
* Valid values:
* "top" - Place the legend above the calendar
* "center" - Place the legend on the calendar's side
* Use with legendHorizontalPosition, to position the legend on the left (default) or on the right.
* "bottom" - Place the legend on below the calendar
*/
legendVerticalPosition?: string;
/**
* Horizontal position of the legend. Default: "left"
* Valid values:
* "left" - Align the legend to the left
* "center" - Center the legend
* "right" - Align the legend to the right
*/
legendHorizontalPosition?: string;
/**
* Orientation of the legend. Default: "horizontal"
* legendOrientation is best used together with legendHorizontalPosition when the legend is positioned on the side.
* Valid values:
* "horizontal" - Legend is displayed horizontally, from left to right
* "vertical" - Legend is displayed vertically, from top to bottom
*/
legendOrientation?: string;
/**
* Set of colors to automagically compute the heatmap colors.
* Instead of relying on the CSS for your heatmap's colors, you can also set the heatmap's colors directly with
* cal-heatmap on initialization, or even dynamically change them after.
* All legend settings can be changed dynamically after calendar initialisation, with setLegend().
*/
legendColors?: LegendColor | string[];
// ================================================
// i18n
// ================================================
/**
* Name of the entity you're representing on the calendar.
* Takes an array of string, with the first index as the singular form, and the second index the plural form.
* For the lazy, you can also pass a simple string, ar a single element array, and it'll automatically guess
* the plural form, as long as it's the singular form plus the "s" suffix.
*/
itemName?: string | string[];
/**
* Format of the title displayed when hovering a subDomain.
* Some template strings are available, and enclosed in braces.
* {name} Name of the entity represented in the calendar (see itemName)
* {count} The value associated to the date.
* {date} The date of the cell. It's automatically formatted according to the type of subDomain.
* See subDomainDateFormat to further customize that date formatting.
* {connector} An English preposition placed before a datetime (on Monday, at 15:00, etc.). Each subDomain
* have their own default connector, corresponding to the default date format.
*/
subDomainTitleFormat?: SubDomainFormatTemplates;
/**
* Format of the {date} template string inside subDomainTitleFormat.
* {date} is by default formatted according to the subDomain type.
* subDomainFormat can accept any string with directive accepted by d3.time.format(), like "%Y-%m-%d".
* As d3.time.format() will only output English dates, subDomainDateFormat can also accept a function,
* with the subDomain date as the argument.
*/
subDomainDateFormat?: string | Function;
/**
* Format of the text inside a subDomain cell.
* Disabled by default, you can display a text inside each subDomain cell.
* Works exactly like subDomainDateFormat, except that the function takes the cell value as second argument.
*/
subDomainTextFormat?: string | Function;
/**
* Format of the domain label.
* Works exactly like subDomainDateFormat, and will format the domain label with any string accepted by d3.time.format(), or a function.
* To not display the domain label, set domainLabelFormat to "" (empty string).
*/
domainLabelFormat?: string | Function;
/**
* Formatting of the legend title, displayed when hovering a legend cell.
* Some template strings are available, and enclosed in braces.
* {name} Name of the entity represented in the calendar (see itemName)
* {min} The first value of the legend array.
* {max} The last value of the legend array.
* {down} The lower bound of a color
* {up} The upper bound of a color
*/
legendTitleFormat?: LegendTitleTemplates;
// ================================================
// Other
// ================================================
/** Animation duration, in milliseconds. Default value: 500 */
animationDuration?: number;
/**
* Will attach the previous() event to the specified element, on a mouse click, shifting the calendar one domain back. Default value: false
* If you want to shift by more than one domain, see the previous() method.
*/
previousSelector?: string | HTMLElement;
/**
* Will attach the next() event to the specified element, on a mouse click, shifting the calendar one domain forward. Default value: false
* If you want to shift by more than one domain, see the next() method.
*/
nextSelector?: string | HTMLElement;
/**
* The calendar instance namespace.
* If you have more than one instance of Cal-Heatmap, you should assign each instance its own namespace, in order to isolate each instance event handler.
*/
itemNamespace?: string;
// ================================================
// Events
// ================================================
/** Called after a mouse click event on a subDomain cell. */
onClick?: (date: Date, value: number) => void;
/** Called after drawing the empty calendar, and before filling it with data. */
afterLoad?: () => void;
/**
* Called after shifting the calendar one domain back.
* The date argument is the start date of the domain that was added.
*/
afterLoadPreviousDomain?: (date: Date) => void;
/**
* Called after shifting the calendar one domain forward.
* The date argument is the start date of the domain that was added.
*/
afterLoadNextDomain?: (date: Date) => void;
/**
* Called after drawing and filling the calendar.
* Useful in case you're loading data via ajax, as it's loading data asynchronously. This event will wait for the ajax
* request to complete before triggering.
* This event will only trigger once, on the initial setup. See afterLoadPreviousDomain and afterLoadNextDomain for
* callback events after a domain navigation.
*/
onComplete?: () => void;
/**
* Called after getting the data from source, but before filling the calendar.
* This callback must return a json object formatted in the expected data format.
* afterLoadData() is used to do some works on the data, especially when the data source is not returning data in the expected format.
*/
afterLoadData?: (data: any) => DataFormat;
/**
* Triggered after previous(), when the incoming domain is containing minDate.
* When the leftmost domain set by minDate is loaded into the calendar, onMinDomainReached() will be triggered with true as argument.
* This event is useful if you want to disable your previous button, since there is no more previous domains to load.
* In order to reverse the action, onMinDomainReached() will be called with false as argument afer next(), only once, and only if the
* leftmost domain is not the lower limit domain anymore.
*/
onMinDomainReached?: (reached: boolean) => void;
/**
* Triggered after next(), when the incoming domain is containing maxDate.
* See onMinDomainReached().
*/
onMaxDomainReached?: (reached: boolean) => void;
}
interface RuntimeOptions extends InitOptions
{
/** Margin around each domain, in pixels. Ordered like in CSS (top, right, bottom, left) */
domainMargin: number[];
/** Margin around the legend, in pixels. Ordered like in CSS (top, right, bottom, left) */
legendMargin: number[];
/** List of dates to highlight */
highlight: Date[];
/**
* Name of the items to represent in the calendar.
* First index is singular form, and the second index, the plural form.
*/
itemName: string[];
}
interface LegendTitleTemplates
{
/** Formatting of the smallest (leftmost) value of the legend. Default value: "less than {min} {name}" */
lower?: string;
/** Formatting of all the value but the first and the last. Default value: "between {down} and {up} {name}" */
inner?: string;
/** Formatting of the biggest (rightmost) value of the legend. Default value: "more than {max} {name}" */
upper?: string;
}
interface SubDomainFormatTemplates
{
/** Format of the title when there is no value associated to the date. Default value: "{date}" */
empty?: string;
/** Format of the title when it's associated to a value. Default value: "{count} {name} {connector} {date}" */
filled?: string;
}
interface DataFormat
{
/** timestamp are in seconds, value can be any number (integer or float) */
[timestamp: string]: number;
}
interface LabelOffset
{
x: number;
y: number;
}
/** Position and alignment of the domain label. */
interface Label
{
/**
* Position of the label, relative to the domain. Default: "bottom"
* Valid values: {"top", "right", "bottom", "left"}
*/
position?: string;
/**
* Horizontal align of the domain. Default: "center"
* Valid values: {"left", "center", "right"}
*/
align?: string;
/**
* Rotation for a vertical label. Default: null
* Valid values: {null, "left", "right"}
*/
rotate?: string;
/**
* Only used when label is rotated, defines the width of the label. Default: 100
* Valid values: any intger
*/
width?: number;
/**
* More control about label positioning, if the default value does not fit your need,
* especially when label is rotated, or when using a big font-size. Default: {x:0, y:0}
*/
offset?: LabelOffset;
/**
* Height of the domain label in pixels.
* By leaving it to null, the label will be set to 2 times the height of the subDomain cell.
* If you want to remove the label, set domainLabelFormat to "" (empty string), instead
* of setting the label height to 0. Default: null
* Valid values: any integer
*/
height?: number;
}
}
declare var CalHeatMap: CalHeatMap.CalHeatMapStatic;