X-Git-Url: https://git.hcoop.net/clinton/lisp-on-lines.git/blobdiff_plain/ec044146bf44d8b651c6da400bbb78694f5eb9a0..38a016c7ea89d37ea32cfeb8d1e30033c9e3d614:/src/mewa/slot-presentations.lisp diff --git a/src/mewa/slot-presentations.lisp b/src/mewa/slot-presentations.lisp index 5e0d0ba..bbbc1a9 100644 --- a/src/mewa/slot-presentations.lisp +++ b/src/mewa/slot-presentations.lisp @@ -1,4 +1,4 @@ -(in-package :it.bese.ucw) +(in-package :mewa) (defun multiple-value-funcall->list (function &rest args) "The function to be called by m-v-bf" @@ -12,7 +12,6 @@ ;;;; ** Textarea Slot Presentation -;;;; This should really be in UCW. (defslot-presentation text-slot-presentation () ((rows :initarg :rows :accessor rows :initform nil) @@ -105,32 +104,42 @@ 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) - (creator :accessor creator :initarg :creator :initform :editor)) + (creator :accessor creator :initarg :creator :initform :editor) + (new-instance :accessor new-instance :initform nil)) (:type-name relation)) (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) - (make-instance (or (cadr (mewa:find-attribute finstance :presentation-search)) - 'mewa::mewa-presentation-search) - :search-presentation - (mewa:make-presentation finstance - :type :search-presentation) - :list-presentation - (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-p (fill-gaps-only-p self))))) - + (let ((new-instance (new-instance self))) + (unless new-instance + (setf (new-instance self) + (call-component + (ucw::parent slot) + (make-instance (or (cadr (mewa:find-attribute finstance :presentation-search)) + 'mewa::mewa-presentation-search) + :search-presentation + (mewa:make-presentation finstance + :type :search-presentation) + :list-presentation + (mewa:make-presentation finstance + :type :listing))))) + (sync-foreign-instance slot new-instance)))) + +(defmethod sync-foreign-instance ((slot mewa-relation-slot-presentation) foreign-instance) + (let ((instance (instance (ucw::parent slot)))) + (multiple-value-bind (foo f-slot-name) + (meta-model:explode-foreign-key instance (slot-name slot)) + (setf (slot-value instance (slot-name slot)) (slot-value foreign-instance f-slot-name)) + (meta-model:sync-instance instance :fill-gaps-only-p (fill-gaps-only-p slot))))) + + (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) + (ucw::parent slot) (mewa:make-presentation finstance :type (creator self))))) ;;;; TODO: this next bit is due to a bad design decision. @@ -172,9 +181,9 @@ When T, only the default value for primary keys and the joins are updated.") (:default-initargs)) (defaction view-instance ((self component) instance &rest initargs) - (call-component (parent self) (apply #'mewa:make-presentation instance initargs)) + (call-component (ucw::parent self) (apply #'mewa:make-presentation instance initargs)) ;; the viewed instance could have been changed/deleted, so we sync this instance - (meta-model:sync-instance (instance (parent self)))) + (meta-model:sync-instance (instance (ucw::parent self)))) (defmethod present-slot :around ((slot foreign-key-slot-presentation) instance) @@ -182,7 +191,7 @@ When T, only the default value for primary keys and the joins are updated.") (when (presentation-slot-value slot instance) (meta-model:explode-foreign-key instance (slot-name slot)))) (flet ((render () (when (foreign-instance slot)(call-next-method)))) - (if (slot-boundp slot 'place) + (if (slot-boundp slot 'ucw::place) (cond ((editablep slot) ( (length (last-name x)) 0) - (strcat (last-name x) ", ") - " ") - (first-name x)" " (company-name x))) - :as-value (lambda (x) x) - :submit-on-click-p nil))) - (:type-name ajax-foreign-key)) - - -(defmethod shared-initialize :after ((slot ajax-foreign-key-slot-presentation) slots &rest args) - ;; If no search-slots than use the any slots of type string - (unless (search-slots slot) - (setf (search-slots slot) t) - (let ((l (live-search slot))) - (setf (lisp-on-lines::values-generator l) t)))) - - -(defmethod present-slot :around ((slot ajax-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 () (when (foreign-instance slot)(call-next-method)))) - (if (slot-boundp slot 'place) - (cond - ((editablep slot) - - (>"))