X-Git-Url: https://git.hcoop.net/clinton/lisp-on-lines.git/blobdiff_plain/e9454185bda3d35420ad39ae2817260bd222e789..2cb4247de9700f350d146a65c4156d7959d0bb8d:/src/mewa/slot-presentations.lisp?ds=inline diff --git a/src/mewa/slot-presentations.lisp b/src/mewa/slot-presentations.lisp index 4e69bd8..2ed5b32 100644 --- a/src/mewa/slot-presentations.lisp +++ b/src/mewa/slot-presentations.lisp @@ -1,9 +1,11 @@ (in-package :it.bese.ucw) (defun multiple-value-funcall->list (function &rest args) + "The function to be called by m-v-bf" (multiple-value-call #'list (apply function args))) (defmacro multiple-value-bindf (vars form &body body) + "Like M-V-B, only it works in actions. form must be a function call" `(destructuring-bind ,vars (multiple-value-funcall->list #',(car form) ,@(cdr form)) ,@body)) @@ -44,7 +46,6 @@ When T, only the default value for primary keys and the joins are updated.")) integer currency) - (defslot-presentation clsql-wall-time-slot-presentation (mewa-relation-slot-presentation) () (:type-name clsql-sys:wall-time)) @@ -82,21 +83,16 @@ When T, only the default value for primary keys and the joins are updated.")) (defslot-presentation mewa-relation-slot-presentation (mewa-slot-presentation slot-presentation) ((foreign-instance :accessor foreign-instance) - (linkedp :accessor linkedp :initarg :linkedp :initform t)) + (linkedp :accessor linkedp :initarg :linkedp :initform t) + (creator :accessor creator :initarg :creator :initform :editor)) (:type-name relation)) -(defun get-fkey-data (instance slot-name) - "ugly workaround b/c UCW does not like M-V-B" - (multiple-value-bind (finstance foreign-slot-name) - (meta-model:explode-foreign-key instance slot-name) - (cons finstance foreign-slot-name))) - (defaction search-records ((slot mewa-relation-slot-presentation) instance) (multiple-value-bindf (finstance foreign-slot-name) (meta-model:explode-foreign-key instance (slot-name slot)) (let ((new-instance (call-component - (parent slot) + (parent slot) (make-instance (or (cadr (mewa:find-attribute finstance :presentation-search)) 'mewa::mewa-presentation-search) :search-presentation @@ -106,17 +102,30 @@ When T, only the default value for primary keys and the joins are updated.")) (mewa:make-presentation finstance :type :listing))))) (setf (slot-value instance (slot-name slot)) (slot-value new-instance foreign-slot-name)) - (meta-model:sync-instance instance :fill-gaps-only t)))) + (meta-model:sync-instance instance :fill-gaps-only-p (fill-gaps-only-p self))))) -(defaction create-record ((slot mewa-relation-slot-presentation) instance) +(defaction create-record-on-foreign-key ((slot mewa-relation-slot-presentation) instance) (multiple-value-bindf (finstance foreign-slot-name) (meta-model:explode-foreign-key instance (slot-name slot)) (let ((new-instance (call-component (parent slot) - (mewa:make-presentation finstance :type :editor)))) + (mewa:make-presentation finstance :type (creator self))))) + + ;;;; TODO: this next bit is due to a bad design decision. + ;;;; Components should always have (ok) return self, but somewhere + ;;;; i've made in return (instance self) sometimes, and this + ;;;; bahaviour is totatlly fucked. + + (when (typep new-instance 'mewa::mewa) + (setf new-instance (instance new-instance))) + + ;;;; sorry about that, and now back t our regular program. + + (meta-model:sync-instance new-instance) (setf (slot-value instance (slot-name slot)) (slot-value new-instance foreign-slot-name)) (meta-model:sync-instance instance :fill-gaps-only-p (fill-gaps-only-p self))))) + (defmethod present-relation ((slot mewa-relation-slot-presentation) instance) ;;;;(<:as-html (slot-name slot) "=> " (foreign-instance slot) " from " instance ) @@ -147,40 +156,55 @@ When T, only the default value for primary keys and the joins are updated.")) (meta-model:sync-instance (instance (parent self)))) -(defmethod present-slot :around ((slot foreign-key-slot-presentation) instance) - (setf (foreign-instance slot) (when (presentation-slot-value slot instance) (meta-model:explode-foreign-key instance (slot-name slot)))) - (flet ((render () (call-next-method))) - (cond - ((editablep slot) - (render) - (>")) - (call-next-method) - (<:as-html "total :" (len slot))) + (if (slot-boundp slot 'place) + (progn + (>")) + (call-next-method) + (<:as-html "total :" (len slot))) + (call-next-method))) (defmethod get-foreign-instances :around ((slot has-very-many-slot-presentation) instance) (let ((f (call-next-method))) @@ -256,3 +283,10 @@ When T, only the default value for primary keys and the joins are updated.")) (setf (instance (presentation slot)) (presentation-slot-value slot instance)) (present (presentation slot))) (<:as-html "--")))) + + + + + + +