fnschool 20251011.80531.840__py3-none-any.whl → 20251011.81705.829__py3-none-any.whl

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.

Potentially problematic release.


This version of fnschool might be problematic. Click here for more details.

Files changed (117) hide show
  1. fnschoo1/__init__.py +2 -1
  2. fnschoo1/db.sqlite3 +0 -0
  3. fnschoo1/static/images/favicon.ico +0 -0
  4. {fnschool-20251011.80531.840.dist-info → fnschool-20251011.81705.829.dist-info}/METADATA +1 -1
  5. fnschool-20251011.81705.829.dist-info/RECORD +101 -0
  6. fnschoo1/static_collected/admin/css/autocomplete.css +0 -377
  7. fnschoo1/static_collected/admin/css/base.css +0 -1224
  8. fnschoo1/static_collected/admin/css/changelists.css +0 -334
  9. fnschoo1/static_collected/admin/css/dark_mode.css +0 -136
  10. fnschoo1/static_collected/admin/css/dashboard.css +0 -30
  11. fnschoo1/static_collected/admin/css/forms.css +0 -546
  12. fnschoo1/static_collected/admin/css/login.css +0 -62
  13. fnschoo1/static_collected/admin/css/nav_sidebar.css +0 -145
  14. fnschoo1/static_collected/admin/css/responsive.css +0 -1043
  15. fnschoo1/static_collected/admin/css/responsive_rtl.css +0 -84
  16. fnschoo1/static_collected/admin/css/rtl.css +0 -311
  17. fnschoo1/static_collected/admin/css/vendor/select2/select2.css +0 -708
  18. fnschoo1/static_collected/admin/css/vendor/select2/select2.min.css +0 -1
  19. fnschoo1/static_collected/admin/css/widgets.css +0 -639
  20. fnschoo1/static_collected/admin/js/SelectBox.js +0 -128
  21. fnschoo1/static_collected/admin/js/SelectFilter2.js +0 -503
  22. fnschoo1/static_collected/admin/js/actions.js +0 -232
  23. fnschoo1/static_collected/admin/js/admin/DateTimeShortcuts.js +0 -496
  24. fnschoo1/static_collected/admin/js/admin/RelatedObjectLookups.js +0 -276
  25. fnschoo1/static_collected/admin/js/autocomplete.js +0 -33
  26. fnschoo1/static_collected/admin/js/calendar.js +0 -251
  27. fnschoo1/static_collected/admin/js/cancel.js +0 -29
  28. fnschoo1/static_collected/admin/js/change_form.js +0 -21
  29. fnschoo1/static_collected/admin/js/collapse.js +0 -43
  30. fnschoo1/static_collected/admin/js/core.js +0 -174
  31. fnschoo1/static_collected/admin/js/filters.js +0 -37
  32. fnschoo1/static_collected/admin/js/inlines.js +0 -439
  33. fnschoo1/static_collected/admin/js/jquery.init.js +0 -8
  34. fnschoo1/static_collected/admin/js/nav_sidebar.js +0 -81
  35. fnschoo1/static_collected/admin/js/popup_response.js +0 -24
  36. fnschoo1/static_collected/admin/js/prepopulate.js +0 -43
  37. fnschoo1/static_collected/admin/js/prepopulate_init.js +0 -20
  38. fnschoo1/static_collected/admin/js/theme.js +0 -57
  39. fnschoo1/static_collected/admin/js/urlify.js +0 -529
  40. fnschoo1/static_collected/admin/js/vendor/jquery/jquery.js +0 -10913
  41. fnschoo1/static_collected/admin/js/vendor/jquery/jquery.min.js +0 -2
  42. fnschoo1/static_collected/admin/js/vendor/select2/i18n/af.js +0 -43
  43. fnschoo1/static_collected/admin/js/vendor/select2/i18n/ar.js +0 -36
  44. fnschoo1/static_collected/admin/js/vendor/select2/i18n/az.js +0 -33
  45. fnschoo1/static_collected/admin/js/vendor/select2/i18n/bg.js +0 -38
  46. fnschoo1/static_collected/admin/js/vendor/select2/i18n/bn.js +0 -39
  47. fnschoo1/static_collected/admin/js/vendor/select2/i18n/bs.js +0 -48
  48. fnschoo1/static_collected/admin/js/vendor/select2/i18n/ca.js +0 -41
  49. fnschoo1/static_collected/admin/js/vendor/select2/i18n/cs.js +0 -62
  50. fnschoo1/static_collected/admin/js/vendor/select2/i18n/da.js +0 -37
  51. fnschoo1/static_collected/admin/js/vendor/select2/i18n/de.js +0 -41
  52. fnschoo1/static_collected/admin/js/vendor/select2/i18n/dsb.js +0 -51
  53. fnschoo1/static_collected/admin/js/vendor/select2/i18n/el.js +0 -43
  54. fnschoo1/static_collected/admin/js/vendor/select2/i18n/en.js +0 -41
  55. fnschoo1/static_collected/admin/js/vendor/select2/i18n/es.js +0 -41
  56. fnschoo1/static_collected/admin/js/vendor/select2/i18n/et.js +0 -38
  57. fnschoo1/static_collected/admin/js/vendor/select2/i18n/eu.js +0 -45
  58. fnschoo1/static_collected/admin/js/vendor/select2/i18n/fa.js +0 -42
  59. fnschoo1/static_collected/admin/js/vendor/select2/i18n/fi.js +0 -42
  60. fnschoo1/static_collected/admin/js/vendor/select2/i18n/fr.js +0 -43
  61. fnschoo1/static_collected/admin/js/vendor/select2/i18n/gl.js +0 -40
  62. fnschoo1/static_collected/admin/js/vendor/select2/i18n/he.js +0 -44
  63. fnschoo1/static_collected/admin/js/vendor/select2/i18n/hi.js +0 -40
  64. fnschoo1/static_collected/admin/js/vendor/select2/i18n/hr.js +0 -45
  65. fnschoo1/static_collected/admin/js/vendor/select2/i18n/hsb.js +0 -51
  66. fnschoo1/static_collected/admin/js/vendor/select2/i18n/hu.js +0 -44
  67. fnschoo1/static_collected/admin/js/vendor/select2/i18n/hy.js +0 -40
  68. fnschoo1/static_collected/admin/js/vendor/select2/i18n/id.js +0 -36
  69. fnschoo1/static_collected/admin/js/vendor/select2/i18n/is.js +0 -37
  70. fnschoo1/static_collected/admin/js/vendor/select2/i18n/it.js +0 -43
  71. fnschoo1/static_collected/admin/js/vendor/select2/i18n/ja.js +0 -40
  72. fnschoo1/static_collected/admin/js/vendor/select2/i18n/ka.js +0 -42
  73. fnschoo1/static_collected/admin/js/vendor/select2/i18n/km.js +0 -38
  74. fnschoo1/static_collected/admin/js/vendor/select2/i18n/ko.js +0 -42
  75. fnschoo1/static_collected/admin/js/vendor/select2/i18n/lt.js +0 -45
  76. fnschoo1/static_collected/admin/js/vendor/select2/i18n/lv.js +0 -41
  77. fnschoo1/static_collected/admin/js/vendor/select2/i18n/mk.js +0 -42
  78. fnschoo1/static_collected/admin/js/vendor/select2/i18n/ms.js +0 -38
  79. fnschoo1/static_collected/admin/js/vendor/select2/i18n/nb.js +0 -38
  80. fnschoo1/static_collected/admin/js/vendor/select2/i18n/ne.js +0 -44
  81. fnschoo1/static_collected/admin/js/vendor/select2/i18n/nl.js +0 -46
  82. fnschoo1/static_collected/admin/js/vendor/select2/i18n/pl.js +0 -43
  83. fnschoo1/static_collected/admin/js/vendor/select2/i18n/ps.js +0 -41
  84. fnschoo1/static_collected/admin/js/vendor/select2/i18n/pt-BR.js +0 -39
  85. fnschoo1/static_collected/admin/js/vendor/select2/i18n/pt.js +0 -41
  86. fnschoo1/static_collected/admin/js/vendor/select2/i18n/ro.js +0 -43
  87. fnschoo1/static_collected/admin/js/vendor/select2/i18n/ru.js +0 -48
  88. fnschoo1/static_collected/admin/js/vendor/select2/i18n/sk.js +0 -61
  89. fnschoo1/static_collected/admin/js/vendor/select2/i18n/sl.js +0 -41
  90. fnschoo1/static_collected/admin/js/vendor/select2/i18n/sq.js +0 -43
  91. fnschoo1/static_collected/admin/js/vendor/select2/i18n/sr-Cyrl.js +0 -48
  92. fnschoo1/static_collected/admin/js/vendor/select2/i18n/sr.js +0 -48
  93. fnschoo1/static_collected/admin/js/vendor/select2/i18n/sv.js +0 -40
  94. fnschoo1/static_collected/admin/js/vendor/select2/i18n/th.js +0 -36
  95. fnschoo1/static_collected/admin/js/vendor/select2/i18n/tk.js +0 -36
  96. fnschoo1/static_collected/admin/js/vendor/select2/i18n/tr.js +0 -40
  97. fnschoo1/static_collected/admin/js/vendor/select2/i18n/uk.js +0 -59
  98. fnschoo1/static_collected/admin/js/vendor/select2/i18n/vi.js +0 -37
  99. fnschoo1/static_collected/admin/js/vendor/select2/i18n/zh-CN.js +0 -36
  100. fnschoo1/static_collected/admin/js/vendor/select2/i18n/zh-TW.js +0 -33
  101. fnschoo1/static_collected/admin/js/vendor/select2/select2.full.js +0 -7115
  102. fnschoo1/static_collected/admin/js/vendor/select2/select2.full.min.js +0 -2
  103. fnschoo1/static_collected/admin/js/vendor/xregexp/xregexp.js +0 -4993
  104. fnschoo1/static_collected/admin/js/vendor/xregexp/xregexp.min.js +0 -160
  105. fnschoo1/static_collected/css/bootstrap.min.css +0 -11776
  106. fnschoo1/static_collected/css/fnschool.css +0 -26
  107. fnschoo1/static_collected/js/bootstrap.bundle.min.js +0 -4223
  108. fnschoo1/static_collected/js/bootstrap.min.js +0 -2919
  109. fnschoo1/static_collected/js/fnschool.js +0 -84
  110. fnschoo1/static_collected/js/jquery.min.js +0 -5413
  111. fnschoo1/static_collected/js/jquery.slim.min.js +0 -4331
  112. fnschoo1/static_collected/js/popper.min.js +0 -1306
  113. fnschool-20251011.80531.840.dist-info/RECORD +0 -207
  114. {fnschool-20251011.80531.840.dist-info → fnschool-20251011.81705.829.dist-info}/WHEEL +0 -0
  115. {fnschool-20251011.80531.840.dist-info → fnschool-20251011.81705.829.dist-info}/entry_points.txt +0 -0
  116. {fnschool-20251011.80531.840.dist-info → fnschool-20251011.81705.829.dist-info}/licenses/LICENSE +0 -0
  117. {fnschool-20251011.80531.840.dist-info → fnschool-20251011.81705.829.dist-info}/top_level.txt +0 -0
@@ -1,496 +0,0 @@
1
- /*global Calendar, findPosX, findPosY, get_format, gettext, gettext_noop, interpolate, ngettext, quickElement*/
2
- // Inserts shortcut buttons after all of the following:
3
- // <input type="text" class="vDateField">
4
- // <input type="text" class="vTimeField">
5
- 'use strict'
6
- {
7
- const DateTimeShortcuts = {
8
- calendars: [],
9
- calendarInputs: [],
10
- clockInputs: [],
11
- clockHours: {
12
- default_: [
13
- [gettext_noop('Now'), -1],
14
- [gettext_noop('Midnight'), 0],
15
- [gettext_noop('6 a.m.'), 6],
16
- [gettext_noop('Noon'), 12],
17
- [gettext_noop('6 p.m.'), 18],
18
- ],
19
- },
20
- dismissClockFunc: [],
21
- dismissCalendarFunc: [],
22
- calendarDivName1: 'calendarbox', // name of calendar <div> that gets toggled
23
- calendarDivName2: 'calendarin', // name of <div> that contains calendar
24
- calendarLinkName: 'calendarlink', // name of the link that is used to toggle
25
- clockDivName: 'clockbox', // name of clock <div> that gets toggled
26
- clockLinkName: 'clocklink', // name of the link that is used to toggle
27
- shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts
28
- timezoneWarningClass: 'timezonewarning', // class of the warning for timezone mismatch
29
- timezoneOffset: 0,
30
- init: function () {
31
- const serverOffset = document.body.dataset.adminUtcOffset
32
- if (serverOffset) {
33
- const localOffset = new Date().getTimezoneOffset() * -60
34
- DateTimeShortcuts.timezoneOffset = localOffset - serverOffset
35
- }
36
-
37
- for (const inp of document.getElementsByTagName('input')) {
38
- if (inp.type === 'text' && inp.classList.contains('vTimeField')) {
39
- DateTimeShortcuts.addClock(inp)
40
- DateTimeShortcuts.addTimezoneWarning(inp)
41
- } else if (
42
- inp.type === 'text' &&
43
- inp.classList.contains('vDateField')
44
- ) {
45
- DateTimeShortcuts.addCalendar(inp)
46
- DateTimeShortcuts.addTimezoneWarning(inp)
47
- }
48
- }
49
- },
50
- // Return the current time while accounting for the server timezone.
51
- now: function () {
52
- const serverOffset = document.body.dataset.adminUtcOffset
53
- if (serverOffset) {
54
- const localNow = new Date()
55
- const localOffset = localNow.getTimezoneOffset() * -60
56
- localNow.setTime(
57
- localNow.getTime() + 1000 * (serverOffset - localOffset)
58
- )
59
- return localNow
60
- } else {
61
- return new Date()
62
- }
63
- },
64
- // Add a warning when the time zone in the browser and backend do not match.
65
- addTimezoneWarning: function (inp) {
66
- const warningClass = DateTimeShortcuts.timezoneWarningClass
67
- let timezoneOffset = DateTimeShortcuts.timezoneOffset / 3600
68
-
69
- // Only warn if there is a time zone mismatch.
70
- if (!timezoneOffset) {
71
- return
72
- }
73
-
74
- // Check if warning is already there.
75
- if (inp.parentNode.querySelectorAll('.' + warningClass).length) {
76
- return
77
- }
78
-
79
- let message
80
- if (timezoneOffset > 0) {
81
- message = ngettext(
82
- 'Note: You are %s hour ahead of server time.',
83
- 'Note: You are %s hours ahead of server time.',
84
- timezoneOffset
85
- )
86
- } else {
87
- timezoneOffset *= -1
88
- message = ngettext(
89
- 'Note: You are %s hour behind server time.',
90
- 'Note: You are %s hours behind server time.',
91
- timezoneOffset
92
- )
93
- }
94
- message = interpolate(message, [timezoneOffset])
95
-
96
- const warning = document.createElement('div')
97
- warning.classList.add('help', warningClass)
98
- warning.textContent = message
99
- inp.parentNode.appendChild(warning)
100
- },
101
- // Add clock widget to a given field
102
- addClock: function (inp) {
103
- const num = DateTimeShortcuts.clockInputs.length
104
- DateTimeShortcuts.clockInputs[num] = inp
105
- DateTimeShortcuts.dismissClockFunc[num] = function () {
106
- DateTimeShortcuts.dismissClock(num)
107
- return true
108
- }
109
-
110
- // Shortcut links (clock icon and "Now" link)
111
- const shortcuts_span = document.createElement('span')
112
- shortcuts_span.className = DateTimeShortcuts.shortCutsClass
113
- inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling)
114
- const now_link = document.createElement('a')
115
- now_link.href = '#'
116
- now_link.textContent = gettext('Now')
117
- now_link.addEventListener('click', function (e) {
118
- e.preventDefault()
119
- DateTimeShortcuts.handleClockQuicklink(num, -1)
120
- })
121
- const clock_link = document.createElement('a')
122
- clock_link.href = '#'
123
- clock_link.id = DateTimeShortcuts.clockLinkName + num
124
- clock_link.addEventListener('click', function (e) {
125
- e.preventDefault()
126
- // avoid triggering the document click handler to dismiss the clock
127
- e.stopPropagation()
128
- DateTimeShortcuts.openClock(num)
129
- })
130
-
131
- quickElement(
132
- 'span',
133
- clock_link,
134
- '',
135
- 'class',
136
- 'clock-icon',
137
- 'title',
138
- gettext('Choose a Time')
139
- )
140
- shortcuts_span.appendChild(document.createTextNode('\u00A0'))
141
- shortcuts_span.appendChild(now_link)
142
- shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0'))
143
- shortcuts_span.appendChild(clock_link)
144
-
145
- // Create clock link div
146
- //
147
- // Markup looks like:
148
- // <div id="clockbox1" class="clockbox module">
149
- // <h2>Choose a time</h2>
150
- // <ul class="timelist">
151
- // <li><a href="#">Now</a></li>
152
- // <li><a href="#">Midnight</a></li>
153
- // <li><a href="#">6 a.m.</a></li>
154
- // <li><a href="#">Noon</a></li>
155
- // <li><a href="#">6 p.m.</a></li>
156
- // </ul>
157
- // <p class="calendar-cancel"><a href="#">Cancel</a></p>
158
- // </div>
159
-
160
- const clock_box = document.createElement('div')
161
- clock_box.style.display = 'none'
162
- clock_box.style.position = 'absolute'
163
- clock_box.className = 'clockbox module'
164
- clock_box.id = DateTimeShortcuts.clockDivName + num
165
- document.body.appendChild(clock_box)
166
- clock_box.addEventListener('click', function (e) {
167
- e.stopPropagation()
168
- })
169
-
170
- quickElement('h2', clock_box, gettext('Choose a time'))
171
- const time_list = quickElement('ul', clock_box)
172
- time_list.className = 'timelist'
173
- // The list of choices can be overridden in JavaScript like this:
174
- // DateTimeShortcuts.clockHours.name = [['3 a.m.', 3]];
175
- // where name is the name attribute of the <input>.
176
- const name =
177
- typeof DateTimeShortcuts.clockHours[inp.name] === 'undefined'
178
- ? 'default_'
179
- : inp.name
180
- DateTimeShortcuts.clockHours[name].forEach(function (element) {
181
- const time_link = quickElement(
182
- 'a',
183
- quickElement('li', time_list),
184
- gettext(element[0]),
185
- 'href',
186
- '#'
187
- )
188
- time_link.addEventListener('click', function (e) {
189
- e.preventDefault()
190
- DateTimeShortcuts.handleClockQuicklink(num, element[1])
191
- })
192
- })
193
-
194
- const cancel_p = quickElement('p', clock_box)
195
- cancel_p.className = 'calendar-cancel'
196
- const cancel_link = quickElement(
197
- 'a',
198
- cancel_p,
199
- gettext('Cancel'),
200
- 'href',
201
- '#'
202
- )
203
- cancel_link.addEventListener('click', function (e) {
204
- e.preventDefault()
205
- DateTimeShortcuts.dismissClock(num)
206
- })
207
-
208
- document.addEventListener('keyup', function (event) {
209
- if (event.which === 27) {
210
- // ESC key closes popup
211
- DateTimeShortcuts.dismissClock(num)
212
- event.preventDefault()
213
- }
214
- })
215
- },
216
- openClock: function (num) {
217
- const clock_box = document.getElementById(
218
- DateTimeShortcuts.clockDivName + num
219
- )
220
- const clock_link = document.getElementById(
221
- DateTimeShortcuts.clockLinkName + num
222
- )
223
-
224
- // Recalculate the clockbox position
225
- // is it left-to-right or right-to-left layout ?
226
- if (window.getComputedStyle(document.body).direction !== 'rtl') {
227
- clock_box.style.left = findPosX(clock_link) + 17 + 'px'
228
- } else {
229
- // since style's width is in em, it'd be tough to calculate
230
- // px value of it. let's use an estimated px for now
231
- clock_box.style.left = findPosX(clock_link) - 110 + 'px'
232
- }
233
- clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px'
234
-
235
- // Show the clock box
236
- clock_box.style.display = 'block'
237
- document.addEventListener(
238
- 'click',
239
- DateTimeShortcuts.dismissClockFunc[num]
240
- )
241
- },
242
- dismissClock: function (num) {
243
- document.getElementById(
244
- DateTimeShortcuts.clockDivName + num
245
- ).style.display = 'none'
246
- document.removeEventListener(
247
- 'click',
248
- DateTimeShortcuts.dismissClockFunc[num]
249
- )
250
- },
251
- handleClockQuicklink: function (num, val) {
252
- let d
253
- if (val === -1) {
254
- d = DateTimeShortcuts.now()
255
- } else {
256
- d = new Date(1970, 1, 1, val, 0, 0, 0)
257
- }
258
- DateTimeShortcuts.clockInputs[num].value = d.strftime(
259
- get_format('TIME_INPUT_FORMATS')[0]
260
- )
261
- DateTimeShortcuts.clockInputs[num].focus()
262
- DateTimeShortcuts.dismissClock(num)
263
- },
264
- // Add calendar widget to a given field.
265
- addCalendar: function (inp) {
266
- const num = DateTimeShortcuts.calendars.length
267
-
268
- DateTimeShortcuts.calendarInputs[num] = inp
269
- DateTimeShortcuts.dismissCalendarFunc[num] = function () {
270
- DateTimeShortcuts.dismissCalendar(num)
271
- return true
272
- }
273
-
274
- // Shortcut links (calendar icon and "Today" link)
275
- const shortcuts_span = document.createElement('span')
276
- shortcuts_span.className = DateTimeShortcuts.shortCutsClass
277
- inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling)
278
- const today_link = document.createElement('a')
279
- today_link.href = '#'
280
- today_link.appendChild(document.createTextNode(gettext('Today')))
281
- today_link.addEventListener('click', function (e) {
282
- e.preventDefault()
283
- DateTimeShortcuts.handleCalendarQuickLink(num, 0)
284
- })
285
- const cal_link = document.createElement('a')
286
- cal_link.href = '#'
287
- cal_link.id = DateTimeShortcuts.calendarLinkName + num
288
- cal_link.addEventListener('click', function (e) {
289
- e.preventDefault()
290
- // avoid triggering the document click handler to dismiss the calendar
291
- e.stopPropagation()
292
- DateTimeShortcuts.openCalendar(num)
293
- })
294
- quickElement(
295
- 'span',
296
- cal_link,
297
- '',
298
- 'class',
299
- 'date-icon',
300
- 'title',
301
- gettext('Choose a Date')
302
- )
303
- shortcuts_span.appendChild(document.createTextNode('\u00A0'))
304
- shortcuts_span.appendChild(today_link)
305
- shortcuts_span.appendChild(document.createTextNode('\u00A0|\u00A0'))
306
- shortcuts_span.appendChild(cal_link)
307
-
308
- // Create calendarbox div.
309
- //
310
- // Markup looks like:
311
- //
312
- // <div id="calendarbox3" class="calendarbox module">
313
- // <h2>
314
- // <a href="#" class="link-previous">&lsaquo;</a>
315
- // <a href="#" class="link-next">&rsaquo;</a> February 2003
316
- // </h2>
317
- // <div class="calendar" id="calendarin3">
318
- // <!-- (cal) -->
319
- // </div>
320
- // <div class="calendar-shortcuts">
321
- // <a href="#">Yesterday</a> | <a href="#">Today</a> | <a href="#">Tomorrow</a>
322
- // </div>
323
- // <p class="calendar-cancel"><a href="#">Cancel</a></p>
324
- // </div>
325
- const cal_box = document.createElement('div')
326
- cal_box.style.display = 'none'
327
- cal_box.style.position = 'absolute'
328
- cal_box.className = 'calendarbox module'
329
- cal_box.id = DateTimeShortcuts.calendarDivName1 + num
330
- document.body.appendChild(cal_box)
331
- cal_box.addEventListener('click', function (e) {
332
- e.stopPropagation()
333
- })
334
-
335
- // next-prev links
336
- const cal_nav = quickElement('div', cal_box)
337
- const cal_nav_prev = quickElement('a', cal_nav, '<', 'href', '#')
338
- cal_nav_prev.className = 'calendarnav-previous'
339
- cal_nav_prev.addEventListener('click', function (e) {
340
- e.preventDefault()
341
- DateTimeShortcuts.drawPrev(num)
342
- })
343
-
344
- const cal_nav_next = quickElement('a', cal_nav, '>', 'href', '#')
345
- cal_nav_next.className = 'calendarnav-next'
346
- cal_nav_next.addEventListener('click', function (e) {
347
- e.preventDefault()
348
- DateTimeShortcuts.drawNext(num)
349
- })
350
-
351
- // main box
352
- const cal_main = quickElement(
353
- 'div',
354
- cal_box,
355
- '',
356
- 'id',
357
- DateTimeShortcuts.calendarDivName2 + num
358
- )
359
- cal_main.className = 'calendar'
360
- DateTimeShortcuts.calendars[num] = new Calendar(
361
- DateTimeShortcuts.calendarDivName2 + num,
362
- DateTimeShortcuts.handleCalendarCallback(num)
363
- )
364
- DateTimeShortcuts.calendars[num].drawCurrent()
365
-
366
- // calendar shortcuts
367
- const shortcuts = quickElement('div', cal_box)
368
- shortcuts.className = 'calendar-shortcuts'
369
- let day_link = quickElement(
370
- 'a',
371
- shortcuts,
372
- gettext('Yesterday'),
373
- 'href',
374
- '#'
375
- )
376
- day_link.addEventListener('click', function (e) {
377
- e.preventDefault()
378
- DateTimeShortcuts.handleCalendarQuickLink(num, -1)
379
- })
380
- shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0'))
381
- day_link = quickElement('a', shortcuts, gettext('Today'), 'href', '#')
382
- day_link.addEventListener('click', function (e) {
383
- e.preventDefault()
384
- DateTimeShortcuts.handleCalendarQuickLink(num, 0)
385
- })
386
- shortcuts.appendChild(document.createTextNode('\u00A0|\u00A0'))
387
- day_link = quickElement('a', shortcuts, gettext('Tomorrow'), 'href', '#')
388
- day_link.addEventListener('click', function (e) {
389
- e.preventDefault()
390
- DateTimeShortcuts.handleCalendarQuickLink(num, +1)
391
- })
392
-
393
- // cancel bar
394
- const cancel_p = quickElement('p', cal_box)
395
- cancel_p.className = 'calendar-cancel'
396
- const cancel_link = quickElement(
397
- 'a',
398
- cancel_p,
399
- gettext('Cancel'),
400
- 'href',
401
- '#'
402
- )
403
- cancel_link.addEventListener('click', function (e) {
404
- e.preventDefault()
405
- DateTimeShortcuts.dismissCalendar(num)
406
- })
407
- document.addEventListener('keyup', function (event) {
408
- if (event.which === 27) {
409
- // ESC key closes popup
410
- DateTimeShortcuts.dismissCalendar(num)
411
- event.preventDefault()
412
- }
413
- })
414
- },
415
- openCalendar: function (num) {
416
- const cal_box = document.getElementById(
417
- DateTimeShortcuts.calendarDivName1 + num
418
- )
419
- const cal_link = document.getElementById(
420
- DateTimeShortcuts.calendarLinkName + num
421
- )
422
- const inp = DateTimeShortcuts.calendarInputs[num]
423
-
424
- // Determine if the current value in the input has a valid date.
425
- // If so, draw the calendar with that date's year and month.
426
- if (inp.value) {
427
- const format = get_format('DATE_INPUT_FORMATS')[0]
428
- const selected = inp.value.strptime(format)
429
- const year = selected.getUTCFullYear()
430
- const month = selected.getUTCMonth() + 1
431
- const re = /\d{4}/
432
- if (re.test(year.toString()) && month >= 1 && month <= 12) {
433
- DateTimeShortcuts.calendars[num].drawDate(month, year, selected)
434
- }
435
- }
436
-
437
- // Recalculate the clockbox position
438
- // is it left-to-right or right-to-left layout ?
439
- if (window.getComputedStyle(document.body).direction !== 'rtl') {
440
- cal_box.style.left = findPosX(cal_link) + 17 + 'px'
441
- } else {
442
- // since style's width is in em, it'd be tough to calculate
443
- // px value of it. let's use an estimated px for now
444
- cal_box.style.left = findPosX(cal_link) - 180 + 'px'
445
- }
446
- cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px'
447
-
448
- cal_box.style.display = 'block'
449
- document.addEventListener(
450
- 'click',
451
- DateTimeShortcuts.dismissCalendarFunc[num]
452
- )
453
- },
454
- dismissCalendar: function (num) {
455
- document.getElementById(
456
- DateTimeShortcuts.calendarDivName1 + num
457
- ).style.display = 'none'
458
- document.removeEventListener(
459
- 'click',
460
- DateTimeShortcuts.dismissCalendarFunc[num]
461
- )
462
- },
463
- drawPrev: function (num) {
464
- DateTimeShortcuts.calendars[num].drawPreviousMonth()
465
- },
466
- drawNext: function (num) {
467
- DateTimeShortcuts.calendars[num].drawNextMonth()
468
- },
469
- handleCalendarCallback: function (num) {
470
- const format = get_format('DATE_INPUT_FORMATS')[0]
471
- return function (y, m, d) {
472
- DateTimeShortcuts.calendarInputs[num].value = new Date(
473
- y,
474
- m - 1,
475
- d
476
- ).strftime(format)
477
- DateTimeShortcuts.calendarInputs[num].focus()
478
- document.getElementById(
479
- DateTimeShortcuts.calendarDivName1 + num
480
- ).style.display = 'none'
481
- }
482
- },
483
- handleCalendarQuickLink: function (num, offset) {
484
- const d = DateTimeShortcuts.now()
485
- d.setDate(d.getDate() + offset)
486
- DateTimeShortcuts.calendarInputs[num].value = d.strftime(
487
- get_format('DATE_INPUT_FORMATS')[0]
488
- )
489
- DateTimeShortcuts.calendarInputs[num].focus()
490
- DateTimeShortcuts.dismissCalendar(num)
491
- },
492
- }
493
-
494
- window.addEventListener('load', DateTimeShortcuts.init)
495
- window.DateTimeShortcuts = DateTimeShortcuts
496
- }