Subversion Repositories bacoAlunos

Compare Revisions

Ignore whitespace Rev 1676 → Rev 1686

/branches/v3/impl/conf/language/MessageResources.properties
17,8 → 17,8
 
 
#errors.header=<script>alert('Existem erros ou avisos, verifique a lista');</script><div class="web-messages">
errors.header=<div class="web-messages">
errors.prefix=<div class="alert alert-warning">
errors.header=<div class="web-messages web-messages-errors-baco">
errors.prefix=<div class="alert alert-warning web-messages-error-baco">
errors.suffix=</div>
errors.footer=</div>
 
2163,3 → 2163,4
repository.document.save.success=Documento salvo com sucesso
repositorycol=Colecções do Repositório de Documentos Digitais
repositorycolbrowser=Navegador de Colecções do Repositório de Documentos Digitais
repositoryinterface=Editor de Interfaces do Repositório Digital
/branches/v3/impl/conf/WEB-INF/struts/struts-courseunits.xml
77,6 → 77,16
<forward name="edit.evaluation" path="page.edit.courseunit.evaluation"/>
</action>
 
<!--Authentication-->
<action path="/user/courseUnitEvaluationControllerWidget"
type="pt.estgp.estgweb.web.controllers.courseunits.CourseUnitsEvaluationController"
name="CourseUnitEvaluationForm"
scope="request"
parameter="dispatch"
validate="false"
input="page.widget.json.fail.validations">
</action>
 
<!--<action path="/user/startLoadCourseUnitFromHome" forward="page.load.courseunit.from.home"/>-->
 
<action path="/user/startLoadCourseUnitRootFromHome" forward="/user/courseUnitControllerFromHome.do?dispatch=loadRoot&amp;from=Home"/>
/branches/v3/impl/conf/WEB-INF/struts/struts-repositorydocs.xml
17,13 → 17,14
 
<!--CourseDepartments-->
 
<action path="/repositoryDocs" forward="page.repository.interface"/>
<action path="/repositoryDocs" forward="page.repository.public.show.docs"/>
 
<action path="/user/collectionsBrowser" forward="page.repositorycolbrowser"/>
<action path="/user/repositoryEditDocument" forward="page.repository.edit.doc"/>
<action path="/user/repositoryEditCollections" forward="page.repository.edit.col"/>
<action path="/user/repositoryEditInterface" forward="page.repository.edit.interface"/>
<action path="/user/repositoryBrowseCollections" forward="page.repository.browse.col"/>
 
<action path="/user/editRepositoryDoc" forward="page.repositorydoc"/>
 
<action path="/user/editRepositoryCol" forward="page.repositorycol"/>
 
<action path="/user/repositoryDoc"
type="pt.estgp.estgweb.web.controllers.repositorydocs.RepositoryDocController"
/branches/v3/impl/conf/WEB-INF/struts/tiles-courses.xml
138,7 → 138,7
 
<definition name="page.admin.course.schools" extends="page.pae.separators.home">
<put name="title" value="Edição de Escolas"/>
<put name="topnav" value="/user/courses/topnavSchoolsEdit.jsp"/>
<put name="topnav" value="/admin/courses/topnavSchoolsEdit.jsp"/>
<put name="body" value="/admin/courses/schools.jsp"/>
</definition>
 
/branches/v3/impl/conf/WEB-INF/struts/tiles-repositorydocs.xml
7,29 → 7,37
 
<tiles-definitions>
 
<definition name="page.repositorydoc" extends="page.pae.separators.home">
<definition name="page.repository.edit.doc" extends="page.pae.separators.home">
<put name="title" value="Repositório de Documentos Digitais"/>
<put name="topnav" value="/user/repositoryDocuments/topnavEditRepodoc.jsp"/>
<put name="body" value="/user/repositoryDocuments/repositoryDocument.jsp"/>
</definition>
 
<definition name="page.repositorycol" extends="page.pae.separators.home">
<definition name="page.repository.edit.col" extends="page.pae.separators.home">
<put name="title" value="Colecções do Repositório de Documentos Digitais"/>
<put name="topnav" value="/user/repositoryDocuments/topnavEditRepocol.jsp"/>
<put name="body" value="/user/repositoryDocuments/repositoryCollections.jsp"/>
</definition>
 
 
<definition name="page.repository.interface" extends="base.definition.pae.public">
<put name="title" value="Repositório de Documentos Digitais"/>
<put name="body" value="/user/repositoryDocuments/collectionsInterface.jsp"/>
<definition name="page.repository.edit.interface" extends="page.pae.separators.home">
<put name="title" value="Edição de Interface do repositório Digital"/>
<put name="topnav" value="/user/repositoryDocuments/topnavRepositoryInterface.jsp"/>
<put name="body" value="/user/repositoryDocuments/repositoryInterface.jsp"/>
</definition>
 
 
<definition name="page.repositorycolbrowser" extends="page.pae.separators.home">
<definition name="page.repository.browse.col" extends="page.pae.separators.home">
<put name="title" value="Navegador do Repositório de Documentos Digitais"/>
<put name="topnav" value="/user/repositoryDocuments/topnavRepocolbrowser.jsp"/>
<put name="body" value="/user/repositoryDocuments/collectionsbrowser.jsp"/>
</definition>
 
 
<!--Publicas-->
<definition name="page.repository.public.show.docs" extends="base.definition.pae.public">
<put name="title" value="Repositório Digital"/>
<put name="body" value="/user/repositoryDocuments/collectionsInterface.jsp"/>
</definition>
 
 
 
</tiles-definitions>
/branches/v3/impl/conf/WEB-INF/struts/struts-pae.xml
71,6 → 71,17
 
 
 
<!--Authentication-->
<action path="/authenticateWidget"
type="pt.estgp.estgweb.web.controllers.authenticate.AuthenticateController"
name="WidgetModelForm"
scope="request"
parameter="dispatch"
validate="true"
input="page.widget.json.fail.validations">
</action>
 
 
</action-mappings>
 
</struts-config>
/branches/v3/impl/conf/WEB-INF/tags/repositoryFile.tag
12,9 → 12,13
<%@attribute name="iconClasses" type="java.lang.String" required="false" %>
<%@attribute name="downloadIcon" type="java.lang.Boolean" required="false" %>
<%@attribute name="showHistory" type="java.lang.Boolean" required="false" %>
<%@attribute name="btnXs" type="java.lang.Boolean" required="false" %>
 
<%
 
boolean history = showHistory == null ? true: showHistory;
String btnXsClass = btnXs != null && btnXs == true ? " btn-xs " : "";
request.setAttribute("btnXsClass",btnXsClass);
if(staticTag != null && staticTag)
{
%>
27,10 → 31,10
<%
}
%>
<a data-toggle="tooltip" title="Descarregar" class="btn btn-small btn-default <%=iconClasses!= null?iconClasses:""%>" href="<%=request.getContextPath()%>/repositoryStream/${repositoryStream}"><span class="glyphicon glyphicon-download-alt"></span></a>
<a data-toggle="tooltip" title="Descarregar" class="btn ${btnXsClass} btn-default <%=iconClasses!= null?iconClasses:""%>" href="<%=request.getContextPath()%>/repositoryStream/${repositoryStream}"><span class="glyphicon glyphicon-download-alt"></span></a>
<%
if(history){%>
<a data-toggle="tooltip" title="Histórico" class="btn btn-small btn-default <%=iconClasses!= null?iconClasses:""%>" target="_blank" href="<%=request.getContextPath()%>/user/data.jsp?id=${repositoryStream}"><span class="icon icon-history icon-large"></span></a>
<a data-toggle="tooltip" title="Histórico" class="btn ${btnXsClass} btn-default <%=iconClasses!= null?iconClasses:""%>" target="_blank" href="<%=request.getContextPath()%>/user/data.jsp?id=${repositoryStream}"><span class="icon icon-history icon-large"></span></a>
<%}%>
</div>
<%
115,9 → 119,9
<%
}
%>
<a data-toggle="tooltip" title="Descarregar" class="btn btn-small btn-default <%=iconClasses!= null?iconClasses:""%>" href="<%=request.getContextPath()%>/repositoryStream/${repositoryStream}"><span class="<%=iconFile%>"></span></a>
<a data-toggle="tooltip" title="Descarregar" class="btn ${btnXsClass} btn-default <%=iconClasses!= null?iconClasses:""%>" href="<%=request.getContextPath()%>/repositoryStream/${repositoryStream}"><span class="<%=iconFile%>"></span></a>
<%if(history){%>
<a data-toggle="tooltip" title="Histórico" class="btn btn-small btn-default <%=iconClasses!= null?iconClasses:""%>" href="javascript:invoqueDataVersionForm(${repositoryStream})"><span class="icon icon-history icon-large"></span></a>
<a data-toggle="tooltip" title="Histórico" class="btn ${btnXsClass} btn-default <%=iconClasses!= null?iconClasses:""%>" href="javascript:invoqueDataVersionForm(${repositoryStream})"><span class="icon icon-history icon-large"></span></a>
<%}%>
</div>
<%
/branches/v3/impl/src/java/pt/estgp/estgweb/services/courseunits/courseunitprogram.fo.xsl
74,11 → 74,11
 
 
<fo:table-cell >
<xsl:if test="$validadoCC = 'false'">
<fo:block font-size="15pt">
(Documento ainda não validado pela Comissão de Curso)
</fo:block>
</xsl:if>
<fo:block font-size="15pt">
<xsl:if test="$validadoCC = 'false'">
(Documento ainda não validado pela Comissão de Curso)
</xsl:if>
</fo:block>
</fo:table-cell>
 
<fo:table-cell text-align="right" >
/branches/v3/impl/src/java/pt/estgp/estgweb/services/data/repositorydocuments/RepositoryDocumentService.java
42,19 → 42,19
*/
public JSONArray openRepositoryCollection(Long collectionId, UserSession userSession) throws IOException, TransformationException, JSONException, AccessDeniedException {
 
boolean visible = userSession.getUser() != null &&
boolean onlyVisible = !(userSession.getUser() != null &&
(userSession.getUser().hasRole(REPOSITORY_DOCS_ROLE)
||
userSession.getUser().isSuperuserOrAdmin());
userSession.getUser().isSuperuserOrAdmin()));
if(collectionId == null)
{
//finding roots
List<RepositoryDocumentCollectionImpl> roots = DaoFactory.getRepositoryDocumentCollectionDaoImpl().findRoots(visible);
List<RepositoryDocumentCollectionImpl> roots = DaoFactory.getRepositoryDocumentCollectionDaoImpl().findRoots(onlyVisible);
return RepositoryDocumentCollectionImpl.toJsonArray(roots);
}
else
{
List<RepositoryDocumentCollectionImpl> childs = DaoFactory.getRepositoryDocumentCollectionDaoImpl().findChilds(visible,collectionId);
List<RepositoryDocumentCollectionImpl> childs = DaoFactory.getRepositoryDocumentCollectionDaoImpl().findChilds(onlyVisible,collectionId);
return RepositoryDocumentCollectionImpl.toJsonArray(childs);
}
}
62,12 → 62,12
 
public JSONArray openRepositoryCollectionDocuments(Long collectionId, UserSession userSession) throws IOException, TransformationException, JSONException, AccessDeniedException {
 
boolean visible = userSession.getUser() != null &&
boolean onlyVisible = !(userSession.getUser() != null &&
(userSession.getUser().hasRole(REPOSITORY_DOCS_ROLE)
||
userSession.getUser().isSuperuserOrAdmin());
userSession.getUser().isSuperuserOrAdmin()));
 
List<RepositoryDocumentImpl> docs = DaoFactory.getRepositoryDocumentDaoImpl().findDocumentsSortPublishDateDesc(visible, collectionId);
List<RepositoryDocumentImpl> docs = DaoFactory.getRepositoryDocumentDaoImpl().findDocumentsSortPublishDateDesc(onlyVisible, collectionId);
return RepositoryDocumentImpl.toJsonArray(docs);
}
 
171,6 → 171,8
repoFileCandidate.setDescription(ficheiroAtualizado.getDescription());
repoFileCandidate.setVisible(ficheiroAtualizado.isVisible());
repoFileCandidate.getRepositoryFileProxy().getRepositoryFile().setAccessControl(ficheiroAtualizado.getRepositoryFileProxy().getRepositoryFile().getAccessControl());
if(!repoFileCandidate.isVisible())
repoFileCandidate.getRepositoryFileProxy().getRepositoryFile().setAccessControl(ResourceAccessControlEnum.privateDomain.getKey());
break;
}
}
235,6 → 237,8
}
 
repoFile.setVisible(uploadedF.isVisible());
if(!repoFile.isVisible())
repoFile.getRepositoryFileProxy().getRepositoryFile().setAccessControl(ResourceAccessControlEnum.privateDomain.getKey());
repoFile.setTitle(uploadedF.getTitle());
repoFile.setDescription(uploadedF.getDescription());
 
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/RepositoryDocumentCollectionDaoImpl.java
1,5 → 1,6
package pt.estgp.estgweb.domain.dao.impl;
 
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import pt.estgp.estgweb.domain.RepositoryDocumentCollection;
33,20 → 34,25
return createCriteria().add(Restrictions.isNull("parent")).addOrder(Order.asc("name")).list();
}
 
public List<RepositoryDocumentCollectionImpl> findRoots(boolean visible)
public List<RepositoryDocumentCollectionImpl> findRoots(boolean onlyVisible)
{
return createCriteria()
Criteria c = createCriteria()
.add(Restrictions.isNull("parent"))
.add(eq("visible",visible))
.addOrder(Order.asc("name")).list();
 
.addOrder(Order.asc("name"));
if(onlyVisible)
c.add(eq("visible",true));
return c.list();
}
 
public List<RepositoryDocumentCollectionImpl> findChilds(boolean visible,long collectionId)
public List<RepositoryDocumentCollectionImpl> findChilds(boolean onlyVisible,long collectionId)
{
return createCriteria()
Criteria c = createCriteria()
.add(eq("parent.id",collectionId))
.add(eq("visible",visible))
.addOrder(Order.asc("name")).list();
.addOrder(Order.asc("name"));
if(onlyVisible)
c.add(eq("visible",true));
return c.list();
}
 
 
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/RepositoryDocumentDaoImpl.java
1,5 → 1,6
package pt.estgp.estgweb.domain.dao.impl;
 
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import pt.estgp.estgweb.domain.RepositoryDocumentImpl;
 
27,33 → 28,34
}
 
 
public List<RepositoryDocumentImpl> findDocumentsSortPublishDateDesc(boolean visible,long collectionId)
public List<RepositoryDocumentImpl> findDocumentsSortPublishDateDesc(boolean onlyVisible,long collectionId)
{
return findDocuments(visible,collectionId,"publishDate","desc");
return findDocuments(onlyVisible,collectionId,"publishDate","desc");
}
public List<RepositoryDocumentImpl> findDocumentsSortPublishDateAsc(boolean visible,long collectionId)
public List<RepositoryDocumentImpl> findDocumentsSortPublishDateAsc(boolean onlyVisible,long collectionId)
{
return findDocuments(visible,collectionId,"publishDate","asc");
return findDocuments(onlyVisible,collectionId,"publishDate","asc");
}
public List<RepositoryDocumentImpl> findDocumentsSortTitleDesc(boolean visible,long collectionId)
public List<RepositoryDocumentImpl> findDocumentsSortTitleDesc(boolean onlyVisible,long collectionId)
{
return findDocuments(visible,collectionId,"title","desc");
return findDocuments(onlyVisible,collectionId,"title","desc");
}
public List<RepositoryDocumentImpl> findDocumentsSortTitleAsc(boolean visible,long collectionId)
public List<RepositoryDocumentImpl> findDocumentsSortTitleAsc(boolean onlyVisible,long collectionId)
{
return findDocuments(visible,collectionId,"title","asc");
return findDocuments(onlyVisible,collectionId,"title","asc");
}
 
public List<RepositoryDocumentImpl> findDocuments(boolean visible,long collectionId,String orderField, String orderDirection)
public List<RepositoryDocumentImpl> findDocuments(boolean onlyVisible,long collectionId,String orderField, String orderDirection)
{
String orderFinalField = orderField == null ? "publishDate" : orderField;
Order order = orderDirection.equals("asc") ? Order.asc(orderFinalField) : Order.desc(orderFinalField);
return createCriteria()
Criteria c = createCriteria()
.add(eq("collection.id",collectionId))
.add(eq("visible",visible))
.addOrder(order)
.addOrder(Order.desc("saveDate"))
.list();
.addOrder(Order.desc("saveDate"));
if(onlyVisible)
c.add(eq("visible",true));
return c.list();
}
 
 
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/views/CourseView.java
224,6 → 224,7
if(department != null)
{
c.setDepartment(department);
if(department != null)
c.setInstitutionalCode(department.getCourseSchool().getInstitutionalCode());
}
 
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/courseunits/CourseUnitsEvaluationController.java
80,10 → 80,7
}
}
 
public ActionForward saveEvaluation(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
public boolean saveEvaluation(ActionForm form,HttpServletRequest request, HttpServletResponse response)
throws ServletException
{
CourseUnitEvaluationForm cUF = (CourseUnitEvaluationForm) form;
92,28 → 89,34
boolean go = true;
long id = cUF.getCourseUnitView().getId();
CourseUnitEvaluationView cuV = cUF.getCourseUnitEvaluationView();
if(request.getParameter("json")!=null && request.getParameter("json").equals("true"))
if(request.getParameter("autosave") != null && request.getParameter("autosave").equals("true"))
{
cuV.setAutosave(true);
}
else
{
ActionErrors errors = cUF.validateSave(mapping,request);
ActionErrors errors = cUF.validateSave(null,request);
if(errors.size() > 0)
{
saveErrors(request, errors);
go = false;
}
}
 
 
IServiceManager sm = ServiceManager.getInstance();
Object[] args = new Object[]{cuV, id};
String[] names = new String[]{"evaluationView", "unitId"};
if(go)
{
cuV = (CourseUnitEvaluationView) sm.execute(RequestUtils.getRequester(request, response), "SaveCourseUnitEvaluation", args,names);
CourseUnitView cV = loadCourseUnitView(id,true,false, mapping, request, response);
addMessage(request,"courseunit.evaluation.success");
}
/*CourseUnitView cV = loadCourseUnitView(id,true,false, null, request, response);
cUF.setCourseUnitView(cV);
cUF.setCourseUnitEvaluationView(cuV);
request.setAttribute("CourseUnitView", cV);
 
if(go)
addMessage(request,"courseunit.evaluation.success");
if(request.getParameter("json")!=null && request.getParameter("json").equals("true"))
124,27 → 127,20
return mapping.findForward("load");
else
return mapping.findForward("edit.evaluation");
*/
return true;
 
 
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
}
catch (NotFoundException e)
{
return mapping.findForward("error404");
}
catch (Throwable e)
{
logger.error(e, e);
addError(request, "courseunit.evaluation.tryagain");
return editEvaluation(mapping,cUF,request,response);
return false;
}
}
 
 
public ActionForward teacherCompleteEvaluation(ActionMapping mapping,
public boolean teacherCompleteEvaluation(
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
154,7 → 150,7
try
{
boolean go = true;
ActionErrors errors = cUF.validateSave(mapping,request);
ActionErrors errors = cUF.validateSave(null,request);
if(errors.size() > 0)
{
saveErrors(request, errors);
170,36 → 166,37
String[] names = new String[]{"evaluationView", "unitId"};
if(go)
cuV = (CourseUnitEvaluationView) sm.execute(RequestUtils.getRequester(request, response), "SaveCourseUnitEvaluation", args,names);
CourseUnitView cV = loadCourseUnitView(id,true,false, mapping, request, response);
cUF.setCourseUnitView(cV);
cUF.setCourseUnitEvaluationView(cuV);
request.setAttribute("CourseUnitView", cV);
//CourseUnitView cV = loadCourseUnitView(id,true,false, mapping, request, response);
//cUF.setCourseUnitView(cV);
//cUF.setCourseUnitEvaluationView(cuV);
//request.setAttribute("CourseUnitView", cV);
if(go)
addMessage(request,"courseunit.evaluation.success");
if(go)
return mapping.findForward("load");
else
return mapping.findForward("edit.evaluation");
//if(go)
// return mapping.findForward("load");
//else
// return mapping.findForward("edit.evaluation");
return go;
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
addErrorAsString(request,e.toString());
return false;
}
catch (NotFoundException e)
{
return mapping.findForward("error404");
addErrorAsString(request,e.toString());
return false;
}
catch (Throwable e)
{
logger.error(e, e);
addErrorAsString(request,e.toString());
addError(request, "courseunit.evaluation.tryagain");
return editEvaluation(mapping,cUF,request,response);
//return mapping.findForward("error500");
return false;
}
}
 
public ActionForward publishEvaluation(ActionMapping mapping,
ActionForm form,
public boolean publishEvaluation(ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
208,7 → 205,7
try
{
boolean go = true;
ActionErrors errors = cUF.validateSave(mapping,request);
ActionErrors errors = cUF.validateSave(null,request);
if(errors.size() > 0)
{
saveErrors(request, errors);
223,30 → 220,34
String[] names = new String[]{"evaluationView", "unitId"};
if(go)
cuV = (CourseUnitEvaluationView) sm.execute(RequestUtils.getRequester(request, response), "SaveCourseUnitEvaluation", args,names);
CourseUnitView cV = loadCourseUnitView(id,true,false, mapping, request, response);
cUF.setCourseUnitView(cV);
cUF.setCourseUnitEvaluationView(cuV);
request.setAttribute("CourseUnitView", cV);
//CourseUnitView cV = loadCourseUnitView(id,true,false, mapping, request, response);
//cUF.setCourseUnitView(cV);
//cUF.setCourseUnitEvaluationView(cuV);
//request.setAttribute("CourseUnitView", cV);
if(go)
addMessage(request,"courseunit.evaluation.success");
if(go)
return mapping.findForward("load");
else
return mapping.findForward("edit.evaluation");
//if(go)
// return mapping.findForward("load");
//else
// return mapping.findForward("edit.evaluation");
return go;
}
catch (FilterChainFailedException e)
{
return mapping.findForward("error401");
addErrorAsString(request,e.toString());
return false;
}
catch (NotFoundException e)
{
return mapping.findForward("error404");
addErrorAsString(request,e.toString());
return false;
}
catch (Throwable e)
{
logger.error(e, e);
addError(request, "courseunit.evaluation.tryagain");
return editEvaluation(mapping,cUF,request,response);
addErrorAsString(request,e.toString());
return false;
}
}
 
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/courseunits/CourseUnitsProgramController.java
41,6 → 41,7
HttpServletResponse response)
throws Throwable {
 
 
CourseUnitProgramForm cUF = (CourseUnitProgramForm) form;
 
long id = cUF.getCourseUnitId();
57,6 → 58,7
request,
response);
 
 
}
 
public ActionForward invalidateProgram(ActionMapping mapping,
65,22 → 67,25
HttpServletResponse response)
throws Throwable {
 
CourseUnitProgramForm cUF = (CourseUnitProgramForm) form;
 
long id = cUF.getCourseUnitId();
if(id <= 0)
id = cUF.getCourseUnitView().getId();
CourseUnitProgramForm cUF = (CourseUnitProgramForm) form;
 
IServiceManager sm = ServiceManager.getInstance();
Object[] args = new Object[]{id};
String[] names = new String[]{"unitId"};
sm.execute(RequestUtils.getRequester(request, response), "InvalidateCourseUnitProgram", args,names);
long id = cUF.getCourseUnitId();
if(id <= 0)
id = cUF.getCourseUnitView().getId();
 
return editProgram(mapping,
form,
request,
response);
IServiceManager sm = ServiceManager.getInstance();
Object[] args = new Object[]{id};
String[] names = new String[]{"unitId"};
sm.execute(RequestUtils.getRequester(request, response), "InvalidateCourseUnitProgram", args,names);
 
return editProgram(mapping,
form,
request,
response);
 
 
 
}
 
public ActionForward editProgram(ActionMapping mapping,
153,7 → 158,13
CourseUnitView cV = loadCourseUnitView(id,true,false, mapping, request, response);
cUF.setCourseUnitView(cV);
request.setAttribute("CourseUnitView", cV);
return mapping.findForward("load");
 
if(request.getParameter("json")!=null && request.getParameter("json").equals("true"))
{
return mapping.findForward("jsonOk");
}
else
return mapping.findForward("load");
}
catch (FilterChainFailedException e)
{
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/repositorydocs/interfaces/InterfaceConfiguration.java
File deleted
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/repositorydocs/interfaces/RepositoryInterface.java
New file
0,0 → 1,144
package pt.estgp.estgweb.web.controllers.repositorydocs.interfaces;
 
import com.owlike.genson.Genson;
import com.owlike.genson.TransformationException;
import org.json.JSONException;
import org.json.JSONObject;
 
import java.io.IOException;
import java.util.ArrayList;
 
/**
* Created by jorgemachado on 23/03/17.
*/
public class RepositoryInterface
{
 
String title;
String description;
 
boolean showTitle;
boolean showDescription;
 
ArrayList<InterfaceRow> rows = new ArrayList<InterfaceRow>();
 
public String getTitle() {
return title;
}
 
public void setTitle(String title) {
this.title = title;
}
 
public String getDescription() {
return description;
}
 
public void setDescription(String description) {
this.description = description;
}
 
public boolean isShowTitle() {
return showTitle;
}
 
public void setShowTitle(boolean showTitle) {
this.showTitle = showTitle;
}
 
public boolean isShowDescription() {
return showDescription;
}
 
public void setShowDescription(boolean showDescription) {
this.showDescription = showDescription;
}
 
public ArrayList<InterfaceRow> getRows() {
return rows;
}
 
public void setRows(ArrayList<InterfaceRow> rows) {
this.rows = rows;
}
 
static Genson genson;
 
static {
Genson.Builder gensonBuilder = new Genson.Builder()
.exclude(Object.class)
.include(RepositoryInterface.class)
.include(InterfaceRow.class)
.include(InterfaceColumn.class)
.include(InterfaceBlock.class)
.include(String.class)
.include(ArrayList.class)
.include(InterfaceBlock.Order.class);
 
genson = gensonBuilder.create();
 
}
public String toJson() throws IOException, TransformationException
{
return genson.serialize(this);
}
 
public static RepositoryInterface loadFromJson(String json) throws IOException, TransformationException {
return genson.deserialize(json, RepositoryInterface.class);
}
 
public JSONObject toJsonObject() throws IOException, TransformationException, JSONException {
return new JSONObject(toJson());
}
 
public static void main(String[] args) throws IOException, TransformationException {
RepositoryInterface repositoryInterface = new RepositoryInterface();
repositoryInterface.setTitle("Teste");
repositoryInterface.setDescription("RepoDesc");
repositoryInterface.setShowTitle(true);
repositoryInterface.setShowDescription(true);
 
InterfaceRow interfaceRow = new InterfaceRow();
repositoryInterface.getRows().add(interfaceRow);
 
interfaceRow.setTitle("Row 1 title");
interfaceRow.setDescription("Row 1 Desc");
 
InterfaceColumn col1 = new InterfaceColumn();
InterfaceColumn col2 = new InterfaceColumn();
 
interfaceRow.getColumns().add(col1);
interfaceRow.getColumns().add(col2);
 
col1.setTitle("col1Title");
col2.setTitle("col2Title");
col1.setDescription("col1Desc");
col2.setDescription("col2Desc");
col1.setCols(6);
col2.setCols(6);
 
 
InterfaceBlock interfaceBlock1 = new InterfaceBlock();
InterfaceBlock interfaceBlock2 = new InterfaceBlock();
col1.getBlocks().add(interfaceBlock1);
col2.getBlocks().add(interfaceBlock2);
interfaceBlock1.setTitle("bloco1");
interfaceBlock2.setTitle("bloco2");
interfaceBlock1.setDescription("bloco1desc");
interfaceBlock2.setDescription("bloco2desc");
interfaceBlock1.getCollectionId().add(new Long(1));
interfaceBlock2.getCollectionId().add(new Long(4));
 
interfaceBlock1.setOrderBy(InterfaceBlock.Order.publishDate);
interfaceBlock2.setOrderBy(InterfaceBlock.Order.title);
 
 
 
System.out.println(repositoryInterface.toJson());
 
repositoryInterface = RepositoryInterface.loadFromJson(repositoryInterface.toJson());
 
System.out.println(repositoryInterface.toJson());
 
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/repositorydocs/interfaces/InterfaceRow.java
New file
0,0 → 1,60
package pt.estgp.estgweb.web.controllers.repositorydocs.interfaces;
 
import java.util.ArrayList;
 
/**
* Created by jorgemachado on 17/03/17.
*/
public class InterfaceRow implements java.io.Serializable
{
String title;
String description;
 
boolean showTitle;
boolean showDescription;
 
ArrayList<InterfaceColumn> columns = new ArrayList<InterfaceColumn>();
 
public boolean isShowTitle() {
return showTitle;
}
 
public void setShowTitle(boolean showTitle) {
this.showTitle = showTitle;
}
 
public boolean isShowDescription() {
return showDescription;
}
 
public void setShowDescription(boolean showDescription) {
this.showDescription = showDescription;
}
 
public String getTitle() {
return title;
}
 
public void setTitle(String title) {
this.title = title;
}
 
public String getDescription() {
return description;
}
 
public void setDescription(String description) {
this.description = description;
}
 
 
public ArrayList<InterfaceColumn> getColumns() {
return columns;
}
 
public void setColumns(ArrayList<InterfaceColumn> columns) {
this.columns = columns;
}
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/repositorydocs/interfaces/InterfaceBlock.java
11,31 → 11,59
String title;
String description;
 
boolean showTitle = true;
boolean showDescription = false;
 
Order orderBy = Order.publishDate;
 
 
ArrayList<Long> collectionId = new ArrayList<Long>();
//or
boolean splitSubCollections;
boolean onlyTitleFileView;
 
boolean tree = false;
 
boolean showDocumentTitle = true;
boolean showDocumentDescription = true;
 
boolean showFileTitle = true;
boolean showFileDescription = false;
boolean showFileMetaData = false;
 
Date maxPublishDate;
Date minPublishDate;
 
public boolean isSplitSubCollections()
public boolean isTree()
{
return splitSubCollections;
return tree;
}
 
public void setSplitSubCollections(boolean splitSubCollections) {
this.splitSubCollections = splitSubCollections;
public Order getOrderBy() {
return orderBy;
}
 
public boolean isOnlyTitleFileView() {
return onlyTitleFileView;
public void setOrderBy(Order orderBy) {
this.orderBy = orderBy;
}
 
public void setOnlyTitleFileView(boolean onlyTitleFileView) {
this.onlyTitleFileView = onlyTitleFileView;
public boolean isShowFileDescription() {
return showFileDescription;
}
 
public void setShowFileDescription(boolean showFileDescription) {
this.showFileDescription = showFileDescription;
}
 
public void setTree(boolean tree) {
this.tree = tree;
}
 
public boolean isShowDocumentTitle() {
return showDocumentTitle;
}
 
public void setShowDocumentTitle(boolean showDocumentTitle) {
this.showDocumentTitle = showDocumentTitle;
}
 
public Date getMaxPublishDate() {
return maxPublishDate;
}
75,4 → 103,53
public void setCollectionId(ArrayList<Long> collectionId) {
this.collectionId = collectionId;
}
 
public boolean isShowTitle() {
return showTitle;
}
 
public void setShowTitle(boolean showTitle) {
this.showTitle = showTitle;
}
 
public boolean isShowDescription() {
return showDescription;
}
 
public void setShowDescription(boolean showDescription) {
this.showDescription = showDescription;
}
 
public boolean isShowDocumentDescription() {
return showDocumentDescription;
}
 
public void setShowDocumentDescription(boolean showDocumentDescription) {
this.showDocumentDescription = showDocumentDescription;
}
 
public boolean isShowFileTitle() {
return showFileTitle;
}
 
public void setShowFileTitle(boolean showFileTitle) {
this.showFileTitle = showFileTitle;
}
 
public boolean isShowFileMetaData() {
return showFileMetaData;
}
 
public void setShowFileMetaData(boolean showFileMetaData) {
this.showFileMetaData = showFileMetaData;
}
 
 
public enum Order
{
title,
publishDate,
saveDate,
updateDate
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/repositorydocs/interfaces/InterfaceColumn.java
New file
0,0 → 1,58
package pt.estgp.estgweb.web.controllers.repositorydocs.interfaces;
 
import java.util.ArrayList;
 
/**
* Created by jorgemachado on 23/03/17.
*/
public class InterfaceColumn implements java.io.Serializable
{
String title;
String description;
//1 - 12
int cols;
 
ArrayList<InterfaceBlock> blocks = new ArrayList<InterfaceBlock>();
//XOR
ArrayList<InterfaceRow> rows = new ArrayList<InterfaceRow>();
 
public ArrayList<InterfaceRow> getRows() {
return rows;
}
 
public void setRows(ArrayList<InterfaceRow> rows) {
this.rows = rows;
}
 
public int getCols() {
return cols;
}
 
public void setCols(int cols) {
this.cols = cols;
}
 
public String getTitle() {
return title;
}
 
public void setTitle(String title) {
this.title = title;
}
 
public String getDescription() {
return description;
}
 
public void setDescription(String description) {
this.description = description;
}
 
public ArrayList<InterfaceBlock> getBlocks() {
return blocks;
}
 
public void setBlocks(ArrayList<InterfaceBlock> blocks) {
this.blocks = blocks;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/authenticate/AuthenticateController.java
9,7 → 9,7
import pt.estgp.estgweb.domain.views.UserView;
import pt.estgp.estgweb.services.authenticate.AuthenticateException;
import pt.estgp.estgweb.web.UserSessionProxy;
import pt.estgp.estgweb.web.controllers.ApplicationDispatchController;
import pt.estgp.estgweb.web.controllers.utils.AbstractWidgetAjaxController;
import pt.estgp.estgweb.web.exceptions.NoCookiesException;
import pt.estgp.estgweb.web.form.profile.ProfileForm;
import pt.estgp.estgweb.web.utils.RequestUtils;
27,11 → 27,36
* @time 18:01:54
* @see pt.estgp.estgweb.web
*/
public class AuthenticateController extends ApplicationDispatchController
public class AuthenticateController extends AbstractWidgetAjaxController
{
 
private static final Logger logger = Logger.getLogger(AuthenticateController.class);
 
public boolean loginWidget(ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Throwable
{
try
{
String username = request.getParameter("username");
String password = request.getParameter("password");
IServiceManager sm = ServiceManager.getInstance();
Object[] args = new Object[]{username,password};
UserSession userSession = (UserSession) sm.execute(RequestUtils.getRequester(request, response),Globals.AUTHENTICATE_SERVICE,args);
request.setAttribute(Globals.USER_SESSION_KEY,userSession);
return true;
}
catch (AuthenticateException e)
{
ActionMessages actionMessages = new ActionMessages();
actionMessages.add(ActionMessages.GLOBAL_MESSAGE,new ActionMessage(e.getMessage()));
saveErrors(request, actionMessages);
return false;
}
catch (Throwable e)
{
return false;
}
}
 
public ActionForward login(ActionMapping mapping,
ActionForm form ,
HttpServletRequest request,
270,4 → 295,6
}
 
 
 
 
}
/branches/v3/impl/src/web/auth/loginWidget.jsp
New file
0,0 → 1,93
<%@ page import="pt.estgp.estgweb.Globals" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/tlds/jomm.tld" prefix="jomm" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<script>
var actionAuthenticate = "<%=request.getContextPath()%>/authenticateWidget.do";
function authenticateWidget()
{
var username = $("#formAuthenticationWidget input[name='username']").val();
var password = $("#formAuthenticationWidget input[name='password']").val();
widgetSimpleCallWithActionParameters(
"<%=request.getContextPath()%>/authenticateWidget.do",
"loginWidget",
{
"username" : username,
"password" : password
},
"#formAuthenticationWidget",
function()
{
$('#modalAuthentication').modal('hide');
},
function()
{
//fail
}
);
}
</script>
 
 
 
<!--AUTENTICATION MODAL-->
<script>
$(document).ready(function(){
$('#modalAuthentication').on('show.bs.modal', function(e)
{
$("#modalAuthentication .web-messages").html("");
});
});
</script>
<div class="modal fade" id="modalAuthentication" role="dialog" >
<div class="modal-dialog" data-width="960" style="display: block; width: 960px; margin-top: 50px;" aria-hidden="false">
 
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title">Formulário de Autenticação</h1>
</div>
 
<div class="modal-body">
<div class="alert alert-info">
Caro utilizador, a sessão expirou, por favor introduza as suas credênciais
para voltar a autênticar-se no sistema
e poder repetir a última operação. Obrigado.
</div>
 
<div id="formAuthenticationWidget" class="clearfix">
 
<div class="web-messages" style="margin-bottom: 5px"></div>
 
<div class="form-horizontal col-md-12 clearfix">
<div class="form-group clearfix">
<label class="col-md-12" style="margin-bottom: 10px"><jomm:messageConfigKey config="authentication.policy.username.msg.key"/></label>
<div class="col-md-6">
<input type="text" class="form-control" name="username"/>
</div>
</div>
<div class="form-group clearfix">
<label class="col-md-12" style="margin-bottom: 10px"><jomm:messageConfigKey config="authentication.policy.password.msg.key"/></label>
<div class="col-md-6">
<input type="password" class="form-control" name="password"/>
</div>
</div>
<div class="col-sm-2">
<button type="button" class="btn btn-success" onclick="authenticateWidget()"><bean:message key="submit"/></button>
</div>
</div>
</div>
 
 
</div>
</div>
 
</div>
</div>
 
 
/branches/v3/impl/src/web/errors/401.jsp
9,7 → 9,7
<%
response.sendError(401);
%>
<div class="container-fluid">
<div class="container-fluid errorContent">
 
<h3 class="statusWARNING">
<baco:isNotAuthenticated>
/branches/v3/impl/src/web/errors/500.jsp
9,7 → 9,7
response.sendError(500);
%>
 
<div class="container-fluid">
<div class="container-fluid errorContent">
<div class="alert alert-danger"><bean:message key="error.500"/></div>
<div class="alert alert-info"><bean:message key="admin.contact"/>
<ul>
/branches/v3/impl/src/web/errors/404.jsp
8,7 → 8,7
<%
response.sendError(404);
%>
<div class="container-fluid">
<div class="container-fluid errorContent">
<div class="alert alert-warning"><bean:message key="error.404"/></div>
<p><bean:message key="error.404.explain"/></p>
<ul>
/branches/v3/impl/src/web/errors/503.jsp
8,7 → 8,7
<%
response.sendError(500);
%>
<div class="container-fluid">
<div class="container-fluid errorContent">
<div class="alert alert-danger"><bean:message key="error.503"/></div>
<div class="alert alert-info"><bean:message key="admin.contact"/>
<ul>
/branches/v3/impl/src/web/errors/noCookies.jsp
6,5 → 6,7
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
 
 
<div class="container-fluid errorContent">
<h3 class="statusWARNING"><bean:message key="error.no.cookies"/></h3>
<p><bean:message key="admin.contact"/> webmaster [AT] estgp [DOT] pt</p>
<p><bean:message key="admin.contact"/> webmaster [AT] estgp [DOT] pt</p>
</div>
/branches/v3/impl/src/web/errors/408.jsp
8,6 → 8,7
<%
response.sendError(404);
%>
<div class="container-fluid errorContent">
<h3 class="statusWARNING"><bean:message key="error.404"/></h3>
<p><bean:message key="error.408.explain"/></p>
 
17,3 → 18,4
<li><%=ConfigProperties.getProperty("admin.email.2")%></li>
</ul>
</p>
</div>
/branches/v3/impl/src/web/js/baco-widgets.js
12,7 → 12,7
{
var data = $(form).serialize().replace(/%0D%0A/g, '%0A').replace(/\r?\n/g, "\r\n");
 
widgetCallWithActionParameters(form.action,serviceName,data,form,handlerOk,handlerFail);
widgetCallWithActionParameters($(form).attr("action"),serviceName,data,form,handlerOk,handlerFail);
}
 
/**
25,7 → 25,7
*/
function widgetCallWithParameters(serviceName,parameters,form,handlerOk,handlerFail)
{
widgetCallWithActionParameters(form.action,serviceName,parameters,form,handlerOk,handlerFail);
widgetCallWithActionParameters($(form).attr("action"),serviceName,parameters,form,handlerOk,handlerFail);
}
 
/**
48,6 → 48,11
type: "POST",
data: data,
dataType: "json",
statusCode: {
401:function() {
$("#modalAuthentication").modal({ show : 'true'});
}
},
success: function(resposta)
{
 
90,7 → 95,7
 
function widgetSimpleCall(serviceName,form,handlerOk,handlerFail){
var data = $(form).serialize().replace(/%0D%0A/g, '%0A').replace(/\r?\n/g, "\r\n");
widgetSimpleCallWithActionParameters(form.action,serviceName,data,form,handlerOk,handlerFail);
widgetSimpleCallWithActionParameters($(form).attr("action"),serviceName,data,form,handlerOk,handlerFail);
}
/**
*
108,6 → 113,12
type: "POST",
data: data,
dataType: "json",
statusCode: {
401:function() {
$('.modal').modal("hide");
$("#modalAuthentication").modal({ show : 'true'});
}
},
success: function(resposta)
{
$(webMessagesContainer).find(".web-messages").html("");
136,11 → 147,16
{
$(webMessagesContainer).find(".web-messages").append('<div class="alert alert-success">' + resposta.messages[msg] + '</div>');
}
for(var error in resposta.errors)
{
$(webMessagesContainer).find(".web-messages").append('<div class="alert alert-warning">' + resposta.errors[error] + '</div>');
}
if(handlerOk != undefined)
handlerOk();
}
},
error: function() {
error: function(resposta)
{
$(webMessagesContainer).find(".web-messages").html('<div class="alert alert-danger">Erro de comunicação, por favor tente novamente</div>');
}
});
/branches/v3/impl/src/web/layout/themes/scripts-default.jsp
741,3 → 741,5
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/bpmn/css/bpmn.css" />
 
 
 
 
/branches/v3/impl/src/web/layout/headerTools.jsp
323,4 → 323,129
<jsp:include page="intranetTools/files-upload-form.jsp"/>
 
<link rel="stylesheet" href="<%=request.getContextPath()%>/js/angularjs/angular-ui-tree/angular-ui-tree.min.css">
<script type="text/javascript" src="<%=request.getContextPath()%>/js/angularjs/angular-ui-tree/angular-ui-tree.js"></script>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/angularjs/angular-ui-tree/angular-ui-tree.js"></script>
 
 
 
 
 
 
 
<script>
//COLOCAR WEB-MESSAGES WARNING E ERROR NUMA MODAL DEPOIS DE CARREGAR A PAGINA
$(document).ready(function()
{
if($(".web-messages-errors-baco").length)
{
$('#errorsBacoModal .content-errors').html($(".web-messages-errors-baco").html());
$('#errorsBacoModal').modal({
show: 'true'
});
}
});
function modalWebMessages(title)
{
if($(".web-messages").length)
{
$("#modalWebMessages modal-title").html(title);
$('#modalWebMessages .content-web-messages').html( $(".web-messages").html());
$('#modalWebMessages .content-aditional').html( "");
$('#modalWebMessages').modal({
show: 'true'
});
}
}
function modalWebMessages(title,aditionalHtml)
{
if($(".web-messages").length)
{
$("#modalWebMessages .modal-title").html(title);
$('#modalWebMessages .content-web-messages').html( $(".web-messages").html());
$('#modalWebMessages .content-aditional').html( aditionalHtml);
$('#modalWebMessages').modal({
show: 'true'
});
}
}
function modalWebMessagesGivenContainer(title,refContainer)
{
if($(refContainer + " .web-messages").length)
{
$("#modalWebMessages .modal-title").html(title);
$('#modalWebMessages .content-web-messages').html($(refContainer + " .web-messages").html());
$('#modalWebMessages .content-aditional').html( "");
$('#modalWebMessages').modal({
show: 'true'
});
}
}
function modalWebMessagesGivenContainer(title,refContainer,targetOkUrl)
{
if($(refContainer + " .web-messages").length)
{
$("#modalWebMessages .modal-title").html(title);
$('#modalWebMessages .content-web-messages').html($(refContainer + " .web-messages").html());
$('#modalWebMessages .content-aditional').html( "");
$('#modalWebMessages').modal({
show: 'true'
});
$("#modalWebMessages button[data-dismiss='modal']").unbind( "click" );
$("#modalWebMessages button[data-dismiss='modal']").click(
function()
{
window.location.href = targetOkUrl;
}
);
}
}
</script>
 
<div class="modal fade" id="errorsBacoModal" role="dialog" >
<div class="modal-dialog" data-width="960" style="display: block; width: 960px; margin-top: 50px;" aria-hidden="false">
 
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title">Existem Avisos</h1>
</div>
<div class="modal-body">
<div class="panel panel-default">
<div class="panel-body content-errors" >
 
</div>
</div>
 
<button type="button" class="btn btn-default" data-dismiss="modal">Entendi</button>
</div>
</div>
 
</div>
</div>
 
<div class="modal fade" id="modalWebMessages" role="dialog" >
<div class="modal-dialog" data-width="960" style="display: block; width: 960px; margin-top: 50px;" aria-hidden="false">
 
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title"></h1>
</div>
<div class="modal-body">
<div class="panel panel-default">
<div class="panel-body content-web-messages" >
 
</div>
</div>
<div class="content-aditional" >
 
</div>
<button type="button" class="btn btn-default" data-dismiss="modal">Entendi</button>
</div>
</div>
 
</div>
</div>
 
 
 
<jsp:include page="/auth/loginWidget.jsp"/>
/branches/v3/impl/src/web/user/courses/studiesPlansAdministrationEdit.jsp
63,6 → 63,7
request.setAttribute("courseId",courseId);
request.setAttribute("studyPlanId",studyPlanId);
request.setAttribute("course",course);
request.setAttribute("courseSigesCode",course.getCode());
 
 
 
175,6 → 176,64
</div>
</div>
 
<script>
function createFichasUrls()
{
$("[data-unit-ficha-url-target-id]").each(
function()
{
var targetId = $(this).attr("data-unit-ficha-url-target-id");
var sigesUnit = $(this).attr("data-unit-siges-code");
var sigesCourse = $(this).attr("data-course-siges-code");
var unitSemestre = $(this).attr("data-unit-semestre");
var sigesUrlInput = $("#" + targetId);
var urlPattern = $("#urlPadraoFicha").val();
var targetsType = $("#urlPadraoFichaAlvo option:selected").val();
if(targetsType == "all" || sigesUrlInput.val() == "")
{
urlPattern = urlPattern.replace("{SIGES_CURSO}",'${courseSigesCode}');
urlPattern = urlPattern.replace("{SIGES_UNIT}",sigesUnit);
urlPattern = urlPattern.replace("{UNIT_SEMESTRE}",unitSemestre);
 
$("#" + targetId).val(urlPattern);
}
}
);
alert("URLS gerados com Sucesso, Necessita de SALVAR o Plano.");
}
</script>
 
<div class="panel panel-warning">
<div class="panel-heading"><span class="glyphicon glyphicon-wrench"></span> Ferramenta Auxiliar de Auto-Preenchimento de URL's de Fichas</div>
<div class="panel-body">
 
<div class="form-group">
<label class="control-label col-sm-2">URL Padrão</label>
<div class="col-sm-10">
<p>exemplo para a ESTG: http://www.estgp.pt/startLoadCourseUnitProgramSiges.do?unitCode={SIGES_UNIT}&courseCode={SIGES_CURSO}&semestre={UNIT_SEMESTRE}</p>
<p>Nenhum dos campos é obrigatório, o sistema substitui se existir no padrão, Na estg o Semestre é obrigatório para diferenciar unidades que são lecionadas em ambos os semestres</p>
<p>O semestre presente neste sistema e que vai ser preenchido vai de S1 a S6 e de T1 a T8 ou A, portanto se o semestre for usado à que ter isto em atenção</p>
<input type="text" class="form-control" id="urlPadraoFicha" placeholder="http://exemplo.com/exemplo/{SIGES_CURSO}/{SEMESTRE}/{SIGES_UNIT}.pdf">
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">Alvos</label>
<div class="col-sm-10">
<select id="urlPadraoFichaAlvo">
<option value="all">Todos</option>
<option value="onlyEmpty">Apenas Vazios</option>
</select>
</div>
</div>
<button class="btn btn-warning" type="button" data-toggle="modal" onclick="createFichasUrls()">
Gerar URL's de Fichas
</button>
 
 
 
</div>
</div>
 
<%
CourseStudiesPlansAdminForm courseStudiesPlansAdminForm = (CourseStudiesPlansAdminForm) request.getAttribute("CourseStudiesPlansAdminForm");
//Form ainda não iniciado vai iniciar é a primeira vez
677,7 → 736,9
<td><nested:text styleClass="form-control" styleId="horasContactoO${dummyIndexIdUnidades}" property="horasContacto.o"/></td>
<td><nested:text styleClass="form-control" styleId="ECTS${dummyIndexIdUnidades}" property="ECTS"/></td>
<td><nested:text styleClass="form-control" styleId="urlUnidadeCurricular${dummyIndexIdUnidades}" style="width:600px" property="urlUnidadeCurricular"/></td>
<td><nested:text styleClass="form-control" styleId="urlFichaCurricular${dummyIndexIdUnidades}" style="width:600px" property="urlFichaCurricular"/></td>
<td data-unit-semestre="${semestre.id}" data-course-siges-code="${courseSigesCode}" data-unit-siges-code="${unit.siges}" data-unit-ficha-url-target-id="urlFichaCurricular${dummyIndexIdUnidades}" data-unit-site-url-target-id="urlUnidadeCurricular${dummyIndexIdUnidades}">
<nested:text styleClass="form-control" styleId="urlFichaCurricular${dummyIndexIdUnidades}" style="width:600px" property="urlFichaCurricular"/>
</td>
</tr>
</nested:iterate>
</tbody>
822,7 → 883,9
<td><nested:text styleClass="form-control" styleId="horasContactoO${dummyIndexIdUnidades}" property="horasContacto.o"/></td>
<td><nested:text styleClass="form-control" styleId="ECTS${dummyIndexIdUnidades}" property="ECTS"/></td>
<td><nested:text styleClass="form-control" styleId="urlUnidadeCurricular${dummyIndexIdUnidades}" style="width:600px" property="urlUnidadeCurricular"/></td>
<td><nested:text styleClass="form-control" styleId="urlFichaCurricular${dummyIndexIdUnidades}" style="width:600px" property="urlFichaCurricular"/></td>
<td data-unit-semestre="${semestre.id}" data-course-siges-code="${courseSigesCode}" data-unit-siges-code="${unit.siges}" data-unit-ficha-url-target-id="urlFichaCurricular${dummyIndexIdUnidades}" data-unit-site-url-target-id="urlUnidadeCurricular${dummyIndexIdUnidades}">
<nested:text styleClass="form-control" styleId="urlFichaCurricular${dummyIndexIdUnidades}" style="width:600px" property="urlFichaCurricular"/>
</td>
</tr>
</nested:iterate>
</tbody>
/branches/v3/impl/src/web/user/courseunits/courseunitEvaluation.jsp
370,6 → 370,7
<html:errors/>
<jomm:messages/>
 
 
<baco:notClearOperation name="CourseUnitView" property="courseUnit" op="EVALUATION_INFO_ACTIVE">
<div class="alert alert-info">
<bean:message key="courseunit.evaluation.period.inactive"/>
471,13 → 472,16
 
 
 
<html:form styleId="formEval" styleClass="form-horizontal" action="/user/courseUnitEvaluationController">
<html:form styleId="formEval" styleClass="form-horizontal" action="/user/courseUnitEvaluationControllerWidget">
<input type="hidden" id="dispatch" name="dispatch" value="saveEvaluation">
<html:hidden property="id"/>
<html:hidden property="courseUnitView.id"/>
<input type="hidden" name="autosave" value="true"/>
 
 
<div class="web-messages"></div>
 
 
<div class="panel panel-default">
<div class="panel-heading">
Dados alterados pelo Docente da Unidade
631,15 → 635,15
</table>
 
<baco:clearOperation name="CourseUnitView" property="courseUnit" op="EVALUATION_EDITSAVE">
<button type="button" class="btn btn-default" onclick="set(form,'saveEvaluation');submitFormWaitAutoSave(form);"><bean:message key="save"/></button>
<button type="button" class="btn btn-default" onclick="submitFormWaitAutoSave(form,'saveEvaluation');"><bean:message key="save"/></button>
</baco:clearOperation>
 
<baco:clearOperation name="CourseUnitView" property="courseUnit" op="EVALUATION_TRANSITATE_TO_COMPLETE">
<button type="button" id="buttonTeacherCompleteEvaluation" class="btn btn-default" onclick="set(form,'teacherCompleteEvaluation');submitFormWaitAutoSave(form);"><bean:message key="courseunit.evaluation.transit.to.complete"/></button>
<button type="button" id="buttonTeacherCompleteEvaluation" class="btn btn-default" onclick="submitFormWaitAutoSave(form,'teacherCompleteEvaluation');"><bean:message key="courseunit.evaluation.transit.to.complete"/></button>
</baco:clearOperation>
 
<baco:clearOperation name="CourseUnitView" property="courseUnit" op="EVALUATION_TRANSITATE_TO_CLOSE">
<button type="button" id="buttonPublishEvaluation" class="btn btn-default" onclick="set(form,'publishEvaluation');submitFormWaitAutoSave(form);"><bean:message key="courseunit.evaluation.transit.to.closed"/></button>
<button type="button" id="buttonPublishEvaluation" class="btn btn-default" onclick="submitFormWaitAutoSave(form,'publishEvaluation');"><bean:message key="courseunit.evaluation.transit.to.closed"/></button>
</baco:clearOperation>
 
 
684,21 → 688,7
</div>
 
<script>
function submitFormWaitAutoSave()
{
stopAutoSave = true;
$('#myModal').modal({
show: 'true'
});
//esperar se houver algum update a executar 1500 segundos é o maximo de espera
//se a pagina não recarregar e porque a thread parou
setTimeout("submitForm()",40000);
}
 
function submitForm()
{
$("#formEdit").submit();
}
 
$( document ).ready(function() {
 
717,46 → 707,77
</baco:notClearOperation>
 
<baco:clearOperation name="CourseUnitView" property="courseUnit" op="EVALUATION_EDITSAVE">
setTimeout("serData()",5000);
setTimeout("autoSaveStart()",5000);
</baco:clearOperation>
 
});
 
 
var stopAutoSave = false;
function autoSaveStart()
{
if(!stopAutoSave)
sendEvaluation(true,"saveEvaluation");
 
function serData()
}
 
function submitFormWaitAutoSave(form,service)
{
if(stopAutoSave)
stopAutoSave = true;
$('#myModal').modal({
show: 'true'
});
//esperar se houver algum update a executar 1500 segundos é o maximo de espera
//se a pagina não recarregar e porque a thread parou
setTimeout("submitForm('" + service + "')",2000);
}
 
function submitForm(service)
{
//Para Submeter sem o JSON = true
 
sendEvaluation(false,service);
}
 
 
 
 
 
function sendEvaluation(autosave,service)
{
 
 
if(autosave)
{
$("#formEval").submit();
return;
$("#dispatch").val("saveEvaluation");
$("#autosave").html('<div class="alert alert-info">Enviando ...</div>');
$("#formEval input[name='autosave']").val("true");
}
else
{
$("#dispatch").val("saveEvaluation");
var data = $("#formEval").serialize().replace(/%0D%0A/g, '%0A').replace(/\r?\n/g, "\r\n");
//alert(data);
$("#formEval input[name='autosave']").val("false");
 
//alert($("#dispatch").val())
$("#autosave").html('<div class="alert alert-info">Enviando ...</div>');
$.ajax({
url: "<%=request.getContextPath()%>/user/courseUnitEvaluationController.do",
type: "POST",
data: data + "&json=true",
dataType: "json",
success: function(resposta) {
if(resposta.service && resposta.service == "ok")
widgetSimpleCall(
service,
$("#formEval"),
function()
{
$('#myModal').modal("hide");
//ok
if(autosave)
{
$("#autosave").html('<div class="alert alert-success">Salvo Automaticamente (Apenas Dados, não gerou PDF, para gerar PDF terá de salvar o docente)</div>');
}
else
$("#autosave").html('<div class="alert alert-warning">Deve salvar o seu relatório periodicamente</div>');
setTimeout("serData()",5000);
{
modalWebMessagesGivenContainer("Avaliação Salva","#formEval","<%=request.getContextPath()%>/user/startLoadCourseUnitEvaluation.do?courseUnitId=${CourseUnitView.id}");
}
},
error: function() {
$("#autosave").html('<div class="alert alert-danger">Erro de comunicação, tentando novamente em 5 segundos</div>');
setTimeout("serData()",5000);
function()
{
$('#myModal').modal("hide");
modalWebMessagesGivenContainer("Avaliação Salva","#formEval");
}
});
}
);
}
 
</script>
/branches/v3/impl/src/web/user/courseunits/courseunitProgram.jsp
27,7 → 27,10
 
<html:errors/>
<jomm:messages/>
<div class="web-messages">
 
</div>
 
<baco:clearOperation name="CourseUnitView" property="courseUnit" op="PROGRAM_INFO_VALID_NOT_ACTIVE">
<div class="alert alert-warning">
O programa não está aberto para edição. A comissão de curso terá de invalidar o programa para que este possa ser alterado.
413,18 → 416,104
 
 
<baco:clearOperation name="CourseUnitView" property="courseUnit" op="PROGRAM_TEACHER_PART,PROGRAM_COORDINATOR_PART">
<button class="btn btn-success" type="button" onclick="set(form,'saveProgram');form.submit()"><bean:message key="save"/></button>
<button id="saveButton" class="btn btn-success" type="button" onclick="saveData('saveProgram');"><bean:message key="save"/></button>
</baco:clearOperation>
<baco:clearOperation name="CourseUnitView" property="courseUnit" op="PROGRAM_CAN_VALIDATE">
<logic:equal name="CourseUnitView" property="validProgram" value="false">
<button class="btn btn-success" type="button" onclick="set(form,'validateProgram');form.submit()">Salvar e Validar</button>
<button id="validateButton" class="btn btn-success" type="button" onclick="saveData('validateProgram');">Salvar e Validar</button>
</logic:equal>
</baco:clearOperation>
 
 
 
<a id="exitButton" class="hidden btn btn-danger" href="<%=request.getContextPath()%>/user/startLoadCourseUnitFromHome.do?courseUnitView.id=${CourseUnitView.id}&pos=2" class="btn btn-danger" type="button" >Sair</a>
 
</html:form>
 
 
 
 
 
 
</div><!--Panel body-->
</div><!--Panel-->
</div><!--Panel-->
 
 
<script>
function saveData(action)
{
 
$("#ProgramForm input[name='dispatch']").val(action);
var data = $("#ProgramForm").serialize().replace(/%0D%0A/g, '%0A').replace(/\r?\n/g, "\r\n");
//alert(data);
 
//alert($("#dispatch").val())
$(".web-messages").html('<div class="alert alert-info">Enviando ...</div>');
$.ajax({
url: "<%=request.getContextPath()%>/user/courseUnitProgramController.do",
type: "POST",
data: data + "&json=true",
dataType: "json",
statusCode: {
401:function() {
$("#modalAuthentication").modal({ show : 'true'});
}
},
success: function(resposta) {
if(resposta.service && resposta.service == "ok")
{
$(".web-messages").html('<div class="alert alert-success">Programa Salvo com Sucesso, pode rever o seu trabalho ou Sair</div>');
modalWebMessages("");
$("#exitButton").removeClass("hidden");
$("#saveButton").hide();
if(action == "validateProgram")
{
$("#validateButton").hide();
}
}
else
{
if($(resposta.responseText).find(".web-messages").length)
{
$(".web-messages").html($(resposta.responseText).find(".web-messages").html());
modalWebMessages("Aviso");
}
else
{
if($(resposta.responseText).find(".errorContent").length)
{
$(".web-messages").html('<div class="alert alert-danger">Erro de comunicação, por favor aguarde uns minutos tente novamente, se não conseguir copie manualmente os seus dados para um documento para não perder o seu trabalho e contacte a administração de sistemas</div>');
modalWebMessages("Existem Erros",$(resposta.responseText).find(".errorContent").html());
}
else
{
$(".web-messages").html('<div class="alert alert-danger">Erro de comunicação, por favor aguarde uns minutos e tente novamente, se não conseguir copie manualmente os seus dados para um documento para não perder o seu trabalho e contacte a administração de sistemas</div>');
modalWebMessages("Aviso");
}
 
 
}
}
 
},
error: function(resposta, b, errorThrown)
{
if(resposta.status != 401)
{
if($(resposta.responseText).find(".errorContent").length)
{
$(".web-messages").html('<div class="alert alert-danger">Erro de comunicação, por favor aguarde uns minutos e tente novamente, se não conseguir copie manualmente os seus dados para um documento para não perder o seu trabalho e contacte a administração de sistemas</div>');
modalWebMessages("Existem Erros",$(resposta.responseText).find(".errorContent").html());
}
else
{
$(".web-messages").html('<div class="alert alert-danger">Erro de comunicação, por favor aguarde uns minutos e tente novamente, se não conseguir copie manualmente os seus dados para um documento para não perder o seu trabalho e contacte a administração de sistemas</div>');
modalWebMessages("Aviso");
}
}
}
});
}
 
</script>
/branches/v3/impl/src/web/user/home/panels/institutionTools.jsp
16,9 → 16,10
</div>
<div class="list-group">
<baco:hasRole role="admin,all,repositoryDocs">
<div class="list-group-item"><html:link action="/user/editRepositoryDoc"><bean:message key="repositorydoc"/></html:link></div>
<div class="list-group-item"><html:link action="/user/editRepositoryCol"><bean:message key="repositorycol"/></html:link></div>
<div class="list-group-item"><html:link action="/user/collectionsBrowser"><bean:message key="repositorycolbrowser"/></html:link></div>
<div class="list-group-item"><html:link action="/user/repositoryEditDocument"><bean:message key="repositorydoc"/></html:link></div>
<div class="list-group-item"><html:link action="/user/repositoryEditCollections"><bean:message key="repositorycol"/></html:link></div>
<div class="list-group-item"><html:link action="/user/repositoryBrowseCollections"><bean:message key="repositorycolbrowser"/></html:link></div>
<div class="list-group-item"><html:link action="/user/repositoryEditInterface"><bean:message key="repositoryinterface"/></html:link></div>
</baco:hasRole>
</div>
</div>
/branches/v3/impl/src/web/user/repositoryDocuments/topnavRepositoryInterface.jsp
New file
0,0 → 1,11
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="jomm.web.utils.NavPlaceServer"%>
<%@ page import="jomm.web.utils.TopNav" %>
<%
 
TopNav topNav = NavPlaceServer.getInstance().createTopNav(request);
topNav.addNavPlace("/user/homePae.do", "intranet.separator.home.back");
topNav.addNavPlace(null, "repositoryinterface");
%>
<jsp:include page="/layout/topnav.jsp"/>
/branches/v3/impl/src/web/user/repositoryDocuments/repositoryDocument.jsp
7,6 → 7,8
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="bacoTags" tagdir="/WEB-INF/tags" %>
<%@ taglib prefix="logic" uri="/WEB-INF/tlds/struts-logic.tld" %>
<%@ taglib prefix="html" uri="/WEB-INF/tlds/struts-html.tld" %>
<%@ taglib prefix="bean" uri="/WEB-INF/tlds/struts-bean.tld" %>
 
<div class="container-fluid">
 
198,13 → 200,13
<button class="btn btn-default btn-lg btn-block btn-huge" ng-click="backEdit()"><span class="glyphicon glyphicon-chevron-left"></span> Voltar à edição</button>
</div>
<div class="col-md-4">
<a class="btn btn-success btn-lg btn-block btn-huge" href="<%=request.getContextPath()%>/user/editRepositoryDoc.do">Adicionar outro documento <span class="glyphicon glyphicon-chevron-right"></span></a>
<html:link styleClass="btn btn-success btn-lg btn-block btn-huge" action="/user/repositoryEditDocument">Adicionar outro documento <span class="glyphicon glyphicon-chevron-right"></span></html:link>
</div>
</div>
<hr/>
<div class="row">
<div class="col-md-4">
<a class="btn btn-danger btn-lg btn-block btn-huge" href="<%=request.getContextPath()%>/user/homePae.do">Sair</a>
<html:link styleClass="btn btn-danger btn-lg btn-block btn-huge" action="/user/homePae">Sair</html:link>
</div>
</div>
 
513,5 → 515,4
<%
AbstractDao.getCurrentSession().getTransaction().commit();
%>
</div>
 
</div>
/branches/v3/impl/src/web/user/repositoryDocuments/collectionsInterface.jsp
3,7 → 3,7
<%@ page import="org.hibernate.criterion.Criterion" %>
<%@ page import="pt.estgp.estgweb.domain.RepositoryDocument" %>
<%@ page import="pt.estgp.estgweb.web.controllers.repositorydocs.interfaces.InterfaceBlock" %>
<%@ page import="pt.estgp.estgweb.web.controllers.repositorydocs.interfaces.InterfaceConfiguration" %>
<%@ page import="pt.estgp.estgweb.web.controllers.repositorydocs.interfaces.InterfaceRow" %>
<%@ page import="java.util.List" %>
<%@ page import="static org.hibernate.criterion.Restrictions.eq" %>
<%@ page import="static org.hibernate.criterion.Restrictions.or" %>
18,27 → 18,8
<%
String configuration = request.getParameter("configuration");
 
InterfaceConfiguration interfaceConfiguration = new InterfaceConfiguration();
interfaceConfiguration.setTitle("Regulamentação Interna");
interfaceConfiguration.setDescription("Descrição Geral");
InterfaceBlock interfaceBlock1 = new InterfaceBlock();
InterfaceBlock interfaceBlock2 = new InterfaceBlock();
interfaceConfiguration.getBlocks().add(interfaceBlock1);
interfaceConfiguration.getBlocks().add(interfaceBlock2);
interfaceBlock1.setTitle("bloco1");
interfaceBlock2.setTitle("bloco2");
interfaceBlock1.setDescription("bloco1desc");
interfaceBlock2.setDescription("bloco1desc");
interfaceBlock1.getCollectionId().add(new Long(1));
interfaceBlock1.getCollectionId().add(new Long(2));
interfaceBlock2.getCollectionId().add(new Long(3));
interfaceBlock2.getCollectionId().add(new Long(4));
 
InterfaceConfiguration loadedConfig = InterfaceConfiguration.loadFromJson(interfaceConfiguration.toJson());
 
int columns = 12 / interfaceConfiguration.getBlocks().size();
request.setAttribute("loadedConfig",loadedConfig);
request.setAttribute("columns","" + columns);
 
AbstractDao.getCurrentSession().beginTransaction();
 
/branches/v3/impl/src/web/user/repositoryDocuments/repositoryInterface.jsp
New file
0,0 → 1,328
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tlds/struts-nested.tld" prefix="nested" %>
<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/tlds/struts-tiles.tld" prefix="tiles" %>
<%@ taglib tagdir="/WEB-INF/tags" prefix="bacoTags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<style>
.bg-red{
background-color: red !important;
color: #600000 !important;
padding: 10px;
}
.bg-green{
background-color: green !important;
color: #00ff00 !important;
}
table tr td
{
background-color: red !important;
}
</style>
<div class="container-fluid">
 
<div id="treeAppPageContent" ng-app="treeAppPageContent" ng-controller="treeAppPageContentController">
 
 
<script>
ping();
var treeAppPageContent = angular.module('treeAppPageContent', ['ui.tree']);
GLOBAL_BacoAngularAppDependencies.push('treeAppPageContent');
 
<!-- estes codigos todos do remove e do toggle e etc's não mechi em nada limitei-me a copiar dos gajos-->
treeAppPageContent.controller('treeAppPageContentController', function ($scope) {
 
$scope.data = {
"showTitle" : true,
"showDescription" : false
};
 
 
 
/*
$scope.data = [
{
"id" : 1,
"name" : "Nao deixa fazer drag",
"nodrag" : true,
"isDirectory" : true
 
},
{
"id" : 2,
"name" : "Nao deixa fazer drop",
"nodrop" : true,
"isDirectory" : true
},
{
"id" : 3,
"name" : "Deixa fazer Tudo",
"isDirectory" : true
},
{
"id" : 4,
"name" : "Deixa fazer Tudo e ja foi movido",
"moved" : true,
"isDirectory" : true
},
{
"id" : 5,
"name" : "Exemplo de folha nao deixa abrir",
"isDirectory" : false
}
];*/
$scope.treeOptions = {
accept: function(sourceNodeScope, destNodesScope, destIndex) {
if(sourceNodeScope.$modelValue.type == destNodesScope.$modeValue.type)
return true;
return false;
},
dropped: function(e) {
//console.log (e.source.nodeScope.$modelValue);
//alert ("Largado o nó com nome: " + e.source.nodeScope.$modelValue.name + " sobre " + e.dest.nodesScope.$parent.$modelValue.name);
}
};
 
$scope.addRow = function(container)
{
if(!container.rows)
{
container.rows = [];
}
container.rows.push(
{
"showTitle" : true,
"showDescription" : false,
"type" : "row"
}
);
}
$scope.addColumn = function(row)
{
if(!row.columns)
{
row.columns = [];
}
row.columns.push(
{
"showTitle" : true,
"showDescription" : false,
"cols" : 6,
"type" : "column"
}
);
}
 
$scope.getColStyle = function(column)
{
return "col-md-" + column.cols;
}
}
);
 
</script>
 
 
<div class="panel panel-primary">
<div class="panel-heading clearfix">
Criação de Interface para o Repositório Digital
</div>
<div class="panel-body">
 
<div class="web-messages"></div>
 
 
<div class="form-horizontal">
<div class="form-group">
<label class="col-md-1 control-label">ID</label>
<div class="col-md-11">
<input disabled type="text" class="form-control" ng-model="data.id"/>
</div>
</div>
<div class="form-group">
<label class="col-md-1 control-label">Título</label>
<div class="col-md-9">
<input type="text" class="form-control" ng-model="data.title"/>
</div>
<div class="col-md-2">
<select ng-class="{'bg-red': data.showTitle == false, 'bg-green': data.showTitle == true}" class="form-control chosenOff" type="text" ng-model="data.showTitle" ng-options="o.v as o.n for o in [{ n: 'Mostrar', v: true }, { n: 'Não Mostrar', v: false }]">>
 
</select>
</div>
</div>
<div class="form-group">
<label class="col-md-1 control-label">Descrição</label>
<div class="col-md-9">
<textarea rows="3" class="form-control" ng-model="data.description">
 
</textarea>
</div>
<div class="col-md-2" >
<select ng-class="{'bg-red': data.showDescription == false, 'bg-green': data.showDescription == true}" class="form-control chosenOff" type="text" ng-model="data.showDescription" ng-options="o.v as o.n for o in [{ n: 'Mostrar', v: true }, { n: 'Não Mostrar', v: false }]">>
 
</select>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">Linhas <button ng-click="addRow(data)" class="btn btn-default pull-right"><span class="glyphicon glyphicon-plus"></span> Linha</button></div>
<div class="panel-body" ui-tree="treeOptions" id="page-content-root">
 
<div ui-tree-nodes ng-model="data.rows">
<div ng-repeat="row in data.rows" ui-tree-node ng-include="'rows_renderer.html'"></div>
</div>
</div>
</div>
</div>
 
 
 
<pre class="code">{{ data | json }}</pre>
 
</div>
 
 
</div>
 
</div>
 
</div>
 
 
 
<!--TEMPLATE RECURSIVO-->
<script type="text/ng-template" id="rows_renderer.html">
<!--Para nao deixar fazer drag-->
<div class="row tree-node tree-node-content clearfix" ng-class="{modified: node.modified, nodrop: node.nodrop, nodrag: node.nodrag, moved: node.moved}">
<div class="panel panel-primary">
<div class="panel-heading"> <i class="glyphicon glyphicon-resize-vertical" ui-tree-handle></i> Linha {{$index + 1}} </div>
<div class="panel-body">
 
<div class="form-group">
<label class="col-md-1 control-label">Título</label>
<div class="col-md-9">
<input type="text" class="form-control" ng-model="row.title"/>
</div>
<div class="col-md-2">
<select ng-class="{'bg-red': row.showTitle == false, 'bg-green': row.showTitle == true}" class="form-control chosenOff" type="text" ng-model="row.showTitle" ng-options="o.v as o.n for o in [{ n: 'Mostrar', v: true }, { n: 'Não Mostrar', v: false }]">>
 
</select>
</div>
</div>
<div class="form-group">
<label class="col-md-1 control-label">Descrição</label>
<div class="col-md-9">
<textarea rows="3" class="form-control" ng-model="row.description">
 
</textarea>
</div>
<div class="col-md-2">
<select ng-class="{'bg-red': row.showDescription == false, 'bg-green': row.showDescription == true}" class="form-control chosenOff" type="text" ng-model="row.showDescription" ng-options="o.v as o.n for o in [{ n: 'Mostrar', v: true }, { n: 'Não Mostrar', v: false }]">>
 
</select>
</div>
</div>
 
<div class="col-md-12" style="padding: 10px">
<div class="panel panel-info">
<div class="panel-heading clearfix">
Colunas
<button ng-click="addColumn(row)" class="btn btn-default pull-right"><span class="glyphicon glyphicon-plus"></span> Coluna</button>
</div>
<div class="panel-body">
 
 
<div class="row" ui-tree-nodes="" ng-model="row.columns">
<div ng-class="getColStyle(column)" ng-repeat="column in row.columns" ui-tree-node ng-include="'columns_renderer.html'">
 
</div>
</div>
 
</div>
</div>
</div>
 
</div>
</div>
</div>
 
 
 
</script>
 
 
<!--TEMPLATE RECURSIVO-->
<script type="text/ng-template" id="columns_renderer.html">
<!--Para nao deixar fazer drag-->
<div class="clearfix" ng-class="{modified: node.modified, nodrop: node.nodrop, nodrag: node.nodrag, moved: node.moved}">
<div class="panel panel-primary">
<div class="panel-heading clearfix">
<i class="glyphicon glyphicon-resize-vertical" ui-tree-handle></i>
Coluna {{$index + 1}}
<select class="pull-right chosenOff"
style="color:black"
ng-model="column.cols"
ng-options="o.v as o.n for o in [{ n: '1', v: 1 },{ n: '2', v: 2 },{ n: '3', v: 3 }, { n: '4', v: 4 }, { n: '5', v: 5 }, { n: '6', v: 6 }, { n: '7', v: 7 }, { n: '8', v: 8 }, { n: '9', v: 9 }, { n: '10', v: 10 }, { n: '11', v: 11 }, { n: '12', v: 12 }]">
 
 
</select>
</div>
<div class="panel-body">
 
<div class="form-group">
<label class="col-md-3 control-label">Título</label>
<div class="col-md-7">
<input type="text" class="form-control" ng-model="column.title"/>
</div>
<div class="col-md-2">
<select ng-class="{'bg-red': column.showTitle == false, 'bg-green': column.showTitle == true}" class="form-control chosenOff" ng-model="column.showTitle" ng-options="o.v as o.n for o in [{ n: 'Mostrar', v: true }, { n: 'Não Mostrar', v: false }]">
 
</select>
</div>
</div>
<div class="form-group">
<label class="col-md-3 control-label">Descrição</label>
<div class="col-md-7">
<textarea rows="3" class="form-control" ng-model="column.description">
 
</textarea>
</div>
<div class="col-md-2">
<select ng-class="{'bg-red': column.showDescription == false, 'bg-green': column.showDescription == true}" class="form-control chosenOff" ng-model="column.showDescription" ng-options="o.v as o.n for o in [{ n: 'Mostrar', v: true }, { n: 'Não Mostrar', v: false }]">
 
</select>
</div>
</div>
 
 
<div class="col-md-12" style="padding: 10px">
<div class="panel panel-info">
<div class="panel-heading">Blocos</div>
<div class="panel-body">
 
 
<div ui-tree-nodes="" ng-model="column.blocks">
<div ng-repeat="block in column.blocks" ui-tree-node ng-include="'blocks_renderer.html'">
</div>
</div>
 
</div>
</div>
</div>
 
</div>
</div>
</div>
 
 
 
<!--
<ol data-nodrag ui-tree-nodes="" data-nodrop-enabled="true" ng-model="node" ng-class="{hidden: collapsed }">
<li ng-repeat="node in node.childs" ui-tree-node ng-include="'childs_renderer.html'">
</li>
<li ng-repeat="node in node.documents" ui-tree-node ng-include="'documents_renderer.html'">
</li>
</ol>
-->
 
</script>
/branches/v3/impl/src/web/user/repositoryDocuments/collectionsbrowser.jsp
63,9 → 63,9
color: #7c9eb2;
}
.tree-node-document {
border: 1px solid #9fea91;
background: #e8ffdb;
color: #0cb229;
border: 1px solid #000000;
background: #ffffff;
color: #000000;
}
.tree-node-file {
border: 1px solid #e8ea99;
135,6 → 135,8
 
$scope.data = ${collectionsJson};
 
$scope.onlyVisibles = false;
 
/*
$scope.data = [
{
242,6 → 244,29
collapseElement.collapse("show");
}
}
 
 
$scope.hideNode = function(node)
{
if(!node.visible && $scope.onlyVisibles)
return true;
return false;
}
 
//COPIADAS DO ficheiro repositoryDocument.jsp
$scope.setDocumentFileInvisible = function(docFile)
{
docFile.visible=false;
docFile.repositoryFileProxy.repositoryFile.accessControl ="resource.access.privateDomain";
}
$scope.setDocumentFileVisible = function(docFile)
{
docFile.visible=true;
alert("As permissões do ficheiro serão definidas como privadas, por favor escolha as permissões novas.");
docFile.repositoryFileProxy.repositoryFile.accessControl ="resource.access.privateDomain";
}
 
 
}
);
 
250,9 → 275,12
<!--TEMPLATE RECURSIVO-->
<script type="text/ng-template" id="childs_renderer.html">
<!--Para nao deixar fazer drag-->
<div data-nodrag class="tree-node tree-node-content clearfix" ng-class="{modified: node.modified, nodrop: node.nodrop, nodrag: node.nodrag, moved: node.moved, bacoInvisible: !node.visible}">
<div data-nodrag class="tree-node tree-node-content clearfix" ng-class="{modified: node.modified, nodrop: node.nodrop, nodrag: node.nodrag, moved: node.moved, bacoInvisible: !node.visible, hidden: hideNode(node)}">
 
<div class="col-md-1">
 
 
 
 
<a class="btn btn-xs" ng-class="{
'btn-default': !node.open,
'btn-success': node.open,
268,44 → 296,63
}">
</span>
</a>
</div>
{{node.name}}
 
<span style="margin-right: 5px" class="glyphicon "
ng-class="{
'glyphicon-folder-close': !node.open,
'glyphicon-folder-open': node.open,
}"
></span>
 
<label data-toggle="tooltip" title="Esta colecção está oculta!" ng-show="node.visible == false">
<span class="glyphicon glyphicon-ban-circle"/>
</label>
 
{{node.name}}
 
 
</div>
 
 
<ol data-nodrag ui-tree-nodes="" data-nodrop-enabled="true" ng-model="node.childs" ng-class="{hidden: collapsed }">
<ol data-nodrag ui-tree-nodes="" data-nodrop-enabled="true" ng-model="node" ng-class="{hidden: collapsed }">
<li ng-repeat="node in node.childs" ui-tree-node ng-include="'childs_renderer.html'">
</li>
</ol>
<ol data-nodrag ui-tree-nodes="" data-nodrop-enabled="true" ng-model="node.documents" ng-class="{hidden: collapsed">
<li ng-repeat="node in node.documents" ui-tree-node ng-include="'documents_renderer.html'">
</li>
</ol>
 
 
</script>
 
<!--TEMPLATE RECURSIVO-->
<script type="text/ng-template" id="documents_renderer.html">
<!--Para nao deixar fazer drag-->
<div data-nodrag class="tree-node tree-node-document tree-node-content clearfix" ng-class="{modified: node.modified, nodrop: node.nodrop, nodrag: node.nodrag, moved: node.moved, bacoInvisible: !node.visible}">
<div data-nodrag class="tree-node tree-node-document tree-node-content clearfix" ng-class="{modified: node.modified, nodrop: node.nodrop, nodrag: node.nodrag, moved: node.moved, bacoInvisible: !node.visible, hidden: hideNode(node)}">
 
<a class="btn btn-xs" ng-class="{
'btn-default': !node.open,
'btn-success': node.open,
}"
data-nodrag data-toggle="collapse" ng-click="openDocumentsItem(node)">
<span
class="glyphicon"
ng-class="{
<a class="btn btn-xs" ng-class="{
'btn-default': !node.open,
'btn-success': node.open,
}"
data-nodrag data-toggle="collapse" ng-click="openDocumentsItem(node)">
<span
class="glyphicon"
ng-class="{
 
'glyphicon-chevron-right': !node.open,
'glyphicon-chevron-down': node.open
'glyphicon-chevron-right': !node.open,
'glyphicon-chevron-down': node.open
 
}">
</span>
</a>
}">
</span>
</a>
 
<label data-toggle="tooltip" title="Este documento está oculto!" ng-show="node.visible == false">
<span class="glyphicon glyphicon-ban-circle"/>
</label>
 
 
 
 
 
<span class="glyphicon glyphicon-file"></span> {{node.title}}
 
<baco:hasRole role="admin,all,repositoryDocs">
316,45 → 363,78
</div>
<div id="repositoryFiles{{node.id}}" class="collapse">
 
<ol data-nodrag ui-tree-nodes="" data-nodrop-enabled="true" ng-model="node" ng-class="{hidden: collapsed }">
<li >
<div data-nodrag class="tree-node tree-node-description tree-node-content clearfix">
<div ng-if="node.description">
<div class="col-md-2" style="text-align: right">
<span class="glyphicon glyphicon-tag"></span>
<span class="label label-primary">Descrição:</span>
</div>
<div class="col-md-10" style="border: 1px dashed black">
{{node.description}}
</div>
</div>
 
<div ng-if="node.internalIdentifier">
<div class="col-md-2" style="text-align: right">
<span class="glyphicon glyphicon-tag"></span>
<span class="label label-primary">ID INTERNO:</span>
</div>
<div class="col-md-10" style="border: 1px dashed black">
{{node.internalIdentifier}}
</div>
</div>
 
<ol data-nodrag ui-tree-nodes="" data-nodrop-enabled="true" ng-model="node.repositoryDocumentFiles" ng-class="{hidden: collapsed }">
<li ui-tree-node>
<div data-nodrag class="tree-node tree-node-description tree-node-content clearfix">
<div ng-if="node.publishDateStr">
<div class="col-md-2" style="text-align: right">
<span class="glyphicon glyphicon-tag"></span>
<span class="label label-primary">Data de Publicação:</span>
</div>
<div class="col-md-10" style="border: 1px dashed black">
{{node.publishDateStr}}
</div>
</div>
 
<div ng-if="node.description" class="panel panel-default">
<div class="panel-body">
<span class="label label-primary">Descrição:</span>{{node.description}}
</div>
</div>
<div ng-if="node.closeDateStr">
<div class="col-md-2" style="text-align: right">
<span class="glyphicon glyphicon-tag"></span>
<span class="label label-primary">Data de Fim:</span>
</div>
<div class="col-md-10" style="border: 1px dashed black">
{{node.closeDateStr}}
</div>
</div>
 
 
<div ng-if="node.internalIdentifier">
<span class="label label-primary">ID INTERNO:</span>
<label >
{{node.internalIdentifier}}
</label>
</div>
<div ng-if="node.publishDateStr">
<span class="label label-primary">Data de Publicação:</span>
<label >
{{node.publishDateStr}}
</label>
</div>
<div ng-if="node.authorsJson.persons">
<span class="label label-primary">Autores:</span>
<label ng-repeat="autor in node.authorsJson.persons">
{{autor.firstNames}} {{autor.lastName}}
</label>
</div>
<div ng-if="node.contributorsJson.persons">
<span class="label label-primary">Colaboradores:</span>
<label ng-repeat="autor in node.contributorsJson.persons">
{{autor.firstNames}} {{autor.lastName}} ;
</label>
</div>
</div>
</li>
<div ng-if="node.authorsJson" ng-repeat="autor in node.authorsJson.persons">
<div class="col-md-2" style="text-align: right">
<span class="glyphicon glyphicon-tag"></span>
<span class="label label-primary">Autor:</span>
</div>
<div class="col-md-10" style="border: 1px dashed black">
{{autor.firstNames}} {{autor.lastName}}
</div>
</div>
<div ng-if="node.contributorsJson" ng-repeat="autor in node.contributorsJson.persons">
<div class="col-md-2" style="text-align: right">
<span class="glyphicon glyphicon-tag"></span>
<span class="label label-primary">Colaborador:</span>
</div>
<div class="col-md-10" style="border: 1px dashed black">
{{autor.firstNames}} {{autor.lastName}}
</div>
</div>
<div ng-if="node.publisher">
<div class="col-md-2" style="text-align: right">
<span class="glyphicon glyphicon-tag"></span>
<span class="label label-primary">Entidade Publicadora:</span>
</div>
<div class="col-md-10" style="border: 1px dashed black">
{{node.publisher}}
</div>
</div>
</div>
</li>
<li ng-repeat="node in node.repositoryDocumentFiles" ui-tree-node ng-include="'files_renderer.html'">
</li>
</ol>
366,18 → 446,66
 
<script type="text/ng-template" id="files_renderer.html">
<!--Para nao deixar fazer drag-->
<div data-nodrag class="tree-node tree-node-file tree-node-content clearfix" ng-class="{modified: node.modified, nodrop: node.nodrop, nodrag: node.nodrag, moved: node.moved, bacoInvisible: !node.visible}">
<div data-nodrag class="tree-node tree-node-file tree-node-content clearfix" ng-class="{modified: node.modified, nodrop: node.nodrop, nodrag: node.nodrag, moved: node.moved, bacoInvisible: !node.visible, hidden: hideNode(node)}">
<label data-toggle="tooltip" title="Este ficheiro está oculto!" ng-show="node.visible == false">
<span class="glyphicon glyphicon-ban-circle"/>
</label>
<span class="glyphicon glyphicon-file"></span> <span ng-if="node.title"><i> {{node.title}} </i> - </span> {{node.repositoryFileProxy.repositoryFile.lastVersion.name}}
 
<div class="col-md-11">
<div ng-if="node.title">
<div class="col-md-2" style="text-align: right">
<span class="glyphicon glyphicon-tag"></span>
<span class="label label-primary">Titulo:</span>
</div>
<div class="col-md-10" style="border: 1px dashed black">
<i> {{node.title}} </i>
</div>
</div>
<div ng-if="node.description">
<div class="col-md-2" style="text-align: right">
<span class="glyphicon glyphicon-tag"></span>
<span class="label label-primary">Descrição:</span>
</div>
<div class="col-md-10" style="border: 1px dashed black">
<i>{{node.description}}</i>
</div>
</div>
<div class="col-md-12" style="margin-top: 4px">
<span class="glyphicon glyphicon-paperclip"></span>
<bacoTags:repositoryFile btnXs="true" transactional="false" staticTag="true" repositoryStream="{{node.repositoryFileProxy.repositoryStream}}" showHistory="true"/>
{{node.repositoryFileProxy.repositoryFile.lastVersion.name}}
({{node.repositoryFileProxy.repositoryFile.lastVersion.size / 1024 | number:0}} KB)
</div>
</div>
<div class="col-md-1">
<button data-toggle="tooltip" title="Ocultar ficheiro" ng-show="node.visible == true" class="btn btn-danger pull-right" type="button" ng-click="setDocumentFileInvisible(node)"><span class="glyphicon glyphicon-ban-circle"/></button>
<button data-toggle="tooltip" title="Repor ficheiro" ng-show="node.visible == false" class="btn btn-default pull-right" type="button" ng-click="setDocumentFileVisible(node)"><span class="glyphicon glyphicon-ok-circle"/></button>
 
<div ng-if="node.repositoryFileProxy.repositoryFile.accessControl == 'resource.access.publicDomain'">
Público
</div>
<div ng-if="node.repositoryFileProxy.repositoryFile.accessControl == 'resource.access.privateDomain'">
Privado
</div>
<div ng-if="node.repositoryFileProxy.repositoryFile.accessControl == 'resource.access.authenticatedDomain'">
Interno
</div>
 
 
</div>
</div>
</script>
 
 
 
<div class="panel panel-default">
<div class="panel-heading clearfix">
Administração de Coleções do Repositório de Documentos Digitais
 
<baco:hasRole role="admin,all,repositoryDocs">
<select class="chosenOff pull-right" type="text" ng-model="onlyVisibles" ng-options="o.v as o.n for o in [{ n: 'Ver Todos', v: false }, { n: 'Ocultar invisiveis', v: true }]">>
</select>
</baco:hasRole>
</div>
<div class="panel-body">
 
385,7 → 513,7
 
 
 
<!-- E finalmente este é o unico codigo dos gajos que metem no HTML puro-->
 
<div class="row">
 
<div class="col-sm-12 form-horizontal">
397,9 → 525,9
</div>
 
</div>
<div class="col-sm-12">
<%-- <div class="col-sm-12">
<pre class="code">{{ data | json }}</pre>
</div>
</div>--%>
</div>