Subversion Repositories bacoAlunos

Compare Revisions

Ignore whitespace Rev 1905 → Rev 1906

/branches/grupo6/impl/conf/berserk/sd.xml
36,7 → 36,6
</service>
 
 
 
<!--WS SERVICES ONLY FOR MOBILE APPS NEED API KEY AUTHNETICATION AND CERTIFICATE-->
<service>
<name>WSAPILoginChallenge</name>
388,7 → 387,8
</service>
<service>
<name>LoadTargetMaxAnnouncements</name>
<implementationClass>pt.estgp.estgweb.services.announcements.LoadTargetMaxAnnouncementsService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.announcements.LoadTargetMaxAnnouncementsService
</implementationClass>
<description>Load an Announcement views to show in list</description>
<isTransactional>true</isTransactional>
<filterChains>
398,7 → 398,8
</service>
<service>
<name>LoadRoleTypeMaxAnnouncements</name>
<implementationClass>pt.estgp.estgweb.services.announcements.LoadRoleTypeMaxAnnouncementsService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.announcements.LoadRoleTypeMaxAnnouncementsService
</implementationClass>
<description>Load an Announcement views to show in list</description>
<isTransactional>true</isTransactional>
<filterChains>
408,7 → 409,8
</service>
<service>
<name>LoadTypeMaxAnnouncements</name>
<implementationClass>pt.estgp.estgweb.services.announcements.LoadTypeMaxAnnouncementsService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.announcements.LoadTypeMaxAnnouncementsService
</implementationClass>
<description>Load an Announcement views to show in list</description>
<isTransactional>true</isTransactional>
<filterChains>
418,7 → 420,8
</service>
<service>
<name>LoadTypeAnnouncements</name>
<implementationClass>pt.estgp.estgweb.services.announcements.LoadTypeMaxAnnouncementsService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.announcements.LoadTypeMaxAnnouncementsService
</implementationClass>
<description>Load an Announcement views to show in list</description>
<isTransactional>true</isTransactional>
<defaultMethod>load</defaultMethod>
429,7 → 432,8
</service>
<service>
<name>LoadTopFlashNewsIterate</name>
<implementationClass>pt.estgp.estgweb.services.announcements.LoadTopFlashNewsIterateService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.announcements.LoadTopFlashNewsIterateService
</implementationClass>
<description>Load an Announcement one flash News</description>
<isTransactional>true</isTransactional>
<filterChains>
678,7 → 682,6
</service>
 
 
 
<!--CommonServices-->
<service>
<name>CommonServicesSearch</name>
832,7 → 835,7
<chain name="OwnersEdit"/>
</filterChains>
</service>
 
<service>
<name>LoadUserById</name>
<implementationClass>pt.estgp.estgweb.services.profile.LoadUserByIdService</implementationClass>
903,7 → 906,6
</service>
 
 
 
<!--Reminders Services-->
<service>
<name>CreateReminder</name>
996,18 → 998,18
</filterChains>
</service>
 
<!--<service>
<name>DeleteCourseUnit</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.UpdateCourseUnitService</implementationClass>
<description>Update course unit objectives and program file</description>
<isTransactional>true</isTransactional>
<defaultMethod>delete</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="Supers"/>
</filterChains>
</service>-->
<!--<service>
<name>DeleteCourseUnit</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.UpdateCourseUnitService</implementationClass>
<description>Update course unit objectives and program file</description>
<isTransactional>true</isTransactional>
<defaultMethod>delete</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="Supers"/>
</filterChains>
</service>-->
<service>
<name>LoadCourseUnit</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadCourseUnitService</implementationClass>
1170,10 → 1172,10
</service>
 
 
 
<service>
<name>LoadCourseUnitsBySigesCodes</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadCourseUnitsBySigesCodesService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadCourseUnitsBySigesCodesService
</implementationClass>
<description>Load course old units</description>
<isTransactional>true</isTransactional>
<filterChains>
1184,7 → 1186,8
 
<service>
<name>LoadCourseUnitInEvaluationBySigesCodes</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadCourseUnitsBySigesCodesService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadCourseUnitsBySigesCodesService
</implementationClass>
<description>Load course old units</description>
<isTransactional>true</isTransactional>
<defaultMethod>loadUnitInEvaluation</defaultMethod>
1196,7 → 1199,8
 
<service>
<name>LoadCourseUnitsBySigesCodesSemestreLastYear</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadCourseUnitsBySigesCodesService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadCourseUnitsBySigesCodesService
</implementationClass>
<description>Load a unique unit by sigescode, semestre and course code</description>
<isTransactional>true</isTransactional>
<defaultMethod>loadLastYear</defaultMethod>
1208,7 → 1212,8
 
<service>
<name>LoadCourseUnitsBySigesCodesSemestreLastYearProgram</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadCourseUnitsBySigesCodesService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadCourseUnitsBySigesCodesService
</implementationClass>
<description>Load a unique unit by sigescode, semestre and course code</description>
<isTransactional>true</isTransactional>
<defaultMethod>loadLastYearProgram</defaultMethod>
1392,7 → 1397,8
</service>
<service>
<name>LoadTeachedUnitsCurrentYear</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadTeachedUnitsCurrentYearService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadTeachedUnitsCurrentYearService
</implementationClass>
<description>Load teacher units in currentYear</description>
<isTransactional>true</isTransactional>
<filterChains>
1417,7 → 1423,8
</service>
<service>
<name>LoadSubscribedUnitsCurrentYear</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadSubscribedUnitsCurrentYearService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadSubscribedUnitsCurrentYearService
</implementationClass>
<description>Load student units in current Year</description>
<isTransactional>true</isTransactional>
<filterChains>
1425,7 → 1432,8
</service>
<service>
<name>LoadSubscribedUnitsGivenYear</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadSubscribedUnitsCurrentYearService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadSubscribedUnitsCurrentYearService
</implementationClass>
<description>Load student units in current Year</description>
<isTransactional>true</isTransactional>
<defaultMethod>givenYear</defaultMethod>
1434,7 → 1442,8
</service>
<service>
<name>LoadSubscribedUnitsOldYears</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadSubscribedUnitsOldYearsService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadSubscribedUnitsOldYearsService
</implementationClass>
<description>Load student units in current Year</description>
<isTransactional>true</isTransactional>
<filterChains>
1442,7 → 1451,8
</service>
<service>
<name>LoadSubscribedUnitsAnnouncements</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadSubscribedUnitsAnnouncementsService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadSubscribedUnitsAnnouncementsService
</implementationClass>
<description>Load student units</description>
<isTransactional>true</isTransactional>
<filterChains>
1451,7 → 1461,8
</service>
<service>
<name>LoadTeachedUnitsAnnouncements</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadTeachedUnitsAnnouncementsService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.LoadTeachedUnitsAnnouncementsService
</implementationClass>
<description>Load student units</description>
<isTransactional>true</isTransactional>
<filterChains>
1509,13 → 1520,12
</filterChains>
</service>
 
 
 
<!--CourseUnitAssignements Backups-->
<service>
<name>CreateCourseUnitDirPackage</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.CreateCourseUnitDirPackageServiceBat</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.CreateCourseUnitDirPackageServiceBat
</implementationClass>
<description>Create a zip file with Intranet folders</description>
<isTransactional>true</isTransactional>
<filterChains>
1526,7 → 1536,8
</service>
<service>
<name>CreateCourseUnitWorksBackup</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.CreateCourseUnitWorksBackupService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.CreateCourseUnitWorksBackupService
</implementationClass>
<description>Create a zip file with Intranet folders</description>
<isTransactional>true</isTransactional>
<defaultMethod>createSystemBackup</defaultMethod>
1538,7 → 1549,8
</service>
<service>
<name>CreateImportYearCourseUnitWorksBackup</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.CreateCourseUnitWorksBackupService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.CreateCourseUnitWorksBackupService
</implementationClass>
<description>Create a zip file with Intranet folders</description>
<isTransactional>true</isTransactional>
<defaultMethod>createSystemImportYearBackup</defaultMethod>
1550,7 → 1562,8
</service>
<service>
<name>CreateUserActualYearCourseUnitWorksBackup</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.CreateCourseUnitWorksBackupService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.CreateCourseUnitWorksBackupService
</implementationClass>
<description>Create a zip file with deliverables</description>
<isTransactional>true</isTransactional>
<defaultMethod>createActualYearBackup</defaultMethod>
1561,7 → 1574,8
</service>
<service>
<name>CreateUserImportYearCourseUnitWorksBackup</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.CreateCourseUnitWorksBackupService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.CreateCourseUnitWorksBackupService
</implementationClass>
<description>Create a zip file with deliverables</description>
<isTransactional>true</isTransactional>
<defaultMethod>createImportYearBackup</defaultMethod>
1572,7 → 1586,8
</service>
<service>
<name>CreateUserAllCourseUnitWorksBackup</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.CreateCourseUnitWorksBackupService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.CreateCourseUnitWorksBackupService
</implementationClass>
<description>Create a zip file with Intranet folders</description>
<isTransactional>true</isTransactional>
<defaultMethod>createBackup</defaultMethod>
1583,7 → 1598,8
</service>
<service>
<name>CreateUserAllCourseUnitProgramsBackup</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.CreateCourseUnitWorksBackupService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.courseunits.CreateCourseUnitWorksBackupService
</implementationClass>
<description>Create a zip file with Intranet folders with Programs only</description>
<isTransactional>true</isTransactional>
<defaultMethod>createProgramsBackup</defaultMethod>
1592,11 → 1608,8
<chain name="Session"/>
</filterChains>
</service>
 
 
 
 
<!--COURSES-->
<service>
<name>LoadCourseByCode</name>
1763,7 → 1776,6
</service>
 
 
 
<service>
<name>UpdateCourseSchool</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
1802,7 → 1814,6
</service>
 
 
 
<service>
<name>SubmitCourse</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
1855,7 → 1866,7
<chain name="Logger"/>
</filterChains>
</service>
<service>
<service>
<name>LoadCoursesImportYearByType</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description>Load All Courses</description>
1921,7 → 1932,6
</service>
 
 
 
<!--Administratives-->
<service>
<name>CreateCourseUnitAdmin</name>
2024,10 → 2034,6
</service>
 
 
 
 
 
 
<!--Managed Identifiers-->
<service>
<name>managedIdentiferLoadCollections</name>
2191,8 → 2197,6
<!---->
 
 
 
 
<!--SRU Services-->
<service>
<name>LoadSruSourceById</name>
2367,7 → 2371,7
</filterChains>
</service>
<service>
<name>GenerateSurveyStatsCsv</name>
<name>GenerateSurveyStatsCsv</name>
<implementationClass>pt.estgp.estgweb.services.surveys.GenerateSurveyStatsCsvService</implementationClass>
<description>Generate all survey stats on a csv file</description>
<isTransactional>true</isTransactional>
2402,8 → 2406,7
<!-- Duarte Santos -->
 
 
 
<!--Filipe Matos-->
<!--Filipe Matos-->
<!--Assessments-->
<service>
<name>CreateEditAssessment</name>
2605,10 → 2608,10
</service>
 
 
 
<service>
<name>LoadUnitOtherYearsWithProgram</name>
<implementationClass>pt.estgp.estgweb.services.sigesimports.SincronizeLastYearCourseUnitProgramsService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.sigesimports.SincronizeLastYearCourseUnitProgramsService
</implementationClass>
<description>Loads units with program from diferent year parameters (Long unitId)</description>
<isTransactional>true</isTransactional>
<defaultMethod>findOtherUnitsWithProgram</defaultMethod>
2621,8 → 2624,10
 
<service>
<name>CloneCourseUnitProgram</name>
<implementationClass>pt.estgp.estgweb.services.sigesimports.SincronizeLastYearCourseUnitProgramsService</implementationClass>
<description>Clone unit program from a unit into another unit parameters (long fromUnitId, long intoUnitId) </description>
<implementationClass>pt.estgp.estgweb.services.sigesimports.SincronizeLastYearCourseUnitProgramsService
</implementationClass>
<description>Clone unit program from a unit into another unit parameters (long fromUnitId, long intoUnitId)
</description>
<isTransactional>true</isTransactional>
<defaultMethod>cloneProgram</defaultMethod>
<filterChains>
2633,12 → 2638,11
</service>
 
 
 
<!--PROCESSOS-->
<service>
<name>CreateNewProcess</name>
<implementationClass>pt.estgp.estgweb.services.processes.ProcessesService</implementationClass>
<description>Create a new instance of Process and transitates it </description>
<description>Create a new instance of Process and transitates it</description>
<isTransactional>true</isTransactional>
<defaultMethod>submitNew</defaultMethod>
<filterChains>
2828,7 → 2832,6
</service>
 
 
 
<service>
<name>TryDeleteCourseUnitService</name>
<implementationClass>pt.estgp.estgweb.services.courseunits.DeleteCourseUnitService</implementationClass>
2947,7 → 2950,6
</service>
 
 
 
<service>
<name>CreateRoleCourseComission</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
3084,7 → 3086,8
 
<service>
<name>setAnoSemestre</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.pedagogico.UpdateCoursesAndUnitsJobService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.questionarios.pedagogico.UpdateCoursesAndUnitsJobService
</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>setAnoSemestre</defaultMethod>
3221,10 → 3224,10
</service>
 
 
 
<service>
<name>RunJobSelectCourses</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.pedagogico.UpdateCoursesAndUnitsJobService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.questionarios.pedagogico.UpdateCoursesAndUnitsJobService
</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>runJobSelectCourses</defaultMethod>
3239,7 → 3242,8
 
<service>
<name>RunJobAssignAnswers</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.pedagogico.AssignAnswersJobService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.questionarios.pedagogico.AssignAnswersJobService
</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>runJobAssignAnswers</defaultMethod>
3253,7 → 3257,8
 
<service>
<name>QuestionarioRevertAllAssignmentsPedagogico</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.pedagogico.UpdateCoursesAndUnitsJobService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.questionarios.pedagogico.UpdateCoursesAndUnitsJobService
</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>revertAllAssignments</defaultMethod>
3268,7 → 3273,8
 
<service>
<name>QuestionarioUpdateTipologiasPedagogico</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.pedagogico.UpdateCoursesAndUnitsJobService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.questionarios.pedagogico.UpdateCoursesAndUnitsJobService
</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>updateTipologiasPedagogico</defaultMethod>
3284,7 → 3290,8
 
<service>
<name>QuestionarioUpdateCheckVarPedagogico</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.pedagogico.UpdateCoursesAndUnitsJobService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.questionarios.pedagogico.UpdateCoursesAndUnitsJobService
</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>updateCheckVarPedagogico</defaultMethod>
3299,7 → 3306,8
 
<service>
<name>QuestionarioUpdateCheckVarExcludedPedagogico</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.pedagogico.UpdateCoursesAndUnitsJobService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.questionarios.pedagogico.UpdateCoursesAndUnitsJobService
</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>updateCheckVarExcludedPedagogico</defaultMethod>
3393,11 → 3401,9
</service>
 
 
 
<!-- REPORTS DE QUESTIONARIOS-->
 
 
 
<service>
<name>SaveReportGroup</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.QuestionariosReportsService</implementationClass>
3465,14 → 3471,13
</service>
 
 
 
 
<!--REPOSITORY DOCUMENTS-->
 
 
<service>
<name>SaveRepositoryDocument</name>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService
</implementationClass>
<description>Salva um repository document no repositorio digital de documentos</description>
<isTransactional>true</isTransactional>
<defaultMethod>saveRepositoryDocument</defaultMethod>
3484,7 → 3489,8
</service>
<service>
<name>OpenRepositoryCollection</name>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService
</implementationClass>
<description>Serviço publico de abertura de Sub Colecções</description>
<isTransactional>true</isTransactional>
<defaultMethod>openRepositoryCollection</defaultMethod>
3495,7 → 3501,8
</service>
<service>
<name>OpenRepositoryCollectionDocuments</name>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService
</implementationClass>
<description>Serviço publico de abertura de documentos de uma Colecção</description>
<isTransactional>true</isTransactional>
<defaultMethod>openRepositoryCollectionDocuments</defaultMethod>
3506,7 → 3513,8
</service>
<service>
<name>AddRepositoryCollection</name>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService
</implementationClass>
<description>Salva um repository document no repositorio digital de documentos</description>
<isTransactional>true</isTransactional>
<defaultMethod>addRepositoryCollection</defaultMethod>
3518,7 → 3526,8
</service>
<service>
<name>ChangeParentRepositoryDocumentCollection</name>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService
</implementationClass>
<description>Move uma colecção na arvore para um novo Pai</description>
<isTransactional>true</isTransactional>
<defaultMethod>changeParentRepositoryDocumentCollection</defaultMethod>
3530,7 → 3539,8
</service>
<service>
<name>DeleteRepositoryDocumentCollection</name>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService
</implementationClass>
<description>Apaga uma colecção do repositório digital, caso esta esteja vazia</description>
<isTransactional>true</isTransactional>
<defaultMethod>deleteCollection</defaultMethod>
3542,7 → 3552,8
</service>
<service>
<name>ChangeDocumentCollection</name>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService
</implementationClass>
<description>Move uma colecção na arvore para um novo Pai</description>
<isTransactional>true</isTransactional>
<defaultMethod>changeDocumentCollection</defaultMethod>
3554,7 → 3565,8
</service>
<service>
<name>UpdateRepositoryCollection</name>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService
</implementationClass>
<description>Salva um repository colection no repositorio digital de documentos</description>
<isTransactional>true</isTransactional>
<defaultMethod>updateRepositoryCollection</defaultMethod>
3568,7 → 3580,8
 
<service>
<name>RepositoryDocumentsAddManagerToCollection</name>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService
</implementationClass>
<description>Adiciona um utilizador como Gestor da Colecção do Repositorio digital</description>
<isTransactional>true</isTransactional>
<defaultMethod>addManagerToCollection</defaultMethod>
3580,7 → 3593,8
</service>
<service>
<name>RepositoryDocumentsRemoveManagerInCollection</name>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService
</implementationClass>
<description>Remove um utilizador de Gestor da Colecção do Repositorio digital</description>
<isTransactional>true</isTransactional>
<defaultMethod>removeManagerInCollection</defaultMethod>
3592,10 → 3606,10
</service>
 
 
 
<service>
<name>AddRepositoryInterface</name>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService
</implementationClass>
<description>Salva um repository interface no repositorio digital de documentos</description>
<isTransactional>true</isTransactional>
<defaultMethod>addRepositoryInterface</defaultMethod>
3607,7 → 3621,8
</service>
<service>
<name>RemoveRepositoryInterface</name>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService
</implementationClass>
<description>Salva um repository interface no repositorio digital de documentos</description>
<isTransactional>true</isTransactional>
<defaultMethod>removeRepositoryInterface</defaultMethod>
3619,7 → 3634,8
</service>
<service>
<name>CheckRepositoryDocumentExistence</name>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService
</implementationClass>
<description>Salva um repository interface no repositorio digital de documentos</description>
<isTransactional>true</isTransactional>
<defaultMethod>checkRepositoryDocumentExistence</defaultMethod>
3630,7 → 3646,8
</service>
<service>
<name>UpdateRepositoryInterface</name>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService
</implementationClass>
<description>Salva um repository interface no repositorio digital de documentos</description>
<isTransactional>true</isTransactional>
<defaultMethod>updateRepositoryInterface</defaultMethod>
3643,7 → 3660,8
 
<service>
<name>SaveRepositoryInterfaceData</name>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.data.repositorydocuments.RepositoryDocumentService
</implementationClass>
<description>Salva um repository interface no repositorio digital de documentos</description>
<isTransactional>true</isTransactional>
<defaultMethod>saveRepositoryInterfaceData</defaultMethod>
3655,12 → 3673,12
</service>
 
 
 
<!-- Separators-->
 
<service>
<name>NewConfigurationSeparator</name>
<implementationClass>pt.estgp.estgweb.services.configuration.ConfigurationSeparatorsService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.configuration.ConfigurationSeparatorsService
</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>newConfigurationSeparator</defaultMethod>
3672,7 → 3690,8
</service>
<service>
<name>UpdateConfigurationSeparator</name>
<implementationClass>pt.estgp.estgweb.services.configuration.ConfigurationSeparatorsService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.configuration.ConfigurationSeparatorsService
</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>updateConfigurationSeparator</defaultMethod>
3684,7 → 3703,8
</service>
<service>
<name>RemoveConfigurationSeparator</name>
<implementationClass>pt.estgp.estgweb.services.configuration.ConfigurationSeparatorsService</implementationClass>
<implementationClass>pt.estgp.estgweb.services.configuration.ConfigurationSeparatorsService
</implementationClass>
<description></description>
<isTransactional>true</isTransactional>
<defaultMethod>removeConfigurationSeparator</defaultMethod>
3696,7 → 3716,6
</service>
 
 
 
<!-- FUSCO VIRTUAL FILE SYSTEM -->
 
<service>
3898,14 → 3917,11
</service>
 
 
 
 
<!--/****************************************************************************/
/* COURSE REPORTS
/****************************************************************************/-->
 
 
 
<service>
<name>CreateDtpStatsTable4Course</name>
<implementationClass>pt.estgp.estgweb.services.courses.CourseReportServices</implementationClass>
3961,7 → 3977,8
<description>
@code codigo do curso
@year codigo do ano
Carrega todas as unidades em classes CourseUnitSection onde consta informação do professor, codigo, ano, semestre
Carrega todas as unidades em classes CourseUnitSection onde consta informação do professor, codigo, ano,
semestre
e consta ainda o CourseUnitEvaluation
devolve um json object com um elemento evaluation contendo um JSONArray como string
O conteudo do array são
3996,7 → 4013,8
<description>
@code codigo do curso
@year codigo do ano
Carrega todas as estatisticas unidades em classes CourseUnitDtpStat onde consta informação do codigo, nome, semestre e um booleano por cada propriedade da unidade
Carrega todas as estatisticas unidades em classes CourseUnitDtpStat onde consta informação do codigo, nome,
semestre e um booleano por cada propriedade da unidade
devolve um json object com um elemento evaluation contendo um JSONArray como string
O conteudo do array são
classes CourseUnitDtpStat está pronta a serializar em JSON implementa a JSONView
4026,7 → 4044,6
</service>
 
 
 
<!-- SERVICOS DE GERACAO DE RELATORIO DE CURSO -->
 
 
4048,7 → 4065,26
</filterChains>
</service>
 
<!-- SEGUNDO GRÁFICO -->
<service>
<name>CourseReportGenerateGlobalLearningResultsChartYearImg</name>
<implementationClass>pt.estgp.estgweb.services.courses.CourseReportServices</implementationClass>
<description>
@reportCourseDocument documento course report em json
Serviço de suporte para gerar um grafico de aproveitamento por notas e ano curricular
Coloca o grafico no report documento
e salva o documento no curso
Devolve uma classe RepositoryFile4JsonView serializada em JSON
</description>
<isTransactional>true</isTransactional>
<defaultMethod>generateGlobalLearningResultsChartYearImg</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
</filterChains>
</service>
 
 
<service>
<name>CourseReportSave</name>
<implementationClass>pt.estgp.estgweb.services.courses.CourseReportServices</implementationClass>
/branches/grupo6/impl/src/java/pt/estgp/estgweb/services/courses/CourseReportServices.java
412,6 → 412,39
return view.toJson();
}
 
 
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();
}
 
public String save(String reportDocumentJson, UserSession session) throws IOException {
 
CourseReportDocument reportDocument = CourseReportDocument.fromJson(reportDocumentJson);
/branches/grupo6/impl/src/java/pt/estgp/estgweb/services/courses/coursereport/documentmodel/learningresults/components/GlobalLearningResultsChartYearImg.java
1,10 → 1,138
package pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components;
 
import com.orsoncharts.legend.StandardLegendBuilder;
import jomm.utils.BytesUtils;
import jomm.utils.MimeTypeGuesser;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.*;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.GroupedStackedBarRenderer;
import org.jfree.data.KeyToGroupMap;
import org.jfree.data.category.CategoryRangeInfo;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.ui.GradientPaintTransformType;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.StandardGradientPaintTransformer;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.CourseReportDocument;
import pt.estgp.estgweb.utils.Globals;
import pt.estgp.estgweb.utils.documentBuilder.AutoImageWraperComponent;
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.util.List;
 
/**
* 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 IOException
*/
public FileUploaded generateChart2tmp(UnitsLearningResultsTable results, CourseReportDocument courseReportDocument) throws IOException
{
List<UnitsLearningResultYear> unitsLearningResultYearList = results.getYears();
 
 
String tempName = BytesUtils.generateHexKey() + ".png";
 
DefaultCategoryDataset data = new DefaultCategoryDataset();
 
for(UnitsLearningResultYear temp: unitsLearningResultYearList) {
data.addValue(new Double((int)(temp.getAprovados1013Percent()*100)/100),"Aprovados 10-13",""+temp.ano + "º Ano");
data.addValue(new Double((int)(temp.getAprovados1416Percent()*100)/100),"Aprovados 14-16",""+temp.ano + "º Ano");
data.addValue(new Double((int)(temp.getAprovados1720Percent()*100)/100),"Aprovados 17-20",""+temp.ano + "º Ano");
}
 
JFreeChart chart = ChartFactory.createStackedBarChart(null,null,null,data, PlotOrientation.VERTICAL,true,false,false);
 
CategoryPlot plot = chart.getCategoryPlot();
RectangleInsets chartRectangle = new RectangleInsets(0,0,30F,0);
chart.setPadding(chartRectangle);
plot.setBackgroundPaint(Color.WHITE);
CategoryAxis axis = plot.getDomainAxis();
ValueAxis axis2 = plot.getRangeAxis();
axis.setTickLabelFont(new Font("Helvetica", Font.PLAIN, 30));
axis2.setTickLabelFont(new Font("Helvetica", Font.PLAIN, 30));
BarRenderer renderer = (BarRenderer) plot.getRenderer();
renderer.setSeriesPaint(0, Color.ORANGE);
renderer.setSeriesPaint(1, Color.YELLOW);
renderer.setSeriesPaint(2, Color.GREEN);
renderer.setMaximumBarWidth(.35);
 
chart.getLegend().setItemFont(new Font("Helvetica", Font.PLAIN,30));
 
 
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 {
float aprovados = 10;
float reprovados = 2;
float semElementos = 4;
double aprovadosPercent = ((int)10/16*100.0)/100.0;
double reprovadosPercent = ((int)2/16*100.0)/100.0;
double semElementosPercent = ((int)4/16*100.0)/100.0;
 
String tempName = BytesUtils.generateHexKey() + ".png";
 
DefaultPieDataset data = new DefaultPieDataset();
if(reprovados > 0)
data.setValue("Reprovados " + reprovadosPercent + "%", new Double(reprovados));
if(aprovados > 0)
data.setValue("Aprovados " + aprovadosPercent + "%", new Double(aprovados));
if(semElementos > 0)
data.setValue("Sem Elementos " + semElementosPercent + "%", new Double(semElementos));
JFreeChart chart = ChartFactory.createRingChart(null, data, false, true, false);
chart.setBackgroundPaint(new Color(255,255,255));
PiePlot plot = (RingPlot) chart.getPlot();
plot.setLabelBackgroundPaint(new Color(255, 249, 235));
plot.setLabelPaint(new Color(88, 88, 90));
//plot.setDrawingSupplier(new ChartBuilderUtil.ChartDrawingSupplier());
 
plot.setSectionPaint(0, new Color(47, 35, 255));
plot.setSectionPaint(1, new Color(15, 218, 10));
plot.setSectionPaint(2, new Color(200, 200, 200));
plot.setBackgroundPaint(new Color(255, 255, 255));
plot.setOutlineVisible(false);
 
 
 
plot.setLabelFont(new Font(
"Helvetica", Font.PLAIN, 30));
 
 
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));
 
 
}
}
/branches/grupo6/impl/src/java/pt/estgp/estgweb/web/controllers/courses/CoursesServicesController.java
New file
0,0 → 1,72
package pt.estgp.estgweb.web.controllers.courses;
 
import org.apache.struts.action.ActionForm;
import org.json.JSONObject;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.CourseReportDocument;
import pt.estgp.estgweb.web.controllers.utils.AbstractWidgetAjaxController;
import pt.estgp.estgweb.web.utils.RequestUtils;
import pt.utl.ist.berserk.logic.serviceManager.IServiceManager;
import pt.utl.ist.berserk.logic.serviceManager.ServiceManager;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
* Created by jorgemachado on 06/01/17.
*/
public class CoursesServicesController extends AbstractWidgetAjaxController {
 
 
/**
* See also CoursesServicesWidgetController for WS-API services
*/
 
/**
* @param form
* @param request
* @param response
* @return
* @throws Throwable
*/
 
public JSONObject generateGlobalLearningResultsChartImg(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),
"CourseReportGenerateGlobalLearningResultsChartImg",
new Object[]{courseReportDocument});
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 save(ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Throwable {
 
String courseReportDocument = request.getParameter("courseReportDocument");
 
CourseReportDocument c = CourseReportDocument.fromJson(courseReportDocument);
 
IServiceManager sm = ServiceManager.getInstance();
String json = (String) sm.execute(RequestUtils.getRequester(request, response),
"CourseReportSave",
new Object[]{courseReportDocument});
 
addMessageAsString(request, "Gravado com Sucesso");
return new JSONObject(json);
}
 
 
}
/branches/grupo6/impl/src/web/examples/angular/directives/angular-directive.jsp
New file
0,0 → 1,95
<%@ 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" %>
<html>
<head></head>
<body ng-app="BacoAngularApp">
<jsp:include page="/layout/themes/scripts-default.jsp"/>
<jsp:include page="/layout/headerTools.jsp"/>
 
 
<div id="demoApp" ng-app="demoApp" ng-controller="demoAppController">
 
 
<h1>Uso de Directivas com Templates</h1>
<p>Este exemplo mostra como deve ser usada uma template para podermos incluir uma função
de controlo especifica da template usando directivas</p>
<p>Mostra ainda que dentro da template o scope é uma fusão dos scopes da ngApp e da propria directiva</p>
<p>Mostra também como podemos escolher dinamicamente a template ou as funcionalidades dependendo de atributos que passamos à template</p>
<script>
 
var demoApp = angular.module('demoApp', []);
GLOBAL_BacoAngularAppDependencies.push('demoApp');
 
 
//demoApp..directive('tpl', function() {
//ou
angular.module('demoApp').directive('tpl', function() {
 
return {
restrict: 'E', //A ou E define se é o nome do elemento ou um atributo
link: function(scope, element, attrs) {
// concatenating the directory to the ver attr to select the correct excerpt for the day
 
 
 
scope.teste = "teste";
scope.move = function(){
 
scope.teste = "teste2";
scope.testeSuper = "testeSuper2";
}
},
// passing in contentUrl variable
templateUrl: function(elem,attrs) {
return attrs.templatename;
}
}
});
 
 
demoApp.controller('demoAppController', function ($scope) {
 
 
$scope.testeSuper = "testeSuper";
 
}
);
 
</script>
 
<p>campo testeSuper no mainmodule {{testeSuper}}</p>
 
<p>Se incluirmos o tpl2.html apenas vamos ter acesso às variaveis do scope da aplicação, neste caso o teste, a template pode estar declarada fora da app, não há problema</p>
<p>Por acaso neste exemplo temos acesso ao testeSuper porque a directiva adiciona funcionalidade ao scope da aplicação onde é chamada, mas se não chamarmos nenhuma directiva
a var testeSuper não aparece</p>
<div ng-include="'tpl2.html'"></div>
 
 
<h2>Invocando a tpl de html com directiva</h2>
<tpl templatename="tpl.html"></tpl>
 
<h2>Invocando a tpl de de javascript com directiva</h2>
<tpl templatename="tpl2.html"></tpl>
 
 
 
 
 
 
</div>
 
 
 
<!--TEMPLATE RECURSIVO-->
<script type="text/ng-template" id="tpl2.html">
<div>
<h1>Usando um template de Script</h1>
<p>TESTE</p>
<p>{{teste}}</p>
<p>{{testeSuper}}</p>
<button ng-click="move()">Muda Textos</button>
</div>
</script>
</body>
</html>
/branches/grupo6/impl/src/web/examples/angular/directives/tpl.html
New file
0,0 → 1,5
<h1>Template de HTML</h1>
<p>TESTE</p>
<p>{{teste}}</p>
<p>{{testeSuper}}</p>
<button ng-click="move()">Muda Textos</button>
/branches/grupo6/impl/src/web/examples/angular/directives/angular-directive-module.jsp
New file
0,0 → 1,36
<%--
Created by IntelliJ IDEA.
User: jorgemachado
Date: 11/11/17
Time: 10:20
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body ng-app="BacoAngularApp">
<jsp:include page="/layout/themes/scripts-default.jsp"/>
<jsp:include page="/layout/headerTools.jsp"/>
 
<div class="container">
<h1>Uso de Templates Generalizados e cada um com sua template</h1>
<p>O caso em questão é a existencia de um esqueleto principal para um modulo (mainmodule)</p>
<p>O main module inclui templates para cada componente usando o ng-include</p>
<p>Esse ng-include é referente ao campo @class de cada componente</p>
<p>vamos incluir esse esqueleto e todas as templates especificas dos nossos modulos</p>
<p>incluimos ainda as directivas que estiverem nos nossos modulos</p>
<p>o template do ng-include irá colocar a directiva desejada caso seja necessário</p>
<p>com a directiva podemos ter funcionalidade de scope associada ao subcomponente, que é desconhecido do main module</p>
<p>caso necessite o includemodule também tem acesso ao scope da app principal</p>
<p>o unico requesito é passar ao include module o nome da app onde ele vai inserir as directivas</p>
 
 
 
<jsp:include page="angular-directive-mainmodule.jsp"/>
<jsp:include page="angular-directive-includemodule.jsp"/>
 
</div>
</body>
</html>
/branches/grupo6/impl/src/web/examples/angular/directives/angular-directive-includemodule.jsp
New file
0,0 → 1,60
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
 
<p>Modulo Incluido contem as directivas e os templates necessários</p>
<p>Este módulo conhece o nome do módulo da App onde vai ser incluido</p>
 
<script>
angular.module("demoApp").directive('tpl', function() {
var contentUrl;
return {
restrict: 'E', //A ou E define se é o nome do elemento ou um atributo
link: function(scope, element, attrs) {
// concatenating the directory to the ver attr to select the correct excerpt for the day
//contentUrl = attrs.templatename + '.html';
 
//console.log(contentUrl);
 
scope.teste = "teste";
scope.move = function(){
 
scope.teste = "teste2modules";
//scope.testeSuper = "testeSuper2modules";
angular.element("#demoApp").scope().testeSuper = "testeSuper2modules";
}
scope.mudaCompName = function(comp){
 
comp.name = "NOVO NOME DO COMP MUDADO NA DIRECTIVA";
}
},
// passing in contentUrl variable
templateUrl: function(elem,attrs) {
return "templateDirectiva";
}
}
});
</script>
 
<script type="text/ng-template" id="directive_class">
<div style="border: 1px solid #000000">
<h1>DIRECTIVE CLASS TEMPLATE</h1>
<p>COMP ELEMENTO DIRECTIVA:{{comp.name}}</p>
<p><input type="text" ng-model="comp.name"></p>
<tpl></tpl>
<p>Teste no scope da directiva<p>
<pre>
{{teste | json}}
</pre>
</div>
</script>
 
<script type="text/ng-template" id="templateDirectiva">
<div style="border: 1px solid green">
<h1>templateDirectiva</h1>
<p>TESTE</p>
<p>{{teste}}</p>
<p>{{testeSuper}}</p>
<p>COMP ELEMENTO DIRECTIVA:{{comp.name}}</p>
<button ng-click="move()">Muda Textos</button>
<button ng-click="mudaCompName(comp)">Muda COMP NAME</button>
</div>
</script>
/branches/grupo6/impl/src/web/examples/angular/directives/angular-directive-mainmodule.jsp
New file
0,0 → 1,50
 
 
<div id="demoApp" ng-app="demoApp" ng-controller="demoAppController">
 
 
 
<script>
 
var demoApp = angular.module('demoApp', []);
GLOBAL_BacoAngularAppDependencies.push('demoApp');
 
 
demoApp.controller('demoAppController', function ($scope) {
 
$scope.testeSuper = "testeSuper";
 
$scope.data =
{
comps : [
{
"@class" : "directive_class",
"name" : "componente de teste"
}
]
}
 
}
);
 
</script>
 
 
<h1>Campo testeSuper no mainmodule "{{testeSuper}}"</h1>
<h1>Campo data.comps[0].name no mainmodule "{{data.comps[0].name}}"</h1>
 
<h2>Template chamado atraves de um template de classe intermedio</h2>
<div ng-repeat="comp in data.comps" ng-include="comp['@class']">
 
</div>
 
 
<pre>
{{testeSuper | json}}
</pre>
<pre>
{{data | json}}
</pre>
 
 
</div>
/branches/grupo6/impl/src/web/user/courses/coursereport/templates.jsp
11,11 → 11,14
@optional @chapter capitulo do documento para esta seccao para contcatenar às subsections
-->
 
<script type="text/ng-template" id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_CourseUnitsReportsSection">
<script type="text/ng-template"
id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_CourseUnitsReportsSection">
<div class="sections">
<a name="indexCus"></a>
<span ng-repeat="cu in section.sections" ng-init="cu.taxaAprovacao = 100 * cu.courseUnitEvaluation.numAlunosAprovTotal/(cu.courseUnitEvaluation.numAlunosInscritos - cu.courseUnitEvaluation.numAlunosSemElementosAvaliacao)">
<a href="#cu{{$index}}" ng-class="{ 'alert-danger': (cu.courseUnitEvaluation.cumprimentoProgramaPercent &lt; 100) || cu.taxaAprovacao &lt; 75 || !cu.courseUnitEvaluation.closed || !cu.courseUnitEvaluation.teacherComplete}">
<span ng-repeat="cu in section.sections"
ng-init="cu.taxaAprovacao = 100 * cu.courseUnitEvaluation.numAlunosAprovTotal/(cu.courseUnitEvaluation.numAlunosInscritos - cu.courseUnitEvaluation.numAlunosSemElementosAvaliacao)">
<a href="#cu{{$index}}"
ng-class="{ 'alert-danger': (cu.courseUnitEvaluation.cumprimentoProgramaPercent &lt; 100) || cu.taxaAprovacao &lt; 75 || !cu.courseUnitEvaluation.closed || !cu.courseUnitEvaluation.teacherComplete}">
{{cu.title}}
</a> |
</span>
23,7 → 26,8
class="section panel-primary">
 
<a name="cu{{$index}}"></a>
<span ng-if="$index != 0" class="glyphicon glyphicon-backward" ></span><a ng-if="$index != 0" href="#indexCus"> Voltar atrás</a>
<span ng-if="$index != 0" class="glyphicon glyphicon-backward"></span><a ng-if="$index != 0"
href="#indexCus"> Voltar atrás</a>
<div class="panel-heading"><h2>{{cu.title}}</h2></div>
 
<div style="padding-left:20px">
32,10 → 36,12
<div ng-if="cu.courseUnitEvaluation.closed">
Entregue e Aceite
</div>
<div class="alert-danger" ng-if="cu.courseUnitEvaluation.closed && !cu.courseUnitEvaluation.teacherComplete">
<div class="alert-danger"
ng-if="cu.courseUnitEvaluation.closed && !cu.courseUnitEvaluation.teacherComplete">
Entregue mas não foi aprovado pela comissão
</div>
<div class="alert-danger" ng-if="!cu.courseUnitEvaluation.closed && !cu.courseUnitEvaluation.teacherComplete">
<div class="alert-danger"
ng-if="!cu.courseUnitEvaluation.closed && !cu.courseUnitEvaluation.teacherComplete">
Não foi entregue pelo docente para validação
</div>
 
45,7 → 51,7
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Resultados</label></h3></div>
<div>
<table class="tablesorter-blue" width="100%">
<table class="tablesorter-blue" width="100%">
<tr>
<th rowspan="2">
Nº Alunos Inscritos
124,15 → 130,15
</div>
</div>
 
<div style="padding-left:20px" >
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Taxa de Aprovação</label></h3></div>
<div ng-class="{ 'alert-danger': cu.taxaAprovacao &lt; 75 }">{{cu.taxaAprovacao}}%</div>
</div>
 
 
 
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Apreciação dos resultados quantitativos obtidos pelos estudantes</label></h3></div>
<div><h3><label class="label label-primary">Apreciação dos resultados quantitativos obtidos pelos
estudantes</label></h3></div>
<div>{{cu.courseUnitEvaluation.qualApreciacaoQuantitivos}}</div>
</div>
<div style="padding-left:20px">
140,13 → 146,15
<div>{{cu.courseUnitEvaluation.qualApreciacaoUC}}</div>
</div>
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Percentagem de cumprimento do programa da UC</label></h3></div>
<div><h3><label class="label label-primary">Percentagem de cumprimento do programa da UC</label></h3>
</div>
<div ng-class="{ 'alert-danger': (cu.courseUnitEvaluation.cumprimentoProgramaPercent &lt; 100) }">
{{cu.courseUnitEvaluation.cumprimentoProgramaPercent}}%
</div>
</div>
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Apreciação do cumprimento do programa da UC</label></h3></div>
<div><h3><label class="label label-primary">Apreciação do cumprimento do programa da UC</label></h3>
</div>
<div>{{cu.courseUnitEvaluation.qualApreciacaoCumprimentoPrograma}}</div>
</div>
<div style="padding-left:20px">
158,13 → 166,13
</script>
 
 
 
<style>
.dtpstats td, .dtpstats th{
.dtpstats td, .dtpstats th {
text-align: center !important;
}
</style>
<script type="text/ng-template" id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_reportucsummary_UnitsDtpTable">
<script type="text/ng-template"
id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_reportucsummary_UnitsDtpTable">
<div class="sections">
 
<table class="table dtpstats">
191,28 → 199,52
</tr>
<tr ng-repeat="dtpStat in comp.semester1.courseUnitDtpStats">
<td>{{dtpStat.name}}</td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoConteudos }"><input type="checkbox" ng-model="dtpStat.planeamentoConteudos"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoCalendarizacao }"><input type="checkbox" ng-model="dtpStat.planeamentoCalendarizacao"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.ficha }"><input type="checkbox" ng-model="dtpStat.ficha"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.sumarios }"><input type="checkbox" ng-model="dtpStat.sumarios"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoEnunciados }"><input type="checkbox" ng-model="dtpStat.avaliacaoEnunciados"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoPautas }"><input type="checkbox" ng-model="dtpStat.avaliacaoPautas"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.relatorio }"><input type="checkbox" ng-model="dtpStat.relatorio"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.inquerito }"><input type="checkbox" ng-model="dtpStat.inquerito"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoConteudos }"><input type="checkbox"
ng-model="dtpStat.planeamentoConteudos"/>
</td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoCalendarizacao }"><input type="checkbox"
ng-model="dtpStat.planeamentoCalendarizacao"/>
</td>
<td ng-class="{ 'alert-danger' : !dtpStat.ficha }"><input type="checkbox" ng-model="dtpStat.ficha"/>
</td>
<td ng-class="{ 'alert-danger' : !dtpStat.sumarios }"><input type="checkbox"
ng-model="dtpStat.sumarios"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoEnunciados }"><input type="checkbox"
ng-model="dtpStat.avaliacaoEnunciados"/>
</td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoPautas }"><input type="checkbox"
ng-model="dtpStat.avaliacaoPautas"/>
</td>
<td ng-class="{ 'alert-danger' : !dtpStat.relatorio }"><input type="checkbox"
ng-model="dtpStat.relatorio"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.inquerito }"><input type="checkbox"
ng-model="dtpStat.inquerito"/></td>
</tr>
<tr>
<th colspan="9">Semestre 2</th>
</tr>
<tr ng-repeat="dtpStat in comp.semester2.courseUnitDtpStats">
<td>{{dtpStat.name}}</td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoConteudos }"><input type="checkbox" ng-model="dtpStat.planeamentoConteudos"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoCalendarizacao }"><input type="checkbox" ng-model="dtpStat.planeamentoCalendarizacao"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.ficha }"><input type="checkbox" ng-model="dtpStat.ficha"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.sumarios }"><input type="checkbox" ng-model="dtpStat.sumarios"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoEnunciados }"><input type="checkbox" ng-model="dtpStat.avaliacaoEnunciados"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoPautas }"><input type="checkbox" ng-model="dtpStat.avaliacaoPautas"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.relatorio }"><input type="checkbox" ng-model="dtpStat.relatorio"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.inquerito }"><input type="checkbox" ng-model="dtpStat.inquerito"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoConteudos }"><input type="checkbox"
ng-model="dtpStat.planeamentoConteudos"/>
</td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoCalendarizacao }"><input type="checkbox"
ng-model="dtpStat.planeamentoCalendarizacao"/>
</td>
<td ng-class="{ 'alert-danger' : !dtpStat.ficha }"><input type="checkbox" ng-model="dtpStat.ficha"/>
</td>
<td ng-class="{ 'alert-danger' : !dtpStat.sumarios }"><input type="checkbox"
ng-model="dtpStat.sumarios"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoEnunciados }"><input type="checkbox"
ng-model="dtpStat.avaliacaoEnunciados"/>
</td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoPautas }"><input type="checkbox"
ng-model="dtpStat.avaliacaoPautas"/>
</td>
<td ng-class="{ 'alert-danger' : !dtpStat.relatorio }"><input type="checkbox"
ng-model="dtpStat.relatorio"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.inquerito }"><input type="checkbox"
ng-model="dtpStat.inquerito"/></td>
</tr>
</tbody>
</table>
220,158 → 252,140
</script>
 
 
 
<style>
.learning td
{
.learning td {
font-size: 0.7em;
}
.learning td input{
 
.learning td input {
width: 50px;
}
 
.learning td input:read-only{
.learning td input:read-only {
width: 50px;
background-color: #cccccc;
}
 
.learning tr.year td {
vertical-align: top;
background-color: #aaaaaa;
 
font-weight: bold;
}
 
.learning tr.period td {
vertical-align: top;
background-color: #dfdfdf;
 
}
</style>
<script type="text/ng-template" id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_UnitsLearningResultsTable">
<script type="text/ng-template"
id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_UnitsLearningResultsTable">
<unitslearningresultstable>
</unitslearningresultstable>
</script>
 
 
 
<script>
angular.module("courseReportApp").directive('boundModel', function() {
return {
require: 'ngModel',
link: function(scope, elem, attrs, ngModel) {
scope.$watch(attrs.boundModel, function(newValue, oldValue) {
if(newValue != oldValue) {
ngModel.$setViewValue(newValue);
ngModel.$render();
}
});
angular.module("courseReportApp").directive('boundModel', function () {
return {
require: 'ngModel',
link: function (scope, elem, attrs, ngModel) {
scope.$watch(attrs.boundModel, function (newValue, oldValue) {
if (newValue != oldValue) {
ngModel.$setViewValue(newValue);
ngModel.$render();
}
});
}
}
}
});
angular.module("courseReportApp").directive('unitslearningresultstable', function() {
});
angular.module("courseReportApp").directive('unitslearningresultstable', function () {
 
return {
restrict: 'E',
link: function($scope, element, attrs)
{
return {
restrict: 'E',
link: function ($scope, element, attrs) {
 
$scope.checkedDocuments = [];
$scope.checkUnit = function(document,collection)
{
if(document.checked)
{
var docContainer =
{
"document" : document,
"collection" : collection
$scope.checkedDocuments = [];
$scope.checkUnit = function (document, collection) {
if (document.checked) {
var docContainer =
{
"document": document,
"collection": collection
}
$scope.checkedDocuments.push(docContainer);
}
$scope.checkedDocuments.push(docContainer);
else {
angular.forEach($scope.checkedDocuments, function (documentContainer, key) {
if (documentContainer.document == document) {
var index = $scope.checkedDocuments.indexOf(documentContainer);
$scope.checkedDocuments.splice(index, 1);
}
});
}
}
else
{
angular.forEach($scope.checkedDocuments, function(documentContainer, key)
{
if(documentContainer.document == document)
{
var index = $scope.checkedDocuments.indexOf(documentContainer);
$scope.checkedDocuments.splice(index, 1);
}
$scope.changeDocumentCollection = function (collection) {
angular.forEach($scope.checkedDocuments, function (documentContainer, key) {
collection.ucs.push(documentContainer.document);
delete documentContainer.document.checked;
});
angular.forEach($scope.checkedDocuments, function (documentContainer, key) {
var index = documentContainer.collection.ucs.indexOf(documentContainer.document);
documentContainer.collection.ucs.splice(index, 1);
});
$scope.checkedDocuments = [];
}
}
$scope.changeDocumentCollection = function(collection)
{
angular.forEach($scope.checkedDocuments, function(documentContainer, key)
{
collection.ucs.push(documentContainer.document);
delete documentContainer.document.checked;
});
angular.forEach($scope.checkedDocuments, function(documentContainer, key)
{
var index = documentContainer.collection.ucs.indexOf(documentContainer.document);
documentContainer.collection.ucs.splice(index, 1);
});
$scope.checkedDocuments = [];
}
$scope.avg = function(field,container, childs)
{
if(!childs || childs.length == 0)
return 0;
var sum = 0;
var c;
for(c in childs)
{
if(childs[c] && childs[c][field])
sum += 1*childs[c][field];
$scope.avg = function (field, container, childs) {
if (!childs || childs.length == 0)
return 0;
var sum = 0;
var c;
for (c in childs) {
if (childs[c] && childs[c][field])
sum += 1 * childs[c][field];
}
container[field] = sum / childs.length;
return container[field];
}
container[field] = sum / childs.length;
return container[field];
}
$scope.percent = function(n,total)
{
if(!n || n == 0 || !total || total == 0)
$scope.percent = function (n, total) {
if (!n || n == 0 || !total || total == 0)
return 0;
return 100 * n / total;
}
$scope.reprovados = function (comp) {
if (comp.alunosInscritos && comp.semElementos && comp.aprovados)
return comp.alunosInscritos - comp.semElementos - comp.aprovados;
return 0;
return 100 * n / total;
}
$scope.reprovados = function(comp)
{
if(comp.alunosInscritos && comp.semElementos && comp.aprovados)
return comp.alunosInscritos - comp.semElementos - comp.aprovados;
return 0;
}
$scope.removeComponent = function(index,list)
{
list.splice(index,1);
}
$scope.hasYearUnits = function(year)
{
for(s in year.semesters)
{
if(year.semesters[s].ucs && year.semesters[s].ucs.length > 0)
return true;
}
return false;
}
$scope.isInvalidAnfHaveUcs = function(year,years,index)
{
if(year.ano > 0)
$scope.removeComponent = function (index, list) {
list.splice(index, 1);
}
$scope.hasYearUnits = function (year) {
for (s in year.semesters) {
if (year.semesters[s].ucs && year.semesters[s].ucs.length > 0)
return true;
}
return false;
}
$scope.isInvalidAnfHaveUcs = function (year, years, index) {
if (year.ano > 0)
return false;
 
var s;
for(s in year.semesters)
{
if(year.semesters[s].ucs && year.semesters[s].ucs.length > 0)
return true;
var s;
for (s in year.semesters) {
if (year.semesters[s].ucs && year.semesters[s].ucs.length > 0)
return true;
}
years.splice(index, 1);
return false;
}
years.splice(index,1);
return false;
}
$scope.addUc = function(semestre)
{
semestre.ucs.push(
$scope.addUc = function (semestre) {
semestre.ucs.push(
{
"@class" : "<%=UnitsLearningResultUc.class.getName()%>",
manual : true,
periodo : semestre.semestre,
"@class": "<%=UnitsLearningResultUc.class.getName()%>",
manual: true,
periodo: semestre.semestre,
alunosInscritos: 0,
aprovados: 0,
aprovados1013: 0,
386,19 → 400,18
reprovadosPercent: 0,
semElementos: 0,
semElementosPercent: 0,
sigesCode : 0
sigesCode: 0
}
);
}
$scope.addAno = function(comp)
{
if(!comp.years)
comp.years = [];
comp.years.push(
);
}
$scope.addAno = function (comp) {
if (!comp.years)
comp.years = [];
comp.years.push(
{
ano : 1,
"@class" : "<%=UnitsLearningResultYear.class.getName()%>",
manual : true,
ano: 1,
"@class": "<%=UnitsLearningResultYear.class.getName()%>",
manual: true,
"alunosInscritos": 0,
"aprovados": 0,
"aprovados1013": 0,
413,11 → 426,11
"reprovadosPercent": 0,
"semElementos": 0,
"semElementosPercent": 0,
semesters : [
semesters: [
{
"@class" : "<%=UnitsLearningResultSemester.class.getName()%>",
manual : true,
semestre : "S1",
"@class": "<%=UnitsLearningResultSemester.class.getName()%>",
manual: true,
semestre: "S1",
alunosInscritos: 0,
aprovados: 0,
aprovados1013: 0,
432,11 → 445,11
reprovadosPercent: 0,
semElementos: 0,
semElementosPercent: 0,
ucs : []
ucs: []
},
{
"@class" : "<%=UnitsLearningResultSemester.class.getName()%>",
manual : true,
"@class": "<%=UnitsLearningResultSemester.class.getName()%>",
manual: true,
semestre: "S2",
alunosInscritos: 0,
aprovados: 0,
452,25 → 465,27
reprovadosPercent: 0,
semElementos: 0,
semElementosPercent: 0,
ucs : []
ucs: []
}
]
}
);
);
}
 
},
templateUrl: function (elem, attrs) {
return "unitslearningresultstable";
}
 
},
templateUrl: function(elem,attrs) {
return "unitslearningresultstable";
}
}
});
});
</script>
<script type="text/ng-template" id="unitslearningresultstable">
 
 
<div class="sections">
<button class="btn btn-success" ng-click="addAno(comp)"><span class="glyphicon glyphicon-plus"></span> Ano Manual</button>
<button class="btn btn-success" ng-click="addAno(comp)"><span class="glyphicon glyphicon-plus"></span> Ano
Manual
</button>
<table class="table learning">
<thead>
<tr>
506,82 → 521,128
<tr class="year">
<td colspan="3" ng-if="year.ano &gt; 0">
 
<button ng-disabled="hasYearUnits(year)" class="btn btn-danger btn-xs" ng-click="removeComponent($index,comp.years)"><span class="glyphicon glyphicon-remove"></span></button>
<button ng-disabled="hasYearUnits(year)" class="btn btn-danger btn-xs"
ng-click="removeComponent($index,comp.years)"><span
class="glyphicon glyphicon-remove"></span></button>
<span ng-if="!year.manual">{{year.ano}}ª ano</span>
<span ng-if="year.manual">
<select ng-model="year.ano" ng-options="c.v as c.n for c in [{v:1,n:'1º Ano'},{v:2,n:'2º Ano'},{v:3,n:'3º Ano'},{v:4,n:'4º Ano'},{v:5,n:'5º Ano'}]">
<select ng-model="year.ano"
ng-options="c.v as c.n for c in [{v:1,n:'1º Ano'},{v:2,n:'2º Ano'},{v:3,n:'3º Ano'},{v:4,n:'4º Ano'},{v:5,n:'5º Ano'}]">
</select>
</span>
 
</td>
<td colspan="3" style="font-size: 1.0em !important" ng-if="isInvalidAnfHaveUcs(year,comp.years,$index)">
Unidades que não constam do plano (Verifique a situação com os serviços Académicos antes de continuar)
Unidades que não constam do plano (Verifique a situação com os serviços Académicos antes de
continuar)
poderão constar de um plano antigo ou ter o código siges desatualizado.
</td>
<td><input readonly="true" type="number" ng-model="year.cumprimentoProgramaPercent" bound-model="avg('cumprimentoProgramaPercent',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.alunosInscritos" bound-model="avg('alunosInscritos',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.semElementos" bound-model="avg('semElementos',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.semElementosPercent" bound-model="percent(year.semElementos,year.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="year.reprovados" bound-model="reprovados(year)"></td>
<td><input readonly="true" type="number" ng-model="year.reprovadosPercent" bound-model="percent(year.reprovados,year.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados" bound-model="year.aprovados1013*1 + year.aprovados1416*1 + year.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="year.aprovadosPercent" bound-model="percent(year.aprovados,year.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="year.cumprimentoProgramaPercent"
bound-model="avg('cumprimentoProgramaPercent',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.alunosInscritos"
bound-model="avg('alunosInscritos',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.semElementos"
bound-model="avg('semElementos',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.semElementosPercent"
bound-model="percent(year.semElementos,year.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="year.reprovados" bound-model="reprovados(year)"></td>
<td><input readonly="true" type="number" ng-model="year.reprovadosPercent"
bound-model="percent(year.reprovados,year.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados"
bound-model="year.aprovados1013*1 + year.aprovados1416*1 + year.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="year.aprovadosPercent"
bound-model="percent(year.aprovados,year.alunosInscritos)"></td>
 
<td><input readonly="true" type="number" ng-model="year.aprovados1013" bound-model="avg('aprovados1013',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1013Percent" bound-model="percent(year.aprovados1013,year.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1416" bound-model="avg('aprovados1416',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1416Percent" bound-model="percent(year.aprovados1416,year.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1720" bound-model="avg('aprovados1720',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1720Percent" bound-model="percent(year.aprovados1720,year.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1013"
bound-model="avg('aprovados1013',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1013Percent"
bound-model="percent(year.aprovados1013,year.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1416"
bound-model="avg('aprovados1416',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1416Percent"
bound-model="percent(year.aprovados1416,year.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1720"
bound-model="avg('aprovados1720',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1720Percent"
bound-model="percent(year.aprovados1720,year.aprovados)"></td>
</tr>
 
<tr ng-if="false" ng-repeat-start="s in year.semesters" ></tr>
<tr ng-if="false" ng-repeat-start="s in year.semesters"></tr>
<tr class="period" ng-if="year.ano &gt; 0 || s.ucs.length > 0">
<td colspan="3" class="period">Semestre {{s.semestre}} <button ng-click="changeDocumentCollection(s)" data-toggle="tooltip" title="Mover unidades para aqui" class="btn btn-xs btn-warning" ng-show="checkedDocuments.length"><span class="glyphicon glyphicon-arrow-left"></span></button>
<td colspan="3" class="period">Semestre {{s.semestre}}
<button ng-click="changeDocumentCollection(s)" data-toggle="tooltip"
title="Mover unidades para aqui" class="btn btn-xs btn-warning"
ng-show="checkedDocuments.length"><span class="glyphicon glyphicon-arrow-left"></span>
</button>
 
<button class="btn btn-success pull-right" ng-click="addUc(s)"><span class="glyphicon glyphicon-plus"></span> UC Manual</button>
<button class="btn btn-success pull-right" ng-click="addUc(s)"><span
class="glyphicon glyphicon-plus"></span> UC Manual
</button>
</td>
<td><input readonly="true" type="number" ng-model="s.cumprimentoProgramaPercent" bound-model="avg('cumprimentoProgramaPercent',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.alunosInscritos" bound-model="avg('alunosInscritos',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.semElementos" bound-model="avg('semElementos',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.semElementosPercent" bound-model="percent(s.semElementos,s.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="s.reprovados" bound-model="reprovados(s)"></td>
<td><input readonly="true" type="number" ng-model="s.reprovadosPercent" bound-model="percent(s.reprovados,s.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados" bound-model="s.aprovados1013*1 + s.aprovados1416*1 + s.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="s.aprovadosPercent" bound-model="percent(s.aprovados,s.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="s.cumprimentoProgramaPercent"
bound-model="avg('cumprimentoProgramaPercent',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.alunosInscritos"
bound-model="avg('alunosInscritos',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.semElementos"
bound-model="avg('semElementos',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.semElementosPercent"
bound-model="percent(s.semElementos,s.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="s.reprovados" bound-model="reprovados(s)"></td>
<td><input readonly="true" type="number" ng-model="s.reprovadosPercent"
bound-model="percent(s.reprovados,s.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados"
bound-model="s.aprovados1013*1 + s.aprovados1416*1 + s.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="s.aprovadosPercent"
bound-model="percent(s.aprovados,s.alunosInscritos)"></td>
 
<td><input readonly="true" type="number" ng-model="s.aprovados1013" bound-model="avg('aprovados1013',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1013Percent" bound-model="percent(s.aprovados1013,s.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1416" bound-model="avg('aprovados1416',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1416Percent" bound-model="percent(s.aprovados1416,s.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1720" bound-model="avg('aprovados1720',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1720Percent" bound-model="percent(s.aprovados1720,s.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1013"
bound-model="avg('aprovados1013',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1013Percent"
bound-model="percent(s.aprovados1013,s.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1416"
bound-model="avg('aprovados1416',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1416Percent"
bound-model="percent(s.aprovados1416,s.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1720"
bound-model="avg('aprovados1720',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1720Percent"
bound-model="percent(s.aprovados1720,s.aprovados)"></td>
</tr>
<tr ng-repeat="u in s.ucs" ng-class="{'alert-danger': u.error}" >
<td><input ng-model="u.error" type="hidden" bound-model="u.alunosInscritos < (u.aprovados*1 + u.semElementos*1)">
<tr ng-repeat="u in s.ucs" ng-class="{'alert-danger': u.error}">
<td><input ng-model="u.error" type="hidden"
bound-model="u.alunosInscritos < (u.aprovados*1 + u.semElementos*1)">
<input ng-model="u.checked" ng-click="checkUnit(u,s)" type="checkbox"></td>
<td><input type="text" ng-readonly="!u.manual || u.manual == false" ng-model="u.sigesCode"></td>
<td>
 
<input type="text" style="width: 150px" ng-if="!(!u.manual || u.manual == false)" ng-model="u.name">
<span ng-if="(!u.manual || u.manual == false)">{{u.name}}</span>
<button class="btn btn-danger btn-xs pull-right" ng-if="!(!u.manual || u.manual == false)" ng-click="removeComponent(index,s.ucs)"><span class="glyphicon glyphicon-remove"></span></button>
<button class="btn btn-danger btn-xs pull-right" ng-if="!(!u.manual || u.manual == false)"
ng-click="removeComponent(index,s.ucs)"><span class="glyphicon glyphicon-remove"></span>
</button>
</td>
<td><input type="number" ng-model="u.cumprimentoProgramaPercent"></td>
<td><input type="number" ng-model="u.alunosInscritos"></td>
<td><input type="number" ng-model="u.semElementos"></td>
<td><input readonly="true" type="number" ng-model="u.semElementosPercent" bound-model="percent(u.semElementos,u.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="u.semElementosPercent"
bound-model="percent(u.semElementos,u.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="u.reprovados" bound-model="reprovados(u)"></td>
<td><input readonly="true" type="number" ng-model="u.reprovadosPercent" bound-model="percent(u.reprovados,u.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados" bound-model="u.aprovados1013*1 + u.aprovados1416*1 + u.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="u.aprovadosPercent" bound-model="percent(u.aprovados,u.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="u.reprovadosPercent"
bound-model="percent(u.reprovados,u.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados"
bound-model="u.aprovados1013*1 + u.aprovados1416*1 + u.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="u.aprovadosPercent"
bound-model="percent(u.aprovados,u.alunosInscritos)"></td>
 
<td><input type="number" ng-model="u.aprovados1013"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados1013Percent" bound-model="percent(u.aprovados1013,u.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados1013Percent"
bound-model="percent(u.aprovados1013,u.aprovados)"></td>
<td><input type="number" ng-model="u.aprovados1416"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados1416Percent" bound-model="percent(u.aprovados1416,u.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados1416Percent"
bound-model="percent(u.aprovados1416,u.aprovados)"></td>
<td><input type="number" ng-model="u.aprovados1720"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados1720Percent" bound-model="percent(u.aprovados1720,u.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados1720Percent"
bound-model="percent(u.aprovados1720,u.aprovados)"></td>
</tr>
<tr ng-if="false" ng-repeat-end></tr>
<tr ng-if="false" ng-repeat-end></tr>
589,21 → 650,34
<td colspan="3">Resultados Globais</td>
 
 
<td><input readonly="true" type="number" ng-model="comp.cumprimentoProgramaPercent" bound-model="avg('cumprimentoProgramaPercent',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.alunosInscritos" bound-model="avg('alunosInscritos',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.semElementos" bound-model="avg('semElementos',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.semElementosPercent" bound-model="percent(comp.semElementos,comp.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="comp.reprovados" bound-model="reprovados(comp)"></td>
<td><input readonly="true" type="number" ng-model="comp.reprovadosPercent" bound-model="percent(comp.reprovados,comp.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados" bound-model="comp.aprovados1013*1 + comp.aprovados1416*1 + comp.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovadosPercent" bound-model="percent(comp.aprovados,comp.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="comp.cumprimentoProgramaPercent"
bound-model="avg('cumprimentoProgramaPercent',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.alunosInscritos"
bound-model="avg('alunosInscritos',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.semElementos"
bound-model="avg('semElementos',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.semElementosPercent"
bound-model="percent(comp.semElementos,comp.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="comp.reprovados" bound-model="reprovados(comp)"></td>
<td><input readonly="true" type="number" ng-model="comp.reprovadosPercent"
bound-model="percent(comp.reprovados,comp.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados"
bound-model="comp.aprovados1013*1 + comp.aprovados1416*1 + comp.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovadosPercent"
bound-model="percent(comp.aprovados,comp.alunosInscritos)"></td>
 
<td><input readonly="true" type="number" ng-model="comp.aprovados1013" bound-model="avg('aprovados1013',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1013Percent" bound-model="percent(comp.aprovados1013,comp.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1416" bound-model="avg('aprovados1416',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1416Percent" bound-model="percent(comp.aprovados1416,comp.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1720" bound-model="avg('aprovados1720',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1720Percent" bound-model="percent(comp.aprovados1720,comp.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1013"
bound-model="avg('aprovados1013',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1013Percent"
bound-model="percent(comp.aprovados1013,comp.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1416"
bound-model="avg('aprovados1416',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1416Percent"
bound-model="percent(comp.aprovados1416,comp.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1720"
bound-model="avg('aprovados1720',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1720Percent"
bound-model="percent(comp.aprovados1720,comp.aprovados)"></td>
</tr>
</tbody>
</table>
612,57 → 686,118
</script>
 
 
<script type="text/ng-template"
id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_GlobalLearningResultsChartImg">
<globallearningresultschartimg>
</globallearningresultschartimg>
</script>
<script>
angular.module("courseReportApp").directive('globallearningresultschartimg', function () {
 
return {
restrict: 'E',
link: function ($scope, element, attrs) {
$scope.generateChart = function (comp) {
 
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/user/courseReport.do",
"generateGlobalLearningResultsChartImg",
{
"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 "globallearningresultschartimg";
}
}
});
</script>
<script type="text/ng-template" id="globallearningresultschartimg">
<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>
 
 
 
 
 
 
<script type="text/ng-template" id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_GlobalLearningResultsChartImg">
<globallearningresultschartimg>
</globallearningresultschartimg>
<script type="text/ng-template"
id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_GlobalLearningResultsChartYearImg">
<globallearningresultschartyearimg>
</globallearningresultschartyearimg>
</script>
<script>
angular.module("courseReportApp").directive('globallearningresultschartimg', function() {
angular.module("courseReportApp").directive('globallearningresultschartyearimg', function () {
 
return {
restrict: 'E',
link: function($scope, element, attrs)
{
$scope.generateChart = function(comp)
{
link: function ($scope, element, attrs) {
$scope.generateChart = function (comp) {
 
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/user/courseReport.do",
"generateGlobalLearningResultsChartImg",
{
"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(){}
"<%=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 "globallearningresultschartimg";
templateUrl: function (elem, attrs) {
return "globallearningresultschartyearimg";
}
}
});
</script>
<script type="text/ng-template" id="globallearningresultschartimg">
<script type="text/ng-template" id="globallearningresultschartyearimg">
<div class="imageComponent component">
 
<div class="componentBody">
678,11 → 813,14
</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">
<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 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>
/branches/grupo6/impl/src/web/user/courses/courseReportEdit.jsp
250,7 → 250,8
array.splice(index, 1);
}
 
$scope.callbackUploadedFiles = function (filesUploadResult, token, targetElement) {
$scope.callbackUploadedFiles = function (filesUploadResult, token, targetElement)
{
var modelObject = BacoAngularUtils.getAngularElementModel(targetElement);
 
if (modelObject.image && modelObject.image.identifier) {
266,7 → 267,7
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();
$scope.$apply();
},
function () {
}
326,7 → 327,7
 
</div>
 
<!-- <pre class="code">{{ report | json }}</pre>-->
<pre class="code">{{ report | json }}</pre>
 
 
</div><!--App-->
/branches/grupo6/impl/src/web/user/utils/documentsBuilder.jsp
77,7 → 77,8
</div>
<div class="form-group clearfix">
<div class="col-md-2 control-label">
<a class="btn btn-default" href="#" ng-model="comp"
<a class="btn btn-default" href="#"
ng-model="comp"
data-title="Escolha Imagem"
data-showmetafields="false"
data-confirmonupload="true"
/branches/grupo6/impl/build.xml
242,7 → 242,8
</replace>
</target>
 
<target name="build.war" depends="build" description="Make war distribution">
<target name="build.war" depends="build"
description="Make war distribution">
<mkdir dir="${build.dir.war}"/>
<mkdir dir="${build.dir.war}/WEB-INF"/>
<mkdir dir="${build.dir.war}/WEB-INF/lib"/>