lesli_calendar 1.0.0 → 1.1.1
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.
- checksums.yaml +4 -4
- data/Rakefile +3 -1
- data/app/assets/stylesheets/lesli_calendar/application.css +200 -12
- data/app/assets/stylesheets/lesli_calendar/application.tailwind.css +2 -0
- data/app/services/lesli_calendar/event_service.rb +52 -30
- data/app/views/lesli_calendar/agendas/show.html.erb +12 -13
- data/app/views/lesli_calendar/calendars/show.html.erb +9 -10
- data/app/views/lesli_calendar/partials/_agenda.html.erb +27 -16
- data/app/views/lesli_calendar/partials/_calendar.html.erb +1 -1
- data/db/seeds.rb +1 -2
- data/lib/lesli_calendar/version.rb +2 -2
- data/readme.md +130 -49
- metadata +4 -6
- data/lib/scss/_agenda.scss +0 -99
- data/lib/scss/_calendar.scss +0 -137
- data/lib/scss/application.scss +0 -44
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '0138afb8c8a8a31c86a291dfff1287b7dd14818bdd9bfe79f2a2e585728f440f'
|
|
4
|
+
data.tar.gz: 4517bdea6939668d768ec483c0f7a8eab87cadf29013cff3cc3e8f3fa29e4ed3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2b22376481970417e56b09fb7b0a07177f2de2501d1d1dc9602a843af0165d679e95733059c6a1e203bdc23a73ffbfab74a55386de10039d444670da3eab3d4e
|
|
7
|
+
data.tar.gz: '059f684bdd0ec58b4ba848bd3b1b3f31375fe8a2f11daacabbe26809c43dff724452964d8a93a4b044bed52733732f49f2e8eefc09cfc3cb300f43acda1ab47a'
|
data/Rakefile
CHANGED
|
@@ -180,10 +180,11 @@ Building a better future, one line of code at a time.
|
|
|
180
180
|
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
181
181
|
// ·
|
|
182
182
|
*/
|
|
183
|
-
|
|
183
|
+
/*
|
|
184
|
+
|
|
184
185
|
Lesli
|
|
185
186
|
|
|
186
|
-
Copyright (c)
|
|
187
|
+
Copyright (c) 2026, Lesli Technologies, S. A.
|
|
187
188
|
|
|
188
189
|
This program is free software: you can redistribute it and/or modify
|
|
189
190
|
it under the terms of the GNU General Public License as published by
|
|
@@ -198,7 +199,7 @@ GNU General Public License for more details.
|
|
|
198
199
|
You should have received a copy of the GNU General Public License
|
|
199
200
|
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
200
201
|
|
|
201
|
-
Lesli
|
|
202
|
+
Lesli · SCSS Utilities for websites and web applications.
|
|
202
203
|
|
|
203
204
|
Made with ♥ by LesliTech
|
|
204
205
|
Building a better future, one line of code at a time.
|
|
@@ -211,9 +212,10 @@ Building a better future, one line of code at a time.
|
|
|
211
212
|
// ·
|
|
212
213
|
*/
|
|
213
214
|
/*
|
|
215
|
+
|
|
214
216
|
Lesli
|
|
215
217
|
|
|
216
|
-
Copyright (c)
|
|
218
|
+
Copyright (c) 2026, Lesli Technologies, S. A.
|
|
217
219
|
|
|
218
220
|
This program is free software: you can redistribute it and/or modify
|
|
219
221
|
it under the terms of the GNU General Public License as published by
|
|
@@ -226,18 +228,204 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
226
228
|
GNU General Public License for more details.
|
|
227
229
|
|
|
228
230
|
You should have received a copy of the GNU General Public License
|
|
229
|
-
along with this program. If not, see
|
|
231
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
230
232
|
|
|
231
|
-
|
|
233
|
+
Lesli · SCSS Utilities for websites and web applications.
|
|
232
234
|
|
|
233
|
-
|
|
235
|
+
Made with ♥ by LesliTech
|
|
234
236
|
Building a better future, one line of code at a time.
|
|
235
237
|
|
|
236
|
-
@contact
|
|
237
|
-
@website
|
|
238
|
+
@contact hello@lesli.tech
|
|
239
|
+
@website https://www.lesli.tech
|
|
238
240
|
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
239
241
|
|
|
240
|
-
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
242
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
243
|
+
// ·
|
|
244
|
+
*/
|
|
245
|
+
/*
|
|
246
|
+
|
|
247
|
+
Lesli
|
|
248
|
+
|
|
249
|
+
Copyright (c) 2026, Lesli Technologies, S. A.
|
|
250
|
+
|
|
251
|
+
This program is free software: you can redistribute it and/or modify
|
|
252
|
+
it under the terms of the GNU General Public License as published by
|
|
253
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
254
|
+
(at your option) any later version.
|
|
255
|
+
|
|
256
|
+
This program is distributed in the hope that it will be useful,
|
|
257
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
258
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
259
|
+
GNU General Public License for more details.
|
|
260
|
+
|
|
261
|
+
You should have received a copy of the GNU General Public License
|
|
262
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
263
|
+
|
|
264
|
+
Lesli · SCSS Utilities for websites and web applications.
|
|
265
|
+
|
|
266
|
+
Made with ♥ by LesliTech
|
|
267
|
+
Building a better future, one line of code at a time.
|
|
268
|
+
|
|
269
|
+
@contact hello@lesli.tech
|
|
270
|
+
@website https://www.lesli.tech
|
|
271
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
272
|
+
|
|
273
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
274
|
+
// ·
|
|
275
|
+
*/
|
|
276
|
+
/*
|
|
277
|
+
|
|
278
|
+
Lesli
|
|
279
|
+
|
|
280
|
+
Copyright (c) 2026, Lesli Technologies, S. A.
|
|
281
|
+
|
|
282
|
+
This program is free software: you can redistribute it and/or modify
|
|
283
|
+
it under the terms of the GNU General Public License as published by
|
|
284
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
285
|
+
(at your option) any later version.
|
|
286
|
+
|
|
287
|
+
This program is distributed in the hope that it will be useful,
|
|
288
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
289
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
290
|
+
GNU General Public License for more details.
|
|
291
|
+
|
|
292
|
+
You should have received a copy of the GNU General Public License
|
|
293
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
294
|
+
|
|
295
|
+
Lesli · SCSS Utilities for websites and web applications.
|
|
296
|
+
|
|
297
|
+
Made with ♥ by LesliTech
|
|
298
|
+
Building a better future, one line of code at a time.
|
|
299
|
+
|
|
300
|
+
@contact hello@lesli.tech
|
|
301
|
+
@website https://www.lesli.tech
|
|
302
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
303
|
+
|
|
304
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
305
|
+
// ·
|
|
306
|
+
*/
|
|
307
|
+
/*
|
|
308
|
+
|
|
309
|
+
Lesli
|
|
310
|
+
|
|
311
|
+
Copyright (c) 2026, Lesli Technologies, S. A.
|
|
312
|
+
|
|
313
|
+
This program is free software: you can redistribute it and/or modify
|
|
314
|
+
it under the terms of the GNU General Public License as published by
|
|
315
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
316
|
+
(at your option) any later version.
|
|
317
|
+
|
|
318
|
+
This program is distributed in the hope that it will be useful,
|
|
319
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
320
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
321
|
+
GNU General Public License for more details.
|
|
322
|
+
|
|
323
|
+
You should have received a copy of the GNU General Public License
|
|
324
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
325
|
+
|
|
326
|
+
Lesli · SCSS Utilities for websites and web applications.
|
|
327
|
+
|
|
328
|
+
Made with ♥ by LesliTech
|
|
329
|
+
Building a better future, one line of code at a time.
|
|
330
|
+
|
|
331
|
+
@contact hello@lesli.tech
|
|
332
|
+
@website https://www.lesli.tech
|
|
333
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
334
|
+
|
|
335
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
336
|
+
// ·
|
|
337
|
+
*/
|
|
338
|
+
/*
|
|
339
|
+
|
|
340
|
+
Lesli
|
|
341
|
+
|
|
342
|
+
Copyright (c) 2026, Lesli Technologies, S. A.
|
|
343
|
+
|
|
344
|
+
This program is free software: you can redistribute it and/or modify
|
|
345
|
+
it under the terms of the GNU General Public License as published by
|
|
346
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
347
|
+
(at your option) any later version.
|
|
348
|
+
|
|
349
|
+
This program is distributed in the hope that it will be useful,
|
|
350
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
351
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
352
|
+
GNU General Public License for more details.
|
|
353
|
+
|
|
354
|
+
You should have received a copy of the GNU General Public License
|
|
355
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
356
|
+
|
|
357
|
+
Lesli · SCSS Utilities for websites and web applications.
|
|
358
|
+
|
|
359
|
+
Made with ♥ by LesliTech
|
|
360
|
+
Building a better future, one line of code at a time.
|
|
361
|
+
|
|
362
|
+
@contact hello@lesli.tech
|
|
363
|
+
@website https://www.lesli.tech
|
|
364
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
365
|
+
|
|
366
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
367
|
+
// ·
|
|
368
|
+
*/
|
|
369
|
+
/*
|
|
370
|
+
|
|
371
|
+
Lesli
|
|
372
|
+
|
|
373
|
+
Copyright (c) 2026, Lesli Technologies, S. A.
|
|
374
|
+
|
|
375
|
+
This program is free software: you can redistribute it and/or modify
|
|
376
|
+
it under the terms of the GNU General Public License as published by
|
|
377
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
378
|
+
(at your option) any later version.
|
|
379
|
+
|
|
380
|
+
This program is distributed in the hope that it will be useful,
|
|
381
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
382
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
383
|
+
GNU General Public License for more details.
|
|
384
|
+
|
|
385
|
+
You should have received a copy of the GNU General Public License
|
|
386
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
387
|
+
|
|
388
|
+
Lesli · SCSS Utilities for websites and web applications.
|
|
389
|
+
|
|
390
|
+
Made with ♥ by LesliTech
|
|
391
|
+
Building a better future, one line of code at a time.
|
|
392
|
+
|
|
393
|
+
@contact hello@lesli.tech
|
|
394
|
+
@website https://www.lesli.tech
|
|
395
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
396
|
+
|
|
397
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
398
|
+
// ·
|
|
399
|
+
*/
|
|
400
|
+
/*
|
|
401
|
+
|
|
402
|
+
Lesli
|
|
403
|
+
|
|
404
|
+
Copyright (c) 2026, Lesli Technologies, S. A.
|
|
405
|
+
|
|
406
|
+
This program is free software: you can redistribute it and/or modify
|
|
407
|
+
it under the terms of the GNU General Public License as published by
|
|
408
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
409
|
+
(at your option) any later version.
|
|
410
|
+
|
|
411
|
+
This program is distributed in the hope that it will be useful,
|
|
412
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
413
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
414
|
+
GNU General Public License for more details.
|
|
415
|
+
|
|
416
|
+
You should have received a copy of the GNU General Public License
|
|
417
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
418
|
+
|
|
419
|
+
Lesli · SCSS Utilities for websites and web applications.
|
|
420
|
+
|
|
421
|
+
Made with ♥ by LesliTech
|
|
422
|
+
Building a better future, one line of code at a time.
|
|
423
|
+
|
|
424
|
+
@contact hello@lesli.tech
|
|
425
|
+
@website https://www.lesli.tech
|
|
426
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
427
|
+
|
|
428
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
241
429
|
// ·
|
|
242
430
|
*/
|
|
243
431
|
/**
|
|
@@ -586,7 +774,7 @@ body.lesli-calendar.calendars #lesli-calendar-engine .fc-scrollgrid .fc-scrollgr
|
|
|
586
774
|
body.lesli-calendar.calendars #lesli-calendar-engine .fc-scrollgrid .fc-scrollgrid-section-header .fc-col-header-cell a {
|
|
587
775
|
font-family: "OpenSans";
|
|
588
776
|
font-weight: 600;
|
|
589
|
-
color: #
|
|
777
|
+
color: #313942;
|
|
590
778
|
}
|
|
591
779
|
body.lesli-calendar.calendars #lesli-calendar-engine .fc-scrollgrid .fc-scrollgrid-section-body .fc-day {
|
|
592
780
|
border: 6px solid var(--lesli-color-background);
|
|
@@ -595,7 +783,7 @@ body.lesli-calendar.calendars #lesli-calendar-engine .fc-scrollgrid .fc-scrollgr
|
|
|
595
783
|
padding: 5px 10px;
|
|
596
784
|
}
|
|
597
785
|
body.lesli-calendar.calendars #lesli-calendar-engine .fc-scrollgrid .fc-scrollgrid-section-body .fc-daygrid-day.fc-day-today .fc-daygrid-day-top .fc-daygrid-day-number {
|
|
598
|
-
color: #
|
|
786
|
+
color: #245F93;
|
|
599
787
|
font-weight: 800;
|
|
600
788
|
}
|
|
601
789
|
body.lesli-calendar.calendars #lesli-calendar-engine .fc-scrollgrid .fc-scrollgrid-section-body .fc-daygrid-day .fc-daygrid-event {
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--color-slate-50:oklch(98.4% .003 247.858);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-extrabold:800;--tracking-wide:.025em;--radius-sm:.25rem;--radius-lg:.5rem;--radius-xl:.75rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1)}}@layer components{body.lesli-calendar.calendars #lesli-calendar-engine .fc-scrollgrid{border:0!important}body.lesli-calendar.calendars #lesli-calendar-engine .fc-scrollgrid th[role=presentation]{border-style:var(--tw-border-style);border-width:0;border-bottom-style:var(--tw-border-style);border-bottom-width:6px;border-bottom-color:var(--lesli-color-background)}body.lesli-calendar.calendars #lesli-calendar-engine .fc-col-header-cell{border-inline-style:var(--tw-border-style);padding-block:calc(var(--spacing) * 3);text-align:center;border-inline-width:0}body.lesli-calendar.calendars #lesli-calendar-engine .fc-col-header-cell a{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--color-slate-800)}body.lesli-calendar.calendars #lesli-calendar-engine .fc-day{border-style:var(--tw-border-style);border-width:6px;border-color:var(--lesli-color-background)}body.lesli-calendar.calendars #lesli-calendar-engine .fc-daygrid-day-number{padding-inline:calc(var(--spacing) * 2.5);padding-block:5px}body.lesli-calendar.calendars #lesli-calendar-engine .fc-day-today .fc-daygrid-day-number{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold);color:var(--lesli-color-primary)}body.lesli-calendar.calendars #lesli-calendar-engine .fc-daygrid-event{margin-bottom:calc(var(--spacing) * .5);margin-left:calc(var(--spacing) * 2);border-radius:var(--radius-sm);border-style:var(--tw-border-style);border-width:0;border-left-style:var(--tw-border-style);padding-block:calc(var(--spacing) * 1.5);padding-right:calc(var(--spacing) * 1.5);padding-left:calc(var(--spacing) * 3);border-left-width:5px;display:block;overflow:hidden}body.lesli-calendar.calendars #lesli-calendar-engine .fc-event-time,body.lesli-calendar.calendars #lesli-calendar-engine .fc-daygrid-event-dot{display:none!important}body.lesli-calendar.calendars #lesli-calendar-engine .fc-daygrid-event.lesli-calendar{background-color:#bed8f7;border-left-color:#3689e6}body.lesli-calendar.calendars #lesli-calendar-engine .fc-daygrid-event.lesli-calendar .fc-event-title{padding-left:var(--spacing);--tw-font-weight:var(--font-weight-normal);font-family:OpenSans;font-weight:var(--font-weight-normal);color:#0e3f75;text-transform:capitalize}body.lesli-calendar.calendars #lesli-calendar-engine .fc-daygrid-event.lesli-support{background-color:#f4edfb;border-left-color:#a56de2}body.lesli-calendar.calendars #lesli-calendar-engine .fc-daygrid-event.lesli-support .fc-event-title{color:#581e98}body.lesli-calendar.calendars #lesli-calendar-engine .fc-daygrid-event.lesli-tasks{background-color:#95e8da;border-left-color:#28bca3}body.lesli-calendar.calendars #lesli-calendar-engine .fc-daygrid-event.lesli-tasks .fc-event-title{color:#0d3e36}.lesli-calendar-agenda .agenda-event{border-left-color:var(--color-slate-400)}.lesli-calendar-agenda .agenda-event.lesli-calendar{border-left-color:#3689e6}.lesli-calendar-agenda .agenda-event.lesli-support{border-left-color:#a56de2}.lesli-calendar-agenda .agenda-event.cloud-focus-tasks,.lesli-calendar-agenda .agenda-event.lesli-tasks{border-left-color:#28bca3}}@layer utilities{.mt-1{margin-top:var(--spacing)}.mt-4{margin-top:calc(var(--spacing) * 4)}.flex{display:flex}.inline-flex{display:inline-flex}.min-h-10{min-height:calc(var(--spacing) * 10)}.w-20{width:calc(var(--spacing) * 20)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-slate-200>:not(:last-child)){border-color:var(--color-slate-200)}.overflow-hidden{overflow:hidden}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-info-600{border-color:var(--lesli-color-info-600)}.border-slate-200{border-color:var(--color-slate-200)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-white{background-color:var(--color-white)}.p-0{padding:0}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-4{padding-block:calc(var(--spacing) * 4)}.text-center{text-align:center}.font-\[\'OpenSans\'\]{font-family:OpenSans}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-info-700{color:var(--lesli-color-info-700)}.text-slate-500{color:var(--color-slate-500)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.uppercase{text-transform:uppercase}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:bg-info-50:hover{background-color:var(--lesli-color-info-50)}}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-info-500\/40:focus-visible{--tw-ring-color:var(--lesli-color-info-500)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-info-500\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--lesli-color-info-500) 40%, transparent)}}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}
|
|
@@ -114,47 +114,69 @@ module LesliCalendar
|
|
|
114
114
|
end
|
|
115
115
|
|
|
116
116
|
def agenda
|
|
117
|
-
|
|
118
|
-
current_date = Time.now
|
|
117
|
+
current_time = Time.current
|
|
119
118
|
|
|
120
|
-
#
|
|
121
|
-
|
|
119
|
+
# Convert FullCalendar's payload into the simpler shape consumed by the agenda view.
|
|
120
|
+
upcoming_events = index.filter_map do |event|
|
|
121
|
+
start_at = normalize_agenda_time(value_from(event, :start))
|
|
122
|
+
next if start_at.nil? || start_at < current_time.beginning_of_day
|
|
122
123
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
124
|
+
extended_props = value_from(event, :extendedProps) || {}
|
|
125
|
+
|
|
126
|
+
{
|
|
127
|
+
id: value_from(event, :id),
|
|
128
|
+
title: value_from(event, :title),
|
|
129
|
+
description: agenda_description(value_from(extended_props, :description)),
|
|
130
|
+
start_at: start_at,
|
|
131
|
+
end_at: normalize_agenda_time(value_from(event, :end)),
|
|
132
|
+
url: value_from(event, :url),
|
|
133
|
+
classnames: Array(value_from(event, :classNames)).join(" ")
|
|
134
|
+
}
|
|
126
135
|
end
|
|
127
136
|
|
|
128
|
-
#
|
|
129
|
-
|
|
137
|
+
# Sorting first preserves chronological order for both days and their events.
|
|
138
|
+
upcoming_events.sort_by { |event| event[:start_at] }.each_with_object({}) do |event, agenda|
|
|
139
|
+
start_at = event[:start_at]
|
|
140
|
+
date_key = start_at.to_date.iso8601
|
|
141
|
+
today = start_at.to_date == current_time.to_date
|
|
130
142
|
|
|
131
|
-
date_key
|
|
143
|
+
agenda[date_key] ||= {
|
|
144
|
+
day_name: today ? "Today" : start_at.strftime("%a"),
|
|
145
|
+
day_number: today ? start_at.strftime("%H:%M") : start_at.strftime("%d"),
|
|
146
|
+
events: []
|
|
147
|
+
}
|
|
132
148
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
149
|
+
agenda[date_key][:events] << event
|
|
150
|
+
end
|
|
151
|
+
end
|
|
136
152
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
end
|
|
153
|
+
private
|
|
154
|
+
|
|
155
|
+
def value_from(hash, key)
|
|
156
|
+
return unless hash.respond_to?(:[])
|
|
143
157
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
event[:description] = event[:description].gsub(/<[^>]*>?/, '')[0, 85] + '...'
|
|
147
|
-
end
|
|
158
|
+
hash[key] || hash[key.to_s]
|
|
159
|
+
end
|
|
148
160
|
|
|
149
|
-
|
|
150
|
-
|
|
161
|
+
# FullCalendar sources may provide dates as Rails objects or ISO 8601 strings.
|
|
162
|
+
def normalize_agenda_time(value)
|
|
163
|
+
case value
|
|
164
|
+
when ActiveSupport::TimeWithZone
|
|
165
|
+
value
|
|
166
|
+
when Time, DateTime, Date
|
|
167
|
+
value.in_time_zone
|
|
168
|
+
when String
|
|
169
|
+
Time.zone.parse(value)
|
|
151
170
|
end
|
|
171
|
+
rescue ArgumentError, TypeError
|
|
172
|
+
nil
|
|
173
|
+
end
|
|
152
174
|
|
|
153
|
-
|
|
154
|
-
|
|
175
|
+
def agenda_description(description)
|
|
176
|
+
return if description.blank?
|
|
155
177
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
end
|
|
178
|
+
text = ActionController::Base.helpers.strip_tags(description.to_s).squish
|
|
179
|
+
ActionController::Base.helpers.truncate(text, length: 88)
|
|
180
|
+
end
|
|
159
181
|
end
|
|
160
182
|
end
|
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
<%= render(LesliView::Layout::Container.new("calendar-calendar")) do %>
|
|
2
2
|
|
|
3
3
|
<%= render(LesliView::Components::Header.new(Date2.new.date_words)) do %>
|
|
4
|
-
<div class="
|
|
5
|
-
<div
|
|
6
|
-
<%= render LesliView::Elements::Button.new("
|
|
4
|
+
<div class="flex flex-wrap items-center gap-2" role="group" aria-label="Agenda navigation">
|
|
5
|
+
<div>
|
|
6
|
+
<%= render LesliView::Elements::Button.new("Prev", icon:"arrow_back_ios") %>
|
|
7
7
|
</div>
|
|
8
|
-
<div
|
|
9
|
-
<%= render LesliView::Elements::Button.new("
|
|
8
|
+
<div>
|
|
9
|
+
<%= render LesliView::Elements::Button.new("Today", icon:"today") %>
|
|
10
10
|
</div>
|
|
11
|
-
<div
|
|
12
|
-
<button
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
</span>
|
|
11
|
+
<div>
|
|
12
|
+
<button
|
|
13
|
+
type="button"
|
|
14
|
+
@click="storeCalendar.nextMonth()"
|
|
15
|
+
class="inline-flex min-h-10 items-center justify-center gap-2 rounded-lg border border-info-600 bg-white px-4 py-2 text-sm font-semibold text-info-700 shadow-sm transition-colors hover:bg-info-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-info-500/40">
|
|
16
|
+
<span>Next</span>
|
|
17
|
+
<span class="material-symbols text-lg leading-none" aria-hidden="true">arrow_forward_ios</span>
|
|
19
18
|
</button>
|
|
20
19
|
</div>
|
|
21
20
|
</div>
|
|
@@ -5,21 +5,20 @@
|
|
|
5
5
|
<%= render(LesliView::Layout::Container.new("calendar-calendar")) do %>
|
|
6
6
|
|
|
7
7
|
<%= render(LesliView::Components::Header.new(Date2.new.date_words)) do %>
|
|
8
|
-
<div class="
|
|
9
|
-
<div
|
|
8
|
+
<div class="flex flex-wrap items-center gap-2" role="group" aria-label="Calendar navigation">
|
|
9
|
+
<div>
|
|
10
10
|
<%= render LesliView::Elements::Button.new("Prev", icon:"arrow_back_ios") %>
|
|
11
11
|
</div>
|
|
12
|
-
<div
|
|
12
|
+
<div>
|
|
13
13
|
<%= render LesliView::Elements::Button.new("Today", icon:"today") %>
|
|
14
14
|
</div>
|
|
15
|
-
<div
|
|
16
|
-
<button
|
|
15
|
+
<div>
|
|
16
|
+
<button
|
|
17
|
+
type="button"
|
|
18
|
+
@click="storeCalendar.nextMonth()"
|
|
19
|
+
class="inline-flex min-h-10 items-center justify-center gap-2 rounded-lg border border-info-600 bg-white px-4 py-2 text-sm font-semibold text-info-700 shadow-sm transition-colors hover:bg-info-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-info-500/40">
|
|
17
20
|
<span>Next</span>
|
|
18
|
-
<span class="
|
|
19
|
-
<span class="material-symbols">
|
|
20
|
-
arrow_forward_ios
|
|
21
|
-
</span>
|
|
22
|
-
</span>
|
|
21
|
+
<span class="material-symbols text-lg leading-none" aria-hidden="true">arrow_forward_ios</span>
|
|
23
22
|
</button>
|
|
24
23
|
</div>
|
|
25
24
|
</div>
|
|
@@ -1,20 +1,31 @@
|
|
|
1
1
|
|
|
2
|
-
<
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
<section
|
|
3
|
+
class="lesli-calendar-agenda mt-4 overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm"
|
|
4
|
+
aria-labelledby="upcoming-events-title">
|
|
5
|
+
|
|
6
|
+
<h2 id="upcoming-events-title" class="border-b border-slate-200 px-5 py-4 text-lg font-semibold text-slate-800">
|
|
7
|
+
Upcoming events
|
|
8
|
+
</h2>
|
|
9
|
+
|
|
10
|
+
<div class="divide-y divide-slate-200">
|
|
11
|
+
<% @agenda.each do |_date, day| %>
|
|
12
|
+
<article class="flex py-4 items-stretch">
|
|
13
|
+
<div class="flex w-20 shrink-0 flex-col items-center justify-center border-r border-slate-200 bg-slate-50 px-3 py-4 text-center text-slate-700">
|
|
14
|
+
<p class="text-xs font-medium uppercase tracking-wide text-slate-500"><%= day[:day_name] %></p>
|
|
15
|
+
<p class="mt-1 text-xl font-semibold"><%= day[:day_number] %></p>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<div class="min-w-0 flex-1 py-2">
|
|
11
19
|
<% day[:events].each do |event| %>
|
|
12
|
-
<div class="<%= event[:classnames] %>">
|
|
13
|
-
<p><%= event[:title] %></p>
|
|
14
|
-
|
|
20
|
+
<div class="agenda-event <%= event[:classnames] %> border-l-4 px-4 py-2">
|
|
21
|
+
<p class="font-['OpenSans'] text-sm font-medium text-slate-800"><%= event[:title] %></p>
|
|
22
|
+
<% if event[:description].present? %>
|
|
23
|
+
<p class="mt-1 font-['OpenSans'] text-sm leading-5 text-slate-500"><%= event[:description] %></p>
|
|
24
|
+
<% end %>
|
|
15
25
|
</div>
|
|
16
26
|
<% end %>
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
</div>
|
|
27
|
+
</div>
|
|
28
|
+
</article>
|
|
29
|
+
<% end %>
|
|
30
|
+
</div>
|
|
31
|
+
</section>
|
data/db/seeds.rb
CHANGED
|
@@ -16,8 +16,7 @@ For more information read the license file including with this software.
|
|
|
16
16
|
// ·
|
|
17
17
|
=end
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
L2.msg("LesliCalendar", "Version: #{LesliCalendar::VERSION}", "Build: #{LesliCalendar::BUILD}")
|
|
19
|
+
Termline.info("Loading seeds for: LesliCalendar #{LesliCalendar::VERSION} (#{LesliCalendar::BUILD})")
|
|
21
20
|
|
|
22
21
|
|
|
23
22
|
# · load specific environment seeds
|
data/readme.md
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
<div align="center">
|
|
2
|
-
<
|
|
3
|
-
|
|
2
|
+
<h1 align="center">
|
|
3
|
+
<img width="100" alt="LesliCalendar" src="./app/assets/images/lesli_calendar/calendar-logo.svg" />
|
|
4
|
+
</h1>
|
|
5
|
+
<h3 align="center">Calendars and events for the Lesli Framework.</h3>
|
|
4
6
|
</div>
|
|
5
7
|
|
|
6
8
|
<br />
|
|
7
|
-
<hr/>
|
|
8
9
|
|
|
9
10
|
<div align="center">
|
|
10
|
-
<a target="_blank" href="https://github.com/LesliTech/LesliCalendar/actions">
|
|
11
|
-
<img alt="
|
|
11
|
+
<a target="_blank" href="https://github.com/LesliTech/LesliCalendar/actions/workflows/lesli-ci.yaml">
|
|
12
|
+
<img alt="LesliCalendar test status" src="https://img.shields.io/github/actions/workflow/status/LesliTech/LesliCalendar/lesli-ci.yaml?branch=master&style=for-the-badge&logo=github&label=tests">
|
|
12
13
|
</a>
|
|
13
14
|
<a target="_blank" href="https://rubygems.org/gems/lesli_calendar">
|
|
14
15
|
<img alt="Gem Version" src="https://img.shields.io/gem/v/lesli_calendar?style=for-the-badge&logo=ruby">
|
|
@@ -16,83 +17,166 @@
|
|
|
16
17
|
<a target="_blank" href="https://codecov.io/github/LesliTech/LesliCalendar">
|
|
17
18
|
<img alt="Codecov" src="https://img.shields.io/codecov/c/github/LesliTech/LesliCalendar?style=for-the-badge&logo=codecov">
|
|
18
19
|
</a>
|
|
20
|
+
<a target="_blank" href="https://sonarcloud.io/project/overview?id=LesliTech_LesliCalendar">
|
|
21
|
+
<img alt="Sonar Quality Gate" src="https://img.shields.io/sonar/quality_gate/LesliTech_LesliCalendar?server=https%3A%2F%2Fsonarcloud.io&style=for-the-badge&logo=sonarqubecloud&label=Quality">
|
|
22
|
+
</a>
|
|
19
23
|
</div>
|
|
20
24
|
|
|
21
|
-
<hr/>
|
|
22
25
|
<br />
|
|
23
26
|
|
|
24
27
|
<div align="center">
|
|
25
28
|
<img
|
|
26
29
|
style="width:100%;max-width:800px;border-radius:6px;"
|
|
27
|
-
alt="
|
|
30
|
+
alt="LesliCalendar events and agenda"
|
|
31
|
+
src="./docs/images/screenshot.png" />
|
|
28
32
|
</div>
|
|
29
33
|
|
|
34
|
+
---
|
|
35
|
+
|
|
30
36
|
<br />
|
|
31
|
-
|
|
37
|
+
|
|
38
|
+
## Introduction
|
|
39
|
+
|
|
40
|
+
LesliCalendar is the official calendar and event-management engine for the [Lesli Framework](https://github.com/LesliTech/Lesli).
|
|
41
|
+
|
|
42
|
+
It provides account-scoped calendars, events, agendas, and attendee management for Lesli applications.
|
|
43
|
+
|
|
32
44
|
<br />
|
|
33
45
|
|
|
34
|
-
|
|
46
|
+
## Features
|
|
47
|
+
|
|
48
|
+
- Account-scoped calendars
|
|
49
|
+
- Responsive FullCalendar grid and chronological agenda views
|
|
50
|
+
- Event creation and scheduling
|
|
51
|
+
- Event attendee management
|
|
52
|
+
- Optional LesliSupport deadline integration
|
|
53
|
+
- Integration with Lesli users, permissions, and navigation
|
|
54
|
+
|
|
55
|
+
<br />
|
|
56
|
+
|
|
57
|
+
## Try LesliCalendar
|
|
58
|
+
|
|
59
|
+
- [Try the online demo](https://demo.lesli.dev/)
|
|
60
|
+
- [Run the Docker demo](https://github.com/LesliTech/lesli-docker-demo)
|
|
61
|
+
|
|
62
|
+
<br />
|
|
63
|
+
|
|
64
|
+
## Quick Start
|
|
65
|
+
|
|
66
|
+
### Requirements
|
|
67
|
+
|
|
68
|
+
- A Rails application with [Lesli](https://rubygems.org/gems/lesli)
|
|
69
|
+
- SQLite by default, or PostgreSQL when preferred by the host application
|
|
70
|
+
|
|
71
|
+
### Install LesliCalendar
|
|
72
|
+
|
|
73
|
+
Add the engine to the host Rails application and prepare its database:
|
|
35
74
|
|
|
36
75
|
```shell
|
|
37
|
-
# Add LesliCalendar engine gem
|
|
38
76
|
bundle add lesli_calendar
|
|
77
|
+
bin/rails lesli:db:prepare
|
|
78
|
+
```
|
|
39
79
|
|
|
40
|
-
|
|
41
|
-
|
|
80
|
+
### Mount the engine
|
|
81
|
+
|
|
82
|
+
Applications using Lesli's standard router mount LesliCalendar automatically at `/calendar`:
|
|
83
|
+
|
|
84
|
+
```ruby
|
|
85
|
+
# config/routes.rb
|
|
86
|
+
Rails.application.routes.draw do
|
|
87
|
+
Lesli::Router.mount(self)
|
|
88
|
+
end
|
|
42
89
|
```
|
|
43
90
|
|
|
91
|
+
If the application does not use the standard Lesli router, mount the engine directly:
|
|
92
|
+
|
|
44
93
|
```ruby
|
|
45
|
-
#
|
|
94
|
+
# config/routes.rb
|
|
46
95
|
Rails.application.routes.draw do
|
|
47
96
|
mount LesliCalendar::Engine => "/calendar"
|
|
48
97
|
end
|
|
49
98
|
```
|
|
50
99
|
|
|
100
|
+
Start Rails and visit [http://127.0.0.1:3000/calendar](http://127.0.0.1:3000/calendar):
|
|
101
|
+
|
|
102
|
+
```shell
|
|
103
|
+
bin/rails server
|
|
104
|
+
```
|
|
105
|
+
|
|
51
106
|
<br />
|
|
52
|
-
<hr/>
|
|
53
|
-
<br />
|
|
54
107
|
|
|
55
|
-
|
|
108
|
+
## Development
|
|
109
|
+
|
|
110
|
+
Clone LesliCalendar into the host application's `engines` directory:
|
|
56
111
|
|
|
57
112
|
```shell
|
|
58
|
-
|
|
59
|
-
|
|
113
|
+
cd RailsApp
|
|
114
|
+
mkdir -p engines
|
|
115
|
+
git clone https://github.com/LesliTech/LesliCalendar.git engines/LesliCalendar
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Reference the local engine from the host application's `Gemfile`:
|
|
60
119
|
|
|
61
|
-
|
|
62
|
-
gem "
|
|
120
|
+
```ruby
|
|
121
|
+
gem "lesli_calendar", path: "engines/LesliCalendar"
|
|
122
|
+
```
|
|
63
123
|
|
|
64
|
-
|
|
124
|
+
Install dependencies, prepare the host database, and start Rails:
|
|
125
|
+
|
|
126
|
+
```shell
|
|
65
127
|
bundle install
|
|
128
|
+
bin/rails lesli:db:prepare
|
|
129
|
+
bin/rails server
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Tests
|
|
66
133
|
|
|
67
|
-
|
|
68
|
-
rake lesli:db:setup
|
|
134
|
+
From a complete Lesli development workspace, run the engine test suite from the LesliCalendar directory:
|
|
69
135
|
|
|
136
|
+
```shell
|
|
137
|
+
cd engines/LesliCalendar
|
|
138
|
+
bin/rails test
|
|
70
139
|
```
|
|
71
140
|
|
|
72
|
-
|
|
73
|
-
<hr/>
|
|
74
|
-
<br />
|
|
141
|
+
### Tailwind styles
|
|
75
142
|
|
|
76
|
-
|
|
143
|
+
Calendar and agenda templates use Tailwind CSS. FullCalendar-specific rules are maintained in `source/tailwind/application.tailwind.css`; the file under `app/assets/stylesheets` is generated and should not be edited directly.
|
|
77
144
|
|
|
78
|
-
|
|
79
|
-
* [docker demo](https://github.com/LesliTech/lesli-docker-demo)
|
|
145
|
+
From a complete Lesli workspace, rebuild the engine stylesheet through LesliAssets:
|
|
80
146
|
|
|
147
|
+
```shell
|
|
148
|
+
cd gems/LesliAssets
|
|
149
|
+
make build.tailwind
|
|
150
|
+
```
|
|
81
151
|
|
|
82
|
-
|
|
83
|
-
* [website](https://www.lesli.dev/)
|
|
84
|
-
* [documentation](https://www.lesli.dev/engines/calendar)
|
|
152
|
+
See [Calendar and Agenda](./docs/about/calendar-and-agenda.md) for the event pipeline, agenda data shape, and frontend conventions.
|
|
85
153
|
|
|
154
|
+
<br />
|
|
155
|
+
|
|
156
|
+
## Documentation
|
|
86
157
|
|
|
87
|
-
|
|
158
|
+
- [Installation](./docs/about/installation.md)
|
|
159
|
+
- [Calendar and agenda](./docs/about/calendar-and-agenda.md)
|
|
160
|
+
- [Translations](./docs/about/translations.md)
|
|
161
|
+
- [Database](./docs/about/database.md)
|
|
162
|
+
- [Lesli website](https://www.lesli.dev/)
|
|
163
|
+
- [Documentation](https://www.lesli.dev/engines/calendar)
|
|
164
|
+
- [Release notes](https://github.com/LesliTech/LesliCalendar/releases)
|
|
165
|
+
- [Issue tracker](https://github.com/LesliTech/LesliCalendar/issues)
|
|
166
|
+
- [Source code](https://github.com/LesliTech/LesliCalendar)
|
|
167
|
+
|
|
168
|
+
<br />
|
|
88
169
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
170
|
+
## Community
|
|
171
|
+
|
|
172
|
+
- [X: @LesliTech](https://x.com/LesliTech)
|
|
173
|
+
- [hello@lesli.tech](mailto:hello@lesli.tech)
|
|
174
|
+
- [https://www.lesli.tech](https://www.lesli.tech)
|
|
175
|
+
|
|
176
|
+
<br />
|
|
92
177
|
|
|
178
|
+
## License
|
|
93
179
|
|
|
94
|
-
### License
|
|
95
|
-
-------
|
|
96
180
|
Copyright (c) 2026, Lesli Technologies, S. A.
|
|
97
181
|
|
|
98
182
|
This program is free software: you can redistribute it and/or modify
|
|
@@ -106,19 +190,16 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
106
190
|
GNU General Public License for more details.
|
|
107
191
|
|
|
108
192
|
You should have received a copy of the GNU General Public License
|
|
109
|
-
along with this program. If not, see
|
|
193
|
+
along with this program. If not, see [https://www.gnu.org/licenses/](https://www.gnu.org/licenses/).
|
|
110
194
|
|
|
111
|
-
|
|
112
|
-
<hr />
|
|
113
|
-
<br />
|
|
114
|
-
<br />
|
|
195
|
+
The complete license text is available in the [license file](./license).
|
|
115
196
|
|
|
116
|
-
|
|
117
|
-
<img width="200" alt="Lesli logo" src="https://cdn.lesli.tech/lesli/brand/app-logo.svg" />
|
|
118
|
-
<h3 align="center" class="mt-0">
|
|
119
|
-
The Open-Source SaaS Development Framework for Ruby on Rails.
|
|
120
|
-
</h3>
|
|
121
|
-
</div>
|
|
197
|
+
---
|
|
122
198
|
|
|
123
199
|
<br />
|
|
124
200
|
<br />
|
|
201
|
+
|
|
202
|
+
<div align="center">
|
|
203
|
+
<img width="80" alt="Lesli icon" src="https://cdn.lesli.tech/lesli/brand/app-icon.svg" />
|
|
204
|
+
<h3 align="center">The Open-Source SaaS Development Framework for Ruby on Rails.</h3>
|
|
205
|
+
</div>
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lesli_calendar
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- The Lesli Development Team
|
|
@@ -15,14 +15,14 @@ dependencies:
|
|
|
15
15
|
requirements:
|
|
16
16
|
- - "~>"
|
|
17
17
|
- !ruby/object:Gem::Version
|
|
18
|
-
version:
|
|
18
|
+
version: 5.1.0
|
|
19
19
|
type: :runtime
|
|
20
20
|
prerelease: false
|
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
22
22
|
requirements:
|
|
23
23
|
- - "~>"
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
|
-
version:
|
|
25
|
+
version: 5.1.0
|
|
26
26
|
description: Unified calendar app for The Lesli Framework.
|
|
27
27
|
email:
|
|
28
28
|
- hello@lesli.tech
|
|
@@ -35,6 +35,7 @@ files:
|
|
|
35
35
|
- app/assets/images/lesli_calendar/calendar-logo.svg
|
|
36
36
|
- app/assets/javascripts/lesli_calendar/application.js
|
|
37
37
|
- app/assets/stylesheets/lesli_calendar/application.css
|
|
38
|
+
- app/assets/stylesheets/lesli_calendar/application.tailwind.css
|
|
38
39
|
- app/controllers/lesli_calendar/agendas_controller.rb
|
|
39
40
|
- app/controllers/lesli_calendar/application_controller.rb
|
|
40
41
|
- app/controllers/lesli_calendar/calendars_controller.rb
|
|
@@ -109,9 +110,6 @@ files:
|
|
|
109
110
|
- lib/lesli_calendar.rb
|
|
110
111
|
- lib/lesli_calendar/engine.rb
|
|
111
112
|
- lib/lesli_calendar/version.rb
|
|
112
|
-
- lib/scss/_agenda.scss
|
|
113
|
-
- lib/scss/_calendar.scss
|
|
114
|
-
- lib/scss/application.scss
|
|
115
113
|
- lib/tasks/lesli_calendar_tasks.rake
|
|
116
114
|
- license
|
|
117
115
|
- readme.md
|
data/lib/scss/_agenda.scss
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
|
|
3
|
-
Lesli
|
|
4
|
-
|
|
5
|
-
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
6
|
-
|
|
7
|
-
This program is free software: you can redistribute it and/or modify
|
|
8
|
-
it under the terms of the GNU General Public License as published by
|
|
9
|
-
the Free Software Foundation, either version 3 of the License, or
|
|
10
|
-
(at your option) any later version.
|
|
11
|
-
|
|
12
|
-
This program is distributed in the hope that it will be useful,
|
|
13
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
-
GNU General Public License for more details.
|
|
16
|
-
|
|
17
|
-
You should have received a copy of the GNU General Public License
|
|
18
|
-
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
|
-
|
|
20
|
-
Lesli · Ruby on Rails SaaS Development Framework.
|
|
21
|
-
|
|
22
|
-
Made with ♥ by https://www.lesli.tech
|
|
23
|
-
Building a better future, one line of code at a time.
|
|
24
|
-
|
|
25
|
-
@contact hello@lesli.tech
|
|
26
|
-
@website https://www.lesli.tech
|
|
27
|
-
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
|
-
|
|
29
|
-
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
-
// ·
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// ·
|
|
35
|
-
@import "Lesli/scss/templates/component";
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
// ·
|
|
39
|
-
$driver-color: #3689e6;
|
|
40
|
-
$focus-color: #28bca3;
|
|
41
|
-
$support-color: #a56de2;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
// ·
|
|
45
|
-
.lesli-calendar-agenda {
|
|
46
|
-
background-color: white;
|
|
47
|
-
|
|
48
|
-
h3 {
|
|
49
|
-
color: lesli-css-color(silver, 900);
|
|
50
|
-
padding: 14px 0;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
.event {
|
|
54
|
-
border-bottom: 1px solid lesli-css-color(silver, 300);
|
|
55
|
-
min-height: 100px;
|
|
56
|
-
|
|
57
|
-
.date {
|
|
58
|
-
flex: 0 0 70px;
|
|
59
|
-
text-align: center;
|
|
60
|
-
color: lesli-css-color(silver, 900);
|
|
61
|
-
|
|
62
|
-
.day-number {
|
|
63
|
-
font-weight: 700;
|
|
64
|
-
font-size: 1.2rem;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
.description {
|
|
69
|
-
line-height: 1.2;
|
|
70
|
-
font-size: 0.9rem;
|
|
71
|
-
|
|
72
|
-
p:nth-child(odd) {
|
|
73
|
-
margin: 0;
|
|
74
|
-
font-weight: 700;
|
|
75
|
-
font-size: 0.9rem;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
.lesli-calendar,
|
|
79
|
-
.lesli-support {
|
|
80
|
-
padding-top: 12px;
|
|
81
|
-
padding-left: 12px;
|
|
82
|
-
border-left: 4px solid lesli-css-color(silver);
|
|
83
|
-
&:last-child { padding-bottom: 14px; }
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
.lesli-calendar {
|
|
87
|
-
border-left-color: $driver-color;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
.lesli-support {
|
|
91
|
-
border-left-color: $support-color;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
.cloud-focus-tasks {
|
|
95
|
-
border-left-color: $focus-color;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
data/lib/scss/_calendar.scss
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
|
|
3
|
-
Lesli
|
|
4
|
-
|
|
5
|
-
Copyright (c) 2025, Lesli Technologies, S. A.
|
|
6
|
-
|
|
7
|
-
This program is free software: you can redistribute it and/or modify
|
|
8
|
-
it under the terms of the GNU General Public License as published by
|
|
9
|
-
the Free Software Foundation, either version 3 of the License, or
|
|
10
|
-
(at your option) any later version.
|
|
11
|
-
|
|
12
|
-
This program is distributed in the hope that it will be useful,
|
|
13
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
-
GNU General Public License for more details.
|
|
16
|
-
|
|
17
|
-
You should have received a copy of the GNU General Public License
|
|
18
|
-
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
|
-
|
|
20
|
-
Lesli · Ruby on Rails SaaS Development Framework.
|
|
21
|
-
|
|
22
|
-
Made with ♥ by LesliTech
|
|
23
|
-
Building a better future, one line of code at a time.
|
|
24
|
-
|
|
25
|
-
@contact hello@lesli.tech
|
|
26
|
-
@website https://www.lesli.tech
|
|
27
|
-
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
|
-
|
|
29
|
-
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
-
// ·
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// ·
|
|
35
|
-
@use "lesli-css" as lesli;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
// · Event colors
|
|
39
|
-
$lesli-calendar-color: #3689e6;
|
|
40
|
-
$lesli-support-color: #a56de2;
|
|
41
|
-
$lesli-tasks-color: #28bca3;
|
|
42
|
-
$border-grid: 6px solid var(--lesli-color-background);
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
// ·
|
|
46
|
-
body.lesli-calendar.calendars #lesli-calendar-engine {
|
|
47
|
-
|
|
48
|
-
.fc-scrollgrid {
|
|
49
|
-
|
|
50
|
-
// remove outside border of the calendar grid
|
|
51
|
-
border: none !important;
|
|
52
|
-
|
|
53
|
-
// remove the last right border for the header
|
|
54
|
-
th[role="presentation"] {
|
|
55
|
-
border: none;
|
|
56
|
-
border-bottom: $border-grid
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// calendar header (day names)
|
|
60
|
-
.fc-scrollgrid-section-header {
|
|
61
|
-
|
|
62
|
-
.fc-col-header-cell {
|
|
63
|
-
padding: .8rem 0;
|
|
64
|
-
text-align: center;
|
|
65
|
-
border-left-width: 0;
|
|
66
|
-
border-right-width: 0;
|
|
67
|
-
|
|
68
|
-
a {
|
|
69
|
-
font-family: "OpenSans";
|
|
70
|
-
font-weight: 600;
|
|
71
|
-
color: lesli.lesli-color(silver, 900)
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
.fc-scrollgrid-section-body {
|
|
77
|
-
|
|
78
|
-
.fc-day {
|
|
79
|
-
border: $border-grid
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// grid of days of the month
|
|
83
|
-
.fc-daygrid-day {
|
|
84
|
-
|
|
85
|
-
// Day number
|
|
86
|
-
.fc-daygrid-day-top .fc-daygrid-day-number {
|
|
87
|
-
padding: 5px 10px;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// change current day indicator
|
|
91
|
-
&.fc-day-today .fc-daygrid-day-top .fc-daygrid-day-number {
|
|
92
|
-
color: lesli.lesli-color(lesli, primary);
|
|
93
|
-
font-weight: 800;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// event in the calendar
|
|
97
|
-
.fc-daygrid-event {
|
|
98
|
-
border: none;
|
|
99
|
-
display: block;
|
|
100
|
-
border-left: 5px solid;
|
|
101
|
-
border-radius: 3px;
|
|
102
|
-
padding: .3rem;
|
|
103
|
-
overflow: hidden;
|
|
104
|
-
margin-bottom: .2rem;
|
|
105
|
-
|
|
106
|
-
.fc-event-title {
|
|
107
|
-
text-transform: capitalize;
|
|
108
|
-
font-family: "OpenSans";
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
.fc-event-time,
|
|
112
|
-
.fc-daygrid-event-dot { display: none !important; }
|
|
113
|
-
|
|
114
|
-
&.lesli-calendar {
|
|
115
|
-
border-left-color: $lesli-calendar-color;
|
|
116
|
-
background-color: lesli.lesli-color-lighten($lesli-calendar-color, 30);
|
|
117
|
-
.fc-event-title { color: lesli.lesli-color-darken($lesli-calendar-color, 30) }
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// ticket events
|
|
121
|
-
&.lesli-support {
|
|
122
|
-
border-left-color: $lesli-support-color;
|
|
123
|
-
background-color: lesli.lesli-color-lighten($lesli-support-color, 30);
|
|
124
|
-
.fc-event-title { color: lesli.lesli-color-darken($lesli-support-color, 30) }
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// focus events
|
|
128
|
-
&.lesli-tasks {
|
|
129
|
-
border-left-color: $lesli-tasks-color;
|
|
130
|
-
background-color: lesli.lesli-color-lighten($lesli-tasks-color, 30);
|
|
131
|
-
.fc-event-title { color: lesli.lesli-color-darken($lesli-tasks-color, 30) }
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
data/lib/scss/application.scss
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
Lesli
|
|
3
|
-
|
|
4
|
-
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
5
|
-
|
|
6
|
-
This program is free software: you can redistribute it and/or modify
|
|
7
|
-
it under the terms of the GNU General Public License as published by
|
|
8
|
-
the Free Software Foundation, either version 3 of the License, or
|
|
9
|
-
(at your option) any later version.
|
|
10
|
-
|
|
11
|
-
This program is distributed in the hope that it will be useful,
|
|
12
|
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
-
GNU General Public License for more details.
|
|
15
|
-
|
|
16
|
-
You should have received a copy of the GNU General Public License
|
|
17
|
-
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
18
|
-
|
|
19
|
-
Lesli · Ruby on Rails SaaS Development Framework.
|
|
20
|
-
|
|
21
|
-
Made with ♥ by https://www.lesli.tech
|
|
22
|
-
Building a better future, one line of code at a time.
|
|
23
|
-
|
|
24
|
-
@contact hello@lesli.tech
|
|
25
|
-
@website https://www.lesli.tech
|
|
26
|
-
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
27
|
-
|
|
28
|
-
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
29
|
-
// ·
|
|
30
|
-
*/
|
|
31
|
-
|
|
32
|
-
@use "calendar";
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
/*
|
|
36
|
-
body.lesli-calendar-calendar {
|
|
37
|
-
@import "./calendar.scss";
|
|
38
|
-
@import "./agenda.scss";
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
body.lesli-calendar-agenda {
|
|
42
|
-
@import "./agenda.scss";
|
|
43
|
-
}
|
|
44
|
-
*/
|