|
4 | 4 | startOfDay, |
5 | 5 | startOfHour, |
6 | 6 | startOfMonth, |
7 | | - startOfWeek, |
8 | | - startOfYear |
| 7 | + startOfISOWeek, |
| 8 | + startOfYear, |
| 9 | + sub, |
| 10 | + isLeapYear |
9 | 11 | } from 'date-fns'; |
| 12 | + import Dot from '../components/dot.svelte'; |
10 | 13 | import { browser } from '$app/environment'; |
11 | 14 |
|
12 | 15 | function changeBg() { |
|
25 | 28 | year: 365 * 24 * 60 * 60 // non-leap year |
26 | 29 | }; |
27 | 30 |
|
| 31 | + let daysInMonth = $state([ |
| 32 | + 31, |
| 33 | + isLeapYear(new Date()) ? 29 : 28, |
| 34 | + 31, |
| 35 | + 30, |
| 36 | + 31, |
| 37 | + 30, |
| 38 | + 31, |
| 39 | + 31, |
| 40 | + 30, |
| 41 | + 31, |
| 42 | + 30, |
| 43 | + 31 |
| 44 | + ]); |
| 45 | + setInterval( |
| 46 | + () => { |
| 47 | + daysInMonth[1] = isLeapYear(new Date()) ? 29 : 28; |
| 48 | + }, |
| 49 | + 1000 * 60 * 60 * 24 |
| 50 | + ); |
| 51 | +
|
28 | 52 | let dots = $derived.by(() => { |
29 | 53 | const secondsInUnit = secondsPer[unit]; |
30 | 54 | const secondsInRange = secondsPer[timerange]; |
|
57 | 81 | } else if (timerange == 'day') { |
58 | 82 | start = startOfDay(date); |
59 | 83 | } else if (timerange == 'week') { |
60 | | - start = startOfWeek(date); |
| 84 | + start = startOfISOWeek(date); |
61 | 85 | } else if (timerange == 'month') { |
62 | | - start = startOfMonth(date); |
| 86 | + start = sub(startOfMonth(date), { days: 1 }); |
63 | 87 | } else if (timerange == 'year') { |
64 | | - start = startOfYear(date); |
| 88 | + start = sub(startOfYear(date), { days: 1 }); |
65 | 89 | } |
66 | 90 | let diff = differenceInSeconds(date, start); |
67 | 91 | nowDots = Math.floor(diff / secondsPer[unit]); |
|
75 | 99 | } |
76 | 100 | }); |
77 | 101 |
|
| 102 | + function calcAmountOfDots(row, dot) { |
| 103 | + let dots = 0; |
| 104 | + for (const i of Array.from(Array(row).keys())) { |
| 105 | + dots += daysInMonth[i]; |
| 106 | + } |
| 107 | + dots += dot + 1; |
| 108 | + return dots; |
| 109 | + } |
| 110 | +
|
78 | 111 | let rows = $derived(Math.ceil(dots / cols)); |
79 | 112 | let lastRow = $derived(dots % cols); |
80 | 113 | $inspect(nowDots); |
81 | 114 | </script> |
82 | 115 |
|
83 | | -<div class="bg-bg h-screen w-screen p-50"> |
| 116 | +{#snippet grid()} |
84 | 117 | <div class="flex flex-col gap-1"> |
85 | 118 | {#each rows != Infinity ? { length: rows } : { length: 1 }, row} |
86 | 119 | <div class="flex flex-row gap-1"> |
87 | 120 | {#each cols != null ? { length: cols } : { length: 1 }, dot} |
88 | 121 | {#if lastRow == 0} |
89 | | - {#if row * cols + dot + 1 <= nowDots} |
90 | | - <div class="bg-primary dot size-6 rounded-full"></div> |
91 | | - {:else} |
92 | | - <div class="bg-inactive dot size-6 rounded-full"></div> |
93 | | - {/if} |
| 122 | + <Dot dotNum={row * cols + dot + 1} {nowDots} /> |
94 | 123 | {:else if dot + 1 <= lastRow || row + 1 != rows} |
95 | | - {#if row * cols + dot + 1 <= nowDots} |
96 | | - <div class="bg-primary dot size-6 rounded-full"></div> |
97 | | - {:else} |
98 | | - <div class="bg-inactive dot size-6 rounded-full"></div> |
99 | | - {/if} |
| 124 | + <Dot dotNum={row * cols + dot + 1} {nowDots} /> |
100 | 125 | {/if} |
101 | 126 | {/each} |
102 | 127 | </div> |
103 | 128 | {/each} |
104 | 129 | </div> |
| 130 | +{/snippet} |
| 131 | + |
| 132 | +<div class="bg-bg h-screen w-screen p-50"> |
| 133 | + {#if timerange === 'year' && colsName === 'month'} |
| 134 | + <div class="flex flex-col gap-1"> |
| 135 | + {#each { length: 12 }, row} |
| 136 | + <div class="flex flex-row gap-1"> |
| 137 | + {#each { length: daysInMonth[row] }, dot} |
| 138 | + <Dot dotNum={calcAmountOfDots(row, dot)} {nowDots} /> |
| 139 | + {/each} |
| 140 | + </div> |
| 141 | + {/each} |
| 142 | + </div> |
| 143 | + {:else} |
| 144 | + {@render grid()} |
| 145 | + {/if} |
105 | 146 |
|
106 | 147 | <br /> |
107 | 148 |
|
|
0 commit comments