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(); |