;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- ;;; $Header: src/components.lisp $ ;;; Copyright (c) 2008, Andrea Chiumenti. All rights reserved. ;;; Redistribution and use in source and binary forms, with or without ;;; modification, are permitted provided that the following conditions ;;; are met: ;;; * Redistributions of source code must retain the above copyright ;;; notice, this list of conditions and the following disclaimer. ;;; * Redistributions in binary form must reproduce the above ;;; copyright notice, this list of conditions and the following ;;; disclaimer in the documentation and/or other materials ;;; provided with the distribution. ;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED ;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY ;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. (in-package :claw-html) (defvar *id-and-static-id-description* "- :ID The htcomponent-client-id value. CLAW can transform its value to make it univocal - :STATIC-ID Renders the id tag attribute, but the value is not managed as for the :ID keyword." "Description used for describing :ID and :STATIC-ID used in claw component init functions documentation ") (defgeneric cform-rewinding-p (obj page-obj) (:documentation "Internal method to determine, during the rewinding phase, if the COMP has been fired for calling its action. - OBJ the wcomponent instance - PAGE-OBJ the wcomponent owner page")) (defgeneric component-id-and-value (cinput) (:documentation "Returns the form component \(such as and TYPE attribute. For submit type, use the CSUBMIT> function.")) (:metaclass metacomponent) (:default-initargs :reserved-parameters (list :value) :empty t :type "text") (:documentation "Request cycle aware component the renders as an INPUT tag class")) (let ((class (find-class 'cinput))) (closer-mop:ensure-finalized class) (setf (documentation (find-symbol (format nil "~a>" (class-name class))) 'function) (format nil "Description: ~a~%Parameters:~%~a~a~a~%~%~a" "Function that instantiates a CINPUT component and renders a html tag." *id-and-static-id-description* (describe-html-attributes-from-class-slot-initargs (find-class 'base-cinput)) (describe-html-attributes-from-class-slot-initargs class) (describe-component-behaviour class)))) (defmethod wcomponent-template ((cinput cinput)) (let ((client-id (htcomponent-client-id cinput)) (type (input-type cinput)) (translator (translator cinput)) (value "") (class (css-class cinput))) (when (component-validation-errors cinput) (if (or (null class) (string= class "")) (setf class "error") (setf class (format nil "~a error" class)))) (setf value (translator-encode translator cinput)) (input> :static-id client-id :type type :name (name-attr cinput) :class class :value value (wcomponent-informal-parameters cinput)))) (defmethod translated-value ((cinput base-cinput)) (translator-decode (translator cinput) cinput)) (defmethod wcomponent-after-rewind ((cinput base-cinput) (page page)) (when (cform-rewinding-p (page-current-form page) page) (let ((visit-object (cinput-visit-object cinput)) (accessor (cinput-accessor cinput)) (writer (cinput-writer cinput)) (validator (validator cinput)) (value (translated-value cinput))) (unless (or (null value) (null visit-object) (component-validation-errors cinput)) (when validator (funcall validator value)) (unless (component-validation-errors cinput) (if (and (null writer) accessor) (funcall (fdefinition `(setf ,accessor)) (if (and (stringp value) (string= value "") (base-cinput-empty-to-null-p cinput)) nil value) visit-object) (funcall (fdefinition writer) (if (and (stringp value) (string= value "") (base-cinput-empty-to-null-p cinput)) nil value) visit-object))))))) (defclass ctextarea (base-cinput) () (:metaclass metacomponent) (:default-initargs :empty nil) (:documentation "Request cycle aware component the renders as an INPUT tag class")) (let ((class (find-class 'ctextarea))) (closer-mop:ensure-finalized class) (setf (documentation (find-symbol (format nil "~a>" (class-name class))) 'function) (format nil "Description: ~a~%Parameters:~%~a~a~a~%~%~a" "Function that instantiates a CTEXTAREA component and renders a html