@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 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.1/event-calendar.min.css">
200
- <script src="https://cdn.jsdelivr.net/npm/@event-calendar/build@2.3.1/event-calendar.min.js"></script>
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 { writable, derived, get, readable } from 'svelte/store';
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
- let prev;
760
- function diff(options) {
731
+ function diff(options, prevOptions) {
761
732
  let diff = [];
762
- if (prev) {
763
- for (let name of Object.keys(options)) {
764
- if (options[name] !== prev[name]) {
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
- prev = assign({}, options);
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 derived2([state._activeRange, state.hiddenDays], ([$_activeRange, $hiddenDays]) => {
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.get();
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 derived2([state.view, state._viewTitle, state._currentRange, state._activeRange], args => createView(...args));
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] = writable2(value, parsers[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 opts = mergeOpts(options, options.views[view] ?? {}, input, input.views?.[view] ?? {});
1023
- // Change view component when view changes
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
- this._viewComponent.set(opts.component);
1035
+ // switch view component
1036
+ this._viewComponent.set(component);
1027
1037
  if (is_function(opts.viewDidMount)) {
1028
- tick().then(() => opts.viewDidMount(this._view.get()));
1038
+ tick().then(() => opts.viewDidMount(get(this._view)));
1029
1039
  }
1030
- }
1031
- });
1032
- // Process options
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(opts)) {
1064
- result[key] = parsers[key] ? parsers[key](opts[key]) : opts[key];
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
- for (let key of keys(opts)) {
1079
- result[key] = mergable.includes(key) && is_function(opts[key]) ? opts[key](result[key]) : opts[key];
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[16]);
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(31, $_bodyEl = value));
2272
- component_subscribe($$self, _interaction, value => $$invalidate(36, $_interaction = value));
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(33, $_events = value));
2275
- component_subscribe($$self, _queue, value => $$invalidate(32, $_queue = value));
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
- function setOption(name, value) {
2283
- if (state.hasOwnProperty(name)) {
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.hasOwnProperty(name)
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
- updateEvents(events => events.concat(state.events.parse([event])));
2320
+ $_events.push(createEvents([event])[0]);
2321
+ _events.set($_events);
2323
2322
  return this;
2324
2323
  }
2325
2324
 
2326
2325
  function updateEvent(event) {
2327
- updateEvents(events => {
2328
- for (let e of events) {
2329
- if (e.id == event.id) {
2330
- assign(e, state.events.parse([event])[0]);
2331
- break;
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
- updateEvents(events => events.filter(event => event.id != id));
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.get());
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(17, plugins = $$props.plugins);
2388
- if ('options' in $$props) $$invalidate(18, options = $$props.options);
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*/ 262144) {
2393
- // Reactively update options that did change
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: 17,
2447
- options: 18,
2448
- setOption: 19,
2449
- getOption: 20,
2450
- refetchEvents: 21,
2451
- getEvents: 22,
2452
- getEventById: 23,
2453
- addEvent: 24,
2454
- updateEvent: 25,
2455
- removeEventById: 26,
2456
- getView: 27,
2457
- unselect: 28,
2458
- dateFromPoint: 29,
2459
- destroy: 30
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[19];
2458
+ return this.$$.ctx[17];
2468
2459
  }
2469
2460
 
2470
2461
  get getOption() {
2471
- return this.$$.ctx[20];
2462
+ return this.$$.ctx[18];
2472
2463
  }
2473
2464
 
2474
2465
  get refetchEvents() {
2475
- return this.$$.ctx[21];
2466
+ return this.$$.ctx[19];
2476
2467
  }
2477
2468
 
2478
2469
  get getEvents() {
2479
- return this.$$.ctx[22];
2470
+ return this.$$.ctx[20];
2480
2471
  }
2481
2472
 
2482
2473
  get getEventById() {
2483
- return this.$$.ctx[23];
2474
+ return this.$$.ctx[21];
2484
2475
  }
2485
2476
 
2486
2477
  get addEvent() {
2487
- return this.$$.ctx[24];
2478
+ return this.$$.ctx[22];
2488
2479
  }
2489
2480
 
2490
2481
  get updateEvent() {
2491
- return this.$$.ctx[25];
2482
+ return this.$$.ctx[23];
2492
2483
  }
2493
2484
 
2494
2485
  get removeEventById() {
2495
- return this.$$.ctx[26];
2486
+ return this.$$.ctx[24];
2496
2487
  }
2497
2488
 
2498
2489
  get getView() {
2499
- return this.$$.ctx[27];
2490
+ return this.$$.ctx[25];
2500
2491
  }
2501
2492
 
2502
2493
  get unselect() {
2503
- return this.$$.ctx[28];
2494
+ return this.$$.ctx[26];
2504
2495
  }
2505
2496
 
2506
2497
  get dateFromPoint() {
2507
- return this.$$.ctx[29];
2498
+ return this.$$.ctx[27];
2508
2499
  }
2509
2500
 
2510
2501
  get destroy() {
2511
- return this.$$.ctx[30];
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, derived2, 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, writable2 };
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@event-calendar/core",
3
- "version": "2.3.1",
3
+ "version": "2.3.2",
4
4
  "title": "Event Calendar Core package",
5
5
  "description": "Full-sized drag & drop event calendar with resource view",
6
6
  "keywords": [
@@ -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
- $: for (let [name, value] of diff(options)) {
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
- if (state.hasOwnProperty(name)) {
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.hasOwnProperty(name) ? get(state[name]) : undefined;
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
- updateEvents(events => events.concat(state.events.parse([event])));
68
+ $_events.push(createEvents([event])[0]);
69
+ $_events = $_events;
72
70
  return this;
73
71
  }
74
72
 
75
73
  export function updateEvent(event) {
76
- updateEvents(events => {
77
- for (let e of events) {
78
- if (e.id == event.id) {
79
- assign(e, state.events.parse([event])[0]);
80
- break;
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
- return events;
84
- });
80
+ }
85
81
  return this;
86
82
  }
87
83
 
88
84
  export function removeEventById(id) {
89
- updateEvents(events => events.filter(event => event.id != id));
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.get());
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, writable, get} from 'svelte/store';
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)
@@ -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
- let prev;
137
- export function diff(options) {
136
+ export function diff(options, prevOptions) {
138
137
  let diff = [];
139
- if (prev) {
140
- for (let name of Object.keys(options)) {
141
- if (options[name] !== prev[name]) {
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
- prev = assign({}, options);
143
+ assign(prevOptions, options);
147
144
 
148
145
  return diff;
149
146
  }
@@ -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, writable2, intl, intlRange} from '../lib.js';
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] = writable2(value, parsers[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 opts = mergeOpts(options, options.views[view] ?? {}, input, input.views?.[view] ?? {});
77
- // Change view component when view changes
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
- this._viewComponent.set(opts.component);
120
+ // switch view component
121
+ this._viewComponent.set(component);
81
122
  if (is_function(opts.viewDidMount)) {
82
- tick().then(() => opts.viewDidMount(this._view.get()));
123
+ tick().then(() => opts.viewDidMount(get(this._view)));
83
124
  }
84
- }
85
- });
86
- // Process options
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(opts)) {
118
- result[key] = parsers[key] ? parsers[key](opts[key]) : opts[key];
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
- for (let key of keys(opts)) {
133
- result[key] = mergable.includes(key) && is_function(opts[key]) ? opts[key](result[key]) : opts[key];
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
+ }
@@ -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 derived2([state._activeRange, state.hiddenDays], ([$_activeRange, $hiddenDays]) => {
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.get();
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 derived2([state.view, state._viewTitle, state._currentRange, state._activeRange], args => createView(...args));
105
+ return derived([state.view, state._viewTitle, state._currentRange, state._activeRange], args => createView(...args));
107
106
  }
108
107
 
109
108
  export function events(state) {