source: trunk/grails-app/controllers/AssetSubItemDetailedController.groovy @ 658

Last change on this file since 658 was 658, checked in by gav, 14 years ago

Show AssetSubItem after update, since returning to an Asset makes no sense.

File size: 8.8 KB
Line 
1import org.codehaus.groovy.grails.plugins.springsecurity.Secured
2import org.codehaus.groovy.grails.commons.ConfigurationHolder
3import org.apache.commons.lang.WordUtils
4
5@Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_AssetManager'])
6class AssetSubItemDetailedController extends BaseController {
7
8    def filterService
9    def exportService
10    def assetSubItemService
11
12    // the delete, save and update actions only accept POST requests
13    static allowedMethods = [delete:'POST', save:'POST', update:'POST']
14
15    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_AssetManager', 'ROLE_AssetUser'])
16    def index = { redirect(action:search,params:params) }
17
18    /**
19    * Set session.assetSubItemSearchParamsMax
20    */
21    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_AssetManager', 'ROLE_AssetUser'])
22    def setSearchParamsMax = {
23        def max = 1000
24        if(params.newMax?.isInteger()) {
25            def i = params.newMax.toInteger()
26            if(i > 0 && i <= max)
27                session.assetSubItemSearchParamsMax = params.newMax
28            if(i > max)
29                session.assetSubItemSearchParamsMax = max
30        }
31        forward(action: 'search', params: params)
32    }
33
34    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_AssetManager', 'ROLE_AssetUser'])
35    def search = {
36
37        if(session.assetSubItemSearchParamsMax)
38            params.max = session.assetSubItemSearchParamsMax
39
40        params.max = Math.min( params.max ? params.max.toInteger() : 10,  1000)
41
42        def assetSubItemInstanceList = []
43        def assetSubItemInstanceTotal
44        def filterParams = [:]
45
46        // Quick Search:
47        if(!params.filter) {
48            assetSubItemInstanceList = AssetSubItem.list( params )
49            assetSubItemInstanceTotal = AssetSubItem.count()
50            filterParams.quickSearch = params.quickSearch
51        }
52        else {
53        // filterPane:
54            assetSubItemInstanceList = filterService.filter( params, AssetSubItem )
55            assetSubItemInstanceTotal = filterService.count( params, AssetSubItem )
56            filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
57        }
58
59        // export plugin:
60        if(params?.format && params.format != "html") {
61
62            def dateFmt = { date ->
63                formatDate(format: "EEE, dd-MMM-yyyy", date: date)
64            }
65
66            String title = "AssetSubItem List."
67
68            response.contentType = ConfigurationHolder.config.grails.mime.types[params.format]
69            response.setHeader("Content-disposition", "attachment; filename=assets.${params.extension}")
70            List fields = ["name",
71                                "description"]
72            Map labels = ["name": "AssetSubItem",
73                                "description": "Description"]
74
75            Map formatters = [:]
76            Map parameters = [title: title, separator: ","]
77
78            exportService.export(params.format,
79                                                response.outputStream,
80                                                assetSubItemInstanceList.sort { p1, p2 -> p1.name.compareToIgnoreCase(p2.name) },
81                                                fields,
82                                                labels,
83                                                formatters,
84                                                parameters)
85        }
86
87        // Add some basic params to filterParams.
88        filterParams.max = params.max
89        filterParams.offset = params.offset?.toInteger() ?: 0
90        filterParams.sort = params.sort ?: "id"
91        filterParams.order = params.order ?: "desc"
92
93        return[ assetSubItemInstanceList: assetSubItemInstanceList,
94                assetSubItemInstanceTotal: assetSubItemInstanceTotal,
95                filterParams: filterParams ]
96
97    } // end search()
98
99    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_AssetManager', 'ROLE_AssetUser'])
100    def show = {
101
102        // In the case of an actionSubmit button, rewrite action name from 'index'.
103        if(params._action_Show)
104            params.action='show'
105
106        def assetSubItemInstance = AssetSubItem.get( params.id )
107
108        if(!assetSubItemInstance) {
109            flash.message = "AssetSubItem not found with id ${params.id}"
110            redirect(action: "search")
111        }
112        else { return [ assetSubItemInstance : assetSubItemInstance ] }
113    }
114
115    def delete = {
116        def result = assetSubItemService.delete(params)
117
118        if(!result.error) {
119            flash.message = g.message(code: "default.delete.success", args: ["AssetSubItem", params.id])
120            redirect(action: search)
121            return
122        }
123
124        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
125
126        if(result.error.code == "default.not.found") {
127            redirect(action: search)
128            return
129        }
130
131        redirect(action:show, id: params.id)
132    }
133
134    def edit = {
135
136        // In the case of an actionSubmit button, rewrite action name from 'index'.
137        if(params._action_Edit)
138            params.action='edit'
139
140        def assetSubItemInstance = AssetSubItem.get( params.id )
141
142        if(!assetSubItemInstance) {
143            flash.message = "AssetSubItem not found with id ${params.id}"
144            redirect(action: "search")
145            return
146        }
147
148        def possibleParentItems = assetSubItemService.possibleParentItems(assetSubItemInstance)
149
150        return [ assetSubItemInstance : assetSubItemInstance, possibleParentItems: possibleParentItems ]
151    }
152
153    def update = {
154        def assetSubItemInstance = AssetSubItem.get( params.id )
155        if(assetSubItemInstance) {
156            if(params.version) {
157                def version = params.version.toLong()
158                if(assetSubItemInstance.version > version) {
159
160                    assetSubItemInstance.errors.rejectValue("version", "default.optimistic.locking.failure")
161                    render(view:'edit',model:[assetSubItemInstance:assetSubItemInstance])
162                    return
163                }
164            }
165
166            assetSubItemInstance.properties = params
167
168            use(WordUtils) {
169                assetSubItemInstance.name = assetSubItemInstance.name.capitalize()
170                assetSubItemInstance.description = assetSubItemInstance.description.capitalize()
171            }
172
173            if(assetSubItemInstance.assets) {
174                assetSubItemInstance.parentItem = null
175            }
176
177            if(!assetSubItemInstance.hasErrors() && assetSubItemInstance.save(flush: true)) {
178                flash.message = "Sub Item '${assetSubItemInstance.name}' updated"
179                redirect(action:"show", id: assetSubItemInstance.id)
180            }
181            else {
182                render(view:'edit',model:[assetSubItemInstance:assetSubItemInstance])
183            }
184        }
185        else {
186            flash.message = "AssetSubItem not found with id ${params.id}"
187            redirect(action: "search")
188        }
189    } // update
190
191    def create = {
192        def result = assetSubItemService.create(params)
193
194        if(!result.error)
195            return [assetSubItemInstance: result.assetSubItemInstance, assetInstance: result.assetInstance]
196
197        flash.message = g.message(code: result.error.code, args: result.error.args)
198        redirect(controller: 'assetDetailed', action: 'search')
199    }
200
201    def save = {
202        def result = assetSubItemService.save(params)
203
204        if(!result.error) {
205            // Success.
206            flash.message = g.message(code: "default.create.success", args: ["Sub Item", "'${result.assetSubItemInstance.name}'"])
207
208            /// @todo: This just grabs the first parent in an unsorted list and needs improving.
209            if(result.assetSubItemInstance.assets)
210                redirect(controller: "assetDetailed", action:"show", id: result.assetSubItemInstance.assets.toArray()[0].id)
211            else {
212                //Get the top parentItem.
213                def parentItem = result.assetSubItemInstance.parentItem
214                def i = 0
215                while(parentItem?.parentItem) {
216                    parentItem = parentItem.parentItem
217                    // Protect against infinite recurrsion.
218                    i++
219                    if(i > 100)
220                        break
221                }
222
223                if(parentItem?.assets)
224                    redirect(controller: "assetDetailed", action:"show", id: parentItem.assets.toArray()[0].id)
225                else
226                    redirect(action:"show", id: result.assetSubItemInstance.id) // End stop if all else fails.
227            }
228            return
229        }
230
231        if(result.error.code == "assetSubItem.asset.not.found")
232            flash.errorMessage = g.message(code: "default.create.success")
233
234        render(view:'create', model:[assetSubItemInstance: result.assetSubItemInstance, assetInstance: result.assetInstance])
235    }
236
237} // end class
Note: See TracBrowser for help on using the repository browser.