Skip to content

Commit efa866a

Browse files
committed
28 Sep 2023
1 parent 9f7f9e1 commit efa866a

File tree

5 files changed

+40
-25
lines changed

5 files changed

+40
-25
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
## JS EVENTS CALENDAR PWA
2-
This is an events calendar made with pure HTML, CSS, JS, and web assembly to support SQLite. It is a tutorial/project/experiment to showcase the capabilities of modern web apps and Progressive Web App (PWA) - Yes, this is installable and serverless. Capable of running completely offline.
1+
## JAVASCRIPT EVENTS CALENDAR PWA
2+
This is an events calendar made with pure HTML, CSS, JS, and web assembly to support SQLite. It is a tutorial/project/experiment to showcase the capabilities of modern Progressive Web App (PWA) - Yes, this is installable and serverless. Capable of running completely offline.
33
<br><br>
44

55
## :camera: SCREENSHOTS

assets/head-pwa-calendar.webp

-8.84 KB
Binary file not shown.

assets/js-cal-3.png

-4.11 KB
Loading

assets/js-calendar.js

+34-23
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ var cal = {
8484
// (C3) ATTACH CONTROLS
8585
cal.hMth.onchange = cal.load;
8686
cal.hYear.onchange = cal.load;
87+
document.getElementById("calToday").onclick = () => cal.today();
8788
document.getElementById("calBack").onclick = () => cal.pshift();
8889
document.getElementById("calNext").onclick = () => cal.pshift(1);
8990
document.getElementById("calAdd").onclick = () => cal.show();
@@ -117,9 +118,19 @@ var cal = {
117118
cal.load();
118119
},
119120

120-
// (E) LOAD EVENTS DATA FOR MONTH/YEAR
121+
// (E) JUMP TO TODAY
122+
today : () => {
123+
let now = new Date(), ny = now.getFullYear(), nm = now.getMonth()+1;
124+
if (ny!=cal.sYear || (ny==cal.sYear && nm!=cal.sMth)) {
125+
cal.hMth.value = nm;
126+
cal.hYear.value = ny;
127+
cal.load();
128+
}
129+
},
130+
131+
// (F) LOAD EVENTS DATA FOR MONTH/YEAR
121132
load : () => {
122-
// (E1) SET SELECTED PERIOD
133+
// (F1) SET SELECTED PERIOD
123134
cal.sMth = +cal.hMth.value;
124135
cal.sYear = +cal.hYear.value;
125136
cal.sDIM = new Date(cal.sYear, cal.sMth, 0).getDate();
@@ -130,27 +141,27 @@ var cal = {
130141
cal.sF = `${cal.sYear}-${m}-01 00:00:00`;
131142
cal.sL = `${cal.sYear}-${m}-${cal.sDIM} 23:59:59`;
132143

133-
// (E2) FETCH & DRAW
144+
// (F2) FETCH & DRAW
134145
cal.events = calDB.getPeriod(cal.sF, cal.sL);
135146
cal.hCB.innerHTML = "";
136147
cal.draw();
137148
},
138149

139-
// (F) DRAW CALENDAR
150+
// (G) DRAW CALENDAR
140151
draw : () => {
141-
// (F1) CALCULATE DAY MONTH YEAR
152+
// (G1) CALCULATE DAY MONTH YEAR
142153
// note - jan is 0 & dec is 11 in js
143154
// note - sun is 0 & sat is 6 in js
144155
let now = new Date(), // current date
145156
nowMth = now.getMonth()+1, // current month
146157
nowYear = parseInt(now.getFullYear()), // current year
147158
nowDay = cal.sMth==nowMth && cal.sYear==nowYear ? now.getDate() : null ;
148159

149-
// (F2) DRAW CALENDAR ROWS & CELLS
150-
// (F2-1) INIT
160+
// (G2) DRAW CALENDAR ROWS & CELLS
161+
// (G2-1) INIT
151162
let rowA, rowB, rowC, rowMap = {}, rowNum = 1, cell, cellNum = 1,
152163

153-
// (F2-2) HELPER - DRAW A NEW ROW
164+
// (G2-2) HELPER - DRAW A NEW ROW
154165
rower = () => {
155166
rowA = document.createElement("div");
156167
rowB = document.createElement("div");
@@ -164,7 +175,7 @@ var cal = {
164175
rowA.appendChild(rowC);
165176
},
166177

167-
// (F2-3) HELPER - DRAW A NEW CELL
178+
// (G2-3) HELPER - DRAW A NEW CELL
168179
celler = day => {
169180
cell = document.createElement("div");
170181
cell.className = "calCell";
@@ -187,10 +198,10 @@ var cal = {
187198
rowC.appendChild(cell);
188199
};
189200

190-
// (F2-4) RESET CALENDAR
201+
// (G2-4) RESET CALENDAR
191202
cal.hCB.innerHTML = ""; rower();
192203

193-
// (F2-5) BLANK CELLS BEFORE START OF MONTH
204+
// (G2-5) BLANK CELLS BEFORE START OF MONTH
194205
if (cal.mon && cal.sFD != 1) {
195206
let blanks = cal.sFD==0 ? 7 : cal.sFD ;
196207
for (let i=1; i<blanks; i++) { celler(); cellNum++; }
@@ -199,15 +210,15 @@ var cal = {
199210
for (let i=0; i<cal.sFD; i++) { celler(); cellNum++; }
200211
}
201212

202-
// (F2-6) DAYS OF THE MONTH
213+
// (G2-6) DAYS OF THE MONTH
203214
for (let i=1; i<=cal.sDIM; i++) {
204215
rowMap[i] = { r : rowNum, c : cellNum };
205216
celler(i);
206217
if (cellNum%7==0 && i!=cal.sDIM) { rowNum++; rower(); }
207218
cellNum++;
208219
}
209220

210-
// (F2-7) BLANK CELLS AFTER END OF MONTH
221+
// (G2-7) BLANK CELLS AFTER END OF MONTH
211222
if (cal.mon && cal.sLD != 0) {
212223
let blanks = cal.sLD==6 ? 1 : 7-cal.sLD;
213224
for (let i=0; i<blanks; i++) { celler(); cellNum++; }
@@ -217,17 +228,17 @@ var cal = {
217228
for (let i=0; i<blanks; i++) { celler(); cellNum++; }
218229
}
219230

220-
// (F3) DRAW EVENTS
231+
// (G3) DRAW EVENTS
221232
if (Object.keys(cal.events).length > 0) { for (let [id,evt] of Object.entries(cal.events)) {
222-
// (F3-1) EVENT START & END DAY
233+
// (G3-1) EVENT START & END DAY
223234
let sd = new Date(evt.s),
224235
ed = new Date(evt.e);
225236
if (sd.getFullYear() < cal.sYear) { sd = 1; }
226237
else { sd = sd.getMonth()+1 < cal.sMth ? 1 : sd.getDate(); }
227238
if (ed.getFullYear() > cal.sYear) { ed = cal.sDIM; }
228239
else { ed = ed.getMonth()+1 > cal.sMth ? cal.sDIM : ed.getDate(); }
229240

230-
// (F3-2) "MAP" ONTO HTML CALENDAR
241+
// (G3-2) "MAP" ONTO HTML CALENDAR
231242
cell = {}; rowNum = 0;
232243
for (let i=sd; i<=ed; i++) {
233244
if (rowNum!=rowMap[i]["r"]) {
@@ -237,7 +248,7 @@ var cal = {
237248
if (cell[rowNum]) { cell[rowNum]["e"] = rowMap[i]["c"]; }
238249
}
239250

240-
// (F3-3) DRAW HTML EVENT ROW
251+
// (G3-3) DRAW HTML EVENT ROW
241252
for (let [r,c] of Object.entries(cell)) {
242253
let o = c.s - 1 - ((r-1) * 7), // event cell offset
243254
w = c.e - c.s + 1; // event cell width
@@ -255,7 +266,7 @@ var cal = {
255266
}}
256267
},
257268

258-
// (G) SHOW EVENT FORM
269+
// (H) SHOW EVENT FORM
259270
show : id => {
260271
if (id) {
261272
cal.hfID.value = id;
@@ -273,9 +284,9 @@ var cal = {
273284
cal.transit(() => cal.hFormWrap.show());
274285
},
275286

276-
// (H) SAVE EVENT
287+
// (I) SAVE EVENT
277288
save : async () => {
278-
// (H1) COLLECT DATA
289+
// (I1) COLLECT DATA
279290
// data[0] = start date
280291
// data[1] = end date
281292
// data[2] = event text
@@ -290,20 +301,20 @@ var cal = {
290301
];
291302
if (cal.hfID.value != "") { data.push(+cal.hfID.value); }
292303

293-
// (H2) DATE CHECK
304+
// (I2) DATE CHECK
294305
if (new Date(data[0]) > new Date(data[1])) {
295306
alert("Start date cannot be later than end date!");
296307
return false;
297308
}
298309

299-
// (H3) SAVE
310+
// (I3) SAVE
300311
await calDB.save(data);
301312
cal.transit(() => cal.hFormWrap.close());
302313
cal.load();
303314
return false;
304315
},
305316

306-
// (I) DELETE EVENT
317+
// (J) DELETE EVENT
307318
del : async () => { if (confirm("Delete Event?")) {
308319
await calDB.del(cal.hfID.value);
309320
cal.transit(() => cal.hFormWrap.close());

js-calendar.html

+4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<!-- (A) HEADER -->
3333
<div id="calHead">
3434
<div id="calPeriod">
35+
<button id="calToday" type="button" class="icon-pushpin"></button>
3536
<button id="calBack" type="button" class="icon-circle-left"></button>
3637
<select id="calMonth"></select>
3738
<input id="calYear" type="number">
@@ -105,6 +106,9 @@ <h3 class="aboutTitle">
105106
<a href="https://payhip.com/codeboxx" class="aboutBtn" target="_blank">
106107
<i class="ico-sm icon-cart"></i> Code Boxx Store
107108
</a>
109+
<a href="https://github.com/sponsors/code-boxx" class="aboutBtn" target="_blank">
110+
<i class="ico-sm icon-heart"></i> GitHub Sponsor
111+
</a>
108112
</div>
109113

110114
<!-- (X3) SOCIALS -->

0 commit comments

Comments
 (0)