@event-calendar/core 2.3.1 → 2.3.2
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/README.md +2 -2
- package/index.js +143 -152
- package/package.json +1 -1
- package/src/Calendar.svelte +19 -26
- package/src/lib/stores.js +1 -29
- package/src/storage/options.js +6 -9
- package/src/storage/state.js +78 -38
- package/src/storage/stores.js +4 -5
package/README.md
CHANGED
|
@@ -196,8 +196,8 @@ import '@event-calendar/core/index.css';
|
|
|
196
196
|
### Pre-built browser ready bundle
|
|
197
197
|
Include the following lines of code in the `<head>` section of your page:
|
|
198
198
|
```html
|
|
199
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@event-calendar/build@2.3.
|
|
200
|
-
<script src="https://cdn.jsdelivr.net/npm/@event-calendar/build@2.3.
|
|
199
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@event-calendar/build@2.3.2/event-calendar.min.css">
|
|
200
|
+
<script src="https://cdn.jsdelivr.net/npm/@event-calendar/build@2.3.2/event-calendar.min.js"></script>
|
|
201
201
|
```
|
|
202
202
|
|
|
203
203
|
<details>
|
package/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { run_all, is_function, noop, identity, tick, SvelteComponent, init, safe_not_equal, ensure_array_like, empty, insert, detach, destroy_each, component_subscribe, set_store_value, element, text, attr, append, listen, set_data, action_destroyer, transition_in, group_outros, check_outros, transition_out, space, create_component, mount_component, destroy_component, construct_svelte_component, set_style, get_current_component } from 'svelte/internal';
|
|
2
2
|
import { getContext, setContext, beforeUpdate } from 'svelte';
|
|
3
|
-
import {
|
|
3
|
+
import { derived, get, writable, readable } from 'svelte/store';
|
|
4
4
|
|
|
5
5
|
function keyEnter(fn) {
|
|
6
6
|
return function (e) {
|
|
@@ -573,34 +573,6 @@ function themeView(view) {
|
|
|
573
573
|
return theme => ({...theme, view});
|
|
574
574
|
}
|
|
575
575
|
|
|
576
|
-
function writable2(value, parser, start) {
|
|
577
|
-
return {
|
|
578
|
-
...writable(value, start),
|
|
579
|
-
parse: parser
|
|
580
|
-
};
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
function derived2(stores, fn, initValue) {
|
|
584
|
-
let storeValue = initValue;
|
|
585
|
-
let hasSubscribers = false;
|
|
586
|
-
let auto = fn.length < 2;
|
|
587
|
-
let fn2 = (_, set) => {
|
|
588
|
-
hasSubscribers = true;
|
|
589
|
-
if (auto) {
|
|
590
|
-
storeValue = fn(_, set);
|
|
591
|
-
set(storeValue);
|
|
592
|
-
} else {
|
|
593
|
-
fn(_, value => {storeValue = value; set(value);});
|
|
594
|
-
}
|
|
595
|
-
return () => {hasSubscribers = false;};
|
|
596
|
-
};
|
|
597
|
-
let store = derived(stores, fn2, storeValue);
|
|
598
|
-
return {
|
|
599
|
-
...store,
|
|
600
|
-
get: () => hasSubscribers ? storeValue : get(store)
|
|
601
|
-
};
|
|
602
|
-
}
|
|
603
|
-
|
|
604
576
|
function intl(locale, format) {
|
|
605
577
|
return derived([locale, format], ([$locale, $format]) => {
|
|
606
578
|
let intl = is_function($format)
|
|
@@ -756,17 +728,14 @@ function createParsers(plugins) {
|
|
|
756
728
|
return parsers;
|
|
757
729
|
}
|
|
758
730
|
|
|
759
|
-
|
|
760
|
-
function diff(options) {
|
|
731
|
+
function diff(options, prevOptions) {
|
|
761
732
|
let diff = [];
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
diff.push([name, options[name]]);
|
|
766
|
-
}
|
|
733
|
+
for (let key of keys(options)) {
|
|
734
|
+
if (options[key] !== prevOptions[key]) {
|
|
735
|
+
diff.push([key, options[key]]);
|
|
767
736
|
}
|
|
768
737
|
}
|
|
769
|
-
|
|
738
|
+
assign(prevOptions, options);
|
|
770
739
|
|
|
771
740
|
return diff;
|
|
772
741
|
}
|
|
@@ -818,7 +787,7 @@ function currentRange(state) {
|
|
|
818
787
|
}
|
|
819
788
|
|
|
820
789
|
function viewDates(state) {
|
|
821
|
-
return
|
|
790
|
+
return derived([state._activeRange, state.hiddenDays], ([$_activeRange, $hiddenDays]) => {
|
|
822
791
|
let dates = [];
|
|
823
792
|
let date = setMidnight(cloneDate($_activeRange.start));
|
|
824
793
|
let end = setMidnight(cloneDate($_activeRange.end));
|
|
@@ -836,7 +805,7 @@ function viewDates(state) {
|
|
|
836
805
|
}
|
|
837
806
|
return date;
|
|
838
807
|
});
|
|
839
|
-
dates = state._viewDates
|
|
808
|
+
dates = get(state._viewDates);
|
|
840
809
|
}
|
|
841
810
|
|
|
842
811
|
return dates;
|
|
@@ -855,7 +824,7 @@ function viewTitle(state) {
|
|
|
855
824
|
}
|
|
856
825
|
|
|
857
826
|
function view(state) {
|
|
858
|
-
return
|
|
827
|
+
return derived([state.view, state._viewTitle, state._currentRange, state._activeRange], args => createView(...args));
|
|
859
828
|
}
|
|
860
829
|
|
|
861
830
|
function events(state) {
|
|
@@ -974,7 +943,7 @@ class State {
|
|
|
974
943
|
|
|
975
944
|
// Create stores for options
|
|
976
945
|
for (let [option, value] of Object.entries(options)) {
|
|
977
|
-
this[option] =
|
|
946
|
+
this[option] = writable(value);
|
|
978
947
|
}
|
|
979
948
|
|
|
980
949
|
// Private stores
|
|
@@ -1006,6 +975,17 @@ class State {
|
|
|
1006
975
|
this._iClasses = writable(identity); // interaction event css classes
|
|
1007
976
|
this._iClass = writable(undefined); // interaction css class for entire calendar
|
|
1008
977
|
|
|
978
|
+
// Set & Get
|
|
979
|
+
this._set = (key, value) => {
|
|
980
|
+
if (validKey(key, this)) {
|
|
981
|
+
if (parsers[key]) {
|
|
982
|
+
value = parsers[key](value);
|
|
983
|
+
}
|
|
984
|
+
this[key].set(value);
|
|
985
|
+
}
|
|
986
|
+
};
|
|
987
|
+
this._get = key => validKey(key, this) ? get(this[key]) : undefined;
|
|
988
|
+
|
|
1009
989
|
// Let plugins create their private stores
|
|
1010
990
|
for (let plugin of plugins) {
|
|
1011
991
|
plugin.createStores?.(this);
|
|
@@ -1019,51 +999,63 @@ class State {
|
|
|
1019
999
|
// Set options for each view
|
|
1020
1000
|
let views = new Set([...keys(options.views), ...keys(input.views ?? {})]);
|
|
1021
1001
|
for (let view of views) {
|
|
1022
|
-
let
|
|
1023
|
-
|
|
1002
|
+
let defOpts = mergeOpts(options, options.views[view] ?? {});
|
|
1003
|
+
let opts = mergeOpts(defOpts, input, input.views?.[view] ?? {});
|
|
1004
|
+
let component = opts.component;
|
|
1005
|
+
// Make sure we deal with valid opts from now on
|
|
1006
|
+
filterOpts(opts, this);
|
|
1007
|
+
// Process options
|
|
1008
|
+
for (let key of keys(opts)) {
|
|
1009
|
+
let {set, _set = set, ...rest} = this[key];
|
|
1010
|
+
|
|
1011
|
+
this[key] = {
|
|
1012
|
+
// Set value in all views
|
|
1013
|
+
set: ['buttonText', 'theme'].includes(key)
|
|
1014
|
+
? value => {
|
|
1015
|
+
if (is_function(value)) {
|
|
1016
|
+
let result = value(defOpts[key]);
|
|
1017
|
+
opts[key] = result;
|
|
1018
|
+
set(set === _set ? result : value);
|
|
1019
|
+
} else {
|
|
1020
|
+
opts[key] = value;
|
|
1021
|
+
set(value);
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
: value => {
|
|
1025
|
+
opts[key] = value;
|
|
1026
|
+
set(value);
|
|
1027
|
+
},
|
|
1028
|
+
_set,
|
|
1029
|
+
...rest
|
|
1030
|
+
};
|
|
1031
|
+
}
|
|
1032
|
+
// When view changes...
|
|
1024
1033
|
this.view.subscribe(newView => {
|
|
1025
1034
|
if (newView === view) {
|
|
1026
|
-
|
|
1035
|
+
// switch view component
|
|
1036
|
+
this._viewComponent.set(component);
|
|
1027
1037
|
if (is_function(opts.viewDidMount)) {
|
|
1028
|
-
tick().then(() => opts.viewDidMount(this._view
|
|
1038
|
+
tick().then(() => opts.viewDidMount(get(this._view)));
|
|
1029
1039
|
}
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
for (let key of keys(opts)) {
|
|
1034
|
-
if (this.hasOwnProperty(key) && key[0] !== '_') {
|
|
1035
|
-
let {set, _set, ...rest} = this[key];
|
|
1036
|
-
|
|
1037
|
-
if (!_set) {
|
|
1038
|
-
// Original set
|
|
1039
|
-
_set = set;
|
|
1040
|
+
// update store values
|
|
1041
|
+
for (let key of keys(opts)) {
|
|
1042
|
+
this[key]._set(opts[key]);
|
|
1040
1043
|
}
|
|
1041
|
-
|
|
1042
|
-
this[key] = {
|
|
1043
|
-
// Set value in all views
|
|
1044
|
-
set: value => {opts[key] = value; set(value);},
|
|
1045
|
-
_set,
|
|
1046
|
-
...rest
|
|
1047
|
-
};
|
|
1048
|
-
|
|
1049
|
-
// Change value when view changes
|
|
1050
|
-
this.view.subscribe(newView => {
|
|
1051
|
-
if (newView === view) {
|
|
1052
|
-
_set(opts[key]);
|
|
1053
|
-
}
|
|
1054
|
-
});
|
|
1055
1044
|
}
|
|
1056
|
-
}
|
|
1045
|
+
});
|
|
1057
1046
|
}
|
|
1058
1047
|
}
|
|
1059
1048
|
}
|
|
1060
1049
|
|
|
1061
1050
|
function parseOpts(opts, parsers) {
|
|
1062
|
-
let result = {};
|
|
1063
|
-
for (let key of keys(
|
|
1064
|
-
|
|
1051
|
+
let result = {...opts};
|
|
1052
|
+
for (let key of keys(parsers)) {
|
|
1053
|
+
if (key in result) {
|
|
1054
|
+
result[key] = parsers[key](result[key]);
|
|
1055
|
+
}
|
|
1065
1056
|
}
|
|
1066
1057
|
if (opts.views) {
|
|
1058
|
+
result.views = {};
|
|
1067
1059
|
for (let view of keys(opts.views)) {
|
|
1068
1060
|
result.views[view] = parseOpts(opts.views[view], parsers);
|
|
1069
1061
|
}
|
|
@@ -1072,16 +1064,33 @@ function parseOpts(opts, parsers) {
|
|
|
1072
1064
|
}
|
|
1073
1065
|
|
|
1074
1066
|
function mergeOpts(...args) {
|
|
1075
|
-
let mergable = ['buttonText', 'theme'];
|
|
1076
1067
|
let result = {};
|
|
1077
1068
|
for (let opts of args) {
|
|
1078
|
-
|
|
1079
|
-
|
|
1069
|
+
let override = {};
|
|
1070
|
+
for (let key of ['buttonText', 'theme']) {
|
|
1071
|
+
if (is_function(opts[key])) {
|
|
1072
|
+
override[key] = opts[key](result[key]);
|
|
1073
|
+
}
|
|
1080
1074
|
}
|
|
1075
|
+
result = {
|
|
1076
|
+
...result,
|
|
1077
|
+
...opts,
|
|
1078
|
+
...override
|
|
1079
|
+
};
|
|
1081
1080
|
}
|
|
1082
1081
|
return result;
|
|
1083
1082
|
}
|
|
1084
1083
|
|
|
1084
|
+
function filterOpts(opts, state) {
|
|
1085
|
+
keys(opts)
|
|
1086
|
+
.filter(key => !validKey(key, state) || key == 'view')
|
|
1087
|
+
.forEach(key => delete opts[key]);
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
function validKey(key, state) {
|
|
1091
|
+
return state.hasOwnProperty(key) && key[0] !== '_';
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1085
1094
|
/* packages/core/src/Buttons.svelte generated by Svelte v4.1.1 */
|
|
1086
1095
|
|
|
1087
1096
|
function get_each_context$2(ctx, list, i) {
|
|
@@ -2182,7 +2191,7 @@ function create_fragment(ctx) {
|
|
|
2182
2191
|
current = true;
|
|
2183
2192
|
|
|
2184
2193
|
if (!mounted) {
|
|
2185
|
-
dispose = listen(window, "resize", /*recheckScrollable*/ ctx[
|
|
2194
|
+
dispose = listen(window, "resize", /*recheckScrollable*/ ctx[14]);
|
|
2186
2195
|
mounted = true;
|
|
2187
2196
|
}
|
|
2188
2197
|
},
|
|
@@ -2253,10 +2262,8 @@ function instance($$self, $$props, $$invalidate) {
|
|
|
2253
2262
|
let $_bodyEl;
|
|
2254
2263
|
let $_scrollable;
|
|
2255
2264
|
let $_queue;
|
|
2256
|
-
let $_events;
|
|
2257
|
-
let $events;
|
|
2258
|
-
let $eventSources;
|
|
2259
2265
|
let $_interaction;
|
|
2266
|
+
let $_events;
|
|
2260
2267
|
let $theme;
|
|
2261
2268
|
let $_iClass;
|
|
2262
2269
|
let $height;
|
|
@@ -2268,34 +2275,25 @@ function instance($$self, $$props, $$invalidate) {
|
|
|
2268
2275
|
setContext('state', state);
|
|
2269
2276
|
let { _viewComponent, _bodyEl, _interaction, _iClass, _events, _queue, _scrollable, events, eventSources, height, theme } = state;
|
|
2270
2277
|
component_subscribe($$self, _viewComponent, value => $$invalidate(4, $_viewComponent = value));
|
|
2271
|
-
component_subscribe($$self, _bodyEl, value => $$invalidate(
|
|
2272
|
-
component_subscribe($$self, _interaction, value => $$invalidate(
|
|
2278
|
+
component_subscribe($$self, _bodyEl, value => $$invalidate(29, $_bodyEl = value));
|
|
2279
|
+
component_subscribe($$self, _interaction, value => $$invalidate(31, $_interaction = value));
|
|
2273
2280
|
component_subscribe($$self, _iClass, value => $$invalidate(2, $_iClass = value));
|
|
2274
|
-
component_subscribe($$self, _events, value => $$invalidate(
|
|
2275
|
-
component_subscribe($$self, _queue, value => $$invalidate(
|
|
2281
|
+
component_subscribe($$self, _events, value => $$invalidate(32, $_events = value));
|
|
2282
|
+
component_subscribe($$self, _queue, value => $$invalidate(30, $_queue = value));
|
|
2276
2283
|
component_subscribe($$self, _scrollable, value => $$invalidate(0, $_scrollable = value));
|
|
2277
|
-
component_subscribe($$self, events, value => $$invalidate(34, $events = value));
|
|
2278
|
-
component_subscribe($$self, eventSources, value => $$invalidate(35, $eventSources = value));
|
|
2279
2284
|
component_subscribe($$self, height, value => $$invalidate(3, $height = value));
|
|
2280
2285
|
component_subscribe($$self, theme, value => $$invalidate(1, $theme = value));
|
|
2281
2286
|
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
if (state[name].parse) {
|
|
2285
|
-
value = state[name].parse(value);
|
|
2286
|
-
}
|
|
2287
|
-
|
|
2288
|
-
state[name].set(value);
|
|
2289
|
-
}
|
|
2287
|
+
// Reactively update options that did change
|
|
2288
|
+
let prevOptions = { ...options };
|
|
2290
2289
|
|
|
2290
|
+
function setOption(name, value) {
|
|
2291
|
+
state._set(name, value);
|
|
2291
2292
|
return this;
|
|
2292
2293
|
}
|
|
2293
2294
|
|
|
2294
2295
|
function getOption(name) {
|
|
2295
|
-
let value = state.
|
|
2296
|
-
? get(state[name])
|
|
2297
|
-
: undefined;
|
|
2298
|
-
|
|
2296
|
+
let value = state._get(name);
|
|
2299
2297
|
return value instanceof Date ? toLocalDate(value) : value;
|
|
2300
2298
|
}
|
|
2301
2299
|
|
|
@@ -2319,32 +2317,36 @@ function instance($$self, $$props, $$invalidate) {
|
|
|
2319
2317
|
}
|
|
2320
2318
|
|
|
2321
2319
|
function addEvent(event) {
|
|
2322
|
-
|
|
2320
|
+
$_events.push(createEvents([event])[0]);
|
|
2321
|
+
_events.set($_events);
|
|
2323
2322
|
return this;
|
|
2324
2323
|
}
|
|
2325
2324
|
|
|
2326
2325
|
function updateEvent(event) {
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
}
|
|
2326
|
+
for (let e of $_events) {
|
|
2327
|
+
if (e.id == event.id) {
|
|
2328
|
+
assign(e, createEvents([event])[0]);
|
|
2329
|
+
_events.set($_events);
|
|
2330
|
+
break;
|
|
2333
2331
|
}
|
|
2334
|
-
|
|
2335
|
-
return events;
|
|
2336
|
-
});
|
|
2332
|
+
}
|
|
2337
2333
|
|
|
2338
2334
|
return this;
|
|
2339
2335
|
}
|
|
2340
2336
|
|
|
2341
2337
|
function removeEventById(id) {
|
|
2342
|
-
|
|
2338
|
+
let idx = $_events.findIndex(event => event.id == id);
|
|
2339
|
+
|
|
2340
|
+
if (idx >= 0) {
|
|
2341
|
+
$_events.splice(idx, 1);
|
|
2342
|
+
_events.set($_events);
|
|
2343
|
+
}
|
|
2344
|
+
|
|
2343
2345
|
return this;
|
|
2344
2346
|
}
|
|
2345
2347
|
|
|
2346
2348
|
function getView() {
|
|
2347
|
-
return toViewWithLocalDates(state._view
|
|
2349
|
+
return toViewWithLocalDates(get(state._view));
|
|
2348
2350
|
}
|
|
2349
2351
|
|
|
2350
2352
|
function unselect() {
|
|
@@ -2364,14 +2366,6 @@ function instance($$self, $$props, $$invalidate) {
|
|
|
2364
2366
|
destroy_component(component, true);
|
|
2365
2367
|
}
|
|
2366
2368
|
|
|
2367
|
-
function updateEvents(func) {
|
|
2368
|
-
set_store_value(_events, $_events = func($_events), $_events);
|
|
2369
|
-
|
|
2370
|
-
if (!$eventSources.length) {
|
|
2371
|
-
set_store_value(events, $events = $_events, $events);
|
|
2372
|
-
}
|
|
2373
|
-
}
|
|
2374
|
-
|
|
2375
2369
|
beforeUpdate(() => {
|
|
2376
2370
|
flushDebounce($_queue);
|
|
2377
2371
|
setTimeout(recheckScrollable);
|
|
@@ -2384,14 +2378,13 @@ function instance($$self, $$props, $$invalidate) {
|
|
|
2384
2378
|
}
|
|
2385
2379
|
|
|
2386
2380
|
$$self.$$set = $$props => {
|
|
2387
|
-
if ('plugins' in $$props) $$invalidate(
|
|
2388
|
-
if ('options' in $$props) $$invalidate(
|
|
2381
|
+
if ('plugins' in $$props) $$invalidate(15, plugins = $$props.plugins);
|
|
2382
|
+
if ('options' in $$props) $$invalidate(16, options = $$props.options);
|
|
2389
2383
|
};
|
|
2390
2384
|
|
|
2391
2385
|
$$self.$$.update = () => {
|
|
2392
|
-
if ($$self.$$.dirty[0] & /*options*/
|
|
2393
|
-
|
|
2394
|
-
for (let [name, value] of diff(options)) {
|
|
2386
|
+
if ($$self.$$.dirty[0] & /*options*/ 65536) {
|
|
2387
|
+
for (let [name, value] of diff(options, prevOptions)) {
|
|
2395
2388
|
setOption(name, value);
|
|
2396
2389
|
}
|
|
2397
2390
|
}
|
|
@@ -2410,8 +2403,6 @@ function instance($$self, $$props, $$invalidate) {
|
|
|
2410
2403
|
_events,
|
|
2411
2404
|
_queue,
|
|
2412
2405
|
_scrollable,
|
|
2413
|
-
events,
|
|
2414
|
-
eventSources,
|
|
2415
2406
|
height,
|
|
2416
2407
|
theme,
|
|
2417
2408
|
recheckScrollable,
|
|
@@ -2443,20 +2434,20 @@ class Calendar extends SvelteComponent {
|
|
|
2443
2434
|
create_fragment,
|
|
2444
2435
|
safe_not_equal,
|
|
2445
2436
|
{
|
|
2446
|
-
plugins:
|
|
2447
|
-
options:
|
|
2448
|
-
setOption:
|
|
2449
|
-
getOption:
|
|
2450
|
-
refetchEvents:
|
|
2451
|
-
getEvents:
|
|
2452
|
-
getEventById:
|
|
2453
|
-
addEvent:
|
|
2454
|
-
updateEvent:
|
|
2455
|
-
removeEventById:
|
|
2456
|
-
getView:
|
|
2457
|
-
unselect:
|
|
2458
|
-
dateFromPoint:
|
|
2459
|
-
destroy:
|
|
2437
|
+
plugins: 15,
|
|
2438
|
+
options: 16,
|
|
2439
|
+
setOption: 17,
|
|
2440
|
+
getOption: 18,
|
|
2441
|
+
refetchEvents: 19,
|
|
2442
|
+
getEvents: 20,
|
|
2443
|
+
getEventById: 21,
|
|
2444
|
+
addEvent: 22,
|
|
2445
|
+
updateEvent: 23,
|
|
2446
|
+
removeEventById: 24,
|
|
2447
|
+
getView: 25,
|
|
2448
|
+
unselect: 26,
|
|
2449
|
+
dateFromPoint: 27,
|
|
2450
|
+
destroy: 28
|
|
2460
2451
|
},
|
|
2461
2452
|
null,
|
|
2462
2453
|
[-1, -1]
|
|
@@ -2464,52 +2455,52 @@ class Calendar extends SvelteComponent {
|
|
|
2464
2455
|
}
|
|
2465
2456
|
|
|
2466
2457
|
get setOption() {
|
|
2467
|
-
return this.$$.ctx[
|
|
2458
|
+
return this.$$.ctx[17];
|
|
2468
2459
|
}
|
|
2469
2460
|
|
|
2470
2461
|
get getOption() {
|
|
2471
|
-
return this.$$.ctx[
|
|
2462
|
+
return this.$$.ctx[18];
|
|
2472
2463
|
}
|
|
2473
2464
|
|
|
2474
2465
|
get refetchEvents() {
|
|
2475
|
-
return this.$$.ctx[
|
|
2466
|
+
return this.$$.ctx[19];
|
|
2476
2467
|
}
|
|
2477
2468
|
|
|
2478
2469
|
get getEvents() {
|
|
2479
|
-
return this.$$.ctx[
|
|
2470
|
+
return this.$$.ctx[20];
|
|
2480
2471
|
}
|
|
2481
2472
|
|
|
2482
2473
|
get getEventById() {
|
|
2483
|
-
return this.$$.ctx[
|
|
2474
|
+
return this.$$.ctx[21];
|
|
2484
2475
|
}
|
|
2485
2476
|
|
|
2486
2477
|
get addEvent() {
|
|
2487
|
-
return this.$$.ctx[
|
|
2478
|
+
return this.$$.ctx[22];
|
|
2488
2479
|
}
|
|
2489
2480
|
|
|
2490
2481
|
get updateEvent() {
|
|
2491
|
-
return this.$$.ctx[
|
|
2482
|
+
return this.$$.ctx[23];
|
|
2492
2483
|
}
|
|
2493
2484
|
|
|
2494
2485
|
get removeEventById() {
|
|
2495
|
-
return this.$$.ctx[
|
|
2486
|
+
return this.$$.ctx[24];
|
|
2496
2487
|
}
|
|
2497
2488
|
|
|
2498
2489
|
get getView() {
|
|
2499
|
-
return this.$$.ctx[
|
|
2490
|
+
return this.$$.ctx[25];
|
|
2500
2491
|
}
|
|
2501
2492
|
|
|
2502
2493
|
get unselect() {
|
|
2503
|
-
return this.$$.ctx[
|
|
2494
|
+
return this.$$.ctx[26];
|
|
2504
2495
|
}
|
|
2505
2496
|
|
|
2506
2497
|
get dateFromPoint() {
|
|
2507
|
-
return this.$$.ctx[
|
|
2498
|
+
return this.$$.ctx[27];
|
|
2508
2499
|
}
|
|
2509
2500
|
|
|
2510
2501
|
get destroy() {
|
|
2511
|
-
return this.$$.ctx[
|
|
2502
|
+
return this.$$.ctx[28];
|
|
2512
2503
|
}
|
|
2513
2504
|
}
|
|
2514
2505
|
|
|
2515
|
-
export { DAY_IN_SECONDS, addDay, addDuration, ancestor, assign, bgEvent, btnTextDay, btnTextMonth, btnTextWeek, btnTextYear, cloneDate, cloneEvent, copyTime, createDate, createDuration, createElement, createEventChunk, createEventClasses, createEventContent, createEventSources, createEvents, createView, datesEqual, debounce, Calendar as default,
|
|
2506
|
+
export { DAY_IN_SECONDS, addDay, addDuration, ancestor, assign, bgEvent, btnTextDay, btnTextMonth, btnTextWeek, btnTextYear, cloneDate, cloneEvent, copyTime, createDate, createDuration, createElement, createEventChunk, createEventClasses, createEventContent, createEventSources, createEvents, createView, datesEqual, debounce, Calendar as default, eventIntersects, floor, flushDebounce, getElementWithPayload, getPayload, ghostEvent, hasPayload, hasYScroll, height, helperEvent, intl, intlRange, keyEnter, keys, max, min, nextClosestDay, noTimePart, outsideEvent, pointerEvent, prepareEventChunks, prevClosestDay, previewEvent, rect, repositionEvent, setContent, setMidnight, setPayload, sortEventChunks, subtractDay, subtractDuration, symbol, themeView, toEventWithLocalDates, toISOString, toLocalDate, toViewWithLocalDates };
|
package/package.json
CHANGED
package/src/Calendar.svelte
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import Auxiliary from './Auxiliary.svelte';
|
|
10
10
|
import {
|
|
11
11
|
assign,
|
|
12
|
+
createEvents,
|
|
12
13
|
toEventWithLocalDates,
|
|
13
14
|
toViewWithLocalDates,
|
|
14
15
|
toLocalDate,
|
|
@@ -30,22 +31,18 @@
|
|
|
30
31
|
events, eventSources, height, theme} = state;
|
|
31
32
|
|
|
32
33
|
// Reactively update options that did change
|
|
33
|
-
|
|
34
|
+
let prevOptions = {...options};
|
|
35
|
+
$: for (let [name, value] of diff(options, prevOptions)) {
|
|
34
36
|
setOption(name, value);
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
export function setOption(name, value) {
|
|
38
|
-
|
|
39
|
-
if (state[name].parse) {
|
|
40
|
-
value = state[name].parse(value);
|
|
41
|
-
}
|
|
42
|
-
state[name].set(value);
|
|
43
|
-
}
|
|
40
|
+
state._set(name, value);
|
|
44
41
|
return this;
|
|
45
42
|
}
|
|
46
43
|
|
|
47
44
|
export function getOption(name) {
|
|
48
|
-
let value = state.
|
|
45
|
+
let value = state._get(name);
|
|
49
46
|
return value instanceof Date ? toLocalDate(value) : value;
|
|
50
47
|
}
|
|
51
48
|
|
|
@@ -68,30 +65,33 @@
|
|
|
68
65
|
}
|
|
69
66
|
|
|
70
67
|
export function addEvent(event) {
|
|
71
|
-
|
|
68
|
+
$_events.push(createEvents([event])[0]);
|
|
69
|
+
$_events = $_events;
|
|
72
70
|
return this;
|
|
73
71
|
}
|
|
74
72
|
|
|
75
73
|
export function updateEvent(event) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
74
|
+
for (let e of $_events) {
|
|
75
|
+
if (e.id == event.id) {
|
|
76
|
+
assign(e, createEvents([event])[0]);
|
|
77
|
+
$_events = $_events;
|
|
78
|
+
break;
|
|
82
79
|
}
|
|
83
|
-
|
|
84
|
-
});
|
|
80
|
+
}
|
|
85
81
|
return this;
|
|
86
82
|
}
|
|
87
83
|
|
|
88
84
|
export function removeEventById(id) {
|
|
89
|
-
|
|
85
|
+
let idx = $_events.findIndex(event => event.id == id);
|
|
86
|
+
if (idx >= 0) {
|
|
87
|
+
$_events.splice(idx, 1);
|
|
88
|
+
$_events = $_events;
|
|
89
|
+
}
|
|
90
90
|
return this;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
export function getView() {
|
|
94
|
-
return toViewWithLocalDates(state._view
|
|
94
|
+
return toViewWithLocalDates(get(state._view));
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
export function unselect() {
|
|
@@ -110,13 +110,6 @@
|
|
|
110
110
|
destroy_component(component, true);
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
function updateEvents(func) {
|
|
114
|
-
$_events = func($_events);
|
|
115
|
-
if (!$eventSources.length) {
|
|
116
|
-
$events = $_events;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
113
|
beforeUpdate(() => {
|
|
121
114
|
flushDebounce($_queue);
|
|
122
115
|
setTimeout(recheckScrollable);
|
package/src/lib/stores.js
CHANGED
|
@@ -1,35 +1,7 @@
|
|
|
1
|
-
import {derived
|
|
1
|
+
import {derived} from 'svelte/store';
|
|
2
2
|
import {is_function} from 'svelte/internal';
|
|
3
3
|
import {toLocalDate} from './date';
|
|
4
4
|
|
|
5
|
-
export function writable2(value, parser, start) {
|
|
6
|
-
return {
|
|
7
|
-
...writable(value, start),
|
|
8
|
-
parse: parser
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function derived2(stores, fn, initValue) {
|
|
13
|
-
let storeValue = initValue;
|
|
14
|
-
let hasSubscribers = false;
|
|
15
|
-
let auto = fn.length < 2;
|
|
16
|
-
let fn2 = (_, set) => {
|
|
17
|
-
hasSubscribers = true;
|
|
18
|
-
if (auto) {
|
|
19
|
-
storeValue = fn(_, set);
|
|
20
|
-
set(storeValue);
|
|
21
|
-
} else {
|
|
22
|
-
fn(_, value => {storeValue = value; set(value);});
|
|
23
|
-
}
|
|
24
|
-
return () => {hasSubscribers = false;};
|
|
25
|
-
};
|
|
26
|
-
let store = derived(stores, fn2, storeValue);
|
|
27
|
-
return {
|
|
28
|
-
...store,
|
|
29
|
-
get: () => hasSubscribers ? storeValue : get(store)
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
|
|
33
5
|
export function intl(locale, format) {
|
|
34
6
|
return derived([locale, format], ([$locale, $format]) => {
|
|
35
7
|
let intl = is_function($format)
|
package/src/storage/options.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {assign, createDate, createDuration, setMidnight, createEvents, createEventSources} from '../lib.js';
|
|
1
|
+
import {assign, createDate, createDuration, keys, setMidnight, createEvents, createEventSources} from '../lib.js';
|
|
2
2
|
|
|
3
3
|
export function createOptions(plugins) {
|
|
4
4
|
let options = {
|
|
@@ -133,17 +133,14 @@ export function createParsers(plugins) {
|
|
|
133
133
|
return parsers;
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
|
|
137
|
-
export function diff(options) {
|
|
136
|
+
export function diff(options, prevOptions) {
|
|
138
137
|
let diff = [];
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
diff.push([name, options[name]]);
|
|
143
|
-
}
|
|
138
|
+
for (let key of keys(options)) {
|
|
139
|
+
if (options[key] !== prevOptions[key]) {
|
|
140
|
+
diff.push([key, options[key]]);
|
|
144
141
|
}
|
|
145
142
|
}
|
|
146
|
-
|
|
143
|
+
assign(prevOptions, options);
|
|
147
144
|
|
|
148
145
|
return diff;
|
|
149
146
|
}
|
package/src/storage/state.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {writable} from 'svelte/store';
|
|
1
|
+
import {get, writable} from 'svelte/store';
|
|
2
2
|
import {is_function, tick, noop, identity} from 'svelte/internal';
|
|
3
3
|
import {createOptions, createParsers} from './options';
|
|
4
4
|
import {
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
viewTitle,
|
|
13
13
|
view as view2 // hack to avoid a runtime error in SvelteKit dev mode (ReferenceError: view is not defined)
|
|
14
14
|
} from './stores';
|
|
15
|
-
import {keys,
|
|
15
|
+
import {keys, intl, intlRange} from '../lib.js';
|
|
16
16
|
|
|
17
17
|
export default class {
|
|
18
18
|
constructor(plugins, input) {
|
|
@@ -28,7 +28,7 @@ export default class {
|
|
|
28
28
|
|
|
29
29
|
// Create stores for options
|
|
30
30
|
for (let [option, value] of Object.entries(options)) {
|
|
31
|
-
this[option] =
|
|
31
|
+
this[option] = writable(value);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
// Private stores
|
|
@@ -60,6 +60,17 @@ export default class {
|
|
|
60
60
|
this._iClasses = writable(identity); // interaction event css classes
|
|
61
61
|
this._iClass = writable(undefined); // interaction css class for entire calendar
|
|
62
62
|
|
|
63
|
+
// Set & Get
|
|
64
|
+
this._set = (key, value) => {
|
|
65
|
+
if (validKey(key, this)) {
|
|
66
|
+
if (parsers[key]) {
|
|
67
|
+
value = parsers[key](value);
|
|
68
|
+
}
|
|
69
|
+
this[key].set(value);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
this._get = key => validKey(key, this) ? get(this[key]) : undefined;
|
|
73
|
+
|
|
63
74
|
// Let plugins create their private stores
|
|
64
75
|
for (let plugin of plugins) {
|
|
65
76
|
plugin.createStores?.(this);
|
|
@@ -73,51 +84,63 @@ export default class {
|
|
|
73
84
|
// Set options for each view
|
|
74
85
|
let views = new Set([...keys(options.views), ...keys(input.views ?? {})]);
|
|
75
86
|
for (let view of views) {
|
|
76
|
-
let
|
|
77
|
-
|
|
87
|
+
let defOpts = mergeOpts(options, options.views[view] ?? {});
|
|
88
|
+
let opts = mergeOpts(defOpts, input, input.views?.[view] ?? {});
|
|
89
|
+
let component = opts.component;
|
|
90
|
+
// Make sure we deal with valid opts from now on
|
|
91
|
+
filterOpts(opts, this);
|
|
92
|
+
// Process options
|
|
93
|
+
for (let key of keys(opts)) {
|
|
94
|
+
let {set, _set = set, ...rest} = this[key];
|
|
95
|
+
|
|
96
|
+
this[key] = {
|
|
97
|
+
// Set value in all views
|
|
98
|
+
set: ['buttonText', 'theme'].includes(key)
|
|
99
|
+
? value => {
|
|
100
|
+
if (is_function(value)) {
|
|
101
|
+
let result = value(defOpts[key]);
|
|
102
|
+
opts[key] = result;
|
|
103
|
+
set(set === _set ? result : value);
|
|
104
|
+
} else {
|
|
105
|
+
opts[key] = value;
|
|
106
|
+
set(value);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
: value => {
|
|
110
|
+
opts[key] = value;
|
|
111
|
+
set(value);
|
|
112
|
+
},
|
|
113
|
+
_set,
|
|
114
|
+
...rest
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// When view changes...
|
|
78
118
|
this.view.subscribe(newView => {
|
|
79
119
|
if (newView === view) {
|
|
80
|
-
|
|
120
|
+
// switch view component
|
|
121
|
+
this._viewComponent.set(component);
|
|
81
122
|
if (is_function(opts.viewDidMount)) {
|
|
82
|
-
tick().then(() => opts.viewDidMount(this._view
|
|
123
|
+
tick().then(() => opts.viewDidMount(get(this._view)));
|
|
83
124
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
for (let key of keys(opts)) {
|
|
88
|
-
if (this.hasOwnProperty(key) && key[0] !== '_') {
|
|
89
|
-
let {set, _set, ...rest} = this[key];
|
|
90
|
-
|
|
91
|
-
if (!_set) {
|
|
92
|
-
// Original set
|
|
93
|
-
_set = set;
|
|
125
|
+
// update store values
|
|
126
|
+
for (let key of keys(opts)) {
|
|
127
|
+
this[key]._set(opts[key]);
|
|
94
128
|
}
|
|
95
|
-
|
|
96
|
-
this[key] = {
|
|
97
|
-
// Set value in all views
|
|
98
|
-
set: value => {opts[key] = value; set(value);},
|
|
99
|
-
_set,
|
|
100
|
-
...rest
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
// Change value when view changes
|
|
104
|
-
this.view.subscribe(newView => {
|
|
105
|
-
if (newView === view) {
|
|
106
|
-
_set(opts[key]);
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
129
|
}
|
|
110
|
-
}
|
|
130
|
+
});
|
|
111
131
|
}
|
|
112
132
|
}
|
|
113
133
|
}
|
|
114
134
|
|
|
115
135
|
function parseOpts(opts, parsers) {
|
|
116
|
-
let result = {};
|
|
117
|
-
for (let key of keys(
|
|
118
|
-
|
|
136
|
+
let result = {...opts};
|
|
137
|
+
for (let key of keys(parsers)) {
|
|
138
|
+
if (key in result) {
|
|
139
|
+
result[key] = parsers[key](result[key]);
|
|
140
|
+
}
|
|
119
141
|
}
|
|
120
142
|
if (opts.views) {
|
|
143
|
+
result.views = {};
|
|
121
144
|
for (let view of keys(opts.views)) {
|
|
122
145
|
result.views[view] = parseOpts(opts.views[view], parsers);
|
|
123
146
|
}
|
|
@@ -126,12 +149,29 @@ function parseOpts(opts, parsers) {
|
|
|
126
149
|
}
|
|
127
150
|
|
|
128
151
|
function mergeOpts(...args) {
|
|
129
|
-
let mergable = ['buttonText', 'theme'];
|
|
130
152
|
let result = {};
|
|
131
153
|
for (let opts of args) {
|
|
132
|
-
|
|
133
|
-
|
|
154
|
+
let override = {};
|
|
155
|
+
for (let key of ['buttonText', 'theme']) {
|
|
156
|
+
if (is_function(opts[key])) {
|
|
157
|
+
override[key] = opts[key](result[key]);
|
|
158
|
+
}
|
|
134
159
|
}
|
|
160
|
+
result = {
|
|
161
|
+
...result,
|
|
162
|
+
...opts,
|
|
163
|
+
...override
|
|
164
|
+
};
|
|
135
165
|
}
|
|
136
166
|
return result;
|
|
137
167
|
}
|
|
168
|
+
|
|
169
|
+
function filterOpts(opts, state) {
|
|
170
|
+
keys(opts)
|
|
171
|
+
.filter(key => !validKey(key, state) || key == 'view')
|
|
172
|
+
.forEach(key => delete opts[key]);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function validKey(key, state) {
|
|
176
|
+
return state.hasOwnProperty(key) && key[0] !== '_';
|
|
177
|
+
}
|
package/src/storage/stores.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {derived, writable, readable} from 'svelte/store';
|
|
1
|
+
import {derived, writable, readable, get} from 'svelte/store';
|
|
2
2
|
import {is_function} from 'svelte/internal';
|
|
3
3
|
import {
|
|
4
4
|
DAY_IN_SECONDS,
|
|
@@ -9,7 +9,6 @@ import {
|
|
|
9
9
|
createView,
|
|
10
10
|
addDuration,
|
|
11
11
|
addDay,
|
|
12
|
-
derived2,
|
|
13
12
|
subtractDay,
|
|
14
13
|
toISOString,
|
|
15
14
|
nextClosestDay,
|
|
@@ -66,7 +65,7 @@ export function currentRange(state) {
|
|
|
66
65
|
}
|
|
67
66
|
|
|
68
67
|
export function viewDates(state) {
|
|
69
|
-
return
|
|
68
|
+
return derived([state._activeRange, state.hiddenDays], ([$_activeRange, $hiddenDays]) => {
|
|
70
69
|
let dates = [];
|
|
71
70
|
let date = setMidnight(cloneDate($_activeRange.start));
|
|
72
71
|
let end = setMidnight(cloneDate($_activeRange.end));
|
|
@@ -84,7 +83,7 @@ export function viewDates(state) {
|
|
|
84
83
|
}
|
|
85
84
|
return date;
|
|
86
85
|
});
|
|
87
|
-
dates = state._viewDates
|
|
86
|
+
dates = get(state._viewDates);
|
|
88
87
|
}
|
|
89
88
|
|
|
90
89
|
return dates;
|
|
@@ -103,7 +102,7 @@ export function viewTitle(state) {
|
|
|
103
102
|
}
|
|
104
103
|
|
|
105
104
|
export function view(state) {
|
|
106
|
-
return
|
|
105
|
+
return derived([state.view, state._viewTitle, state._currentRange, state._activeRange], args => createView(...args));
|
|
107
106
|
}
|
|
108
107
|
|
|
109
108
|
export function events(state) {
|