Skip to content

Commit

Permalink
Merge pull request #28 from LEIC-ES-2021-22/ze/service-list
Browse files Browse the repository at this point in the history
feat: add service list
  • Loading branch information
SergioEstevao11 authored May 10, 2022
2 parents 1980a84 + ee0d377 commit e52ebb1
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 74 deletions.
27 changes: 27 additions & 0 deletions src/lib/model/entities/service.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@

class Service{
final int id;
final String name;
final String description;
final String startTime;
final String endTime;


Service(this.id, this.name, this.description,this.startTime,this.endTime){}

Map<String, dynamic> toMap() {
return {
'id': id,
'begin': startTime,
'end': endTime,
'rooms': '',
'subject': name
};
}

@override
String toString() {
return '''$id - $name - $description - $startTime - $endTime''';
}

}
34 changes: 34 additions & 0 deletions src/lib/utils/serviceMock.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import 'package:uni/model/entities/service.dart';

class ServiceMock{

static List<Service> getServices(){
return [
Service(1,'SERAC' ,
'Garantir as atividades no âmbito da administração, gestão e apoio na área de gestão de curso; a área do acesso, ingresso e certificação; a área de gestão de estudante, de acordo com as instruções tutelares e as diretivas dos Órgãos de Gestão, constituindo a relação com o estudante o vetor essencial da sua atuação.',
'11:00', '16:00'),

Service(2, 'SDInf',
'Aos Serviços de Documentação e Informação compete gerir os recursos de informação cientifico-técnica e de cariz pedagógico, a documentação administrativa e os recursos patrimoniais de componente cultural, científica ou tecnológica, numa abordagem teórica e funcional que integram a Biblioteconomia, Arquivologia e Museologia, dando centralidade ao documento, à informação e ao seu uso e gestão em contexto organizacional. Os SDI integram as unidades de Arquivo, Biblioteca, Museu e Serviços Eletrónicos, com missões, recursos e pessoal específicos mas numa prática integradora onde as novas tecnologias de criação, armazenamento, difusão e comunicação da informação ganham um papel relevante.'
, '08:30', '19:30'),

Service(3, 'SICC',
' Os Serviços de Imagem, Comunicação e Cooperação têm por missão construir relações de confiança e uma reputação institucional excelente, e valorizar o conhecimento e cultivar o talento da comunidade intercultural e global da FEUP.',
'9:30-13:00', '14:00-17:00'),

Service(4, 'SRH',
'Os Serviços de Recursos Humanos tem como missão o recrutamento, a selecção e a integração, a gestão e o desenvolvimento dos recursos humanos da FEUP.',
'10:00-12:00', '14:30-16:30'),

Service(5, 'SEF',
'Os SEF têm como Missão assegurar a atividade económica e financeira da FEUP, de acordo com as instruções tutelares e as diretivas dos Órgãos de Gestão.',
'9:00', '16:00'),

Service(6, 'STMA',
'Gestão e manutenção dos espaços e dos equipamentos da Escola, de modo a garantir as melhores condições para o ensino de excelência na área das engenharias.',
'09:00-12:30', '14:00-17:30')

];
}

}
114 changes: 41 additions & 73 deletions src/lib/view/Pages/services_page_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,135 +3,103 @@ import 'package:uni/model/app_state.dart';
import 'package:uni/model/entities/exam.dart';
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:uni/model/entities/service.dart';
import 'package:uni/utils/serviceMock.dart';
import 'package:uni/view/Pages/secondary_page_view.dart';
import 'package:uni/view/Widgets/exam_page_title_filter.dart';
import 'package:uni/view/Widgets/Service_page_filter.dart';
import 'package:uni/view/Widgets/row_container.dart';
import 'package:uni/view/Widgets/schedule_row.dart';
import 'package:uni/view/Widgets/title_card.dart';


class ServicePageView extends StatefulWidget {
@override
State<StatefulWidget> createState() => ExamsPageViewState();
State<StatefulWidget> createState() => SericesPageViewState();
}

/// Tracks the state of `ExamsLists`.
class ExamsPageViewState extends SecondaryPageViewState {
/// Tracks the state of `ServicesLists`.
class SericesPageViewState extends SecondaryPageViewState {
final double borderRadius = 10.0;

@override
Widget getBody(BuildContext context) {
return StoreConnector<AppState, List<dynamic>>(
converter: (store) {
final List<Exam> exams = store.state.content['exams'];
final Map<String, bool> filteredExams =
store.state.content['filteredExams'];
return exams
.where((exam) =>
filteredExams[Exam.getExamTypeLong(exam.examType)] ?? true)
.toList();


},
builder: (context, exams) {
return ExamsList(exams: exams);
builder: (context, services) {
return ServiceList( services: ServiceMock.getServices());
},
);
}
}

/// Manages the 'Exams' section in the user's personal area and 'Exams Map'.
class ExamsList extends StatelessWidget {
final List<Exam> exams;
/// Manages the 'Service' section in the user's personal area and 'Exams Map'.
class ServiceList extends StatelessWidget {
final List<Service> services;

ExamsList({Key key, @required this.exams}) : super(key: key);
ServiceList({Key key, @required this.services}) : super(key: key);
@override
Widget build(BuildContext context) {
return ListView(
children: <Widget>[
Container(
child: Column(
mainAxisSize: MainAxisSize.max,
children: this.createExamsColumn(context, exams),
children: this.createServiceColumn(context, services)
),
)
],
);
}

/// Creates a column with all the user's exams.
List<Widget> createExamsColumn(context, exams) {
List<Widget> createServiceColumn(context, services) {
final List<Widget> columns = <Widget>[];
columns.add(ExamPageTitleFilter(
columns.add(ServicePageTitleFilter(
name: 'Serviços',
));

if (exams.length == 1) {
columns.add(this.createExamCard(context, [exams[0]]));
return columns;
}

final List<Exam> currentDayExams = <Exam>[];

for (int i = 0; i < exams.length; i++) {
if (i + 1 >= exams.length) {
if (exams[i].day == exams[i - 1].day &&
exams[i].month == exams[i - 1].month) {
currentDayExams.add(exams[i]);
} else {
if (currentDayExams.isNotEmpty) {
columns.add(this.createExamCard(context, currentDayExams));
}
currentDayExams.clear();
currentDayExams.add(exams[i]);
}
columns.add(this.createExamCard(context, currentDayExams));
break;
}
if (exams[i].day == exams[i + 1].day &&
exams[i].month == exams[i + 1].month) {
currentDayExams.add(exams[i]);
} else {
currentDayExams.add(exams[i]);
columns.add(this.createExamCard(context, currentDayExams));
currentDayExams.clear();
}
}
columns.add(this.createServiceCard(context, services));
return columns;
}

Widget createExamCard(context, exams) {
final keyValue = exams.map((exam) => exam.toString()).join();
Widget createServiceCard(context, services) {
final keyValue = services.map((service) => service.toString()).join();
return Container(
key: Key(keyValue),
margin: EdgeInsets.only(bottom: 8),
padding: EdgeInsets.all(8),
child: this.createExamsCards(context, exams),
child: this.createServicesCards(context, services),
);
}

Widget createExamsCards(context, exams) {
final List<Widget> examCards = <Widget>[];
examCards.add(TitleCard(
day: exams[0].day, weekDay: exams[0].weekDay, month: exams[0].month));
for (int i = 0; i < exams.length; i++) {
examCards.add(this.createExamContext(context, exams[i]));
Widget createServicesCards(context, services) {
final List<Widget> serviceCards = <Widget>[];
for (int i = 0; i < services.length; i++) {
serviceCards.add(this.createServiceContext(context, services[i]));
}
return Column(children: examCards);
return Column(children: serviceCards);
}

Widget createExamContext(context, exam) {
final keyValue = '${exam.toString()}-exam';
Widget createServiceContext(context, service) {
final keyValue = '${service.toString()}-service';
return Container(
key: Key(keyValue),
margin: EdgeInsets.fromLTRB(12, 4, 12, 0),
child: RowContainer(
color: isHighlighted(exam)
? Theme.of(context).hintColor
: Theme.of(context).backgroundColor,
color: Theme.of(context).backgroundColor,
child: ScheduleRow(
subject: exam.subject,
rooms: exam.rooms,
begin: exam.begin,
end: exam.end,
type: exam.examType,
date: exam.date)));
subject: service.name,
rooms: [''],
begin: service.startTime,
end: service.endTime)));
}
}


}

////////////////////////////////////////////////////////////////////////////////////////

27 changes: 27 additions & 0 deletions src/lib/view/Widgets/Service_page_filter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:uni/view/Widgets/exam_filter_menu.dart';

class ServicePageTitleFilter extends StatelessWidget {
final String name;

const ServicePageTitleFilter({Key key, @required this.name}) : super(key: key);

@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.fromLTRB(20, 20, 20, 10),
alignment: Alignment.center,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
name,
style:
Theme.of(context).textTheme.headline6.apply(fontSizeDelta: 7),
),
],
),
);
}
}
17 changes: 16 additions & 1 deletion src/test_driver/features/login.feature
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ Feature: Open pages

Scenario: login and access the "Serviços" page
When I fill the "usernameinput" field with "up123456789"
And I fill the "passwordinput" field with "123456789"
And I fill the "passwordinput" field with "12345679"
And I tap the "entrar" button
And I open the drawer
And I tap the "key_Serviços" button
Expand Down Expand Up @@ -71,3 +71,18 @@ Feature: Open pages
And I pause for 1 seconds
Then I expect the text "Texto 1" to be absent

Scenario: login and access the "Serviços" page and see the "SERAC" panel
When I fill the "usernameinput" field with "up123456789"
And I fill the "passwordinput" field with "12345679"
And I tap the "entrar" button
And I open the drawer
And I tap the "key_Serviços" button
Then I expect the text "SERAC" to be present

Scenario: login and access the "Serviços" page and see the "SDInf" panel
When I fill the "usernameinput" field with "up123456789"
And I fill the "passwordinput" field with "12345679"
And I tap the "entrar" button
And I open the drawer
And I tap the "key_Serviços" button
Then I expect the text "SDInf" to be present

0 comments on commit e52ebb1

Please sign in to comment.