(in-package :com.tee-it-up-golf.web) ;; Show Viewer (defcomponent item-viewer () ((item :initarg :item :accessor viewer-item))) (defgeneric render-item (item-viewer item) (:documentation "Render item contained within item-viewer")) (defmethod render ((self item-viewer)) (render-item self (viewer-item self))) (defmethod render-item ((viewer item-viewer) (item null)) (declare (ignore viewer item)) (<:as-html "No Item")) ;; Show Selector (defcomponent item-selector (item-viewer) ((full-viewer-class :initarg :viewer-class :initform 'item-viewer :accessor viewer-class))) (defgeneric render-item-for-select (item-selector item) (:documentation "Render item for being selected. This should wrap the object in a link, add controls, etc. to invoke the viewer-class of the item-selector.")) (defgeneric render-item-in-select (selector) (:documentation "Calls the primary method of render-item when it must be used within render-item-for-select.")) (defmethod render-item-in-select ((selector item-selector)) (declare (special *selector-item* *render-item*)) (funcall *render-item* selector *selector-item*)) ;; after updating swank kill render (item-selector) (defmethod render-item :around ((selector item-selector) item) (let ((*selector-item* item) (*render-item* #'call-next-method)) (declare (special *selector-item* *render-item*)) (render-item-for-select selector item))) (defmethod render-item-for-select ((selector item-selector) item) (