diff --git a/clog-base.lisp b/clog-base.lisp index 8874791..8c32b17 100644 --- a/clog-base.lisp +++ b/clog-base.lisp @@ -478,7 +478,8 @@ is nil unbind the event.")) (defgeneric set-on-submit (clog-obj on-submit-handler) (:documentation "Set the ON-SUBMIT-HANDLER for CLOG-OBJ. If ON-SUBMIT-HANDLER is nil unbind the event. This event is activated by using submit on a form. If -this even is bound, you must call the form submit manually.")) +this event is bound, you must call the (submit clog-form) manually if wish the +form action to be run. See CLOG-Form SUBMIT for more details.")) (defmethod set-on-submit ((obj clog-obj) handler) (set-event obj "submit" diff --git a/clog-body.lisp b/clog-body.lisp index f8149ce..a9cc1cc 100644 --- a/clog-body.lisp +++ b/clog-body.lisp @@ -56,8 +56,7 @@ or global objects.")) (loop (if (validp obj) (sleep 10) - (return (format t "Closing id ~A~%" - (connection-id obj)))))) + (return)))) ;;;;;;;;;;;; ;; window ;; diff --git a/clog-element.lisp b/clog-element.lisp index 75f6f06..573749a 100644 --- a/clog-element.lisp +++ b/clog-element.lisp @@ -115,6 +115,12 @@ an existing element with HTML-ID. The HTML-ID must be unique.")) (defmethod attribute ((obj clog-element) attribute-name) (jquery-query obj (format nil "attr('~A')" attribute-name))) +(defgeneric remove-attribute (clog-element attribute-name) + (:documentation "Get/Setf html tag attribute. (eg. src on img tag)")) + +(defmethod remove-attribute ((obj clog-element) attribute-name) + (jquery-execute obj (format nil "removeAttr('~A')" attribute-name))) + (defgeneric set-attribute (clog-element attribute-name value) (:documentation "Set html tag attribute.")) @@ -296,7 +302,7 @@ setting display (None).")) (defmethod set-hiddenp ((obj clog-element) value) (if value (setf (property obj "hidden") t) - (jquery-execute obj "removeAttr('hidden')"))) + (remove-attribute obj "hidden"))) (defsetf hiddenp set-hiddenp) ;;;;;;;;;;;;;; diff --git a/clog-form.lisp b/clog-form.lisp index d2cb80e..3f9163b 100644 --- a/clog-form.lisp +++ b/clog-form.lisp @@ -21,16 +21,108 @@ ;; create-form ;; ;;;;;;;;;;;;;;;;; -(defgeneric create-form (clog-obj &key auto-place) +(defgeneric create-form (clog-obj &key action method target auto-place) (:documentation "Create a new CLOG-Form as child of CLOG-OBJ that organizes -a collection of form elements in to a singnle form if :AUTO-PLACE (default t) +a collection of form elements in to a single form if :AUTO-PLACE (default t) place-inside-bottom-of CLOG-OBJ. In CLOG a form's on-submit handler should be -set and the form elelement values handled in that handler as opposed to the -HTML model of submitting to a new \"page\".")) +set and the form element values handled in that handler as opposed to the +HTML model of submitting to a new \"page\". If though one wishes to submit to +another page can use the :ACTION :METHOD and :TARGET keys and either do not +set an on-submit handler or call (submit CLOG-FORM) to perform the form +action.")) -(defmethod create-form ((obj clog-obj) &key (auto-place t)) - (create-child obj "
" :clog-type 'clog-form :auto-place auto-place)) +(defmethod create-form ((obj clog-obj) + &key (action "") + (method "get") + (target "_self") + (auto-place t)) + (create-child obj (format nil "" + action method target) + :clog-type 'clog-form :auto-place auto-place)) +;;;;;;;;;;;;;;;;;;;;;;;; +;; form-element-count ;; +;;;;;;;;;;;;;;;;;;;;;;;; + +(defgeneric form-element-count (clog-formt) + (:documentation "Get form element count.")) + +(defmethod form-element-count ((obj clog-form)) + (property obj "length")) + +;;;;;;;;;;;; +;; submit ;; +;;;;;;;;;;;; + +(defgeneric submit (clog-formt) + (:documentation "Submit form.")) + +(defmethod submit ((obj clog-form)) + (execute obj "submit()")) + +;;;;;;;;;;; +;; reset ;; +;;;;;;;;;;; + +(defgeneric reset (clog-formt) + (:documentation "Reset form.")) + +(defmethod reset ((obj clog-form)) + (execute obj "reset()")) + +;;;;;;;;;;;;;;;;;;; +;; autocompletep ;; +;;;;;;;;;;;;;;;;;;; + +(defgeneric autocompletep (clog-form) + (:documentation "Get/Setf form autocompletep.")) + +(defmethod autocompletep ((obj clog-form)) + (js-on-p (property obj "autocompletep"))) + +(defgeneric set-autocompletep (clog-form autocompletep) + (:documentation "Set autocompletep for CLOG-FORM")) + +(defmethod set-autocompletep ((obj clog-form) autocompletep) + (setf (property obj "autocompletep") (p-on-js autocompletep))) +(defsetf autocompletep set-autocompletep) + +;;;;;;;;;;;;;; +;; encoding ;; +;;;;;;;;;;;;;; + +(defgeneric encoding (clog-form) + (:documentation "Get/Setf form encoding. Comming values are: + application/x-www-form-urlencoded + multipart/form-data + text/plain")) + +(defmethod encoding ((obj clog-form)) + (property obj "encoding")) + +(defgeneric set-encoding (clog-form encoding) + (:documentation "Set encoding for CLOG-FORM")) + +(defmethod set-encoding ((obj clog-form) encoding) + (setf (property obj "encoding") encoding)) +(defsetf encoding set-encoding) + +;;;;;;;;;;;;;;;;;;;;;;;; +;; validate-on-submit ;; +;;;;;;;;;;;;;;;;;;;;;;;; + +(defgeneric validate-on-submit (clog-form) + (:documentation "Get/Setf form validate-on-submit.")) + +(defmethod validate-on-submit ((obj clog-form)) + (not (js-true-p (property obj "noValidate")))) + +(defgeneric set-validate-on-submit (clog-form value) + (:documentation "Set VALIDATE-ON-SUBMIT for CLOG-FORM")) + +(defmethod set-validate-on-submit ((obj clog-form) value) + (setf (property obj "noValidate") (p-true-js (not value)))) +(defsetf validate-on-submit set-validate-on-submit) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Implementation - clog-form-clement @@ -68,12 +160,159 @@ clog-form-elements are always placed with in the CLOG-FORM in the DOM")) (label-for label element)) element)) +;;;;;;;;;;;;;;;;;; +;; autocomplete ;; +;;;;;;;;;;;;;;;;;; + +(defgeneric autocomplete (clog-form-element) + (:documentation "Get/Setf form element autocomplete.")) + +(defmethod autocomplete ((obj clog-form-element)) + (property obj "autocomplete")) + +(defgeneric set-autocomplete (clog-form-element value) + (:documentation "Set autocomplete AUTOCOMPLETE for CLOG-FORM-ELEMENT")) + +(defmethod set-autocomplete ((obj clog-form-element) value) + (setf (property obj "autocomplete") value)) +(defsetf autocomplete set-autocomplete) + +;;;;;;;;;;;;;;;; +;; autofocusp ;; +;;;;;;;;;;;;;;;; + +(defgeneric autofocusp (clog-form-element) + (:documentation "Get/Setf form element autofocusp. Only one element should +have this set true. Autofocus on element when form loaded. ")) + +(defmethod autofocusp ((obj clog-form-element)) + (js-true-p (attribute obj "autofocus"))) + +(defgeneric set-autofocusp (clog-form-element value) + (:documentation "Set autofocusp AUTOFOCUSP for CLOG-FORM-ELEMENT")) + +(defmethod set-autofocusp ((obj clog-form-element) value) + (if value + (setf (attribute obj "autofocus") "true") + (remove-attribute obj "autofocus"))) +(defsetf autofocusp set-autofocusp) + +;;;;;;;;;;;;;;;;;; +;; place-holder ;; +;;;;;;;;;;;;;;;;;; + +(defgeneric place-holder (clog-form-element) + (:documentation "Get/Setf form element place holder.")) + +(defmethod place-holder ((obj clog-form-element)) + (property obj "placeholder")) + +(defgeneric set-place-holder (clog-form-element value) + (:documentation "Set placeholder PLACE-HOLDER for CLOG-FORM-ELEMENT")) + +(defmethod set-place-holder ((obj clog-form-element) value) + (setf (property obj "placeholder") value)) +(defsetf place-holder set-place-holder) + +;;;;;;;;;;;;;;; +;; disabledp ;; +;;;;;;;;;;;;;;; + +(defgeneric disabledp (clog-form-element) + (:documentation "Get/Setf form element disabledp.")) + +(defmethod disabledp ((obj clog-form-element)) + (js-true-p (property obj "disabled"))) + +(defgeneric set-disabledp (clog-form-element value) + (:documentation "Set disabledp DISABLEDP for CLOG-FORM-ELEMENT")) + +(defmethod set-disabledp ((obj clog-form-element) value) + (setf (property obj "disabled") (p-true-js value))) +(defsetf disabledp set-disabledp) + +;;;;;;;;;;;;;;;;; +;; read-only-p ;; +;;;;;;;;;;;;;;;;; + +(defgeneric read-only-p (clog-form-element) + (:documentation "Get/Setf form element read-only-p.")) + +(defmethod read-only-p ((obj clog-form-element)) + (js-true-p (property obj "readonly"))) + +(defgeneric set-read-only-p (clog-form-element value) + (:documentation "Set read-only-p READ-ONLY-P for CLOG-FORM-ELEMENT")) + +(defmethod set-read-only-p ((obj clog-form-element) value) + (setf (property obj "readonly") (p-true-js value))) +(defsetf read-only-p set-read-only-p) + +;;;;;;;;;;;;;;; +;; requiredp ;; +;;;;;;;;;;;;;;; + +(defgeneric requiredp (clog-form-element) + (:documentation "Get/Setf form element requiredp.")) + +(defmethod requiredp ((obj clog-form-element)) + (js-true-p (property obj "required"))) + +(defgeneric set-requiredp (clog-form-element value) + (:documentation "Set requiredp REQUIREDP for CLOG-FORM-ELEMENT")) + +(defmethod set-requiredp ((obj clog-form-element) value) + (setf (property obj "required") (p-true-js value))) +(defsetf requiredp set-requiredp) + +;;;;;;;;;; +;; name ;; +;;;;;;;;;; + +(defgeneric name (clog-form-element) + (:documentation "Get/Setf form element name. + Form element name, name is not the id of the element but rather how + the data returned from the element will be named in the submit to a + server. For example if Name is My_Field a GET request could look like + http://localhost:8080?My_Field=xxxx")) + +(defmethod name ((obj clog-form-element)) + (property obj "name")) + +(defgeneric set-name (clog-form-element value) + (:documentation "Set name VALUE for CLOG-FORM-ELEMENT")) + +(defmethod set-name ((obj clog-form-element) value) + (setf (property obj "name") value)) +(defsetf name set-name) + +;;;;;;;;;;;;;;;;;;; +;; default-value ;; +;;;;;;;;;;;;;;;;;;; + +(defgeneric default-value (clog-form-element) + (:documentation "Get/Setf form element default-value. + If the form is reset the value will be set to default value + If Value is set at time of creation it also sets it as the Default_Value")) + +(defmethod default-value ((obj clog-form-element)) + (property obj "defaultValue")) + +(defgeneric set-default-value (clog-form-element value) + (:documentation "Set default-value VALUE for CLOG-FORM-ELEMENT")) + +(defmethod set-default-value ((obj clog-form-element) value) + (setf (property obj "defaultValue") value)) +(defsetf default-value set-default-value) + ;;;;;;;;;;; ;; value ;; ;;;;;;;;;;; (defgeneric value (clog-form-element) - (:documentation "Get/Setf from element value.")) + (:documentation "Get/Setf form element value. + Form element values are not accessible through the Text property but + instead through the value property.")) (defmethod value ((obj clog-form-element)) (property obj "value")) @@ -85,22 +324,117 @@ clog-form-elements are always placed with in the CLOG-FORM in the DOM")) (setf (property obj "value") value)) (defsetf value set-value) +;;;;;;;;;;;;; +;; pattern ;; +;;;;;;;;;;;;; + +(defgeneric pattern (clog-form-element) + (:documentation "Get/Setf form element regular expression pattern. + (see JavaScript RegExp object for specifics) + Form validation pattern. validate-on-submit fields with input + will validate against their pattern if set on submit. + In cases where a specific input type is not supported like + (date, week, etc.) Pattern can be set to ensure the expected results. + This works since Input type will fall back to a text input.")) + +(defmethod pattern ((obj clog-form-element)) + (property obj "pattern")) + +(defgeneric set-pattern (clog-form-element value) + (:documentation "Set pattern VALUE for CLOG-FORM-ELEMENT")) + +(defmethod set-pattern ((obj clog-form-element) value) + (setf (property obj "pattern") value)) +(defsetf pattern set-pattern) + +;;;;;;;;;;;;; +;; minimum ;; +;;;;;;;;;;;;; + +(defgeneric minimum (clog-form-element) + (:documentation "Get/Setf form element minimum.")) + +(defmethod minimum ((obj clog-form-element)) + (property obj "min")) + +(defgeneric set-minimum (clog-form-element value) + (:documentation "Set minimum VALUE for CLOG-FORM-ELEMENT")) + +(defmethod set-minimum ((obj clog-form-element) value) + (setf (property obj "min") value)) +(defsetf minimum set-minimum) + +;;;;;;;;;;;;; +;; maximum ;; +;;;;;;;;;;;;; + +(defgeneric maximum (clog-form-element) + (:documentation "Get/Setf form element maximum.")) + +(defmethod maximum ((obj clog-form-element)) + (property obj "max")) + +(defgeneric set-maximum (clog-form-element value) + (:documentation "Set maximum VALUE for CLOG-FORM-ELEMENT")) + +(defmethod set-maximum ((obj clog-form-element) value) + (setf (property obj "max") value)) +(defsetf maximum set-maximum) + ;;;;;;;;;;;;;;;;;; -;; place-holder ;; +;; element-step ;; ;;;;;;;;;;;;;;;;;; -(defgeneric place-holder (clog-form-element) - (:documentation "Get/Setf from element place holder.")) +(defgeneric element-step (clog-form-element) + (:documentation "Get/Setf form element step.")) -(defmethod place-holder ((obj clog-form-element)) - (property obj "placeholder")) +(defmethod element-step ((obj clog-form-element)) + (property obj "step")) -(defgeneric set-place-holder (clog-form-element place-holder) - (:documentation "Set placeholder PLACE-HOLDER for CLOG-FORM-ELEMENT")) +(defgeneric set-element-step (clog-form-element value) + (:documentation "Set element-step VALUE for CLOG-FORM-ELEMENT")) + +(defmethod set-element-step ((obj clog-form-element) value) + (setf (property obj "step") value)) +(defsetf element-step set-element-step) + +;;;;;;;;;; +;; size ;; +;;;;;;;;;; + +(defgeneric size (clog-form-element) + (:documentation "Get/Setf form element size.")) + +(defmethod size ((obj clog-form-element)) + (property obj "size")) + +(defgeneric set-size (clog-form-element value) + (:documentation "Set size VALUE for CLOG-FORM-ELEMENT")) + +(defmethod set-size ((obj clog-form-element) value) + (setf (property obj "size") value)) +(defsetf size set-size) + +;;;;;;;;;;;; +;; select ;; +;;;;;;;;;;;; + +(defgeneric select (clog-form-element) + (:documentation "Select and highlight the contents of element.")) + +(defmethod select ((obj clog-form-element)) + (execute obj "select()")) + +;;;;;;;;;;;;;;;;;;; +;; set-data-list ;; +;;;;;;;;;;;;;;;;;;; + +(defgeneric set-data-list (clog-form-element data-list) + (:documentation "Set the option data list to use for this element.")) + +(defmethod set-data-list ((obj clog-form-element) data-list) + (setf (attribute obj "list") (html-id data-list))) -(defmethod set-place-holder ((obj clog-form-element) place-holder) - (setf (property obj "placeholder") place-holder)) -(defsetf place-holder set-place-holder) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Implementation - clog-label @@ -134,3 +468,32 @@ clog-form-elements are always placed with in the CLOG-FORM in the DOM")) (defmethod label-for ((obj clog-label) element) (setf (attribute obj "for") element)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Implementation - clog-data-list +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defclass clog-data-list (clog-element)() + (:documentation "CLOG Form Element Data-List Options Object")); + +;;;;;;;;;;;;;;;;;;;;;; +;; create-data-list ;; +;;;;;;;;;;;;;;;;;;;;;; + +(defgeneric create-data-list (clog-obj) + (:documentation "Create a new clog-data-list as child of CLOG-FORM.")) + +(defmethod create-data-list ((obj clog-obj)) + (create-child obj "" :clog-type 'clog-data-list :auto-place t)) + +;;;;;;;;;;;;;;;; +;; add-option ;; +;;;;;;;;;;;;;;;; + +(defgeneric add-option (clog-data-list value) + (:documentation "Add option VALUE to data-list.")) + +(defmethod add-option ((obj clog-data-list) value) + (create-child obj (format nil "