Skip to content
This repository has been archived by the owner on Feb 4, 2025. It is now read-only.

Commit

Permalink
Merge pull request #197 from CampusDual/BFS42024-180
Browse files Browse the repository at this point in the history
BFS42024-180
  • Loading branch information
marcospaab authored Dec 11, 2024
2 parents a6b74ff + 403db30 commit b3c8ba4
Show file tree
Hide file tree
Showing 20 changed files with 434 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,6 @@ public interface IBootcampService {
AdvancedEntityResult bootcampPaginationQuery(final Map<String, Object> keyMap, final List<?> attrList, final int recordNumber, final int startIndex, final List<?> orderBy) throws OntimizeJEERuntimeException;

EntityResult bootcampDateQuery(Map<String, Object> keyMap, List<String> attrList) throws OntimizeJEERuntimeException;

EntityResult futureBootcampQuery(Map<String, Object> keyMap, List<String> attrList) throws OntimizeJEERuntimeException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,7 @@ public interface IStudentService {

AdvancedEntityResult studentPaginationQuery(final Map<String, Object> keyMap, final List<?> attrList, final int recordNumber, final int startIndex, final List<?> orderBy) throws OntimizeJEERuntimeException;

EntityResult commercialStudentQuery(Map<String, Object> keysMap, List<String> attributes) throws OntimizeJEERuntimeException;

AdvancedEntityResult commercialStudentPaginationQuery(Map<String, Object> keyMap, List<?> attrList, int recordNumber, int startIndex, List<?> orderBy) throws OntimizeJEERuntimeException;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { CommercialSectionComponent } from './commercial-section/commercial-section.component';

const routes: Routes = [
{ path:'', pathMatch:'full', component: CommercialSectionComponent},
];


@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class CommercialRoutingModule { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
.general_table {
width: 90%;
margin: 20px auto;
background-color: #f5f0f2;
padding: 20px;
border-radius: 15px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
font-family: 'Roboto', sans-serif;
}

.table_container {
width: 90%;
overflow-x: hidden;
margin: 0 auto;
padding: 0 10px;
}

.table_row {
max-height: 32px;
overflow: hidden;
}

.table_cell {
padding: 6px;
}

.commercial-filters-form {
width: 68%;
margin: 20px auto;
background-color: #1a3459;
padding: 10px;
border-radius: 10px;
font-family: 'Roboto', sans-serif;
box-sizing: border-box;


}


.filter_style {
display: grid;
grid-template-columns: 1.5fr 1.5fr 1.5fr 1fr;
gap: 15px;
background-color: #f5f0f2;
padding: 25px 30px 3px 30px;
border-radius: 15px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
width: 93%;
margin: 5px auto;
box-sizing: border-box;

}

.filter_style o-text-input,
.filter_style o-combo {
min-width: 100%;
width: 70%;
}

.label_toggle {
color: #1a3459;
font-size: 16px;
font-weight: bold;
padding: 0 10px;
}

.slide-container {
width: 40%;
margin: auto;
background-color: #f5f0f2;
border-radius: 15px;
display: flex;
justify-content: center;
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<o-form-layout-manager #formLayoutManager attr="commercialSectionLayout" mode="tab" title="{{'Commercial Section' | oTranslate}}">
<o-form-layout-tabgroup-options label-columns="name;surname1"></o-form-layout-tabgroup-options>
<div class="table_container">
<o-form editable-detail="no" show-header="no" layout-align="start stretch" class="commercial-filters-form" fxFill>
<o-column-collapsible title="{{'FILTERS' | oTranslate}}" appearance="legacy" expanded="no" elevation="10"
icon="filter_list" class="collapsible-2">
<div class="filter_style">
<o-combo attr="bootcamps_id" class="bootcamp" label="Bootcamps" read-only="no" service="bootcamps" entity="futureBootcamp"
keys="id" columns="id;name" value-column="id" query-on-init="true" searchable="yes"
visible-columns="name" translate="yes" null-selection="true" sort="ASC" ></o-combo>

<o-combo attr="student_status_id" label="LSTATUS" null-selection="true" service="studentstatus"
entity="studentStatus" keys="id" columns="id;status" value-column="id" visible-columns="status"
read-only="no" sort="ASC">
</o-combo>

<o-combo attr="status" label="LCONTACTSTATUS" null-selection="true" multiple="true" [static-data]="dataArray" service="students"
entity="commercialStudent" columns="status" value-column="key" visible-columns="value"
read-only="no" sort="ASC">
</o-combo>

<div class="centered-actions" fxLayout="row" fxLayoutAlign="center" fxLayoutGap="8px">
<o-button attr="clear" [oFilterBuilderClear]="commercialFilterBuilder" type="STROKED"
label="{{'CLEAR' | oTranslate}}" layout-padding color="primary">
</o-button>
</div>
</div>

<o-filter-builder #commercialFilterBuilder attr="thefilter"
filters="bootcamps_id:bootcamps_id;student_status_id:student_status_id;status:status"
[target]="tableCommercial" query-on-change="yes" query-on-change-delay="500"
[expression-builder]="createFilter">
</o-filter-builder>
</o-column-collapsible>

<div>
<h1 class="titulo_tablas">{{ 'LCONTACTEDSTUDENTS' | oTranslate }}</h1>
<o-table #tableCommercial virtual-scroll="false" class="general_table" attr="commercialTable" service="students" entity="commercialStudent"
sort-columns="name" keys="id" columns="id;name;surname1;personal_email;surname2;dni;birth_date;phone;employment_status_id;udemy;status;
campus_email;fct_school;fct_start;fct_end;tutor;github_user;notes;surnames;spain_comunity;location;student_status_id;bootcamps_id"
visible-columns="name;surname1;surname2;personal_email;phone;status" insert-button="false" delete-button="false" pageable="true"
show-report-on-demand-option="false" show-charts-on-demand-option="false" detail-mode="none" (onClick)="goToDetail($event)">
<o-table-column attr="name" title="Name"></o-table-column>
<o-table-column attr="surname1" title="FIRST_SURNAME"></o-table-column>
<o-table-column attr="surname2" title="LAST_SURNAME"></o-table-column>
<o-table-column attr="personal_email" title="Email"></o-table-column>
<o-table-column attr="phone" title="LPHONE"></o-table-column>
<o-table-column attr="status" title="LCONTACTSTATUS"></o-table-column>
<o-table-paginator page-size="20" page-size-options="10;20;40"></o-table-paginator>
</o-table>
</div>
</o-form>
</div>
</o-form-layout-manager>
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';

import { CommercialSectionComponent } from './commercial-section.component';

describe('CommercialSectionComponent', () => {
let component: CommercialSectionComponent;
let fixture: ComponentFixture<CommercialSectionComponent>;

beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ CommercialSectionComponent ]
})
.compileComponents();

fixture = TestBed.createComponent(CommercialSectionComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import { Component, ViewChild } from '@angular/core';
import { FilterExpressionUtils, Expression, OFormComponent, OTableComponent } from 'ontimize-web-ngx';
import { ActivatedRoute, Router } from '@angular/router';
import commercialStatus from '../commercialstatus';

@Component({
selector: 'app-commercial-section',
templateUrl: './commercial-section.component.html',
styleUrls: ['./commercial-section.component.css']
})
export class CommercialSectionComponent {


@ViewChild('tableStudents') tableComponent: OTableComponent;
form!: OFormComponent;
dataArray = commercialStatus.map(status => ({ key: status, value: status }));
detailId !: Number;



constructor(private route: ActivatedRoute, private router: Router) { }


goToDetail(event: any) {
const studentId = event.row.id

if (studentId) {
console.log("ID del estudiante:", studentId);
this.router.navigate([`/main/students/${studentId}`]);
} else {
console.error("No se encontró el ID del estudiante.");
}
}


createFilter(values: Array<{ attr: string, value: any }>): Expression | null {
const filters: Array<Expression> = values
.filter(fil => fil.value != null && fil.value.toString().trim() !== '')
.map(fil => {
var filterValue = fil.value;

if (!Array.isArray(filterValue)) {
filterValue = filterValue.toString().trim();
}

switch (fil.attr) {
case 'bootcamps_id':
return FilterExpressionUtils.buildExpressionLike(fil.attr,"|"+filterValue+"|");
case 'student_status_id':
return FilterExpressionUtils.buildExpressionEquals(fil.attr, filterValue);
case 'status':
if (Array.isArray(filterValue)) {
return FilterExpressionUtils.buildExpressionIn(fil.attr, filterValue);
}
return FilterExpressionUtils.buildExpressionEquals(fil.attr, filterValue);
case 'id':
return FilterExpressionUtils.buildExpressionEquals(fil.attr, filterValue);
default:
return null;
}
})
.filter((expr): expr is Expression => expr !== null);

return filters.length > 0
? filters.reduce((exp1, exp2) =>
FilterExpressionUtils.buildComplexExpression(exp1, exp2, FilterExpressionUtils.OP_AND)
)
: null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { CommercialRoutingModule } from './commercial-routing.module';
import { CommercialSectionComponent } from './commercial-section/commercial-section.component';
import { RouterOutlet } from '@angular/router';
import { MatIconModule } from '@angular/material/icon';
import { OntimizeWebModule } from 'ontimize-web-ngx';


@NgModule({
declarations: [
CommercialSectionComponent
],
imports: [
CommonModule,
CommercialRoutingModule,
RouterOutlet,
MatIconModule,
OntimizeWebModule,
]
})
export class CommercialModule { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const commercialStatus: string[] = [
"Interesado",
"Inactivo",
"Inscrito"
];

export default commercialStatus;
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ export const routes: Routes = [
{ path: 'students', loadChildren: () => import('./students/students.module').then(m => m.StudentsModule), data: {oPermission: {permissionId: 'students-permission', restrictedPermissionsRedirect: '/main/home'}} },
{ path: 'tutors', loadChildren: () => import('./tutors/tutors.module').then(m => m.TutorsModule), data: {oPermission: {permissionId: 'tutor-permission', restrictedPermissionsRedirect: '/main/home'}}},
{ path: 'data', loadChildren: () => import('./data/data.module').then(m => m.DataModule), data: {oPermission: {permissionId: 'data-permission', restrictedPermissionsRedirect: '/main/home'}}},
{ path: 'commercial', loadChildren: () => import('./commercial/commercial.module').then(m => m.CommercialModule), data: {oPermission: {permissionId: 'commercial-permission', restrictedPermissionsRedirect: '/main/home'}}},
{ path: 'config', loadChildren: () => import('./config/config.module').then(m => m.ConfigModule), data: {oPermission: {permissionId: 'config-permission', restrictedPermissionsRedirect: '/main/home'}}}

]
}
];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<o-form #form attr="studentsDetail" service="students" entity="student" keys="id" header-actions="I;U;D"
<o-form #form attr="studentsDetail" service="students" entity="student" keys="id" header-actions="U;D"
show-header-navigation="no">
<div o-form-toolbar-buttons>
<o-button attr="backButton" class="o-form-toolbar-button" type="RAISED" icon="keyboard_backspace" label="Go back"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export const MENU_CONFIG: MenuRootItem[] = [
},
{ id: 'students', name: 'Students', route: '/main/students', icon: 'groups' },
{ id: 'tutors', name: 'Mentors', route: '/main/tutors', icon: 'work' },
{ id: 'commercialsection', name: 'Commercial Section', route:'/main/commercial', icon:'call'},
{ id: 'personalinfo', name: 'Mis Datos', route:'/main/data/student', icon:'article'},
{ id: 'personaltutorinfo', name: 'Mis Datos', route:'/main/data/tutor', icon:'article'},
{id: 'config', name: 'Config', route: '/main/config', icon: 'tune' },
Expand Down
6 changes: 5 additions & 1 deletion cd2024bfs4g1-frontend/src/main/ngx/src/assets/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -301,5 +301,9 @@
"Save": "Save",
"TUTOR_HAS_BOOTCAMPS":"The mentor has assigned bootcamps and cannot be deleted",
"nota":"Notes",
"Acceso":"Access"
"Acceso":"Access",
"nota":"Notes",
"LCONTACTSTATUS": "Contact status",
"LCONTACTEDSTUDENTS": "Contacted students",
"Commercial Section": "Commercial Section"
}
6 changes: 5 additions & 1 deletion cd2024bfs4g1-frontend/src/main/ngx/src/assets/i18n/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -299,5 +299,9 @@
"Download" : "Descargar",
"Save": "Guardar",
"nota":"Notas",
"Acceso":"Accesos"
"Acceso":"Accesos",
"nota":"Notas",
"LCONTACTSTATUS": "Estado del Contacto",
"LCONTACTEDSTUDENTS": "Estudiantes contactados",
"Commercial Section": "Sección comercial"
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public class StudentDao extends OntimizeJdbcDaoSupport {
public static final String STATUS = "status";
public static final String SPAIN_COMUNITY = "spain_comunity";
public static final String LOCATION = "location";
public static final String USER_ID = "user_id";
public static final String USER_ID = "user_id";
public static final String EMPLOYMENT_STATUS_ID = "employment_status_id";
public static final String STUDENT_STATUS_ID = "student_status_id";
}
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,23 @@ public EntityResult bootcampDateQuery(Map<String, Object> keyMap, List<String> a
return this.daoHelper.query(this.bootcampDao, queryFilter, attrList);
}

@Override
public EntityResult futureBootcampQuery(Map<String, Object> keyMap, List<String> attrList) throws OntimizeJEERuntimeException {

SQLStatementBuilder.BasicField startDateField = new SQLStatementBuilder.BasicField(BootcampDao.ATTR_START_DATE);
SQLStatementBuilder.BasicField currentDate = new SQLStatementBuilder.BasicField("CURRENT_DATE");

// Crear la condición para obtener los bootcamps cuyo start_date sea posterior a la fecha actual
SQLStatementBuilder.BasicExpression startDateCondition = new SQLStatementBuilder.BasicExpression(
startDateField, SQLStatementBuilder.BasicOperator.MORE_OP, currentDate);

Map<String, Object> queryFilter = new HashMap<>();
queryFilter.put(SQLStatementBuilder.ExtendedSQLConditionValuesProcessor.EXPRESSION_KEY, startDateCondition);

// Ejecutar la consulta con la condición aplicada (en este caso usando el alias "futureBootcamps")
return this.daoHelper.query(this.bootcampDao, queryFilter, attrList, "futureBootcamps");
}



}
Original file line number Diff line number Diff line change
Expand Up @@ -317,4 +317,14 @@ private EntityResult createErrorResult(String message) {
public AdvancedEntityResult studentPaginationQuery(final Map<String, Object> keyMap, final List<?> attrList, final int recordNumber, final int startIndex, final List<?> orderBy) throws OntimizeJEERuntimeException {
return this.daoHelper.paginationQuery(this.studentDao, keyMap, attrList, recordNumber, startIndex, orderBy);
}

@Override
public EntityResult commercialStudentQuery(Map<String, Object> keysMap, List<String> attributes) throws OntimizeJEERuntimeException {
return this.daoHelper.query(this.studentDao, keysMap, attributes, "commercialStudent");
}

@Override
public AdvancedEntityResult commercialStudentPaginationQuery(final Map<String, Object> keyMap, final List<?> attrList, final int recordNumber, final int startIndex, final List<?> orderBy) throws OntimizeJEERuntimeException {
return this.daoHelper.paginationQuery(this.studentDao, keyMap, attrList, recordNumber, startIndex, orderBy, "commercialStudent");
}
}
Loading

0 comments on commit b3c8ba4

Please sign in to comment.