source: trunk/grails-app/controllers/EntryDetailedController.groovy @ 859

Last change on this file since 859 was 859, checked in by gav, 10 years ago

Rework entry create and save ajax to allow multiple page element updates with JSON.

File size: 7.7 KB
Line 
1import org.codehaus.groovy.grails.plugins.springsecurity.Secured
2
3@Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_TaskManager', 'ROLE_TaskUser'])
4class EntryDetailedController extends BaseController {
5
6    def authService
7    def taskService
8
9    def index = { redirect(action:list,params:params) }
10
11    // the delete, save and update actions only accept POST requests
12    static allowedMethods = [delete:'POST', save:'POST', update:'POST', ajaxCreate:'POST', ajaxSave:'POST']
13
14    def list = {
15        if(!params.max) params.max = 10
16        [ entryInstanceList: Entry.list( params ) ]
17    }
18
19    def show = {
20        def entryInstance = Entry.get( params.id )
21
22        if(!entryInstance) {
23            flash.message = "Entry not found with id ${params.id}"
24            redirect(controller: 'taskDetailed', action: 'search')
25        }
26        else { return [ entryInstance : entryInstance ] }
27    }
28
29    def delete = {
30        def entryInstance = Entry.get( params.id )
31        if(entryInstance) {
32            if(entryInstance.enteredBy.loginName == authService.currentUser.loginName) {
33                def taskId = entryInstance.task.id
34                entryInstance.delete(flush:true)
35                flash.message = "Entry ${params.id} deleted"
36                redirect(controller: 'taskDetailed', action: 'show', id: taskId)
37            }
38            else {
39                flash.message = "You may only delete your own entries."
40                redirect(action:show,id:entryInstance.id)
41            }
42
43        }
44        else {
45            flash.message = "Entry not found with id ${params.id}"
46            redirect(controller: "taskDetailed", action:"search")
47        }
48    }
49
50    def edit = {
51        def entryInstance = Entry.get( params.id )
52        if(!entryInstance) {
53                flash.message = "Entry not found with id ${params.id}"
54                redirect(controller: "taskDetailed", action:"search")
55        }
56        else {
57
58            if(entryInstance.enteredBy.loginName == authService.currentUser.loginName) {
59                return [ entryInstance : entryInstance ]
60            }
61            else {
62                flash.message = "You may only edit your own entries."
63                redirect(action:show,id:entryInstance.id)
64            }
65
66        }
67    }
68
69    /// @todo: Refactor to taskService and include moving task to "In Progress" when Entry.duration is updated.
70    def update = {
71        def entryInstance = Entry.get( params.id )
72        if(entryInstance) {
73            // The update method only accepts post requests, so this is just in case.
74            if(entryInstance.enteredBy.loginName == authService.currentUser.loginName) {
75                entryInstance.properties = params
76                if(!entryInstance.hasErrors() && entryInstance.save(flush: true)) {
77                    // If PM Entry update task.highestSeverity
78                    if(entryInstance.entryType.id == 6) {
79                        def clist = []
80                        entryInstance.task.entries.each { entry ->
81                            if(entry.entryType.id == 6)
82                                clist << entry.highestSeverity
83                        }
84
85                        if(clist)
86                            entryInstance.task.highestSeverity = clist.sort{p1,p2 -> p2.id <=> p1.id}[0]
87                    }
88                    flash.message = "Entry ${params.id} updated"
89                    redirect(action:show,id:entryInstance.id)
90                }
91                else {
92                    render(view:'edit',model:[entryInstance:entryInstance])
93                }
94            }
95            else {
96                flash.message = "You may only edit your own entries."
97                redirect(action:show,id:entryInstance.id)
98            }
99        }
100        else {
101            flash.message = "Entry not found with id ${params.id}"
102            redirect(controller: "taskDetailed", action:"search")
103        }
104    }
105
106    def ajaxCreate = {
107        if(!params.taskId || !params.entryTypeId) {
108            params.errorMessage = g.message(code: "entry.create.no.params.ajax")
109            render(contentType:"text/json", status: 403, template: "/shared/messages")
110            return
111        }
112
113        def taskInstance = Task.read(params.taskId)
114
115        if(!taskInstance) {
116            params.errorMessage = g.message(code:"default.not.found", args:['Task',params.taskId])
117            render(contentType:"text/json", status: 403, template: "/shared/messages")
118            return
119        }
120
121        // Check for Complete task.
122        if(taskInstance.taskStatus.id == 3) {
123            params.errorMessage = g.message(code:"task.operationNotPermittedOnCompleteTask")
124            render(contentType:"text/json", status: 403, template: "/shared/messages")
125            return
126        }
127
128        // Success.
129        def entryInstance = new Entry()
130        entryInstance.task = taskInstance
131        entryInstance.entryType = EntryType.read(params.entryTypeId)
132        def model = ['entryInstance': entryInstance]
133
134        render(contentType:"text/json") {
135            updates = array {
136                element([ mode: 'replace', target:"$params.target", content: g.render(template: 'create', model:model) ])
137            }
138        }
139
140    } // ajaxCreate
141
142    def ajaxSave = {
143        def result = taskService.saveEntry(params)
144
145        // Success.
146        if(!result.error) {
147            def entryList = Entry.withCriteria {
148                                            eq("entryType", result.entryInstance.entryType)
149                                            task {
150                                                idEq(result.taskId)
151                                            }
152                                    }
153
154            def model = ['entryList': entryList]
155
156            render(contentType:"text/json") {
157                updates = array {
158                    element([ mode: 'replace', target:"$params.target", content: g.render(template: 'list', model:model) ])
159                }
160            }
161            return
162        }
163
164        if(result.error.code != "default.create.failure")
165            params.errorMessage = g.message(code: result.error.code)
166
167        def model = ['entryInstance': result.entryInstance]
168        render(contentType:"text/json", status: 403, template: "create", model: model)
169    } // ajaxSave
170
171    def create = {
172        if(!params.taskInstance?.id || !params.entryType?.id) {
173            flash.message = g.message(code:"entry.create.no.params")
174            redirect(controller:"taskDetailed", action:"search")
175            return
176        }
177
178        def taskInstance = Task.read(params.taskInstance.id)
179
180        if(!taskInstance) {
181            flash.message = g.message(code:"task.notFound")
182            redirect(controller:"taskDetailed", action:"search")
183            return
184        }
185
186        // Check for Complete task.
187        if(taskInstance.taskStatus.id == 3) {
188            flash.errorMessage = g.message(code:"task.operationNotPermittedOnCompleteTask")
189            redirect(controller:"taskDetailed", action:"show", id: taskInstance.id)
190            return
191        }
192
193        def entryInstance = new Entry()
194        entryInstance.task = taskInstance
195        entryInstance.entryType = EntryType.read(params.entryType.id)
196        return ['entryInstance': entryInstance]
197    } // create
198
199    def save = {
200        def result = taskService.saveEntry(params)
201
202        if(!result.error) {
203            flash.message = "Entry created."
204            redirect(controller: "taskDetailed", action: "show", id: result.taskId)
205            return
206        }
207
208        if(result.error.code != "default.create.failure") {
209            params.errorMessage = g.message(code: result.error.code)
210        }
211
212        render(view:'create',model:[entryInstance: result.entryInstance])
213    } // save
214
215} // end class
Note: See TracBrowser for help on using the repository browser.