Subversion Repositories bacoAlunos

Rev

Rev 1875 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1875 Rev 1916
Line 1... Line 1...
1
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
1
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
2
<%@ page import="jomm.dao.impl.AbstractDao" %>
2
<%@ page import="jomm.dao.impl.AbstractDao" %>
3
<%@ page import="pt.estgp.estgweb.domain.CourseImpl" %>
3
<%@ page import="pt.estgp.estgweb.domain.CourseImpl" %>
4
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
4
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
5
<%@ page import="pt.estgp.estgweb.utils.documentBuilder.TextComponent" %>
5
<%@ page import="pt.utl.ist.berserk.logic.serviceManager.IServiceManager" %>
6
<%@ page import="pt.estgp.estgweb.utils.documentBuilder.ImageComponent" %>
6
<%@ page import="pt.utl.ist.berserk.logic.serviceManager.ServiceManager" %>
7
<%@ page import="pt.estgp.estgweb.services.courses.CourseReportServices" %>
7
<%@ page import="pt.estgp.estgweb.web.utils.RequestUtils" %>
8
<%@ page import="pt.estgp.estgweb.services.courses.coursereport.documentmodel.CourseReportDocument" %>
-
 
9
<%@ page import="org.json.JSONException" %>
-
 
10
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
8
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
11
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
9
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
12
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
10
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
13
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
11
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
14
<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
12
<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
15
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
13
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
16
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
14
<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
-
 
15
 
-
 
16
<%-- http://localhost:8080/baco/user/editCourseReport.do?courseCode=44&year=201617 --%>
17
 
17
 
18
<link rel="stylesheet" href="<%=request.getContextPath()%>/js/jquery-ui-1.12.1/jquery-ui.css">
18
<link rel="stylesheet" href="<%=request.getContextPath()%>/js/jquery-ui-1.12.1/jquery-ui.css">
19
<script src="<%=request.getContextPath()%>/js/jquery-ui-1.12.1/jquery-ui.min.js"></script>
19
<script src="<%=request.getContextPath()%>/js/jquery-ui-1.12.1/jquery-ui.min.js"></script>
20
<link rel="stylesheet" href="<%=request.getContextPath()%>/css/flora-commons/flora.resizable.css">
20
<link rel="stylesheet" href="<%=request.getContextPath()%>/css/flora-commons/flora.resizable.css">
21
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>
21
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>
Line 64... Line 64...
64
                    boundary += Math.floor(Math.random()*32768);
64
                    boundary += Math.floor(Math.random()*32768);
65
                    boundary += Math.floor(Math.random()*32768);
65
                    boundary += Math.floor(Math.random()*32768);
66
 
66
 
67
                    var body = '';
67
                    var body = '';
68
                    body += '--' + boundary + '\r\n' +
68
                    body += '--' + boundary + '\r\n' +
69
                            'Content-Disposition: form-data; name="filesInputId-UPLOAD[]"; filename="20170530_210340.pdf"' + '\r\n';
69
                    'Content-Disposition: form-data; name="filesInputId-UPLOAD[]"; filename="20170530_210340.pdf"' + '\r\n';
70
                    body += 'Content-Type: application/pdf';
70
                    body += 'Content-Type: application/pdf';
71
                    body += '\r\n\r\n';
71
                    body += '\r\n\r\n';
72
                    body += pdfDocument;
72
                    body += pdfDocument;
73
                    body += '\r\n'
73
                    body += '\r\n'
74
                    body += '--' + boundary + '--';
74
                    body += '--' + boundary + '--';
Line 91... Line 91...
91
        );
91
        );
92
    }
92
    }
93
</script>
93
</script>
94
 
94
 
95
<%
95
<%
96
 
-
 
97
    String courseCode = request.getParameter("courseCode");
96
    String courseCode = request.getParameter("courseCode");
98
    String year = request.getParameter("year");
97
    String year = request.getParameter("year");
99
    AbstractDao.getCurrentSession().beginTransaction();
-
 
100
    CourseImpl courseImpl = DaoFactory.getCourseDaoImpl().findCourseByCode(courseCode);
-
 
101
    request.setAttribute("course",courseImpl);
-
 
-
 
98
 
102
    CourseReportDocument courseReport = null;
99
    String courseReportJson = null;
103
    try {
100
    try {
-
 
101
        IServiceManager sm = ServiceManager.getInstance();
104
        courseReport = new CourseReportServices().createNewCourseReportDocument(courseCode, year);
102
        courseReportJson = (String) sm.execute(RequestUtils.getRequester(request, response),
105
    } catch (Throwable e) {
103
                "LoadCourseReportDocument",
-
 
104
                new Object[]{courseCode, year});
106
        System.out.println(e);
105
    } catch (Throwable throwable) {
107
        e.printStackTrace();
106
        throwable.printStackTrace();
108
    }
107
    }
109
    String courseReportJson = courseReport.toJson();
-
 
110
    request.setAttribute("courseDocumentJson",courseReportJson);
108
    request.setAttribute("courseDocumentJson",courseReportJson);
111
    request.setAttribute("courseDocument",courseReport);
-
 
112
 
109
 
-
 
110
 
-
 
111
    AbstractDao.getCurrentSession().beginTransaction();
-
 
112
    CourseImpl courseImpl = DaoFactory.getCourseDaoImpl().findCourseByCode(courseCode);
-
 
113
    request.setAttribute("course",courseImpl);
-
 
114
 
-
 
115
    //request.setAttribute("courseDocument",courseReport);
113
%>
116
%>
114
<%--<a href="javascript:demoFromHTML()" class="button">Run Code</a>--%>
117
<%--<a href="javascript:demoFromHTML()" class="button">Run Code</a>--%>
115
 
118
 
116
<div class="container-fluid">
119
<div class="container-fluid">
117
 
120
 
118
<style>
121
    <style>
119
    .separatorSection
122
        .separatorSection
120
    {
123
        {
121
        border: 1px solid #ddd;
124
            border: 1px solid #ddd;
122
    }
125
        }
123
</style>
126
    </style>
124
 
127
 
125
 
128
 
126
<!-- Apresentacao da Unidade -->
129
    <!-- Apresentacao da Unidade -->
127
 
130
 
128
<div class="panel panel-default">
131
    <div class="panel panel-default">
129
<div class="panel-heading">
132
        <div class="panel-heading">
130
    Relatório Anual do curso: ${course.name}
133
            Relatório Anual do curso: ${course.name}
131
</div>
134
        </div>
132
<div class="panel-body">
135
        <div class="panel-body">
133
 
136
 
134
<p><b class="label-info">Tipo de Curso:</b> <bean:message key="course.${course.degree}"/></p>
137
            <p><b class="label-info">Tipo de Curso:</b> <bean:message key="course.${course.degree}"/></p>
135
<p><b class="label-info">Ano Lectivo:</b> ${course.importYear}</p>
138
            <p><b class="label-info">Ano Lectivo:</b> ${course.importYear}</p>
136
<p><b class="label-info">Departamento:</b> ${course.department.name}</p>
139
            <p><b class="label-info">Departamento:</b> ${course.department.name}</p>
137
<p><b class="label-info">Escola:</b> ${course.department.courseSchool.name}</p>
140
            <p><b class="label-info">Escola:</b> ${course.department.courseSchool.name}</p>
138
 
141
 
139
 
142
 
140
 
143
 
141
 
144
 
142
<script>
145
            <script>
143
 
146
 
144
    //Especifico da aplicacao
147
                //Especifico da aplicacao
145
    var courseReportApp = angular.module('courseReportApp', ['ui.tree']);
148
                var courseReportApp = angular.module('courseReportApp', ['ui.tree']);
146
    GLOBAL_BacoAngularAppDependencies.push('courseReportApp');
149
                GLOBAL_BacoAngularAppDependencies.push('courseReportApp');
147
 
-
 
148
 
-
 
149
    courseReportApp.directive('resizable', function () {
-
 
150
        return {
-
 
151
            restrict: 'A',
-
 
152
            scope: {
-
 
153
                callback: '&onResize'
-
 
154
            },
-
 
155
            link: function postLink(scope, elem, attrs) {
-
 
156
                elem.resizable();
-
 
157
                elem.on('resize', function (evt, ui, comp) {
-
 
158
                    scope.$apply(function() {
-
 
159
                        if (scope.callback) {
-
 
160
                            scope.callback({$evt: evt, $ui: ui, $comp: comp });
-
 
161
                        }
-
 
162
                    })
-
 
163
                });
-
 
164
            }
-
 
165
        };
-
 
166
    });
-
 
167
 
150
 
168
 
151
 
169
    courseReportApp.controller('courseReportAppController', function($scope)
152
                courseReportApp.directive('resizable', function () {
-
 
153
                    return {
-
 
154
                        restrict: 'A',
-
 
155
                        scope: {
-
 
156
                            callback: '&onResize'
-
 
157
                        },
-
 
158
                        link: function postLink(scope, elem, attrs) {
-
 
159
                            elem.resizable();
-
 
160
                            elem.on('resize', function (evt, ui, comp) {
-
 
161
                                scope.$apply(function() {
-
 
162
                                    if (scope.callback) {
-
 
163
                                        scope.callback({$evt: evt, $ui: ui, $comp: comp });
-
 
164
                                    }
-
 
165
                                })
-
 
166
                            });
-
 
167
                        }
-
 
168
                    };
170
    {
169
                });
171
 
170
 
172
        $scope.docAppSelector = "#courseReportApp";
-
 
173
        $scope.report = <%=courseReportJson%>
-
 
174
 
171
 
175
                $scope.resize = function(evt,ui,comp) {
172
                courseReportApp.controller('courseReportAppController', function($scope)
176
                    //console.log (evt,ui);
-
 
177
                    comp.width = ui.size.width;
-
 
178
                    comp.height = ui.size.height;
-
 
179
                }
-
 
180
 
-
 
181
        /**
-
 
182
         * @classe class to match
-
 
183
         * @superClasses array of strings
-
 
184
         * */
-
 
185
        $scope.contains = function(obj,classe)
-
 
186
        {
-
 
187
            if(obj['@class'] && obj['@class'] == classe)
-
 
188
                return true;
-
 
189
            if(obj.allSuperClasses)
-
 
190
            {
-
 
191
                for(var i in obj.allSuperClasses)
-
 
192
                {
173
                {
193
                    if(classe == obj.allSuperClasses[i])
-
 
194
                        return true;
-
 
195
                }
-
 
196
            }
-
 
197
            return false;
-
 
198
        }
-
 
199
 
174
 
200
        $scope.showSep = function(section,subSection)
-
 
201
        {
-
 
202
            var s;
-
 
203
            for(s in section.sections)
-
 
204
            {
-
 
205
                section.sections[s].active = false;
175
                    $scope.docAppSelector = "#courseReportApp";
206
            }
-
 
207
            /*$(".separatorSectionNav").each(function()
176
                    $scope.report = <%=courseReportJson%>
208
             {
-
 
209
             angular.element($(this)).scope().section.active = false;
-
 
210
             });*/
-
 
211
            subSection.active = true;
-
 
212
        }
-
 
213
 
177
 
214
        /**
-
 
215
         * Este metodo devolve o template mais profundo na hierarquia de classes
-
 
216
         * permitindo emular o override, quanto mais especifica for a classe
178
                            $scope.resize = function(evt,ui,comp) {
217
         * e caso exista template é esse o template devolvido
179
                                //console.log (evt,ui);
218
         * procura um script com o id da classe e se nao existir
180
                                comp.width = ui.size.width;
219
         * vai subindo nas super classes
181
                                comp.height = ui.size.height;
220
         * @param obj
-
 
221
         * @returns {*}
182
                            }
222
         */
-
 
223
        $scope.class2id = function(obj)
-
 
224
        {
183
 
225
            var objClassId = obj["@class"].replaceAll(".","_");
-
 
226
            if($("script#" + objClassId).length > 0)
-
 
227
            {
184
                    /**
228
                return objClassId;
185
                     * @classe class to match
229
            }
-
 
230
            if(obj.allSuperClasses)
186
                     * @superClasses array of strings
231
            {
-
 
232
                var s;
187
                     * */
233
                for(s in obj.allSuperClasses)
-
 
234
                {
-
 
235
                    var superClass = obj.allSuperClasses[s];
188
                    $scope.contains = function(obj,classe)
236
                    var superClassId = superClass.replaceAll(".","_");
-
 
237
                    if($("script#" + superClassId).length > 0)
-
 
238
                    {
189
                    {
-
 
190
                        if(obj['@class'] && obj['@class'] == classe)
-
 
191
                            return true;
-
 
192
                        if(obj.allSuperClasses)
-
 
193
                        {
-
 
194
                            for(var i in obj.allSuperClasses)
-
 
195
                            {
-
 
196
                                if(classe == obj.allSuperClasses[i])
-
 
197
                                    return true;
-
 
198
                            }
-
 
199
                        }
239
                        return superClassId;
200
                        return false;
240
                    }
201
                    }
241
                }
-
 
242
            }
-
 
243
            return obj["@class"].replaceAll(".","_");
-
 
244
        }
-
 
245
 
202
 
246
        $scope.addText = function(parentCustomPane)
203
                    $scope.showSep = function(section,subSection)
247
        {
204
                    {
-
 
205
                        var s;
-
 
206
                        for(s in section.sections)
-
 
207
                        {
-
 
208
                            section.sections[s].active = false;
-
 
209
                        }
-
 
210
                        /*$(".separatorSectionNav").each(function()
-
 
211
                         {
248
            $scope.addSimpleDocComponent(parentCustomPane,"pt.estgp.estgweb.utils.documentBuilder.TextComponent")
212
                         angular.element($(this)).scope().section.active = false;
-
 
213
                         });*/
-
 
214
                        subSection.active = true;
249
        }
215
                    }
250
 
216
 
-
 
217
                    /**
-
 
218
                     * Este metodo devolve o template mais profundo na hierarquia de classes
-
 
219
                     * permitindo emular o override, quanto mais especifica for a classe
-
 
220
                     * e caso exista template é esse o template devolvido
-
 
221
                     * procura um script com o id da classe e se nao existir
-
 
222
                     * vai subindo nas super classes
-
 
223
                     * @param obj
-
 
224
                     * @returns {*}
-
 
225
                     */
251
        $scope.addImage = function(parentCustomPane)
226
                    $scope.class2id = function(obj)
252
        {
227
                    {
-
 
228
                        var objClassId = obj["@class"].replaceAll(".","_");
-
 
229
                        if($("script#" + objClassId).length > 0)
-
 
230
                        {
-
 
231
                            return objClassId;
-
 
232
                        }
-
 
233
                        if(obj.allSuperClasses)
-
 
234
                        {
-
 
235
                            var s;
-
 
236
                            for(s in obj.allSuperClasses)
-
 
237
                            {
-
 
238
                                var superClass = obj.allSuperClasses[s];
253
            $scope.addSimpleDocComponent(parentCustomPane,"pt.estgp.estgweb.utils.documentBuilder.ImageComponent")
239
                                var superClassId = superClass.replaceAll(".","_");
-
 
240
                                if($("script#" + superClassId).length > 0)
-
 
241
                                {
-
 
242
                                    return superClassId;
-
 
243
                                }
-
 
244
                            }
-
 
245
                        }
-
 
246
                        return obj["@class"].replaceAll(".","_");
254
        }
247
                    }
255
 
248
 
256
        $scope.addSimpleDocComponent = function(parentCustomPane,classComponent)
249
                    $scope.addText = function(parentCustomPane)
257
        {
-
 
258
            if(!parentCustomPane.components)
-
 
259
            {
-
 
260
                parentCustomPane.components = [];
-
 
261
            }
-
 
262
            parentCustomPane.components.push(
-
 
263
                    {
250
                    {
264
                        "@class" : classComponent
251
                        $scope.addSimpleDocComponent(parentCustomPane,"pt.estgp.estgweb.utils.documentBuilder.TextComponent")
265
                    }
252
                    }
266
            );
-
 
267
        }
-
 
268
        $scope.removeComponent = function(index,array)
-
 
269
        {
-
 
270
            array.splice(index,1);
-
 
271
        }
-
 
272
 
253
 
273
        $scope.callbackUploadedFiles = function(filesUploadResult,token,targetElement)
254
                    $scope.addImage = function(parentCustomPane)
274
        {
255
                    {
275
            var modelObject = BacoAngularUtils.getAngularElementModel(targetElement);
256
                        $scope.addSimpleDocComponent(parentCustomPane,"pt.estgp.estgweb.utils.documentBuilder.ImageComponent")
-
 
257
                    }
276
 
258
 
277
            if(modelObject.image && modelObject.image.identifier)
-
 
278
            {
-
 
279
                widgetCallWithActionParameters(
-
 
280
                        "<%=request.getContextPath()%>/user/json/repository.do",
259
                    $scope.addSimpleDocComponent = function(parentCustomPane,classComponent)
281
                        "replaceRepositoryFileFromTempPrivateDomain",
-
 
282
                        {
260
                    {
283
                            "identifier" : modelObject.image.identifier,
-
 
284
                            "fileUploaded" : BacoJS.stringifyOrdered(filesUploadResult.uploadedFiles[0])
-
 
285
                        },
-
 
286
                        "#courseReportApp",
-
 
287
                        function(repositoryFile4JsonView)
261
                        if(!parentCustomPane.components)
288
                        {
262
                        {
289
                            modelObject.image = repositoryFile4JsonView;
263
                            parentCustomPane.components = [];
-
 
264
                        }
290
                            //image URL is generated on reimport just to avoid caching
265
                        parentCustomPane.components.push(
291
                            modelObject.imageUrl = "<%=request.getContextPath()%>/repositoryStream/" + modelObject.image.identifier + "?" + new Date().getTime();
266
                                {
292
                            angular.element($("#courseReportApp")).scope().$apply();
267
                                    "@class" : classComponent
293
                        },
268
                                }
294
                        function(){}
269
                        );
295
                );
270
                    }
-
 
271
                    $scope.removeComponent = function(index,array)
296
            }
272
                    {
297
            else
273
                        array.splice(index,1);
298
            {
274
                    }
-
 
275
 
-
 
276
                    $scope.callbackUploadedFiles = function(filesUploadResult,token,targetElement)
299
                widgetCallWithActionParameters(
277
                    {
300
                        "<%=request.getContextPath()%>/user/json/repository.do",
278
                        var modelObject = BacoAngularUtils.getAngularElementModel(targetElement);
-
 
279
 
301
                        "saveRepositoryFileFromTempPrivateDomain",
280
                        if(modelObject.image && modelObject.image.identifier)
302
                        {
281
                        {
-
 
282
                            widgetCallWithActionParameters(
-
 
283
                                    "<%=request.getContextPath()%>/user/json/repository.do",
-
 
284
                                    "replaceRepositoryFileFromTempPrivateDomain",
-
 
285
                                    {
-
 
286
                                        "identifier" : modelObject.image.identifier,
303
                            "fileUploaded" : BacoJS.stringifyOrdered(filesUploadResult.uploadedFiles[0])
287
                                        "fileUploaded" : BacoJS.stringifyOrdered(filesUploadResult.uploadedFiles[0])
304
                        },
288
                                    },
305
                        "#courseReportApp",
289
                                    "#courseReportApp",
306
                        function(repositoryFile4JsonView)
290
                                    function(repositoryFile4JsonView)
-
 
291
                                    {
-
 
292
                                        modelObject.image = repositoryFile4JsonView;
-
 
293
                                        //image URL is generated on reimport just to avoid caching
-
 
294
                                        modelObject.imageUrl = "<%=request.getContextPath()%>/repositoryStream/" + modelObject.image.identifier + "?" + new Date().getTime();
-
 
295
                                        angular.element($("#courseReportApp")).scope().$apply();
-
 
296
                                    },
-
 
297
                                    function(){}
-
 
298
                            );
-
 
299
                        }
-
 
300
                        else
307
                        {
301
                        {
-
 
302
                            widgetCallWithActionParameters(
-
 
303
                                    "<%=request.getContextPath()%>/user/json/repository.do",
-
 
304
                                    "saveRepositoryFileFromTempPrivateDomain",
-
 
305
                                    {
-
 
306
                                        "fileUploaded" : BacoJS.stringifyOrdered(filesUploadResult.uploadedFiles[0])
-
 
307
                                    },
-
 
308
                                    "#courseReportApp",
-
 
309
                                    function(repositoryFile4JsonView)
-
 
310
                                    {
308
                            modelObject.image = repositoryFile4JsonView;
311
                                        modelObject.image = repositoryFile4JsonView;
309
                            modelObject.imageUrl = "<%=request.getContextPath()%>/repositoryStream/" + modelObject.image.identifier + "?" + new Date().getTime();
312
                                        modelObject.imageUrl = "<%=request.getContextPath()%>/repositoryStream/" + modelObject.image.identifier + "?" + new Date().getTime();
310
                            angular.element($("#courseReportApp")).scope().$apply();
313
                                        angular.element($("#courseReportApp")).scope().$apply();
311
                        },
314
                                    },
312
                        function(){}
315
                                    function(){}
313
                );
316
                            );
314
            }
317
                        }
315
        }
318
                    }
316
 
319
 
-
 
320
                    $scope.saveCourseReportDocument = function () {
-
 
321
                        widgetCallWithActionParameters(
-
 
322
                                "<%=request.getContextPath()%>/user/courseReport.do",
-
 
323
                                "saveCourseReportDocument",
-
 
324
                                {
-
 
325
                                    "courseReportDocument" : BacoJS.stringifyOrdered($scope.report)
-
 
326
                                },
-
 
327
                                "#courseReportApp",
-
 
328
                                function(data)
-
 
329
                                {
-
 
330
                                    alert(BacoJS.stringifyOrdered(data));
-
 
331
                                },
-
 
332
                                function(){}
-
 
333
                        );
-
 
334
                    }
317
 
335
 
318
 
336
 
319
 
337
 
320
    });
338
                });
321
</script>
339
            </script>
322
 
340
 
323
<!--TEMPLATES FOR DOCUMENT BUILDER-->
341
            <!--TEMPLATES FOR DOCUMENT BUILDER-->
324
<jsp:include page="../utils/documentsBuilder.jsp"/>
342
            <jsp:include page="../utils/documentsBuilder.jsp"/>
325
<jsp:include page="coursereport/templates.jsp"/>
343
            <jsp:include page="coursereport/templates.jsp"/>
326
 
344
 
327
<div class="form-vertical">
345
            <div class="form-vertical">
328
    <div id="courseReportApp" ng-app="courseReportApp" ng-controller="courseReportAppController">
346
                <div id="courseReportApp" ng-app="courseReportApp" ng-controller="courseReportAppController">
-
 
347
                    <div class="web-messages"></div>
329
 
348
 
330
        <div ng-init="section=report;" ng-include="'pt_estgp_estgweb_utils_documentBuilder_DocumentSection'">
349
                    <button class="btn btn-success" ng-click="saveCourseReportDocument()">Gravar</button>
331
 
350
 
-
 
351
                    <div ng-init="section=report;" ng-include="'pt_estgp_estgweb_utils_documentBuilder_DocumentSection'">
-
 
352
 
332
        </div>
353
                    </div>
333
 
354
 
334
        <!-- <pre class="code">{{ report | json }}</pre>-->
355
                    <!--<pre class="code">{{ report | json }}</pre>-->
335
 
356
 
336
 
357
 
337
 
358
 
338
    </div><!--App-->
359
                </div><!--App-->
339
</div> <!--form-->
360
            </div> <!--form-->
340
 
361
 
341
</div><!--Panel Body-->
362
        </div><!--Panel Body-->
342
 
363
 
343
</div><!--Panel-->
364
    </div><!--Panel-->
344
 
365
 
345
</div><!--container-fluid-->
366
</div><!--container-fluid-->
346
 
367
 
347
<%
368
<%
348
    AbstractDao.getCurrentSession().getTransaction().commit();
369
    AbstractDao.getCurrentSession().getTransaction().commit();