aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2020-07-27 00:06:31 +0200
committerHugo Hörnquist <hugo@lysator.liu.se>2020-07-27 00:06:31 +0200
commitc60b7b34759f866549752a97a83c12f04f8a903e (patch)
treea732b950e38036bf007b2ae694146ccf99638a1a
parentChange html-id to randomly generate. (diff)
downloadcalp-c60b7b34759f866549752a97a83c12f04f8a903e.tar.gz
calp-c60b7b34759f866549752a97a83c12f04f8a903e.tar.xz
Crash properly on overflow on remove event.
-rw-r--r--module/entry-points/server.scm6
-rw-r--r--module/vcomponent.scm29
-rw-r--r--static/script.js12
3 files changed, 26 insertions, 21 deletions
diff --git a/module/entry-points/server.scm b/module/entry-points/server.scm
index 711119e4..5c3108cc 100644
--- a/module/entry-points/server.scm
+++ b/module/entry-points/server.scm
@@ -117,12 +117,16 @@
;; It's hard to properly remove a file. I also want a way to undo accidental
;; deletions. Therefore I simply save the X-HNH-REMOVED flag to the file, and
;; then simple don't use those events when loading.
+ (catch 'stack-overflow (lambda () (remove-event it))
+ (lambda _
+ (display "It overflew...\n" (current-error-port))
+ (return (build-response code: 500)
+ "It overflew again...")))
(set! (prop it 'X-HNH-REMOVED) #t)
(set! (param (prop* it 'X-HNH-REMOVED) 'VALUE) "BOOLEAN")
(unless ((@ (output vdir) save-event) it)
(return (build-response code: 500)
"Saving event to disk failed."))
- (remove-event it)
(return (build-response code: 204) ""))
(return (build-response code: 400)
(format #f "No event with UID '~a'" uid))))
diff --git a/module/vcomponent.scm b/module/vcomponent.scm
index 215ab984..2e13f1c8 100644
--- a/module/vcomponent.scm
+++ b/module/vcomponent.scm
@@ -105,23 +105,22 @@
(define-public (remove-event event)
-
- (let ((events (getf 'events)))
- (setf 'events (delete event events)))
+ (let ((events (delete event (getf 'events))))
+ (setf 'events events))
(if (repeating? event)
- (let ((repeating (getf 'repeating-events)))
- (setf 'repeating-events (delete event repeating)))
- (let ((regular (getf 'fixed-events)))
- (setf 'fixed-events (delete event regular))))
-
- (let ((event-set (getf 'event-set)))
- (setf 'event-set
- (stream-remove
- (lambda (ev)
- (equal? (prop ev 'UID)
- (prop event 'UID)))
- event-set)))
+ (let ((repeating (delete event (getf 'repeating-events))))
+ (setf 'repeating-events repeating))
+ (let ((regular (delete event (getf 'fixed-events))))
+ (setf 'fixed-events regular)))
+
+ (let ((event-set
+ (stream-remove
+ (lambda (ev)
+ (equal? (prop ev 'UID)
+ (prop event 'UID)))
+ (getf 'event-set))))
+ (setf 'event-set event-set))
(hash-set! (getf 'uid-map) (prop event 'UID)
#f))
diff --git a/static/script.js b/static/script.js
index 0f0775fb..35e927f5 100644
--- a/static/script.js
+++ b/static/script.js
@@ -151,6 +151,7 @@ class EventCreator {
/* [0, 1) -- where are we in the container */
/* Ronud to force steps of quarters */
+ /* TODO possibly have floor_time instead */
let time = round_time(pos_in(this, e), round_to);
event.dataset.time1 = time;
@@ -246,13 +247,14 @@ async function remove_event (element) {
});
console.log(response);
+ toggle_child_popup(element);
+
if (response.status < 200 || response.status >= 300) {
- alert(`Error removing event ${response.status}\n${response.statusText}`)
+ let body = await response.text();
+ alert(`HTTP error ${response.status}\n${body}`)
+ } else {
+ element.remove();
}
-
- toggle_child_popup(element);
- element.style.background = "black !important";
- element.style.color = "black !important";
}
var bar_object = false