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

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