Expanded support for Configurable editing.
[clinton/lisp-on-lines.git] / src / ucw / html-description.lisp
CommitLineData
4358148e 1(in-package :lisp-on-lines)
2
81d70610 3(export '(html-description) (find-package :lisp-on-lines))
4358148e 4
b7657b86 5(defvar *escape-html* t)
6
7(defmethod generic-format ((display lol-ucw:component) string &rest args)
8 (<:as-html (with-output-to-string (stream)
9 (apply #'call-next-method stream string args))))
10
11
4358148e 12(define-description html-description ()
81d70610 13 ())
14
81d70610 15(define-description t ()
6de8d300 16 ((css-class :value "lol-description" :activep nil)
4358148e 17 (dom-id :function (lambda (x)
18 (declare (ignore x))
19 (symbol-name
6de8d300 20 (gensym "DOM-ID-")))
21 :activep nil))
4358148e 22 (:in-description html-description))
23
24(define-layered-class html-attribute ()
25 ((css-class :accessor attribute-css-class
26 :initform "lol-attribute")
27 (dom-id :accessor attribute-dom-id :initform nil)))
28
29(define-layered-class standard-attribute
30 :in-layer #.(defining-description 'html-description)
31 (html-attribute)
32 ())
33
6de8d300 34(define-layered-function display-html-attribute-label (object attribute)
35 (:method (object attribute)
36 (let ((label (attribute-label attribute)))
37 (<:label
38 :class "lol-attribute-label"
39 (when label
40 (<:as-html
41 (with-output-to-string (*display*)
b7657b86 42 (display-attribute-label attribute)))))))
43 (:method
44 :in-layer #.(defining-description 'inline)
45 (object attribute)
46 (let ((label (attribute-label attribute)))
47 (when label
48 (<:as-html
49 (with-output-to-string (*display*)
50 (display-attribute-label attribute)))))))
6de8d300 51
52(define-layered-function display-html-attribute-value (object attribute)
53 (:method (object attribute)
54 (<:span
55 :class "lol-attribute-value"
e8d4fa45 56 (<:as-html
b7657b86 57 (display-attribute-value attribute))))
58
59 (:method
60 :in-layer #.(defining-description 'inline) (object attribute)
61 (display-attribute-value attribute)))
6de8d300 62
63(define-layered-function display-html-attribute (object attribute)
b7657b86 64
6de8d300 65 (:method (object attribute)
b7657b86 66 (<:div
67 :class (attribute-css-class attribute)
68 (when (attribute-dom-id attribute)
69 :id (attribute-dom-id attribute))
70 (display-html-attribute-label object attribute)
71 (display-html-attribute-value object attribute)))
72
73 (:method
74 :in-layer #.(defining-description 'inline)
75 (object attribute)
76 (<:span
6de8d300 77 :class (attribute-css-class attribute)
78 (when (attribute-dom-id attribute)
79 :id (attribute-dom-id attribute))
80 (display-html-attribute-label object attribute)
b7657b86 81 (display-html-attribute-value object attribute))))
82
83(define-layered-method display-using-description
84 :in-layer #.(defining-description 'html-description)
85 :around ((attribute standard-attribute) display object &rest args)
86 (declare (ignore args))
87 (display-html-attribute object attribute))
88
89
f4efa7ff 90(defun make-attribute-value-writer (attribute)
91 (let ((obj (described-object (attribute-description attribute))))
92 (lambda (val)
93 (dletf (((described-object attribute) obj))
94 (setf (attribute-value attribute)
95 (parse-attribute-value attribute val))))))
96
97
98(defmethod display-html-attribute-editor (attribute editor)
99 (<lol:input :type "text"
100 :reader (attribute-value attribute)
101 :writer (make-attribute-value-writer attribute)))
102
103(defmethod display-html-attribute-editor (attribute (editor password-attribute-editor))
104 (<lol:input :type "password"
105 :reader (attribute-value attribute)
106 :writer (make-attribute-value-writer attribute)))
107
108
109(define-layered-method display-attribute-editor
110 :in-layer #.(defining-description 'html-description) (attribute)
111 (display-html-attribute-editor attribute (attribute-editor attribute)))
112
6de8d300 113
114(define-layered-method display-html-attribute-value
115 :in-layer #.(defining-description 'editable) (object attribute)
116
117 (<:span
118 :class "lol-attribute-value"
f4efa7ff 119 (if (attribute-editp attribute)
120 (display-attribute-editor attribute)
121
122 (call-next-method))))
6de8d300 123
b7657b86 124(define-layered-function display-html-description (description display object &optional next-method)
125 (:method (description display object &optional (next-method #'display-using-description))
6de8d300 126 (<:style
127 (<:as-html "
81d70610 128
6de8d300 129div.lol-description .lol-attribute-label,
130div.lol-description .lol-attribute-value {
81d70610 131 display: block;
6de8d300 132 width: 69%;
81d70610 133 float: left;
6de8d300 134 margin-bottom: 1em;
81d70610 135
136}
6de8d300 137div.lol-description
81d70610 138.lol-attribute-label {
139 text-align: right;
140 width: 24%;
141 padding-right: 20px;
142}
143
81d70610 144
6de8d300 145div.lol-description
81d70610 146br {
147clear: left;
148}"))
6de8d300 149
150 (with-attributes (css-class dom-id) description
151
81d70610 152
4358148e 153 (<:div
b7657b86 154 :class (list (attribute-value css-class) "lol-description" "t")
155 :id (attribute-value dom-id)
156 (funcall next-method)))))
6de8d300 157
158
159(define-layered-method display-html-description
b7657b86 160 :in-layer #.(defining-description 'inline) (description display object &optional next-method)
6de8d300 161 (with-attributes (css-class dom-id) description
6de8d300 162 (<:span
b7657b86 163 :class (list (attribute-value css-class) "lol-description")
164 :id (attribute-value dom-id)
165 (funcall next-method))))
166
6de8d300 167
168(define-display
e8d4fa45 169 :in-description html-description ((description t)
170 (display lol-ucw:component)
171 object)
b7657b86 172 (display-html-description description display object (lambda ()
173 (call-next-method))))
174
175
176
177
178
4358148e 179
180
181
182
183