diff of 8be00fbec7e04eaf04cad595cfdad8a584ddd5c0
8be00fbec7e04eaf04cad595cfdad8a584ddd5c0
diff --git a/src/models/tab.lisp b/src/models/tab.lisp
index 03335fd..2d08f7c 100644
--- a/src/models/tab.lisp
+++ b/src/models/tab.lisp
@@ -1,6 +1,6 @@
(defpackage murja.models.tab
(:use :cl)
- (:export :tab :tab-route :tab-component :title :require-login :abilities))
+ (:export :subtab :tab :tab-route :tab-component :title :require-login :abilities))
(in-package :murja.models.tab)
@@ -9,4 +9,5 @@
(component :initarg :component :initform (error "Component needed") :accessor tab-component)
(title :initarg :title :initform (error "Title needed") :accessor title)
(require-login :initarg :require-login :initform nil :accessor require-login)
- (needed-abilities :initarg :abilities :initform nil :accessor abilities)))
+ (needed-abilities :initarg :abilities :initform nil :accessor abilities)
+ (subtab :initarg :subtab :initform nil :accessor subtab)))
diff --git a/src/views/components/tab.lisp b/src/views/components/tab.lisp
index 6683522..77eed66 100644
--- a/src/views/components/tab.lisp
+++ b/src/views/components/tab.lisp
@@ -8,7 +8,7 @@
(defvar *selected-tab* nil)
-(defun tabs (firstly-selected-title tablist ;; &key onleave ;; how did I plan to call js callbacks here again?
+(defun tabs (firstly-selected-title tablist tab-params ;; &key onleave ;; how did I plan to call js callbacks here again?
)
"Takes in a Title -> (Component | State mapping, returns a component that's supposed to look like the tab component used by the old Elm app"
@@ -34,4 +34,4 @@
(progn
(format t "selected-tab: ~a~%" selected-tab)
(setf *selected-tab* selected-tab)
- (funcall (tabmodel:tab-component selected-tab)))))))
+ (apply (tabmodel:tab-component selected-tab) tab-params))))))
diff --git a/src/views/middleware/newui-dispatcher.lisp b/src/views/middleware/newui-dispatcher.lisp
index bcb4b8d..03128bc 100644
--- a/src/views/middleware/newui-dispatcher.lisp
+++ b/src/views/middleware/newui-dispatcher.lisp
@@ -16,16 +16,19 @@
(defmacro deftab (sym (&key
route
title
+ subtab
require-login
- needed-abilities)
+ needed-abilities
+ captured-route-params)
&body rst)
`(progn
(setf (gethash (quote ,sym) *tabs*)
(make-instance 'tab :route ,route
:abilities ,needed-abilities
:require-login ,require-login
+ :subtab ,subtab
:title ,title
- :component (lambda ()
+ :component (lambda ,captured-route-params
(murja.middleware.db:with-db
(let ((murja.middleware.db:*settings* (murja.settings:get-settings)))
(c :div ()
@@ -38,24 +41,26 @@
(@ssr-authenticated :require-authentication ,require-login )
@check-if-initial
@dispatcher)) ()
- (quote ,sym))))
+ (values (quote ,sym) (list ,@captured-route-params)))))
(defun @dispatcher (next)
- (let* ((sym (funcall next))
- (tab (gethash sym *tabs*))
- (usr-abilities (when *user*
- (coerce (murja.models.user:abilities *user*) 'list))))
- (assert tab)
+ (multiple-value-bind (sym route-params) (funcall next)
+ (let* ((tab (gethash sym *tabs*))
+ (usr-abilities (when *user*
+ (coerce (murja.models.user:abilities *user*) 'list))))
+ (assert tab)
- (when (or (not (abilities tab))
- (intersection usr-abilities (abilities tab))
- (or (not (require-login tab))
- *user*))
-
- (root-component
- (tabs (title tab)
- (remove-if-not (lambda (tab)
- (or (not (require-login tab))
- *user*))
- (alexandria:hash-table-values
- *tabs*)))))))
+ (when (or (not (abilities tab))
+ (intersection usr-abilities (abilities tab))
+ (or (not (require-login tab))
+ *user*))
+
+ (root-component
+ (tabs (title tab)
+ (remove-if-not (lambda (tab)
+ (or (not (require-login tab))
+ (subtab tab)
+ *user*))
+ (alexandria:hash-table-values
+ *tabs*))
+ route-params))))))