Subversion Repositories bacoAlunos

Compare Revisions

Ignore whitespace Rev 1967 → Rev 1989

/branches/grupo10/impl/src/java/pt/estgp/estgweb/services/courses/CourseReportServices.java
43,18 → 43,10
private static final Logger logger = Logger.getLogger(CourseReportServices.class);
 
 
 
 
 
 
 
/****************************************************************************/
/* SERVICOS CORE DOS REPORTS
/****************************************************************************/
 
 
 
 
/**
*
* @param courseCode
449,10 → 441,52
}
 
 
/**
* Este servico gera um grafico com a taxa global de aproveitamento e grava-o no repositorio digital
* devolvendo o respectivo RepositoryFile4JsonView em json para poder ser anexado ao objecto imagem do
* widget do grafico
* @param reportDocumentJson
* @param session
* @return
* @throws java.io.IOException
*/
public String generateGlobalLearningResultsChartYearImg(String reportDocumentJson,UserSession session) throws IOException {
 
CourseReportDocument reportDocument = CourseReportDocument.fromJson(reportDocumentJson);
LearningResultsSection learningResultsSection = (LearningResultsSection) reportDocument.findDocumentSection(LearningResultsSection.class);
LearningGlobalAnalysisSection learningGlobalAnalysisSection = (LearningGlobalAnalysisSection) learningResultsSection.findSection(LearningGlobalAnalysisSection.class);
GlobalLearningResultsChartYearImg chartImg = (GlobalLearningResultsChartYearImg) learningGlobalAnalysisSection.findDocComponent(GlobalLearningResultsChartYearImg.class);
 
 
UnitsLearningResultsTable table = (UnitsLearningResultsTable) learningResultsSection.findDocComponent(UnitsLearningResultsTable.class);
 
 
FileUploaded fileUploaded = chartImg.generateChart2tmp(table,reportDocument);
 
RepositoryService repositoryService = new RepositoryService();
 
boolean imageInitialized = chartImg.getImage() != null
&&
chartImg.getImage().getIdentifier() != null;
 
RepositoryFile4JsonView view;
if(imageInitialized)
{
String identifier = chartImg.getImage().getIdentifier();
view = repositoryService.replaceRepositoryFileFromFileUpload(identifier, fileUploaded, ResourceAccessControlEnum.privateDomain, session);
}
else
{
view = repositoryService.storeRepositoryFileFromFileUpload(fileUploaded,ResourceAccessControlEnum.privateDomain,session);
}
chartImg.setImage(view);
//TODO FALTA GUARDAR O JSON NO CURSO
return view.toJson();
}
 
 
 
 
/****************************************************************************/
/*
 
634,18 → 668,80
}
}
 
/** Req2
* Método para guardar um courseReportDocument na base de dados e volta a retornar o mesmo em Json
* @param reportDocumentJson ReportDocument em Json para save
* */
public String saveCourseReportDocument(String reportDocumentJson, UserSession session) throws IOException {
 
//Recebe o Conteudo do reportDocument em Json e deserializa para um objecto do tipo CourseReportDocument
CourseReportDocument courseReportDocument = CourseReportDocument.fromJson(reportDocumentJson);
 
String courseCode = courseReportDocument.getCourseCode();
String courseYear = courseReportDocument.getYear();
 
//Vai à base de dados buscar o curso e as informações relativas a esse curso através do courseCode
//E transforma num object do tipo Course (Class que mapeia a tabela Course)
Course course = DaoFactory.getCourseDaoImpl().findCourseByCode(courseCode);
List<CourseYear> courseYearList = DaoFactory.getCourseYearDaoImpl().findCourseYear(courseCode, courseYear);
 
CourseYear cy;
 
if (courseYearList.isEmpty()){
cy = DomainObjectFactory.createCourseYearImpl();
cy.setCourse(course);
course.getCourseYears().add(cy);
cy.setImportYear(courseYear);
DaoFactory.getCourseYearDaoImpl().save(cy);
}else{
//Vai buscar o primeiro index da lista
cy = courseYearList.get(0);
 
}
 
cy.setCourseReportDocument(reportDocumentJson);
 
return reportDocumentJson;
}
 
/**
* Metodo que dá load ao json da tabela
*/
public String loadCourseReportDocument(String courseCode, String year, UserSession session) throws IOException {
 
List<CourseYear> courseYearList = DaoFactory.getCourseYearDaoImpl().findCourseYear(courseCode, year);
 
CourseYear cy;
//Cria a string para onde se vai fazer load e atribuir
String courseReportJson = null;
 
if (courseYearList.isEmpty()){
cy = null;
}else{
cy = courseYearList.get(0);
}
if (cy != null) {
courseReportJson = cy.getCourseReportDocument();
}
 
if (courseReportJson == null) {
try {
CourseReportDocument courseReport = createNewCourseReportDocument(courseCode, year);
courseReportJson = courseReport.toJson();
saveCourseReportDocument(courseReportJson, session);
} catch (Throwable e) {
System.out.println(e);
e.printStackTrace();
}
}
return courseReportJson;
}
 
 
 
 
 
 
public static void main(String[] args) throws IOException, JSONException {
AbstractDao.getCurrentSession().beginTransaction();
 
661,13 → 757,14
 
 
System.out.println(StreamsUtils.readString(url.openStream()));*/
 
 
}
 
/*
 
public String loadUnitsAndCreateLearningResultsTables4Course(String courseCode, String year) throws IOException, JSONException
{
 
}
*/
//TODO loadUnitsAndCreateLearningResultsTables4Course
/branches/grupo10/impl/src/java/pt/estgp/estgweb/services/courses/coursereport/documentmodel/learningresults/components/GlobalLearningResultsChartYearImg.java
1,10 → 1,121
package pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components;
 
import pt.estgp.estgweb.utils.documentBuilder.AutoImageWraperComponent;
 
import jomm.utils.BytesUtils;
import jomm.utils.MimeTypeGuesser;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.RingPlot;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.ui.RectangleInsets;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.CourseReportDocument;
import pt.estgp.estgweb.utils.Globals;
import pt.estgp.estgweb.utils.documentBuilder.ImageComponent;
import pt.estgp.estgweb.web.controllers.utils.FileUploaded;
 
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
 
/**
* Created by jorgemachado on 31/10/17.
*/
public class GlobalLearningResultsChartYearImg extends AutoImageWraperComponent
public class GlobalLearningResultsChartYearImg extends ImageComponent
{
 
/**
*
* @param results
* @return the tmp path for generated chart
* @throws java.io.IOException
*/
public FileUploaded generateChart2tmp(UnitsLearningResultsTable results, CourseReportDocument courseReportDocument) throws IOException
{
//Anos para aparecer no grafico e para serem percorridos no foreach
java.util.List<UnitsLearningResultYear> years = results.getYears();
 
String tempName = BytesUtils.generateHexKey() + ".png";
 
DefaultCategoryDataset data = new DefaultCategoryDataset();
 
//Percorre cada ano, o year tem os métodos necessários para obter dados percentuais
for(UnitsLearningResultYear year : years) {
data.addValue(new Double(year.getAprovados1013Percent()), "Aprovados 10-13", year.getAno() + "ºAno");
data.addValue(new Double(year.getAprovados1416Percent()), "Aprovados 14-16", year.getAno() + "ºAno");
data.addValue(new Double(year.getAprovados1720Percent()), "Aprovados 17-20", year.getAno() + "ºAno");
}
//addvalue parametros(valor,fila,coluna)
data.addValue(new Double(results.getAprovados1013Percent()), "Aprovados 10-13","Total");
data.addValue(new Double(results.getAprovados1416Percent()), "Aprovados 14-16","Total");
data.addValue(new Double(results.getAprovados1720Percent()), "Aprovados 17-20","Total");
 
//Cria o grafico com orientação e a data
JFreeChart chart = ChartFactory.createStackedBarChart(null,null, null, data, PlotOrientation.VERTICAL, true, false, false);
 
//Fundo e linhas visiveis
chart.setBackgroundPaint(new Color(255,255,255));
CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setBackgroundPaint(new Color(255, 255, 255));
plot.setRangeGridlinePaint(Color.GRAY);
plot.setRangeGridlinesVisible(true);
 
 
//Insets do grafico, com o padding
RectangleInsets rectangle = new RectangleInsets(0,0,30F,0);
chart.setPadding(rectangle);
 
//Estilo do texto no grafico
plot.getDomainAxis().setTickLabelFont(new Font("Helvetica", Font.PLAIN, 25));
plot.getRangeAxis().setTickLabelFont(new Font("Helvetica", Font.PLAIN, 25));
 
StackedBarRenderer renderer = (StackedBarRenderer) plot.getRenderer();
//Cores do grafico
renderer.setSeriesPaint(0, new Color(240, 130, 25));
renderer.setSeriesPaint(1, new Color(255, 218, 0));
renderer.setSeriesPaint(2, new Color(120, 173, 38));
//Grossura das barras
renderer.setMaximumBarWidth(0.1);
 
//O primeiro parametro é {2} por defeito, o 2º formata os valores no chart. Mete-o visivel e formata a letra
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", new DecimalFormat("#.##'%'")));
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseItemLabelFont(new Font("Helvetica", Font.PLAIN, 25));
 
//Legenda do grafico
LegendTitle legend = chart.getLegend();
legend.setItemFont(new Font("Helvetica", Font.PLAIN, 25));
legend.setFrame(BlockBorder.NONE);
 
 
BufferedImage image = chart.createBufferedImage( 300*4, 200*4);
String pathGraficoTiposAlunos = Globals.TMP_DIR + java.io.File.separator + tempName;
java.io.File output = new java.io.File(pathGraficoTiposAlunos);
ImageIO.write(image, "png", new FileOutputStream(output));
 
FileUploaded fileUploaded = new FileUploaded();
fileUploaded.setTmpName(tempName);
fileUploaded.setTitle("Taxa global de aproveitamento");
fileUploaded.setDescription("Curso: " + courseReportDocument.getCourseName() + " (" + courseReportDocument.getCourseCode()+ ") ano " + courseReportDocument.getYear());
fileUploaded.setContentType(MimeTypeGuesser.getInstance().guessMimeType(output));
fileUploaded.setFileSize(output.length());
fileUploaded.setExtension("png");
return fileUploaded;
}
 
public static void main(String [] args) throws IOException {
 
}
 
 
}
/branches/grupo10/impl/src/java/pt/estgp/estgweb/services/courses/coursereport/documentmodel/CourseReportDocument.java
27,8 → 27,30
private String courseName;
private String year;
 
private String grau;
 
private String nomeEscola;
 
public String getGrau() {
return grau;
}
 
public void setGrau(String grau) {
this.grau = grau;
}
 
public String getNomeEscola() {
return nomeEscola;
}
 
public void setNomeEscola(String nomeEscola) {
this.nomeEscola = nomeEscola;
}
 
 
 
 
 
public CourseReportDocument()
{
 
63,6 → 85,8
setYear(year);
setCourseCode(c.getCode());
setCourseName(c.getName());
setNomeEscola(c.getDepartment().getCourseSchool().getName());
setGrau(c.getDegree());
 
//1 - Introducao
IntroSection introSection = new IntroSection();
/branches/grupo10/impl/src/java/pt/estgp/estgweb/domain/CourseImpl.java
21,7 → 21,6
*/
public class CourseImpl extends Course
{
 
private static final Logger logger = Logger.getLogger(CourseImpl.class);
 
public Serializable getSerializable()
/branches/grupo10/impl/src/java/pt/estgp/estgweb/filters/filters/IsFromCourseCommissionClass.java
New file
0,0 → 1,61
package pt.estgp.estgweb.filters.filters;
 
import jdk.nashorn.internal.codegen.types.Type;
import pt.estgp.estgweb.domain.CourseImpl;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.filters.chains.LoadControlFilter;
import pt.estgp.estgweb.filters.exceptions.NeedAuthenticationException;
import pt.estgp.estgweb.filters.exceptions.AccessDeniedOperationException;
import pt.estgp.estgweb.filters.filters.utils.LoadObjectFromParameters;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.CourseUnit;
import pt.estgp.estgweb.domain.UserImpl;
import pt.estgp.estgweb.utils.Globals;
import pt.utl.ist.berserk.ServiceRequest;
import pt.utl.ist.berserk.ServiceResponse;
import pt.utl.ist.berserk.logic.filterManager.FilterParameters;
import pt.utl.ist.berserk.logic.filterManager.exceptions.FilterException;
import org.apache.log4j.Logger;
 
public class IsFromCourseCommissionClass extends LoadControlFilter
{
private static final Logger logger = Logger.getLogger(IsFromCourseCommissionClass.class);
 
public void execute(ServiceRequest request, ServiceResponse response, FilterParameters filterParameters) throws FilterException, Exception
{
 
UserSession userSession = (UserSession) request.getServiceParameters().getParameter(Globals.USER_SESSION_KEY);
 
//Não tem autenticação então nega o acesso
if(userSession.getUser() == null)
{
logger.info("try access restricted area:" + request.getRequester());
throw new NeedAuthenticationException();
}
 
if(userSession.getUser().isSuperuser())
return;
 
 
 
String courseCode = null;
 
Object req = request.getServiceParameters().getParameter((String) filterParameters.getParameter(0));
 
if (req instanceof String){
courseCode = (String) req;
}else {
logger.info(userSession.getUser().getUsername() + ": Invalid Parameter");
throw new AccessDeniedOperationException("fail.owner");
}
 
 
CourseImpl courseimpl = DaoFactory.getCourseDaoImpl().findCourseByCode(courseCode);
 
if(!courseimpl.isFromCourseCommission(userSession.getUser()))
{
logger.warn(userSession.getUser().getUsername() + ": try access restricted area");
throw new AccessDeniedOperationException("fail.owner");
}
}
}
/branches/grupo10/impl/src/java/pt/estgp/estgweb/web/controllers/courses/CoursesServicesController.java
1,8 → 1,15
package pt.estgp.estgweb.web.controllers.courses;
 
 
import jomm.dao.impl.AbstractDao;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.json.JSONObject;
import pt.estgp.estgweb.domain.CourseImpl;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.web.controllers.utils.AbstractWidgetAjaxController;
import pt.estgp.estgweb.web.exceptions.NoCookiesException;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.ServiceManager;
10,6 → 17,7
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
 
/**
* Created by jorgemachado on 06/01/17.
*/
42,5 → 50,48
return new JSONObject(json);
}
 
public JSONObject generateGlobalLearningResultsChartYearImg(ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Throwable {
 
String courseReportDocument = request.getParameter("courseReportDocument");
 
 
IServiceManager sm = ServiceManager.getInstance();
String json = (String) sm.execute(RequestUtils.getRequester(request, response),
"CourseReportGenerateGlobalLearningResultsChartYearImg",
new Object[]{courseReportDocument});
return new JSONObject(json);
}
 
 
public JSONObject saveCourseReportDocument(ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Throwable {
String courseReportDocument = request.getParameter("courseReportDocument");
 
IServiceManager sm = ServiceManager.getInstance();
String json = (String) sm.execute(RequestUtils.getRequester(request, response),
"SaveCourseReportDocument",
new Object[]{courseReportDocument});
return new JSONObject(json);
}
 
 
 
 
/* Req3 Esta função é chamada no struts e chamada o serviço load através do ServiceManager que é o Berserk
* antes de começar a ser editado */
public ActionForward startEdit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Throwable {
String courseCode = request.getParameter("courseCode");
String year = request.getParameter("year");
 
IServiceManager sm = ServiceManager.getInstance();
String courseReportJson = (String) sm.execute(
RequestUtils.getRequester(request, response),
"LoadCourseReportDocument",
new Object[]{courseCode, year},
new String[]{"courseCode", "year"});
request.setAttribute("courseReportJson", courseReportJson);
 
 
return mapping.findForward("editCourseReport");
}
 
}
/branches/grupo10/impl/src/hbm/pt/estgp/estgweb/domain/Course.hbm.xml
79,6 → 79,14
<property name="separatedTurmas" type="boolean">
<column name="separatedTurmas" default="false"/>
</property>
 
<!-- Req1-->
<property name="CourseReportDocument" type="text">
<column name="CourseReportDocument" sql-type="LONGTEXT"></column>
</property>
<!-- *** -->
 
 
<many-to-one name="course" class="pt.estgp.estgweb.domain.Course" outer-join="true" lazy="false" column="course_id"/>
<subclass name="pt.estgp.estgweb.domain.CourseYearImpl" discriminator-value="CourseYearImpl"/>
</class>
/branches/grupo10/impl/src/web/user/courses/coursereport/templates.jsp
691,4 → 691,76
</div>
</div>
</div>
</script>
 
 
<!-- Johny -->
<script type="text/ng-template" id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_GlobalLearningResultsChartYearImg">
<globallearningresultschartyearimg>
</globallearningresultschartyearimg>
</script>
<script>
angular.module("courseReportApp").directive('globallearningresultschartyearimg', function() {
 
return {
restrict: 'E',
link: function($scope, element, attrs)
{
$scope.generateChart = function(comp)
{
 
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/user/courseReport.do",
"generateGlobalLearningResultsChartYearImg",
{
"courseReportDocument" : BacoJS.stringifyOrdered(angular.element($("#courseReportApp")).scope().report)
},
"#courseReportApp",
function(repositoryFile4JsonView)
{
comp.image = repositoryFile4JsonView;
comp.imageUrl = "<%=request.getContextPath()%>/repositoryStream/" + comp.image.identifier + "?" + new Date().getTime();
angular.element($("#courseReportApp")).scope().$apply();
},
function(){}
);
}
 
 
},
templateUrl: function(elem,attrs) {
return "globallearningresultschartyearimg";
}
}
});
</script>
<script type="text/ng-template" id="globallearningresultschartyearimg">
<div class="imageComponent component">
 
<div class="componentBody">
<div class="form-group clearfix">
<label class="col-md-2 control-label">Legenda</label>
<div class="col-md-10">
<input type="text" class="form-control" rows="10" ng-model="comp.title">
</div>
</div>
<div class="form-group clearfix">
<div class="col-md-2 control-label">
<button class="btn btn-default" ng-click="generateChart(comp)">Refrescar/Gerar Gráfico</button>
</div>
<div class="col-md-10">
<label ng-if="comp.image.identifier"> Limites do PDF </label>
<div ng-if="comp.image.identifier" style="text-align: center; width: 595px; border: 1px solid black; padding: 45px">
<center>
<div style="width: 200px;height: 200px; max-width: 500px; max-height: 750px" resizable on-resize="resize($evt, $ui, comp)">
<img ng-if="comp.imageUrl" style="width: 100%;height: 100%" ng-src="{{comp.imageUrl}}">
<img ng-if="!comp.imageUrl" style="width: 100%;height: 100%" ng-src="{{'<%=request.getContextPath()%>/repositoryStream/' + comp.image.identifier}}">
</div>
(Se desejar altere o tamanho da imagem arrastando no canto inferior direito)
</center>
</div>
</div>
</div>
</div>
</div>
</script>
/branches/grupo10/impl/src/web/user/courses/courseReportEdit.jsp
1,349 → 1,13
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="jomm.dao.impl.AbstractDao" %>
<%@ page import="pt.estgp.estgweb.domain.CourseImpl" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page import="pt.estgp.estgweb.utils.documentBuilder.TextComponent" %>
<%@ page import="pt.estgp.estgweb.utils.documentBuilder.ImageComponent" %>
<%@ page import="pt.estgp.estgweb.services.courses.CourseReportServices" %>
<%@ page import="pt.estgp.estgweb.services.courses.coursereport.documentmodel.CourseReportDocument" %>
<%@ page import="org.json.JSONException" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>
<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
 
<link rel="stylesheet" href="<%=request.getContextPath()%>/js/jquery-ui-1.12.1/jquery-ui.css">
<script src="<%=request.getContextPath()%>/js/jquery-ui-1.12.1/jquery-ui.min.js"></script>
<link rel="stylesheet" href="<%=request.getContextPath()%>/css/flora-commons/flora.resizable.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>
<script>
function demoFromHTML() {
var pdf = new jsPDF('p', 'pt', 'letter');
// source can be HTML-formatted string, or a reference
// to an actual DOM element from which the text will be scraped.
source = $('#courseReportApp')[0];
<!--*************************************-->
 
// we support special element handlers. Register them with jQuery-style
// ID selector for either ID or node name. ("#iAmID", "div", "span" etc.)
// There is no support for any other type of selectors
// (class, of compound) at this time.
specialElementHandlers = {
// element with id of "bypass" - jQuery style selector
'#bypassme': function (element, renderer) {
// true = "handled elsewhere, bypass text extraction"
return true
}
};
margins = {
top: 80,
bottom: 60,
left: 40,
width: 522
};
// all coords and widths are in jsPDF instance's declared units
// 'inches' in this case
pdf.fromHTML(
source, // HTML string or DOM elem ref.
margins.left, // x coord
margins.top, { // y coord
'width': margins.width, // max width of content on PDF
'elementHandlers': specialElementHandlers
},
 
function (dispose) {
// dispose: object with X, Y of the last line add to the PDF
// this allow the insertion of new lines after html
//var pdfDocument = pdf.save('Test.pdf');
var pdfDocument = pdf.output();
 
var boundary = '---------------------------';
boundary += Math.floor(Math.random()*32768);
boundary += Math.floor(Math.random()*32768);
boundary += Math.floor(Math.random()*32768);
 
var body = '';
body += '--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="filesInputId-UPLOAD[]"; filename="20170530_210340.pdf"' + '\r\n';
body += 'Content-Type: application/pdf';
body += '\r\n\r\n';
body += pdfDocument;
body += '\r\n'
body += '--' + boundary + '--';
 
 
 
$.ajax({
type: "POST",
cache: false,
url: "<%=request.getContextPath()%>/filesUpload",
data: body ,
processData: false,
contentType : 'multipart/form-data; boundary=' + boundary,
success: function (data) {
alert('success');
return false;
}
});
}, margins
);
}
</script>
 
<%
 
String courseCode = request.getParameter("courseCode");
String year = request.getParameter("year");
AbstractDao.getCurrentSession().beginTransaction();
CourseImpl courseImpl = DaoFactory.getCourseDaoImpl().findCourseByCode(courseCode);
request.setAttribute("course",courseImpl);
CourseReportDocument courseReport = null;
try {
courseReport = new CourseReportServices().createNewCourseReportDocument(courseCode, year);
} catch (Throwable e) {
System.out.println(e);
e.printStackTrace();
}
String courseReportJson = courseReport.toJson();
request.setAttribute("courseDocumentJson",courseReportJson);
request.setAttribute("courseDocument",courseReport);
 
%>
<%--<a href="javascript:demoFromHTML()" class="button">Run Code</a>--%>
 
<div class="container-fluid">
 
<style>
.separatorSection
{
border: 1px solid #ddd;
}
</style>
 
 
<!-- Apresentacao da Unidade -->
 
<div class="panel panel-default">
<div class="panel-heading">
Relatório Anual do curso: ${course.name}
</div>
<div class="panel-body">
 
<p><b class="label-info">Tipo de Curso:</b> <bean:message key="course.${course.degree}"/></p>
<p><b class="label-info">Ano Lectivo:</b> ${course.importYear}</p>
<p><b class="label-info">Departamento:</b> ${course.department.name}</p>
<p><b class="label-info">Escola:</b> ${course.department.courseSchool.name}</p>
 
 
 
 
<script>
 
//Especifico da aplicacao
var courseReportApp = angular.module('courseReportApp', ['ui.tree']);
GLOBAL_BacoAngularAppDependencies.push('courseReportApp');
 
 
courseReportApp.directive('resizable', function () {
return {
restrict: 'A',
scope: {
callback: '&onResize'
},
link: function postLink(scope, elem, attrs) {
elem.resizable();
elem.on('resize', function (evt, ui, comp) {
scope.$apply(function() {
if (scope.callback) {
scope.callback({$evt: evt, $ui: ui, $comp: comp });
}
})
});
}
};
});
 
 
courseReportApp.controller('courseReportAppController', function($scope)
{
 
$scope.docAppSelector = "#courseReportApp";
$scope.report = <%=courseReportJson%>
 
$scope.resize = function(evt,ui,comp) {
//console.log (evt,ui);
comp.width = ui.size.width;
comp.height = ui.size.height;
}
 
/**
* @classe class to match
* @superClasses array of strings
* */
$scope.contains = function(obj,classe)
{
if(obj['@class'] && obj['@class'] == classe)
return true;
if(obj.allSuperClasses)
{
for(var i in obj.allSuperClasses)
{
if(classe == obj.allSuperClasses[i])
return true;
}
}
return false;
}
 
$scope.showSep = function(section,subSection)
{
var s;
for(s in section.sections)
{
section.sections[s].active = false;
}
/*$(".separatorSectionNav").each(function()
{
angular.element($(this)).scope().section.active = false;
});*/
subSection.active = true;
}
 
/**
* Este metodo devolve o template mais profundo na hierarquia de classes
* permitindo emular o override, quanto mais especifica for a classe
* e caso exista template é esse o template devolvido
* procura um script com o id da classe e se nao existir
* vai subindo nas super classes
* @param obj
* @returns {*}
*/
$scope.class2id = function(obj)
{
var objClassId = obj["@class"].replaceAll(".","_");
if($("script#" + objClassId).length > 0)
{
return objClassId;
}
if(obj.allSuperClasses)
{
var s;
for(s in obj.allSuperClasses)
{
var superClass = obj.allSuperClasses[s];
var superClassId = superClass.replaceAll(".","_");
if($("script#" + superClassId).length > 0)
{
return superClassId;
}
}
}
return obj["@class"].replaceAll(".","_");
}
 
$scope.addText = function(parentCustomPane)
{
$scope.addSimpleDocComponent(parentCustomPane,"pt.estgp.estgweb.utils.documentBuilder.TextComponent")
}
 
$scope.addImage = function(parentCustomPane)
{
$scope.addSimpleDocComponent(parentCustomPane,"pt.estgp.estgweb.utils.documentBuilder.ImageComponent")
}
 
$scope.addSimpleDocComponent = function(parentCustomPane,classComponent)
{
if(!parentCustomPane.components)
{
parentCustomPane.components = [];
}
parentCustomPane.components.push(
{
"@class" : classComponent
}
);
}
$scope.removeComponent = function(index,array)
{
array.splice(index,1);
}
 
$scope.callbackUploadedFiles = function(filesUploadResult,token,targetElement)
{
var modelObject = BacoAngularUtils.getAngularElementModel(targetElement);
 
if(modelObject.image && modelObject.image.identifier)
{
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/user/json/repository.do",
"replaceRepositoryFileFromTempPrivateDomain",
{
"identifier" : modelObject.image.identifier,
"fileUploaded" : BacoJS.stringifyOrdered(filesUploadResult.uploadedFiles[0])
},
"#courseReportApp",
function(repositoryFile4JsonView)
{
modelObject.image = repositoryFile4JsonView;
//image URL is generated on reimport just to avoid caching
modelObject.imageUrl = "<%=request.getContextPath()%>/repositoryStream/" + modelObject.image.identifier + "?" + new Date().getTime();
angular.element($("#courseReportApp")).scope().$apply();
},
function(){}
);
}
else
{
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/user/json/repository.do",
"saveRepositoryFileFromTempPrivateDomain",
{
"fileUploaded" : BacoJS.stringifyOrdered(filesUploadResult.uploadedFiles[0])
},
"#courseReportApp",
function(repositoryFile4JsonView)
{
modelObject.image = repositoryFile4JsonView;
modelObject.imageUrl = "<%=request.getContextPath()%>/repositoryStream/" + modelObject.image.identifier + "?" + new Date().getTime();
angular.element($("#courseReportApp")).scope().$apply();
},
function(){}
);
}
}
 
 
 
 
});
</script>
 
<!--TEMPLATES FOR DOCUMENT BUILDER-->
<jsp:include page="../utils/documentsBuilder.jsp"/>
<jsp:include page="coursereport/templates.jsp"/>
 
<div class="form-vertical">
<div id="courseReportApp" ng-app="courseReportApp" ng-controller="courseReportAppController">
 
<div ng-init="section=report;" ng-include="'pt_estgp_estgweb_utils_documentBuilder_DocumentSection'">
 
</div>
 
<!-- <pre class="code">{{ report | json }}</pre>-->
 
 
 
</div><!--App-->
</div> <!--form-->
 
</div><!--Panel Body-->
 
</div><!--Panel-->
 
</div><!--container-fluid-->
 
<%
AbstractDao.getCurrentSession().getTransaction().commit();
%>
<jsp:include page="../utils/reportEdit.jsp"/>
<jsp:include page="coursereport/templates.jsp"/>
/branches/grupo10/impl/src/web/user/home/teacher.jsp
21,188 → 21,204
<%--<link type="text/css" rel="stylesheet" href="<%=request.getContextPath()%>/css/offcanvas.css"/>--%>
 
 
<logic:notMatch value="TeacherImpl" name="UserSession" property="user.class.name">
<div class="alert alert-warning">
<bean:message key="profile.bad.profile.teacher.iregular.user.class"/>
</div>
</logic:notMatch>
<logic:notMatch value="TeacherImpl" name="UserSession" property="user.class.name">
<div class="alert alert-warning">
<bean:message key="profile.bad.profile.teacher.iregular.user.class"/>
</div>
</logic:notMatch>
 
<jsp:include page="todosAfazer.jsp"/>
<jsp:include page="todosAfazer.jsp"/>
 
<div class="row">
<div class="col-md-6 col-sm-12 col-xs-12" style="padding-right: 6px">
<div class="row">
<div class="col-md-6 col-sm-12 col-xs-12" style="padding-right: 6px">
 
<baco:isModuleOn module="courseunits">
<div class="panel panel-primary">
<div class="panel-heading"><bean:message key="intranet.home.curricular"/></div>
<div class="panel-body">
<!--<p><bean:message key="intranet.home.curricular"/></p>-->
<!--<ul>
<li>-->
<div class="list-group">
<div class="list-group-item">
<html:link action="/user/startLoadCoursesProgramsFromHome"><bean:message key="courseunit.indexes"/></html:link>
</div>
<div class="list-group-item">
<html:link action="/user/courseComissions"><bean:message key="course.comissions"/></html:link>
</div>
<div class="list-group-item">
<a href="<%=request.getContextPath()%>/dir/utilsIntranet/comAvalDesemp">Avaliação de Desempenho Docente</a>
</div>
<baco:isModuleOn module="courseunits">
<div class="panel panel-primary">
<div class="panel-heading"><bean:message key="intranet.home.curricular"/></div>
<div class="panel-body">
<!--<p><bean:message key="intranet.home.curricular"/></p>-->
<!--<ul>
<li>-->
<div class="list-group">
<div class="list-group-item">
<html:link action="/user/startLoadCoursesProgramsFromHome"><bean:message key="courseunit.indexes"/></html:link>
</div>
<!--</li>
</ul>-->
<div class="list-group-item">
<html:link action="/user/courseComissions"><bean:message key="course.comissions"/></html:link>
</div>
<div class="list-group-item">
<a href="<%=request.getContextPath()%>/dir/utilsIntranet/comAvalDesemp">Avaliação de Desempenho Docente</a>
</div>
</div>
<!--</li>
</ul>-->
</div>
</div>
 
 
<%
java.util.List<String> years = new java.util.ArrayList<String>();
String nowImportYear = DaoFactory.getConfigurationDaoImpl().getInterfaceImportYearCreateTransaction();
years.add(DaoFactory.getConfigurationDaoImpl().getInterfaceImportYearCreateTransaction());
years.add(DatesUtils.getPreviousImportYear(nowImportYear));
<%
java.util.List<String> years = new java.util.ArrayList<String>();
String nowImportYear = DaoFactory.getConfigurationDaoImpl().getInterfaceImportYearCreateTransaction();
years.add(DaoFactory.getConfigurationDaoImpl().getInterfaceImportYearCreateTransaction());
years.add(DatesUtils.getPreviousImportYear(nowImportYear));
 
java.util.Collections.sort(years, new java.util.Comparator<String>()
{
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
java.util.Collections.sort(years, new java.util.Comparator<String>()
{
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
 
 
 
for(String year: years)
{
for(String year: years)
{
 
String yearFormatted = pt.estgp.estgweb.utils.DatesUtils.getImportYearFormatted(year);
String yearFormatted = pt.estgp.estgweb.utils.DatesUtils.getImportYearFormatted(year);
 
 
%>
%>
 
 
<div class="panel panel-primary">
<div class="panel-heading"><bean:message key="intranet.course.units"/> - <%=yearFormatted%></div>
<div class="panel-body">
<div class="panel panel-primary">
<div class="panel-heading"><bean:message key="intranet.course.units"/> - <%=yearFormatted%></div>
<div class="panel-body">
 
 
 
<%
String[] semestres = new String[]{"A","S1","S2","T1","T2","T3","T4"};
String[] semestreLabel = new String[]{
MessageResources.getMessage(request,"courseunit.anuais"),
MessageResources.getMessage(request,"courseunit.semestre") + "1",
MessageResources.getMessage(request,"courseunit.semestre") + "2",
MessageResources.getMessage(request,"courseunit.trimestre") + "1",
MessageResources.getMessage(request,"courseunit.trimestre") + "2",
MessageResources.getMessage(request,"courseunit.trimestre") + "3",
MessageResources.getMessage(request,"courseunit.trimestre") + "4"};
<%
String[] semestres = new String[]{"A","S1","S2","T1","T2","T3","T4"};
String[] semestreLabel = new String[]{
MessageResources.getMessage(request,"courseunit.anuais"),
MessageResources.getMessage(request,"courseunit.semestre") + "1",
MessageResources.getMessage(request,"courseunit.semestre") + "2",
MessageResources.getMessage(request,"courseunit.trimestre") + "1",
MessageResources.getMessage(request,"courseunit.trimestre") + "2",
MessageResources.getMessage(request,"courseunit.trimestre") + "3",
MessageResources.getMessage(request,"courseunit.trimestre") + "4"};
 
for(int i =0;i< semestres.length;i++)
{
request.setAttribute("LABEL",semestreLabel[i]);
%>
for(int i =0;i< semestres.length;i++)
{
request.setAttribute("LABEL",semestreLabel[i]);
%>
 
<jsp:useBean id="LABEL" scope="request" type="java.lang.String"/>
<%
TeacherImpl u = ((pt.estgp.estgweb.domain.TeacherImpl)UserSession.getUser());
List<pt.estgp.estgweb.domain.CourseUnit> cus=
(List<CourseUnit>)
u.getClass().getMethod("getTeachedUnitsView" + semestres[i],String.class)
.invoke(u,year);
request.setAttribute("units",cus);
if(cus == null || cus.size() == 0)
{}
else if(cus.size() > 0)
{
%>
<jsp:useBean id="units" scope="request" type="java.util.Collection"/>
<div class="list-group">
<div class="list-group-item list-group-item-heading"><bean:write name="LABEL"/></div>
<jsp:useBean id="LABEL" scope="request" type="java.lang.String"/>
<%
TeacherImpl u = ((pt.estgp.estgweb.domain.TeacherImpl)UserSession.getUser());
List<pt.estgp.estgweb.domain.CourseUnit> cus=
(List<CourseUnit>)
u.getClass().getMethod("getTeachedUnitsView" + semestres[i],String.class)
.invoke(u,year);
request.setAttribute("units",cus);
if(cus == null || cus.size() == 0)
{}
else if(cus.size() > 0)
{
%>
<jsp:useBean id="units" scope="request" type="java.util.Collection"/>
<div class="list-group">
<div class="list-group-item list-group-item-heading"><bean:write name="LABEL"/></div>
 
<logic:iterate id="unit" name="units" type="pt.estgp.estgweb.domain.CourseUnit">
<div class="list-group-item">
<div class="row">
<div class="col-sm-10"><html:link action="/user/startLoadCourseUnitFromHome?id=${unit.id}">${unit.name} (${unit.courseName} (${unit.courseCode}) ${unit.cdTurma}</html:link></div>
<div class="col-sm-2"><html:link action="/user/startLoadCourseUnitRootFromHome?courseUnitView.id=${unit.id}"> <span style="padding:5px" class="glyphicon glyphicon-folder-open"></span> </html:link></div>
</div>
</div>
</logic:iterate>
<logic:iterate id="unit" name="units" type="pt.estgp.estgweb.domain.CourseUnit">
<div class="list-group-item">
<div class="row">
<div class="col-sm-10"><html:link action="/user/startLoadCourseUnitFromHome?id=${unit.id}">${unit.name} (${unit.courseName} (${unit.courseCode}) ${unit.cdTurma}</html:link></div>
<div class="col-sm-2"><html:link action="/user/startLoadCourseUnitRootFromHome?courseUnitView.id=${unit.id}"> <span style="padding:5px" class="glyphicon glyphicon-folder-open"></span> </html:link></div>
</div>
</div>
<%
}
}
</logic:iterate>
</div>
<%
}
}
 
%>
%>
 
</div>
</div>
<%
}
%>
</div>
<%
}
%>
 
</baco:isModuleOn>
<%--
<baco:isModuleOn module="todos">
<jsp:include page="/user/home/todos.jsp"/>
</baco:isModuleOn>--%>
<baco:isModuleOn module="courseunits">
<jsp:include page="/user/home/courseUnitsAnnouncements.jsp"/>
</baco:isModuleOn>
</baco:isModuleOn>
<%--
<baco:isModuleOn module="todos">
<jsp:include page="/user/home/todos.jsp"/>
</baco:isModuleOn>--%>
<baco:isModuleOn module="courseunits">
<jsp:include page="/user/home/courseUnitsAnnouncements.jsp"/>
</baco:isModuleOn>
 
 
</div>
<div class="col-md-6 col-sm-12 col-xs-12" style="padding-left: 6px">
</div>
<div class="col-md-6 col-sm-12 col-xs-12" style="padding-left: 6px">
 
<%
AbstractDao.getCurrentSession().beginTransaction();
TeacherImpl tLoggedIn = (TeacherImpl) DaoFactory.getTeacherDaoImpl().get(UserSession.getUser().getId());
boolean hasCommisionsOrCoordinations = tLoggedIn.hasCoordinationsOrBelongToCourseCommissions();
AbstractDao.getCurrentSession().getTransaction().commit();
if( hasCommisionsOrCoordinations )
{
%>
<div class="panel panel-primary">
<div class="panel-heading">As minhas Comissões de Curso</div>
<div class="panel-body">
<%
AbstractDao.getCurrentSession().beginTransaction();
TeacherImpl tLoggedIn = (TeacherImpl) DaoFactory.getTeacherDaoImpl().get(UserSession.getUser().getId());
boolean hasCommisionsOrCoordinations = tLoggedIn.hasCoordinationsOrBelongToCourseCommissions();
request.setAttribute("tLoggedIn", tLoggedIn);
AbstractDao.getCurrentSession().getTransaction().commit();
 
<div class="list-group">
<div class="list-group-item">
if( hasCommisionsOrCoordinations )
{
%>
<div class="panel panel-primary">
<div class="panel-heading">As minhas Comissões de Curso</div>
<div class="panel-body">
 
<div class="list-group">
 
<!-- Req 6 -->
<logic:iterate id="course" name="tLoggedIn" property="coordinatorCourses" type="pt.estgp.estgweb.domain.Course">
<div class="list-group-item">
<html:link action="/user/editCourseReport.do?courseCode=${course.code}&year=${UserSession.nowConfiguration.interfaceImportYear}">Editar o relatório de Curso do ano </html:link>
</div>
</logic:iterate>
<!--*****************-->
 
<div class="list-group-item">
<html:link action="/user/startSubmitMessageCourseComission">
Enviar email aos alunos
</html:link>
</div>
<div class="list-group-item">
<html:link action="/user/startLoadCourseCourseUnitsStatistics?importYear=${UserSession.nowConfiguration.interfaceImportYear}">Consultar estatisticas das Unidades Curriculares (${UserSession.nowConfiguration.interfaceImportYear})</html:link>
</div>
<div class="list-group-item">
<html:link action="/user/startLoadCourseCourseUnitsStatistics?importYear=${UserSession.nowConfiguration.previousInterfaceImportYear}">Consultar estatisticas das Unidades Curriculares (${UserSession.nowConfiguration.previousInterfaceImportYear})</html:link>
</div>
<div class="list-group-item">
<html:link action="/user/listStudentsCourseComission">
Consultar Alunos
</html:link>
</div>
<!--<div class="list-group-item">
<html:link action="/user/startSubmitMessageCourseComission">
Enviar email aos alunos
</html:link>
</div>
<div class="list-group-item">
<html:link action="/user/startLoadCourseCourseUnitsStatistics?importYear=${UserSession.nowConfiguration.interfaceImportYear}">Consultar estatisticas das Unidades Curriculares (${UserSession.nowConfiguration.interfaceImportYear})</html:link>
</div>
<div class="list-group-item">
<html:link action="/user/startLoadCourseCourseUnitsStatistics?importYear=${UserSession.nowConfiguration.previousInterfaceImportYear}">Consultar estatisticas das Unidades Curriculares (${UserSession.nowConfiguration.previousInterfaceImportYear})</html:link>
</div>
<div class="list-group-item">
<html:link action="/user/listStudentsCourseComission">
Consultar Alunos
</html:link>
</div>
<!--<div class="list-group-item">
<html:link action="/user/startSubmitMessageCourseComission">
Consultar Docentes
</html:link>
</div>-->
<div class="list-group-item">
<html:link action="/user/startLoadCoursesProgramsFromHome?importYear=${UserSession.nowConfiguration.interfaceImportYear}&forUser=courseCommission">Atalho para as validações (${UserSession.nowConfiguration.interfaceImportYear})</html:link>
</div>
<div class="list-group-item">
<html:link action="/user/startLoadCoursesProgramsFromHome?importYear=${UserSession.nowConfiguration.previousInterfaceImportYear}&forUser=courseCommission">Atalho para as validações (${UserSession.nowConfiguration.previousInterfaceImportYear})</html:link>
</div>
<div class="list-group-item">
<html:link action="/user/startLoadCoursesProgramsFromHome?importYear=${UserSession.nowConfiguration.interfaceImportYear}&forUser=courseCommission">Atalho para as validações (${UserSession.nowConfiguration.interfaceImportYear})</html:link>
</div>
<div class="list-group-item">
<html:link action="/user/startLoadCoursesProgramsFromHome?importYear=${UserSession.nowConfiguration.previousInterfaceImportYear}&forUser=courseCommission">Atalho para as validações (${UserSession.nowConfiguration.previousInterfaceImportYear})</html:link>
</div>
 
<div class="list-group-item">
<html:link action="/user/courseReportTools?importYear=${UserSession.nowConfiguration.previousInterfaceImportYear}">Utilitários do Relatório de Curso (${UserSession.nowConfiguration.previousInterfaceImportYear})</html:link>
</div>
</div>
<!--</li>
</ul>-->
</div>
<div class="list-group-item">
<html:link action="/user/courseReportTools?importYear=${UserSession.nowConfiguration.previousInterfaceImportYear}">Utilitários do Relatório de Curso (${UserSession.nowConfiguration.previousInterfaceImportYear})</html:link>
</div>
<jsp:include page="courseComission.jsp"/>
 
 
<div class="list-group-item">
<!--http://localhost:8080/baco/user/editCourseReport.do?courseCode=44&year=201617 -->
 
</div>
<!--</li>
</ul>-->
</div>
</div>
<jsp:include page="courseComission.jsp"/>
<%
}
 
257,27 → 273,27
%>
<div class="list-group">
<div class="list-group-item list-group-item-warning"><span class="icon icon-clipboard"></span> <label class="label label-warning" style="font-size:1em"><%=activeYear%></label> Relatórios de avaliação por preencher/entregar de <%=activeYear%>
<%--<%
if(activeDegrees != null)
{
%>
(graus em processo de validação:
<%
String sep = "";
for(String activeDegree: activeDegrees)
{
%>
<%=sep + MessageResources.getInstance(request).getMessage("course."+activeDegree)%>
<%
sep = ", ";
}
%>
)
<%
}
%>
--%>
</div>
<%--<%
if(activeDegrees != null)
{
%>
(graus em processo de validação:
<%
String sep = "";
for(String activeDegree: activeDegrees)
{
%>
<%=sep + MessageResources.getInstance(request).getMessage("course."+activeDegree)%>
<%
sep = ", ";
}
%>
)
<%
}
%>
--%>
</div>
 
<%
for(CourseUnit cu: evaluations)
307,6 → 323,7
 
 
 
</div>
</div>
</div>
 
/branches/grupo10/impl/src/web/user/utils/reportEdit.jsp
New file
0,0 → 1,349
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
 
<%-- http://localhost:8080/baco/user/editCourseReport.do?courseCode=44&year=201617 --%>
 
<link rel="stylesheet" href="<%=request.getContextPath()%>/js/jquery-ui-1.12.1/jquery-ui.css">
<script src="<%=request.getContextPath()%>/js/jquery-ui-1.12.1/jquery-ui.min.js"></script>
<link rel="stylesheet" href="<%=request.getContextPath()%>/css/flora-commons/flora.resizable.css">
<!--<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.5/jspdf.debug.js"></script>
<script>
function demoFromHTML() {
var pdf = new jsPDF('p', 'pt', 'letter');
// source can be HTML-formatted string, or a reference
// to an actual DOM element from which the text will be scraped.
source = $('#courseReportApp')[0];
 
// we support special element handlers. Register them with jQuery-style
// ID selector for either ID or node name. ("#iAmID", "div", "span" etc.)
// There is no support for any other type of selectors
// (class, of compound) at this time.
specialElementHandlers = {
// element with id of "bypass" - jQuery style selector
'#bypassme': function (element, renderer) {
// true = "handled elsewhere, bypass text extraction"
return true
}
};
margins = {
top: 80,
bottom: 60,
left: 40,
width: 522
};
// all coords and widths are in jsPDF instance's declared units
// 'inches' in this case
pdf.fromHTML(
source, // HTML string or DOM elem ref.
margins.left, // x coord
margins.top, { // y coord
'width': margins.width, // max width of content on PDF
'elementHandlers': specialElementHandlers
},
 
function (dispose) {
// dispose: object with X, Y of the last line add to the PDF
// this allow the insertion of new lines after html
var pdfDocument = pdf.save('Test.pdf');
/*var pdfDocument = pdf.output();
 
var boundary = '---------------------------';
boundary += Math.floor(Math.random()*32768);
boundary += Math.floor(Math.random()*32768);
boundary += Math.floor(Math.random()*32768);
 
var body = '';
body += '--' + boundary + '\r\n' +
'Content-Disposition: form-data; name="filesInputId-UPLOAD[]"; filename="20170530_210340.pdf"' + '\r\n';
body += 'Content-Type: application/pdf';
body += '\r\n\r\n';
body += pdfDocument;
body += '\r\n'
body += '--' + boundary + '--';
 
 
 
$.ajax({
type: "POST",
cache: false,
url: "<%=request.getContextPath()%>/filesUpload",
data: body ,
processData: false,
contentType : 'multipart/form-data; boundary=' + boundary,
success: function (data) {
alert('success');
return false;
}
});*/
}, margins
);
}
</script>
 
<script>ping()</script>
 
<jsp:useBean id="courseReportJson" type="java.lang.String" scope="request"/>
 
<%
//AbstractDao.getCurrentSession().beginTransaction();
%>
<%--<a href="javascript:demoFromHTML()" class="button">Run Code</a>--%>
 
<div id="courseReportApp" ng-app="courseReportApp" ng-controller="courseReportAppController" class="container-fluid">
 
<style>
.separatorSection
{
border: 1px solid #ddd;
}
</style>
 
 
<!-- Apresentacao da Unidade -->
 
<div class="panel panel-default">
<div class="panel-heading">
Relatório Anual do curso: {{report.name}}
</div>
<div class="panel-body">
 
<p><b class="label-info">Tipo de Curso:</b> {{report.degree}}</p>
<p><b class="label-info">Ano Lectivo:</b> {{report.years}}</p>
<p><b class="label-info">Escola:</b> {{report.nomeEscola}}</p>
 
 
<div ng-include="class2id(report)">
 
<script>
 
//Especifico da aplicacao
var courseReportApp = angular.module('courseReportApp', ['ui.tree']);
GLOBAL_BacoAngularAppDependencies.push('courseReportApp');
 
 
courseReportApp.directive('resizable', function () {
return {
restrict: 'A',
scope: {
callback: '&onResize'
},
link: function postLink(scope, elem, attrs) {
elem.resizable();
elem.on('resize', function (evt, ui, comp) {
scope.$apply(function() {
if (scope.callback) {
scope.callback({$evt: evt, $ui: ui, $comp: comp });
}
})
});
}
};
});
 
 
courseReportApp.controller('courseReportAppController', function($scope)
{
 
$scope.docAppSelector = "#courseReportApp";
$scope.report = ${courseReportJson}
 
$scope.resize = function(evt,ui,comp) {
//console.log (evt,ui);
comp.width = ui.size.width;
comp.height = ui.size.height;
}
 
/**
* @classe class to match
* @superClasses array of strings
* */
$scope.contains = function(obj,classe)
{
if(obj['@class'] && obj['@class'] == classe)
return true;
if(obj.allSuperClasses)
{
for(var i in obj.allSuperClasses)
{
if(classe == obj.allSuperClasses[i])
return true;
}
}
return false;
}
 
$scope.showSep = function(section,subSection)
{
var s;
for(s in section.sections)
{
section.sections[s].active = false;
}
/*$(".separatorSectionNav").each(function()
{
angular.element($(this)).scope().section.active = false;
});*/
subSection.active = true;
}
 
/**
* Este metodo devolve o template mais profundo na hierarquia de classes
* permitindo emular o override, quanto mais especifica for a classe
* e caso exista template é esse o template devolvido
* procura um script com o id da classe e se nao existir
* vai subindo nas super classes
* @param obj
* @returns {*}
*/
$scope.class2id = function(obj)
{
var objClassId = obj["@class"].replaceAll(".","_");
if($("script#" + objClassId).length > 0)
{
return objClassId;
}
if(obj.allSuperClasses)
{
var s;
for(s in obj.allSuperClasses)
{
var superClass = obj.allSuperClasses[s];
var superClassId = superClass.replaceAll(".","_");
if($("script#" + superClassId).length > 0)
{
return superClassId;
}
}
}
return obj["@class"].replaceAll(".","_");
}
 
$scope.addText = function(parentCustomPane)
{
$scope.addSimpleDocComponent(parentCustomPane,"pt.estgp.estgweb.utils.documentBuilder.TextComponent")
}
 
$scope.addImage = function(parentCustomPane)
{
$scope.addSimpleDocComponent(parentCustomPane,"pt.estgp.estgweb.utils.documentBuilder.ImageComponent")
}
 
$scope.addSimpleDocComponent = function(parentCustomPane,classComponent)
{
if(!parentCustomPane.components)
{
parentCustomPane.components = [];
}
parentCustomPane.components.push(
{
"@class" : classComponent
}
);
}
$scope.removeComponent = function(index,array)
{
array.splice(index,1);
}
 
$scope.callbackUploadedFiles = function(filesUploadResult,token,targetElement)
{
var modelObject = BacoAngularUtils.getAngularElementModel(targetElement);
 
if(modelObject.image && modelObject.image.identifier)
{
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/user/json/repository.do",
"replaceRepositoryFileFromTempPrivateDomain",
{
"identifier" : modelObject.image.identifier,
"fileUploaded" : BacoJS.stringifyOrdered(filesUploadResult.uploadedFiles[0])
},
"#courseReportApp",
function(repositoryFile4JsonView)
{
modelObject.image = repositoryFile4JsonView;
//image URL is generated on reimport just to avoid caching
modelObject.imageUrl = "<%=request.getContextPath()%>/repositoryStream/" + modelObject.image.identifier + "?" + new Date().getTime();
angular.element($("#courseReportApp")).scope().$apply();
},
function(){}
);
}
else
{
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/user/json/repository.do",
"saveRepositoryFileFromTempPrivateDomain",
{
"fileUploaded" : BacoJS.stringifyOrdered(filesUploadResult.uploadedFiles[0])
},
"#courseReportApp",
function(repositoryFile4JsonView)
{
modelObject.image = repositoryFile4JsonView;
modelObject.imageUrl = "<%=request.getContextPath()%>/repositoryStream/" + modelObject.image.identifier + "?" + new Date().getTime();
angular.element($("#courseReportApp")).scope().$apply();
},
function(){}
);
}
}
 
$scope.saveCourseReportDocument = function () {
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/user/courseReport.do",
"saveCourseReportDocument",
{
"courseReportDocument" : BacoJS.stringifyOrdered($scope.report)
},
"#courseReportApp",
function(data)
{
alert(BacoJS.stringifyOrdered(data));
},
function(){}
);
}
 
 
 
});
</script>
 
<!--TEMPLATES FOR DOCUMENT BUILDER-->
<jsp:include page="documentsBuilder.jsp"/>
 
<div class="form-vertical">
<div>
<div class="web-messages"></div>
 
<button class="btn btn-success" ng-click="saveCourseReportDocument()">Gravar</button>
<button class="btn btn-success" onclick="demoFromHTML()">PDF</button>
 
<div ng-init="section=report;" ng-include="'pt_estgp_estgweb_utils_documentBuilder_DocumentSection'">
 
</div>
 
<!--<pre class="code">{{ report | json }}</pre>-->
 
 
 
</div><!--App-->
</div> <!--form-->
 
</div><!--Panel Body-->
 
</div><!--Panel-->
 
</div><!--container-fluid-->
 
<%
//AbstractDao.getCurrentSession().getTransaction().commit();
%>