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

Last change on this file since 1548 was 1548, checked in by robert@…, 10 years ago

Preparation for using a simple wizard: some changes in tag libraries in order to make them more generic

  • Property svn:keywords set to Rev Author Date
File size: 11.3 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: 1548 $
15 * $Author: robert@isdat.nl $
16 * $Date: 2011-02-22 14:45:25 +0000 (di, 22 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                if( attrs.get( 'noForm', false ) ) {
190                        // Only show the add button. The dialog that is created with this method otherwise,
191                        // should be created somewhere outside the form.
192                } else {
193                        out << publicationDialog( attrs, body );
194                }
195       
196                out << '<input type="button" onClick="openPublicationDialog(\'' + attrs.name + '\' );" value="Add Publication">';
197        }
198       
199        // Show the add publications dialog
200        def publicationDialog = { attrs, body ->
201                // Output the dialog for the publications
202                out << '<div id="' + attrs.name + '_dialog">';
203                out << '<p>Search for a publication on pubmed. You can search on a part of the title, authors or pubmed ID. </p>';
204                out << publicationSelect(attrs, body);
205                out << '</div>';
206                out << '<script type="text/javascript">';
207                out << '  createPublicationDialog( "' + attrs.name + '" );'
208                out << '</script>';
209        }
210       
211
212        def ContactSelectElement = { attrs, body ->
213
214                attrs.description = 'Contacts';
215                // render list with publications currently available
216                baseElement.call(
217                        '_contactList',
218                        attrs,
219                        body
220                )
221
222                attrs.description = '';
223
224                // render 'publications list'
225                out << '<div id="' + attrs.name + '_dialog" class="contacts_dialog" style="display: none;">'
226                baseElement.call(
227                        '_personSelect',
228                        attrs,
229                        body
230                )
231                baseElement.call(
232                        '_roleSelect',
233                        attrs,
234                        body
235                )
236                baseElement.call(
237                        '_contactAddButtonAddition',
238                        attrs,
239                        body
240                )
241                out << '</div>';
242
243                // render 'Add contact button'
244                baseElement.call(
245                        '_contactAddDialogButton',
246                        attrs,
247                        body
248                )
249        }
250
251        def _contactList = { attrs, body ->
252                def display_none = 'none';
253                if (!attrs.get('value') || attrs.get('value').size() == 0) {
254                        display_none = 'inline';
255                }
256
257                // Add a unordered list
258                out << '<ul class="contact_list" id="' + attrs.name + '_list">';
259
260                out << '<li>';
261                out << '<span class="contacts_none" id="' + attrs.name + '_none" style="display: ' + display_none + ';">';
262                out << 'No contacts selected';
263                out << '</span>';
264                out << '</li>';
265
266                out << '</ul>';
267
268                // Add the contacts using javascript
269                out << '<script type="text/javascript">'
270                if (attrs.get('value') && attrs.get('value').size() > 0) {
271                        def i = 0;
272                        attrs.get('value').each {
273                                out << 'showContact( ';
274                                out << '  "' + attrs.name + '",';
275                                out << '  "' + it.person.id + '-' + it.role.id + '",';
276                                out << '  "' + it.person.lastName + ', ' + it.person.firstName + (it.person.prefix ? ' ' + it.person.prefix : '') + '",';
277                                out << '  "' + it.role.name + '",';
278                                out << '  ' + i++;
279                                out << ');';
280                        }
281                }
282                out << '</script>';
283
284                def ids = '';
285                if (attrs.get('value') && attrs.get('value').size() > 0) {
286                        ids = attrs.get('value').collect { it.person.id + '-' + it.role.id }
287                        ids = ids.join(',');
288                }
289                out << '<input type="hidden" name="' + attrs.name + '_ids" value="' + ids + '" id="' + attrs.name + '_ids">';
290        }
291
292        def _contactAddSelect = { attrs, body ->
293                out << _personSelect(attrs) + _roleSelect(attrs);
294        }
295
296        def _contactAddButtonAddition = { attrs, body ->
297                out << '<input type="button" onClick="if( addContact ( \'' + attrs.name + '\' ) ) { $(\'#' + attrs.name + '_dialog\').hide(); $( \'#' + attrs.name + '_dialogButton\' ).show(); }" value="Add">';
298                out << '<input type="button" onClick="$(\'#' + attrs.name + '_dialog\').hide(); $( \'#' + attrs.name + '_dialogButton\' ).show();" value="Close">';
299        }
300
301        def _contactAddDialogButton = { attrs, body ->
302                out << '<input type="button" onClick="$( \'#' + attrs.name + '_dialog\' ).show(); $(this).hide();" id="' + attrs.name + '_dialogButton" value="Add Contact">';
303        }
304        /**
305         * Person select element
306         * @param Map attributes
307         */
308        def _personSelect = { attrs ->
309                def selectAttrs = new LinkedHashMap();
310
311                // define 'from'
312                def persons = Person.findAll().sort({ a, b -> a.lastName == b.lastName ? (a.firstName <=> b.firstName) : (a.lastName <=> b.lastName) } as Comparator);
313                selectAttrs.from = persons.collect { it.lastName + ', ' + it.firstName + (it.prefix ? ' ' + it.prefix : '') }
314                selectAttrs.keys = persons.id;
315
316                // add 'rel' attribute
317                selectAttrs.rel = 'person'
318                selectAttrs.name = attrs.name + '_person';
319
320                // add a dummy field
321                selectAttrs.from.add(0,'')
322                selectAttrs.keys.add(0,'')
323
324                out << "Person: " + select(selectAttrs)
325        }
326
327        /**
328         * Role select element
329         * @param Map attributes
330         */
331        def _roleSelect = { attrs ->
332                def selectAttrs = new LinkedHashMap();
333
334                // define 'from'
335                def roles = PersonRole.findAll();
336                selectAttrs.from = roles.collect { it.name };
337                selectAttrs.keys = roles.id;
338
339                // add 'rel' attribute
340                selectAttrs.rel = 'role'
341                selectAttrs.name = attrs.name + '_role';
342
343                // add a dummy field
344                selectAttrs.from.add(0,'')
345                selectAttrs.keys.add(0,'')
346
347                out << "Role: " + select(selectAttrs)
348        }
349
350
351        def UserSelectElement = { attrs, body ->
352                // render list with publications currently available
353                baseElement.call(
354                        '_userList',
355                        attrs,
356                        body
357                )
358
359                attrs.description = '';
360
361                // render 'Add user button'
362                baseElement.call(
363                        '_userAddButton',
364                        attrs,
365                        body
366                )
367        }
368
369        /**
370         * Renders an input box for publications
371         */
372        def userSelect = { attrs, body ->
373                if (attrs.get('value') == null) {
374                        attrs.value = [];
375                }
376                if (attrs.get('description') == null) {
377                        attrs.description = '';
378                }
379               
380                out << '<form id="' + attrs.name + '_form" onSubmit="return false;">';
381                out << select(
382                        name: attrs.get("name"),
383                        value: '',
384                        from: SecUser.list(),
385                        optionValue: 'username',
386                        optionKey: 'id',
387                        style: 'width: 400px;'
388                );
389                out << '</form>';
390        }
391
392        def _userList = { attrs, body ->
393                def display_none = 'none';
394                if (!attrs.get('value') || attrs.get('value').size() == 0) {
395                        display_none = 'inline';
396                }
397
398                // Add a unordered list
399                out << '<ul class="user_list" id="' + attrs.name + '_list">';
400
401                out << '<li>';
402                out << '<span class="user_none" id="' + attrs.name + '_none" style="display: ' + display_none + ';">';
403                out << '-';
404                out << '</span>';
405                out << '</li>';
406
407                out << '</ul>';
408
409                // Add the publications using javascript
410                out << '<script type="text/javascript">'
411                if (attrs.get('value') && attrs.get('value').size() > 0) {
412                        def i = 0;
413                        attrs.get('value').each {
414                                out << 'showUser( ';
415                                out << '  "' + attrs.name + '",';
416                                out << '  ' + it.id + ',';
417                                out << '  "' + it.username + '",';
418                                out << '  ' + i++;
419                                out << ');';
420                        }
421                }
422                out << '</script>';
423
424                def ids;
425                if (attrs.get('value') && attrs.get('value').size() > 0) {
426                        ids = attrs.get('value').id.join(',')
427                } else {
428                        ids = '';
429                }
430                out << '<input type="hidden" name="' + attrs.name + '_ids" value="' + ids + '" id="' + attrs.name + '_ids">';
431        }
432
433        def _userAddButton = { attrs, body ->
434                if( attrs.get( 'noForm', false ) ) {
435                        // Only show the add button. The dialog that is created with this method otherwise,
436                        // should be created somewhere outside the form.
437                } else {
438                        out << userDialog( attrs, body );
439                }
440
441                out << '<input type="button" onClick="openUserDialog(\'' + attrs.name + '\' );" value="Add User">';
442        }
443       
444        def userDialog = { attrs, body ->
445                // Output the dialog for the publications
446                out << '<div id="' + attrs.name + '_dialog">';
447                out << '<p>Select a user from the database.</p>';
448                out << userSelect(attrs, body);
449                out << '</div>';
450                out << '<script type="text/javascript">';
451                out << '  createUserDialog( "' + attrs.name + '" );'
452                out << '</script>';
453        }
454
455}
Note: See TracBrowser for help on using the repository browser.