source: trunk/grails-app/controllers/dbnp/studycapturing/TermEditorController.groovy @ 588

Last change on this file since 588 was 588, checked in by duh, 12 years ago
  • general improvements to the termEditor

-- feedback is more clear (resolves feature request #120)
-- separated info / error and feedback info boxes
-- improved the layout
-- ontology-chooser now allows instance options to
--- show/hide a div element (usefull for buttons to show only when an autocomplete option was selected)
--- show a spinner when searching

  • general web application improvement to capture F4 page refreshes, backspace browser navigation events and accidental submits when pressing 'enter' in an input box
  • Property svn:keywords set to Date Author Rev
File size: 3.2 KB
Line 
1/**
2 * TermEditorController Controller
3 *
4 * Webflow driven term editor
5 *
6 * @author  Jeroen Wesbeek
7 * @since       20100420
8 * @package     studycapturing
9 *
10 * Revision information:
11 * $Rev: 588 $
12 * $Author: duh $
13 * $Date: 2010-06-18 14:41:55 +0000 (vr, 18 jun 2010) $
14 */
15package dbnp.studycapturing
16
17import dbnp.data.Term
18import dbnp.data.Ontology
19
20class TermEditorController {
21        /**
22         * index closure
23         */
24    def index = {
25                // got a ontology get parameter?
26                def ontologies = (params.ontologies) ? params.ontologies : null
27
28                // enter the flow!
29        redirect(action: 'pages', params:["ontologies":ontologies])
30    }
31
32        /**
33         * Webflow
34         */
35        def pagesFlow = {
36                // start the flow
37                onStart {
38                        println ".start term / ontology editor flow"
39
40                        if (params.ontologies) {
41                                flow.ontologies         = params.ontologies
42                                flow.ontologiesList     = []
43                                params.ontologies.split(/\,/).each() { ncboId ->
44                                        // trim the id
45                                        ncboId.trim()
46
47                                        // and add to the flow scope
48                                        flow.ontologiesList[ flow.ontologies.size() ] = ncboId
49                                }
50                        }
51                }
52
53                // main term editor page
54                terms {
55                        render(view: "terms")
56                        onRender {
57                                println ".rendering term selection popup"
58                        }
59                        on("add") {
60                                println params
61                                def ontology = Ontology.findByNcboVersionedId( params.get('term-ontology_id') as int )
62                def strTerm = params.get('term')
63
64                                // do we have an ontology?
65                                if (!ontology && params.get('term-ontology_id')) {
66                                        println ".ontology missing, first fetch ontology information"
67
68                                        // use the NCBO REST service to fetch ontology information
69                                        try {
70                                                def url = "http://rest.bioontology.org/bioportal/ontologies/" + params.get('term-ontology_id')
71                                                def xml = new URL( url ).getText()
72                                                def data = new XmlParser().parseText( xml )
73                                                def bean = data.data.ontologyBean
74
75                                                // instantiate Ontology with the proper values
76                                                ontology = Ontology.getBioPortalOntologyByVersionedId( params.get('term-ontology_id') ).save(flush:true)
77
78                                                if (ontology.validate()) {
79                                                        ontology.save(flush:true)
80                                                }
81                                        } catch (Exception e) {
82                                                // something went wrong, probably the
83                                                // ontology-id is invalid (hence, the term
84                                                // is invalid)
85                                                flash.errors = ["We could not add the ontology for this term, please try again"]
86                                        }
87                                }
88
89                                // instantiate term with parameters
90                                def term = new Term(
91                                        name: strTerm,
92                                        ontology: ontology,
93                                        accession: params.get('term-concept_id')
94                                )
95
96                                // validate term
97                                if (term.validate()) {
98                                        // save the term to the database
99                                        if (term.save(flush:true)) {
100                                                flash.message = "'" + params.get('term') + "' was successfully added, either search for another term to add or close this window"
101                                                success()
102                                        } else {
103                                                flash.errors = ["We encountered a problem while storing the selected term. Please try again."]
104                                                term.errors.each() { println it }
105                                                error()
106                                        }
107                                } else {
108                                        // term did not validate properly
109                                        term.errors.each() { println it }
110                                        if (term.errors =~ 'unique') {
111                                                flash.errors = ["'" + params.get('term') + "' already exists, either search for another term or close this window"]
112                                        } else {
113                                                flash.errors = ["We encountered a problem while storing the selected term. Please try again."]                                         
114                                        }
115                                       
116                                        error()
117                                }
118                        }.to "terms"
119                }
120        }
121}
Note: See TracBrowser for help on using the repository browser.