source: trunk/grails-app/taglib/dbnp/studycapturing/WizardTagLib.groovy @ 1461

Last change on this file since 1461 was 1461, checked in by work@…, 12 years ago
  • added wizard tags to gdt taglib
  • Property svn:keywords set to Rev Author Date
File size: 10.7 KB
Line 
1package dbnp.studycapturing
2
3import dbnp.authentication.SecUser
4import org.dbnp.gdt.*
5
6/**
7 * Wizard tag library
8 *
9 * @author Jeroen Wesbeek
10 * @since 20100113
11 * @package wizard
12 *
13 * Revision information:
14 * $Rev: 1461 $
15 * $Author: work@osx.eu $
16 * $Date: 2011-02-01 13:36:57 +0000 (di, 01 feb 2011) $
17 */
18class WizardTagLib extends GdtTagLib {
19        def AuthenticationService
20       
21        /**
22         * Study form element
23         * @param Map attributes
24         * @param Closure help content
25         */
26        def studyElement = { attrs, body ->
27                // render study element
28                baseElement.call(
29                        'studySelect',
30                        attrs,
31                        body
32                )
33        }
34
35        /**
36         * render a study select element
37         * @param Map attrs
38         */
39        def studySelect = { attrs ->
40                // Find all studies the user has access to (max 100)
41                attrs.from = Study.giveWritableStudies(AuthenticationService.getLoggedInUser(), 100);
42
43                // got a name?
44                if (!attrs.name) {
45                        attrs.name = "study"
46                }
47
48                // got result?
49                if (attrs.from.size() > 0) {
50                        out << select(attrs)
51                } else {
52                        // no, return false to make sure this element
53                        // is not rendered in the template
54                        return false
55                }
56        }
57
58        /**
59         * Protocol form element
60         * @param Map attributes
61         * @param Closure help content
62         *
63        def protocolElement = { attrs, body ->
64                // render protocol element
65                baseElement.call(
66                        'protocolSelect',
67                        attrs,
68                        body
69                )
70        }
71
72        /**
73         * render a protocol select element
74         * @param Map attrs
75         *
76        def protocolSelect = { attrs ->
77                // fetch all protocold
78                attrs.from = Protocol.findAll() // for now, all protocols
79
80                // got a name?
81                if (!attrs.name) {
82                        attrs.name = 'protocol'
83                }
84
85                out << select(attrs)
86        }
87
88        def show = { attrs ->
89                // is object parameter set?
90                def o = attrs.object
91
92                println o.getProperties();
93                o.getProperties().each {
94                        println it
95                }
96
97                out << "!! test version of 'show' tag !!"
98        }
99         */
100
101        def PublicationSelectElement = { attrs, body ->
102                attrs.description = 'Publications';
103                // render list with publications currently available
104                baseElement.call(
105                        '_publicationList',
106                        attrs,
107                        body
108                )
109
110                attrs.description = '';
111
112                // render 'Add publication button'
113                baseElement.call(
114                        '_publicationAddButton',
115                        attrs,
116                        body
117                )
118        }
119
120        /**
121         * Renders a input box for publications
122         */
123        def publicationSelect = { attrs, body ->
124                if (attrs.get('value') == null) {
125                        attrs.value = [];
126                }
127                if (attrs.get('description') == null) {
128                        attrs.description = '';
129                }
130                out << '<form id="' + attrs.name + '_form" onSubmit="return false;">';
131                out << textField(
132                        name: attrs.get("name"),
133                        value: '',
134                        rel: 'publication-pubmed',
135                        style: 'width: 400px;'
136                );
137                out << '</form>';
138                out << '<script type="text/javascript">';
139                out << '  var onSelect = function( chooserObject, inputElement, event, ui ) { selectPubMedAdd( chooserObject, inputElement, event, ui ); enableButton( ".' + attrs.name + '_publication_dialog", "Add", true ); };'
140                out << '  iField = $( "#' + attrs.get('name') + '" );';
141                out << '  new PublicationChooser().initAutocomplete( iField, { "select" : onSelect } );';
142                out << '</script>';
143        }
144
145        def _publicationList = { attrs, body ->
146                def display_none = 'none';
147                if (!attrs.get('value') || attrs.get('value').size() == 0) {
148                        display_none = 'inline';
149                }
150
151                // Add a unordered list
152                out << '<ul class="publication_list" id="' + attrs.name + '_list">';
153
154                out << '<li>';
155                out << '<span class="publication_none" id="' + attrs.name + '_none" style="display: ' + display_none + ';">';
156                out << 'No publications selected';
157                out << '</span>';
158                out << '</li>';
159
160                out << '</ul>';
161
162                // Add the publications using javascript
163                out << '<script type="text/javascript">'
164                if (attrs.get('value') && attrs.get('value').size() > 0) {
165                        def i = 0;
166                        attrs.get('value').each {
167                                out << 'showPublication( ';
168                                out << '  "' + attrs.name + '",';
169                                out << '  ' + it.id + ',';
170                                out << '  "' + it.title + '",';
171                                out << '  "' + it.authorsList + '",';
172                                out << '  ' + i++;
173                                out << ');';
174                        }
175                }
176                out << '</script>';
177
178                def ids;
179                if (attrs.get('value') && attrs.get('value').size() > 0) {
180                        ids = attrs.get('value').id.join(',')
181                } else {
182                        ids = '';
183                }
184                out << '<input type="hidden" name="' + attrs.name + '_ids" value="' + ids + '" id="' + attrs.name + '_ids">';
185        }
186
187        def _publicationAddButton = { attrs, body ->
188
189                // Output the dialog for the publications
190                out << '<div id="' + attrs.name + '_dialog">';
191                out << '<p>Search for a publication on pubmed. You can search on a part of the title, authors or pubmed ID. </p>';
192                out << publicationSelect(attrs, body);
193                out << '</div>';
194                out << '<script type="text/javascript">';
195                out << '  createPublicationDialog( "' + attrs.name + '" );'
196                out << '</script>';
197
198                out << '<input type="button" onClick="openPublicationDialog(\'' + attrs.name + '\' );" value="Add Publication">';
199        }
200
201        def ContactSelectElement = { attrs, body ->
202
203                attrs.description = 'Contacts';
204                // render list with publications currently available
205                baseElement.call(
206                        '_contactList',
207                        attrs,
208                        body
209                )
210
211                attrs.description = '';
212
213                // render 'publications list'
214                out << '<div id="' + attrs.name + '_dialog" class="contacts_dialog" style="display: none;">'
215                baseElement.call(
216                        '_personSelect',
217                        attrs,
218                        body
219                )
220                baseElement.call(
221                        '_roleSelect',
222                        attrs,
223                        body
224                )
225                baseElement.call(
226                        '_contactAddButtonAddition',
227                        attrs,
228                        body
229                )
230                out << '</div>';
231
232                // render 'Add contact button'
233                baseElement.call(
234                        '_contactAddDialogButton',
235                        attrs,
236                        body
237                )
238        }
239
240        def _contactList = { attrs, body ->
241                def display_none = 'none';
242                if (!attrs.get('value') || attrs.get('value').size() == 0) {
243                        display_none = 'inline';
244                }
245
246                // Add a unordered list
247                out << '<ul class="contact_list" id="' + attrs.name + '_list">';
248
249                out << '<li>';
250                out << '<span class="contacts_none" id="' + attrs.name + '_none" style="display: ' + display_none + ';">';
251                out << 'No contacts selected';
252                out << '</span>';
253                out << '</li>';
254
255                out << '</ul>';
256
257                // Add the contacts using javascript
258                out << '<script type="text/javascript">'
259                if (attrs.get('value') && attrs.get('value').size() > 0) {
260                        def i = 0;
261                        attrs.get('value').each {
262                                out << 'showContact( ';
263                                out << '  "' + attrs.name + '",';
264                                out << '  "' + it.person.id + '-' + it.role.id + '",';
265                                out << '  "' + it.person.lastName + ', ' + it.person.firstName + (it.person.prefix ? ' ' + it.person.prefix : '') + '",';
266                                out << '  "' + it.role.name + '",';
267                                out << '  ' + i++;
268                                out << ');';
269                        }
270                }
271                out << '</script>';
272
273                def ids = '';
274                if (attrs.get('value') && attrs.get('value').size() > 0) {
275                        ids = attrs.get('value').collect { it.person.id + '-' + it.role.id }
276                        ids = ids.join(',');
277                }
278                out << '<input type="hidden" name="' + attrs.name + '_ids" value="' + ids + '" id="' + attrs.name + '_ids">';
279        }
280
281        def _contactAddSelect = { attrs, body ->
282                out << _personSelect(attrs) + _roleSelect(attrs);
283        }
284
285        def _contactAddButtonAddition = { attrs, body ->
286                out << '<input type="button" onClick="if( addContact ( \'' + attrs.name + '\' ) ) { $(\'#' + attrs.name + '_dialog\').hide(); $( \'#' + attrs.name + '_dialogButton\' ).show(); }" value="Add">';
287                out << '<input type="button" onClick="$(\'#' + attrs.name + '_dialog\').hide(); $( \'#' + attrs.name + '_dialogButton\' ).show();" value="Close">';
288        }
289
290        def _contactAddDialogButton = { attrs, body ->
291                out << '<input type="button" onClick="$( \'#' + attrs.name + '_dialog\' ).show(); $(this).hide();" id="' + attrs.name + '_dialogButton" value="Add Contact">';
292        }
293        /**
294         * Person select element
295         * @param Map attributes
296         */
297        def _personSelect = { attrs ->
298                def selectAttrs = new LinkedHashMap();
299
300                // define 'from'
301                def persons = Person.findAll().sort({ a, b -> a.lastName == b.lastName ? (a.firstName <=> b.firstName) : (a.lastName <=> b.lastName) } as Comparator);
302                selectAttrs.from = persons.collect { it.lastName + ', ' + it.firstName + (it.prefix ? ' ' + it.prefix : '') }
303                selectAttrs.keys = persons.id;
304
305                // add 'rel' attribute
306                selectAttrs.rel = 'person'
307                selectAttrs.name = attrs.name + '_person';
308
309                // add a dummy field
310                selectAttrs.from.add(0,'')
311                selectAttrs.keys.add(0,'')
312
313                out << "Person: " + select(selectAttrs)
314        }
315
316        /**
317         * Role select element
318         * @param Map attributes
319         */
320        def _roleSelect = { attrs ->
321                def selectAttrs = new LinkedHashMap();
322
323                // define 'from'
324                def roles = PersonRole.findAll();
325                selectAttrs.from = roles.collect { it.name };
326                selectAttrs.keys = roles.id;
327
328                // add 'rel' attribute
329                selectAttrs.rel = 'role'
330                selectAttrs.name = attrs.name + '_role';
331
332                // add a dummy field
333                selectAttrs.from.add(0,'')
334                selectAttrs.keys.add(0,'')
335
336                out << "Role: " + select(selectAttrs)
337        }
338
339
340        def UserSelectElement = { attrs, body ->
341                // render list with publications currently available
342                baseElement.call(
343                        '_userList',
344                        attrs,
345                        body
346                )
347
348                attrs.description = '';
349
350                // render 'Add user button'
351                baseElement.call(
352                        '_userAddButton',
353                        attrs,
354                        body
355                )
356        }
357
358        /**
359         * Renders an input box for publications
360         */
361        def userSelect = { attrs, body ->
362                if (attrs.get('value') == null) {
363                        attrs.value = [];
364                }
365                if (attrs.get('description') == null) {
366                        attrs.description = '';
367                }
368               
369                out << '<form id="' + attrs.name + '_form" onSubmit="return false;">';
370                out << select(
371                        name: attrs.get("name"),
372                        value: '',
373                        from: SecUser.list(),
374                        optionValue: 'username',
375                        optionKey: 'id',
376                        style: 'width: 400px;'
377                );
378                out << '</form>';
379        }
380
381        def _userList = { attrs, body ->
382                def display_none = 'none';
383                if (!attrs.get('value') || attrs.get('value').size() == 0) {
384                        display_none = 'inline';
385                }
386
387                // Add a unordered list
388                out << '<ul class="user_list" id="' + attrs.name + '_list">';
389
390                out << '<li>';
391                out << '<span class="user_none" id="' + attrs.name + '_none" style="display: ' + display_none + ';">';
392                out << '-';
393                out << '</span>';
394                out << '</li>';
395
396                out << '</ul>';
397
398                // Add the publications using javascript
399                out << '<script type="text/javascript">'
400                if (attrs.get('value') && attrs.get('value').size() > 0) {
401                        def i = 0;
402                        attrs.get('value').each {
403                                out << 'showUser( ';
404                                out << '  "' + attrs.name + '",';
405                                out << '  ' + it.id + ',';
406                                out << '  "' + it.username + '",';
407                                out << '  ' + i++;
408                                out << ');';
409                        }
410                }
411                out << '</script>';
412
413                def ids;
414                if (attrs.get('value') && attrs.get('value').size() > 0) {
415                        ids = attrs.get('value').id.join(',')
416                } else {
417                        ids = '';
418                }
419                out << '<input type="hidden" name="' + attrs.name + '_ids" value="' + ids + '" id="' + attrs.name + '_ids">';
420        }
421
422        def _userAddButton = { attrs, body ->
423
424                // Output the dialog for the publications
425                out << '<div id="' + attrs.name + '_dialog">';
426                out << '<p>Select a user from the database.</p>';
427                out << userSelect(attrs, body);
428                out << '</div>';
429                out << '<script type="text/javascript">';
430                out << '  createUserDialog( "' + attrs.name + '" );'
431                out << '</script>';
432
433                out << '<input type="button" onClick="openUserDialog(\'' + attrs.name + '\' );" value="Add User">';
434        }
435
436}
Note: See TracBrowser for help on using the repository browser.