1 // This module handles the view for "calendar" rooms.
3 // Copyright (c) 2016-2024 by the citadel.org team
5 // This program is open source software. Use, duplication, or
6 // disclosure is subject to the GNU General Public License v3.
9 function XXXXXview_render_calendar() {
14 "Content-Type" : "application/xml; charset=utf-8"
17 <CAL:calendar-query xmlns="DAV:" xmlns:CAL="urn:ietf:params:xml:ns:caldav">
20 <CAL:comp-filter name="VCALENDAR">
21 <CAL:comp-filter name="VEVENT" />
28 fetch("/ctdl/r/" + escapeHTMLURI(current_room), options)
31 return(response.text());
34 throw new Error(`${response.status} ${response.statusText}`);
37 //.then(str => document.getElementById("ctdl-main").innerHTML = escapeHTML(str))
38 .then(str => new window.DOMParser().parseFromString(str, "text/xml"))
40 document.getElementById("ctdl-main").innerHTML = "calendar items:<br>";
41 let root = xmlcal.documentElement;
42 let children = root.childNodes;
43 for (let i=0; i<children.length; ++i) {
44 let child = children[i];
45 if (child.nodeType == Node.ELEMENT_NODE) {
46 var getetag_e = child.getElementsByTagName("DAV:href")[0];
47 var getetag_s = getetag_e.textContent;
48 document.getElementById("ctdl-main").innerHTML += getetag_s + "<br>";
55 document.getElementById("ctdl-main").innerHTML = `<div class="ctdl-fatal-error">${error}</div>`;
59 var date_being_displayed = new Date();
60 var days_being_displayed = 7; /* 1 = day view; 5 = work week view; 7 = week view */
61 var start_of_week = 1; /* 0 = Sunday; 1 = Monday */
63 // Update the calendar display (we might have changed dates, or added/removed data)
64 function update_calendar_display() {
66 // Clone the "date_being_displayed" and scope it locally for this function.
67 let this_column_date = new Date(date_being_displayed);
69 // If displaying a whole week, start the week on the correct day of the week (usually Sunday or Monday)
70 if (days_being_displayed == 7) {
71 while (this_column_date.getDay() != start_of_week) {
72 this_column_date.setDate(this_column_date.getDate() - 1);
76 // If displaying a work week, start the week on Monday
77 if (days_being_displayed == 5) {
78 while (this_column_date.getDay() != 1) {
79 this_column_date.setDate(this_column_date.getDate() - 1);
83 // Go through every day on the screen (up to a week I guess)
84 for (let i=0; i<days_being_displayed; ++i) {
86 // Populate the columns
87 let year = this_column_date.getFullYear();
88 let month = this_column_date.getMonth() + 1;
89 let day_of_month = this_column_date.getDate();
90 let weekday = this_column_date.toLocaleString("default", { weekday: "short" })
91 let monthname = this_column_date.toLocaleString("default", { month: "short" })
92 document.getElementById("ctdl-cal-label" + i).innerHTML = weekday + " " + year + "-" + monthname + "-" + day_of_month;
93 document.getElementById("ctdl-cal-day" + i).innerHTML = "This is the content for " + this_column_date;
95 // Get ready for the next column
96 this_column_date.setDate(this_column_date.getDate() + 1);
101 // Set the week view to 1-day (day), 3-day, 5-day (work week), or 7-day (week).
102 // Any value is possible but the above are ones which seem to make sense.
103 // You could for example do 14 for a "two week view" but it would start to look compressed.
104 function set_week_days(days) {
105 days_being_displayed = days;
106 view_render_calendar();
110 // Go back by one year.
111 function go_back_one_year() {
112 date_being_displayed.setYear(date_being_displayed.getFullYear() - 1 );
113 update_calendar_display();
117 // Go back by one month.
118 function go_back_one_month() {
119 date_being_displayed.setMonth(date_being_displayed.getMonth() - 1 );
120 update_calendar_display();
124 // Go back by one week.
125 function go_back_one_week() {
126 date_being_displayed.setDate(date_being_displayed.getDate() - 7 );
127 update_calendar_display();
131 // Go back by one day.
132 function go_back_one_day() {
133 date_being_displayed.setDate(date_being_displayed.getDate() - 1);
134 update_calendar_display();
138 // Flip the calendar to today's date.
139 function go_to_today() {
140 date_being_displayed = new Date();
141 update_calendar_display();
145 // Advance the calendar by one day.
146 function go_forward_one_day() {
147 date_being_displayed.setDate(date_being_displayed.getDate() + 1);
148 update_calendar_display();
152 // Advance the calendar by one week.
153 function go_forward_one_week() {
154 date_being_displayed.setDate(date_being_displayed.getDate() + 7);
155 update_calendar_display();
159 // Advance the calendar by one month.
160 function go_forward_one_month() {
161 date_being_displayed.setMonth(date_being_displayed.getMonth() + 1 );
162 update_calendar_display();
166 // Advance the calendar by one year.
167 function go_forward_one_year() {
168 date_being_displayed.setYear(date_being_displayed.getFullYear() + 1 );
169 update_calendar_display();
173 // RENDERER FOR THIS VIEW
174 function view_render_calendar() {
176 // These are TEMPORARY navigation buttons.
177 document.getElementById("ctdl-calendar-nav").innerHTML = `
178 <a href="javascript:set_week_days(1);">Day</a> |
179 <a href="javascript:set_week_days(3);">3-Day</a> |
180 <a href="javascript:set_week_days(5);">WorkWeek</a> |
181 <a href="javascript:set_week_days(7);">Week</a> |
182 <a href="javascript:go_back_one_year();">←Y</a> |
183 <a href="javascript:go_back_one_month();">←M</a> |
184 <a href="javascript:go_back_one_week();">←W</a> |
185 <a href="javascript:go_back_one_day();">←D</a> |
186 <a href="javascript:go_to_today();">today</a> |
187 <a href="javascript:go_forward_one_day();">D→</a> |
188 <a href="javascript:go_forward_one_week();">W→</a> |
189 <a href="javascript:go_forward_one_month();">M→</a> |
190 <a href="javascript:go_forward_one_year();">Y→</a>
192 document.getElementById("ctdl-calendar-nav").style.display = "block";
195 caldisplay += `<div class="ctdl-calendar-container">`; // top level container
196 caldisplay += `<div class="ctdl-calendar-toplabels">`; // the row of labels above the calendar content
198 // This section renders the day labels at the top of the screen
199 caldisplay += `<div class="ctdl-calendar-week">`; // container for ruler+days
200 caldisplay += `<div class="ctdl-calendar-ruler">`; // the hours ruler on the left side of the screen
201 caldisplay += "</div>"; // closes ctdl-calendar-ruler
202 for (let i=0; i<days_being_displayed; ++i) {
203 caldisplay += `<div id="ctdl-cal-label` + i + `" class="ctdl-calendar-label">Hi!</div>`;
205 caldisplay += "</div>"; // closes ctdl-calendar-week
207 caldisplay += `</div>`; // closes ctdl-calendar-toplabels
208 caldisplay += `<div class="ctdl-calendar-content">`; // the actual boxes of content below the labels
209 caldisplay += `<div class="ctdl-calendar-week">`; // container for ruler+days
210 caldisplay += `<div class="ctdl-calendar-ruler">`; // the hours ruler on the left side of the screen
211 for (let i=0; i<24; ++i) {
212 caldisplay += i + "<br>";
214 caldisplay += `</div>`; // closes ctdl-calendar-ruler
216 // This section renders the day boxes.
217 for (let i=0; i<days_being_displayed; ++i) {
218 caldisplay += `<div id="ctdl-cal-day` + i + `" class="ctdl-calendar-day">Hi!</div>`;
220 caldisplay += "</div>"; // closes ctdl-calendar-week
221 caldisplay += "</div>"; // closes ctdl-calendar-content
222 caldisplay += "</div>"; // closes ctdl-calendar-container
223 document.getElementById("ctdl-main").innerHTML = caldisplay;