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

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

Add task show tab header and control button update elements on entry save.

File size: 8.2 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            def taskModel = ['taskInstance': entryList[0].task]
156
157            render(contentType:"text/json") {
158                updates = array {
159                    element([ mode: 'replace', target:"$params.target", content: g.render(template: 'list', model:model) ])
160                    element([ mode: 'replace',
161                                    target:".tabHeader",
162                                    content: g.render(template: '/taskDetailed/showTabHeader', model:taskModel) ])
163                    element([ mode: 'replace',
164                                    target:"#taskControlButtons",
165                                    content: g.render(template: '/taskDetailed/showTaskControlButtons', model:taskModel) ])
166                }
167            }
168            return
169        }
170
171        if(result.error.code != "default.create.failure")
172            params.errorMessage = g.message(code: result.error.code)
173
174        def model = ['entryInstance': result.entryInstance]
175        render(contentType:"text/json", status: 403, template: "create", model: model)
176    } // ajaxSave
177
178    def create = {
179        if(!params.taskInstance?.id || !params.entryType?.id) {
180            flash.message = g.message(code:"entry.create.no.params")
181            redirect(controller:"taskDetailed", action:"search")
182            return
183        }
184
185        def taskInstance = Task.read(params.taskInstance.id)
186
187        if(!taskInstance) {
188            flash.message = g.message(code:"task.notFound")
189            redirect(controller:"taskDetailed", action:"search")
190            return
191        }
192
193        // Check for Complete task.
194        if(taskInstance.taskStatus.id == 3) {
195            flash.errorMessage = g.message(code:"task.operationNotPermittedOnCompleteTask")
196            redirect(controller:"taskDetailed", action:"show", id: taskInstance.id)
197            return
198        }
199
200        def entryInstance = new Entry()
201        entryInstance.task = taskInstance
202        entryInstance.entryType = EntryType.read(params.entryType.id)
203        return ['entryInstance': entryInstance]
204    } // create
205
206    def save = {
207        def result = taskService.saveEntry(params)
208
209        if(!result.error) {
210            flash.message = "Entry created."
211            redirect(controller: "taskDetailed", action: "show", id: result.taskId)
212            return
213        }
214
215        if(result.error.code != "default.create.failure") {
216            params.errorMessage = g.message(code: result.error.code)
217        }
218
219        render(view:'create',model:[entryInstance: result.entryInstance])
220    } // save
221
222} // end class
Note: See TracBrowser for help on using the repository browser.