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

Last change on this file since 859 was 859, checked in by gav, 9 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.