+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ viewTitle }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ = 2" class="calendar-letters" [class.cal-reverse]="loggeduser.Profile != 'PR' && loggeduser.Profile != 'MDGPR' && profile == 'mdgpr' " (click)="changeProfile()">
+
+ MC
+
+
+
+ CP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ view.dates[row*7+col].label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Calendário do Presidente da República
+
-
-
-
-
-
-
-
-
-
-
-
-
- {{ viewTitle }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{view.dates[row*7+col].label}}
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ TimelineDayEvent(events.key)}}
+
+
+
+
+
+
+
+
+
{{event.event.StartDate | date: 'HH:mm'}}
+
--
+
+
{{event.event.EndDate | date: 'HH:mm'}}
+
--
+
+
Todo
+
o dia
+
+
+
+
+ {{ event.event.CalendarName }}
+
{{event.event.Location}}
+
+
{{event.event.Subject}}
+
+
{{ eventService.getCalendarOwnNameByCalendarId(event.event.CalendarId) }}
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ viewTitle }}
-
-
-
-
-
-
-
-
-
-
-
-
+
= 2">
+
-
-
-
- {{view.dates[row*7+col].label}}
-
-
+
+
+ {{ TimelineDayEvent(events.key) }}
+
+
+
+
+
+
+
{{event.event.StartDate | date: 'HH:mm'}}
+
--
+
+
{{event.event.EndDate | date: 'HH:mm'}}
+
--
+
+
Todo
+
o dia
+
+
+
+
+
{{event.event.Location}}
+
+
{{event.event.Subject}}
+
+
{{ eventService.getCalendarOwnNameByCalendarId(event.event.CalendarId) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ TimelineDayEvent(events.key)}}
+
+
+
+
+
+
+
+
{{event.event.StartDate | date: 'HH:mm'}}
+
--
+
+
{{event.event.EndDate | date: 'HH:mm'}}
+
--
+
+
Todo
+
o dia
+
+
+
+
+
{{event.event.Location}}
+
+
{{event.event.Subject}}
+
+
{{ eventService.getCalendarOwnNameByCalendarId(event.event.CalendarId) }}
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+ Nenhum evento selecionado
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/pages/agenda/agenda.page.scss b/src/app/pages/agenda/agenda.page.scss
index e70e4aaf6..0abdea4dd 100644
--- a/src/app/pages/agenda/agenda.page.scss
+++ b/src/app/pages/agenda/agenda.page.scss
@@ -1,8 +1,4 @@
-.indicator-container {
- padding-left: 0.5rem;
- padding-bottom: 0.4rem;
-}
-
+
.event-indicator {
background: #333;
width: 5px;
@@ -10,19 +6,23 @@
border-radius: 5px;
display: table-cell;
}
-
+
+
:host ::ng-deep {
.monthview-primary-with-event {
- background-color: white !important;
+ /* background-color: white !important; */
+ }
+
+ .monthview-current{
+ /* background-color: red; */
+ border-bottom: 1px solid rgb(158, 250, 135) !important;
}
-
.monthview-selected {
- background-color: lightskyblue !important;
+ /* background-color: lightskyblue !important; */
}
.item{
/* background: red !important; */
text-transform: capitalize;
-
}
.input-wrapper{
border-left: red !important;
@@ -30,13 +30,46 @@
margin-left: 1px solid red;
}
}
-
-.with-event {
- background-color: #ccc;
- border-radius: 15px;
-}
+.main-header{
+ width: 100%; /* 400px */
+ height: 100%;
+ font-family: Roboto;
+ border-top-left-radius: 25px;
+ border-top-right-radius: 25px;
+ background-color: #fff;
+ overflow:hidden;
+ padding: 15px 5px 0px 5px;
+ color:#000;
+ transform: translate3d(0, 1px, 0);
+
+ .title-content{
+ width: 360px;
+ margin: 0px auto;
+ padding: 0 !important;
+ background: #ecf8ff;
+ }
+ .div-title {
+ padding: 0!important;
+ float: left;
+ }
+ .title {
+ font-size: 25px;
+ }
+ .div-icon{
+ width: 40px;
+ float: right;
+ font-size: 35px;
+ overflow: auto;
+ padding: 1px;
+ }
+ .div-icon ion-icon{
+ float: right;
+ padding-left: 20px;
+ }
+}
+
/* TOGGLE button */
.switch {
@@ -96,7 +129,7 @@ input:checked + .slider:before {
{
display: none;
text-align: left !important;
- left: 25px !important;
+ left: 25px !important;
color: white;
}
.mdgpr
@@ -130,10 +163,726 @@ input:checked + .slider .mdgpr
/* Rounded sliders */
.slider.round {
border-radius: 34px;
-
+
}
.slider.round:before {
border-radius: 50%;
border: 1px solid #e16817;
}
+
+/*
+
+Calendar
+
+*/
+/* NEW CSS FOR TOGGLE BUTTON */
+.toggleBox{
+ margin:20px 12px 7px 0;
+}
+input[type="checkbox"]{
+ position: relative;
+ width: 96px;
+ height: 34px;
+ background: #ffffff;
+ -webkit-appearance: none;
+ border-radius: 20px;
+ outline: none;
+ transition: .4s;
+ /* box-shadow: inset 0 0 5px rgba(0,0,0,0.2); */
+ cursor: pointer;
+ border:1px solid #e16817;
+}
+input:checked[type="checkbox"]{
+ background: #e16817;
+}
+input[type="checkbox"]::before{
+ z-index: 2;
+ position: absolute;
+ content: "";
+ left: 0;
+ width: 30px;
+ height: 30px;
+ background: #fff;
+ border-radius: 50%;
+ /* transform: scale(1.1); */
+ box-shadow: inset 0 2px 5px rgba(0,0,0,0.2);
+ border:1px solid #e16817;
+}
+input:checked[type="checkbox"]::before{
+ left: 65px;
+
+}
+.toggle{
+ position: relative;
+ display: block;
+ font-family: 'Montserrat', sans-serif;
+ /* display: grid; */
+ text-align: center;
+}
+label{
+ position: absolute;
+ color: #fff;
+ font-weight: 600;
+ font-size: 12px;
+ pointer-events: none;
+}
+.onbtn{
+ top:10px;
+ bottom: 15px;
+ left: 15px;
+ /* padding-top: 10px;
+ border: 1px solid red; */
+}
+.ofbtn{
+ top:10px;
+ bottom: 15px;
+ right: 14px;
+ color: #e16817;
+}
+td.monthview-primary-with-event {
+ background-color: white !important;
+}
+.header-title{
+ font-family: Roboto;
+ font-size: 25px;
+ margin: 0 5px 0 25px;
+ padding: 0;
+ /* color:#ffffff; */
+ color:#000;
+}
+
+.div-top-header{
+ width: 400px;
+ margin: 0 auto;
+ background-color: #07c941;
+ padding-top: 15px;
+ border: 0!important;
+
+ .div-search{
+ font-size: 45px;
+ float: left;
+ margin: 0 0 0 10px
+ }
+ .div-logo{
+ background: transparent;
+ width: 140px;
+ margin: 5px 0 0px 71px;
+ float: left;
+ }
+ .div-logo img{
+ width: 100%;
+ }
+ .div-profile{
+ font-size: 45px;
+ float: right;
+ margin-right: 10px;
+ }
+}
+.main-content{
+ width: 100%; /* 400px */
+ height: 100%;
+ font-family: Roboto;
+ margin: 0 auto;
+ background-color: #fff;
+ overflow:auto;
+ /* padding: 25px 20px 0 20px; */
+ color: #000 !important;
+}
+
+.segment {
+
+}
+
+ div ion-raw > ul > li{
+ font-size: 11pt;
+ font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;
+}
+
+/* Timeline */
+
+.cal-hour-segment {
+ border-bottom: none !important;
+}
+
+.cal-current-time-marker {
+ background-color: #42b9fe !important;
+}
+
+.calendar-tool-tip{
+ ion-icon{
+ font-size: 35px;
+ }
+ .arrow-down{
+ font-size: 28px;
+ }
+
+}
+
+
+
+
+
+.drop-down{
+
+ .drop-down-container{
+ display: none;
+ border-top: 2px solid #42b9fe;
+ position: absolute;
+ background: white;
+ z-index: 100000;
+ box-shadow: 0 4px 9px 0 rgba(0, 0, 0, 0.3);
+ border-bottom-right-radius: 5px;
+ border-bottom-left-radius: 5px;
+ margin-left: -122px;
+ padding: 4px 15px;
+ ul{
+ margin: 0px;
+ padding: 0px;
+ li{
+ list-style: none;
+ height: 35px;
+ display: flex;
+ align-items: center;
+ }
+ }
+ }
+}
+
+
+.capitaliseText{
+ min-width: 155px;
+ text-align: center;
+ font-weight: normal;
+ padding: 0px;
+ margin: 0px;
+ justify-content: space-around;
+}
+
+.arrow{
+ padding: 0px 0px;
+}
+
+.right-icons, .calendar-profile{
+ padding: 0px 9px
+}
+
+
+.capitaliseText{
+ font-size: 20px;
+}
+
+
+.calendar-tool-tip{
+ padding: 30px 10px 20px 10px;
+ //border: 1px solid orange;
+
+}
+
+
+.custom-calendar-header {
+ width: 100%;
+ margin-bottom: 10px;
+ thead {
+ display: flex;
+ justify-content: space-around;
+ th {
+ font-family: Roboto;
+ font-size: 15px;
+ color: rgba(52, 72, 94, 0.54);
+ font-weight: normal;
+ }
+ }
+}
+
+
+
+.currente-date-timelien{
+ cursor: pointer;
+ padding: 10px 20px;
+ .timeline-date{
+ font-size: 15px;
+ font-weight: bold;
+ }
+ .collaps{
+ font-size: 26px;
+ padding-right: 8px;
+ }
+ .filter{
+ font-size: 15px;
+ font-weight: normal;
+ ion-icon{
+ font-size: 35px;
+ color: var(--title-text-color);
+ }
+ .filter-name{
+ color: var(--title-text-color);
+ font-family: Roboto;
+ font-size: 15px;
+ margin-right: 25px;
+ width: 55px;
+ }
+
+ ul{
+ background-color: white !important;
+ position: absolute;
+ padding: 0px;
+ margin: 0px;
+ list-style: none;
+ margin-top: 140px;
+ padding: 0px;
+ box-shadow: 0px 0px 10px gray !important;
+ border-radius: 5px;
+ width: 96px;
+ z-index: 1000000;
+ li{
+ padding: 5px 10px;
+ font-size: 15px;
+ font-weight: normal;
+ }
+ li.active{
+ background-color: var(--mat-selected) !important;
+ color: white;
+ }
+ li:hover:not(.active){
+ background-color: var(--mat-selected-hover);
+
+ }
+ }
+ }
+}
+
+
+.showcalendar{
+ display: none;
+}
+
+.timeline-header{
+ z-index: 1000000;
+ width: 100%;
+ background-color: white;
+}
+
+
+.timeline-container{
+
+ .day {
+ font-weight: bold;
+ color: #2e2e2e !important;
+ font-size: 13px;
+ }
+ .EventListBoxBorder{
+ padding-bottom: 5px;
+ border-bottom: 1px solid #d8d8d8;
+ }
+
+ .content-pr-Oficial, .content-pr-Pessoal, .content-mdgpr-Pessoal, .content-mdgpr-Oficial {
+ width: 100% !important;
+ padding: 0px 10px !important;
+ }
+
+
+ .schedule-time{
+ margin-right: 10px;
+ min-width: 33px;
+ .time-start{
+ color: #797979 !important;
+ font-family: Roboto;
+ font-size: 13px;
+ }
+ .time-end{
+ color: #797979 !important;
+ font-family: Roboto;
+ font-size: 13px;
+ }
+ }
+ .schedule-date{
+ margin-right: 10px;
+ width: 22%;
+ color: #797979 !important;
+ font-size: 13px;
+ }
+ .schedule-details{
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ width: 100%;
+ overflow: auto;
+
+ .location{
+ width: 100%;
+ font-family: Roboto;
+ font-size: 13px;
+ color: black;
+
+ }
+ .description{
+ width: 100%;
+ font-family: Roboto;
+ font-size: 15px;
+ font-weight: bold;
+ color: var(--title-text-color);
+ }
+
+ .description p {
+ white-space: nowrap;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ }
+
+ }
+ .color{
+ width: 5px;
+ height: 40px;
+ border-top-right-radius: 5px;
+ border-bottom-right-radius: 5px;
+ background-color: #f05d5e;
+ }
+
+ .div-content-Oficial{
+ width: 85%;
+ float: left;
+ border-left: 4px solid #cab0dc;
+ padding: 0 0 0 12px;
+ }
+ .div-content-Pessoal{
+ width: 85%;
+ float: left;
+ border-left: 4px solid #cbeecb;
+ padding: 0 0 0 12px;
+ }
+ .div-content-Oficial h3, .div-content-Pessoal h3{
+ font-size: 14pt;
+ /* border: 1px solid red; */
+ }
+ .div-content-Oficial p, .div-content-Pessoal p{
+ font-size: 12pt;
+ color: rgb(94, 92, 92);
+ padding: 0 !important;
+ margin: 0 !important;
+ }
+
+ .content-pr-Pessoal{
+ background-color: var(--white);
+ border-radius: 5px;
+ border-right: 5px solid #958bfc;
+ overflow: auto;
+ }
+ .content-mdgpr-Oficial{
+ border-radius: 5px;
+ border-right: 5px solid #ffb703;
+ overflow: auto;
+ }
+ .content-mdgpr-Pessoal{
+ border-radius: 5px;
+ border-right: 5px solid #f05d5e;
+ overflow: auto;
+ }
+
+}
+
+
+.calendar-border{
+ background: #ebebeb;
+ margin: 13px 20px;
+ height: 2px;
+}
+
+
+.calendar-progress-bar{
+ position: absolute;
+ width: 100%;
+ margin-left: 10px;
+}
+
+
+.agenda-container{
+ overflow: hidden;
+}
+
+.container-wrapper{
+ height: 100%;
+ overflow: hidden;
+
+ .calendar-timeline{
+ border-top-right-radius: 0px;
+ width: calc(100%);
+ overflow: hidden;
+
+ .calendar-wrapper{
+ width: 100%;
+ }
+
+ .timeline-wrapper{
+ width: 100%;
+ overflow: auto;
+ // overflow-x: hidden;
+ }
+ }
+}
+
+
+
+.event-details{
+ display: none;
+}
+
+
+@media only screen and (min-width: 1024px) {
+ .container-wrapper{
+ height: 100%;
+
+ .calendar-timeline{
+ border-top-right-radius: 0px;
+ border-top-left-radius: 25px;
+ width: calc(100% - 40%);
+ border-right: 1px solid #d8d8d8;
+
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ flex-wrap: unset;
+ }
+ }
+ .event-details{
+ display: block;
+ }
+}
+
+
+
+
+
+app-view-event{
+ height: 100%;
+ display: flex;
+ flex-wrap: wrap-reverse;
+ flex-direction: column;
+ z-index: 1000;
+}
+
+app-edit-event{
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ z-index: 1000;
+}
+
+app-new-event{
+ height: 100%;
+ display: flex;
+ flex-wrap: wrap;
+ flex-direction: column;
+ z-index: 1000;
+}
+
+app-event-list{
+ flex-direction: column;
+ height: 100%;
+ flex-wrap: wrap-reverse;
+ z-index: 1000;
+}
+
+app-approve-event{
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+
+ z-index: 1000;
+}
+
+.transparent{
+ position: absolute;
+ z-index: 0;
+ opacity: 0;
+}
+
+.nothing-to-show{
+ justify-content: center;
+ display: flex;
+ align-items: center;
+ height: 100%;
+}
+
+
+.fs-timeline {
+ border-right: 1px solid #909090;
+}
+
+
+.filter-Pessoal {
+ .content-pr-Oficial, .content-mdgpr-Oficial, .content-md-Pessoal {
+ display: none !important;
+ }
+}
+
+.filter-Oficial {
+ .content-pr-Pessoal, .content-mdgpr-Pessoal, .content-md-Pessoal {
+ display: none !important;
+ }
+
+}
+
+
+.dropdown-scroll-weel {
+ display: flex;
+ position: absolute;
+ margin-left: 26px;
+ background: white;
+ height: 200px;
+ z-index: 100;
+ width: 179px;
+ box-shadow: 0px 7px 10px #8c8c8c;
+ border-radius: 11px;
+ padding-bottom: 6px;
+ margin-top: 232px;
+ border-top: 2px solid #42b9fe;
+ border-top-left-radius: 0px;
+ border-top-right-radius: 0px;
+ li, ul {
+ list-style: none;
+ padding: 5px 0px;
+ margin: 0px;
+ text-align: center;
+ span{
+ padding: 0px 5px;
+ }
+ }
+
+ li.active {
+ background-color: var(--mat-selected) !important;
+ color: white;
+ }
+
+ li:hover{
+ cursor: pointer;
+ background-color: var(--mat-selected-hover) ;
+ }
+}
+
+
+.dropdown-scroll-weel-background{
+ position: absolute;
+ top: 0px;
+ left: 0px;
+ height: 100%;
+ width: 100%;
+ z-index: 99;
+}
+
+@media only screen and (min-width: 1225px) {
+ .calendar-timeline{
+
+ height: 100%;
+ background-color: white;
+ border-top-left-radius: 25px;
+ }
+ .event-details{
+ width: 40%;
+ background: white;
+ border-top-right-radius: 0px;
+ }
+
+}
+
+@media only screen and (min-width: 321px) {
+
+ .calendar-timeline{
+
+ height: 100%;
+ background-color: white;
+ border-top-left-radius: 0px;
+ }
+ .event-details{
+ width: 40%;
+ background: white;
+ border-top-right-radius: 25px;
+ }
+
+}
+
+@media only screen and (max-width: 415px) {
+ .capitaliseText {
+ font-size: 18px;
+ }
+ .resize{
+ font-size: 33px !important;
+ ion-icon{
+ font-size: 33px !important;
+ }
+ }
+}
+
+@media only screen and (max-width: 398px) {
+ .capitaliseText {
+ font-size: 15px;
+ }
+ .resize{
+ font-size: 27px !important;
+ ion-icon{
+ font-size: 27px !important;
+ }
+ }
+}
+
+
+@media only screen and (max-width: 364px) {
+ .capitaliseText {
+ font-size: 13px;
+ }
+ .resize{
+ font-size: 23px !important;
+ ion-icon{
+ font-size: 23px !important;
+ }
+ }
+}
+
+
+
+
+$font-family: 'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif;
+$font-size: 11pt;
+
+.changeText{
+ font-family: $font-family;
+ font-size: $font-size;
+
+}
+
+.calendar-title-container{
+ width: 100% !important;
+ .calendar-title-description {
+ width: 50% !important;
+ }
+}
+
+.calendar-letters {
+ width: 36px;
+ height: 36px;
+ background-color: #f05d5e;
+ border-radius: 44px;
+ text-align: center;
+ align-items: center;
+ justify-content: center;
+ margin-top: -3px;
+ border: 1.5px solid black;
+ color: white;
+ display: none;
+ .text{
+
+ }
+}
+
+
+@media only screen and (max-width: 800px) {
+ .calendar-letters {
+ display: flex !important;
+ }
+}
+
+.cal-reverse {
+ background: white !important;
+ color: black !important;
+ border-color: #f05d5e !important;
+}
\ No newline at end of file
diff --git a/src/app/pages/agenda/agenda.page.ts b/src/app/pages/agenda/agenda.page.ts
index 68e40a669..a5a9765a6 100644
--- a/src/app/pages/agenda/agenda.page.ts
+++ b/src/app/pages/agenda/agenda.page.ts
@@ -1,22 +1,93 @@
import { Component, OnInit, ViewChild, Inject, LOCALE_ID } from '@angular/core';
import { CalendarComponent } from 'ionic2-calendar';
-import { AlertController, ModalController } from '@ionic/angular';
-import { formatDate } from '@angular/common';
-import { CalModalPage } from '../cal-modal/cal-modal.page';
+import { AlertController, ModalController, Platform } from '@ionic/angular';
import { EventsService } from 'src/app/services/events.service';
import { Event } from '../../models/event.model';
-import { Router, NavigationEnd } from '@angular/router';
-import { AlertService } from 'src/app/services/alert.service';
+import { Router, NavigationEnd, NavigationExtras } from '@angular/router';
+import { momentG } from 'src/plugin/momentG';
+import { DomSanitizer } from "@angular/platform-browser";
+import { EventPerson } from 'src/app/models/eventperson.model';
+import { removeDuplicate } from 'src/plugin/removeDuplicate.js';
+import { Storage } from '@ionic/storage';
+
+// showTimeline
+import { setHours, setMinutes } from 'date-fns';
+import {
+ CalendarDateFormatter,
+ CalendarEvent,
+ CalendarView,
+ DAYS_OF_WEEK,
+} from 'angular-calendar';
+import { CustomDateFormatter } from './custom-date-formatter.provider';
+import { NewEventPage } from './new-event/new-event.page';
+import { AuthService } from 'src/app/services/auth.service';
+import { LoginUserRespose } from 'src/app/models/user.model';
+import { DateAdapter } from '@angular/material/core';
+import { ToastService } from 'src/app/services/toast.service';
+import { eventSource } from 'src/app/models/agenda/eventSource';
+import { CalendarStore } from 'src/app/store/calendar.service';
+import { ListBoxService } from 'src/app/services/agenda/list-box.service';
+import { ChangeProfileService } from 'src/app/services/change-profile.service';
+
+import { SqliteService } from 'src/app/services/sqlite.service';
+import { BackgroundService } from 'src/app/services/background.service';
+import { ThemeService } from 'src/app/services/theme.service'
+import { SessionStore } from 'src/app/store/session.service';
+
@Component({
selector: 'app-agenda',
templateUrl: './agenda.page.html',
styleUrls: ['./agenda.page.scss'],
+ providers: [
+ {
+ provide: CalendarDateFormatter,
+ useClass: CustomDateFormatter,
+ },
+ ],
})
export class AgendaPage implements OnInit {
+ view: CalendarView = CalendarView.Day;
+
+ viewDate: Date = new Date();
+
+ weekStartsOn: number = DAYS_OF_WEEK.MONDAY;
+
+ weekendDays: number[] = [DAYS_OF_WEEK.FRIDAY, DAYS_OF_WEEK.SATURDAY];
+
+ CalendarView = CalendarView;
+
+ timelineDate: string;
+
+ contacts: EventPerson[]
+
+ setView(view: CalendarView) {
+ this.view = view;
+ }
+
+ // calendar
+ showCalendar: boolean;
+ calendarHeight: string;
+
+ // for timeline
+ events: CalendarEvent[] = [];
+ TimelinePR: CalendarEvent[] = [];
+ TimelinePRList = {}
+ TimelineMD: CalendarEvent[] = [];
+ TimelineMDList = {}
+
+ showTimelinePR = false;
+ showTimelineMD = false;
+
+ // timeline filter
+ timelineFilterState: string = 'Todos';
+ showTimelineFilterState: boolean;
+ showTimeline = true;
+
/* List of events of our calendar */
- eventSource = [];
+ eventSource: eventSource[] = []
+
/* The title of the calendar */
viewTitle: string;
@@ -27,201 +98,1397 @@ export class AgendaPage implements OnInit {
};
selectedDate: Date;
- eventSelectedDate: Date;
+ eventSelectedDate: Date = new Date();
eventSelectedDate2: Date;
+
rangeStartDate: Date;
rangeEndDate: Date;
+ selectedEvent: Event;
+ selectedEventId: string | number;
+ selectedEventCalendarId : string | number;
+ postEvent: any;
+
+ // temporary data
+ taskParticipants: any[] = [];
+ taskParticipantsCc: any[] = [];
+ adding: "intervenient" | "CC" = "intervenient";
+
@ViewChild(CalendarComponent) myCal: CalendarComponent;
- segment:string;
- eventsList: Event[];
- eventsListPessoal: Event[];
- eventsListOficial: Event[];
+ segment: "Combinado" | "Pessoal" | "Oficial" = "Combinado";
+ timelineSedment: "Combinado" | "Pessoal" | "Oficial";
+
+ profile: 'mdgpr' | 'pr';
+
+ // this will make toggle add event and.
+ showEventEditOrOpen: "edit" | "add" | "" | "eventoToApprove" = ""
+ prEventList: Event[];
+ mdEventList: Event[];
showLoader: boolean;
startTime: Date;
endTime: Date;
+ mobileComponent = {
+ showAddNewEvent: false,
+ showEditEvent: false,
+ showEventDetails: false,
+ showEventList: false,
+ transparentEventList: false,
+ transparentEventToApprove: false,
+ showEventToApprove: false,
+ showAttendees: false,
+ showAttendeeModal: false,
+ showEditEventToApprove: false,
+ }
+ eventToaprove: any = {
+ back: false,
+ serialNumber: "",
+ saveData: {}
+ }
- constructor(
+ /**
+ * @description determinant if edit or add event component is open
+ */
+ IsEvent: "edit" | "add" | "view";
+ viewingEventObject: CalendarEvent;
+ loggeduser: LoginUserRespose;
+
+ monthNum;
+ yearNum;
+
+ dropdownScrollWeal = false
+ CalendarStore = CalendarStore
+ listToPresent
+ array = []
+
+ sessionStore = SessionStore;
+
+ constructor(
private alertCtrl: AlertController,
@Inject(LOCALE_ID) private locale: string,
private modalCtrl: ModalController,
- private eventService: EventsService,
+ public eventService: EventsService,
private router: Router,
- private alertCrontroller: AlertService
- ) {}
+ private sanitizer: DomSanitizer,
+ authService: AuthService,
+ private dateAdapter: DateAdapter
,
+ private toastService: ToastService,
+ private listBoxService: ListBoxService,
+ private changeProfileService: ChangeProfileService,
+ private sqliteservice: SqliteService,
+ private platform: Platform,
+ private backgroundservice: BackgroundService,
+ public ThemeService: ThemeService,
+ private storage:Storage
+ ) {
+
+ this.dateAdapter.setLocale('es');
+ this.locale = 'pt'
+
+ this.loggeduser = authService.ValidatedUser;
+
+ this.changeProfileService.registerCallback(() => {
+ this.tigerUpdate()
+ if (this.loggeduser.Profile == 'MDGPR') {
+ this.mobileComponent.showEventList = true;
+ this.profile = "mdgpr";
+ } else if (this.loggeduser.Profile == 'PR') {
+ this.profile = "pr";
+ } else {
+ this.profile = "mdgpr";
+ }
+
+ this.CalendarStore.ResetList([])
+
+ })
+
+ if (this.loggeduser.Profile == 'MDGPR') {
+ this.mobileComponent.showEventList = true;
+ this.profile = "mdgpr";
+ } else if (this.loggeduser.Profile == 'PR') {
+ this.profile = "pr";
+ } else {
+ if(this.eventService.calendarIds.length >= 2) {
+ this.profile = "mdgpr";
+ } else if (this.eventService.hasOwnCalendar) {
+ this.profile = "mdgpr";
+ } else if (this.eventService.hasSharedCalendar) {
+ this.profile = "pr";
+ }
+
+ }
+
+ this.calendarHeight = "356px";
+ this.showCalendar = true;
+ this.timelineDate = momentG(new Date(), 'dd MMMM yyyy');
+
+ this.showLoader = false;
+ this.showTimelineFilterState = false;
+ this.showTimeline = false;
+
+
+ this.tigerUpdate()
+
+ window['year'] = this.changeYear
+
+ }
+
+ tigerUpdate() {
+ setTimeout(() => {
+ try {
+ this.myCal.update();
+ this.myCal.loadEvents();
+ } catch (e) { }
+
+ this.updateEventListBox()
+
+ }, 1000)
+ }
ngOnInit() {
- //Inicializar segment
- /* localStorage.setItem('test', this.eventSelectedDate.toString()); */
- this.router.events.forEach((event) => {
- if(event instanceof NavigationEnd && event.url == "/home/agenda") {
- if (this.segment == null)
- {
- this.segment = "Combinada";
+ //this.getFromDB();
+
+ setTimeout(() =>{
+ const pathname = window.location.pathname
+ let realoadCounter = 0
+ this.router.events.forEach((event) => {
+ if (event instanceof NavigationEnd && event.url == pathname) {
+ if (this.segment == null) {
+ this.segment = "Combinado";
+ }
+ if (realoadCounter != 0) {
+ this.loadRangeEvents(this.rangeStartDate, this.rangeEndDate);
+ }
+ realoadCounter++;
}
- else
- {
- this.loadRangeEvents(this.rangeStartDate, this.rangeEndDate);
+ });
+
+ this.backgroundservice.registerBackService('Online', () => {
+ //this.loadRangeEvents(this.rangeStartDate, this.rangeEndDate);
+ });
+
+ window.onresize = (event) => {
+ // if not table remove all component
+ if (window.innerWidth <= 1024) {
+ this.cloneAllmobileComponent();
}
- }
- });
+ };
+ }, 1000)
}
-
-
//Go to the next view of the calendar month/week/day
- next(){
+ next() {
this.myCal.slideNext();
+ this.myCal.loadEvents();
+ this.myCal.update();
}
//Go to the previous view of the calendar
- back(){
+ back() {
this.myCal.slidePrev();
+ this.myCal.loadEvents();
+ this.myCal.update();
}
+
//Shows the title of your view
- onViewTitleChanged(title){
+ onViewTitleChanged(title) {
this.viewTitle = title;
}
+
+ // show information about the clicked event in timeline
+ eventClicked(event: CalendarEvent): void {
+ //clear
+
+ this.setIntervenient([]);
+ this.setIntervenientCC([]);
+ this.clearPostEvent();
+
+ this.IsEvent = "view";
+
+ this.viewingEventObject = event;
+
+ this.selectedEventId = event.id;
+ this.selectedEventCalendarId = event?.['event']?.CalendarId;
+
+ this.cloneAllmobileComponent();
+
+
+ this.showEventEditOrOpen = 'edit';
+
+ if (window.innerWidth <= 1024) {
+ this.viewEventDetail(event.id)
+ //this.router.navigate(["/home/agenda", event.id, 'agenda']);
+ } else {
+ this.cloneAllmobileComponent();
+
+ this.mobileComponent.showEventDetails = true;
+ }
+
+ }
+
+
//Show information of the event
- async onEventSelected(ev: { event: Event}){
+ async onEventSelected(ev: { event: Event }) {
+
this.router.navigate(["/home/agenda", ev.event.EventId, 'agenda']);
}
onCurrentChanged = (ev: Date) => {
- this.eventSelectedDate = ev;
+ // timeline change date
+ this.timelineDate = momentG(new Date(ev), 'dd MMMM yyyy');
+
+ this.monthNum = new Date(ev).getMonth()
+ this.yearNum = new Date(ev).getFullYear()
+
+ this.viewDate = new Date(ev);
+ // calendar change date
+ this.eventSelectedDate = new Date(ev);
+
+ this.updateEventListBox()
+
};
- /* onTimeSelected = (ev: { selectedTime: Date, events: any[] }) => {
- console.log('Selected time: ' + ev.selectedTime + ', hasEvents: ' + (ev.events !== undefined && ev.events.length !== 0));
- this.eventSelectedDate2 = ev.selectedTime;
- }; */
+ onDropDownScrollWeal() {
- onRangeChanged (ev: { startTime: Date, endTime: Date }) {
+ setTimeout(() => {
+ document.querySelector('.dropdown-scroll-weel').querySelectorAll('.active')[0].scrollIntoView({ behavior: 'smooth', block: 'center' });
+ setTimeout(() => {
+ document.querySelector('.dropdown-scroll-weel').querySelectorAll('.active')[1].scrollIntoView({ behavior: 'smooth', block: 'center' });
+ }, 300)
+ }, 10)
+
+ }
+
+ // changedate
+ dropDownChangeDate(id: string) {
+ /* const currentCandarDayYear = formatDate(this.eventSelectedDate,'dd -- yyyy', 'pt');
+ const newDate = new Date(currentCandarDayYear.replace('--',id));
+ this.onCurrentChanged(newDate); */
+ }
+
+ onTimeSelected = (ev: { selectedTime: Date, events: any[] }) => {
+ this.eventSelectedDate2 = ev.selectedTime;
+ }
+
+ onRangeChanged(ev: { startTime: Date, endTime: Date }) {
this.rangeStartDate = ev.startTime;
this.rangeEndDate = ev.endTime;
this.loadRangeEvents(this.rangeStartDate, this.rangeEndDate);
- };
- async openCalModal() {
- const modal = await this.modalCtrl.create({
- component: CalModalPage,
- componentProps:{
- segment: this.segment,
- eventSelectedDate: this.eventSelectedDate,
- },
- cssClass: 'cal-modal',
- backdropDismiss: false
- });
- await modal.present();
+ try {
+ this.myCal.update();
+ this.myCal.loadEvents();
+ } catch (e) { }
+
+ this.updateEventListBox()
- modal.onDidDismiss().then((data) => {
- let postEvent: Event = data['data'];
- if (postEvent.Subject != null)
- {
- this.eventSource.push({
- title: postEvent.Subject,
- startTime: new Date(postEvent.StartDate),
- endTime: new Date(postEvent.EndDate),
- allDay: false,
- event: postEvent
- });
- this.myCal.update();
- this.myCal.loadEvents();
- this.loadRangeEvents(this.rangeStartDate, this.rangeEndDate);
- }
- });
}
-
- async loadRangeEvents(startTime: Date, endTime: Date){
+
+ // for calendar
+ currentDayEventDisplayBorder(day: any, id: any) {
+
+ const events = day[id].events;
+
+ if (events.length == 0) {
+
+ return "";
+
+ } else if (events.length >= 1) {
+
+ let classs = [];
+
+ events.forEach(element => {
+
+ const profile_ = element.profile == 'md' ? 'mdgpr' : 'pr';
+ const eventtype = element.event.CalendarName;
+
+
+ // if (startTimeSamp < endTimeSamp && endDay == 29 && (endMinutes + endHours) == 0) {
+ // //
+ // classs.push(`calendar-event-border`);
+ // }
+
+ classs.push(`calendar-event-border calendar-${profile_}-event-type-${eventtype}`);
+
+ });
+
+ return classs.join(' ');
+ }
+
+ return "";
+ }
+
+ // for timeline
+
+ get CalendarCurrentDay(): any {
+
+ return this.viewDate.getDate()
+ }
+
+ // for timeline
+ timelineIsCurrentDate(): Boolean {
+ return momentG(new Date(), 'dd MMMM yyyy', 'pt') == momentG(this.eventSelectedDate, 'dd MMMM yyyy', 'pt');
+ }
+
+ momentG(date, formate, wgs) {
+ return momentG(date, formate, wgs)
+ }
+
+
+ // for timeline
+ timelineFilter(calendarName, eventsList, profile) {
+
+ this.timelineFilterState = calendarName;
+
+ // remove all event
+ let events = [];
+
+ this.showTimelineFilterState = false;
+
+ eventsList.forEach((element, eventIndex) => {
+
+ // timeline start
+ const startHours = new Date(element.StartDate).getHours().toLocaleString();
+ const EndHours = new Date(element.EndDate).getHours().toLocaleString();
+
+ events.push({
+ start: setHours(setMinutes(new Date(element.StartDate), 0), parseInt(startHours)),
+ end: setHours(setMinutes(new Date(element.EndDate), 0), parseInt(EndHours)),
+ color: {
+ primary: '#0000',
+ secondary: '#0000'
+ },
+ id: element.EventId,
+ index: eventIndex,
+ profile: profile,
+ CalendarName: element.CalendarName,
+ event: element,
+ Subject: element.Subject
+ });
+
+ });
+
+ return events;
+ }
+
+ eventFilter() { }
+
+ TimelineDayEvent(day): string {
+ return (day).padStart(2, '0') + ' ' + this.viewTitle
+ }
+
+ get calendarDay(): string {
+
+ return ((new Date(this.timelineDate)).getDate()).toString().padStart(2, '0')
+ }
+
+ EventTretment({ startTime, endTime }) {
+
+ const startTimeSamp = new Date(startTime).toLocaleDateString()
+ const endTimeSamp = new Date(endTime).toLocaleDateString()
+
+ const endMinutes = new Date(endTime).getMinutes()
+ const endHours = new Date(endTime).getHours()
+
+
+ if (startTimeSamp < endTimeSamp && (endMinutes + endHours) == 0) {
+ endTime = new Date(endTime);
+ endTime.setSeconds(endTime.getSeconds() - 1);
+ return new Date(endTime)
+ } else {
+ return new Date(endTime)
+ }
+
+ }
+
+ loadRangeEvents(startTime: Date, endTime: Date) {
+ this.array = [];
+
+ this.rangeStartDate = startTime
+ this.rangeEndDate = endTime
+
this.showLoader = true;
- switch (this.segment)
- {
- case "Combinada":
- //Inicializa o array eventSource
- this.eventSource=[];
- this.eventService.getAllEvents(formatDate(startTime, 'yyyy-MM-dd HH:mm:ss', 'pt'), formatDate(endTime, 'yyyy-MM-dd HH:mm:ss', 'pt')).subscribe(
- response => {
- this.eventsList = response;
- this.eventsList.forEach(element => {
- this.eventSource.push({
- title: element.Subject,
- startTime: new Date(element.StartDate),
- endTime: new Date(element.EndDate),
- allDay: false,
- event: element
- });
- });
+ if (window.innerWidth < 800) {
+
+ if (this.profile == "mdgpr" && this.loggeduser.Profile == 'MDGPR') {
+ this.eventService.getAllMdEvents(momentG(new Date(startTime), 'yyyy-MM-dd HH:mm:ss'), momentG(new Date(endTime), 'yyyy-MM-dd 23:59:59')).then(
+
+ (response: any) => {
+
+ this.addEventToDB(response, "md");
+
+ // calendar
+ this.CalendarStore.removeRange(startTime, endTime, 'md')
+
+ // loop
+ this.CalendarStore.pushEvent(response, 'md');
+
+ this.listToPresent = this.CalendarStore.eventSource
+ this.trasnformData(response, 'md');
+
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'md', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+ this.myCal.update();
+ this.myCal.loadEvents();
+
+ this.showLoader = false;
+ this.showTimeline = true;
+
+ }).catch((error) => {
+ this.getFromDB();
+ }).finally(() => {
+ this.showLoader = false;
+ })
+
+ }
+ // view PR calendar with MDGPR profile
+ else if (this.profile == "pr" && this.loggeduser.Profile == 'MDGPR') {
+
+ this.eventService.getAllSharedEvents(momentG(new Date(startTime), 'yyyy-MM-dd HH:mm:ss'), momentG(new Date(endTime), 'yyyy-MM-dd 23:59:59')).then((response: any) => {
+ this.addEventToDB(response, "pr");
+
+ this.CalendarStore.removeRange(startTime, endTime, 'pr')
+ // calendar
+ this.CalendarStore.pushEvent(response, 'pr');
+
+ this.listToPresent = this.CalendarStore.eventSource
+
+
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+ //
this.myCal.update();
this.myCal.loadEvents();
- this.showLoader = false;
- }
- );
- break;
- case "Pessoal":
- //Inicializa o array eventSource
- this.eventSource=[];
- this.eventService.getEvents(this.segment, formatDate(startTime, 'yyyy-MM-dd HH:mm:ss', 'pt'), formatDate(endTime, 'yyyy-MM-dd HH:mm:ss', 'pt')).subscribe(
- response => {
- this.eventsListPessoal = response;
- this.eventsListPessoal.forEach(element => {
- this.eventSource.push({
- title: element.Subject,
- startTime: new Date(element.StartDate),
- endTime: new Date(element.EndDate),
- allDay: false,
- event: element
- });
- });
+ this.showLoader = false;
+ this.showTimeline = true;
+
+ }).catch((error) => {
+ this.getFromDB()
+ })
+ .finally(() => {
+ this.showLoader = false;
+ })
+
+ }
+ else if (this.loggeduser.Profile == 'PR') {
+ this.eventService.getAllPrEvents(momentG(new Date(startTime), 'yyyy-MM-dd HH:mm:ss'), momentG(new Date(endTime), 'yyyy-MM-dd 23:59:59')).then(
+ (response: any) => {
+ this.addEventToDB(response, "pr");
+
+ // clear the current month only
+ // response == september
+ // startTime = 1, endTime = 31
+ this.CalendarStore.removeRange(startTime, endTime, 'pr')
+ this.CalendarStore.pushEvent(response, 'pr');
+
+ this.listToPresent = this.CalendarStore.eventSource
+
+
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+ //
+
this.myCal.update();
this.myCal.loadEvents();
+
this.showLoader = false;
- }
- );
- break;
-
- case "Oficial":
- //Inicializa o array eventSource
- this.eventSource=[];
- this.eventService.getEvents(this.segment, formatDate(startTime, 'yyyy-MM-dd HH:mm:ss', 'pt'), formatDate(endTime, 'yyyy-MM-dd HH:mm:ss', 'pt')).subscribe(
- response => {
- this.eventsListOficial = response;
- this.eventsListOficial.forEach(element => {
- this.eventSource.push({
- title: element.Subject,
- startTime: new Date(element.StartDate),
- endTime: new Date(element.EndDate),
- allDay: false,
- event: element
- });
- });
+ this.showTimeline = true;
+
+
+ }).catch((error) => {
+ this.getFromDB()
+ })
+ .finally(() => {
+ this.showLoader = false;
+ })
+ } else if (this.loggeduser.Profile != 'PR' && this.loggeduser.Profile != 'MDGPR'){
+ if(this.profile == "mdgpr") {
+
+ this.eventService.getAllOwnEvents(momentG(new Date(startTime), 'yyyy-MM-dd HH:mm:ss'), momentG(new Date(endTime), 'yyyy-MM-dd 23:59:59')).then(
+
+ (response: any) => {
+
+ this.addEventToDB(response, "md");
+
+ // calendar
+ this.CalendarStore.removeRange(startTime, endTime, 'md')
+
+ // loop
+ this.CalendarStore.pushEvent(response, 'md');
+
+
+ this.listToPresent = this.CalendarStore.eventSource
+ this.trasnformData(response, 'md');
+
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'md', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+ //
+ this.myCal.update();
+ this.myCal.loadEvents();
+
+ this.showLoader = false;
+ this.showTimeline = true;
+
+ }).catch((error) => {
+ this.getFromDB();
+ }).finally(() => {
+ this.showLoader = false;
+ })
+
+ } else if (this.profile == "pr" ) {
+
+ this.eventService.genericGetAllSharedEvents(momentG(new Date(startTime), 'yyyy-MM-dd HH:mm:ss'), momentG(new Date(endTime), 'yyyy-MM-dd 23:59:59')).then((response: any) => {
+ this.addEventToDB(response, "pr");
+
+ this.CalendarStore.removeRange(startTime, endTime, 'pr')
+ // calendar
+ this.CalendarStore.pushEvent(response, 'pr');
+
+ this.listToPresent = this.CalendarStore.eventSource
+
+
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+ //
this.myCal.update();
this.myCal.loadEvents();
+
+ this.showLoader = false;
+ this.showTimeline = true;
+
+ }).catch((error) => {
+ this.getFromDB()
+ }).finally(() => {
+ this.showLoader = false;
+ })
+
+ }
+ }
+
+ } else {
+ // Desktop only
+
+ let counter = 0;
+
+ if (this.loggeduser.Profile == 'MDGPR') {
+
+ this.eventService.getAllMdEvents(momentG(new Date(startTime), 'yyyy-MM-dd HH:mm:ss'), momentG(new Date(endTime), 'yyyy-MM-dd 23:59:59')).then((response: any) => {
+
+ this.addEventToDB(response, "md");
+ let eventsList = response;
+
+ this.CalendarStore.removeRange(startTime, endTime, 'md')
+
+ // loop
+ this.CalendarStore.pushEvent(eventsList, 'md');
+
+ this.listToPresent = this.CalendarStore.eventSource
+
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'md', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+ //
+ this.myCal.update();
+ this.myCal.loadEvents();
+
+ this.showTimelineMD = true;
+
+ counter++;
+ if (counter == 2) {
this.showLoader = false;
}
- );
- break;
- }
+
+
+ }).catch((error) => {
+ this.getFromDB()
+ }).finally(() => {
+ counter++;
+ if (counter == 2) {
+ this.showLoader = false;
+ }
+ })
+
+ this.eventService.getAllSharedEvents(momentG(new Date(startTime), 'yyyy-MM-dd HH:mm:ss'), momentG(new Date(endTime), 'yyyy-MM-dd 23:59:59')).then((response: any) => {
+
+ this.addEventToDB(response, "pr");
+ let eventsList = response;
+
+ // clear the current month only
+ this.CalendarStore.removeRange(startTime, endTime, 'pr')
+
+
+ this.CalendarStore.pushEvent(eventsList, 'pr');
+ this.listToPresent = this.CalendarStore.eventSource
+
+
+ this.TimelinePRList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+ //
+
+ this.myCal.update();
+ this.myCal.loadEvents();
+
+ this.showTimelinePR = true;
+
+ counter++;
+
+ if (counter == 2 || this.loggeduser.Profile == 'PR') {
+ this.showLoader = false;
+ }
+
+ }).catch((error) => {
+ this.getFromDB()
+ }).finally(() => {
+ counter++;
+ if (counter == 2) {
+ this.showLoader = false;
+ }
+ })
+
+ } else if(this.loggeduser.Profile == 'PR') {
+
+ // view PR calendar with PR profile
+ this.eventService.getAllPrEvents(momentG(new Date(startTime), 'yyyy-MM-dd HH:mm:ss'), momentG(new Date(endTime), 'yyyy-MM-dd 23:59:59')).then((response: any) => {
+
+ this.addEventToDB(response, "pr");
+ let eventsList;
+ if (this.segment == 'Oficial') {
+ eventsList = response.filter(data => data.CalendarName == "Oficial");
+ } else if (this.segment == 'Pessoal') {
+ eventsList = response.filter(data => data.CalendarName == "Pessoal");
+ } else {
+ eventsList = response;
+ }
+
+ // clear the current month only
+ this.CalendarStore.removeRange(startTime, endTime, 'pr')
+
+ this.CalendarStore.pushEvent(eventsList, 'pr');
+ this.listToPresent = this.CalendarStore.eventSource
+
+ this.TimelinePRList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+
+ //
+ this.myCal.update();
+ this.myCal.loadEvents();
+
+ this.showTimelinePR = true;
+
+ counter++;
+
+ if (counter == 1 || this.loggeduser.Profile == 'PR') {
+ this.showLoader = false;
+ }
+
+ }).catch((error) => {
+ this.getFromDB()
+ }).finally(() => {
+ if (counter == 1 || this.loggeduser.Profile == 'PR') {
+ this.showLoader = false;
+ }
+ })
+
+ } else {
+
+ if(this.loggeduser.OwnerCalendars.length != 0 ) {
+
+ this.eventService.getAllOwnEvents(momentG(new Date(startTime), 'yyyy-MM-dd HH:mm:ss'), momentG(new Date(endTime), 'yyyy-MM-dd 23:59:59')).then((response: any) => {
+
+ this.addEventToDB(response, "md");
+ let eventsList = response;
+
+ this.CalendarStore.removeRange(startTime, endTime, 'md')
+
+ // loop
+ this.CalendarStore.pushEvent(eventsList, 'md');
+
+ this.listToPresent = this.CalendarStore.eventSource
+
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'md', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+ this.myCal.update();
+ this.myCal.loadEvents();
+
+ this.showTimelineMD = true;
+
+ counter++;
+ if (counter == 2) {
+ this.showLoader = false;
+ }
+
+
+ }).catch((error) => {
+ this.getFromDB()
+ }).finally(() => {
+ counter++;
+ if (counter == 2) {
+ this.showLoader = false;
+ }
+ })
+ } else {
+ counter++;
+ if (counter == 2) {
+ this.showLoader = false;
+ }
+ }
+
+
+
+ if(this.loggeduser.SharedCalendars.length != 0 ) {
+
+
+ this.eventService.genericGetAllSharedEvents(momentG(new Date(startTime), 'yyyy-MM-dd HH:mm:ss'), momentG(new Date(endTime), 'yyyy-MM-dd 23:59:59')).then((response: any) => {
+
+ this.addEventToDB(response, "pr");
+ let eventsList = response;
+
+ // clear the current month only
+ this.CalendarStore.removeRange(startTime, endTime, 'pr')
+
+
+ this.CalendarStore.pushEvent(eventsList, 'pr');
+ this.listToPresent = this.CalendarStore.eventSource
+
+
+ this.TimelinePRList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+ //
+
+ this.myCal.update();
+ this.myCal.loadEvents();
+
+ this.showTimelinePR = true;
+
+ counter++;
+
+ if (counter == 2 || this.loggeduser.Profile == 'PR') {
+ this.showLoader = false;
+ }
+
+ }).catch((error) => {
+ this.getFromDB()
+ })
+ .finally(() => {
+ counter++;
+ if (counter == 2) {
+ this.showLoader = false;
+ }
+ })
+ } else {
+ counter++;
+ if (counter == 2) {
+ this.showLoader = false;
+ }
+ }
+
+ }
+
+ }
}
- doRefresh(ev: any){
- this.loadRangeEvents(this.rangeStartDate, this.rangeEndDate);
+ trasnformData(response, profile) {
+
+ response.forEach(element => {
+ let event = {
+ startTime: new Date(element.StartDate),
+ endTime: new Date(element.EndDate),
+ allDay: false,
+ event: element,
+ calendarName: element.CalendarName,
+ profile: profile,
+ id: element.EventId,
+ }
+ this.array.push(event)
+ });
+ this.listToPresent = this.array;
+
+ }
+ //Deve ser removido para ficar só um method transform
+ trasnformDataDB(response) {
+
+ if(response) {
+
+ response.forEach(element => {
+ let event = {
+ startTime: new Date(element.StartDate),
+ endTime: new Date(element.EndDate),
+ allDay: false,
+ event: element,
+ calendarName: element.CalendarName,
+ profile: element.Profile,
+ id: element.EventId,
+ }
+ this.array.push(event)
+ });
+ this.listToPresent = this.array;
+
+ }
+
+ }
+
+ addEventToDB(response, profile) {
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+ let responseArray = [];
+ response.forEach(element => {
+ let event = {
+ CalendarId: element.CalendarId,
+ CalendarName: element.CalendarName,
+ EndDate: element.EndDate,
+ EventId: element.EventId,
+ HasAttachments: element.HasAttachments,
+ HumanDate: element.HumanDate,
+ IsAllDayEvent: element.IsAllDayEvent,
+ Location: element.Location,
+ StartDate: element.StartDate,
+ Subject: element.Subject,
+ Profile: profile
+ }
+ responseArray.push(event)
+
+ });
+ this.storage.set('agendaResponse',responseArray).then(() => {
+
+ })
+ } else {
+ if (response.length > 0) {
+
+ response.forEach(element => {
+ let event = {
+ CalendarId: element.CalendarId,
+ CalendarName: element.CalendarName,
+ EndDate: element.EndDate,
+ EventId: element.EventId,
+ HasAttachments: element.HasAttachments,
+ HumanDate: element.HumanDate,
+ IsAllDayEvent: element.IsAllDayEvent,
+ Location: element.Location,
+ StartDate: element.StartDate,
+ Subject: element.Subject,
+ Profile: profile
+ }
+ this.sqliteservice.addEvent(event)
+
+ });
+ }
+ }
+ }
+
+ getFromDB() {
+
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+ this.storage.get('agendaResponse').then((events) => {
+ this.trasnformDataDB(events)
+ this.updateEventListBox()
+
+ this.myCal.update();
+ this.myCal.loadEvents();
+
+ this.showLoader = false;
+ this.showTimeline = true;
+ })
+ } else {
+ this.sqliteservice.getAllEvents().then((events: any[]) => {
+
+ let eventArray = [];
+
+ this.trasnformDataDB(events)
+ this.updateEventListBox()
+
+ this.myCal.update();
+ this.myCal.loadEvents();
+
+ this.showLoader = false;
+ this.showTimeline = true;
+
+
+ })
+ }
+
+ }
+
+
+ getEventsFromDB () {
+
+ new Promise((resolve, reject)=>{
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+ this.storage.get('agendaResponse').then((events) => {
+ resolve(events)
+ })
+ } else {
+ this.sqliteservice.getAllEvents().then((events: any[]) => {
+ resolve(events)
+
+ })
+ }
+ })
+
+
+ }
+
+ updateEventListBox() {
+
+ if (window.innerWidth < 800) {
+
+ switch (this.segment) {
+ case "Combinado":
+
+ if (this.profile == "mdgpr" && this.loggeduser.Profile == 'MDGPR') {
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'md', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+ }
+ else if (this.profile == "pr" && this.loggeduser.Profile == 'MDGPR') {
+
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+ }
+ else if (this.loggeduser.Profile == 'PR') {
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+ } else {
+
+ if(this.profile == "pr") {
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+ } else if (this.profile == "mdgpr") {
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'md', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+ }
+
+ }
+ break;
+
+ case "Pessoal":
+ //Inicializa o array eventSource
+ if (this.profile == "mdgpr" && this.loggeduser.Profile == 'MDGPR') {
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'md', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+ }
+ else if(this.loggeduser.Profile == 'PR') {
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+ this.TimelinePRList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+ } else {
+ if(this.profile == "pr") {
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+ } else if (this.profile == "mdgpr") {
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'md', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+ }
+ }
+ break;
+
+ case "Oficial":
+
+ if (this.profile == "mdgpr" && this.loggeduser.Profile == 'MDGPR') {
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'md', this.rangeStartDate, this.rangeEndDate, {segment: this.segment, selectedDate: this.eventSelectedDate})
+
+ } else if(this.loggeduser.Profile == 'PR') {
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+ this.TimelinePRList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+ } else {
+ if(this.profile == "pr") {
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+ } else if (this.profile == "mdgpr") {
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'md', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+ }
+ }
+ break;
+
+ }
+ } else {
+
+ this.TimelinePRList = this.listBoxService.list(this.CalendarStore.eventSource, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+ this.TimelineMDList = this.listBoxService.list(this.CalendarStore.eventSource, 'md', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+ }
+
+ }
+
+ changeYear = (year) => {
+ const a = this.calendar.currentDate
+
+ const isInvalidDate = (dateString) => JSON.stringify(new Date(dateString)) === 'null';
+
+ const newDate = new Date(year, a.getMonth(), a.getDay());
+
+ if (!(isInvalidDate(newDate))) {
+ this.calendar.currentDate = newDate
+
+ try {
+ this.myCal.update();
+ this.myCal.loadEvents();
+ this.onDropDownScrollWeal()
+ } catch (e) { }
+
+ this.updateEventListBox()
+ } else {
+
+ }
+
+
+ }
+
+ changeMonth = (month) => {
+ const a = this.calendar.currentDate;
+
+
+ const isInvalidDate = (dateString) => JSON.stringify(new Date(dateString)) === 'null';
+
+ const newDate = new Date(a.getFullYear(), month, a.getDay());
+
+ if (!(isInvalidDate(newDate))) {
+ this.calendar.currentDate = newDate
+
+ try {
+ this.myCal.update();
+ this.myCal.loadEvents();
+ this.onDropDownScrollWeal()
+ } catch (e) { }
+
+ this.updateEventListBox()
+ } else {
+
+ }
+ }
+
+
+ get viewEventMonth() {
+ return this.viewDate.getMonth()
+ }
+
+ dateMonth(event: any) {
+ return new Date(event.start).getMonth()
+ }
+
+ eventListVisible(event) {
+ return momentG(event, 'MMMM yyyy') == momentG(this.calendar.currentDate, 'MMMM yyyy')
+ }
+
+
+ actions() { }
+
+ doRefresh(ev: any) {
+ this.loadRangeEvents(this.rangeStartDate, this.rangeEndDate);
setTimeout(() => {
ev.target.complete();
- }, 250);
- }
- showAlert(){
- this.alertCrontroller.presentAlert("Funcionalidade em desenvolvimento.");
+ }, 250)
+ }
+
+ changeProfile() {
+
+ if (this.profile == "mdgpr") {
+ this.profile = "pr";
+ this.loadRangeEvents(this.rangeStartDate, this.rangeEndDate);
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'pr', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+
+ }
+ else {
+ this.profile = "mdgpr";
+ this.loadRangeEvents(this.rangeStartDate, this.rangeEndDate);
+ this.TimelineMDList = this.listBoxService.list(this.listToPresent, 'md', this.rangeStartDate, this.rangeEndDate, { segment: this.segment, selectedDate: this.eventSelectedDate })
+ }
+
+ }
+
+ async openAddEvent() {
+
+ await this.cloneAllmobileComponent();
+
+ this.showEventEditOrOpen = 'add';
+ this.IsEvent = 'add';
+
+ if (window.innerWidth <= 1024) {
+ const modal = await this.modalCtrl.create({
+ component: NewEventPage,
+ componentProps: {
+ segment: this.segment,
+ profile: this.profile,
+ eventSelectedDate: this.eventSelectedDate
+ },
+ cssClass: 'modal modal-desktop',
+ backdropDismiss: false
+ });
+ await modal.present();
+ modal.onDidDismiss().then((data) => {
+ if (data) {
+
+ }
+ this.openAddEventDismiss(data['data'])
+ });
+ } else {
+ this.mobileComponent.showAddNewEvent = true;
+ }
+ }
+
+
+ openEditEvent() {
+ this.showEventEditOrOpen = 'edit';
+
+ }
+
+ openAddEventDismiss(data) {
+
+ let postEvent: Event = data;
+ if (postEvent.Subject != null) {
+ // this.eventSource.push({
+ // title: postEvent.Subject,
+ // startTime: new Date(postEvent.StartDate),
+ // endTime: new Date(postEvent.EndDate),
+ // allDay: false,
+ // event: postEvent
+ // });
+ this.myCal.update();
+ this.myCal.loadEvents();
+ this.loadRangeEvents(this.rangeStartDate, this.rangeEndDate);
+ }
+
+ this.cloneAllmobileComponent();
+ }
+
+ // open component
+ async viewEventDetail(eventId: any) {
+
+ const CalendarId = this.selectedEventCalendarId
+
+ let navigationExtras: NavigationExtras = { queryParams: { CalendarId } }
+
+ this.router.navigate(['/home/agenda/',eventId,'agenda'], navigationExtras);
+
+ }
+
+ // open component
+ async viewEventDetailDismiss(data) {
+
+ await this.cloneAllmobileComponent()
+
+ if (data.type == 'edit') {
+
+ this.selectedEvent = data.event;
+ this.postEvent = data.event;
+
+ this.mobileComponent.showEditEvent = true;
+ }
+
+ this.loadRangeEvents(this.rangeStartDate, this.rangeEndDate);
+ }
+
+
+ // called from this template and child event
+ async viewEventsToApprove() {
+ await this.cloneAllmobileComponent();
+
+ if (window.innerWidth <= 801) {
+ this.router.navigate(['/home/agenda/event-list']);
+ } else {
+ // hide all components
+ this.cloneAllmobileComponent();
+ this.mobileComponent.transparentEventList = false;
+ this.mobileComponent.showEventList = true;
+ }
+ }
+
+ approveEventDismissGoBack() {
+
+ window['temp.path:/shared/agenda/edit-event-to-approve.ts'] = {}
+
+ this.cloneAllmobileComponent()
+
+ this.mobileComponent.showEventToApprove = true;
+ this.mobileComponent.showEditEventToApprove = false
+
+ }
+
+ approveEventDismiss({ saveData, serialNumber, action }) {
+
+ window['temp.path:/shared/agenda/edit-event-to-approve.ts'] = {}
+
+ if (action == 'Aprovar') {
+ this.eventToaprove = {
+ back: true,
+ saveData: saveData,
+ serialNumber: serialNumber,
+ action: action,
+ InstanceId: saveData.workflowInstanceDataFields.InstanceId || ""
+ }
+
+ this.mobileComponent.showEventToApprove = true;
+ this.mobileComponent.showEventList = false
+
+ }
+
+ this.showEventEditOrOpen = "eventoToApprove"
+ }
+
+ closeEventToApprove() {
+ if (this.eventToaprove.back == true && this.mobileComponent.showEventList == true) {
+ this.mobileComponent.transparentEventList = false;
+ this.mobileComponent.showEventToApprove = false;
+ this.eventToaprove.back = false;
+
+ }
+ else {
+
+ this.mobileComponent.showEventToApprove = false;
+ this.mobileComponent.showEventList = false;
+ }
+
+ }
+
+ closeEventToApproveGoBack() {
+ if (window.innerWidth <= 801) {
+ this.router.navigate(['/home/agenda/event-list']);
+ } else {
+ // hide all components
+ this.cloneAllmobileComponent();
+ this.mobileComponent.transparentEventList = false;
+ this.mobileComponent.showEventList = true;
+ }
+ }
+
+ // called from emitters
+ /** @description open component to edit event to approve */
+ EditApproveEventDismiss() {
+ this.cloneAllmobileComponent();
+ this.mobileComponent.showEditEventToApprove = true;
+
+ this.taskParticipants = []
+ this.taskParticipantsCc = []
+ }
+
+ async cloneAllmobileComponent() {
+
+ this.mobileComponent.showAddNewEvent = false;
+ this.mobileComponent.showEditEvent = false;
+ this.mobileComponent.showEventDetails = false;
+ this.mobileComponent.showEventList = false;
+ this.mobileComponent.showEventToApprove = false;
+ this.mobileComponent.showAttendees = false;
+ this.mobileComponent.showAttendeeModal = false;
+ this.mobileComponent.showEditEventToApprove = false;
+
+ this.closeEventToApprove();
+ }
+
+ async AproveEventEditEvent(data) {
+ this.postEvent = data;
+ this.mobileComponent.transparentEventToApprove = true;
+ this.mobileComponent.showAddNewEvent = true;
+ }
+
+ // open component
+ async openAttendeesComponent(data) {
+
+ this.adding = data.type
+
+ this.cloneAllmobileComponent();
+ this.mobileComponent.showAttendees = true;
+ }
+
+ async clearContact() {
+ this.contacts = [];
+ }
+
+ async setContact(data: EventPerson[]) {
+ this.contacts = data;
+ }
+
+ async openAttendeeModal() {
+ this.cloneAllmobileComponent();
+ this.mobileComponent.showAttendeeModal = true;
+ }
+
+
+ async GoBackEditOrAdd() {
+
+ if (this.showEventEditOrOpen == "edit") {
+ this.cloneAllmobileComponent();
+
+ this.mobileComponent.showEditEvent = true;
+ } else if (this.showEventEditOrOpen == "add") {
+ this.cloneAllmobileComponent();
+
+ this.mobileComponent.showAddNewEvent = true;
+ } else if (this.showEventEditOrOpen == "eventoToApprove") {
+ this.cloneAllmobileComponent();
+ this.mobileComponent.showEditEventToApprove = true
+ }
+ else {
+ // do Nothings
+ }
+
+ }
+
+ async closeComponentEditEventOrAdd() {
+
+ if (this.IsEvent = 'edit') {
+ this.loadRangeEvents(this.rangeStartDate, this.rangeEndDate);
+ this.eventClicked(this.viewingEventObject);
+ } else if (this.IsEvent = 'add') {
+ this.cloneAllmobileComponent();
+ }
+ }
+
+ async EventToApproveGoBack() {
+
+ }
+
+ async setIntervenient(data) {
+
+ setTimeout(() => {
+ this.taskParticipants = removeDuplicate(data)
+ }, 10)
+
+ }
+
+ async setIntervenientCC(data) {
+ setTimeout(() => {
+ this.taskParticipantsCc = removeDuplicate(data)
+ }, 10)
+
+ }
+
+ // Emitters
+ // adding
+ async setAdding(adding: "intervenient" | "CC" = "intervenient") {
+ this.adding = adding;
+ }
+
+ async clearPostEvent() {
+ this.postEvent = false;
+ }
+
+ async changeSegment(segments: "Combinado" | "Pessoal" | "Oficial") {
+ this.segment = segments;
+
+ if (segments == 'Combinado') {
+ this.timelineFilterState = 'Todos'
+ } else {
+ this.timelineFilterState = segments
+ }
+ this.showTimelineFilterState = false;
+
+
+ // THIS LINE
+ this.updateEventListBox()
+
+
+ }
+
+
+ shoeEventDay(events: any[]) {
+
+ if (this.segment == 'Combinado') {
+ return true;
+ }
+
+ const reuslt = events.filter((e) => e.CalendarName == this.segment)
+
+ return reuslt.length != 0
}
-
}
diff --git a/src/app/pages/agenda/custom-date-formatter.provider.ts b/src/app/pages/agenda/custom-date-formatter.provider.ts
new file mode 100644
index 000000000..8ef589c0b
--- /dev/null
+++ b/src/app/pages/agenda/custom-date-formatter.provider.ts
@@ -0,0 +1,16 @@
+import { CalendarDateFormatter, DateFormatterParams } from 'angular-calendar';
+import { formatDate } from '@angular/common';
+import { Injectable } from '@angular/core';
+
+@Injectable()
+export class CustomDateFormatter extends CalendarDateFormatter {
+ // you can override any of the methods defined in the parent class
+
+ public dayViewHour({ date, locale }: DateFormatterParams): string {
+ return formatDate(date, 'HH', locale);
+ }
+
+ public weekViewHour({ date, locale }: DateFormatterParams): string {
+ return this.dayViewHour({ date, locale });
+ }
+}
diff --git a/src/app/pages/agenda/edit-event/edit-event-routing.module.ts b/src/app/pages/agenda/edit-event/edit-event-routing.module.ts
new file mode 100644
index 000000000..3616b2106
--- /dev/null
+++ b/src/app/pages/agenda/edit-event/edit-event-routing.module.ts
@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { EditEventPage } from './edit-event.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: EditEventPage
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class EditEventPageRoutingModule {}
diff --git a/src/app/pages/agenda/edit-event/edit-event.module.ts b/src/app/pages/agenda/edit-event/edit-event.module.ts
new file mode 100644
index 000000000..fbfb26ba7
--- /dev/null
+++ b/src/app/pages/agenda/edit-event/edit-event.module.ts
@@ -0,0 +1,50 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { EditEventPageRoutingModule } from './edit-event-routing.module';
+
+import { EditEventPage } from './edit-event.page';
+import { AttendeeModalPageModule } from 'src/app/shared/event/attendee-modal/attendee-modal.module';
+import { MatDatepickerModule } from '@angular/material/datepicker';
+import { MatInputModule } from '@angular/material/input';
+
+import { MatNativeDateModule } from '@angular/material/core';
+
+import {
+ NgxMatDatetimePickerModule,
+ NgxMatNativeDateModule,
+ NgxMatTimepickerModule
+} from '@angular-material-components/datetime-picker';
+
+import { ReactiveFormsModule } from '@angular/forms';
+import { MatButtonModule } from '@angular/material/button';
+import { MatSelectModule } from '@angular/material/select';
+import { NgxMatMomentModule } from '@angular-material-components/moment-adapter';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+ EditEventPageRoutingModule,
+ MatDatepickerModule,
+ MatInputModule,
+ MatNativeDateModule,
+ NgxMatDatetimePickerModule,
+ NgxMatTimepickerModule,
+ NgxMatNativeDateModule,
+ NgxMatMomentModule,
+ MatSelectModule,
+ MatButtonModule,
+ ReactiveFormsModule,
+ //
+ AttendeeModalPageModule
+ ],
+ declarations: [
+ EditEventPage
+ ]
+})
+export class EditEventPageModule {}
diff --git a/src/app/pages/agenda/edit-event/edit-event.page.html b/src/app/pages/agenda/edit-event/edit-event.page.html
new file mode 100644
index 000000000..e1d94b8c6
--- /dev/null
+++ b/src/app/pages/agenda/edit-event/edit-event.page.html
@@ -0,0 +1,350 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Oficial
+
+
+ Pessoal
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Reunião
+
+
+ Viagem
+
+
+ Conferência
+
+
+ Encontro
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{recurring.Description}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Adicionar documentos
+
+
+
+
+
+
+
+
+
+ {{document.SourceName}}
+
+
+
+
+
+
+ Correspondência
+ Acções Presidenciais
+ Arquivo Despacho Electrónico
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Cancelar
+ Gravar
+
+
diff --git a/src/app/pages/agenda/edit-event/edit-event.page.scss b/src/app/pages/agenda/edit-event/edit-event.page.scss
new file mode 100644
index 000000000..872268000
--- /dev/null
+++ b/src/app/pages/agenda/edit-event/edit-event.page.scss
@@ -0,0 +1,205 @@
+
+
+.title-content::after, .header-md::after{
+ display: none;
+}
+
+.content{
+ margin: 0;
+ float: left;
+ border-left: 1px solid #d8d8d8 !important;
+}
+ .main-header{
+ font-family: Roboto;
+ background-color: #fff;
+
+ overflow:hidden;
+ transform: translate3d(0, 1px, 0);
+
+ .title-content{
+ margin: 0px auto;
+ padding: 0 !important;
+ background: #fff;
+ .middle{
+ padding: 0!important;
+ float: left;
+ }
+ }
+
+ .title{
+ font-size: 25px;
+ }
+
+ }
+ .ion-item-container{
+ margin: 15px auto;
+ border: 1px solid #ebebeb;
+ border-radius: 5px;
+ padding-left: 10px;
+ }
+ .ion-item-container-no-border{
+ width: 100%;
+ margin: 0px auto;
+ padding: 0 !important;
+ }
+ .container-div{
+ margin-bottom: 15px;
+ float: left;
+ }
+ .ion-item-class-2{
+ margin: 0px auto;
+ }
+ .ion-icon-class{
+ width: 45px;
+ height: 45px;
+ float: left;
+ padding: 10px;
+ font-size: 25px;
+ }
+ ion-select{
+ padding-left: 5px;
+ margin-left: 0;
+ }
+ .ion-input-class{
+ width: calc(100% - 45px);
+ height: 45px;
+ border: 1px solid #ebebeb;
+ border-radius: 5px;
+ padding-left: 5px;
+ padding-right: 10px;
+ float: left;
+ }
+ .ion-input-class-no-height{
+ width: calc(100% - 45px);
+ border: 1px solid #ebebeb;
+ border-radius: 5px;
+ }
+ .list-people{
+ float: left;
+
+ }
+ .add-people{
+ width: 45px;
+ float: right;
+ overflow: auto;
+ font-size: 25px;
+ height: 45px;
+ display: flex;
+ }
+ .list-people-title{
+ /* font-size: 13px; */
+ color: #a3a3a3;
+ }
+ .attach-document{
+ font-size: 15px;
+ color: var(--title-text-color);;
+ margin: 5px 5px 5px 10px;
+ padding: 5px;
+ float: left;
+ }
+ .attach-icon{
+ width: 37px;
+ font-size: 35px;
+ float: left;
+ }
+ .attach-title-item{
+ width: 100%;
+ font-size: 15px;
+ color:var(--title-text-color);
+
+ }
+ /* SPAN */
+ .span-left{
+ float: left;
+ font-size: 15x;
+ }
+ .span-right{
+ text-align: right;
+ float: right;
+ font-size: 13px;
+ }
+ .container-footer{
+ margin:0 auto;
+ overflow: auto;
+ }
+ .button-cancel {
+ width: 170px;
+ height: 44px;
+ border-radius: 22.5px;
+ --background: #e0e9ee;
+ --color: #061b52;
+ margin:10px;
+ }
+ .button-save {
+ width: 170px;
+ height: 44px;
+ border-radius: 22.5px;
+ --background: #42b9fe;
+ --color:#ffffff;
+ margin:10px;
+ }
+
+ .text-input{
+ width: 100%;
+ border: 1px solid #ebebeb;
+ margin: 0px 15px 15px 0px;
+ padding: 0 !important;
+ border-radius: 5px;
+ }
+
+ /* Error Messages */
+ .error{
+ color:red;
+ font-size: 12px;
+ font-weight: bold;
+ padding-bottom: 20px;
+ }
+ .span-color{
+ color:red;
+ }
+
+
+ .buttons{
+ display: flex;
+ justify-content: space-between;
+ padding: 20px;
+ overflow: auto;
+ }
+
+
+
+ .app-name{
+ background: var(--title-text-color);
+ border-radius: 18px;
+ text-align: center;
+ display: flex;
+ align-items: center;
+ padding: 0px 5px;
+ color: white;
+ font-size: 9pt;
+ font-weight: 500;
+ height: 19px;
+ -webkit-border-radius: 18px;
+ -moz-border-radius: 18px;
+ -ms-border-radius: 18px;
+ -o-border-radius: 18px;
+ }
+
+
+.close-button {
+ display: none;
+ height: 20px;
+}
+
+
+.list:hover {
+
+ .app-name {
+ display: none;
+ }
+
+ .close-button {
+ display: block !important;
+ height: 20px;
+ }
+}
\ No newline at end of file
diff --git a/src/app/pages/agenda/edit-event/edit-event.page.spec.ts b/src/app/pages/agenda/edit-event/edit-event.page.spec.ts
new file mode 100644
index 000000000..509415955
--- /dev/null
+++ b/src/app/pages/agenda/edit-event/edit-event.page.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { EditEventPage } from './edit-event.page';
+
+describe('EditEventPage', () => {
+ let component: EditEventPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ EditEventPage ],
+ imports: [IonicModule.forRoot()]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(EditEventPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/agenda/edit-event/edit-event.page.ts b/src/app/pages/agenda/edit-event/edit-event.page.ts
new file mode 100644
index 000000000..153bcb0b3
--- /dev/null
+++ b/src/app/pages/agenda/edit-event/edit-event.page.ts
@@ -0,0 +1,517 @@
+import { Component, OnInit } from '@angular/core';
+import { FormControl, FormGroup, Validators } from '@angular/forms';
+import { Router } from '@angular/router';
+import { AlertController, ModalController, NavParams } from '@ionic/angular';
+import { Attachment } from 'src/app/models/attachment.model';
+import { EventBody } from 'src/app/models/eventbody.model';
+import { EventPerson } from 'src/app/models/eventperson.model';
+import { AttachmentsService } from 'src/app/services/attachments.service';
+import { EventsService } from 'src/app/services/events.service';
+import { ToastService } from 'src/app/services/toast.service';
+import { Event } from '../../../models/event.model';
+import { AttendeesPageModal } from '../../events/attendees/attendees.page';
+import { SearchPage } from '../../search/search.page';
+import { ThemeService } from 'src/app/services/theme.service';
+import { NgxMatDateFormats } from '@angular-material-components/datetime-picker';
+import { NGX_MAT_DATE_FORMATS } from '@angular-material-components/datetime-picker';
+import { SessionStore } from 'src/app/store/session.service';
+
+
+const CUSTOM_DATE_FORMATS: NgxMatDateFormats = {
+ parse: {
+ dateInput: "YYYY-MMMM-DD HH:mm"
+ },
+ display: {
+ dateInput: "DD MMM YYYY H:mm",
+ monthYearLabel: "MMM YYYY",
+ dateA11yLabel: "LL",
+ monthYearA11yLabel: "MMMM YYYY"
+ }
+}
+@Component({
+ selector: 'app-edit-event',
+ templateUrl: './edit-event.page.html',
+ styleUrls: ['./edit-event.page.scss'],
+ providers: [
+ { provide: NGX_MAT_DATE_FORMATS, useValue: CUSTOM_DATE_FORMATS },
+ ]
+})
+export class EditEventPage implements OnInit {
+
+ Form: FormGroup;
+ validateFrom = false
+
+ postEvent: Event;
+ isRecurring:string;
+ isEventEdited: boolean;
+ loadedEvent: Event;
+ eventBody: EventBody;
+ segment:string = "true";
+ profile:string;
+ eventAttendees: EventPerson[];
+ selectedSegment: string;
+ selectedDate: Date;
+ initCalendarName: string;
+ caller:string;
+ recurringTypes: any;
+ selectedRecurringType: any;
+
+ public date: any;
+ public disabled = false;
+ public showSpinners = true;
+ public showSeconds = false;
+ public touchUi = false;
+ public enableMeridian = false;
+ public minDate = new Date().toISOString().slice(0,10)
+ public endMinDate = new Date(new Date().getTime() + 15 * 60000).toISOString().slice(0,10)
+ public maxDate: any;
+ public stepHour = 1;
+ public stepMinute = 5;
+ public stepSecond = 5;
+ currentDate = new Date();
+
+ loadedEventAttachments: Attachment[] = [];
+ taskParticipants: any = [];
+ taskParticipantsCc: any = [];
+ adding: "intervenient" | "CC" = "intervenient";
+
+ showAttendees = false;
+
+ public listColors = ['primary', 'accent', 'warn'];
+ public stepHours = [1, 2, 3, 4, 5];
+ public stepMinutes = [1, 5, 10, 15, 20, 25];
+ public stepSeconds = [1, 5, 10, 15, 20, 25];
+
+ sesseionStora = SessionStore
+
+ constructor(
+ private modalController: ModalController,
+ private navParams: NavParams,
+ private eventsService: EventsService,
+ public alertController: AlertController,
+ private attachmentsService: AttachmentsService,
+ private toastService: ToastService,
+ private router: Router,
+ public ThemeService: ThemeService
+ ) {
+
+ /* this.postEvent = new Event(); */
+ this.isEventEdited = false;
+ /* this.postEvent.EventRecurrence = { Type:'-1', LastOccurrence:''}; */
+ this.postEvent = this.navParams.get('event');
+ console.log(this.postEvent);
+
+ this.caller = this.navParams.get('caller');
+ this.initCalendarName = this.postEvent.CalendarName;
+
+ if(this.postEvent){
+ if( this.postEvent.Body){
+ if(typeof(this.postEvent.Body.Text) == 'string'){
+ this.postEvent.Body.Text = this.postEvent.Body.Text.replace(/<[^>]+>/g, '');
+ }
+ }
+ }
+
+ if(this.postEvent.Attendees == null) {
+ this.taskParticipants = []
+ } else {
+
+ this.postEvent.Attendees.forEach(e =>{
+ if(e.IsRequired){
+ this.taskParticipants.push(e);
+ } else {
+ this.taskParticipantsCc.push(e);
+ }
+ })
+ }
+
+ if(this.postEvent.IsRecurring == false) {
+ this.isRecurring = "Não se repete";
+ }
+ else {
+ this.isRecurring = "Repete";
+ }
+
+ this.getAttachments(this.postEvent.EventId);
+
+ }
+
+ ngOnInit() {
+
+ window.onresize = (event) => {
+ // if not mobile remove all component
+ if( window.innerWidth >= 1024) {
+ this.modalController.dismiss();
+ }
+ }
+ if(window.innerWidth > 800){
+ this.showAttendees=true;
+ }
+
+ this.getRecurrenceTypes();
+ setTimeout(() => {
+ this.selectedRecurringType = this.postEvent.EventRecurrence.Type.toString();
+ }, 500);
+
+ }
+
+ close() {
+ this.modalController.dismiss();
+ }
+
+ goBack() {
+
+ this.router.navigate(['/home',this.caller]);
+ }
+
+ getRecurrenceTypes() {
+ this.eventsService.getRecurrenceTypes().subscribe(res=>{
+
+ this.recurringTypes = res;
+ });
+ }
+
+ onSelectedRecurringChanged(ev?:any) {
+
+ this.calculetedLastOccurrence(ev);
+
+ if(ev.length > 1){
+
+ this.selectedRecurringType = ev.filter(data => data != '-1');
+ }
+ if(ev.length == 0){
+ this.selectedRecurringType = "-1";
+ }
+ }
+
+ calculetedLastOccurrence(type:number){
+ console.log(type);
+ var valor;
+ var opcao: boolean;
+ if (type == 0) {
+ valor = 7;
+ opcao = true;
+ } else if(type == 1){
+ valor = 30;
+ opcao = true;
+ } else if(type == 2){
+ valor = 1;
+ opcao = false;
+ }else if(type == 3){
+ valor = 5;
+ opcao = false;
+ }
+ this.defineLastOccurrence(valor, opcao);
+ }
+
+
+ defineLastOccurrence(valor:number, opcao:boolean){
+ var time = new Date(this.postEvent.EndDate);
+ if (opcao == true) {
+ time.setDate(time.getDate() + valor);
+ this.postEvent.EventRecurrence.LastOccurrence = time;
+ } else {
+ time = new Date(
+ time.getFullYear() + valor,
+ time.getMonth(),
+ time.getDate(),
+ time.getHours(),
+ time.getMinutes()
+ );
+ this.postEvent.EventRecurrence.LastOccurrence = time;
+ }
+
+ }
+
+
+ runValidation() {
+ this.validateFrom = true
+ }
+
+ injectValidation() {
+
+ this.Form = new FormGroup({
+ Subject: new FormControl(this.postEvent.Subject, [
+ Validators.required,
+ // Validators.minLength(4)
+ ]),
+ Location: new FormControl(this.postEvent.Location, [
+ Validators.required,
+ ]),
+ CalendarName: new FormControl(this.postEvent.CalendarName, [
+ Validators.required
+ ]),
+ Categories: new FormControl(this.postEvent.Category, [
+ Validators.required
+ ]),
+ IsRecurring: new FormControl(this.postEvent.IsRecurring, [
+ Validators.required
+ ]),
+ Date: new FormControl(new Date(this.postEvent.StartDate).getTime() <= new Date(this.postEvent.EndDate).getTime()? 'ok': null,[
+ Validators.required
+ ]),
+
+ participantes: new FormControl(this.taskParticipants, [
+ Validators.required
+ ]),
+
+ })
+ }
+
+ openInicio() {
+ let input: any = document.querySelector('#new-inicio')
+ if(input) {
+
+ input.click()
+ }
+ }
+
+ openFim() {
+ let input: any = document.querySelector('#new-fim')
+ if(input) {
+ input.click()
+ }
+ }
+
+ openLastOccurrence() {
+ let input: any = document.querySelector('#last-occurrence')
+ if(input) {
+ input.click()
+ }
+ }
+
+
+ save() {
+
+ this.injectValidation()
+ this.runValidation()
+
+ if(this.Form.invalid) return false;
+ if(this.selectedRecurringType != '-1'){
+ this.postEvent.EventRecurrence.Type = this.selectedRecurringType;
+ }
+
+ this.postEvent.Attendees = this.taskParticipants.concat(this.taskParticipantsCc)
+
+ this.postEvent.EventRecurrence.Type = this.selectedRecurringType;
+
+ if(this.sesseionStora.user.Profile == 'MDGPR' || this.sesseionStora.user.Profile == 'PR') {
+ this.eventsService.editEvent(this.postEvent, 2, 3).subscribe(async () => {
+
+ if(this.initCalendarName != this.postEvent.CalendarName) {
+
+ let body = {
+ "EventId": this.postEvent.EventId,
+ "CalendarDestinationName": this.postEvent.CalendarName,
+ }
+ try {
+ await this.eventsService.changeAgenda(body).toPromise();
+ } catch (error) {}
+ finally {
+ this.goBack();
+ }
+
+ }
+
+ this.toastService._successMessage();
+
+ }, error => {
+ if(error.status != 0)
+ this.toastService._badRequest()
+ });
+ } else {
+ this.eventsService.editEvent(this.postEvent, 2, 3, this.postEvent.CalendarId).subscribe(async () => {
+
+ if(this.initCalendarName != this.postEvent.CalendarName) {
+
+ let body = {
+ "EventId": this.postEvent.EventId,
+ "CalendarDestinationName": this.postEvent.CalendarName,
+ }
+ try {
+ await this.eventsService.changeAgenda(body).toPromise();
+ } catch (error) {}
+ finally {
+ this.goBack();
+ }
+
+ }
+
+ this.toastService._successMessage();
+
+ }, error => {
+ if(error.status != 0)
+ this.toastService._badRequest()
+ });
+ }
+
+
+
+ this.isEventEdited = true;
+
+ this.modalController.dismiss(this.isEventEdited);
+
+
+ this.saveDocument()
+ }
+
+
+ saveDocument() {
+
+ this.loadedEventAttachments.forEach((e) => {
+
+ const id: any = e.Id
+ const remove = e['remove']
+
+ if ( id == 'add') {
+ //data.selected
+ const DocumentToSave = {
+ SourceTitle: e.SourceName,
+ ParentId: this.postEvent.EventId,
+ Source: '1',
+ SourceId: e.SourceId,
+ ApplicationId: e.ApplicationId.toString(),
+ Id: '0',
+ Link: '',
+ SerialNumber: '',
+ };
+
+ this.attachmentsService.setEventAttachmentById(DocumentToSave).subscribe(()=>{
+ this.getAttachments(this.postEvent.EventId);
+ });
+
+ } else if(remove) {
+ this.attachmentsService.deleteEventAttachmentById(e.Id).subscribe( res=> {})
+ }
+
+ })
+
+ }
+
+ async openAttendees() {
+ if(window.innerWidth > 801) {
+ this.showAttendees=true;
+ }
+ else {
+ const modal = await this.modalController.create({
+ component: AttendeesPageModal,
+ componentProps: {
+ adding: this.adding,
+ taskParticipants: this.taskParticipants,
+ taskParticipantsCc: this.taskParticipantsCc
+ },
+ cssClass: 'modal attendee modal-desktop',
+ backdropDismiss: false
+ });
+
+ await modal.present();
+
+ modal.onDidDismiss().then((data) => {
+
+ if(data){
+ data = data['data'];
+
+ const newAttendees: EventPerson[] = data['taskParticipants'];
+ const newAttendeesCC: EventPerson[] = data['taskParticipantsCc'];
+
+ if(newAttendees.length) {
+ this.setIntervenient(newAttendees);
+ } else {
+ this.setIntervenient([]);
+ }
+ if(newAttendeesCC) {
+ this.setIntervenientCC(newAttendeesCC);
+ } else {
+ this.setIntervenientCC([]);
+ }
+
+ }
+ });
+ }
+
+
+ }
+
+ setIntervenient(data) {
+ this.taskParticipants = data;
+ this.postEvent.Attendees = data;
+ }
+
+ setIntervenientCC(data) {
+ this.taskParticipantsCc = data;
+ }
+
+ addParticipants() {
+ this.adding = 'intervenient'
+ this.openAttendees();
+ }
+
+ addParticipantsCC() {
+ this.adding = 'CC';
+ this.openAttendees();
+ }
+
+ dynamicSetIntervenient({taskParticipants, taskParticipantsCc}){
+ this.taskParticipants = taskParticipants;
+ this.taskParticipantsCc = taskParticipantsCc;
+ }
+
+
+ getAttachments(eventId: string){
+ this.attachmentsService.getAttachmentsById(eventId).subscribe(res=>{
+ this.loadedEventAttachments = res;
+
+ });
+ }
+
+ deleteAttachment(attachmentID: string, index) {
+
+ const id: any = this.loadedEventAttachments[index].Id
+
+ if(id == 'add') {
+ this.loadedEventAttachments = this.loadedEventAttachments.filter((e,i)=> i!=index)
+ } else {
+ this.loadedEventAttachments[index]['remove'] = true
+ }
+
+
+ }
+
+ async getDoc() {
+ const modal = await this.modalController.create({
+ component: SearchPage,
+ cssClass: 'modal-width-100-width-background modal',
+ componentProps: {
+ type: 'AccoesPresidenciais & ArquivoDespachoElect',
+ showSearchInput: true,
+ select: true,
+ }
+ });
+ await modal.present();
+ modal.onDidDismiss().then( async (res)=> {
+ if(res) {
+ const data = res.data;
+
+ const ApplicationIdDocumentToSave: any = {
+ SourceName: data.selected.Assunto,
+ ParentId: this.postEvent.EventId,
+ SourceId: data.selected.Id,
+ Stakeholders: false,
+ ApplicationId: data.selected.ApplicationType.toString(),
+ CreateDate: false,
+ // needed to attach this document
+ Id: 'add',
+ SourceTitle: data.selected.Assunto,
+ Source: '1',
+ Link: '',
+ SerialNumber: '',
+ }
+
+
+ this.loadedEventAttachments.push(ApplicationIdDocumentToSave)
+
+ }
+ })
+ }
+
+}
diff --git a/src/app/pages/agenda/emend-message-modal/emend-message-modal-routing.module.ts b/src/app/pages/agenda/emend-message-modal/emend-message-modal-routing.module.ts
new file mode 100644
index 000000000..290308239
--- /dev/null
+++ b/src/app/pages/agenda/emend-message-modal/emend-message-modal-routing.module.ts
@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { EmendMessageModalPage } from './emend-message-modal.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: EmendMessageModalPage
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class EmendMessageModalPageRoutingModule {}
diff --git a/src/app/pages/agenda/emend-message-modal/emend-message-modal.module.ts b/src/app/pages/agenda/emend-message-modal/emend-message-modal.module.ts
new file mode 100644
index 000000000..d5b082e4e
--- /dev/null
+++ b/src/app/pages/agenda/emend-message-modal/emend-message-modal.module.ts
@@ -0,0 +1,20 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { EmendMessageModalPageRoutingModule } from './emend-message-modal-routing.module';
+
+import { EmendMessageModalPage } from './emend-message-modal.page';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+ EmendMessageModalPageRoutingModule
+ ],
+ declarations: [EmendMessageModalPage]
+})
+export class EmendMessageModalPageModule {}
diff --git a/src/app/pages/agenda/emend-message-modal/emend-message-modal.page.html b/src/app/pages/agenda/emend-message-modal/emend-message-modal.page.html
new file mode 100644
index 000000000..37eeaa3d5
--- /dev/null
+++ b/src/app/pages/agenda/emend-message-modal/emend-message-modal.page.html
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Cancelar
+ Enviar
+
+
diff --git a/src/app/pages/agenda/emend-message-modal/emend-message-modal.page.scss b/src/app/pages/agenda/emend-message-modal/emend-message-modal.page.scss
new file mode 100644
index 000000000..8b39f5213
--- /dev/null
+++ b/src/app/pages/agenda/emend-message-modal/emend-message-modal.page.scss
@@ -0,0 +1,57 @@
+.header-content{
+ //width: 360px;
+ overflow: auto;
+ margin-top: 25px;
+ }
+ .header-icon-left{
+ width: 36px;
+ font-size: 33px;
+ color: #42b9fe;
+ float: left;
+ }
+
+ .header-title{
+ width: 264px;
+ font-family: Roboto;
+ font-size: 25px;
+ margin: 0 5px 10px 20px;
+ padding: 0;
+ color:#000;
+ float: left;
+ }
+
+.buttons{
+ width: 320px;
+ margin: 0 auto;
+ padding: 5px 0 5px 0;
+}
+
+ .button-reject {
+ width: 130px;
+ height: 44px;
+ --color: #d30a0a;
+ border-radius: 22.5px;
+ --background: #ffe0e0;
+ margin: 0 12px 0 0px;
+ }
+ .button-approve {
+ width: 130px;
+ height: 44px;
+ border-radius: 22.5px;
+ --background: #42b9fe;
+ margin: 0 0px 0 12px;
+ }
+ .buttons{
+ display: flex;
+ width: 100% !important;
+ justify-content: space-between;
+ padding: 15px 0 15px 0;
+ overflow: auto;
+ }
+
+ .ion-input-class-no-height{
+ border: 1px solid #ebebeb;
+ border-radius: 5px;
+ overflow: auto;
+ margin: 0 20px 0 20px !important;
+ }
diff --git a/src/app/pages/agenda/emend-message-modal/emend-message-modal.page.spec.ts b/src/app/pages/agenda/emend-message-modal/emend-message-modal.page.spec.ts
new file mode 100644
index 000000000..35e4c9ef7
--- /dev/null
+++ b/src/app/pages/agenda/emend-message-modal/emend-message-modal.page.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { EmendMessageModalPage } from './emend-message-modal.page';
+
+describe('EmendMessageModalPage', () => {
+ let component: EmendMessageModalPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ EmendMessageModalPage ],
+ imports: [IonicModule.forRoot()]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(EmendMessageModalPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/agenda/emend-message-modal/emend-message-modal.page.ts b/src/app/pages/agenda/emend-message-modal/emend-message-modal.page.ts
new file mode 100644
index 000000000..12d6328fd
--- /dev/null
+++ b/src/app/pages/agenda/emend-message-modal/emend-message-modal.page.ts
@@ -0,0 +1,30 @@
+import { Component, OnInit } from '@angular/core';
+import { ModalController } from '@ionic/angular';
+import { ThemeService } from 'src/app/services/theme.service'
+
+@Component({
+ selector: 'app-emend-message-modal',
+ templateUrl: './emend-message-modal.page.html',
+ styleUrls: ['./emend-message-modal.page.scss'],
+})
+export class EmendMessageModalPage implements OnInit {
+ emendMessage: string = '';
+
+ constructor(
+ private modalController: ModalController,
+ public ThemeService: ThemeService
+ ) {
+ this.emendMessage = '';
+ }
+
+ ngOnInit() {}
+
+ close() {
+ this.modalController.dismiss({option:'close', note: this.emendMessage});
+ }
+
+ save() {
+ this.modalController.dismiss({option:'save', note: this.emendMessage});
+ }
+
+}
diff --git a/src/app/pages/agenda/evandre/evandre-routing.module.ts b/src/app/pages/agenda/evandre/evandre-routing.module.ts
new file mode 100644
index 000000000..3fb00a40b
--- /dev/null
+++ b/src/app/pages/agenda/evandre/evandre-routing.module.ts
@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { EvandrePage } from './evandre.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: EvandrePage
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class EvandrePageRoutingModule {}
diff --git a/src/app/pages/agenda/evandre/evandre.module.ts b/src/app/pages/agenda/evandre/evandre.module.ts
new file mode 100644
index 000000000..8a20cd1c2
--- /dev/null
+++ b/src/app/pages/agenda/evandre/evandre.module.ts
@@ -0,0 +1,20 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { EvandrePageRoutingModule } from './evandre-routing.module';
+
+import { EvandrePage } from './evandre.page';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+ EvandrePageRoutingModule
+ ],
+ declarations: [EvandrePage]
+})
+export class EvandrePageModule {}
diff --git a/src/app/pages/agenda/evandre/evandre.page.html b/src/app/pages/agenda/evandre/evandre.page.html
new file mode 100644
index 000000000..0cc537051
--- /dev/null
+++ b/src/app/pages/agenda/evandre/evandre.page.html
@@ -0,0 +1,9 @@
+
+
+ evandre
+
+
+
+
+
+
diff --git a/src/app/pages/agenda/evandre/evandre.page.scss b/src/app/pages/agenda/evandre/evandre.page.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/app/pages/agenda/evandre/evandre.page.spec.ts b/src/app/pages/agenda/evandre/evandre.page.spec.ts
new file mode 100644
index 000000000..adce8c07c
--- /dev/null
+++ b/src/app/pages/agenda/evandre/evandre.page.spec.ts
@@ -0,0 +1,24 @@
+import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { EvandrePage } from './evandre.page';
+
+describe('EvandrePage', () => {
+ let component: EvandrePage;
+ let fixture: ComponentFixture;
+
+ beforeEach(waitForAsync(() => {
+ TestBed.configureTestingModule({
+ declarations: [ EvandrePage ],
+ imports: [IonicModule.forRoot()]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(EvandrePage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/agenda/evandre/evandre.page.ts b/src/app/pages/agenda/evandre/evandre.page.ts
new file mode 100644
index 000000000..ff0b84c65
--- /dev/null
+++ b/src/app/pages/agenda/evandre/evandre.page.ts
@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+ selector: 'app-evandre',
+ templateUrl: './evandre.page.html',
+ styleUrls: ['./evandre.page.scss'],
+})
+export class EvandrePage implements OnInit {
+
+ constructor() { }
+
+ ngOnInit() {
+ }
+
+}
diff --git a/src/app/pages/agenda/event-actions-popover/event-actions-popover-routing.module.ts b/src/app/pages/agenda/event-actions-popover/event-actions-popover-routing.module.ts
new file mode 100644
index 000000000..534ad7730
--- /dev/null
+++ b/src/app/pages/agenda/event-actions-popover/event-actions-popover-routing.module.ts
@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { EventActionsPopoverPage } from './event-actions-popover.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: EventActionsPopoverPage
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class EventActionsPopoverPageRoutingModule {}
diff --git a/src/app/pages/agenda/event-actions-popover/event-actions-popover.module.ts b/src/app/pages/agenda/event-actions-popover/event-actions-popover.module.ts
new file mode 100644
index 000000000..2a372e235
--- /dev/null
+++ b/src/app/pages/agenda/event-actions-popover/event-actions-popover.module.ts
@@ -0,0 +1,20 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { EventActionsPopoverPageRoutingModule } from './event-actions-popover-routing.module';
+
+import { EventActionsPopoverPage } from './event-actions-popover.page';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+ EventActionsPopoverPageRoutingModule
+ ],
+ declarations: [EventActionsPopoverPage]
+})
+export class EventActionsPopoverPageModule {}
diff --git a/src/app/pages/agenda/event-actions-popover/event-actions-popover.page.html b/src/app/pages/agenda/event-actions-popover/event-actions-popover.page.html
new file mode 100644
index 000000000..ce896439f
--- /dev/null
+++ b/src/app/pages/agenda/event-actions-popover/event-actions-popover.page.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/pages/agenda/event-actions-popover/event-actions-popover.page.scss b/src/app/pages/agenda/event-actions-popover/event-actions-popover.page.scss
new file mode 100644
index 000000000..6a310f377
--- /dev/null
+++ b/src/app/pages/agenda/event-actions-popover/event-actions-popover.page.scss
@@ -0,0 +1,58 @@
+.wrapper{
+ --padding-top:20px !important;
+ --padding-bottom:20px !important;
+ --padding-start:20px !important;
+ --padding-end:20px !important;
+}
+.arrow-right{
+ display: none;
+ margin-bottom: 20px;
+ .arrow-right-icon{
+ width: 37px;
+ float: right;
+ font-size: 35px;
+ overflow: hidden;
+ }
+}
+.buttons{
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-around;
+ align-items: center;
+}
+.solid {
+ display: none;
+ width: 90%;
+ border-top: 5px solid #bbb;
+ margin: 0 auto !important;
+ }
+ .btn-ok, .btn-cancel{
+ //width: 50% !important;
+ justify-content: center;
+ margin-bottom: 10px !important;
+ margin-top: 10px !important;
+}
+@media only screen and (max-width: 800px) {
+ .btn-ok, .btn-cancel, .btn-delete{
+ width: 47% !important;
+ }
+}
+@media only screen and (min-width: 1024px) {
+ .arrow-right{
+ display: flex;
+ justify-content: flex-end;
+ }
+ .btn-cancel{
+ display: none;
+ width: 100% !important;
+ margin-bottom: 10px !important;
+ }
+ .btn-delete, .btn-ok{
+ width: 100% !important;
+ margin-bottom: 10px !important;
+ margin-top: 10px !important;
+ }
+ /* .solid{
+ display: block;
+ } */
+}
diff --git a/src/app/pages/agenda/event-actions-popover/event-actions-popover.page.spec.ts b/src/app/pages/agenda/event-actions-popover/event-actions-popover.page.spec.ts
new file mode 100644
index 000000000..890a3b4e0
--- /dev/null
+++ b/src/app/pages/agenda/event-actions-popover/event-actions-popover.page.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { EventActionsPopoverPage } from './event-actions-popover.page';
+
+describe('EventActionsPopoverPage', () => {
+ let component: EventActionsPopoverPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ EventActionsPopoverPage ],
+ imports: [IonicModule.forRoot()]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(EventActionsPopoverPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/agenda/event-actions-popover/event-actions-popover.page.ts b/src/app/pages/agenda/event-actions-popover/event-actions-popover.page.ts
new file mode 100644
index 000000000..d9178ec38
--- /dev/null
+++ b/src/app/pages/agenda/event-actions-popover/event-actions-popover.page.ts
@@ -0,0 +1,174 @@
+import { Component, OnInit } from '@angular/core';
+import { ModalController, NavParams, PopoverController } from '@ionic/angular';
+import { ProcessesService } from 'src/app/services/processes.service';
+import { ToastService } from 'src/app/services/toast.service';
+import { EditEventToApproveComponent } from 'src/app/shared/gabinete-digital/edit-event-to-approve/edit-event.page';
+import { EmendMessageModalPage } from '../emend-message-modal/emend-message-modal.page';
+import { ThemeService } from 'src/app/services/theme.service'
+import { RouteService } from 'src/app/services/route.service';
+
+
+@Component({
+ selector: 'app-event-actions-popover',
+ templateUrl: './event-actions-popover.page.html',
+ styleUrls: ['./event-actions-popover.page.scss'],
+})
+export class EventActionsPopoverPage implements OnInit {
+ serialNumber:string;
+ instanceId: string;
+ activityInstanceName: string
+
+ constructor(
+ private navParams: NavParams,
+ private processes:ProcessesService,
+ private modalController: ModalController,
+ private popoverController: PopoverController,
+ private toastService: ToastService,
+ private RouteService: RouteService,
+ public ThemeService: ThemeService) {
+ this.serialNumber = this.navParams.get('serialNumber');
+ this.instanceId = this.navParams.get('InstanceId');
+ this.activityInstanceName = this.navParams.get('InstanceId');
+ }
+
+ ngOnInit() {
+ window.onresize = (event) => {
+ if( window.innerWidth >= 800){
+ this.popoverController.dismiss();
+ }
+ };
+ }
+
+ goBack() {
+ this.closePopover();
+
+ this.RouteService.goBack()
+ }
+
+ closePopover() {
+ this.popoverController.dismiss();
+ }
+
+ async approveTask() {
+ let body = { "serialNumber": this.serialNumber, "action": "Aprovar" }
+
+
+ const loader = this.toastService.loading()
+ try {
+ await this.processes.PostTaskAction(body).toPromise()
+
+ this.toastService.successMessage();
+ this.goBack();
+ } catch (error) {
+
+ this.toastService.badRequest()
+ }
+ finally {
+ loader.remove()
+ }
+
+ }
+
+ async ReenviarTask() {
+ let body = { "serialNumber": this.serialNumber, "action": "Reenviar" }
+
+
+ const loader = this.toastService.loading()
+ try {
+ await this.processes.PostTaskAction(body).toPromise()
+
+ this.toastService.successMessage();
+ this.goBack();
+ } catch (error) {
+
+ this.toastService.badRequest()
+ }
+ finally {
+ loader.remove()
+ }
+
+ }
+
+ async emendarTask() {
+ this.closePopover();
+
+ const modal = await this.modalController.create({
+ component: EmendMessageModalPage,
+ componentProps:{
+ },
+ cssClass: 'emend-message-modal',
+ backdropDismiss: false
+ });
+
+ await modal.present();
+
+ modal.onDidDismiss()
+ .then( async (res) => {
+
+
+ if(res.data.note !== ''){
+ let body = { "serialNumber": this.serialNumber,
+ "action": "Emendar",
+ "dataFields": {
+ "ReviewUserComment": res.data,
+ }
+ }
+
+
+ const loader = this.toastService.loading()
+
+ try {
+ await this.processes.PostTaskAction(body).toPromise();
+ this.toastService.successMessage('Pedido enviado');
+ this.goBack();
+ } catch (error) {
+ this.toastService.badRequest();
+ }
+ finally {
+ loader.remove()
+ }
+ }
+ else{
+
+ }
+ });
+ }
+
+ async rejeitar() {
+ let body = { "serialNumber": this.serialNumber, "action": "Rejeitar" }
+
+ const loader = this.toastService.loading();
+ try {
+ await this.processes.PostTaskAction(body).toPromise();
+ await this.toastService.successMessage('Processo rejeitado');
+ this.goBack();
+ } catch (error) {
+ this.toastService.badRequest();
+ }
+ finally {
+ loader.remove();
+ }
+
+
+ }
+
+ async editTask() {
+ this.closePopover();
+ const modal = await this.modalController.create({
+ component: EditEventToApproveComponent,
+ componentProps: {
+ serialNumber: this.serialNumber,
+ InstanceId: this.instanceId
+ },
+ cssClass: 'modal modal-desktop',
+ // backdropDismiss: false
+ });
+
+ await modal.present();
+
+ modal.onDidDismiss().then(res => {
+ });
+
+ }
+
+}
diff --git a/src/app/pages/agenda/new-event/new-event-routing.module.ts b/src/app/pages/agenda/new-event/new-event-routing.module.ts
new file mode 100644
index 000000000..1b0103232
--- /dev/null
+++ b/src/app/pages/agenda/new-event/new-event-routing.module.ts
@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { NewEventPage } from './new-event.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: NewEventPage
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class NewEventPageRoutingModule {}
diff --git a/src/app/pages/agenda/new-event/new-event.module.ts b/src/app/pages/agenda/new-event/new-event.module.ts
new file mode 100644
index 000000000..76e2100d3
--- /dev/null
+++ b/src/app/pages/agenda/new-event/new-event.module.ts
@@ -0,0 +1,46 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { NewEventPageRoutingModule } from './new-event-routing.module';
+
+import { NewEventPage } from './new-event.page';
+import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
+import { MatDatepickerModule } from '@angular/material/datepicker';
+import { MatInputModule } from '@angular/material/input';
+
+import { MatNativeDateModule } from '@angular/material/core';
+
+import {
+ NgxMatDatetimePickerModule,
+ NgxMatNativeDateModule,
+ NgxMatTimepickerModule
+} from '@angular-material-components/datetime-picker';
+
+import { ReactiveFormsModule } from '@angular/forms';
+import { MatButtonModule } from '@angular/material/button';
+import { MatSelectModule } from '@angular/material/select';
+import { NgxMatMomentModule } from '@angular-material-components/moment-adapter';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+ NewEventPageRoutingModule,
+ MatDatepickerModule,
+ MatInputModule,
+ MatNativeDateModule,
+ NgxMatDatetimePickerModule,
+ NgxMatTimepickerModule,
+ NgxMatNativeDateModule,
+ NgxMatMomentModule,
+ MatSelectModule,
+ MatButtonModule,
+ ReactiveFormsModule
+ ],
+ declarations: [NewEventPage]
+})
+export class NewEventPageModule {}
diff --git a/src/app/pages/agenda/new-event/new-event.page.html b/src/app/pages/agenda/new-event/new-event.page.html
new file mode 100644
index 000000000..454ce5e1e
--- /dev/null
+++ b/src/app/pages/agenda/new-event/new-event.page.html
@@ -0,0 +1,322 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ calendars }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Reunião
+
+
+ Viagem
+
+
+ Conferência
+
+
+ Encontro
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{recurring.Description}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Adicionar documentos
+
+
+
+
+
+
+
+
+
+ {{document.Assunto}}
+ {{document.appName}}
+
+
+
+
+ {{document.EntidadeOrganicaNome}} {{document.Data | date: 'dd-MM-yyyy HH:mm'}}
+
+
+
+
+
+
+
+
+
+
+ Cancelar
+
+
+
+
+
+ Gravar
+
+
+
+
diff --git a/src/app/pages/agenda/new-event/new-event.page.scss b/src/app/pages/agenda/new-event/new-event.page.scss
new file mode 100644
index 000000000..2cd5492f2
--- /dev/null
+++ b/src/app/pages/agenda/new-event/new-event.page.scss
@@ -0,0 +1,218 @@
+ion-content{
+ --background:transparent;
+}
+.header-toolbar{
+ --background:transparent;
+ --opacity: 1;
+}
+ .main-header{
+ width: 100%; /* 400px */
+ height: 100%;
+ font-family: Roboto;
+ border-top-left-radius: 25px;
+ border-top-right-radius: 25px;
+ background-color: #fff;
+ overflow:hidden;
+ padding: 30px 20px 0px 20px;
+ color:#000;
+ transform: translate3d(0, 1px, 0);
+
+ .title-content{
+ margin: 0px auto;
+ overflow: auto;
+ background: #fff;
+ .middle{
+ padding: 0!important;
+ float: left;
+ width: 221px;
+ margin: 2.5px 0 0 5px;
+ }
+ }
+
+ .title{
+ font-size: 25px;
+ }
+
+ }
+ .main-content{
+ width: 100%; /* 400px */
+ height: 100%;
+ font-family: Roboto;
+ margin: 0 auto;
+ background-color: #fff;
+ overflow:auto;
+ padding: 15px 20px 0 20px;
+
+ .ion-item-container{
+ flex: 1;
+ width: 100%;
+ margin: 15px auto;
+ border: 1px solid #ebebeb;
+ border-radius: 5px;
+ padding-left: 10px;
+ }
+ .ion-item-container-no-border{
+ width: 100%;
+ margin: 0px auto;
+ padding: 0 !important;
+ overflow: auto;
+ }
+ .container-div{
+ margin-bottom: 15px;
+ //overflow: auto;
+ }
+ .ion-item-class-2{
+ display: flex;
+ margin: 0px auto;
+ }
+ .ion-icon-class{
+ width: 45px;
+ height: 45px;
+ float: left;
+ padding: 10px;
+ font-size: 25px;
+ }
+ ion-select{
+ padding-left: 5px;
+ margin-left: 0;
+ }
+ .ion-input-class{
+ height: 45px;
+ border: 1px solid #ebebeb;
+ border-radius: 5px;
+ padding-left: 5px;
+ padding-right: 10px;
+ float: left;
+ flex: 1;
+ }
+ .ion-input-class-no-height{
+ border: 1px solid #ebebeb;
+ border-radius: 5px;
+ flex: 1;
+ }
+ .list-people{
+ width: 250px;
+ float: left;
+
+ }
+ .add-people{
+ width: 45px;
+ float: right;
+ overflow: auto;
+ font-size: 25px;
+ height: 45px;
+ display: flex;
+ }
+ .list-people-title{
+ /* font-size: 13px; */
+ color: #a3a3a3;
+ }
+ .attach-document{
+ font-size: 15px;
+ color: var(--title-text-color);
+ margin: 5px 5px 5px 10px;
+ padding: 5px;
+ float: left;
+ }
+ .attach-icon{
+ width: 37px;
+ font-size: 35px;
+ float: left;
+ }
+ .attach-title-item{
+ width: 100%;
+ font-size: 15px;
+ color:var(--title-text-color);
+ }
+ /* SPAN */
+ .span-left{
+ float: left;
+ font-size: 15x;
+ }
+ .span-right{
+ text-align: right;
+ float: right;
+ font-size: 13px;
+ }
+ .container-footer{
+ margin:0 auto;
+ overflow: auto;
+ }
+ .button-cancel {
+ width: 170px;
+ height: 44px;
+ border-radius: 22.5px;
+ --background: #e0e9ee;
+ --color: #061b52;
+ margin:10px;
+ }
+ .button-save {
+ width: 170px;
+ height: 44px;
+ border-radius: 22.5px;
+ --background: #42b9fe;
+ --color:#ffffff;
+ margin:10px;
+ }
+
+ .text-input{
+ width: 100%;
+ border: 1px solid #ebebeb;
+ margin: 0px 15px 15px 0px;
+ padding: 0 !important;
+ border-radius: 5px;
+ }
+
+ /* Error Messages */
+ .error{
+ color:red;
+ font-size: 12px;
+ font-weight: bold;
+ padding-bottom: 20px;
+ }
+ .span-color{
+ color:red;
+ }
+
+ }
+
+
+
+
+ .app-name{
+ background: var(--title-text-color);
+ border-radius: 18px;
+ text-align: center;
+ display: flex;
+ align-items: center;
+ padding: 0px 5px;
+ color: white;
+ font-size: 9pt;
+ font-weight: 500;
+ height: 19px;
+ -webkit-border-radius: 18px;
+ -moz-border-radius: 18px;
+ -ms-border-radius: 18px;
+ -o-border-radius: 18px;
+ }
+
+
+.close-button {
+ display: none;
+ height: 20px;
+}
+
+
+.list:hover {
+
+ .app-name {
+ display: none;
+ }
+
+ .close-button {
+ display: block !important;
+ }
+}
+.icon-time{
+ color: #797979b0;
+}
diff --git a/src/app/pages/cal-modal/cal-modal.page.spec.ts b/src/app/pages/agenda/new-event/new-event.page.spec.ts
similarity index 62%
rename from src/app/pages/cal-modal/cal-modal.page.spec.ts
rename to src/app/pages/agenda/new-event/new-event.page.spec.ts
index 31a780adc..9a2a8ec1b 100644
--- a/src/app/pages/cal-modal/cal-modal.page.spec.ts
+++ b/src/app/pages/agenda/new-event/new-event.page.spec.ts
@@ -1,19 +1,19 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { IonicModule } from '@ionic/angular';
-import { CalModalPage } from './cal-modal.page';
+import { NewEventPage } from './new-event.page';
-describe('CalModalPage', () => {
- let component: CalModalPage;
- let fixture: ComponentFixture;
+describe('NewEventPage', () => {
+ let component: NewEventPage;
+ let fixture: ComponentFixture;
beforeEach(async(() => {
TestBed.configureTestingModule({
- declarations: [ CalModalPage ],
+ declarations: [ NewEventPage ],
imports: [IonicModule.forRoot()]
}).compileComponents();
- fixture = TestBed.createComponent(CalModalPage);
+ fixture = TestBed.createComponent(NewEventPage);
component = fixture.componentInstance;
fixture.detectChanges();
}));
diff --git a/src/app/pages/agenda/new-event/new-event.page.ts b/src/app/pages/agenda/new-event/new-event.page.ts
new file mode 100644
index 000000000..c8e77cc2a
--- /dev/null
+++ b/src/app/pages/agenda/new-event/new-event.page.ts
@@ -0,0 +1,509 @@
+import { Component, OnInit } from '@angular/core';
+import { ModalController, NavParams } from '@ionic/angular';
+import { EventAttachment } from 'src/app/models/attachment.model';
+import { EventBody } from 'src/app/models/eventbody.model';
+import { EventPerson } from 'src/app/models/eventperson.model';
+import { SearchList } from 'src/app/models/search-document';
+import { LoginUserRespose } from 'src/app/models/user.model';
+import { AttachmentsService } from 'src/app/services/attachments.service';
+import { AuthService } from 'src/app/services/auth.service';
+import { EventsService } from 'src/app/services/events.service';
+import { ToastService } from 'src/app/services/toast.service';
+import { Event } from '../../../models/event.model';
+import { AttendeesPageModal } from '../../events/attendees/attendees.page';
+import { SearchPage } from '../../search/search.page';
+import { ThemePalette } from '@angular/material/core';
+import { FormControl, FormGroup, Validators } from '@angular/forms';
+import { ThemeService } from 'src/app/services/theme.service';
+import { NgxMatDateFormats } from '@angular-material-components/datetime-picker';
+import { NGX_MAT_DATE_FORMATS } from '@angular-material-components/datetime-picker';
+
+const CUSTOM_DATE_FORMATS: NgxMatDateFormats = {
+ parse: {
+ dateInput: "YYYY-MMMM-DD HH:mm"
+ },
+ display: {
+ dateInput: "DD MMM YYYY H:mm",
+ monthYearLabel: "MMM YYYY",
+ dateA11yLabel: "LL",
+ monthYearA11yLabel: "MMMM YYYY"
+ }
+}
+@Component({
+ selector: 'app-new-event',
+ templateUrl: './new-event.page.html',
+ styleUrls: ['./new-event.page.scss'],
+ providers: [
+ { provide: NGX_MAT_DATE_FORMATS, useValue: CUSTOM_DATE_FORMATS },
+ ]
+})
+
+export class NewEventPage implements OnInit {
+ // date picker
+ public date: any;
+ public disabled = false;
+ public showSpinners = true;
+ public showSeconds = false;
+ public touchUi = false;
+ public enableMeridian = false;
+ public stepHour = 1;
+ public stepMinute = 5;
+ public stepSecond = 5;
+ public color: ThemePalette = 'primary';
+
+ Form: FormGroup;
+ validateFrom = false
+
+ postEvent: Event;
+ eventBody: EventBody;
+ segment:string = "true";
+ profile:string;
+ eventAttendees: EventPerson[];
+ selectedSegment: string;
+ selectedDate: Date;
+ recurringTypes: any;
+ selectedRecurringType: any;
+
+ adding: "intervenient" | "CC";
+
+ taskParticipants: any = [];
+ taskParticipantsCc: any = [];
+
+ documents:SearchList[] = [];
+
+ loggeduser: LoginUserRespose;
+ members:any;
+ CalendarName;
+
+ public listColors = ['primary', 'accent', 'warn'];
+ public stepHours = [1, 2, 3, 4, 5];
+ public stepMinutes = [1, 5, 10, 15, 20, 25];
+ public stepSeconds = [1, 5, 10, 15, 20, 25];
+
+ autoStartTime;
+ autoEndTime;
+ CalendarNamesOptions = ['Oficial', 'Pessoal']
+
+ constructor(
+ private modalController: ModalController,
+ private navParams: NavParams,
+ public eventService: EventsService,
+ private attachmentsService: AttachmentsService,
+ private toastService: ToastService,
+ userService: AuthService,
+ public ThemeService: ThemeService
+ ) {
+ this.loggeduser = userService.ValidatedUser;
+ this.postEvent = new Event();
+ this.postEvent.EventRecurrence = {Type:'-1'};
+ this.eventBody = { BodyType : "1", Text : ""};
+ this.postEvent.Body = this.eventBody;
+
+ this.selectedSegment = this.navParams.get('segment');
+ this.selectedDate = this.navParams.get('eventSelectedDate');
+ this.taskParticipants = this.navParams.get('attendees');
+
+ let now = new Date();
+
+ if(now.getMinutes() <= 30){
+ this.autoStartTime = new Date(now.setMinutes(30));
+ this.postEvent.StartDate = this.autoStartTime;
+ this.autoEndTime = new Date(this.autoStartTime.getTime() + 30 * 60000);
+ this.postEvent.EndDate = this.autoEndTime;
+ }
+ else{
+ this.autoStartTime = new Date(now.setHours(now.getHours()+1));
+ this.autoStartTime = new Date(this.autoStartTime.setMinutes(0));
+ this.postEvent.StartDate = this.autoStartTime;
+ this.autoEndTime = new Date(this.autoStartTime.getTime() + 30 * 60000);
+ this.postEvent.EndDate = this.autoEndTime;
+ }
+ }
+
+ ngOnInit() {
+
+ this.CalendarName = this.loggeduser.Profile;
+ this.selectedRecurringType = "-1";
+
+
+
+ this.getRecurrenceTypes();
+
+ if(this.selectedSegment != "Combinada"){
+ this.postEvent = {
+ EventId: '',
+ Subject: '',
+ Body: this.eventBody,
+ Location: '',
+ CalendarId: '',
+ CalendarName: 'Oficial',
+ StartDate: this.autoStartTime,
+ EndDate: this.autoEndTime,
+ EventType: 'Reunião',
+ Attendees: null,
+ IsMeeting: false,
+ IsRecurring: false,
+ AppointmentState: 0,
+ TimeZone: '',
+ Organizer: '',
+ Category: 'Reunião',
+ HasAttachments: false,
+ EventRecurrence: {Type:'-1',LastOccurrence:this.autoEndTime},
+ };
+ }
+ else{
+ this.postEvent = {
+ EventId: '',
+ Subject: '',
+ Body: this.eventBody,
+ Location: '',
+ CalendarId: '',
+ CalendarName: 'Oficial',
+ StartDate: this.autoStartTime,
+ EndDate: this.autoEndTime,
+ EventType: 'Reunião',
+ Attendees: null,
+ IsMeeting: false,
+ IsRecurring: false,
+ AppointmentState: 0,
+ TimeZone: '',
+ Organizer: '',
+ Category: 'Reunião',
+ HasAttachments: false,
+ EventRecurrence: {Type:'-1',LastOccurrence:this.autoEndTime},
+ };
+ }
+
+ window.onresize = (event) => {
+ if( window.innerWidth >= 1024){
+ this.modalController.dismiss();
+ }
+ };
+
+
+
+
+ }
+
+ close() {
+ this.modalController.dismiss();
+ }
+
+
+ getRecurrenceTypes() {
+ this.eventService.getRecurrenceTypes().subscribe( res => {
+
+ this.recurringTypes = res;
+ });
+ }
+
+ onSelectedRecurringChanged(ev:any) {
+
+ this.calculetedLastOccurrence(ev);
+
+ if(ev.length > 1) {
+
+ this.selectedRecurringType = ev.filter(data => data != '-1');
+ }
+ if(ev.length == 0) {
+ this.selectedRecurringType = "-1";
+ }
+ }
+
+ calculetedLastOccurrence(type:number){
+ console.log(type);
+ var valor;
+ var opcao: boolean;
+ if (type == 0) {
+ valor = 7;
+ opcao = true;
+ } else if(type == 1){
+ valor = 30;
+ opcao = true;
+ } else if(type == 2){
+ valor = 1;
+ opcao = false;
+ }else if(type == 3){
+ valor = 5;
+ opcao = false;
+ }
+ this.defineLastOccurrence(valor, opcao);
+ }
+
+
+ defineLastOccurrence(valor:number, opcao:boolean){
+ var time = new Date(this.postEvent.EndDate);
+ if (opcao == true) {
+ time.setDate(time.getDate() + valor);
+ this.postEvent.EventRecurrence.LastOccurrence = time;
+ } else {
+ time = new Date(
+ time.getFullYear() + valor,
+ time.getMonth(),
+ time.getDate(),
+ time.getHours(),
+ time.getMinutes()
+ );
+ this.postEvent.EventRecurrence.LastOccurrence = time;
+ }
+
+ }
+
+
+ runValidation() {
+ this.validateFrom = true;
+ if(new Date(this.postEvent.StartDate).getTime() > new Date(this.postEvent.EndDate).getTime()){
+ this.toastService._badRequest("A data de fim não pode ser inferior a data de inÃcio do evento")
+ }
+ }
+
+
+ get dateValid() {
+ if (window.innerWidth <= 800) {
+ return this.postEvent.StartDate < this.postEvent.EndDate? ['ok']: []
+ } else {
+ return ['ok']
+ }
+ }
+
+ injectValidation() {
+
+ this.Form = new FormGroup({
+ Subject: new FormControl(this.postEvent.Subject, [
+ Validators.required,
+ // Validators.minLength(4)
+ ]),
+ Location: new FormControl(this.postEvent.Location, [
+ Validators.required,
+ ]),
+ CalendarName: new FormControl(this.postEvent.CalendarName, [
+ Validators.required
+ ]),
+ Date: new FormControl(this.dateValid, [
+ Validators.required
+ ]),
+ Categories: new FormControl(this.postEvent.Category, [
+ Validators.required
+ ]),
+ participantes: new FormControl(this.taskParticipants, [
+ Validators.required
+ ]),
+
+ })
+ }
+
+ openInicio() {
+ let input: any = document.querySelector('#new-inicio')
+ if(input) {
+
+ input.click()
+ }
+ }
+
+ openFim() {
+ let input: any = document.querySelector('#new-fim')
+ if(input) {
+ input.click()
+ }
+ }
+
+ openLastOccurrence() {
+ let input: any = document.querySelector('#last-occurrence')
+ if(input) {
+ input.click()
+ }
+ }
+
+ async save() {
+ this.injectValidation()
+ this.runValidation()
+
+ if(this.Form.invalid) {
+ return false
+ }
+
+ if(this.documents.length >= 0) {
+ this.postEvent.HasAttachments = true;
+ }
+ if(this.selectedRecurringType != '-1') {
+ this.postEvent.EventRecurrence.Type = this.selectedRecurringType;
+ }
+
+ this.postEvent.Attendees = this.taskParticipants.concat(this.taskParticipantsCc);
+
+ let eventId: any;
+
+ const loader = this.toastService.loading()
+
+ try {
+
+ const CalendarId = this.selectedCalendarId()
+
+ if(this.loggeduser.Profile == 'MDGPR') {
+
+ eventId = await this.eventService.postEventGeneric(this.postEvent, this.postEvent.CalendarName, CalendarId).toPromise();
+
+ }
+ else if(this.loggeduser.Profile == 'PR') {
+
+ const CalendarId = this.selectedCalendarId()
+ eventId = await this.eventService.postEventGeneric(this.postEvent, this.postEvent.CalendarName, CalendarId).toPromise();
+ } else {
+
+ const CalendarId = this.selectedCalendarId()
+ eventId = await this.eventService.postEventGeneric(this.postEvent, this.postEvent.CalendarName, CalendarId).toPromise();
+ }
+
+ const DocumentToSave: EventAttachment[] = this.documents.map((e) => {
+ return {
+ SourceTitle: e.Assunto,
+ ParentId: eventId,
+ Source: '1',
+ SourceId: e.Id,
+ ApplicationId: e.ApplicationType.toString(),
+ Id: '',
+ Link: '',
+ SerialNumber: ''
+ };
+ });
+
+ await DocumentToSave.forEach( async (attachments, i) => {
+ try {
+ await this.attachmentsService.setEventAttachmentById(attachments).toPromise();
+ } catch(error) {
+
+ }
+
+ });
+
+ this.toastService._successMessage()
+ this.modalController.dismiss(this.postEvent);
+
+ } catch (error) {
+ this.toastService._badRequest()
+ } finally {
+ loader.remove()
+ }
+
+ }
+
+
+ selectedCalendarId () {
+
+ if (this.eventService.calendarNamesType[this.CalendarName]?.['Oficial'] && this.postEvent.CalendarName == 'Oficial') {
+ return this.eventService.calendarNamesType[this.CalendarName]['OficialId']
+
+ } else if (this.eventService.calendarNamesType[this.CalendarName]?.['Pessoal'] && this.postEvent.CalendarName == 'Pessoal') {
+
+ return this.eventService.calendarNamesType[this.CalendarName]['PessoalId']
+
+ } else {
+ return '11:11'
+ }
+ }
+
+ changeAgenda() {
+
+ setTimeout(() => {
+
+ if(this.eventService.calendarNamesType[this.CalendarName]?.['Oficial'] && this.eventService.calendarNamesType[this.CalendarName]?.['Pessoal']) {
+
+ this.CalendarNamesOptions = ['Oficial', 'Pessoal']
+
+ } else if (this.eventService.calendarNamesType[this.CalendarName]?.['Oficial']) {
+ this.CalendarNamesOptions = ['Oficial']
+ this.postEvent.CalendarName = 'Oficial'
+
+ } else if (this.eventService.calendarNamesType[this.CalendarName]?.['Pessoal']) {
+ this.CalendarNamesOptions = ['Pessoal']
+ this.postEvent.CalendarName = 'Pessoal'
+
+ } else {
+ this.CalendarNamesOptions = ['Oficial', 'Pessoal']
+ }
+ }, 50)
+
+ }
+
+ async openAttendees() {
+
+ const modal = await this.modalController.create({
+ component: AttendeesPageModal,
+ componentProps: {
+ adding: this.adding,
+ taskParticipants: this.taskParticipants,
+ taskParticipantsCc: this.taskParticipantsCc
+ },
+ cssClass: 'attendee modal modal-desktop',
+ backdropDismiss: false
+ });
+
+ await modal.present();
+
+ modal.onDidDismiss().then((data) => {
+
+ if(data) {
+ data = data['data'];
+ if(data) {
+
+ const newAttendees: EventPerson[] = data['taskParticipants'];
+ const newAttendeesCC: EventPerson[] = data['taskParticipantsCc'];
+
+ if(newAttendees.length) {
+ this.setIntervenient(newAttendees);
+ }
+ if(newAttendeesCC) {
+ this.setIntervenientCC(newAttendeesCC);
+ }
+
+ }
+
+ }
+ });
+ }
+
+ setIntervenient(data) {
+ this.taskParticipants = data;
+ this.postEvent.Attendees = data;
+ }
+
+ setIntervenientCC(data){
+ this.taskParticipantsCc = data;
+ }
+
+ addParticipants() {
+ this.adding = 'intervenient'
+ this.openAttendees();
+ }
+
+ addParticipantsCC() {
+ this.adding = 'CC'
+ this.openAttendees();
+ }
+
+
+ async getDoc() {
+ const modal = await this.modalController.create({
+ component: SearchPage,
+ cssClass: 'modal-width-100-width-background modal',
+ componentProps: {
+ type: 'AccoesPresidenciais & ArquivoDespachoElect',
+ showSearchInput: true,
+ select: true
+ }
+ });
+ await modal.present();
+ modal.onDidDismiss().then((res)=>{
+ if(res){
+ const data = res.data;
+ this.documents.push(data.selected);
+ }
+ });
+ }
+
+ removeAttachment(index: number){
+
+ this.documents = this.documents.filter( (e, i) => index != i);
+
+ }
+}
diff --git a/src/app/pages/agenda/view-event/view-event-routing.module.ts b/src/app/pages/agenda/view-event/view-event-routing.module.ts
new file mode 100644
index 000000000..37a7a0172
--- /dev/null
+++ b/src/app/pages/agenda/view-event/view-event-routing.module.ts
@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { ViewEventPage } from './view-event.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: ViewEventPage
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class ViewEventPageRoutingModule {}
diff --git a/src/app/pages/agenda/view-event/view-event.module.ts b/src/app/pages/agenda/view-event/view-event.module.ts
new file mode 100644
index 000000000..29247adab
--- /dev/null
+++ b/src/app/pages/agenda/view-event/view-event.module.ts
@@ -0,0 +1,27 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { ViewEventPageRoutingModule } from './view-event-routing.module';
+
+import { ViewEventPage } from './view-event.page';
+import { SharedModule } from 'src/app/shared/shared.module';
+
+import { HeaderPageModule } from 'src/app/shared/header/header.module';
+import { BtnModalDismissPageModule } from 'src/app/shared/btn-modal-dismiss/btn-modal-dismiss.module';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+
+ ViewEventPageRoutingModule,
+ HeaderPageModule,
+ BtnModalDismissPageModule,
+ ],
+ declarations: [ViewEventPage]
+})
+export class ViewEventPageModule {}
diff --git a/src/app/pages/agenda/view-event/view-event.page.html b/src/app/pages/agenda/view-event/view-event.page.html
new file mode 100644
index 000000000..4d6b15b26
--- /dev/null
+++ b/src/app/pages/agenda/view-event/view-event.page.html
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{loadedEvent.Subject}}
+
+
+
+
+
+
+
+
+
+
{{loadedEvent.Location}}
+
+
+ {{loadedEvent.CalendarName}}
+ {{loadedEvent.CalendarName}}
+
+
+
+ {{loadedEvent.CalendarName}}
+ {{loadedEvent.CalendarName}}
+
+
+
+
+
+
+
+ {{customDate}}
+ das {{loadedEvent.StartDate | date: 'HH:mm'}} Ã s {{loadedEvent.EndDate | date: 'HH:mm'}}
+
+ Diário
+ Semanal
+ Mensal
+ Anual
+ (Não se repete)
+
+
+
+
+
+
+
+
Intervenientes
+
+
+
+
+
+
+
+
+
+
+
Documentos Anexados
+
+
+
+
+ {{attach.SourceName}}
+ {{attach.Stakeholders}}
+
+
+
+ {{ attach.CreateDate | date: 'dd-MM-yyyy HH:mm' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/pages/agenda/view-event/view-event.page.scss b/src/app/pages/agenda/view-event/view-event.page.scss
new file mode 100644
index 000000000..acc6321ca
--- /dev/null
+++ b/src/app/pages/agenda/view-event/view-event.page.scss
@@ -0,0 +1,301 @@
+@import '~src/function.scss';
+ion-content{
+ --background:transparent;
+ /* --padding-top:0px;
+ --padding-start: 20px;
+ --padding-end: 20px;
+ font-size: 18px; */
+ overflow: auto;
+}
+ion-menu{
+ --height: 225px;
+ }
+.header-toolbar{
+ --background:transparent;
+ --opacity: 1;
+}
+ .main-header{
+ width: 100%; /* 400px */
+ font-family: Roboto;
+ background-color: #fff;
+ color:#000;
+ transform: translate3d(0, 1px, 0);
+
+ .title-content{
+ width: 100% !important;
+ margin: 0px auto;
+ padding: 0 !important;
+ background: #fff;
+ overflow: auto;
+
+ .left{
+ width: 37px;
+ float: left;
+ font-size: 35px;
+ }
+ .middle{
+ width: calc(100% - 138.5px) !important;
+ padding: 0 !important;
+ float: left;
+ margin: 0 !important;
+ overflow: auto;
+
+ p{
+ margin: 0 !important;
+ }
+ }
+ .header-icon-right{
+ width: 45px;
+ font-size: 45px;
+ float: right;
+ }
+ .menu-options{
+ width: fit-content;
+ height: fit-content;
+ align-items: flex-start;
+ justify-content: flex-start;
+ float: right;
+ padding: 1px;
+ margin-left: 15px;
+ }
+ .menu-options .edit{
+ font-size: 35px;
+ float: left;
+ }
+ .menu-options .delete{
+ padding: 7px;
+ font-size: 21px;
+ color:#fff;
+ background: #d30606;
+ border-radius: 20px;
+ margin-left: 10px;
+ }
+ }
+
+ .title{
+ font-size: 25px;
+ }
+
+ }
+ .main-content{
+ width: 100%;
+ font-family: Roboto;
+ background-color: #fff !important;
+ border-top-left-radius: 25px;
+ border-top-right-radius: 25px;
+ overflow:auto;
+
+ .content{
+ padding: 30px 20px 0 20px !important;
+ margin: 0;
+ float: left;
+ }
+
+ .upper-content{
+ width: calc(100%-50px);
+ margin-left: 50px;
+ font-size: 18px;
+
+ .content-location{
+ width: 100%;
+ margin: 0 auto;
+ padding: 0;
+ overflow: auto;
+
+ .date{
+ width: calc(100% - 105px);
+ float: left;
+ }
+
+
+ }
+
+ .location-detail{
+ width: 210px;
+ font-weight: 700;
+ font-size: 18px;
+ float: left;
+ margin: 5px 5px 5px 0px;
+ }
+ .button-mdgpr-Oficial{
+ width: 91px;
+ --border-radius: 20px;
+ --background: #ffb703;
+ margin-left: 5px;
+ float: left;
+ }
+ .button-mdgpr-Pessoal{
+ width: 91px;
+ --border-radius: 20px;
+ --background: #f05d5e;
+ margin-left: 5px;
+ float: left;
+ }
+
+ .button-pr-Oficial{
+ width: 91px;
+ --border-radius: 20px;
+ --background: #cbeecb;
+ margin-left: 5px;
+ float: left;
+ }
+ .button-pr-Pessoal{
+ width: 91px;
+ --border-radius: 20px;
+ --background: #cab0dc;
+ margin-left: 5px;
+ float: left;
+ }
+
+
+ .button-calendar-type ion-button{
+ height: 25px;
+ }
+ .button-edit-event {
+ width: 140px;
+ height: 44px;
+ border-radius: 22.5px;
+ --background: #e0e9ee;
+ --color:#061b52;
+ }
+ .content-details p{
+ font-size: 16px;
+ }
+ }
+ .line{
+ width: 100% !important;
+ margin-top: 15px;
+ border-top: 1px solid #d8d8d8;
+ }
+ .middle-conten{
+ width: 100% !important;
+ overflow: auto;
+
+ .middle-content h3, .middle-content p{
+ font-size: 16px;
+ }
+ }
+
+ .bottom-content{
+ margin: 0 auto;
+
+ .bottom-content h3{
+ font-size: 16px;
+ margin: 0 0 0 10px;
+ }
+ .attach-document{
+ font-size: 15px;
+ color: var(--title-text-color);
+ margin: 5px 5px 5px 10px;
+ padding: 5px;
+ float: left;
+ }
+ .attach-icon{
+ width: 37px;
+ font-size: 35px;
+ float: left;
+ }
+ .attach-title-item{
+ width: 100%;
+ font-size: 15px;
+ color: var(--title-text-color);
+ }
+ /* SPAN */
+ .span-left{
+ float: left;
+ font-size: 15x;
+ }
+ .span-right{
+ text-align: right;
+ float: right;
+ font-size: 13px;
+ }
+ }
+ }
+ .aside-right{
+ padding: 30px 20px 0 20px !important;
+
+ .arrow-right{
+ display: flex;
+ justify-content: flex-end;
+ margin-bottom: 20px;
+
+ .arrow-right-icon{
+ width: 37px;
+ float: right;
+ font-size: 35px;
+ }
+ }
+ .buttons{
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+
+ .btn-ok, .btn-cancel, .btn-delete{
+ height: auto !important;
+ font-size: 16px !important;
+ width: 100% !important;
+ margin-bottom: 10px !important;
+ padding: 15px !important;
+ }
+ }
+ .solid {
+ display: block;
+ width: 90%;
+ border-top: 1px solid #ebebeb;
+ margin: 0 auto !important;
+ margin-bottom: 10px !important;
+ }
+ }
+ textarea{
+ border:none;
+ --background:#fff !important;
+ }
+
+ @media only screen and (max-width: 800px) {
+ .content{
+ width: 100% !important;
+ }
+ .aside-right{
+ display: none;
+ }
+ }
+ @media only screen and (min-width: 801px) {
+ .menu-options{
+ display: none !important;
+ }
+ .content{
+ width: 65%;
+ border-right: 1px solid #d8d8d8;
+ }
+
+ .aside-right{
+ width: 35%;
+ }
+ }
+
+ @media only screen and (min-width: 1024px){
+ .content{
+ width: 70%;
+ }
+ .aside-right{
+ width: 30%;
+ }
+ }
+
+ @media only screen and (min-width: 1140px){
+ .content{
+ width: 75%;
+ }
+ .aside-right{
+ width: 25%;
+ }
+ }
+
+ .label{
+ border-radius: 20px;
+ background: #ffb703;
+ float: right;
+ padding: 5px 13.5px 5px 13.5px;
+ color: #fff;
+ }
diff --git a/src/app/pages/agenda/view-event/view-event.page.spec.ts b/src/app/pages/agenda/view-event/view-event.page.spec.ts
new file mode 100644
index 000000000..d13628ede
--- /dev/null
+++ b/src/app/pages/agenda/view-event/view-event.page.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { ViewEventPage } from './view-event.page';
+
+describe('ViewEventPage', () => {
+ let component: ViewEventPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ ViewEventPage ],
+ imports: [IonicModule.forRoot()]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(ViewEventPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/agenda/view-event/view-event.page.ts b/src/app/pages/agenda/view-event/view-event.page.ts
new file mode 100644
index 000000000..b88b5499f
--- /dev/null
+++ b/src/app/pages/agenda/view-event/view-event.page.ts
@@ -0,0 +1,526 @@
+import { Component, OnInit } from '@angular/core';
+import { AlertController, ModalController, PopoverController, Platform } from '@ionic/angular';
+import { EventBody } from 'src/app/models/eventbody.model';
+import { EventsService } from 'src/app/services/events.service';
+import { Event } from '../../../models/event.model';
+import { EditEventPage } from '../edit-event/edit-event.page';
+import { ActivatedRoute, Router } from '@angular/router';
+import { ToastService } from 'src/app/services/toast.service';
+import { EliminateEventPage } from 'src/app/modals/eliminate-event/eliminate-event.page';
+import { SqliteService } from 'src/app/services/sqlite.service';
+import { ExpedientTaskModalPageNavParamsTask } from 'src/app/models/ExpedientTaskModalPage';
+import { DocumentSetUpMeetingPage } from 'src/app/modals/document-set-up-meeting/document-set-up-meeting.page';
+import { ExpedientTaskModalPage } from '../../gabinete-digital/expediente/expedient-task-modal/expedient-task-modal.page';
+import { ViewDocumentPage } from 'src/app/modals/view-document/view-document.page';
+import { BackgroundService } from 'src/app/services/background.service';
+import { StorageService } from 'src/app/services/storage.service';
+import { ThemeService } from 'src/app/services/theme.service'
+import { RouteService } from 'src/app/services/route.service';
+import { Storage } from '@ionic/storage';
+import { SessionStore } from 'src/app/store/session.service';
+import { CalendarService } from 'src/app/store/calendar.service';
+
+
+@Component({
+ selector: 'app-view-event',
+ templateUrl: './view-event.page.html',
+ styleUrls: ['./view-event.page.scss'],
+})
+
+export class ViewEventPage implements OnInit {
+
+ loadedEvent: Event;
+ isEventEdited: boolean;
+ eventBody: EventBody;
+ loadedAttachments: any;
+ pageId: string;
+ showLoader: boolean;
+
+ minDate: Date;
+
+ profile: string;
+ eventId: string;
+ CalendarId: string;
+ caller: string;
+ customDate: any;
+ today: any;
+
+ months = ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"];
+ days = ["Domingo", "Segunda-feira", "Terça-feira", "Quarta-feira", "Quinta-feira", "Sexta-feira", "Sábado"];
+
+ dicIndex = 0;
+ isModal = false
+ header = true
+ task: ExpedientTaskModalPageNavParamsTask;
+ LoadedDocument: any = null;
+ sesseionStora = SessionStore
+
+ constructor(
+ private modalController: ModalController,
+ /* private navParams: NavParams, */
+ public eventsService: EventsService,
+ public alertController: AlertController,
+ public popoverController: PopoverController,
+ private activatedRoute: ActivatedRoute,
+ private router: Router,
+ private toastService: ToastService,
+ public platform: Platform,
+ private sqliteservice: SqliteService,
+ private backgroundservice: BackgroundService,
+ private storage: StorageService,
+ public ThemeService: ThemeService,
+ private RouteService: RouteService,
+ private ionicStorage: Storage,
+ private CalendarService: CalendarService
+ ) {
+
+ this.isEventEdited = false;
+ this.loadedEvent = new Event();
+ this.eventBody = { BodyType: "1", Text: "" };
+ this.loadedEvent.Body = this.eventBody;
+
+ this.activatedRoute.paramMap.subscribe(params => {
+ this.eventId = params['params'].eventId;
+
+ const urlParams = new URLSearchParams(window.location.search);
+ this.CalendarId = urlParams.get('CalendarId');
+
+ this.eventId = this.eventId.replace(' ', '')
+
+ if (params["params"].caller) {
+ this.caller = (params["params"].caller);
+ }
+
+ if (params["params"].isModal) {
+ this.isModal = params["params"].isModal
+ }
+
+ if (params["params"].header) {
+ this.header = params["params"].header
+ }
+ });
+
+ }
+
+ ngOnInit() {
+ this.loadEvent();
+
+ this.backgroundservice.registerBackService('Online', () => {
+ this.storage.get('eventEdit').then((req) => {
+ JSON.parse(req).forEach(element => {
+ this.eventsService.editEvent(element, 2, 3).subscribe((res) => {
+ this.storage.remove('eventEdit')
+
+ })
+ });
+ })
+ this.storage.get('eventDelete').then((req) => {
+ JSON.parse(req).forEach(element => {
+ this.eventsService.editEvent(element, 2, 3).subscribe((res) => {
+ this.storage.remove('eventDelete')
+
+ })
+ });
+ })
+ this.loadEvent();
+ });
+
+ window.onresize = (event) => {
+ // if not mobile remove all component
+ if (window.innerWidth >= 1024) {
+ this.modalController.dismiss(this.isEventEdited);
+ }
+ };
+
+ }
+
+ getEventsFromDB () {
+
+ return new Promise((resolve, reject) => {
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+ this.storage.get('agendaResponse').then((events) => {
+ resolve(events)
+ })
+ } else {
+ this.sqliteservice.getAllEvents().then((events: any[]) => {
+ resolve(events)
+
+ })
+ }
+ })
+ }
+
+
+ close() {
+
+ this.modalController.dismiss(this.isEventEdited);
+ }
+
+ goBack() {
+
+ if (this.isModal) {
+ this.close()
+ } else {
+ this.activatedRoute.paramMap.subscribe(params => {
+ if (params["params"].caller == 'expediente') {
+ window.history.back();
+ }
+ else {
+ this.router.navigate(['/home', params["params"].caller]);
+ }
+ });
+ }
+
+ }
+
+ doRefresh(ev) {
+ this.loadEvent();
+ ev.target.complete();
+ }
+
+ loadEvent() {
+ const loader = this.toastService.loading();
+
+ if(this.sesseionStora.user.Profile == 'MDGPR' || this.sesseionStora.user.Profile == 'PR') {
+ this.eventsService.getEvent(this.eventId).subscribe(res => {
+ this.loadedEvent = res;
+ this.addEventToDb(res);
+
+ loader.remove()
+ }, (error) => {
+
+
+ if (error.status === 0) {
+ this.getFromDb();
+ } else {
+ this.toastService.badRequest('Este evento já não existe na sua agenda')
+ loader.remove()
+ this.modalController.dismiss('Eevent not Foud');
+ this.RouteService.goBack();
+ }
+ loader.remove()
+ });
+ } else {
+
+
+ if(this.CalendarId) {
+ this.eventsService.genericGetEvent(this.eventId, this.CalendarId).subscribe(res => {
+ this.loadedEvent = res;
+ this.addEventToDb(res);
+
+ loader.remove()
+ }, (error) => {
+
+ if (error.status === 0) {
+ this.getFromDb();
+ } else {
+ this.toastService.badRequest('Este evento já não existe na sua agenda')
+ loader.remove()
+ this.modalController.dismiss('Eevent not Foud');
+ this.RouteService.goBack();
+ }
+ loader.remove()
+ });
+ }
+
+ }
+
+ }
+
+ deleteEvent() {
+
+ const loader = this.toastService.loading()
+
+ if(this.sesseionStora.user.Profile == 'MDGPR' || this.sesseionStora.user.Profile == 'PR') {
+ this.eventsService.deleteEvent(this.loadedEvent.EventId, 0, this.loadedEvent.CalendarName).subscribe(async () => {
+ const alert = await this.alertController.create({
+ cssClass: 'my-custom-class',
+ header: 'Evento removido',
+ buttons: ['OK']
+ });
+
+ setTimeout(() => {
+ alert.dismiss();
+ }, 1500);
+ this.goBack();
+ this.toastService._successMessage('Evento apagado');
+ }, () => { },
+ () => {
+ loader.remove();
+ });
+
+ } else {
+
+ this.eventsService.genericDeleteEvent(this.loadedEvent.EventId, 0, this.loadedEvent.CalendarName, this.loadedEvent.CalendarId).subscribe(async () => {
+ const alert = await this.alertController.create({
+ cssClass: 'my-custom-class',
+ header: 'Evento removido',
+ buttons: ['OK']
+ });
+
+ setTimeout(() => {
+ alert.dismiss();
+ }, 1500);
+ this.goBack();
+ this.toastService._successMessage('Evento apagado');
+ }, () => { },
+ () => {
+ loader.remove();
+ });
+
+
+ }
+ }
+
+
+ async OpenDeleteEventModal() {
+
+ const modal = await this.modalController.create({
+ component: EliminateEventPage,
+ componentProps: {
+ eventId: this.loadedEvent.EventId,
+ caller: this.caller,
+ },
+ cssClass: 'discart-expedient-modal',
+
+ });
+ await modal.present();
+ modal.onDidDismiss().then((res) => {
+
+
+ if (res) {
+ setTimeout(() => {
+ /* this.loadEvent(); */
+ this.loadEvent()
+ }, 250);
+ this.isEventEdited = true;
+ }
+ });
+
+ }
+
+
+ async editEventDetail() {
+
+ const modal = await this.modalController.create({
+ component: EditEventPage,
+ componentProps: {
+ eventId: this.loadedEvent.EventId,
+ caller: this.caller,
+ },
+ cssClass: 'modal modal-desktop',
+
+ });
+ await modal.present();
+ modal.onDidDismiss().then((res) => {
+
+
+ if (res) {
+ setTimeout(() => {
+ /* this.loadEvent(); */
+ this.loadEvent()
+ }, 250);
+ this.isEventEdited = true;
+ }
+ });
+
+ }
+
+ async editEvent() {
+
+
+ let classs;
+ if (window.innerWidth <= 800) {
+ classs = 'modal modal-desktop'
+ } else {
+ classs = 'modal modal-desktop showAsideOptions'
+ }
+
+ const modal = await this.modalController.create({
+ component: EditEventPage,
+ componentProps: {
+ event: this.loadedEvent,
+ caller: this.caller,
+ },
+ cssClass: classs,
+ });
+ await modal.present();
+ modal.onDidDismiss().then((res) => {
+
+
+ if (res) {
+ setTimeout(() => {
+ /* this.loadEvent(); */
+ this.loadEvent()
+ }, 250);
+ this.isEventEdited = true;
+ }
+ });
+ }
+
+ docIndex(index: number) {
+ this.dicIndex = index
+ }
+
+ async LoadDocumentDetails() {
+
+ const docId = this.loadedEvent.Attachments[this.dicIndex].SourceId
+ const applicationId: any = this.loadedEvent.Attachments[this.dicIndex].ApplicationId
+ const selectedDoc = this.loadedEvent.Attachments[this.dicIndex]
+
+
+
+ this.task = {
+ serialNumber: '',
+ taskStartDate: '',
+ isEvent: true,
+ workflowInstanceDataFields: {
+ FolderID: '',
+ Subject: selectedDoc.SourceName,
+ SourceSecFsID: selectedDoc.ApplicationId || selectedDoc['ApplicationID'],
+ SourceType: 'DOC',
+ SourceID: selectedDoc.SourceId,
+ DispatchNumber: ''
+ }
+ }
+
+
+ const modal = await this.modalController.create({
+ component: ViewDocumentPage,
+ componentProps: {
+ trustedUrl: '',
+ file: {
+ title: this.task.workflowInstanceDataFields.Subject,
+ url: '',
+ title_link: '',
+ },
+ Document: this.loadedEvent.Attachments[this.dicIndex],
+ applicationId: this.task.workflowInstanceDataFields.SourceSecFsID,
+ docId: selectedDoc.SourceId,
+ folderId: '',
+ task: this.task
+ },
+ cssClass: 'modal modal-desktop'
+ });
+ await modal.present();
+ }
+
+ async openBookMeetingModal() {
+
+ let classs;
+ if (window.innerWidth < 701) {
+ classs = 'book-meeting-modal modal modal-desktop'
+ } else {
+ classs = 'modal modal-desktop showAsideOptions'
+ }
+ const modal = await this.modalController.create({
+ component: DocumentSetUpMeetingPage,
+ componentProps: {
+ subject: this.task.workflowInstanceDataFields.Subject,
+ document: this.loadedEvent.Attachments[this.dicIndex],
+ },
+ cssClass: classs,
+ backdropDismiss: false
+ });
+ await modal.present();
+ modal.onDidDismiss().then(res => {
+ //this.RouteService.goBack();
+ });
+ }
+
+ // efetuar despacho
+ async openExpedientActionsModal(taskAction: any) {
+
+ let classs;
+ if (window.innerWidth < 701) {
+ classs = 'modal modal-desktop'
+ } else {
+ classs = 'modal modal-desktop showAsideOptions'
+ }
+ const modal = await this.modalController.create({
+ component: ExpedientTaskModalPage,
+ componentProps: {
+ taskAction: taskAction,
+ task: this.task,
+ seachDocuments: this.loadedEvent.Attachments[this.dicIndex],
+ aplicationId: this.loadedEvent.Attachments[this.dicIndex].ApplicationId || this.loadedEvent.Attachments[this.dicIndex]['ApplicationID']
+ },
+ cssClass: classs,
+ });
+ await modal.present();
+ modal.onDidDismiss().then(async (res) => { });
+
+ }
+
+
+ addEventToDb(data) {
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+ this.ionicStorage.set('eventDetails', data).then(() => {
+
+ })
+ } else {
+ let event = {
+ Attendees: JSON.stringify(data.Attendees) || JSON.stringify(''),
+ Body: JSON.stringify(data.Body) || JSON.stringify(''),
+ CalendarId: data.CalendarId,
+ CalendarName: data.CalendarName,
+ Category: data.Category,
+ EndDate: data.EndDate,
+ EventId: data.EventId,
+ EventRecurrence: JSON.stringify(data.EventRecurrence) || JSON.stringify(''),
+ EventType: data.EventType,
+ HasAttachments: data.HasAttachments,
+ IsAllDayEvent: data.IsAllDayEvent,
+ IsMeeting: data.IsMeeting,
+ IsRecurring: data.IsRecurring,
+ Location: data.Location,
+ Organizer: JSON.stringify(data.Organizer) || JSON.stringify(''),
+ StartDate: data.StartDate,
+ Subject: data.Subject,
+ TimeZone: data.TimeZone
+ }
+
+ this.sqliteservice.updateEvent(event);
+ }
+ }
+
+
+ getFromDb() {
+ const loader = this.toastService.loading();
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+ this.ionicStorage.get('eventDetails').then((events) =>{
+ this.loadedEvent = events;
+ })
+ } else {
+ this.sqliteservice.getEventById(this.eventId).then((event) => {
+ let arrayevent = [];
+
+ let elemet = {
+ Attendees: (typeof JSON.parse(event[0].Attendees) === 'undefined') ? "" : JSON.parse(event[0].Attendees),
+ Body: JSON.parse(event[0].Body) || "",
+ CalendarId: event[0].CalendarId,
+ CalendarName: event[0].CalendarName,
+ Category: event[0].Category,
+ EndDate: event[0].EndDate,
+ EventId: event[0].EventId,
+ EventRecurrence: JSON.parse(event[0].EventRecurrence) || "",
+ EventType: event[0].EventType,
+ HasAttachments: event[0].HasAttachments,
+ IsAllDayEvent: event[0].IsAllDayEvent,
+ IsMeeting: event[0].IsMeeting,
+ IsRecurring: event[0].IsRecurring,
+ Location: event[0].Location,
+ Organizer: JSON.parse(event[0].Organizer) || "",
+ StartDate: event[0].StartDate,
+ Subject: event[0].Subject,
+ TimeZone: event[0].TimeZone
+ }
+ arrayevent.push(elemet);
+ this.loadedEvent = arrayevent[0];
+
+ })
+ }
+
+ loader.remove()
+ }
+}
diff --git a/src/app/pages/cal-modal/cal-modal.page.html b/src/app/pages/cal-modal/cal-modal.page.html
deleted file mode 100644
index 0d8e4863f..000000000
--- a/src/app/pages/cal-modal/cal-modal.page.html
+++ /dev/null
@@ -1,128 +0,0 @@
-
-
-
-
-
-
-
- Novo Evento
-
-
-
-
-
-
-
-
-
- Participantes
-
-
-
-
-
-
-
-
-
-
- Cancelar
-
-
-
- {{ viewTitle }}
-
-
- Enviar
-
-
-
-
-
diff --git a/src/app/pages/cal-modal/cal-modal.page.scss b/src/app/pages/cal-modal/cal-modal.page.scss
deleted file mode 100644
index e7a445d83..000000000
--- a/src/app/pages/cal-modal/cal-modal.page.scss
+++ /dev/null
@@ -1,34 +0,0 @@
-.div-ion-content{
- margin: 15px;
-}
-:host ::ng-deep{
- .monthview-container {
- height: auto !important;
- }
- .event-detail-container{
- display: none;
- }
-}
-.div-attach{
- border: 1px solid #ccc;
- margin: 15px 0 0 0;
- padding: 15px;
-}
-.error{
- color:red;
- font-size: 12px;
- font-weight: bold;
- padding-bottom: 20px;
- }
-/* ion-item{
- display: block;
- border: 1px solid red;
- width: 100%;
- float: left;
-} */
-.span-color{
- color:red;
-}
-/* .ion-badge{
-
-} */
\ No newline at end of file
diff --git a/src/app/pages/cal-modal/cal-modal.page.ts b/src/app/pages/cal-modal/cal-modal.page.ts
deleted file mode 100644
index 113233d18..000000000
--- a/src/app/pages/cal-modal/cal-modal.page.ts
+++ /dev/null
@@ -1,243 +0,0 @@
-import { Component, OnInit, AfterViewInit, Input } from '@angular/core';
-import { ModalController, NavParams } from '@ionic/angular';
-
-import { Event } from '../../models/event.model';
-import { EventsService } from 'src/app/services/events.service';
-import { EventBody } from 'src/app/models/eventbody.model';
-import { AttendeesPage } from 'src/app/pages/events/attendees/attendees.page';
-
-import { AttendeeModalPage } from '../events/attendee-modal/attendee-modal.page';
-import { EventPerson } from 'src/app/models/eventperson.model';
-import { AlertService } from 'src/app/services/alert.service';
-import { FormGroup, FormBuilder, Validators } from "@angular/forms";
-
-@Component({
- selector: 'app-cal-modal',
- templateUrl: './cal-modal.page.html',
- styleUrls: ['./cal-modal.page.scss'],
-})
-export class CalModalPage implements OnInit {
-
- calendar = {
- mode: 'month',
- currentDate: new Date()
- };
-
- eventAttendees: EventPerson[];
- segment:string = "true";
- selectedSegment: string;
- selectedDate: Date;
-
- viewTitle: string;
- postEvent: Event;
- eventBody: EventBody;
- modalReady = false;
-
- minDate: string;
-
- ionicForm: FormGroup;
- isSubmitted = false;
-
- formSubjectSatus: boolean = false;
- formDescriptionSatus: boolean = false;
- formLocationSatus: boolean = false;
- formEventTypeSatus: boolean = false;
-
- constructor(public formBuilder: FormBuilder, private modalCtrl: ModalController, private eventService: EventsService, private alertController:AlertService,
- private navParams: NavParams) {
- this.postEvent = new Event();
- this.eventBody = { BodyType : "1", Text : ""};
- this.postEvent.Body = this.eventBody;
-
- }
-
- ngOnInit() {
- this.selectedSegment = this.navParams.get('segment');
- this.selectedDate = this.navParams.get('eventSelectedDate');
-
- let selectedStartdDate = this.selectedDate;
- let selectedEndDate = new Date(this.selectedDate);
- /* Set + 30minutes to seleted datetime */
- selectedEndDate.setMinutes(this.selectedDate.getMinutes() + 30)
-
- this.minDate = this.selectedDate.toString();
-
- if(this.selectedSegment != "Combinada"){
- this.postEvent ={
- EventId: '',
- Subject: '',
- Body: this.eventBody,
- Location: '',
- CalendarId: '',
- CalendarName: this.selectedSegment,
- StartDate: selectedStartdDate,
- EndDate: new Date(selectedEndDate),
- EventType: 'Reunião',
- Attendees: null,
- IsMeeting: false,
- IsRecurring: false,
- AppointmentState: 0,
- TimeZone: '',
- Organizer: '',
- Categories: null,
- HasAttachments: false,
- };
- }
- else{
- this.postEvent ={
- EventId: '',
- Subject: '',
- Body: this.eventBody,
- Location: '',
- CalendarId: '',
- CalendarName: 'Oficial',
- StartDate: selectedStartdDate,
- EndDate: new Date(selectedEndDate),
- EventType: 'Reunião',
- Attendees: null,
- IsMeeting: false,
- IsRecurring: false,
- AppointmentState: 0,
- TimeZone: '',
- Organizer: '',
- Categories: null,
- HasAttachments: false,
- };
- }
- this.ionicForm = this.formBuilder.group({
- subject: ['', [Validators.required]],
- agenda: ['', [Validators.required]],
- startdate: ['', [Validators.required]],
- enddate: ['', [Validators.required]],
- description: ['', [Validators.required]],
- location: ['', [Validators.required]],
- eventtype: ['', [Validators.required]]
- })
- }
-
- get errorControl() {
- return this.ionicForm.controls;
- }
-
- ngAfterViewInit(): void {
- setTimeout(()=>{
- this.modalReady = true;
- }, 0);
- }
-
- save(){
- if (this.ionicForm.valid)
- {
- this.eventService.postEvent(this.postEvent, this.postEvent.CalendarName).subscribe();
- this.modalCtrl.dismiss(this.postEvent);
- }
- else{
- this.validateFormInputs();
- }
- }
-
- validateFormInputs(){
- let formSubject = this.postEvent.Subject.trim();
- let formDescription = this.postEvent.Body.Text.trim();
- let formLocation = this.postEvent.Location.trim();
-
- if (!this.postEvent.Subject && formSubject.length <= 0){
- this.formSubjectSatus=true;
- }
- else{
- this.formSubjectSatus=false;
- if(!this.postEvent.Body.Text && formDescription.length <= 0){
- this.formDescriptionSatus=true;
- }
- else{
- this.formDescriptionSatus=false;
- if (!this.postEvent.Location && formLocation.length <= 0){
- this.formLocationSatus=true;
- }
- else{
- this.formLocationSatus=false;
- }
- }
- }
- /* return (this.postEvent.Subject && formSubject.length > 0); */
- }
-
- onViewTitleChanged(title){
- this.viewTitle = title;
- }
-
- onTimeSelected(ev){
- /* this.postEvent.startTime = new Date(ev.selectedTime); */
-
- }
-
- close(){
- this.modalCtrl.dismiss();
- /* this.modalCtrl.dismiss(this.postEvent); */
- }
-
- async addAttendees()
- {
- const modal = await this.modalCtrl.create({
- component: AttendeeModalPage,
- componentProps: {
- eventPersons: this.postEvent.Attendees
- },
- cssClass: 'attendee-modal',
- backdropDismiss: false
- });
-
- await modal.present();
-
- modal.onDidDismiss().then((data) => {
- let newattendees: EventPerson[] = data['data'];
-
-
- if (newattendees != null)
- {
- newattendees.forEach(newattendee => {
- let att = {
- "EmailAddress": newattendee.EmailAddress,
- "Name": newattendee.Name,
- "IsRequired": (this.segment == "true")
- };
- if (this.eventAttendees == null)
- {
- this.eventAttendees = new Array();
- }
- this.eventAttendees.push(att);
-
- });
- }
- this.postEvent.Attendees = this.eventAttendees;
- });
- }
-
- showAlert(){
- this.alertController.presentAlert("Funcionalidade em desenvolvimento");
- }
-
- async openAttendees()
- {
- const modal = await this.modalCtrl.create({
- component: AttendeesPage,
- componentProps: {
- eventAttendees: this.postEvent.Attendees
- },
- cssClass: 'attendee',
- backdropDismiss: false
- });
-
- await modal.present();
-
- modal.onDidDismiss().then((data) => {
- if (data['data'] != null)
- {
- let newattendees: EventPerson[] = data['data'];
- this.postEvent.Attendees = newattendees;
- }
- });
-}
-
-
-}
diff --git a/src/app/pages/chat/chat-routing.module.ts b/src/app/pages/chat/chat-routing.module.ts
new file mode 100644
index 000000000..4d1596c1b
--- /dev/null
+++ b/src/app/pages/chat/chat-routing.module.ts
@@ -0,0 +1,37 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { ChatPage } from './chat.page';
+import { GroupMessagesPage } from './group-messages/group-messages.page';
+import { MessagesPage } from './messages/messages.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: ChatPage,
+ },
+ {
+ path: 'new-group',
+ loadChildren: () => import('./new-group/new-group.module').then( m => m.NewGroupPageModule)
+ },
+ {
+ path: 'group-messages',
+ loadChildren: () => import('./group-messages/group-messages.module').then( m => m.GroupMessagesPageModule)
+ },
+ {
+ path: 'messages',
+ outlet:'message',
+ loadChildren: () => import('./messages/messages.module').then( m => m.MessagesPageModule)
+ },
+ {
+ path: 'edit-group',
+ loadChildren: () => import('./edit-group/edit-group.module').then( m => m.EditGroupPageModule)
+ }
+
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class ChatPageRoutingModule {}
diff --git a/src/app/pages/chat/chat.module.ts b/src/app/pages/chat/chat.module.ts
new file mode 100644
index 000000000..7c341c85a
--- /dev/null
+++ b/src/app/pages/chat/chat.module.ts
@@ -0,0 +1,61 @@
+import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { ChatPageRoutingModule } from './chat-routing.module';
+
+import { ChatPage } from './chat.page';
+import { SharedModule } from 'src/app/shared/shared.module';
+import { RouterModule } from '@angular/router';
+import { GroupMessagesPage } from 'src/app/shared/chat/group-messages/group-messages.page';
+import { MessagesPage } from 'src/app/shared/chat/messages/messages.page';
+import { EmptyChatPage } from 'src/app/shared/chat/empty-chat/empty-chat.page';
+import { ContactsPage } from 'src/app/shared/chat/messages/contacts/contacts.page';
+import { NewGroupPage } from 'src/app/shared/chat/new-group/new-group.page';
+import { GroupContactsPage } from 'src/app/shared/chat/group-messages/group-contacts/group-contacts.page';
+import { PipesModule } from 'src/app/pipes/pipes.module';
+import { EditGroupPage } from 'src/app/shared/chat/edit-group/edit-group.page';
+
+import { ContactsPageModule } from 'src/app/shared/chat/messages/contacts/contacts.module';
+import { GroupMessagesPageModule } from 'src/app/shared/chat/group-messages/group-messages.module';
+import { NewGroupPageModule } from 'src/app/shared/chat/new-group/new-group.module';
+import { EditGroupPageModule } from 'src/app/shared/chat/edit-group/edit-group.module';
+import { GroupContactsPageModule } from 'src/app/shared/chat/group-messages/group-contacts/group-contacts.module';
+import { MessagesPageModule } from 'src/app/shared/chat/messages/messages.module';
+import { EmptyChatPageModule } from 'src/app/shared/chat/empty-chat/empty-chat.module';
+import { HeaderPageModule } from 'src/app/shared/header/header.module';
+import { NewEventPageModule } from 'src/app/shared/agenda/new-event/new-event.module';
+import { AttendeeModalPageModule } from 'src/app/shared/event/attendee-modal/attendee-modal.module';
+import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
+import { ImageCropperModule } from 'ngx-image-cropper';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+ FontAwesomeModule,
+ PipesModule,
+ ChatPageRoutingModule,
+ RouterModule,
+ HeaderPageModule,
+ MessagesPageModule,
+ ContactsPageModule,
+ GroupMessagesPageModule,
+ NewGroupPageModule,
+ EditGroupPageModule,
+ GroupContactsPageModule,
+ EmptyChatPageModule,
+ NewEventPageModule,
+ ImageCropperModule,
+ AttendeeModalPageModule,
+ ],
+ declarations: [
+ ChatPage
+ ],
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+ entryComponents: []
+})
+export class ChatPageModule {}
diff --git a/src/app/pages/chat/chat.page.html b/src/app/pages/chat/chat.page.html
new file mode 100644
index 000000000..17440a86f
--- /dev/null
+++ b/src/app/pages/chat/chat.page.html
@@ -0,0 +1,270 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Chat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Conversas
+
+
+ Grupos
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{room.lastMessage.msg}}
+
está escrever...
+
+
+
+
+
+ audio
+
+
+ {{room.lastMessage.file.name || room.lastMessage.file.subject}}
+
+
+
+
+
+ Fotografia
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{group.name.split('-').join(' ')}}
+
+
{{group.duration}}
+
{{group.countDownTime}}
+
+
+
{{group.lastMessage.u.name}}: {{group.lastMessage.msg}}
+
{{group.userThatIsTyping}} está escrever ...
+
+
+
+ audio
+
+ {{ group.lastMessage.attachments[0].title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/pages/chat/chat.page.scss b/src/app/pages/chat/chat.page.scss
new file mode 100644
index 000000000..e192f166b
--- /dev/null
+++ b/src/app/pages/chat/chat.page.scss
@@ -0,0 +1,180 @@
+ion-content{
+ --background: transparent;
+ }
+ :host{
+ // background: #0782c9;
+ }
+
+ .title-content{
+ width: 100%;
+ margin-bottom: 15px;
+ padding: 0 !important;
+ background: #fff;
+
+ .div-title{
+ padding: 0!important;
+ float: left;
+ }
+ .title{
+ font-size: 25px;
+ }
+ .div-icon{
+ display: flex;
+ width: fit-content;
+ float: right;
+ font-size: 35px;
+ overflow: auto;
+ padding: 1px;
+ justify-content: flex-end;
+ }
+ .div-icon ion-icon{
+ float: right;
+ padding-left: 20px;
+ }
+ }
+
+
+.main-content{
+ font-family: Roboto;
+ margin: 0 auto;
+ background-color: #fff;
+
+ overflow: auto;
+
+ .aside-wrapper{
+ margin: 0 !important;
+ overflow: auto;
+
+ .title-content{
+ padding: 30px 20px 0 20px !important;
+ }
+
+ .aside{
+ padding: 0 !important;
+ overflow: auto;
+ }
+ }
+
+ .iconschatnew-group{
+ width: 30px;
+ height: 30px;
+ object-fit: contain;
+ margin: 0 5px 0 5px;
+ }
+ .iconschatnew-conversation{
+ width: 30px;
+ height: 30px;
+ object-fit: contain;
+ margin: 0 5px 0 5px;
+ }
+
+}
+
+.item{
+ width: 100%;
+ border-bottom: 1px solid #ebebeb;
+ padding: 0px 20px 0 20px !important;
+ overflow: hidden;
+
+ .item-icon{
+ width: 40px;
+ float: left;
+
+ .icon{
+ margin-top: 10px;
+ font-size: 40px;
+ }
+ }
+ .item-content{
+ //width: 317px;
+ float:right;
+ }
+
+ .item-title-time{
+ width: 100%;
+ overflow: auto;
+ margin-top: 10px;
+ }
+ .item-title{
+ width: calc(100% - 90px);
+ float: left;
+ font-size: 15px;
+ color: var(--title-text-color);
+ }
+ .item-title-active{
+ color: #fff;
+}
+ .item-date{
+ width: 90px;
+ float: right;
+ font-size: 13px;
+ color: #797979;
+ text-align: right;
+ }
+ .item-date-active{
+ color: #fff;
+ }
+
+ .item-description{
+ font-size: 13px;
+ color: #000;
+ overflow: auto;
+
+ .item-message{
+ float: left;
+ padding-right: 5px;
+ }
+ .item-files{
+ float: left;
+ overflow: auto;
+
+ .item-files-title{
+ width: 100%;
+ }
+ }
+ }
+ .item-description-active{
+ color: #fff;
+ }
+}
+
+.item-active{
+ color: #fff !important;
+ background-color: var(--gabinete-active-hove-background) !important;
+}
+@media only screen and (min-width: 701px) {
+ .main-content{
+
+ .aside-wrapper{
+ width: 35%;
+ border-right: 1px solid #d8d8d8;
+ .aside-title{
+ font-size: 25px;
+ }
+ }
+ /* .aside{
+ width: 340px;
+ } */
+ .aside-content{
+ width: 65%;
+ display: flex !important;
+ background-color: white;
+ }
+ .item{
+ .item-icon{
+ width: 10%;
+ margin-right: 10px !important;
+ }
+ .item-content{
+ width: 90%;
+ }
+ }
+
+ }
+
+}
+
+.highlight {
+ color: #fff !important;
+ background-color: #42b9fe !important;
+}
diff --git a/src/app/pages/chat/chat.page.spec.ts b/src/app/pages/chat/chat.page.spec.ts
new file mode 100644
index 000000000..d499f6bfc
--- /dev/null
+++ b/src/app/pages/chat/chat.page.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { ChatPage } from './chat.page';
+
+describe('ChatPage', () => {
+ let component: ChatPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ ChatPage ],
+ imports: [IonicModule.forRoot()]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(ChatPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/chat/chat.page.ts b/src/app/pages/chat/chat.page.ts
new file mode 100644
index 000000000..47f66ab09
--- /dev/null
+++ b/src/app/pages/chat/chat.page.ts
@@ -0,0 +1,716 @@
+import { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams } from '@angular/common/http';
+import {
+ Component,
+ OnInit,
+ ViewChild,
+ ViewContainerRef,
+ Output,
+} from '@angular/core';
+import { ModalController, Platform } from '@ionic/angular';
+import { AuthService } from 'src/app/services/auth.service';
+import { ChatService } from 'src/app/services/chat.service';
+import { WsChatMethodsService} from 'src/app/services/chat/ws-chat-methods.service'
+import { GroupMessagesPage } from './group-messages/group-messages.page';
+import { ContactsPage } from './messages/contacts/contacts.page';
+import { MessagesPage } from './messages/messages.page';
+import { NewGroupPage } from './new-group/new-group.page';
+import { EditGroupPage } from 'src/app/shared/chat/edit-group/edit-group.page';
+import { Subject } from "rxjs/Rx";
+import { NavigationStart, Router } from '@angular/router';
+import { EventPerson } from 'src/app/models/eventperson.model';
+import { removeDuplicate } from 'src/plugin/removeDuplicate.js'
+import { environment } from 'src/environments/environment';
+import { TimeService } from 'src/app/services/functions/time.service';
+import { ThemeService } from 'src/app/services/theme.service'
+import { DataService } from 'src/app/services/data.service';
+import { SqliteService } from 'src/app/services/sqlite.service';
+import { StorageService } from 'src/app/services/storage.service';
+import { SessionStore } from 'src/app/store/session.service';
+
+
+
+@Component({
+ selector: 'app-chat',
+ templateUrl: './chat.page.html',
+ styleUrls: ['./chat.page.scss'],
+})
+export class ChatPage implements OnInit {
+
+ showLoader: boolean;
+
+ headers: HttpHeaders;
+ options: any;
+ X_User_Id: any;
+ X_Auth_Token: any;
+
+ loggedUser: any;
+ segment: string;
+ allGroups: any[];
+ privateGroups: any[];
+ publicGroups: any[];
+ userConnectedList: any[];
+ userRooms: any[];
+ userChannels: any[];
+ userDirectMessages: any[];
+ result: any;
+ dmUsers: any[] = [];
+ idSelected: string;
+
+ desktopComponent: any = {
+ showMessages: false,
+ showGroupMessages: false,
+ }
+
+ @ViewChild('messagecontainer', { read: ViewContainerRef }) entry: ViewContainerRef;
+ componentRef: any;
+
+ roomId: any;
+ groupRoomId: any;
+ showEmptyComponent = true;
+ showMessages = false;
+ showContacts = false;
+ showNewGroup = false;
+ showEditGroup = false;
+ showGroupMessages = false;
+ showGroupContacts = false;
+ showNewEvent = false;
+ showAttendees = false;
+ emptyTextDescription = 'Sem conversa selecionada';
+
+ @Output() getRoomInfo;
+
+
+ subject: any;
+ public messages: Subject;
+
+ message = {
+ "msg": "connect",
+ "version": "1",
+ "support": ["1"]
+ };
+
+ loggedUserChat: any;
+ hideRefreshBtn = true;
+
+ taskParticipants: any = [];
+ taskParticipantsCc: any = [];
+ adding: "intervenient" | "CC" = "intervenient";
+ profile: 'mdgpr' | 'pr';
+ eventSelectedDate: Date = new Date();
+ contacts: EventPerson[];
+ showEventEditOrOpen: "edit" | "add" | "" | "eventoToApprove" = ""
+
+ constructor(
+ private chatService: ChatService,
+ private modalController: ModalController,
+ private authService: AuthService,
+ private route: Router,
+ private timeService: TimeService,
+ public ThemeService: ThemeService,
+ private dataService: DataService,
+ private router: Router,
+ private sqlservice: SqliteService,
+ private platform: Platform,
+ private storageservice: StorageService,
+ public wsChatMethodsService: WsChatMethodsService,
+ ) {
+
+ this.loggedUserChat = authService.ValidatedUserChat['data'];
+ this.headers = new HttpHeaders();
+ window.onresize = (event) => {
+ if (window.innerWidth > 701) {
+ this.modalController.dismiss();
+ }
+ };
+
+ this.showLoader = true;
+
+ }
+
+ ngOnInit() {
+
+ /* let data = {
+ status: "success",
+ data: {
+ userId: "CqYSKR5hrAumZihs7",
+ authToken: "bvh5BH98Av5ShMnEW94Cwm1Hf-yHEHbl121ijq5Odc_sdvs"
+ }
+ }
+ SessionStore.user.ChatData = data
+ SessionStore.save() */
+ console.log(SessionStore.user.ChatData.data.authToken)
+ this.chatService.refreshtoken();
+
+ this.segment = "Contactos";
+
+ this.authService.userData$.subscribe((res: any) => {
+ this.loggedUser = res;
+
+ });
+
+ this.hideRefreshButton();
+ this.getChatMembers();
+
+ let t = this.showDateDuration(new Date());
+
+ this.router.events.forEach((event) => {
+ if (event instanceof NavigationStart && event.url.startsWith('/home/chat')) {
+ if (this.dataService.get("newGroup")) {
+ this.openNewGroupPage();
+ }
+ else{
+ this.closeAllDesktopComponents();
+ this.showEmptyComponent = true;
+ }
+ }
+ else{
+ this.dataService.set("newGroup", false);
+ }
+ });
+ }
+
+ numSequence(n: number): Array {
+ return Array(n);
+ }
+
+ ngOnDestroy() {
+ this.setStatus('offline');
+ this.dataService.set("newGroup", false);
+
+ }
+
+ setStatus(status: string) {
+ let body = {
+ message: '',
+ status: status,
+ }
+ this.chatService.setUserStatus(body).subscribe(res => {
+
+ })
+ }
+
+ hideRefreshButton() {
+ window.onresize = (event) => {
+ if (window.innerWidth < 701) {
+ this.idSelected = '';
+ this.hideRefreshBtn = false;
+ }
+ else {
+ this.hideRefreshBtn = true;
+ if (this.idSelected == '') {
+ this.showEmptyComponent = true;
+ }
+ }
+ }
+ if (window.innerWidth < 701) {
+ this.idSelected = '';
+ this.hideRefreshBtn = false;
+ }
+ }
+
+ closeAllDesktopComponents() {
+ this.showMessages = false;
+ this.showContacts = false;
+ this.showNewGroup = false;
+ this.showEditGroup = false;
+ this.showGroupMessages = false;
+ this.showEmptyComponent = false;
+ this.showGroupContacts = false;
+ this.showNewEvent = false;
+ this.showAttendees = false;
+
+ }
+
+ showEmptyContainer() {
+ this.idSelected = '';
+ this.showEmptyComponent = true;
+ }
+ openGroupContactsPage(data) {
+ this.idSelected = '';
+ this.groupRoomId = data;
+ this.closeAllDesktopComponents();
+ if (window.innerWidth < 701) {
+
+ }
+ else {
+ this.showGroupContacts = true;
+ }
+ }
+ openMessagesPage(rid) {
+ if (window.innerWidth < 701) {
+ this.openMessagesModal(rid);
+ }
+ else {
+ this.idSelected = rid;
+ this.closeAllDesktopComponents();
+ this.showEmptyComponent = false;
+ this.roomId = rid;
+ this.showMessages = true;
+ }
+ }
+ openContactsPage() {
+
+ this.idSelected = '';
+ this.closeAllDesktopComponents();
+
+ if (window.innerWidth < 701) {
+ this.selectContact();
+ }
+ else {
+
+ this.showContacts = true;
+ }
+ }
+ openNewGroupPage() {
+ this.idSelected = '';
+ if (window.innerWidth < 701) {
+ this.newGroup();
+ }
+ else {
+ this.closeAllDesktopComponents();
+ this.showNewGroup = true;
+ }
+ }
+
+ openEditGroupPage(rid) {
+ if (window.innerWidth < 701) {
+ this.editGroup(rid);
+ }
+ else {
+ this.closeAllDesktopComponents();
+ this.showEditGroup = true;
+ }
+ }
+
+ openGroupMessagesPage(rid) {
+ if (window.innerWidth < 701) {
+ this.openGroupMessagesModal(rid);
+ }
+ else {
+ this.idSelected = rid;
+ this.closeAllDesktopComponents();
+ this.showEmptyComponent = false;
+ this.roomId = rid;
+
+ this.showGroupMessages = true;
+ }
+ }
+
+ openNewEventPage(data: any) {
+ this.taskParticipants = data.members.map((val) => {
+ return {
+ Name: val.name,
+ EmailAddress: val.username + "@" + environment.domain,
+ IsRequired: "true",
+ }
+ });
+ this.groupRoomId = data.roomId;
+ this.closeAllDesktopComponents();
+ if (window.innerWidth < 701) {
+
+ }
+ else {
+ this.showNewEvent = true;
+ }
+ }
+
+ async openAttendeesComponent(data) {
+ this.adding = data.type
+ this.closeAllDesktopComponents();
+ this.showAttendees = true;
+ }
+
+ async clearContact() {
+ this.contacts = [];
+ }
+
+ async setContact(data: EventPerson[]) {
+ this.contacts = data;
+ }
+
+ async setIntervenient(data) {
+ this.taskParticipants = removeDuplicate(data)
+
+ }
+
+ async setIntervenientCC(data) {
+ this.taskParticipantsCc = removeDuplicate(data)
+ }
+
+ async closeAttendeesComponent() {
+ this.closeAllDesktopComponents();
+ this.showNewEvent = true;
+ }
+
+ async closeNewEventComponent() {
+ this.closeAllDesktopComponents();
+ this.showEmptyComponent = true;
+ this.idSelected = "";
+ }
+
+ onSegmentChange() {
+ //this.load();
+ }
+
+ doRefresh(event) {
+ setTimeout(() => {
+ //this.load();
+ event.target.complete();
+ }, 1000);
+ }
+
+ customRoom() {
+ let params = new HttpParams();
+ params = params.set("types", "c");
+ this.chatService.customsRooms(params).subscribe(res => {
+ //
+ });
+ }
+
+
+ getDirectMessagesDB() {
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+ this.storageservice.get("rooms").then((rooms) =>{
+
+ this.userDirectMessages = rooms.sort((a, b) => {
+ var dateA = new Date(a._updatedAt).getTime();
+ var dateB = new Date(b._updatedAt).getTime();
+ return dateB - dateA;
+ });
+ //
+
+ //
+ })
+
+ this.storageservice.get('chatusers').then((users) => {
+ this.dmUsers = users.filter(data => data.username != SessionStore.user.UserName);
+ })
+ } else {
+ this.sqlservice.getAllChatRoom().then((rooms: any) => {
+ //
+ let roomsArray = [];
+ rooms.forEach(element => {
+ let roomListDB = {
+ _id: element.Id,
+ uids: this.isJson(element.Uids),
+ usernames: this.isJson(element.Usernames),
+ lastMessage: this.isJson(element.LastMessage),
+ _updatedAt: element.UpdatedAt
+ }
+ if(element.customFields == "undefined") {
+ roomsArray.push(roomListDB)
+ }
+ });
+
+ this.userDirectMessages = roomsArray.sort((a, b) => {
+ var dateA = new Date(a._updatedAt).getTime();
+ var dateB = new Date(b._updatedAt).getTime();
+ return dateB - dateA;
+ });
+ //
+
+ //
+ })
+
+ this.sqlservice.getAllChatUsers().then((userslist: any) => {
+ //
+ let chatusersArray = [];
+ userslist.forEach(element => {
+
+ let userListDB = {
+ _id: element.Id,
+ name: element.Name,
+ username: element.Username
+ }
+
+ chatusersArray.push(userListDB);
+ });
+
+ this.dmUsers = chatusersArray.filter(data => data.username != SessionStore.user.UserName);
+
+ })
+ }
+ }
+
+ transformDataRoomList(data) {
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+ let roomsArray = [];
+ data.forEach(element => {
+ let roomList = {
+ _id: element._id,
+ uids: element.uids,
+ usernames: element.usernames,
+ lastMessage: element.lastMessage,
+ _updatedAt: element._updatedAt
+ }
+
+ //
+ roomsArray.push(roomList)
+ });
+
+ this.storageservice.remove('rooms');
+ this.storageservice.store('rooms', roomsArray);
+
+ } else {
+ data.forEach(element => {
+ let roomList = {
+ id: element._id,
+ uids: element.uids,
+ usernames: element.usernames,
+ lastMessage: element.lastMessage,
+ updatedat: element._updatedAt
+ }
+
+ //
+ this.sqlservice.addChatListRoom(roomList);
+ });
+ }
+ }
+
+ async transformDataUserList(users) {
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+ let usersArray = [];
+ users.forEach(element => {
+ //
+ let chatusers = {
+ _id: element._id,
+ name: element.name,
+ username: element.username
+ }
+ //
+ usersArray.push(chatusers);
+ });
+ await this.storageservice.remove('chatusers');
+ await this.storageservice.store('chatusers',usersArray);
+ } else {
+ users.forEach(element => {
+ //
+ let chatusers = {
+ id: element._id,
+ name: element.name,
+ username: element.username
+ }
+ //
+ this.sqlservice.addChatListUsers(chatusers);
+ });
+ }
+ }
+
+ showDateDuration(start: any) {
+ return this.timeService.showDateDuration(start);
+ }
+
+ countDownDate(date: any, roomId: string) {
+ return this.timeService.countDownDate(date, roomId);
+ }
+
+ async getChatMembers() {
+
+ this.chatService.getAllUsers().subscribe(res => {
+ //
+ this.transformDataUserList(res['users'])
+
+ });
+ }
+
+ getGroupsDB() {
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+ this.storageservice.get("grouprooms").then((rooms) =>{
+
+ let k = rooms.sort((a, b) => {
+ var dateA = new Date(a._updatedAt).getTime();
+ var dateB = new Date(b._updatedAt).getTime();
+ return dateB - dateA;
+ });
+
+
+
+
+ this.allGroups = rooms.sort((a, b) => {
+ var dateA = new Date(a._updatedAt).getTime();
+ var dateB = new Date(b._updatedAt).getTime();
+ return dateB - dateA;
+ });
+
+
+ //
+ })
+
+ this.storageservice.get('chatusers').then((users) => {
+ this.dmUsers = users.filter(data => data.username != SessionStore.user.UserName);
+ })
+ } else {
+ this.sqlservice.getAllChatRoom().then((rooms: any) => {
+
+ let roomsArray = [];
+ rooms.forEach(element => {
+ let fddf = this.isJson(element.LastMessage);
+ let roomListDB = {
+ _id: element.Id,
+ customFields: this.isJson(element.customFields),
+ name: element.name,
+ lastMessage: this.isJson(element.LastMessage),
+ _updatedAt: element.UpdatedAt
+ }
+ if(element.customFields != "undefined") {
+ roomsArray.push(roomListDB)
+ }
+ });
+
+ this.allGroups = roomsArray.sort((a, b) => {
+ var dateA = new Date(a._updatedAt).getTime();
+ var dateB = new Date(b._updatedAt).getTime();
+ return dateB - dateA;
+ });
+ //
+
+ })
+
+ }
+
+ }
+
+ async transformGroups(data) {
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+ let groupsArray = [];
+ data.forEach(element => {
+ let roomList = {
+ _id: element._id,
+ uids: element.uids,
+ usernames: element.usernames,
+ name: element.name,
+ customFields: element.customFields,
+ lastMessage: element.lastMessage,
+ _updatedAt: element._updatedAt
+ }
+
+
+ groupsArray.push(roomList)
+ });
+
+ await this.storageservice.remove('grouprooms');
+ await this.storageservice.store('grouprooms', groupsArray);
+
+ } else {
+ data.forEach(element => {
+ let roomList = {
+ id: element._id,
+ uids: element.uids,
+ usernames: element.usernames,
+ customFields: element.customFields,
+ name: element.name,
+ lastMessage: element.lastMessage,
+ updatedat: element._updatedAt
+ }
+
+
+ this.sqlservice.addChatListRoom(roomList);
+ });
+ }
+
+ }
+
+ async getGroups(event?) {
+ this.result = this.chatService.getAllPrivateGroups().subscribe(async (res: any) => {
+ //
+ this.showLoader = false;
+ if (res.groups != 200) {
+
+ this.transformGroups(res.groups);
+ this.getGroupsDB();
+
+ this.privateGroups = res.groups;
+
+
+ if (this.route.url != "/home/chat") {
+ //
+ }
+ else {
+ //Check if modal is opened
+ if (this.segment == "Grupos" && this.showGroupMessages != true) {
+ await new Promise(resolve => setTimeout(resolve, 1000));
+ //await this.getGroups();
+ }
+ }
+ }
+ else {
+ //await this.getGroups();
+ }
+ });
+ }
+
+ isJson(str) {
+ try {
+ JSON.parse(str);
+ } catch (e) {
+ return str;
+ }
+ return JSON.parse(str);
+ }
+
+ async selectContact() {
+ const modal = await this.modalController.create({
+ component: ContactsPage,
+ cssClass: 'modal modal-desktop',
+ });
+ await modal.present();
+ modal.onDidDismiss();
+ }
+
+ async newGroup() {
+ const modal = await this.modalController.create({
+ component: NewGroupPage,
+ cssClass: 'modal modal-desktop',
+ });
+ await modal.present();
+ modal.onDidDismiss();
+ }
+
+ async editGroup(roomId) {
+ const modal = await this.modalController.create({
+ component: EditGroupPage,
+ cssClass: 'modal modal-desktop',
+ componentProps: {
+ roomId: roomId,
+ },
+ });
+ await modal.present();
+ modal.onDidDismiss().then((res) => {
+
+ this.modalController.dismiss(res.data);
+ });
+ }
+
+ async openMessagesModal(roomId: any) {
+ this.closeAllDesktopComponents();
+
+ //
+
+ const modal = await this.modalController.create({
+ component: MessagesPage,
+ cssClass: 'modal modal-desktop isMessagesChatOpened',
+ componentProps: {
+ roomId: roomId,
+ },
+ });
+ await modal.present();
+ modal.onDidDismiss();
+ }
+
+ async openGroupMessagesModal(roomId: any) {
+
+
+
+ const modal = await this.modalController.create({
+ component: GroupMessagesPage,
+ cssClass: 'modal modal-desktop isGroupChatOpened',
+ componentProps: {
+ roomId: roomId,
+ },
+ });
+ await modal.present();
+ modal.onDidDismiss();
+ }
+
+}
+
diff --git a/src/app/pages/chat/edit-group/edit-group-routing.module.ts b/src/app/pages/chat/edit-group/edit-group-routing.module.ts
new file mode 100644
index 000000000..bb3c59158
--- /dev/null
+++ b/src/app/pages/chat/edit-group/edit-group-routing.module.ts
@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { EditGroupPage } from './edit-group.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: EditGroupPage
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class EditGroupPageRoutingModule {}
diff --git a/src/app/pages/chat/edit-group/edit-group.module.ts b/src/app/pages/chat/edit-group/edit-group.module.ts
new file mode 100644
index 000000000..34c8f0802
--- /dev/null
+++ b/src/app/pages/chat/edit-group/edit-group.module.ts
@@ -0,0 +1,25 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { EditGroupPageRoutingModule } from './edit-group-routing.module';
+
+import { EditGroupPage } from './edit-group.page';
+import { SharedModule } from 'src/app/shared/shared.module';
+
+import { BtnSeguintePageModule } from 'src/app/shared/btn-seguinte/btn-seguinte.module';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+
+ EditGroupPageRoutingModule,
+ BtnSeguintePageModule,
+ ],
+ declarations: [EditGroupPage]
+})
+export class EditGroupPageModule {}
diff --git a/src/app/pages/chat/edit-group/edit-group.page.html b/src/app/pages/chat/edit-group/edit-group.page.html
new file mode 100644
index 000000000..70817d9f6
--- /dev/null
+++ b/src/app/pages/chat/edit-group/edit-group.page.html
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+ Grupo Ultra-secreto
+
+
+
+
+
+
+
diff --git a/src/app/pages/chat/edit-group/edit-group.page.scss b/src/app/pages/chat/edit-group/edit-group.page.scss
new file mode 100644
index 000000000..428f62e08
--- /dev/null
+++ b/src/app/pages/chat/edit-group/edit-group.page.scss
@@ -0,0 +1,151 @@
+ion-content{
+ --background:transparent;
+}
+.header-toolbar{
+ --background:transparent;
+ --opacity: 1;
+}
+.div-top-header{
+ width: 400px;
+ margin: 0 auto;
+ background-color: #0782c9;
+ overflow: auto;
+ padding-top: 15px;
+ border: 0!important;
+
+ .div-search{
+ font-size: 45px;
+ float: left;
+ margin: 0 0 0 10px
+ }
+ .div-logo{
+ background: transparent;
+ width: 140px;
+ margin: 5px 0 0px 71px;
+ float: left;
+ }
+ .div-logo img{
+ width: 100%;
+ }
+ .div-profile{
+ font-size: 45px;
+ float: right;
+ margin-right: 10px;
+ }
+
+ }
+ .main-header{
+ width: 100%; /* 400px */
+ height: 100%;
+ font-family: Roboto;
+ border-top-left-radius: 25px;
+ border-top-right-radius: 25px;
+ background-color: #fff;
+ overflow:hidden;
+ padding: 30px 20px 0px 20px;
+ color:#000;
+ transform: translate3d(0, 1px, 0);
+
+ .title-content{
+ width: 360px;
+ margin: 0px auto;
+ overflow: auto;
+ padding: 0 !important;
+ background: #fff;
+
+ .left{
+ width: 37px;
+ float: left;
+ font-size: 35px;
+ overflow: auto;
+ }
+ .middle{
+ padding: 0!important;
+ float: left;
+ width: 221px;
+ margin: 2.5px 0 0 5px;
+ }
+ .right{
+ padding: 0!important;
+ float: right;
+ font-size: 15px;
+ color: #0782c9;
+ margin: 8px 0 0 5px;
+ }
+ }
+
+ .title{
+ font-size: 25px;
+ }
+ .div-icon{
+ width: 40px;
+ float: right;
+ font-size: 35px;
+ overflow: auto;
+ padding: 1px;
+ }
+ .div-icon ion-icon{
+ float: right;
+ padding-left: 20px;
+ }
+
+
+ }
+ .main-content{
+ width: 100%; /* 400px */
+ height: 100%;
+ font-family: Roboto;
+ margin: 0 auto;
+ background-color: #fff;
+ overflow:auto;
+ padding: 15px 20px 0 20px;
+
+ .item-container{
+ width: 360px;
+ margin: 15px auto;
+ border: 1px solid #ebebeb;
+ border-radius: 5px;
+ padding-left: 10px;
+ }
+
+ .item-container-no-border{
+ display: flex;
+ width: 360px;
+ margin: 25px auto;
+ border-radius: 5px;
+ align-items: center;
+ }
+
+ .item-container-no-border ion-label{
+ padding-left: 10px;
+ font-size: 12px;
+ color: #000;
+ }
+ }
+
+ .container-div{
+ margin-bottom: 15px;
+ overflow: auto;
+
+ .ion-item-class-2{
+ width: 360px;
+ margin: 0px auto;
+
+ .ion-icon-class{
+ width: 45px;
+ height: 45px;
+ float: left;
+ padding: 10px;
+ font-size: 25px;
+ }
+ }
+ .ion-input-class{
+ width: 315px;
+ height: 45px;
+ border: 1px solid #ebebeb;
+ border-radius: 5px;
+ padding-left: 5px;
+ padding-right: 10px;
+ float: left;
+ }
+ }
diff --git a/src/app/pages/chat/edit-group/edit-group.page.spec.ts b/src/app/pages/chat/edit-group/edit-group.page.spec.ts
new file mode 100644
index 000000000..ee3f62d13
--- /dev/null
+++ b/src/app/pages/chat/edit-group/edit-group.page.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { EditGroupPage } from './edit-group.page';
+
+describe('EditGroupPage', () => {
+ let component: EditGroupPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ EditGroupPage ],
+ imports: [IonicModule.forRoot()]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(EditGroupPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/chat/edit-group/edit-group.page.ts b/src/app/pages/chat/edit-group/edit-group.page.ts
new file mode 100644
index 000000000..206348eff
--- /dev/null
+++ b/src/app/pages/chat/edit-group/edit-group.page.ts
@@ -0,0 +1,181 @@
+import { HttpErrorResponse } from '@angular/common/http';
+import { Component, OnInit } from '@angular/core';
+import { ModalController, NavParams, PickerController } from '@ionic/angular';
+import { ChatService } from 'src/app/services/chat.service';
+import { ThemeService } from 'src/app/services/theme.service'
+
+@Component({
+ selector: 'app-edit-group',
+ templateUrl: './edit-group.page.html',
+ styleUrls: ['./edit-group.page.scss'],
+})
+export class EditGroupPage implements OnInit {
+ showLoader: boolean;
+ displayDuration: any;
+ showDuration: boolean;
+ selectedDuration = ['','',''];
+ groupName:string;
+ room:any;
+ roomId:string;
+
+ constructor(
+ private modalController: ModalController,
+ private pickerController: PickerController,
+ private chatService: ChatService,
+ private navParams: NavParams,
+ public ThemeService: ThemeService
+ ) {
+ this.roomId = this.navParams.get('roomId');
+ }
+
+ ngOnInit() {
+ this.chatService.refreshtoken();
+ this.getRoomInfo();
+ }
+
+ getRoomInfo(){
+ this.chatService.getRoomInfo(this.roomId).subscribe(room=>{
+ this.room = room['room'];
+
+ this.groupName = this.room.name.split('-').join(' ');
+ });
+ }
+
+ close(){
+ this.modalController.dismiss();
+ }
+
+ changeGroupName(){
+ if(this.groupName.trim().length > 1){
+ let name = this.groupName.split(' ').join('-');
+ let body = {
+ "roomId": this.room._id,
+ "name": name,
+ }
+ this.chatService.renameGroup(body).subscribe(res=>{
+ this.modalController.dismiss(res['group']);
+ });
+ }
+ else{
+
+ }
+ }
+ _ionChange(event){
+ this.showDuration = event.detail.checked;
+ }
+ async showPicker(){
+ const picker = await this.pickerController.create({
+ cssClass: '',
+ buttons: [
+ {
+ text: 'Cancelar', role: 'cancel', cssClass: 'btn-cancel'
+ },
+ {
+ text: 'Ok',
+ cssClass: 'btn-cancel',
+ handler:(value:any)=>{
+
+ this.selectedDuration = [
+ value.days.value,
+ value.hours.value,
+ value.minutes.value,
+ ]
+
+ if(value.days.value != null && value.hours.value != null && value.minutes.value != null){
+ if(value.days.value > 0){
+ if(value.days.value == 1){
+ if(value.hours.value == 1){
+ this.displayDuration = value.days.value + " day " +
+ value.hours.value + " hora " +
+ value.minutes.value + " minutos";
+ }
+ else{
+ this.displayDuration = value.days.value + " days " +
+ value.hours.value + " horas " +
+ value.minutes.value + " minutos";
+ }
+ }
+ else{
+ if(value.hours.value == 1){
+ this.displayDuration = value.days.value + " days " +
+ value.hours.value + " hora " +
+ value.minutes.value + " minutos";
+ }
+ else{
+ this.displayDuration = value.days.value + " days " +
+ value.hours.value + " horas " +
+ value.minutes.value + " minutos";
+ }
+ }
+ }
+ else{
+ if(value.hours.value == 1){
+ this.displayDuration = value.hours.value + " hora " +
+ value.minutes.value + " minutos";
+ }
+ else{
+ this.displayDuration = value.hours.value + " horas " +
+ value.minutes.value + " minutos";
+ }
+ }
+ }
+ },
+ },
+ ],
+ columns: [
+ {
+ name: 'days',
+ prefix: 'Dias',
+ options: [
+ { text: '0', value: 0 },
+ { text: '1', value: 1 },
+ { text: '2', value: 2 },
+ { text: '3', value: 3 },
+ { text: '4', value: 4 },
+ ]
+ },
+ {
+ name: 'hours',
+ prefix: 'Horas',
+ options: [
+ { text: '0', value: 0 },
+ { text: '1', value: 1 },
+ { text: '2', value: 2 },
+ { text: '3', value: 3 },
+ { text: '4', value: 4 },
+ { text: '5', value: 5 },
+ { text: '6', value: 6 },
+ { text: '7', value: 7 },
+ { text: '8', value: 8 },
+ ]
+ },
+ {
+ name: 'minutes',
+ prefix: 'Minutos',
+ selectedIndex: 3,
+ options: [
+ { text: '0', value: 0 },
+ { text: '5', value: 5 },
+ { text: '10', value: 10 },
+ { text: '15', value: 15 },
+ { text: '20', value: 20 },
+ { text: '25', value: 25 },
+ { text: '30', value: 30 },
+ { text: '35', value: 35 },
+ { text: '45', value: 45 },
+ { text: '50', value: 50 },
+ { text: '55', value: 55 },
+ ]
+ }
+ ]
+ });
+ await picker.present();
+ picker.onDidDismiss().then(async data =>{
+ let day = await picker.getColumn('days');
+ let hour = await picker.getColumn('hours');
+ let minutes = await picker.getColumn('minutes');
+ });
+
+ }
+
+}
diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts-routing.module.ts b/src/app/pages/chat/group-messages/group-contacts/group-contacts-routing.module.ts
new file mode 100644
index 000000000..c998741ed
--- /dev/null
+++ b/src/app/pages/chat/group-messages/group-contacts/group-contacts-routing.module.ts
@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { GroupContactsPage } from './group-contacts.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: GroupContactsPage
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class GroupContactsPageRoutingModule {}
diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts.module.ts b/src/app/pages/chat/group-messages/group-contacts/group-contacts.module.ts
new file mode 100644
index 000000000..9878353f5
--- /dev/null
+++ b/src/app/pages/chat/group-messages/group-contacts/group-contacts.module.ts
@@ -0,0 +1,27 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { GroupContactsPageRoutingModule } from './group-contacts-routing.module';
+
+import { GroupContactsPage } from './group-contacts.page';
+import { SharedModule } from 'src/app/shared/shared.module';
+import { PipesModule } from 'src/app/pipes/pipes.module';
+
+import { BtnSeguintePageModule } from 'src/app/shared/btn-seguinte/btn-seguinte.module';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+
+ PipesModule,
+ GroupContactsPageRoutingModule,
+ BtnSeguintePageModule,
+ ],
+ declarations: [GroupContactsPage]
+})
+export class GroupContactsPageModule {}
diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.html b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.html
new file mode 100644
index 000000000..00bbea785
--- /dev/null
+++ b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.html
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Contactos selecção:
+
+
+
+
+ {{user.name}}
+
+
+
+ Apagar
+
+
+
+
+
+
+
+
+ {{header}}
+
+
+
+
+
+
+
+
diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.scss b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.scss
new file mode 100644
index 000000000..5275b7718
--- /dev/null
+++ b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.scss
@@ -0,0 +1,166 @@
+.header-toolbar{
+ --background:transparent;
+ --opacity: 1;
+
+ .main-header{
+ width: 100%; /* 400px */
+ height: 100%;
+ font-family: Roboto;
+ border-top-left-radius: 25px;
+ border-top-right-radius: 25px;
+ background-color: #fff;
+ overflow:hidden;
+ padding: 30px 20px 0px 20px;
+ color:#000;
+ transform: translate3d(0, 1px, 0);
+
+ .div-icon{
+ width: 40px;
+ float: right;
+ font-size: 35px;
+ overflow: auto;
+ padding: 1px;
+ }
+ .div-icon ion-icon{
+ float: right;
+ padding-left: 20px;
+ }
+ .title-content{
+ margin: 0px auto;
+ overflow: auto;
+ padding: 0 !important;
+ }
+
+ .back-icon{
+ width: 37px;
+ float: left;
+ font-size: 35px;
+ overflow: auto;
+
+ }
+ .div-title{
+ width: 221px;
+ padding: 0!important;
+ float: left;
+ margin: 2.5px 0 0 5px;
+ }
+ .title{
+ font-size: 25px;
+ }
+ }
+ }
+ .toolbar-search{
+ --padding-top:0 !important;
+ --padding-bottom:0 !important;
+ --padding-start:0 !important;
+ --padding-end:0 !important;
+
+ .search{
+ border: 1px solid #ebebeb;
+ margin: 5px 20px 5px 20px;
+ border-radius: 5px;
+ }
+ .search ion-searchbar{
+ /* border: 1px solid green; */
+ width: 100%;
+ margin: 0 !important;
+ padding: 0 !important;
+ --border-radius: 5px;
+ --box-shadow: none;
+ overflow: auto;
+ --icon-color: var(--font-awesome);
+ }
+
+ }
+ ion-content{
+ --background:transparent;
+ }
+ .main-content{
+ width: 100%;
+ height: 100%;
+ font-family: Roboto;
+ margin: 0 auto;
+ background-color: #fff;
+ overflow:auto;
+ padding: 0 0 0 0;
+
+ .members-label{
+ margin: 10px 20px 10px 20px !important;
+ /* font-size: 15px; */
+ font-weight: bold;
+ }
+
+ .members-checkbox{
+ display: flex;
+ margin: 0px 20px 0px 20px !important;
+ overflow: auto;
+ align-items: center;
+ border-bottom: 1px solid #ebebeb;
+ }
+
+ .members-options{
+ margin: 0px 20px 0px 19px !important;
+ overflow: auto;
+ }
+
+ .item-divider{
+ background: #ebebeb;
+ font-size: 15px;
+ margin: 10px 0 10px 0;
+ padding:5px 0 5px 20px;
+
+ }
+
+ .item-checkbox{
+ display: flex;
+ margin: 10px 20px 10px 20px !important;
+ overflow: auto;
+ align-items: center;
+
+ }
+
+ .members-checkbox ion-checkbox{
+ --border-color: var(--title-text-color);
+ --background-checked:var(--title-text-color);
+ float: left;
+ }
+
+ .item-checkbox ion-checkbox{
+ --border-color: var(--title-text-color);
+ --background-checked:var(--title-text-color);
+ float: left;
+ }
+
+ .item-checkbox p, .members-checkbox p{
+ display: block;
+ margin: 0 !important;
+ width: 330px;
+ padding-left: 10px;
+ font-size: 15px;
+ color: var(--title-text-color);
+ float: left;
+ }
+ .item-checkbox ion-icon, .members-checkbox ion-icon{
+ font-size: 10px;
+ float: left;
+ color:#99e47b;
+ margin-left: 10px;
+ }
+ .online{
+ color:#99e47b !important;
+ }
+ .offline{
+ color:#cbced1 !important;
+ }
+ .away{
+ color:#ffd21f !important;
+ }
+ .invisible{
+ color:#cbced1 !important;
+ }
+ .busy{
+ color:#f5455c !important;
+ }
+ }
+
+
\ No newline at end of file
diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.spec.ts b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.spec.ts
new file mode 100644
index 000000000..dde2043a8
--- /dev/null
+++ b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { GroupContactsPage } from './group-contacts.page';
+
+describe('GroupContactsPage', () => {
+ let component: GroupContactsPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ GroupContactsPage ],
+ imports: [IonicModule.forRoot()]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(GroupContactsPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.ts b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.ts
new file mode 100644
index 000000000..405ce8086
--- /dev/null
+++ b/src/app/pages/chat/group-messages/group-contacts/group-contacts.page.ts
@@ -0,0 +1,209 @@
+import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';
+import { Component, OnInit } from '@angular/core';
+import { ModalController, NavParams } from '@ionic/angular';
+import * as _ from 'lodash';
+import { AuthService } from 'src/app/services/auth.service';
+import { ChatService } from 'src/app/services/chat.service';
+import { GroupMessagesPage } from '../group-messages.page';
+import { ThemeService } from 'src/app/services/theme.service'
+import { SessionStore } from 'src/app/store/session.service';
+import { WsChatMethodsService } from 'src/app/services/chat/ws-chat-methods.service';
+
+@Component({
+ selector: 'app-group-contacts',
+ templateUrl: './group-contacts.page.html',
+ styleUrls: ['./group-contacts.page.scss'],
+})
+export class GroupContactsPage implements OnInit {
+ showLoader: boolean;
+ loggedUser: any;
+ users = [];
+
+ contact: string[] = [" Ana M.", "Andre F.", "Bruno G.", "Catarina T", "Tiago"];
+
+ headers: HttpHeaders;
+ options:any;
+ listContacts: any[];
+ contacts: any;
+ textSearch:string;
+ room:any;
+ members:any;
+ dm:any;
+ isGroupCreated:boolean;
+ groupName:string;
+ selectedUserList:any;
+ sessionStore = SessionStore
+
+ constructor(
+ private modalController: ModalController,
+ private http: HttpClient,
+ private chatService: ChatService,
+ private authService: AuthService,
+ private navParams: NavParams,
+ public ThemeService: ThemeService,
+ public wsChatMethodsService: WsChatMethodsService,
+ )
+ {
+ this.loggedUser = authService.ValidatedUserChat['data'];
+
+ this.textSearch="";
+ this.dm=null;
+ this.room=null;
+ this.isGroupCreated = this.navParams.get('isCreated');
+ this.groupName = this.navParams.get('name');
+ this.room = this.navParams.get('room');
+ this.members = this.navParams.get('members');
+ }
+
+ ngOnInit() {
+ this.chatService.refreshtoken();
+ this.loadUsers();
+ this.getMembers();
+
+
+ }
+
+ loadUsers(){
+ this.options = {
+ headers: this.headers,
+ };
+ this.chatService.getAllUsers().subscribe((res:any)=>{
+ if(this.members){
+ this.contacts = res.users.filter(f => !this.members.some(item => item._id === f._id));
+ }
+ else{
+ this.contacts = res.users.filter(data => data.username != this.sessionStore.user.UserName);
+ }
+ this.users = this.contacts.sort((a,b) => {
+ if(a.name < b.name){
+ return -1;
+ }
+ if(a.name > b.name){
+ return 1;
+ }
+ return 0;
+ });
+
+
+ this.showLoader = false;
+ });
+ }
+
+ getMembers(){
+ if(this.room.t == "p"){
+ this.chatService.getGroupMembers(this.room._id).subscribe(res=>{
+ this.members = res['members'];
+ this.wsChatMethodsService.getAllRooms()
+ this.loadUsers();
+ });
+ }
+ else if(this.room.t == "c"){
+ this.chatService.getChannelMembers(this.room._id).subscribe(res=>{
+ this.members = res['members'];
+ this.wsChatMethodsService.getAllRooms()
+ this.loadUsers();
+ });
+ }
+ }
+
+ separateLetter(record, recordIndex, records){
+ if(recordIndex == 0){
+ return record.name[0];
+ }
+
+ let first_prev = records[recordIndex - 1].name[0];
+ let first_current = record.name[0];
+
+ if(first_prev != first_current){
+ return first_current;
+ }
+ return null;
+ }
+
+ deleteMember(data:any){
+ let body = {
+ "roomId": this.room._id,
+ "userId": data._id,
+ }
+
+ if(this.room.t == "p"){
+ this.chatService.removeGroupMember(body).subscribe(res=>{
+
+ this.getMembers();
+ });
+ }
+ else if(this.room.t == "c"){
+ this.chatService.removeChannelMember(body).subscribe(res=>{
+
+ this.getMembers();
+ });
+ }
+ }
+
+
+ doRefresh(ev){
+ this.loadUsers();
+ this.getMembers();
+ ev.target.complete();
+ }
+
+ async close(){
+ this.modalController.dismiss();
+ }
+
+ onChange(event){
+ this.textSearch = event.detail.value;
+ }
+ clicked(){
+
+
+ }
+ selectedContact(user:any){
+ /* this.groupName = this.room.name; */
+ user.isChecked = !user.isChecked;
+
+
+ }
+ addContacts(room:any){
+
+ this.selectedUserList = this.users.filter(function(contact) {
+ return contact.isChecked == true;
+ });
+
+ this.selectedUserList.forEach(user=>{
+ let body ={
+ "roomId":room._id,
+ "userId":user._id,
+
+ }
+ this.chatService.addUserToGroup(body).subscribe(res=>{
+
+ });
+ });
+ }
+
+ updateGroup(){
+ this.chatService.getRoomInfo(this.room._id).subscribe(room=>{
+ this.room = room['room'];
+ this.addContacts(this.room);
+ this.openGroupMessages(room['room']._id);
+ });
+ }
+
+ async openGroupMessages(roomId:any){
+ this.close();
+
+ const modal = await this.modalController.create({
+ component: GroupMessagesPage,
+ componentProps: {
+ roomId: roomId,
+ },
+ cssClass: 'group-messages',
+ backdropDismiss: false
+ });
+
+ await modal.present();
+ modal.onDidDismiss();
+ }
+
+}
diff --git a/src/app/pages/chat/group-messages/group-messages-routing.module.ts b/src/app/pages/chat/group-messages/group-messages-routing.module.ts
new file mode 100644
index 000000000..708ec8d8f
--- /dev/null
+++ b/src/app/pages/chat/group-messages/group-messages-routing.module.ts
@@ -0,0 +1,21 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { GroupMessagesPage } from './group-messages.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: GroupMessagesPage
+ },
{
+ path: 'group-contacts',
+ loadChildren: () => import('./group-contacts/group-contacts.module').then( m => m.GroupContactsPageModule)
+ }
+
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class GroupMessagesPageRoutingModule {}
diff --git a/src/app/pages/chat/group-messages/group-messages.module.ts b/src/app/pages/chat/group-messages/group-messages.module.ts
new file mode 100644
index 000000000..910c7e4e4
--- /dev/null
+++ b/src/app/pages/chat/group-messages/group-messages.module.ts
@@ -0,0 +1,38 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { BrowserModule } from '@angular/platform-browser';
+
+import { IonicModule } from '@ionic/angular';
+
+import { GroupMessagesPageRoutingModule } from './group-messages-routing.module';
+
+import { GroupMessagesPage } from './group-messages.page';
+
+import { ChatPopoverPageModule } from 'src/app/shared/popover/chat-popover/chat-popover.module';
+import { BtnModalDismissPageModule } from 'src/app/shared/btn-modal-dismiss/btn-modal-dismiss.module';
+
+import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
+import { ImageCropperModule } from 'ngx-image-cropper';
+import { AngularCropperjsModule } from 'angular-cropperjs';
+import { LettersAvatarModule } from "ngx-letters-avatar";
+import { PipesModule } from 'src/app/pipes/pipes.module';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ FontAwesomeModule,
+ IonicModule,
+ GroupMessagesPageRoutingModule,
+ ChatPopoverPageModule,
+ BtnModalDismissPageModule,
+ LettersAvatarModule,
+ PipesModule,
+ /* ImageCropperModule,
+ AngularCropperjsModule */
+
+ ],
+ declarations: [GroupMessagesPage]
+})
+export class GroupMessagesPageModule {}
diff --git a/src/app/pages/chat/group-messages/group-messages.page.html b/src/app/pages/chat/group-messages/group-messages.page.html
new file mode 100644
index 000000000..f7ce3f7f9
--- /dev/null
+++ b/src/app/pages/chat/group-messages/group-messages.page.html
@@ -0,0 +1,270 @@
+
+
+
+
+
+
+
+
+
+ Esta conversa passou a grupo
+ A conversa original mantêm-se como chat individual
+
+
+
+
+ {{msg.u.name ?? ""}}
+ {{msg.duration}}
+
+
+ {{msg.msg}}
+ {{msg.msg}}
+
+
+
+
+
+ = 1 && msg.viewed.length == 0" src="assets/images/check-double-solid.svg">
+ = 1" src="assets/images/check-double-solid -viewed.svg">
+
+ {{last ? scrollToBottom() : ''}}
+
+
+
+
+
+
+
+ {{msg.u.name ?? ""}}
+ {{msg.duration}}
+
+
+
+
+
+ NOT UPLOADED
+
+
+
+
+
+ {{"Imagem"}}
+
+
+
+
+
+
+
+
+
+ = 1 && msg.viewed.length == 0" src="assets/images/check-double-solid.svg">
+ = 1" src="assets/images/check-double-solid -viewed.svg">
+
+
+
+
+
+
+
+
+ {{file.title}}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{file.title}}
+
+
+
+
+
+
+ {{"Mensagem de voz"}}
+
+
+
+
+
+
+
+ {{file.description}}
+ •
+
+
+
+
+
+
+ = 1 && msg.viewed.length == 0" src="assets/images/check-double-solid.svg">
+ = 1" src="assets/images/check-double-solid -viewed.svg">
+
+
+
+
+
+ {{last ? scrollToBottom() : ''}}
+
+
+
+ {{msg.u.name ?? ""}} criou esta reunião
+ {{msg.file.subject}}
+ De {{showDateDuration(msg.file.start_date)}} a {{showDateDuration(msg.file.end_date)}}
+ {{msg.file.venue}}
+
+
+
+ Apagou a mensagem
+
+
+
+ Alterou o nome do grupo para "{{msg.msg.split('-').join(' ')}}"
+ {{last ? scrollToBottom() : ''}}
+
+
+
+
+ {{user.name}} saiu do grupo
+
+
+ {{last ? scrollToBottom() : ''}}
+
+
+
+
+ {{user.name}} foi removido do grupo
+
+
+ {{last ? scrollToBottom() : ''}}
+
+
+
+
+ Adicionou {{user.name}}
+
+
+ {{last ? scrollToBottom() : ''}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ wsChatMethodsService.getGroupRoom(roomId).userThatIsTyping }} está a escrever...
+
+
+
+
{{durationDisplay}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/pages/chat/group-messages/group-messages.page.scss b/src/app/pages/chat/group-messages/group-messages.page.scss
new file mode 100644
index 000000000..89849c416
--- /dev/null
+++ b/src/app/pages/chat/group-messages/group-messages.page.scss
@@ -0,0 +1,389 @@
+@import '~src/function.scss';
+.header-toolbar{
+ --background:transparent;
+ --opacity: 1;
+
+ .main-header{
+ width: 100%; /* 400px */
+ height: 100%;
+ font-family: Roboto;
+ border-top-left-radius: 25px;
+ border-top-right-radius: 25px;
+ background-color: #fff;
+ overflow:hidden;
+ padding: 30px 20px 0px 20px;
+ color:#000;
+ transform: translate3d(0, 1px, 0);
+
+ .header-top{
+ overflow: auto;
+ padding: 0 !important;
+ background: #fff;
+
+ .left{
+ width: fit-content;
+ float: left;
+ //font-size: 35px;
+ overflow: hidden;
+ }
+
+ .middle-container{
+ display: flex;
+ overflow: auto;
+ height: auto;
+ width:calc(100% - 47px);
+ float: left;
+
+ /* white-space: nowrap;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important; */
+
+ .middle{
+ width: 100%;
+ padding: 0!important;
+ margin: 0 0 0 10px;
+ font-size: 25px;
+ }
+ }
+ .middle-container-options{
+ padding: 0!important;
+ float: left;
+ width: calc(100% - 67px);
+ text-align: right;
+
+ .middle-container-options-icons{
+ color: #0782c9;
+ font-size: 23px;
+ }
+ }
+ .right{
+ padding: 0!important;
+ float: right;
+ font-size: 25px;
+ color: #0782c9;
+ }
+ .header-top-btn{
+ background: transparent;
+ font-size: 25px !important;
+ font-weight: 100 !important;
+ /* color: #0782c9; */
+ color: #42b9fe;
+ padding: 0 5px 0 5px;
+ }
+ }
+ .header-bottom{
+ padding-left: 10px;
+ overflow: auto;
+ margin: 0 auto;
+
+ .header-bottom-icon{
+ width: 30px;
+ font-size: 25px;
+ float: left;
+ padding: 2px;
+
+ }
+ .header-bottom-contacts{
+ width: calc(100% - 40px);
+ font-size: 15px;
+ color: #797979;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ float: left;
+ padding: 5px;
+ margin: 1px;
+
+ .contacts-list{
+ white-space: nowrap;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ }
+ }
+ }
+
+ .div-icon{
+ width: 40px;
+ float: right;
+ font-size: 35px;
+ overflow: auto;
+ padding: 1px;
+ }
+ .div-icon ion-icon{
+ float: right;
+ padding-left: 20px;
+ }
+ }
+ }
+ ion-content{
+ .welcome-text{
+ /* width: 322px; */
+ width: em(422px);
+ background: #ebebeb;
+ text-align: center;
+ font-size: 13px;
+ color: #797979;
+ padding: 10px;
+ margin: 0 auto;
+ line-height: 1.2rem;
+ margin: 20px 39px 25px;
+ border-radius: 8px;
+ }
+ .info-text{
+ display: flex;
+ width: fit-content;
+ height: auto;
+ background: var(--chat-alert-msg-color);
+ text-align: center;
+ font-size: 13px;
+ color: #262420;
+ padding: 10px;
+ margin: 10px auto;
+ line-height: 1.2rem;
+ border-radius: 8px;
+ }
+ .info-text-leave{
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: fit-content;
+ padding: 10px;
+ background: #e0e9ee;
+ border-radius: 8px;
+ margin: 10px auto;
+ color: #797979 !important;
+ font-size: 13px !important;
+ /* margin: 15px 0px 15px 0px; */
+
+ .info-text-leave ion-label{
+ font-size: 13px !important;
+ line-height: 1.2rem;
+ }
+ }
+ .messages{
+ font-size: 13px;
+ font-family: Roboto;
+ overflow: auto;
+
+ //set scroll do bottom
+ position: absolute;
+ top: 0;
+ left: 0;
+ overflow-x: hidden;
+ overflow-y: auto;
+ width: 100%;
+ height: 100%;
+ word-wrap: break-word;
+ -webkit-overflow-scrolling: touch;
+
+ .messages-list-item-wrapper{
+ overflow: hidden;
+ }
+ .messages-list-item-wrapper-active{
+ background: #e6f6ff75 !important;
+ }
+
+ .message-container{
+ //border: 1px solid red;
+ }
+
+
+ .incoming-true, .incoming-false{
+ width: 305px;
+ padding: 15px 20px;
+ border-radius: 10px;
+ }
+
+ .incoming-true{
+ margin: 10px 75px 10px 20px;
+ background: #ebebeb;
+ float: left;
+ }
+ }
+ .incoming-false{
+ margin: 10px 20px 10px 75px;
+ background: var(--chat-incoming-msg-color);
+ float: right;
+ }
+ .title{
+ color: var(--title-text-color);
+
+ font-weight: bold;
+ margin-bottom: 5px;
+
+ .time{
+ color: #797979;
+ text-align: right;
+ float: right;
+ }
+ }
+
+ .online{
+ color:#99e47b !important;
+ }
+ .offline{
+ color:#cbced1 !important;
+ }
+ .away{
+ color:#ffd21f !important;
+ }
+ .invisible{
+ color:#cbced1 !important;
+ }
+ .busy{
+ color:#f5455c !important;
+ }
+ }
+
+ .info-meeting{
+ /* width: 322px; */
+ width: em(422px);
+ background: var(--chat-alert-msg-color);
+ text-align: center;
+ font-size: 13px;
+ color: #262420;
+ padding: 10px;
+ margin: 10px auto;
+ line-height: 1.2rem;
+ /* margin: 15px 0px 15px 0px; */
+ border-radius: 8px;
+
+ .info-meeting-small{
+ font-size: 10px;
+ font-style: italic;
+ }
+ .info-meeting-medium{
+ font-size: 12px;
+ }
+ .info-meeting-normal{
+ color: #0782c9;
+ font-weight: 700;
+ text-decoration: underline;
+ }
+ .info-meeting-normal:hover{
+ text-decoration: underline;
+ color: #0782c9;
+ }
+ }
+
+ ion-footer{
+ padding-top: 7.5px;
+ padding-bottom: 7.5px;
+ .container{
+ justify-content: center;
+ justify-content: space-evenly;
+ align-items: center;
+
+ .message-box{
+ margin: 0 5px 0 5px;
+ }
+
+ }
+
+ .chat-icon-options{
+ display:block !important;
+ font-size: 35px;
+ float: right !important;
+ margin-top: 5px;
+ }
+
+ .chat-icon-send{
+ font-size: 45px;
+ margin: 0 auto;
+ margin-top: 4px;
+ }
+
+ .type-message{
+ display: flex;
+ border: 1px solid #ebebeb;
+ border-radius: 25px;
+ padding-left: 15px;
+ align-items: center;
+
+ overflow: auto;
+
+ ion-textarea{
+ margin: 0 !important;
+ align-self: center;
+ }
+ }
+
+}
+.preview-slides {
+ margin-top: 20%;
+ background: #e6e6e6;
+
+ img {
+ padding-top: 20px;
+ padding-bottom: 20px;
+ }
+}
+
+.transparent-modal {
+ .modal-wrapper {
+ --background: rgba(44, 39, 45, 0.2);
+ }
+}
+
+
+.image-slide,
+.image-card {
+ overflow: visible;
+}
+
+.image-card {
+ z-index: 9;
+}
+
+.backdrop {
+ height: 200%;
+ width: 100%;
+ background: black;
+ position: absolute;
+ z-index: 10;
+}
+
+
+.typing {
+ position: relative;
+ top: -25px;
+ height: 0px;
+ left: 0px;
+ margin-left: 22px;
+ display: flex;
+ font-size: 12px;
+ align-items: center;
+}
+
+
+.typing ngx-letters-avatar {
+ padding-right: 5px;
+}
+
+
+.float-status{
+ position: relative !important;
+ float: right;
+ display: flex;
+ align-items: self-end;
+}
+
+.float-status-image{
+ position: relative !important;
+ float: right;
+ display: flex;
+ align-items: self-end;
+ top: -15px;
+}
+
+.float-status-webtrix {
+ position: relative !important;
+ top: 0px !important;
+ float: right;
+ display: flex;
+ align-items: self-end;
+}
+
+.float-status-all {
+ font-size: 10pt !important;
+}
diff --git a/src/app/pages/chat/group-messages/group-messages.page.spec.ts b/src/app/pages/chat/group-messages/group-messages.page.spec.ts
new file mode 100644
index 000000000..62c380096
--- /dev/null
+++ b/src/app/pages/chat/group-messages/group-messages.page.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { GroupMessagesPage } from './group-messages.page';
+
+describe('GroupMessagesPage', () => {
+ let component: GroupMessagesPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ GroupMessagesPage ],
+ imports: [IonicModule.forRoot()]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(GroupMessagesPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/chat/group-messages/group-messages.page.ts b/src/app/pages/chat/group-messages/group-messages.page.ts
new file mode 100644
index 000000000..dccd9e4f3
--- /dev/null
+++ b/src/app/pages/chat/group-messages/group-messages.page.ts
@@ -0,0 +1,1114 @@
+import { Component, ElementRef, OnInit, ViewChild, AfterViewInit, OnDestroy, ChangeDetectorRef, } from '@angular/core';
+import { IonSlides, ModalController, NavParams, PopoverController, Platform } from '@ionic/angular';
+import { AlertService } from 'src/app/services/alert.service';
+import { AuthService } from 'src/app/services/auth.service';
+import { ChatService } from 'src/app/services/chat.service';
+import { ChatOptionsPopoverPage } from 'src/app/shared/popover/chat-options-popover/chat-options-popover.page';
+import { ChatPopoverPage } from 'src/app/shared/popover/chat-popover/chat-popover.page';
+import { GroupContactsPage } from './group-contacts/group-contacts.page';
+import { Router } from '@angular/router'
+import { EditGroupPage } from '../edit-group/edit-group.page';
+import { TimeService } from 'src/app/services/functions/time.service';
+import { FileService } from 'src/app/services/functions/file.service';
+import { ToastService } from 'src/app/services/toast.service';
+import { environment } from 'src/environments/environment';
+import { NewEventPage } from '../../agenda/new-event/new-event.page';
+import { EventPerson } from 'src/app/models/eventperson.model';
+import { ViewDocumentPage } from 'src/app/modals/view-document/view-document.page';
+import { ThemeService } from 'src/app/services/theme.service'
+import { ViewEventPage } from 'src/app/modals/view-event/view-event.page';
+import { SqliteService } from 'src/app/services/sqlite.service';
+import { WsChatMethodsService } from 'src/app/services/chat/ws-chat-methods.service';
+import { FileType } from 'src/app/models/fileType';
+import { Storage } from '@ionic/storage';
+
+import { CameraService } from 'src/app/services/camera.service';
+import { SearchPage } from 'src/app/pages/search/search.page';
+import { VoiceRecorder, RecordingData, GenericResponse } from 'capacitor-voice-recorder';
+import { Filesystem, Directory } from '@capacitor/filesystem';
+import { DomSanitizer } from '@angular/platform-browser';
+import { MessageService } from 'src/app/services/chat/message.service';
+import { File } from '@awesome-cordova-plugins/file/ngx';
+import { FileOpener } from '@awesome-cordova-plugins/file-opener/ngx';
+import { SessionStore } from 'src/app/store/session.service';
+
+@Component({
+ selector: 'app-group-messages',
+ templateUrl: './group-messages.page.html',
+ styleUrls: ['./group-messages.page.scss'],
+})
+export class GroupMessagesPage implements OnInit, AfterViewInit, OnDestroy {
+
+ showLoader: boolean;
+ isGroupCreated: boolean;
+ loggedUser: any;
+
+ room: any;
+ roomName: any;
+ members: any;
+ contacts: string[] = [" Ana M.", "Andre F.", "Bruno G.", "Catarina T", "Tiago"];
+ allUsers: any[] = [];
+
+ roomId: string;
+ loggedUserChat: any;
+ eventSelectedDate: Date = new Date();
+
+ scrollingOnce: boolean = true;
+ private scrollChangeCallback: () => void;
+ currentPosition: any;
+ startPosition: number;
+
+ capturedImage: any;
+ capturedImageTitle: any;
+ attendees: EventPerson[] = [];
+ scrollToBottomBtn = false;
+
+ longPressActive = false;
+ showMessageOptions = false;
+ selectedMsgId: string;
+ roomCountDownDate: any;
+ downloadFile: any;
+
+ @ViewChild('scrollMe') private myScrollContainer: ElementRef;
+
+ recording = false;
+ allowTyping = true;
+ storedFileNames = [];
+ lastAudioRecorded = '';
+ audioRecorded: any = "";
+ audioDownloaded: any = "";
+ durationDisplay = '';
+ duration = 0;
+ showAvatar = true;
+ audioPermissionStatus: 'granted'| 'denied' | 'prompt' | null = null
+ sessionStore = SessionStore
+ constructor(
+ private modalController: ModalController,
+ public popoverController: PopoverController,
+ private chatService: ChatService,
+ private navParams: NavParams,
+ private authService: AuthService,
+ private alertService: AlertService,
+ private route: Router,
+ private timeService: TimeService,
+ private fileService: FileService,
+ private toastService: ToastService,
+ public ThemeService: ThemeService,
+ private changeDetectorRef: ChangeDetectorRef,
+ private sqlservice: SqliteService,
+ private platform: Platform,
+ public wsChatMethodsService: WsChatMethodsService,
+ private storage: Storage,
+ private CameraService: CameraService,
+ private sanitiser: DomSanitizer,
+ private file: File,
+ private fileOpener: FileOpener,
+ ) {
+ this.loggedUserChat = authService.ValidatedUserChat['data'];
+ this.isGroupCreated = true;
+ this.roomId = this.navParams.get('roomId');
+ window.onresize = (event) => {
+ if (window.innerWidth > 701) {
+ this.modalController.dismiss();
+ }
+ };
+
+ this.wsChatMethodsService.getGroupRoom(this.roomId).loadHistory({});
+ this.wsChatMethodsService.getGroupRoom(this.roomId).scrollDown = this.scrollToBottomClicked;
+ this.wsChatMethodsService.openRoom(this.roomId)
+
+ setTimeout(() => {
+ this.scrollToBottomClicked()
+ }, 50)
+
+
+ this.showAvatar = false
+
+ setTimeout(() => {
+ this.scrollToBottomClicked()
+ this.showAvatar = true
+ }, 150)
+
+ }
+
+ ngOnInit() {
+ this.chatService.refreshtoken();
+
+ this.loggedUser = this.loggedUserChat;
+ this.getRoomInfo();
+ this.scrollToBottom();
+ this.serverLongPull();
+ this.setStatus('online');
+ this.getChatMembers();
+
+ this.getRoomMessageDB(this.roomId);
+ this.wsChatMethodsService.getUserOfRoom(this.roomId).then((value) => {
+
+ })
+
+ //this.loadFiles();
+ }
+
+ setStatus(status: string) {
+ let body = {
+ message: '',
+ status: status,
+ }
+ // this.chatService.setUserStatus(body).subscribe(res => {
+ //
+ // })
+ }
+
+ deleteMessage(msgId: string) {
+ const room = this.wsChatMethodsService.getGroupRoom(this.roomId)
+ this.alertService.confirmDeleteMessage(msgId, room);
+ }
+
+ ngAfterViewInit() {
+ this.scrollChangeCallback = () => this.onContentScrolled(event);
+ window.addEventListener('scroll', this.scrollChangeCallback, true);
+ this.roomCountDownDate = this.timeService.countDownDate(this.room.customFields.countDownDate, this.room._id);
+ }
+
+ handlePress(id?: string) {
+ this.selectedMsgId = id;
+ this.showMessageOptions = true;
+ }
+
+ handleClick() {
+ this.showMessageOptions = false;
+ this.selectedMsgId = "";
+ }
+
+ onContentScrolled(e) {
+ this.startPosition = e.srcElement.scrollTop;
+ let scroll = e.srcElement.scrollTop;
+ let windowHeight = e.srcElement.scrollHeight;
+ let containerHeight = windowHeight - e.srcElement.clientHeight;
+
+ if (scroll > this.currentPosition) {
+ //alert('BOTTOM');
+ } else {
+ //alert('UP');
+ this.scrollingOnce = false;
+ }
+ if ((containerHeight - 100) > scroll) {
+ this.scrollToBottomBtn = true;
+ }
+ else {
+ this.scrollToBottomBtn = false;
+ }
+ this.currentPosition = scroll;
+ }
+
+ calculateDuration() {
+ if (!this.recording) {
+ this.duration = 0;
+ this.durationDisplay = '';
+ return;
+ }
+ this.duration += 1;
+ const minutes = Math.floor(this.duration / 60);
+ const seconds = (this.duration % 60).toString().padStart(2, '0');
+ this.durationDisplay = `${minutes}:${seconds}`;
+
+ setTimeout(() => {
+ this.calculateDuration();
+ }, 1000)
+ }
+
+ async getFile(fileName?: any) {
+ const audioFile = await Filesystem.readFile({
+ path: fileName,
+ directory: Directory.Data
+ })
+ //
+ const base64sound = audioFile.data;
+
+ //Converting base64 to blob
+ const base64 = await fetch(base64sound);
+ //
+
+ const base64Response = await fetch(`data:audio/ogg;base64,${base64sound}`);
+ //
+
+ this.audioRecorded = base64Response.url;
+
+
+
+ }
+
+ async loadFiles() {
+
+ this.storage.get('fileName').then((fileName) => {
+ this.lastAudioRecorded = fileName;
+ })
+
+ try {
+ this.storage.get('recordData').then((recordData) => {
+
+ if (recordData?.value?.recordDataBase64.includes('data:audio')) {
+ this.audioRecorded = this.sanitiser.bypassSecurityTrustResourceUrl(recordData?.value?.recordDataBase64);
+ }
+ else if(recordData?.value?.mimeType && recordData?.value?.recordDataBase64) {
+ this.audioRecorded = this.sanitiser.bypassSecurityTrustResourceUrl(`data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`);
+ }
+ });
+ } catch (error) { }
+
+
+ }
+
+ stopRecording() {
+ this.deleteRecording();
+ this.allowTyping = false;
+
+ if (!this.recording) {
+ return;
+ }
+ this.recording = false;
+ VoiceRecorder.stopRecording().then(async (result: RecordingData) => {
+
+
+ this.recording = false;
+ if (result.value && result.value.recordDataBase64) {
+ const recordData = result.value.recordDataBase64;
+ //
+ const fileName = new Date().getTime() + ".mp3";
+ //Save file
+ await this.storage.set('fileName', fileName)
+ this.storage.set('recordData', result).then(() => {
+
+
+ setTimeout(async () => {
+ this.loadFiles();
+ }, 1000);
+ })
+ }
+ })
+
+ }
+
+ async startRecording() {
+ VoiceRecorder.requestAudioRecordingPermission();
+ if(await VoiceRecorder.canDeviceVoiceRecord().then((result: GenericResponse) =>{return result.value})){
+ if(await VoiceRecorder.requestAudioRecordingPermission().then((result: GenericResponse) => {return result.value})){
+ //if(await this.hasAudioRecordingPermission()){
+ if (this.recording) {
+ return;
+ }
+ this.recording = true;
+ VoiceRecorder.startRecording();
+ this.calculateDuration();
+ //}
+ }
+ else{
+ this.toastService._badRequest('Para gravar uma mensagem de voz, permita o acesso do Gabinete Digital ao seu microfone.');
+ }
+ }
+ else{
+ this.toastService._badRequest('Este dispositivo não tem capacidade para gravação de áudio!');
+ }
+ }
+
+
+
+ async deleteRecording() {
+ this.storage.remove('fileName');
+ this.storage.remove('recordData');
+
+ this.allowTyping = true;
+ this.lastAudioRecorded = '';
+ this.loadFiles();
+ }
+
+ async goToEvent(eventId: any) {
+ let classs;
+ if (window.innerWidth < 701) {
+ classs = 'modal modal-desktop'
+ } else {
+ classs = 'modal modal-desktop showAsideOptions'
+ }
+
+ const modal = await this.modalController.create({
+ component: ViewEventPage,
+ componentProps: {
+ eventId: eventId,
+ },
+ cssClass: classs,
+ });
+ await modal.present();
+ modal.onDidDismiss().then((res) => {
+
+ });
+ }
+
+ ngOnDestroy() {
+ window.removeEventListener('scroll', this.scrollChangeCallback, true);
+ }
+
+ scrollToBottom(): void {
+ try {
+ if (this.scrollingOnce) {
+ this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight;
+ //this.scrollingOnce = false;
+ }
+ } catch (err) { }
+ }
+
+ scrollToBottomClicked = () => {
+ try {
+ this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight;
+ } catch (err) { }
+ }
+
+ getRoomInfo() {
+ this.showLoader = true;
+ // this.chatService.getRoomInfo(this.roomId).subscribe(room => {
+ // this.room = room['room'];
+ // this.roomName = this.room.name.split('-').join(' ');
+ // if (this.room.customFields.countDownDate) {
+ // this.roomCountDownDate = this.timeService.countDownDateTimer(this.room.customFields.countDownDate, this.room._id);
+ // }
+ // this.getGroupContacts(this.room);
+ // this.showLoader = false;
+ // });
+ }
+
+ async getChatMembers() {
+ this.chatService.getAllUsers().subscribe(res => {
+
+
+ this.allUsers = res['users'].filter(data => data.username != SessionStore.user.UserName);
+
+ });
+ }
+
+ /* load(){
+ this.getGroupContacts();
+ this.loadGroupMessages();
+ } */
+
+ close() {
+ this.modalController.dismiss();
+ this.deleteRecording();
+ }
+
+ doRefresh(ev: any) {
+ this.getRoomInfo();
+ ev.target.complete();
+ }
+
+ getGroupContacts(room: any) {
+ this.showLoader = true;
+ //If group is private call getGroupMembers
+ if (this.room.t === 'p') {
+ this.chatService.getGroupMembers(this.roomId).subscribe(res => {
+
+ this.members = res['members'];
+ this.showLoader = false;
+ });
+ }
+ //Otherwise call getChannelMembers for públic groups
+ else {
+ this.chatService.getChannelMembers(this.roomId).subscribe(res => {
+
+ this.members = res['members'];
+ this.showLoader = false;
+ });
+ }
+ }
+
+
+ showDateDuration(start: any) {
+ return this.timeService.showDateDuration(start);
+ }
+ countDownDate(date: any, roomId: string) {
+ this.roomCountDownDate = this.timeService.countDownDate(date, roomId);
+ return this.timeService.countDownDateTimer(date, roomId);
+ }
+
+ addZero(i) {
+ if (i < 10) {
+ i = "0" + i;
+ }
+ return i;
+ }
+
+ sendMessage() {
+ this.wsChatMethodsService.getGroupRoom(this.roomId).send({})
+ }
+
+ base64toBlob(base64Data, contentType) {
+ contentType = contentType || '';
+ var sliceSize = 1024;
+ var byteCharacters = atob(base64Data);
+ var bytesLength = byteCharacters.length;
+ var slicesCount = Math.ceil(bytesLength / sliceSize);
+ var byteArrays = new Array(slicesCount);
+
+ for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
+ var begin = sliceIndex * sliceSize;
+ var end = Math.min(begin + sliceSize, bytesLength);
+
+ var bytes = new Array(end - begin);
+ for (var offset = begin, i = 0; offset < end; ++i, ++offset) {
+ bytes[i] = byteCharacters[offset].charCodeAt(0);
+ }
+ byteArrays[sliceIndex] = new Uint8Array(bytes);
+ }
+ return new Blob(byteArrays, { type: contentType });
+ }
+
+ async sendAudio(fileName) {
+
+ const roomId = this.roomId
+ let audioFile;
+ this.storage.get('recordData').then((recordData) => {
+
+ audioFile = recordData;
+ if (recordData?.value?.recordDataBase64.includes('data:audio')) {
+ this.audioRecorded = recordData?.value?.recordDataBase64;
+ }
+ else if(recordData?.value?.mimeType && recordData?.value?.recordDataBase64){
+ this.audioRecorded = `data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`;
+ }
+
+ //Converting base64 to blob
+ const encodedData = btoa(this.audioRecorded);
+ const blob = this.base64toBlob(encodedData, recordData.value.mimeType)
+
+ const formData = new FormData();
+ formData.append("blobFile", blob);
+
+ this.wsChatMethodsService.getGroupRoom(roomId).send({
+ file: {
+ "type": "application/audio",
+ "msDuration": audioFile.value.msDuration,
+ "mimeType": audioFile.value.mimeType,
+ },
+ attachments: [{
+ "title": fileName,
+ "title_link_download": true,
+ "type": "audio"
+ }],
+ temporaryData: formData
+ })
+
+ });
+ this.deleteRecording();
+ }
+
+
+ async openOptions() {
+ const modal = await this.popoverController.create({
+ component: ChatPopoverPage,
+ cssClass: 'chat-popover',
+ componentProps: {
+ roomId: this.roomId,
+ members: this.members,
+ },
+ });
+ await modal.present();
+ modal.onDidDismiss().then(res => {
+ if (res.data == 'leave') {
+
+ //this.wsChatMethodsService.subscribeToRoomUpdate(this.roomId, this.room);
+ }
+ else if (res.data == 'cancel') {
+
+ }
+ else if (res.data == 'edit') {
+ this.editGroup(this.roomId);
+ }
+ });
+ }
+
+
+ viewDocument(file: any, url?: string) {
+
+ if (file.type == "application/webtrix") {
+ this.openViewDocumentModal(file);
+ }
+ else {
+ let fullUrl = "https://www.tabularium.pt" + url;
+ this.fileService.viewDocumentByUrl(fullUrl);
+ }
+ }
+
+ async openViewDocumentModal(file: any) {
+
+ let task = {
+ serialNumber: '',
+ taskStartDate: '',
+ isEvent: true,
+ workflowInstanceDataFields: {
+ FolderID: '',
+ Subject: file.Assunto,
+ SourceSecFsID: file.ApplicationId,
+ SourceType: 'DOC',
+ SourceID: file.DocId,
+ DispatchNumber: ''
+ }
+ }
+
+ let doc = {
+ "Id": "",
+ "ParentId": "",
+ "Source": 1,
+ "ApplicationId": file.ApplicationId,
+ "CreateDate": "",
+ "Data": null,
+ "Description": "",
+ "Link": null,
+ "SourceId": file.DocId,
+ "SourceName": file.Assunto,
+ "Stakeholders": "",
+ }
+
+ const modal = await this.modalController.create({
+ component: ViewDocumentPage,
+ componentProps: {
+ trustedUrl: '',
+ file: {
+ title: file.Assunto,
+ url: '',
+ title_link: '',
+ },
+ Document: doc,
+ applicationId: file.ApplicationId,
+ docId: file.DocId,
+ folderId: '',
+ task: task
+ },
+ cssClass: 'modal modal-desktop'
+ });
+ await modal.present();
+
+ }
+
+ async bookMeeting() {
+ this.attendees = this.members.map((val) => {
+ return {
+ Name: val.name,
+ EmailAddress: val.username + "@" + environment.domain,
+ IsRequired: "true",
+ }
+ });
+
+ this.popoverController.dismiss();
+ if (window.innerWidth <= 1024) {
+ const modal = await this.modalController.create({
+ component: NewEventPage,
+ componentProps: {
+ attendees: this.attendees,
+ },
+ cssClass: 'modal modal-desktop',
+ backdropDismiss: false
+ });
+ await modal.present();
+ modal.onDidDismiss().then((data) => {
+ if (data) {
+
+ }
+ });
+ }
+ }
+
+
+
+ async takePicture() {
+ const roomId = this.roomId
+
+ const image = await this.CameraService.takePicture();
+ await this.fileService.saveImage(image)
+ const lastphoto: any = await this.fileService.loadFiles();
+ const { capturedImage, capturedImageTitle } = await this.fileService.loadFileData(lastphoto);
+ const base64 = await fetch(capturedImage);
+ const blob = await base64.blob();
+ const formData = new FormData();
+ formData.append("blobFile", blob);
+
+ this.wsChatMethodsService.getGroupRoom(roomId).send({
+ file: {
+ "type": "application/img",
+ "guid": ''
+ },
+ temporaryData: formData,
+ attachments: [{
+ "title": capturedImageTitle,
+ "text": "description",
+ "title_link_download": false,
+ }]
+ })
+
+ }
+
+ async addImage() {
+ this.addFileToChat(['image/apng', 'image/jpeg', 'image/png'])
+ }
+
+ async addFile() {
+ this.addFileToChat(['.doc', '.docx', '.pdf'])
+ }
+
+ async addFileWebtrix() {
+ const modal = await this.modalController.create({
+ component: SearchPage,
+ cssClass: 'group-messages modal-desktop search-modal search-modal-to-desktop',
+ componentProps: {
+ type: 'AccoesPresidenciais & ArquivoDespachoElect',
+ select: true,
+ showSearchInput: true,
+ }
+ });
+ await modal.present();
+ modal.onDidDismiss().then(async res => {
+ const data = res.data;
+
+ if (data.selected) {
+
+ this.wsChatMethodsService.getGroupRoom(this.roomId).send({
+ file: {
+ "name": res.data.selected.Assunto,
+ "type": "application/webtrix",
+ "ApplicationId": res.data.selected.ApplicationType,
+ "DocId": res.data.selected.Id,
+ "Assunto": res.data.selected.Assunto,
+ },
+ temporaryData: res,
+ attachments: [{
+ "title": res.data.selected.Assunto,
+ "description": res.data.selected.DocTypeDesc,
+ // "title_link": url_no_options,
+ "title_link_download": true,
+ //"thumb_url": "assets/images/webtrix-logo.png",
+ // "message_link": url_no_options,
+ "type": "webtrix",
+ //"thumb_url": "assets/images/webtrix-logo.png",
+ "text": res.data.selected.DocTypeDesc,
+ "thumb_url": "https://static.ichimura.ed.jp/uploads/2017/10/pdf-icon.png",
+ }]
+ })
+
+ }
+ });
+ }
+
+
+ async addFileToChat(types: typeof FileType[]) {
+
+ const roomId = this.roomId
+
+ const file: any = await this.fileService.getFileFromDevice(types);
+
+
+
+ if (file.type != "application/img" && file.type != "image/png" && file.type != "image/jpeg" && file.type != "image/gif") {
+
+ const encodedData = btoa(JSON.stringify(await this.getBase64(file)));
+ const blob = this.base64toBlob(encodedData, file.type)
+
+ const formData = new FormData();
+ formData.append('blobFile', blob);
+
+
+ this.wsChatMethodsService.getGroupRoom(roomId).send({
+ file: {
+ "type": file.type,
+ "guid": '',
+ },
+ attachments: [{
+ "title": file.name,
+ "name": file.name,
+ // "text": "description",
+ "title_link_download": false,
+ }],
+ temporaryData: formData
+ });
+
+ } else {
+
+ }
+
+ }
+
+ getFileReader(): FileReader {
+ const fileReader = new FileReader();
+ const zoneOriginalInstance = (fileReader as any)["__zone_symbol__originalInstance"];
+ return zoneOriginalInstance || fileReader;
+ }
+
+ getBase64(file) {
+ var reader = this.getFileReader();
+ reader.readAsDataURL(file);
+ return new Promise(resolve => {
+ reader.onload = function () {
+ resolve(reader.result)
+ };
+ reader.onerror = function (error) {
+
+ };
+ });
+
+ }
+
+ async openChatOptions(ev?: any) {
+
+ const roomId = this.roomId;
+
+ const popover = await this.popoverController.create({
+ component: ChatOptionsPopoverPage,
+ cssClass: 'chat-options-popover',
+ event: ev,
+ componentProps: {
+ room: this.room,
+ members: this.members,
+ eventSelectedDate: new Date(),
+ },
+ translucent: true
+ });
+ await popover.present();
+ await popover.onDidDismiss().then(async (res) => {
+
+ if (res['data'] == 'meeting') {
+ this.bookMeeting();
+ }
+ else if (res['data'] == 'take-picture') {
+ this.takePicture()
+ }
+ else if (res['data'] == 'add-picture') {
+ this.addImage()
+
+ }
+ else if (res['data'] == 'add-document') {
+ this.addFile()
+ }
+ else if (res['data'] == 'documentoGestaoDocumental') {
+
+ this.addFileWebtrix()
+ }
+ });
+ }
+
+ async addContacts() {
+
+
+ const modal = await this.modalController.create({
+ component: GroupContactsPage,
+ componentProps: {
+ isCreated: this.isGroupCreated,
+ room: this.room,
+ members: this.members,
+ name: this.room.name,
+ },
+ cssClass: 'contacts',
+ backdropDismiss: false
+ });
+
+ await modal.present();
+
+ modal.onDidDismiss().then(() => {
+ this.getRoomInfo();
+ });
+ }
+
+ async editGroup(roomId) {
+ const modal = await this.modalController.create({
+ component: EditGroupPage,
+ cssClass: 'modal modal-desktop',
+ componentProps: {
+ roomId: roomId,
+ },
+ });
+ await modal.present();
+ modal.onDidDismiss().then((res) => {
+
+ this.getRoomInfo();
+ //this.modalController.dismiss(res.data);
+ });
+ }
+
+ /* async actionSheet() {
+ const actionSheet = await this.actionSheetController.create({
+ cssClass: 'my-custom-class',
+ buttons: [{
+ text: 'Sair do grupo',
+ handler: () => {
+
+ }
+ }, {
+ text: 'Alterar nome do grupo1',
+ handler: () => {
+
+ this.openChangeGroupName()
+ }
+ }, {
+ text: 'Apagar o grupo',
+ handler: () => {
+
+ }
+ },
+ ]
+ });
+ await actionSheet.present();
+ }
+ */
+
+ getRoomMessageDB(roomId) {
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+ } else {
+ this.sqlservice.getAllChatMSG(roomId).then((msg: any) => {
+
+ let chatmsgArray = [];
+ let array = []
+ msg.forEach(element => {
+
+
+ let msgChat = {
+ _id: element.Id,
+ attachments: this.isJson(element.Attachments),
+ channels: this.isJson(element.Channels),
+ file: this.isJson(element.File),
+ mentions: this.isJson(element.Mentions),
+ msg: element.Msg,
+ rid: element.Rid,
+ ts: element.Ts,
+ u: this.isJson(element.U),
+ _updatedAt: element.UpdatedAt,
+ image_url: this.isJson(element.image_url)
+ }
+
+ chatmsgArray.push(msgChat)
+ });
+
+ // this.messages = chatmsgArray;
+
+ })
+ }
+ }
+
+ isJson(str) {
+ try {
+ JSON.parse(str);
+ } catch (e) {
+ return "";
+ }
+ return JSON.parse(str);
+ }
+
+ transformDataMSG(res) {
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+ } else {
+ res.forEach(element => {
+
+ let chatmsg = {
+ _id: element._id,
+ attachments: element.attachments,
+ channels: element.channels,
+ file: element.file,
+ mentions: element.mentions,
+ msg: element.msg,
+ rid: element.rid,
+ ts: element.ts,
+ u: element.u,
+ _updatedAt: element._updatedAt,
+ /* image_url: {
+ name: name,
+ path: `${IMAGE_DIR}/${name}`,
+ data: `data:image/jpeg;base64,${readFile.data}`,
+ }, */
+ }
+
+ this.sqlservice.addChatMSG(chatmsg)
+
+ });
+ }
+
+ }
+
+ async serverLongPull() {
+ this.chatService.getPrivateGroupMessages(this.roomId).subscribe(async res => {
+
+ if (res == 502) {
+ // Connection timeout
+ // happens when the connection was pending for too long
+ // let's reconnect
+ await this.serverLongPull();
+ } else if (res != 200) {
+ // Show Error
+ //showMessage(response.statusText);
+ //this.loadMessages()
+ let msgOnly = res['messages'].filter(data => data.t != 'au');
+ //this.messages = msgOnly.reverse();
+ //
+ this.transformDataMSG(msgOnly.reverse());
+ this.getRoomMessageDB(this.roomId);
+ // Reconnect in one second
+ if (this.route.url != "/home/chat") {
+
+ } else {
+ //Check if modal is opened
+ if (document.querySelector('.isGroupChatOpened')) {
+ await new Promise(resolve => setTimeout(resolve, 5000));
+ await this.serverLongPull();
+
+ }
+ }
+
+ } else {
+ // Got message
+ //let message = await response.text();
+ //this.loadMessages()
+ await this.serverLongPull();
+ }
+ });
+ }
+
+ sliderOpts = {
+ zoom: false,
+ slidesPerView: 1.5,
+ spaceBetween: 20,
+ centeredSlides: true
+ };
+ zoomActive = false;
+ zoomScale = 1;
+
+ sliderZoomOpts = {
+ allowSlidePrev: false,
+ allowSlideNext: false,
+ zoom: {
+ maxRatio: 5
+ },
+ on: {
+ zoomChange: (scale, imageEl, slideEl) => {
+ this.zoomActive = true;
+ this.zoomScale = scale / 5;
+ this.changeDetectorRef.detectChanges();
+ }
+ }
+ }
+
+ async touchEnd(zoomslides: IonSlides, card) {
+ // Zoom back to normal
+ const slider = await zoomslides.getSwiper();
+ const zoom = slider.zoom;
+ zoom.out();
+
+ // Card back to normal
+ card.el.style['z-index'] = 9;
+
+ this.zoomActive = false;
+ this.changeDetectorRef.detectChanges();
+ }
+
+ touchStart(card) {
+ // Make card appear above backdrop
+ card.el.style['z-index'] = 11;
+ }
+
+ b64toBlob(b64Data, contentType) {
+ contentType = contentType || '';
+ var sliceSize = 512;
+ b64Data = b64Data.replace(/^[^,]+,/, '');
+ b64Data = b64Data.replace(/\s/g, '');
+ var byteCharacters = window.atob(b64Data);
+ var byteArrays = [];
+
+ for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
+ var slice = byteCharacters.slice(offset, offset + sliceSize);
+
+ var byteNumbers = new Array(slice.length);
+ for (var i = 0; i < slice.length; i++) {
+ byteNumbers[i] = slice.charCodeAt(i);
+ }
+
+ var byteArray = new Uint8Array(byteNumbers);
+
+ byteArrays.push(byteArray);
+ }
+
+ var blob = new Blob(byteArrays, { type: contentType });
+ return blob;
+ }
+
+ openFile(pdfString, filename) {
+ const blob = this.b64toBlob(pdfString, 'application/pdf')
+ let pathFile = ''
+ const fileName = filename
+ const contentFile = blob
+ if (this.platform.is('ios')) {
+ pathFile = this.file.documentsDirectory
+ } else {
+ pathFile = this.file.externalRootDirectory
+ }
+
+
+
+ this.file
+ .writeFile(pathFile, fileName, contentFile, { replace: true })
+ .then(success => {
+ this.fileOpener
+ .open(pathFile + fileName, 'application/pdf')
+ .then(() => console.log())
+ .catch(e => console.error(e))
+ })
+ .catch(e => console.error(e))
+ }
+
+ downloadFileMsg(msg: MessageService) {
+ msg.downloadFileMsg()
+ }
+
+ downloadFileFromBrowser(fileName: string, data: any): void {
+ const linkSource = data;
+ const downloadLink = document.createElement("a");
+ downloadLink.href = linkSource;
+ downloadLink.download = fileName;
+ downloadLink.click();
+ }
+
+ async openPreview(msg: MessageService) {
+
+ if(msg.file.type === "application/webtrix") {
+ this.viewDocument(msg.file, msg.attachments.image_url)
+ } else {
+ if (!msg.attachments[0].image_url || msg.attachments[0].image_url === null || msg.attachments[0].image_url === '') {
+ this.downloadFileMsg(msg)
+
+ } else {
+
+ var str = msg.attachments[0].image_url;
+ str = str.substring(1, ((str.length) - 1));
+
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+
+ this.downloadFileFromBrowser(msg.attachments[0].name, str)
+ /* const modal = await this.modalController.create({
+ component: ViewMediaPage,
+ cssClass: 'modal modal-desktop',
+ componentProps: {
+ image: str,
+ type: msg.file.type,
+ username: msg.u.name,
+ _updatedAt: msg._updatedAt
+ }
+ });
+ modal.present(); */
+
+ } else {
+ this.openFile(str, msg.attachments[0].name);
+ }
+ }
+ }
+
+ }
+
+ async audioPreview(msg) {
+
+ if (!msg.attachments[0].title_link || msg.attachments[0].title_link === null || msg.attachments[0].title_link === '') {
+ this.downloadFileMsg(msg)
+ } else { }
+ }
+}
+
diff --git a/src/app/pages/chat/messages/contacts/contacts-routing.module.ts b/src/app/pages/chat/messages/contacts/contacts-routing.module.ts
new file mode 100644
index 000000000..fb8c7a5ea
--- /dev/null
+++ b/src/app/pages/chat/messages/contacts/contacts-routing.module.ts
@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { ContactsPage } from './contacts.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: ContactsPage
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class ContactsPageRoutingModule {}
diff --git a/src/app/pages/chat/messages/contacts/contacts.module.ts b/src/app/pages/chat/messages/contacts/contacts.module.ts
new file mode 100644
index 000000000..7078e0cb5
--- /dev/null
+++ b/src/app/pages/chat/messages/contacts/contacts.module.ts
@@ -0,0 +1,26 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { ContactsPageRoutingModule } from './contacts-routing.module';
+
+import { ContactsPage } from './contacts.page';
+import { SharedModule } from 'src/app/shared/shared.module';
+import { PipesModule } from 'src/app/pipes/pipes.module';
+
+import { FilterPipe } from 'src/app/pipes/filter.pipe';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+
+ ContactsPageRoutingModule,
+ PipesModule,
+ ],
+ declarations: [ContactsPage]
+})
+export class ContactsPageModule {}
diff --git a/src/app/pages/chat/messages/contacts/contacts.page.html b/src/app/pages/chat/messages/contacts/contacts.page.html
new file mode 100644
index 000000000..3ac1d542e
--- /dev/null
+++ b/src/app/pages/chat/messages/contacts/contacts.page.html
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{header}}
+
+
+
+
{{user.name}}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/pages/chat/messages/contacts/contacts.page.scss b/src/app/pages/chat/messages/contacts/contacts.page.scss
new file mode 100644
index 000000000..157f8d7c9
--- /dev/null
+++ b/src/app/pages/chat/messages/contacts/contacts.page.scss
@@ -0,0 +1,135 @@
+
+.header-toolbar{
+ --background:transparent;
+ --opacity: 1;
+
+ .main-header{
+ width: 100%; /* 400px */
+ height: 100%;
+ font-family: Roboto;
+ border-top-left-radius: 25px;
+ border-top-right-radius: 25px;
+ background-color: #fff;
+ overflow:hidden;
+ padding: 30px 20px 0px 20px;
+ color:#000;
+ transform: translate3d(0, 1px, 0);
+
+ .div-icon{
+ width: 40px;
+ float: right;
+ font-size: 35px;
+ overflow: auto;
+ padding: 1px;
+ }
+ .div-icon ion-icon{
+ float: right;
+ padding-left: 20px;
+ }
+ .title-content{
+ margin: 0px auto;
+ overflow: auto;
+ padding: 0 !important;
+ }
+
+ .back-icon{
+ width: 37px;
+ float: left;
+ font-size: 35px;
+ overflow: auto;
+
+ }
+ .div-title{
+ width: 221px;
+ padding: 0!important;
+ float: left;
+ margin: 2.5px 0 0 5px;
+ }
+ .title{
+ font-size: 25px;
+ }
+ }
+ }
+ .toolbar-search{
+ --padding-top:0 !important;
+ --padding-bottom:0 !important;
+ --padding-start:0 !important;
+ --padding-end:0 !important;
+
+ .search{
+ border: 1px solid #ebebeb;
+ margin: 5px 20px 5px 20px;
+ border-radius: 5px;
+ height: auto;
+ padding: 0 !important;
+ }
+ .search ion-searchbar{
+ /* border: 1px solid green; */
+ width: 100%;
+ margin: 0 !important;
+ padding: 0 !important;
+ --border-radius: 5px;
+ --box-shadow: none;
+ overflow: hidden;
+ --icon-color: var( --font-awesome);
+ }
+
+ }
+ ion-content{
+ --background:transparent;
+ }
+ .main-content{
+ width: 100%;
+ height: 100%;
+ font-family: Roboto;
+ margin: 0 auto;
+ background-color: #fff;
+ overflow:auto;
+ padding: 0 0 0 0;
+
+ .item-divider{
+ background: #ebebeb;
+ font-size: 15px;
+ margin: 10px 0 10px 0;
+ padding:5px 0 5px 20px;
+
+ }
+
+ .item-user{
+ display: flex;
+ margin: 10px 20px 10px 20px !important;
+ overflow: auto;
+ align-items: center;
+ }
+
+ .item-user p{
+ display: block;
+ margin: 0 !important;
+ width: 90%;
+ font-size: 15px;
+ color: var(--title-text-color);
+ float: left;
+ }
+ .item-user .icon{
+ width: 10%;
+ font-size: 10px;
+ display: block;
+ text-align: right;
+ overflow: auto;
+ }
+ .online{
+ color:#99e47b;
+ }
+ .offline{
+ color:#cbced1;
+ }
+ .away{
+ color:#ffd21f;
+ }
+ .invisible{
+ color:#cbced1;
+ }
+ .busy{
+ color:#f5455c;
+ }
+ }
\ No newline at end of file
diff --git a/src/app/pages/chat/messages/contacts/contacts.page.spec.ts b/src/app/pages/chat/messages/contacts/contacts.page.spec.ts
new file mode 100644
index 000000000..8f263232b
--- /dev/null
+++ b/src/app/pages/chat/messages/contacts/contacts.page.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { ContactsPage } from './contacts.page';
+
+describe('ContactsPage', () => {
+ let component: ContactsPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ ContactsPage ],
+ imports: [IonicModule.forRoot()]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(ContactsPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/chat/messages/contacts/contacts.page.ts b/src/app/pages/chat/messages/contacts/contacts.page.ts
new file mode 100644
index 000000000..0983ecbbe
--- /dev/null
+++ b/src/app/pages/chat/messages/contacts/contacts.page.ts
@@ -0,0 +1,162 @@
+import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';
+import { Component, OnInit } from '@angular/core';
+import { ModalController } from '@ionic/angular';
+import { AuthService } from 'src/app/services/auth.service';
+import { ChatService } from 'src/app/services/chat.service';
+import { MessagesPage } from '../messages.page';
+import { ThemeService } from 'src/app/services/theme.service'
+import { WsChatMethodsService} from 'src/app/services/chat/ws-chat-methods.service'
+import { SessionStore } from 'src/app/store/session.service';
+
+@Component({
+ selector: 'app-contacts',
+ templateUrl: './contacts.page.html',
+ styleUrls: ['./contacts.page.scss'],
+})
+export class ContactsPage implements OnInit {
+ showLoader: boolean;
+ loggedUser: any;
+ users = [];
+
+ headers: HttpHeaders;
+ options:any;
+ contacts:any;
+ textSearch:string;
+ room:any;
+ dm:any;
+ sessionStore = SessionStore
+
+ constructor(
+ private modalController: ModalController,
+ private http: HttpClient,
+ private chatService: ChatService,
+ private authService: AuthService,
+ public ThemeService: ThemeService,
+ public WsChatMethodsService: WsChatMethodsService,
+ )
+ {
+ this.loggedUser = authService.ValidatedUserChat['data'];
+
+ this.textSearch="";
+ this.dm=null;
+ this.room=null;
+ }
+
+ ngOnInit() {
+ this.chatService.refreshtoken();
+ this.loadUsers();
+
+ }
+ onChange(event){
+ this.textSearch = event.detail.value;
+ }
+
+ loadUsers(){
+ this.options = {
+ headers: this.headers,
+ };
+ this.chatService.getAllUsers().subscribe((res:any)=>{
+
+ this.contacts = res.users.filter(data => data.username != this.sessionStore.user.UserName);
+ this.users = this.contacts.sort((a,b) => {
+ if(a.name < b.name){
+ return -1;
+ }
+ if(a.name > b.name){
+ return 1;
+ }
+ return 0;
+ });
+ this.showLoader = false;
+ });
+ }
+
+ separateLetter(record, recordIndex, records){
+ if(recordIndex == 0){
+ return record.name[0];
+ }
+
+ let first_prev = records[recordIndex - 1].name[0];
+ let first_current = record.name[0];
+
+ if(first_prev != first_current){
+ return first_current;
+ }
+ return null;
+ }
+
+ doRefresh(event){
+ }
+
+ close(){
+ this.modalController.dismiss();
+ }
+
+ clicked(){
+
+ }
+
+ createRoom(username:string){
+ let body = {
+ username: username,
+ }
+ this.chatService.createRoom(body).subscribe(res => {
+
+ this.room = res['room'];
+
+
+ this.getDirectMessage(this.room._id);
+ this.WsChatMethodsService.getAllRooms()
+ });
+ }
+ getDirectMessage(roomId:any){
+
+
+ this.chatService.getAllDirectMessages().subscribe(res=>{
+ let result = res['ims'].filter(data => data._id == roomId);
+
+
+ this.dm = result[0];
+
+ this.openModal(this.dm._id);
+ });
+ }
+ async openModal(roomId:any){
+ this.close();
+
+
+ const modal = await this.modalController.create({
+ component: MessagesPage,
+ cssClass: 'group-messages',
+ componentProps: {
+ roomId: roomId,
+ },
+ });
+ await modal.present();
+ modal.onDidDismiss();
+ }
+
+ async openMessages(username:string){
+ /* this.close(); */
+
+ let dm:any;
+ //Create new room
+ this.createRoom(username);
+ //Get direct messages (dm)
+ /* this.getDirectMessage(this.room._id); */
+
+
+
+ /* const modal = await this.modalController.create({
+ component: MessagesPage,
+ cssClass: 'group-messages',
+ backdropDismiss: false,
+ componentProps: {
+ dm: dm,
+ },
+ });
+ await modal.present();
+ modal.onDidDismiss(); */
+ }
+
+}
diff --git a/src/app/pages/chat/messages/messages-routing.module.ts b/src/app/pages/chat/messages/messages-routing.module.ts
new file mode 100644
index 000000000..c00bd5ccb
--- /dev/null
+++ b/src/app/pages/chat/messages/messages-routing.module.ts
@@ -0,0 +1,21 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { MessagesPage } from './messages.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: MessagesPage
+ },
{
+ path: 'contacts',
+ loadChildren: () => import('./contacts/contacts.module').then( m => m.ContactsPageModule)
+ }
+
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class MessagesPageRoutingModule {}
diff --git a/src/app/pages/chat/messages/messages.module.ts b/src/app/pages/chat/messages/messages.module.ts
new file mode 100644
index 000000000..631a468c8
--- /dev/null
+++ b/src/app/pages/chat/messages/messages.module.ts
@@ -0,0 +1,30 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { MessagesPageRoutingModule } from './messages-routing.module';
+
+import { MessagesPage } from './messages.page';
+import { SharedModule } from 'src/app/shared/shared.module';
+import { BtnModalDismissPage } from 'src/app/shared/btn-modal-dismiss/btn-modal-dismiss.page';
+import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
+import { MatMenuModule } from '@angular/material/menu';
+import { LettersAvatarModule } from "ngx-letters-avatar";
+import { PipesModule } from 'src/app/pipes/pipes.module';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+ FontAwesomeModule,
+ MessagesPageRoutingModule,
+ MatMenuModule,
+ LettersAvatarModule,
+ PipesModule
+ ],
+ declarations: [MessagesPage]
+})
+export class MessagesPageModule {}
diff --git a/src/app/pages/chat/messages/messages.page.html b/src/app/pages/chat/messages/messages.page.html
new file mode 100644
index 000000000..e64908279
--- /dev/null
+++ b/src/app/pages/chat/messages/messages.page.html
@@ -0,0 +1,304 @@
+
+
+
+
+
+
+
+
+
+
+ {{msg.u.name}}
+ {{msg.duration}}
+
+
+
+ {{msg.msg}}
+ {{msg.msg}}
+
+
+
+
+
+ = 1 && msg.viewed.length == 0" src="assets/images/check-double-solid.svg">
+ = 1" src="assets/images/check-double-solid -viewed.svg">
+
+ {{last ? scrollToBottom() : ''}}
+
+
+
+
+
+
+
+ {{msg.u.name}}
+ {{msg.duration}}
+
+
+
+
+
+
+
+
+ {{"Imagem"}}
+
+
+
+
+
+
+
+
+
+ = 1 && msg.viewed.length == 0" src="assets/images/check-double-solid.svg">
+ = 1" src="assets/images/check-double-solid -viewed.svg">
+
+
+
+
+
+
+
+
+
+
+ {{file.title}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{file.title}}
+
+
+
+
+
+
+
+ {{"Mensagem de voz"}}
+
+
+
+
+
+
+
+ {{file.description}}
+ •
+
+
+
+
+
+
+
+ = 1 && msg.viewed.length == 0" src="assets/images/check-double-solid.svg">
+ = 1" src="assets/images/check-double-solid -viewed.svg">
+
+
+
+
+
+
+ {{last ? scrollToBottom() : ''}}
+
+
+
+ {{msg.u.name}} criou esta reunião
+
+ {{msg.file.subject}}
+
+
+ De {{showDateDuration(msg.file.start_date)}} a
+ {{showDateDuration(msg.file.end_date)}}
+
+
+
+ {{msg.file.venue}}
+
+
+
+
+
+
+
+ {{msg.u.name}} criou esta reunião
+
+ {{msg.file.subject}}
+
+
+ De {{showDateDuration(msg.file.start_date)}} a
+ {{showDateDuration(msg.file.end_date)}}
+
+
+
+ {{msg.file.venue}}
+
+
+ {{last ? scrollToBottom() : ''}}
+
+
+
+ Apagou a mensagem
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ está a escrever ...
+
+
+
{{durationDisplay}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/pages/chat/messages/messages.page.scss b/src/app/pages/chat/messages/messages.page.scss
new file mode 100644
index 000000000..5283f4d58
--- /dev/null
+++ b/src/app/pages/chat/messages/messages.page.scss
@@ -0,0 +1,358 @@
+@import '~src/function.scss';
+.header-toolbar{
+ --background:transparent;
+ --opacity: 1;
+
+ .main-header{
+ width: 100%; /* 400px */
+ height: 100%;
+ font-family: Roboto;
+ border-top-left-radius: 25px;
+ border-top-right-radius: 25px;
+ background-color: #fff;
+ overflow:hidden;
+ padding: 30px 20px 0px 20px;
+ color:#000;
+ transform: translate3d(0, 1px, 0);
+
+ .header-top{
+ margin: 0px auto;
+ overflow: auto;
+ padding: 0 !important;
+ background: #fff;
+
+ .left{
+ width: fit-content;
+ float: left;
+ //font-size: 35px;
+ overflow: hidden;
+
+ .header-top-btn{
+ background: transparent;
+ font-size: 25px !important;
+ font-weight: 100 !important;
+ /* color: #0782c9; */
+ color: #42b9fe;
+ }
+ }
+
+ .middle-container{
+ overflow: auto;
+ height: auto;
+
+ .middle{
+ padding: 0!important;
+ float: left;
+ width:calc(100% - 77px);
+ margin: 0px 0 0 10px;
+ display: flex;
+ align-items: center;
+ }
+ }
+
+ .middle-container-options{
+ padding: 0!important;
+ float: left;
+ width: calc(100% - 25px);
+ text-align: right;
+
+ .middle-container-options-icons{
+ color: #0782c9;
+ font-size: 23px;
+ }
+ }
+ .right{
+ padding: 0!important;
+ float: right;
+ font-size: 25px;
+ color: #0782c9;
+ margin: 5px 0 0 0;
+ }
+ }
+ .header-bottom{
+ width: 310px;
+ overflow: auto;
+ margin: 0 auto;
+
+ .header-bottom-icon{
+ width: 30px;
+ font-size: 25px;
+ float: left;
+ padding: 2px;
+
+ }
+ .header-bottom-contacts{
+ width: 275px;
+ font-size: 15px;
+ color: #797979;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ float: left;
+ padding: 5px;
+ margin: 1px;
+ }
+ }
+
+ .title{
+ font-size: 25px;
+ white-space: nowrap;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ float: left;
+ }
+ .div-icon{
+ width: 40px;
+ float: right;
+ font-size: 35px;
+ overflow: auto;
+ padding: 1px;
+ }
+ .div-icon ion-icon{
+ float: right;
+ padding-left: 20px;
+ }
+ }
+ }
+
+ ion-content{
+ .welcome-text{
+ /* width: 322px; */
+ width: em(422px);
+ background: #ebebeb;
+ text-align: center;
+ font-size: 13px;
+ color: #797979;
+ padding: 10px;
+ margin: 0 auto;
+ line-height: 1.2rem;
+ margin: 20px 39px 25px;
+ border-radius: 8px;
+ }
+ .messages{
+ font-size: 13px;
+ font-family: Roboto;
+ overflow: auto;
+
+ //set scroll do bottom
+ position: absolute;
+ top: 0;
+ left: 0;
+ overflow-x: hidden;
+ overflow-y: auto;
+ width: 100%;
+ height: 100%;
+ word-wrap: break-word;
+ -webkit-overflow-scrolling: touch;
+
+ .messages-list-item-wrapper{
+ overflow: hidden;
+ }
+ .messages-list-item-wrapper-active{
+ background: #e6f6ff75 !important;
+ }
+
+ .message-container{
+ //border: 1px solid red;
+ }
+
+
+ .incoming-true, .incoming-false{
+ width: 305px;
+ padding: 15px 20px;
+ border-radius: 10px;
+ }
+
+ .incoming-true{
+ margin: 10px 75px 10px 20px;
+ background: #ebebeb;
+ float: left;
+ }
+ }
+ .incoming-false{
+ margin: 10px 20px 10px 75px;
+ background: var(--chat-incoming-msg-color);
+ float: right;
+ }
+ .title{
+ display: inline;
+ color: var(--title-text-color);
+ font-weight: bold;
+ margin-bottom: 5px;
+
+ .time{
+ color: #797979;
+ text-align: right;
+ float: right;
+ }
+ }
+ }
+
+ .info-meeting{
+ /* width: 322px; */
+ width: em(422px);
+ background: var(--chat-alert-msg-color);
+ text-align: center;
+ font-size: 13px;
+ color: #262420;
+ padding: 10px;
+ margin: 10px auto;
+ line-height: 1.2rem;
+ /* margin: 15px 0px 15px 0px; */
+ border-radius: 8px;
+
+ .info-meeting-small{
+ font-size: 10px;
+ font-style: italic;
+ }
+ .info-meeting-medium{
+ font-size: 12px;
+ }
+ .info-meeting-normal{
+ color: #0782c9;
+ font-weight: 700;
+ text-decoration: underline;
+ }
+ .info-meeting-normal:hover{
+ text-decoration: underline;
+ color: #0782c9;
+ }
+ }
+
+ ion-footer{
+ padding-top: 7.5px;
+ padding-bottom: 7.5px;
+ .container{
+ justify-content: center;
+ justify-content: space-evenly;
+ align-items: center;
+ }
+
+ .chat-icon-options{
+ display:block !important;
+ font-size: 35px;
+ float: right !important;
+ margin-top: 5px;
+ }
+
+ .chat-icon-send{
+ font-size: 45px;
+ margin: 0 auto;
+ margin-top: 4px;
+ }
+
+ .type-message{
+ display: flex;
+ border: 1px solid #ebebeb;
+ border-radius: 25px;
+ padding-left: 15px;
+ align-items: center;
+ overflow: auto;
+
+ ion-textarea{
+ margin: 0 !important;
+ align-self: center;
+ overflow: auto;
+ }
+ }
+
+}
+
+ .text-color-blue{
+ font-size: 15px;
+ color: #0782c9;
+ font-weight: 500;
+ letter-spacing: normal;
+ }
+ .user-status-online{
+ display: block;
+ float: left;
+ color:#99e47b;
+ padding-left: 10px;
+ }
+ .online{
+ display: block;
+ float: left;
+ color:#99e47b;
+ padding-left: 10px;
+}
+.offline{
+ color:#cbced1;
+ display: block;
+ float: left;
+ padding-left: 10px;
+}
+.away{
+color:#ffd21f;
+display: block;
+ float: left;
+ padding-left: 10px;
+}
+.invisible{
+ color:#cbced1;
+ display: block;
+ float: left;
+ padding-left: 10px;
+}
+.busy{
+ color:#f5455c;
+ display: block;
+ float: left;
+ padding-left: 10px;
+}
+
+
+.typing {
+ position: relative;
+ top: -25px;
+ height: 0px;
+ left: 0px;
+ margin-left: 22px;
+ display: flex;
+ font-size: 12px;
+ align-items: center;
+}
+
+
+.typing ngx-letters-avatar {
+ padding-right: 5px;
+}
+
+
+button{
+ padding: 0px;
+ border: 0px;
+}
+
+button::-moz-focus-inner {
+ padding: 0px;
+ border: 0px;
+}
+
+
+.float-status{
+ position: relative !important;
+ float: right;
+ display: flex;
+ align-items: self-end;
+}
+
+.float-status-image{
+ position: relative !important;
+ float: right;
+ display: flex;
+ align-items: self-end;
+ top: -15px;
+}
+
+.float-status-webtrix {
+ position: relative !important;
+ top: 0px !important;
+ float: right;
+ display: flex;
+ align-items: self-end;
+}
+
+.float-status-all {
+ font-size: 10pt !important;
+}
diff --git a/src/app/pages/chat/messages/messages.page.spec.ts b/src/app/pages/chat/messages/messages.page.spec.ts
new file mode 100644
index 000000000..826962a23
--- /dev/null
+++ b/src/app/pages/chat/messages/messages.page.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { MessagesPage } from './messages.page';
+
+describe('MessagesPage', () => {
+ let component: MessagesPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ MessagesPage ],
+ imports: [IonicModule.forRoot()]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(MessagesPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/chat/messages/messages.page.ts b/src/app/pages/chat/messages/messages.page.ts
new file mode 100644
index 000000000..cc8657f78
--- /dev/null
+++ b/src/app/pages/chat/messages/messages.page.ts
@@ -0,0 +1,1059 @@
+import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, OnDestroy, OnInit, ViewChild } from '@angular/core';
+import { ActivatedRoute, Router } from '@angular/router'
+import { GestureController, ModalController, NavParams, PopoverController, Platform, AlertController } from '@ionic/angular';
+import { ViewDocumentPage } from 'src/app/modals/view-document/view-document.page';
+import { EventPerson } from 'src/app/models/eventperson.model';
+import { ExpedientTaskModalPageNavParamsTask } from 'src/app/models/ExpedientTaskModalPage';
+import { ContactsPage } from 'src/app/pages/chat/messages/contacts/contacts.page';
+import { AlertService } from 'src/app/services/alert.service';
+import { AuthService } from 'src/app/services/auth.service';
+import { ChatService } from 'src/app/services/chat.service';
+import { FileService } from 'src/app/services/functions/file.service';
+import { ProcessesService } from 'src/app/services/processes.service';
+import { ToastService } from 'src/app/services/toast.service';
+import { NewEventPage } from 'src/app/shared/agenda/new-event/new-event.page';
+import { ChatOptionsPopoverPage } from 'src/app/shared/popover/chat-options-popover/chat-options-popover.page';
+import { MessagesOptionsPage } from 'src/app/shared/popover/messages-options/messages-options.page';
+import { ChatMessageStore } from 'src/app/store/chat/chat-message.service';
+import { ChatUserStorage } from 'src/app/store/chat/chat-user.service';
+import { environment } from 'src/environments/environment';
+import { ThemeService } from 'src/app/services/theme.service'
+
+import { VoiceRecorder, RecordingData, GenericResponse} from 'capacitor-voice-recorder';
+import { Haptics, ImpactStyle } from '@capacitor/haptics';
+import { SqliteService } from 'src/app/services/sqlite.service';
+import { ViewEventPage } from 'src/app/modals/view-event/view-event.page';
+import { WsChatMethodsService } from 'src/app/services/chat/ws-chat-methods.service'
+import { MessageService } from 'src/app/services/chat/message.service';
+import { AttachmentsService } from 'src/app/services/attachments.service';
+
+import { CameraService } from 'src/app/services/camera.service';
+import { element } from 'protractor';
+import { FileType } from 'src/app/models/fileType';
+import { SearchPage } from 'src/app/pages/search/search.page';
+import { Storage } from '@ionic/storage';
+import { FileToBase64Service } from 'src/app/services/file/file-to-base64.service';
+import { Camera, CameraResultType, CameraSource } from '@capacitor/camera';
+import { DomSanitizer } from '@angular/platform-browser';
+import { SessionStore } from 'src/app/store/session.service';
+import { HttpErrorResponse } from '@angular/common/http';
+
+
+const IMAGE_DIR = 'stored-images';
+
+@Component({
+ selector: 'app-messages',
+ templateUrl: './messages.page.html',
+ styleUrls: ['./messages.page.scss'],
+})
+export class MessagesPage implements OnInit, AfterViewInit, OnDestroy {
+ showLoader: boolean;
+
+ @ViewChild('scrollMe') private myScrollContainer: ElementRef;
+ /* @ViewChild('messageContainer') messageContainer: ElementRef; */
+ @ViewChild('rectangle') private rectangle: ElementRef;
+
+ canvas: any
+ ctx: any
+ loggedUser: any;
+ userPresence = '';
+ dmUsers: any;
+ roomId: string;
+ el: any;
+ members: any;
+ scrollingOnce: boolean = true;
+
+ chatMessageStore = ChatMessageStore;
+ chatUserStorage = ChatUserStorage;
+
+ private scrollChangeCallback: () => void;
+ currentPosition: any;
+ startPosition: number;
+ scrollToBottomBtn = false;
+ attendees: EventPerson[] = [];
+ longPressActive = false;
+ showMessageOptions = false;
+ selectedMsgId: string;
+
+ dicIndex = 0;
+ task: ExpedientTaskModalPageNavParamsTask;
+ LoadedDocument: any = null;
+
+ recording = false;
+ allowTyping = true;
+ storedFileNames = [];
+ lastAudioRecorded = '';
+ audioRecorded: any = "";
+ audioDownloaded: any = "";
+ durationDisplay = '';
+ duration = 0;
+ @ViewChild('recordbtn', { read: ElementRef }) recordBtn: ElementRef;
+ myAudio: any;
+ downloadfile: any;
+ downloadFile: any;
+ files: any[] = [];
+ @ViewChild('filechooser') fileChooserElementRef: ElementRef;
+ //items: File[] = [];
+ fileSelected?: Blob;
+ pdfUrl?: string;
+ base64File: string;
+ downloadProgess: number;
+ downloadLoader: boolean;
+
+ audioPermissionStatus: 'granted'| 'denied' | 'prompt' | null = null
+ sessionStore = SessionStore
+
+ constructor(
+ public popoverController: PopoverController,
+ private modalController: ModalController,
+ private navParams: NavParams,
+ private chatService: ChatService,
+ private authService: AuthService,
+ private alertService: AlertService,
+ private toastService: ToastService,
+ private route: Router,
+ private activatedRoute: ActivatedRoute,
+ private fileService: FileService,
+ private gestureController: GestureController,
+ private processes: ProcessesService,
+ public ThemeService: ThemeService,
+ private changeDetectorRef: ChangeDetectorRef,
+ private platform: Platform,
+ private sqlservice: SqliteService,
+ public wsChatMethodsService: WsChatMethodsService,
+ private AttachmentsService: AttachmentsService,
+
+ private CameraService: CameraService,
+ private processesService: ProcessesService,
+ private storage: Storage,
+ private fileToBase64Service: FileToBase64Service,
+ private sant: DomSanitizer,
+ //private fileOpener: FileOpener,
+ private sanitiser: DomSanitizer,
+ private alertController: AlertController,
+ // private document: DocumentViewer
+ ) {
+ this.loggedUser = authService.ValidatedUserChat['data'];
+ this.roomId = this.navParams.get('roomId');
+
+
+ window.onresize = (event) => {
+ if (window.innerWidth > 701) {
+ this.modalController.dismiss();
+ }
+ }
+
+
+
+ this.wsChatMethodsService.getDmRoom(this.roomId).loadHistory({})
+ this.wsChatMethodsService.getDmRoom(this.roomId).scrollDown = this.scrollToBottomClicked
+ this.wsChatMethodsService.openRoom(this.roomId)
+
+ setTimeout(() => {
+ this.scrollToBottomClicked()
+ }, 150)
+
+
+ }
+
+ ngOnInit() {
+ this.chatService.refreshtoken();
+ this.wsChatMethodsService.getUserOfRoom(this.roomId).then((value) => {
+
+ })
+
+ this.getChatMembers();
+ }
+
+ ngAfterViewInit() {
+ this.scrollChangeCallback = () => this.onContentScrolled(event);
+ window.addEventListener('scroll', this.scrollChangeCallback, true);
+
+ const longpress = this.gestureController.create({
+ el: this.recordBtn.nativeElement,
+ threshold: 0,
+ gestureName: 'long-press',
+ onStart: ev => {
+ Haptics.impact({ style: ImpactStyle.Light })
+ this.startRecording();
+ //this.calculateDuration();
+ },
+ onEnd: ev => {
+ Haptics.impact({ style: ImpactStyle.Light })
+ this.stopRecording();
+ }
+ }, true);
+ longpress.enable();
+ }
+
+ calculateDuration() {
+ if (!this.recording) {
+ this.duration = 0;
+ this.durationDisplay = '';
+ return;
+ }
+ this.duration += 1;
+ const minutes = Math.floor(this.duration / 60);
+ const seconds = (this.duration % 60).toString().padStart(2, '0');
+ this.durationDisplay = `${minutes}:${seconds}`;
+
+ setTimeout(() => {
+ this.calculateDuration();
+ }, 1000)
+ }
+
+ async loadFiles() {
+
+ this.storage.get('fileName').then((fileName) => {
+ this.lastAudioRecorded = fileName;
+ })
+
+ try {
+ this.storage.get('recordData').then((recordData) => {
+
+ if (recordData?.value?.recordDataBase64.includes('data:audio')) {
+ this.audioRecorded = this.sanitiser.bypassSecurityTrustResourceUrl(recordData?.value?.recordDataBase64);
+ }
+ else if(recordData?.value?.mimeType && recordData?.value?.recordDataBase64) {
+ this.audioRecorded = this.sanitiser.bypassSecurityTrustResourceUrl(`data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`);
+ }
+ });
+ } catch (error) { }
+
+
+ }
+
+ async startRecording() {
+ VoiceRecorder.requestAudioRecordingPermission();
+ if(await VoiceRecorder.canDeviceVoiceRecord().then((result: GenericResponse) =>{return result.value})){
+ if(await VoiceRecorder.requestAudioRecordingPermission().then((result: GenericResponse) => {return result.value})){
+ //if(await this.hasAudioRecordingPermission()){
+ if (this.recording) {
+ return;
+ }
+ this.recording = true;
+ VoiceRecorder.startRecording();
+ this.calculateDuration();
+ //}
+ }
+ else{
+ this.toastService._badRequest('Para gravar uma mensagem de voz, permita o acesso do Gabinete Digital ao seu microfone.');
+ }
+ }
+ else{
+ this.toastService._badRequest('Este dispositivo não tem capacidade para gravação de áudio!');
+ }
+ }
+
+ stopRecording() {
+ this.deleteRecording();
+ this.allowTyping = false;
+
+ if (!this.recording) {
+ return;
+ }
+ this.recording = false;
+ VoiceRecorder.stopRecording().then(async (result: RecordingData) => {
+
+ this.recording = false;
+ if (result.value && result.value.recordDataBase64) {
+ const recordData = result.value.recordDataBase64;
+ //
+ const fileName = new Date().getTime() + ".mp3";
+ //Save file
+ this.storage.set('fileName', fileName);
+ this.storage.set('recordData', result).then(() => {
+
+ })
+ }
+ })
+ setTimeout(async () => {
+ this.loadFiles();
+ }, 1000);
+ }
+
+ async deleteRecording() {
+ this.storage.remove('fileName');
+ this.storage.remove('recordData');
+
+ this.allowTyping = true;
+ this.lastAudioRecorded = '';
+ this.loadFiles();
+ }
+
+
+
+ handlePress(id?: string) {
+ this.selectedMsgId = id;
+ this.showMessageOptions = true;
+ }
+
+ handleClick() {
+ this.showMessageOptions = false;
+ this.selectedMsgId = "";
+ }
+
+ deleteMessage(msgId: string) {
+ const room = this.wsChatMethodsService.getDmRoom(this.roomId)
+ this.alertService.confirmDeleteMessage(msgId, room);
+ }
+
+
+ notImplemented() {
+ this.alertService.presentAlert('Funcionalidade em desenvolvimento');
+ }
+
+ close() {
+ this.modalController.dismiss();
+ this.deleteRecording();
+ }
+
+ load() {
+ this.getChatMembers();
+ }
+
+ doRefresh(ev: any) {
+ this.load();
+ ev.target.complete();
+ }
+
+ scrollToBottom(): void {
+ try {
+ if (this.scrollingOnce) {
+ this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight;
+ //this.scrollingOnce = false;
+ }
+ } catch (err) { }
+ }
+
+ scrollToBottomClicked = () => {
+ try {
+ this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight;
+ } catch (err) { }
+ }
+
+ async goToEvent(eventId: any) {
+ let classs;
+ if (window.innerWidth < 701) {
+ classs = 'modal modal-desktop'
+ } else {
+ classs = 'modal modal-desktop showAsideOptions'
+ }
+ const modal = await this.modalController.create({
+ component: ViewEventPage,
+ componentProps: {
+ eventId: eventId,
+ },
+ cssClass: classs,
+ });
+ await modal.present();
+ modal.onDidDismiss().then((res) => {
+
+ });
+ }
+
+ onContentScrolled(e) {
+ this.startPosition = e.srcElement.scrollTop;
+ let scroll = e.srcElement.scrollTop;
+ let windowHeight = e.srcElement.scrollHeight;
+ let containerHeight = windowHeight - e.srcElement.clientHeight;
+
+ if (scroll > this.currentPosition) {
+ //alert('BOTTOM');
+ } else {
+ //alert('UP');
+ this.scrollingOnce = false;
+ }
+ if ((containerHeight - 100) > scroll) {
+ this.scrollToBottomBtn = true;
+ }
+ else {
+ this.scrollToBottomBtn = false;
+ }
+ this.currentPosition = scroll;
+
+ }
+
+ ngOnDestroy() {
+ window.removeEventListener('scroll', this.scrollChangeCallback, true);
+ }
+
+ sendMessage() {
+ this.wsChatMethodsService.getDmRoom(this.roomId).send({})
+ }
+
+ base64toBlob(base64Data, contentType) {
+ contentType = contentType || '';
+ var sliceSize = 1024;
+ var byteCharacters = atob(base64Data);
+ var bytesLength = byteCharacters.length;
+ var slicesCount = Math.ceil(bytesLength / sliceSize);
+ var byteArrays = new Array(slicesCount);
+
+ for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
+ var begin = sliceIndex * sliceSize;
+ var end = Math.min(begin + sliceSize, bytesLength);
+
+ var bytes = new Array(end - begin);
+ for (var offset = begin, i = 0; offset < end; ++i, ++offset) {
+ bytes[i] = byteCharacters[offset].charCodeAt(0);
+ }
+ byteArrays[sliceIndex] = new Uint8Array(bytes);
+ }
+ return new Blob(byteArrays, { type: contentType });
+ }
+
+ async sendAudio(fileName) {
+ const roomId = this.roomId
+ let audioFile;
+ this.storage.get('recordData').then((recordData) => {
+
+ audioFile = recordData;
+ if (recordData?.value?.recordDataBase64.includes('data:audio')) {
+ this.audioRecorded = recordData?.value?.recordDataBase64;
+ }
+ else if(recordData?.value?.mimeType && recordData?.value?.recordDataBase64) {
+ this.audioRecorded = `data:${recordData.value.mimeType};base64,${recordData?.value?.recordDataBase64}`;
+ }
+
+
+
+ //Converting base64 to blob
+ const encodedData = btoa(this.audioRecorded);
+ const blob = this.base64toBlob(encodedData, recordData.value.mimeType)
+
+ const formData = new FormData();
+ formData.append("blobFile", blob);
+
+ this.wsChatMethodsService.getDmRoom(roomId).send({
+ file: {
+ "type": "application/audio",
+ "msDuration": audioFile.value.msDuration,
+ "mimeType": audioFile.value.mimeType,
+ },
+ attachments: [{
+ "title": fileName,
+ "title_link_download": true,
+ "type": "audio"
+ }],
+ temporaryData: formData
+ })
+
+ });
+ this.deleteRecording();
+ }
+
+ viewDocument(file: any, url?: string) {
+
+ if (file.type == "application/webtrix") {
+ this.openViewDocumentModal(file);
+ }
+ else {
+ let fullUrl = "https://www.tabularium.pt" + url;
+ this.fileService.viewDocumentByUrl(fullUrl);
+ }
+ }
+
+ /* playSound(url?:any){
+ alert('here')
+
+ //this.audioDownloaded = this.sanitiser.bypassSecurityTrustResourceUrl(url);
+ this.audioDownloaded = url;
+ } */
+
+ docIndex(index: number) {
+ this.dicIndex = index
+ }
+
+ async openViewDocumentModal(file: any) {
+
+ let task = {
+ serialNumber: '',
+ taskStartDate: '',
+ isEvent: true,
+ workflowInstanceDataFields: {
+ FolderID: '',
+ Subject: file.Assunto,
+ SourceSecFsID: file.ApplicationId,
+ SourceType: 'PDF',
+ SourceID: file.DocId,
+ DispatchNumber: ''
+ }
+ }
+
+ let doc = {
+ "Id": "",
+ "ParentId": "",
+ "Source": 1,
+ "ApplicationId": file.ApplicationId,
+ "CreateDate": "",
+ "Data": null,
+ "Description": "",
+ "Link": null,
+ "SourceId": file.DocId,
+ "SourceName": file.Assunto,
+ "Stakeholders": "",
+ }
+
+ const modal = await this.modalController.create({
+ component: ViewDocumentPage,
+ componentProps: {
+ trustedUrl: '',
+ file: {
+ title: file.Assunto,
+ url: '',
+ title_link: '',
+ },
+ Document: doc,
+ applicationId: file.ApplicationId,
+ docId: file.DocId,
+ folderId: '',
+ task: task
+ },
+ cssClass: 'modal modal-desktop'
+ });
+ await modal.present();
+ }
+
+ getChatMembers() {
+ this.showLoader = true;
+ this.chatService.getMembers(this.roomId).subscribe(res => {
+ this.members = res['members'];
+ this.dmUsers = res['members'].filter(data => data.username != this.sessionStore.user.UserName)
+ this.showLoader = false;
+ });
+ }
+
+ showDateDuration(start: any) {
+ let end;
+ end = new Date();
+ start = new Date(start);
+ let customizedDate;
+
+ const totalSeconds = Math.floor((end - (start)) / 1000);;
+ const totalMinutes = Math.floor(totalSeconds / 60);
+ const totalHours = Math.floor(totalMinutes / 60);
+ const totalDays = Math.floor(totalHours / 24);
+
+ const hours = totalHours - (totalDays * 24);
+ const minutes = totalMinutes - (totalDays * 24 * 60) - (hours * 60);
+ const seconds = totalSeconds - (totalDays * 24 * 60 * 60) - (hours * 60 * 60) - (minutes * 60);
+
+ if (totalDays == 0) {
+ if (start.getDate() == new Date().getDate()) {
+ let time = start.getHours() + ":" + this.addZero(start.getUTCMinutes());
+ return time;
+ }
+ else {
+ return 'Ontem';
+ }
+ }
+ else {
+ let date = start.getDate() + "/" + (start.getMonth() + 1) + "/" + start.getFullYear();
+ return date;
+ }
+ }
+
+ addZero(i) {
+ if (i < 10) {
+ i = "0" + i;
+ }
+ return i;
+ }
+
+ async openMessagesOptions(ev?: any) {
+ const popover = await this.popoverController.create({
+ component: MessagesOptionsPage,
+ componentProps: {
+ roomId: this.roomId,
+ },
+ cssClass: 'messages-options',
+ event: ev,
+ translucent: true,
+ });
+ return await popover.present();
+ }
+
+ async addContacts() {
+ const modal = await this.modalController.create({
+ component: ContactsPage,
+ componentProps: {},
+ cssClass: 'contacts',
+ backdropDismiss: false
+ });
+
+ await modal.present();
+
+ modal.onDidDismiss();
+ }
+
+ async bookMeeting() {
+ this.attendees = this.members.map((val) => {
+ return {
+ Name: val.name,
+ EmailAddress: val.username + "@" + environment.domain,
+ IsRequired: "true",
+ }
+ });
+
+ this.popoverController.dismiss();
+ if (window.innerWidth <= 1024) {
+ const modal = await this.modalController.create({
+ component: NewEventPage,
+ componentProps: {
+ attendees: this.attendees,
+ },
+ cssClass: 'modal modal-desktop',
+ backdropDismiss: false
+ });
+ await modal.present();
+ modal.onDidDismiss().then((data) => {
+ if (data) {
+
+ }
+ });
+ }
+ }
+
+
+ async takePicture() {
+ const roomId = this.roomId
+
+ const image = await this.CameraService.takePicture();
+ await this.fileService.saveImage(image)
+ const lastphoto: any = await this.fileService.loadFiles();
+ const { capturedImage, capturedImageTitle } = await this.fileService.loadFileData(lastphoto);
+
+
+ const base64 = await fetch(capturedImage);
+ const blob = await base64.blob();
+ const formData = new FormData();
+ formData.append("blobFile", blob);
+
+
+ this.wsChatMethodsService.getDmRoom(roomId).send({
+ file: {
+ "type": "application/img",
+ "guid": ''
+ },
+ attachments: [{
+ "title": capturedImageTitle,
+ "text": "description",
+ "title_link_download": false,
+ }],
+ temporaryData: formData
+ })
+
+ }
+
+ async addImageMobile() {
+ this.addFileToChatMobile(['image/apng', 'image/jpeg', 'image/png'])
+ }
+
+ async addImage() {
+ this.addFileToChat(['image/apng', 'image/jpeg', 'image/png'])
+ }
+
+ async addFile() {
+ this.addFileToChat(['.doc', '.docx', '.pdf'])
+ }
+
+ async addFileWebtrix() {
+ const modal = await this.modalController.create({
+ component: SearchPage,
+ cssClass: 'group-messages modal-desktop search-modal search-modal-to-desktop',
+ componentProps: {
+ type: 'AccoesPresidenciais & ArquivoDespachoElect',
+ select: true,
+ showSearchInput: true,
+ }
+ });
+ await modal.present();
+ modal.onDidDismiss().then(async res => {
+ const data = res.data;
+ const roomId = this.roomId
+
+ if (data.selected) {
+
+ this.wsChatMethodsService.getDmRoom(roomId).send({
+ file: {
+ "name": res.data.selected.Assunto,
+ "type": "application/webtrix",
+ "ApplicationId": res.data.selected.ApplicationType,
+ "DocId": res.data.selected.Id,
+ "Assunto": res.data.selected.Assunto,
+ },
+ temporaryData: res,
+ attachments: [{
+ "title": res.data.selected.Assunto,
+ "description": res.data.selected.DocTypeDesc,
+ // "title_link": url_no_options,
+ "title_link_download": true,
+ "thumb_url": "https://static.ichimura.ed.jp/uploads/2017/10/pdf-icon.png",
+ // "message_link": url_no_options,
+ "text": res.data.selected.DocTypeDesc,
+ "type": "webtrix"
+ }],
+ })
+
+ }
+ });
+ }
+
+ async addFileToChatMobile(types: typeof FileType[]) {
+ const roomId = this.roomId
+
+ const file = await Camera.getPhoto({
+ quality: 90,
+ // allowEditing: true,
+ resultType: CameraResultType.Base64,
+ source: CameraSource.Photos
+ });
+
+ //const imageData = await this.fileToBase64Service.convert(file)
+ //
+
+ const response = await fetch('data:image/jpeg;base64,' + file.base64String!);
+ const blob = await response.blob();
+
+ const formData = new FormData();
+ formData.append("blobFile", blob);
+
+ this.wsChatMethodsService.getDmRoom(roomId).send({
+ file: {
+ "type": "application/img",
+ "guid": ''
+ },
+ temporaryData: formData,
+ attachments: [{
+ "title": file.path,
+ "text": "description",
+ "title_link_download": false,
+ }]
+ })
+
+ }
+
+ getFileReader(): FileReader {
+ const fileReader = new FileReader();
+ const zoneOriginalInstance = (fileReader as any)["__zone_symbol__originalInstance"];
+ return zoneOriginalInstance || fileReader;
+ }
+
+ async addFileToChat(types: typeof FileType[]) {
+
+ const roomId = this.roomId
+
+ const file: any = await this.fileService.getFileFromDevice(types);
+
+
+
+ if (file.type != "application/img" && file.type != "image/png" && file.type != "image/jpeg" && file.type != "image/gif") {
+
+ const encodedData = btoa(JSON.stringify(await this.getBase64(file)));
+ const blob = this.base64toBlob(encodedData, file.type)
+
+
+ const formData = new FormData();
+ formData.append('blobFile', blob);
+
+
+ this.wsChatMethodsService.getDmRoom(roomId).send({
+ file: {
+ "type": file.type,
+ "guid": '',
+ },
+ attachments: [{
+ "title": file.name,
+ "name": file.name,
+ // "text": "description",
+ "title_link_download": false,
+ }],
+ temporaryData: formData
+ });
+ } else {
+
+ }
+
+
+
+ }
+
+ getBase64(file) {
+ var reader = this.getFileReader();
+ reader.readAsDataURL(file);
+ return new Promise(resolve => {
+ reader.onload = function () {
+ resolve(reader.result)
+ };
+ reader.onerror = function (error) {
+
+ };
+ });
+
+ }
+
+ async openChatOptions(ev?: any) {
+ const roomId = this.roomId
+
+
+ const popover = await this.popoverController.create({
+ component: ChatOptionsPopoverPage,
+ cssClass: 'chat-options-popover',
+ event: ev,
+ componentProps: {
+ room: this.roomId,
+ members: this.members,
+ eventSelectedDate: new Date(),
+ },
+ translucent: true
+ });
+ await popover.present();
+ popover.onDidDismiss().then(async (res) => {
+
+ if (res['data'] == 'meeting') {
+ this.bookMeeting();
+ }
+ else if (res['data'] == 'take-picture') {
+ this.takePicture()
+ }
+ else if (res['data'] == 'add-picture') {
+ this.addImageMobile()
+ }
+ else if (res['data'] == 'add-document') {
+ this.addFile()
+ }
+ else if (res['data'] == 'documentoGestaoDocumental') {
+
+ this.addFileWebtrix()
+ }
+
+
+ });
+ }
+
+
+ getRoomMessageDB(roomId) {
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+ } else {
+ this.sqlservice.getAllChatMSG(roomId).then((msg: any) => {
+
+ let chatmsgArray = [];
+ let array = []
+ msg.forEach(element => {
+
+
+ let msgChat = {
+ _id: element.Id,
+ attachments: this.isJson(element.Attachments),
+ channels: this.isJson(element.Channels),
+ file: this.isJson(element.File),
+ mentions: this.isJson(element.Mentions),
+ msg: element.Msg,
+ rid: element.Rid,
+ ts: element.Ts,
+ u: this.isJson(element.U),
+ _updatedAt: element.UpdatedAt,
+ image_url: this.isJson(element.image_url)
+ }
+
+ chatmsgArray.push(msgChat)
+ });
+
+
+
+ })
+ }
+ }
+
+ isJson(str) {
+ try {
+ JSON.parse(str);
+ } catch (e) {
+ return "";
+ }
+ return JSON.parse(str);
+ }
+
+
+
+ transformDataMSG(res) {
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+ } else {
+ res.forEach(element => {
+
+ let chatmsg = {
+ _id: element._id,
+ attachments: element.attachments,
+ channels: element.channels,
+ file: element.file,
+ mentions: element.mentions,
+ msg: element.msg,
+ rid: element.rid,
+ ts: element.ts,
+ u: element.u,
+ _updatedAt: element._updatedAt,
+ /* image_url: {
+ name: name,
+ path: `${IMAGE_DIR}/${name}`,
+ data: `data:image/jpeg;base64,${readFile.data}`,
+ }, */
+ }
+
+ this.sqlservice.addChatMSG(chatmsg)
+
+ });
+ }
+
+ }
+
+ /* testeDownload(msg: MessageService) {
+ this.downloadFile = "";
+ this.AttachmentsService.downloadFileAndStore(msg.file.guid);
+ } */
+
+
+ downloadFileMsg(msg: MessageService) {
+ msg.downloadFileMsg();
+ }
+
+ b64toBlob(b64Data, contentType) {
+ contentType = contentType || '';
+ var sliceSize = 512;
+ b64Data = b64Data.replace(/^[^,]+,/, '');
+ b64Data = b64Data.replace(/\s/g, '');
+ var byteCharacters = window.atob(b64Data);
+ var byteArrays = [];
+
+ for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
+ var slice = byteCharacters.slice(offset, offset + sliceSize);
+
+ var byteNumbers = new Array(slice.length);
+ for (var i = 0; i < slice.length; i++) {
+ byteNumbers[i] = slice.charCodeAt(i);
+ }
+
+ var byteArray = new Uint8Array(byteNumbers);
+
+ byteArrays.push(byteArray);
+ }
+
+ var blob = new Blob(byteArrays, { type: contentType });
+ return blob;
+ }
+
+ openFile(pdfString, filename, type) {
+ // const blob = this.b64toBlob(pdfString, type)
+ // let pathFile = ''
+ // const fileName = filename
+ // const contentFile = blob
+ // if (this.platform.is('ios')) {
+ // pathFile = this.file.documentsDirectory
+ // } else {
+ // pathFile = this.file.externalRootDirectory
+ // }
+ //
+ //
+ //
+ // this.file
+ // .writeFile(pathFile, fileName, contentFile, { replace: true })
+ // .then(success => {
+ // this.fileOpener
+ // .open(pathFile + fileName, type)
+ // .then(() =>
+ // .catch(e =>
+ // })
+ // .catch(e =>
+ }
+
+ downloadFileFromBrowser(fileName: string, data: any): void {
+ const linkSource = data;
+ const downloadLink = document.createElement("a");
+ downloadLink.href = linkSource;
+ downloadLink.download = fileName;
+ downloadLink.click();
+ }
+
+
+ async openPreview(msg) {
+
+
+ if(msg.file.type === "application/webtrix") {
+ this.viewDocument(msg.file, msg.attachments.image_url)
+ } else {
+
+ if (!msg.attachments[0].image_url || msg.attachments[0].image_url === null || msg.attachments[0].image_url === '') {
+ this.downloadFileMsg(msg)
+ //this.testDownlod(msg)
+
+ } else {
+ var str = msg.attachments[0].image_url;
+ str = str.substring(1, ((str.length) - 1));
+
+ if (this.platform.is('desktop') || this.platform.is('mobileweb')) {
+
+ this.downloadFileFromBrowser(msg.attachments[0].name, str)
+ /* const modal = await this.modalController.create({
+ component: ViewMediaPage,
+ cssClass: 'modal modal-desktop',
+ componentProps: {
+ image: str,
+ type: msg.file.type,
+ username: msg.u.name,
+ _updatedAt: msg._updatedAt
+ }
+ });
+ modal.present(); */
+
+ } else {
+ this.openFile(str, msg.attachments[0].name, msg.file.type);
+ }
+
+ }
+ }
+
+ }
+
+ async audioPreview(msg) {
+
+ if (!msg.attachments[0].title_link || msg.attachments[0].title_link === null || msg.attachments[0].title_link === '') {
+ this.downloadFileMsg(msg)
+ } else { }
+ }
+
+
+ imageSize(img) {
+ var canvas = document.createElement('canvas');
+ var ctx = canvas.getContext('2d');
+ canvas.width = 300
+ canvas.height = 234
+ ctx.drawImage(img.attachments[0].image_url, 0, 0, 300, 234);
+ document.body.appendChild(canvas);
+ }
+
+ getPicture(img) {
+ var canvas = document.createElement('canvas');
+ var ctx = canvas.getContext('2d');
+ canvas.width = 300
+ canvas.height = 234
+ ctx.drawImage(img.attachments[0].image_url, 0, 0, 300, 234);
+ document.body.appendChild(canvas);
+
+ }
+
+
+ // async ShareEmail(msg){
+ // // Check if sharing via email is supported
+ // await Share.share({
+ // title: msg.u.username,
+ // text: msg._updatedAt,
+ // url: msg.attachments[0].image_url,
+ // dialogTitle: 'Share with buddies',
+ // });
+ // }
+
+
+}
+
+
+
diff --git a/src/app/pages/chat/new-group/contacts/contacts-routing.module.ts b/src/app/pages/chat/new-group/contacts/contacts-routing.module.ts
new file mode 100644
index 000000000..fb8c7a5ea
--- /dev/null
+++ b/src/app/pages/chat/new-group/contacts/contacts-routing.module.ts
@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { ContactsPage } from './contacts.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: ContactsPage
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class ContactsPageRoutingModule {}
diff --git a/src/app/pages/chat/new-group/contacts/contacts.module.ts b/src/app/pages/chat/new-group/contacts/contacts.module.ts
new file mode 100644
index 000000000..4c4ec76ec
--- /dev/null
+++ b/src/app/pages/chat/new-group/contacts/contacts.module.ts
@@ -0,0 +1,25 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { ContactsPageRoutingModule } from './contacts-routing.module';
+
+import { ContactsPage } from './contacts.page';
+import { SharedModule } from 'src/app/shared/shared.module';
+
+import { BtnSeguintePageModule } from 'src/app/shared/btn-seguinte/btn-seguinte.module';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+
+ ContactsPageRoutingModule,
+ BtnSeguintePageModule,
+ ],
+ declarations: [ContactsPage]
+})
+export class ContactsPageModule {}
diff --git a/src/app/pages/chat/new-group/contacts/contacts.page.html b/src/app/pages/chat/new-group/contacts/contacts.page.html
new file mode 100644
index 000000000..59be5dfab
--- /dev/null
+++ b/src/app/pages/chat/new-group/contacts/contacts.page.html
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{header}}
+
+
+
+
+
{{user.first}} {{user.last}}
+
+
+
+
+
+
+
+
+
diff --git a/src/app/pages/chat/new-group/contacts/contacts.page.scss b/src/app/pages/chat/new-group/contacts/contacts.page.scss
new file mode 100644
index 000000000..9f66c7eb7
--- /dev/null
+++ b/src/app/pages/chat/new-group/contacts/contacts.page.scss
@@ -0,0 +1,126 @@
+
+.header-toolbar{
+ --background:transparent;
+ --opacity: 1;
+
+ .main-header{
+ width: 100%; /* 400px */
+ height: 100%;
+ font-family: Roboto;
+ border-top-left-radius: 25px;
+ border-top-right-radius: 25px;
+ background-color: #fff;
+ overflow:hidden;
+ padding: 30px 20px 0px 20px;
+ color:#000;
+ transform: translate3d(0, 1px, 0);
+
+ .div-icon{
+ width: 40px;
+ float: right;
+ font-size: 35px;
+ overflow: auto;
+ padding: 1px;
+ }
+ .div-icon ion-icon{
+ float: right;
+ padding-left: 20px;
+ }
+ .title-content{
+ margin: 0px auto;
+ overflow: auto;
+ padding: 0 !important;
+ }
+
+ .back-icon{
+ width: 37px;
+ float: left;
+ font-size: 35px;
+ overflow: auto;
+
+ }
+ .div-title{
+ width: 221px;
+ padding: 0!important;
+ float: left;
+ margin: 2.5px 0 0 5px;
+ }
+ .title{
+ font-size: 25px;
+ }
+ }
+}
+.toolbar-search{
+ --padding-top:0 !important;
+ --padding-bottom:0 !important;
+ --padding-start:0 !important;
+ --padding-end:0 !important;
+
+ .search{
+ border: 1px solid #ebebeb;
+ margin: 5px 20px 5px 20px;
+ border-radius: 5px;
+ }
+ .search ion-searchbar{
+ /* border: 1px solid green; */
+ width: 100%;
+ margin: 0 !important;
+ padding: 0 !important;
+ --border-radius: 5px;
+ --box-shadow: none;
+ overflow: auto;
+ --icon-color:var(--title-text-color);
+ }
+
+}
+ion-content{
+ --background:transparent;
+}
+.main-content{
+ width: 100%;
+ height: 100%;
+ font-family: Roboto;
+ margin: 0 auto;
+ background-color: #fff;
+ overflow:auto;
+ padding: 0 0 0 0;
+
+ .item-divider{
+ background: #ebebeb;
+ font-size: 15px;
+ margin: 10px 0 10px 0;
+ padding:5px 0 5px 20px;
+
+ }
+
+ .item-checkbox{
+ display: flex;
+ margin: 10px 20px 10px 20px !important;
+ overflow: auto;
+ align-items: center;
+
+ }
+
+ .item-checkbox ion-checkbox{
+ --border-color: var(--title-text-color);
+ --background-checked:var(--title-text-color);
+ float: left;
+ }
+
+ .item-checkbox p{
+ display: block;
+ margin: 0 !important;
+ width: 330px;
+ padding-left: 10px;
+ font-size: 15px;
+ color: var(--title-text-color);
+ float: left;
+ }
+ .item-checkbox ion-icon{
+ font-size: 10px;
+ float: left;
+ color:#99e47b;
+ margin-left: 10px;
+ }
+ }
+
diff --git a/src/app/pages/chat/new-group/contacts/contacts.page.spec.ts b/src/app/pages/chat/new-group/contacts/contacts.page.spec.ts
new file mode 100644
index 000000000..8f263232b
--- /dev/null
+++ b/src/app/pages/chat/new-group/contacts/contacts.page.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { ContactsPage } from './contacts.page';
+
+describe('ContactsPage', () => {
+ let component: ContactsPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ ContactsPage ],
+ imports: [IonicModule.forRoot()]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(ContactsPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/chat/new-group/contacts/contacts.page.ts b/src/app/pages/chat/new-group/contacts/contacts.page.ts
new file mode 100644
index 000000000..131e4cc76
--- /dev/null
+++ b/src/app/pages/chat/new-group/contacts/contacts.page.ts
@@ -0,0 +1,154 @@
+import { HttpClient, HttpHeaders } from '@angular/common/http';
+import { Component, OnInit } from '@angular/core';
+import { ModalController } from '@ionic/angular';
+import { GroupMessagesPage } from '../../group-messages/group-messages.page';
+import { ThemeService } from 'src/app/services/theme.service'
+
+@Component({
+ selector: 'app-contacts',
+ templateUrl: './contacts.page.html',
+ styleUrls: ['./contacts.page.scss'],
+})
+export class ContactsPage implements OnInit {
+ showLoader: boolean;
+ users = [];
+
+ contact: string[] = [" Ana M.", "Andre F.", "Bruno G.", "Catarina T", "Tiago"];
+
+ headers: HttpHeaders;
+ options:any;
+
+ contacts = [
+ {
+ first: 'Ana',
+ last: 'Manuel',
+ url: 'https://randomuser.me/api/portraits/med/women/54.jpg',
+ },
+ {
+ first: 'Abdullah',
+ last: 'Hill',
+ url: 'https://randomuser.me/api/portraits/med/women/54.jpg',
+ },
+ {
+ first: 'Batur',
+ last: 'Oymen',
+ url: 'https://randomuser.me/api/portraits/med/women/54.jpg',
+ },
+ {
+ first: 'Bianca',
+ last: 'Costa',
+ url: 'https://randomuser.me/api/portraits/med/women/54.jpg',
+ },
+ {
+ first: 'Zaya',
+ last: 'Mary',
+ url: 'https://randomuser.me/api/portraits/med/women/54.jpg',
+ },
+ {
+ first: 'Tiago',
+ last: 'Kayaya',
+ url: 'https://randomuser.me/api/portraits/med/women/54.jpg',
+ }
+];
+
+ constructor(
+ private modalController: ModalController,
+ private http: HttpClient,
+ public ThemeService: ThemeService
+ )
+ {
+ this.headers = new HttpHeaders();
+ this.headers = this.headers.set('Access-Control-Allow-Origin' , '*');
+ this.headers = this.headers.set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT');
+ this.headers = this.headers.set('Accept','application/json');
+ this.headers = this.headers.set('content-type','application/json');
+
+
+ }
+
+ ngOnInit() {
+ this.loadUsers();
+
+ }
+
+ loadUsers(){
+ this.options = {
+ headers: this.headers,
+ };
+ /* this.http.get('https://randomuser.me/api/?results=100', this.options)
+ .subscribe(res => {
+ this.users = res['results'].sort((a,b) => {
+ if(a.name.first < b.name.first){
+ return -1;
+ }
+ if(a.name.first > b.name.first){
+ return 1;
+ }
+ return 0;
+ });
+
+
+ }); */
+ this.users = this.contacts.sort((a,b) => {
+ if(a.first < b.first){
+ return -1;
+ }
+ if(a.first > b.first){
+ return 1;
+ }
+ return 0;
+ });
+ }
+
+ separateLetter(record, recordIndex, records){
+ /* if(recordIndex == 0){
+ return record.name.first[0];
+ }
+
+ let first_prev = records[recordIndex - 1].name.first[0];
+ let first_current = record.name.first[0];
+
+ if(first_prev != first_current){
+ return first_current;
+ }
+ return null; */
+ if(recordIndex == 0){
+ return record.first[0];
+ }
+
+ let first_prev = records[recordIndex - 1].first[0];
+ let first_current = record.first[0];
+
+ if(first_prev != first_current){
+ return first_current;
+ }
+ return null;
+ }
+
+ doRefresh(event){
+
+ }
+ close(){
+ this.modalController.dismiss();
+ }
+ onChange(event){
+
+ }
+ clicked(){
+
+
+ }
+ async groupMessages(){
+ const modal = await this.modalController.create({
+ component: GroupMessagesPage,
+ componentProps: {},
+ cssClass: 'contacts',
+ backdropDismiss: false
+ });
+
+ await modal.present();
+
+ modal.onDidDismiss();
+ }
+
+}
diff --git a/src/app/pages/chat/new-group/group-chat/group-chat-routing.module.ts b/src/app/pages/chat/new-group/group-chat/group-chat-routing.module.ts
new file mode 100644
index 000000000..d88c349d7
--- /dev/null
+++ b/src/app/pages/chat/new-group/group-chat/group-chat-routing.module.ts
@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { GroupChatPage } from './group-chat.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: GroupChatPage
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class GroupChatPageRoutingModule {}
diff --git a/src/app/pages/chat/new-group/group-chat/group-chat.module.ts b/src/app/pages/chat/new-group/group-chat/group-chat.module.ts
new file mode 100644
index 000000000..ebd13e04a
--- /dev/null
+++ b/src/app/pages/chat/new-group/group-chat/group-chat.module.ts
@@ -0,0 +1,27 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { GroupChatPageRoutingModule } from './group-chat-routing.module';
+
+import { GroupChatPage } from './group-chat.page';
+import { SharedModule } from 'src/app/shared/shared.module';
+
+import { BtnSeguintePageModule } from 'src/app/shared/btn-seguinte/btn-seguinte.module';
+import { BtnModalDismissPageModule } from 'src/app/shared/btn-modal-dismiss/btn-modal-dismiss.module';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+
+ GroupChatPageRoutingModule,
+ BtnSeguintePageModule,
+ BtnModalDismissPageModule,
+ ],
+ declarations: [GroupChatPage]
+})
+export class GroupChatPageModule {}
diff --git a/src/app/pages/chat/new-group/group-chat/group-chat.page.html b/src/app/pages/chat/new-group/group-chat/group-chat.page.html
new file mode 100644
index 000000000..4dfad122a
--- /dev/null
+++ b/src/app/pages/chat/new-group/group-chat/group-chat.page.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/src/app/pages/chat/new-group/group-chat/group-chat.page.scss b/src/app/pages/chat/new-group/group-chat/group-chat.page.scss
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/app/pages/chat/new-group/group-chat/group-chat.page.spec.ts b/src/app/pages/chat/new-group/group-chat/group-chat.page.spec.ts
new file mode 100644
index 000000000..641898e82
--- /dev/null
+++ b/src/app/pages/chat/new-group/group-chat/group-chat.page.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { GroupChatPage } from './group-chat.page';
+
+describe('GroupChatPage', () => {
+ let component: GroupChatPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ GroupChatPage ],
+ imports: [IonicModule.forRoot()]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(GroupChatPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/chat/new-group/group-chat/group-chat.page.ts b/src/app/pages/chat/new-group/group-chat/group-chat.page.ts
new file mode 100644
index 000000000..c34b5eec7
--- /dev/null
+++ b/src/app/pages/chat/new-group/group-chat/group-chat.page.ts
@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+ selector: 'app-group-chat',
+ templateUrl: './group-chat.page.html',
+ styleUrls: ['./group-chat.page.scss'],
+})
+export class GroupChatPage implements OnInit {
+
+ constructor() { }
+
+ ngOnInit() {
+ }
+
+}
diff --git a/src/app/pages/chat/new-group/new-group-routing.module.ts b/src/app/pages/chat/new-group/new-group-routing.module.ts
new file mode 100644
index 000000000..42b9b7e24
--- /dev/null
+++ b/src/app/pages/chat/new-group/new-group-routing.module.ts
@@ -0,0 +1,25 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { NewGroupPage } from './new-group.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: NewGroupPage
+ },
+ {
+ path: 'contacts',
+ loadChildren: () => import('./contacts/contacts.module').then( m => m.ContactsPageModule)
+ },
+ {
+ path: 'group-chat',
+ loadChildren: () => import('./group-chat/group-chat.module').then( m => m.GroupChatPageModule)
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class NewGroupPageRoutingModule {}
diff --git a/src/app/pages/chat/new-group/new-group.module.ts b/src/app/pages/chat/new-group/new-group.module.ts
new file mode 100644
index 000000000..13d095ef6
--- /dev/null
+++ b/src/app/pages/chat/new-group/new-group.module.ts
@@ -0,0 +1,25 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { NewGroupPageRoutingModule } from './new-group-routing.module';
+
+import { NewGroupPage } from './new-group.page';
+import { SharedModule } from 'src/app/shared/shared.module';
+
+import { BtnSeguintePageModule } from 'src/app/shared/btn-seguinte/btn-seguinte.module';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+
+ NewGroupPageRoutingModule,
+ BtnSeguintePageModule,
+ ],
+ declarations: [NewGroupPage]
+})
+export class NewGroupPageModule {}
diff --git a/src/app/pages/chat/new-group/new-group.page.html b/src/app/pages/chat/new-group/new-group.page.html
new file mode 100644
index 000000000..b6b7a0690
--- /dev/null
+++ b/src/app/pages/chat/new-group/new-group.page.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+ Grupo Ultra-secreto
+
+
+
+
+
+
diff --git a/src/app/pages/chat/new-group/new-group.page.scss b/src/app/pages/chat/new-group/new-group.page.scss
new file mode 100644
index 000000000..3c0239197
--- /dev/null
+++ b/src/app/pages/chat/new-group/new-group.page.scss
@@ -0,0 +1,155 @@
+ion-content{
+ --background:transparent;
+}
+.header-toolbar{
+ --background:transparent;
+ --opacity: 1;
+}
+.div-top-header{
+ width: 400px;
+ margin: 0 auto;
+ background-color: #0782c9;
+ overflow: auto;
+ padding-top: 15px;
+ border: 0!important;
+
+ .div-search{
+ font-size: 45px;
+ float: left;
+ margin: 0 0 0 10px
+ }
+ .div-logo{
+ background: transparent;
+ width: 140px;
+ margin: 5px 0 0px 71px;
+ float: left;
+ }
+ .div-logo img{
+ width: 100%;
+ }
+ .div-profile{
+ font-size: 45px;
+ float: right;
+ margin-right: 10px;
+ }
+
+ }
+ .main-header{
+ width: 100%; /* 400px */
+ height: 100%;
+ font-family: Roboto;
+ border-top-left-radius: 25px;
+ border-top-right-radius: 25px;
+ background-color: #fff;
+ overflow:hidden;
+ padding: 30px 20px 0px 20px;
+ color:#000;
+ transform: translate3d(0, 1px, 0);
+
+ .title-content{
+ margin: 0px auto;
+ overflow: auto;
+ padding: 0 !important;
+ background: #fff;
+
+ .left{
+ width: 37px;
+ float: left;
+ font-size: 35px;
+ overflow: auto;
+ }
+ .middle{
+ padding: 0!important;
+ float: left;
+ width:fit-content;
+ margin: 2.5px 0 0 5px;
+ }
+ .btn-criar{
+ padding: 0!important;
+ float: right;
+ font-size: 15px;
+ color: var(--font-awesome);
+ margin: 8px 5px 0 5px;
+ }
+ .right{
+ padding: 0!important;
+ float: right;
+ font-size: 15px;
+ color: #0782c9;
+ margin: 8px 0 0 5px;
+ }
+ }
+
+ .title{
+ font-size: 25px;
+ }
+ .div-icon{
+ width: 40px;
+ float: right;
+ font-size: 35px;
+ overflow: auto;
+ padding: 1px;
+ }
+ .div-icon ion-icon{
+ float: right;
+ padding-left: 20px;
+ }
+
+
+ }
+ .main-content{
+ width: 100%; /* 400px */
+ height: 100%;
+ font-family: Roboto;
+ margin: 0 auto;
+ background-color: #fff;
+ overflow:auto;
+ padding: 15px 20px 0 20px;
+
+ .item-container{
+ margin: 15px auto;
+ border: 1px solid #ebebeb;
+ border-radius: 5px;
+ padding-left: 10px;
+ }
+
+ .item-container-no-border{
+ display: flex;
+ margin: 25px auto;
+ border-radius: 5px;
+ align-items: center;
+ }
+
+ .item-container-no-border ion-label{
+ padding-left: 10px;
+ font-size: 12px;
+ color: #000;
+ }
+ }
+
+ .container-div{
+ margin-bottom: 15px;
+ overflow: auto;
+
+ .ion-item-class-2{
+ margin: 0px auto;
+ overflow: auto;
+
+ .ion-icon-class{
+ width: 45px;
+ height: 45px;
+ float: left;
+ padding: 10px;
+ font-size: 25px;
+ }
+ }
+ .ion-input-class{
+ width: calc(100% - 45px) !important;
+ height: 45px;
+ border: 1px solid #ebebeb;
+ border-radius: 5px;
+ padding-left: 5px;
+ padding-right: 10px;
+ float: left;
+ }
+ }
diff --git a/src/app/pages/chat/new-group/new-group.page.spec.ts b/src/app/pages/chat/new-group/new-group.page.spec.ts
new file mode 100644
index 000000000..2cb166ecd
--- /dev/null
+++ b/src/app/pages/chat/new-group/new-group.page.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { NewGroupPage } from './new-group.page';
+
+describe('NewGroupPage', () => {
+ let component: NewGroupPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ NewGroupPage ],
+ imports: [IonicModule.forRoot()]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(NewGroupPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/chat/new-group/new-group.page.ts b/src/app/pages/chat/new-group/new-group.page.ts
new file mode 100644
index 000000000..6a1760090
--- /dev/null
+++ b/src/app/pages/chat/new-group/new-group.page.ts
@@ -0,0 +1,242 @@
+import { Component, OnInit } from '@angular/core';
+import { ModalController, NavParams, PickerController, PopoverController } from '@ionic/angular';
+import { GroupDurationPage } from 'src/app/shared/popover/group-duration/group-duration.page';
+import { GroupContactsPage } from '../group-messages/group-contacts/group-contacts.page';
+import { ThemeService } from 'src/app/services/theme.service';
+import { ChatService } from 'src/app/services/chat.service';
+import { ProcessesService } from 'src/app/services/processes.service';
+import { WsChatMethodsService } from 'src/app/services/chat/ws-chat-methods.service';
+import { AuthService } from 'src/app/services/auth.service';
+import { SessionStore } from 'src/app/store/session.service';
+
+@Component({
+ selector: 'app-new-group',
+ templateUrl: './new-group.page.html',
+ styleUrls: ['./new-group.page.scss'],
+})
+export class NewGroupPage implements OnInit {
+ isGroupCreated:boolean;
+ showLoader: boolean;
+ displayDuration: any;
+ showDuration: boolean;
+ selectedDuration = ['','',''];
+ thedate:any;
+ groupName:string;
+ documents:any;
+ loggedUserChat: any;
+
+ constructor(
+ private pickerController: PickerController,
+ private popoverController: PopoverController,
+ private modalController: ModalController,
+ private navParams: NavParams,
+ public ThemeService: ThemeService,
+ private chatService: ChatService,
+ private processesService: ProcessesService,
+ public wsChatMethodsService: WsChatMethodsService,
+ private authService: AuthService,
+ ) {
+ this.loggedUserChat = authService.ValidatedUserChat['data'];
+ this.isGroupCreated = false;
+ this.groupName = this.navParams.get('name');
+ this.documents = this.navParams.get('documents');
+ }
+
+ ngOnInit() {
+ this.chatService.refreshtoken();
+ console.log(this.documents)
+
+ }
+
+ _ionChange(event){
+ this.showDuration = event.detail.checked;
+
+ if(event.detail.checked){
+ this.thedate = new Date();
+ }
+ else{
+ this.thedate = '';
+ }
+ }
+ close(){
+ this.modalController.dismiss();
+ }
+
+ async createGroup(){
+
+ let name = this.groupName.split(' ').join('-');
+ //Take out all special characters in string
+ name = name.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
+
+ let customFields = {}
+ let res:any;
+
+ if(this.thedate) {
+ let customFields = {
+ "countDownDate": this.thedate
+ }
+ res = await this.wsChatMethodsService.createPrivateRoom(name, SessionStore.user.UserName, customFields);
+
+ }
+ else{
+ res = await this.wsChatMethodsService.createPrivateRoom(name, SessionStore.user.UserName, customFields);
+
+ }
+
+ this.isGroupCreated = true;
+ this.addContacts(res.result);
+
+ setTimeout(() => {
+ this.wsChatMethodsService.subscribeToRoomUpdate(res.result.rid, res.result);
+ }, 10)
+
+ }
+
+ async addContacts(room) {
+ this.close();
+
+ let name = this.groupName.split(' ').join('-');
+
+
+ const modal = await this.modalController.create({
+ component: GroupContactsPage,
+ componentProps: {
+ room: room,
+ },
+ cssClass: 'contacts',
+ backdropDismiss: false
+ });
+
+ await modal.present();
+ modal.onDidDismiss();
+ }
+
+ async setDuration(ev: any) {
+ const popover = await this.popoverController.create({
+ component: GroupDurationPage,
+ cssClass: 'group-duration',
+ event: ev,
+ translucent: true
+ });
+ return await popover.present();
+ }
+
+ async showPicker() {
+ const picker = await this.pickerController.create({
+ cssClass: '',
+ buttons: [
+ {
+ text: 'Cancelar', role: 'cancel', cssClass: 'btn-cancel'
+ },
+ {
+ text: 'Ok',
+ cssClass: 'btn-cancel',
+ handler:(value:any) => {
+
+ let now = new Date();
+ this.thedate = new Date(now.getFullYear(), now.getMonth(), now.getDate() + value.days.value, now.getHours() + value.hours.value, now.getMinutes() + value.minutes.value, now.getSeconds(), now.getMilliseconds());
+
+ this.selectedDuration = [
+ value.days.value,
+ value.hours.value,
+ value.minutes.value,
+ ]
+
+ if(value.days.value != null && value.hours.value != null && value.minutes.value != null){
+ if(value.days.value > 0) {
+ if(value.days.value == 1) {
+ if(value.hours.value == 1) {
+ this.displayDuration = value.days.value + " day " +
+ value.hours.value + " hora " +
+ value.minutes.value + " minutos";
+ }
+ else{
+ this.displayDuration = value.days.value + " days " +
+ value.hours.value + " horas " +
+ value.minutes.value + " minutos";
+ }
+ }
+ else{
+ if(value.hours.value == 1){
+ this.displayDuration = value.days.value + " days " +
+ value.hours.value + " hora " +
+ value.minutes.value + " minutos";
+ }
+ else{
+ this.displayDuration = value.days.value + " days " +
+ value.hours.value + " horas " +
+ value.minutes.value + " minutos";
+ }
+ }
+ }
+ else{
+ if(value.hours.value == 1){
+ this.displayDuration = value.hours.value + " hora " +
+ value.minutes.value + " minutos";
+ }
+ else{
+ this.displayDuration = value.hours.value + " horas " +
+ value.minutes.value + " minutos";
+ }
+ }
+ }
+ },
+ },
+ ],
+ columns: [
+ {
+ name: 'days',
+ prefix: 'Dias',
+ options: [
+ { text: '0', value: 0 },
+ { text: '1', value: 1 },
+ { text: '2', value: 2 },
+ { text: '3', value: 3 },
+ { text: '4', value: 4 },
+ ]
+ },
+ {
+ name: 'hours',
+ prefix: 'Horas',
+ options: [
+ { text: '0', value: 0 },
+ { text: '1', value: 1 },
+ { text: '2', value: 2 },
+ { text: '3', value: 3 },
+ { text: '4', value: 4 },
+ { text: '5', value: 5 },
+ { text: '6', value: 6 },
+ { text: '7', value: 7 },
+ { text: '8', value: 8 },
+ ]
+ },
+ {
+ name: 'minutes',
+ prefix: 'Minutos',
+ selectedIndex: 3,
+ options: [
+ { text: '0', value: 0 },
+ { text: '5', value: 5 },
+ { text: '10', value: 10 },
+ { text: '15', value: 15 },
+ { text: '20', value: 20 },
+ { text: '25', value: 25 },
+ { text: '30', value: 30 },
+ { text: '35', value: 35 },
+ { text: '45', value: 45 },
+ { text: '50', value: 50 },
+ { text: '55', value: 55 },
+ ]
+ }
+ ]
+ });
+ await picker.present();
+ picker.onDidDismiss().then(async data =>{
+ let day = await picker.getColumn('days');
+ let hour = await picker.getColumn('hours');
+ let minutes = await picker.getColumn('minutes');
+ });
+
+ }
+
+}
diff --git a/src/app/pages/events/attachments/attachments.page.ts b/src/app/pages/events/attachments/attachments.page.ts
index 054eabf90..6de2731ba 100644
--- a/src/app/pages/events/attachments/attachments.page.ts
+++ b/src/app/pages/events/attachments/attachments.page.ts
@@ -1,7 +1,6 @@
import { Component, OnInit } from '@angular/core';
import { AttachmentsService } from 'src/app/services/attachments.service';
import { Attachment } from 'src/app/models/attachment.model';
-import { ActivatedRoute, Router } from '@angular/router';
import { InAppBrowser } from '@ionic-native/in-app-browser/ngx';
import { ModalController, NavParams } from '@ionic/angular';
@@ -27,7 +26,7 @@ export class AttachmentsPage implements OnInit {
loadAttachments(eventid:string)
{
- this.attachamentsService.getEventAttachments(eventid).subscribe(attachments => {
+ this.attachamentsService.getAttachmentsById(eventid).subscribe(attachments => {
this.loadedEventAttachments = attachments;
this.pageId = eventid;
});
diff --git a/src/app/pages/events/attendee-modal/attendee-modal.page.html b/src/app/pages/events/attendee-modal/attendee-modal.page.html
deleted file mode 100644
index 60a73dc46..000000000
--- a/src/app/pages/events/attendee-modal/attendee-modal.page.html
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
- Adicionar intervenientes
-
-
-
-
-
-
-
-
-
-
-
-
- {{ attendee.Name }}
- {{ attendee.EmailAddress }}
-
-
-
-
-
-
-
-
-
-
- Cancelar
-
-
-
-
-
- Adicionar
-
-
-
-
-
\ No newline at end of file
diff --git a/src/app/pages/events/attendee-modal/attendee-modal.page.ts b/src/app/pages/events/attendee-modal/attendee-modal.page.ts
deleted file mode 100644
index 6671e9c40..000000000
--- a/src/app/pages/events/attendee-modal/attendee-modal.page.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import { Component, OnInit } from '@angular/core';
-import { ModalController } from '@ionic/angular';
-import { ContactsService } from 'src/app/services/contacts.service';
-import { EventPerson } from 'src/app/models/eventperson.model';
-import { ThrowStmt, removeSummaryDuplicates } from '@angular/compiler';
-
-@Component({
- selector: 'app-attendee-modal',
- templateUrl: './attendee-modal.page.html',
- styleUrls: ['./attendee-modal.page.scss'],
-})
-export class AttendeeModalPage implements OnInit {
-
- contacts: EventPerson[];
- showLoader: boolean = false;
- eventPersons: EventPerson[];
-
- constructor(private modalCtrl: ModalController, private contactsService: ContactsService) { }
-
- ngOnInit() {
- this.fetchContacts("");
- }
-
- save(){
- this.modalCtrl.dismiss(this.contacts.filter(function(contact) {
- return contact.IsRequired == true;
- }));
- }
-
- close(){
- this.modalCtrl.dismiss(null);
- }
-
- onChange(evt: any) {
- this.fetchContacts(evt.detail.value);
- }
-
- selectContact(itm: EventPerson){
- itm.IsRequired = !itm.IsRequired;
- }
-
- async fetchContacts(filter: string) {
- this.showLoader = true;
-
- this.contactsService.getContacts(filter).subscribe(result =>
- {
- if (this.eventPersons != null)
- {
- this.eventPersons.forEach(attendee => {
- const index: number = result.findIndex((cont) => {
- return cont.EmailAddress == attendee.EmailAddress
- });
-
- result.splice(index, 1);
- });
- }
-
- this.contacts = result;
- this.showLoader = false;
- }
- );
- }
-
-}
diff --git a/src/app/pages/events/attendees/attendees-routing.module.ts b/src/app/pages/events/attendees/attendees-routing.module.ts
index 7c59381bf..00f6f262b 100644
--- a/src/app/pages/events/attendees/attendees-routing.module.ts
+++ b/src/app/pages/events/attendees/attendees-routing.module.ts
@@ -1,12 +1,12 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
-import { AttendeesPage } from './attendees.page';
+import { AttendeesPageModal } from './attendees.page';
const routes: Routes = [
{
path: '',
- component: AttendeesPage
+ component: AttendeesPageModal
}
];
diff --git a/src/app/pages/events/attendees/attendees.module.ts b/src/app/pages/events/attendees/attendees.module.ts
index 63a655038..f21feadb2 100644
--- a/src/app/pages/events/attendees/attendees.module.ts
+++ b/src/app/pages/events/attendees/attendees.module.ts
@@ -6,7 +6,7 @@ import { IonicModule } from '@ionic/angular';
import { AttendeesPageRoutingModule } from './attendees-routing.module';
-import { AttendeesPage } from './attendees.page';
+import { AttendeesPageModal } from './attendees.page';
@NgModule({
imports: [
@@ -15,6 +15,7 @@ import { AttendeesPage } from './attendees.page';
IonicModule,
AttendeesPageRoutingModule
],
- declarations: [AttendeesPage]
+ declarations: [AttendeesPageModal],
+ exports: [AttendeesPageModal]
})
export class AttendeesPageModule {}
diff --git a/src/app/pages/events/attendees/attendees.page.html b/src/app/pages/events/attendees/attendees.page.html
index 1be3f6046..c6937e8f8 100644
--- a/src/app/pages/events/attendees/attendees.page.html
+++ b/src/app/pages/events/attendees/attendees.page.html
@@ -1,57 +1,93 @@
-
-
- Participantes
-
-
-
-
- Intervenientes
-
-
- Com Conhecimento
-
-
+
+
+ Adicionar intervenientes
+
+
-
-
-
- Adicionar participantes
-
-
-
-
-
-
- Apagar
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ attendee.Name }}
+ {{ attendee.EmailAddress }}
+
+
+
+
+
+
+
+
+
+
+
+
+ = 1 && adding == 'intervenient' " class="flex-grow-1 overflow-y-auto height-100 pb-0" >
+ = 1 || taskParticipantsCc.length >= 1" > Destinatário
+
+
+
+
+
+
{{ attendee.Name }}
{{ attendee.EmailAddress }}
-
+
+
+
+
+
+
+
+ = 1 && adding == 'CC' " class="flex-grow-1 overflow-y-auto height-100 pb-0" >
+ = 1 || taskParticipantsCc.length >= 1" > Destinatário
+
+
+
+
+
+
+
+
+
+
+ {{ attendee.Name }}
+ {{ attendee.EmailAddress }}
+
+
+
+
+
-
-
-
-
+
+
+
Cancelar
-
-
+
-
-
-
- OK
-
-
+
+
+ Gravar
+
-
\ No newline at end of file
+
diff --git a/src/app/pages/events/attendees/attendees.page.scss b/src/app/pages/events/attendees/attendees.page.scss
index 30cc9ce83..7cb035cfa 100644
--- a/src/app/pages/events/attendees/attendees.page.scss
+++ b/src/app/pages/events/attendees/attendees.page.scss
@@ -1,6 +1,3 @@
-ion-item-group{
- margin: 15px;
-}
ion-item{
border-bottom:1px solid #ccc;
}
diff --git a/src/app/pages/events/attendees/attendees.page.spec.ts b/src/app/pages/events/attendees/attendees.page.spec.ts
index d2cb216ae..f8fb83e19 100644
--- a/src/app/pages/events/attendees/attendees.page.spec.ts
+++ b/src/app/pages/events/attendees/attendees.page.spec.ts
@@ -1,19 +1,19 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { IonicModule } from '@ionic/angular';
-import { AttendeesPage } from './attendees.page';
+import { AttendeesPageModal } from './attendees.page';
describe('AttendeesPage', () => {
- let component: AttendeesPage;
- let fixture: ComponentFixture;
+ let component: AttendeesPageModal;
+ let fixture: ComponentFixture;
beforeEach(async(() => {
TestBed.configureTestingModule({
- declarations: [ AttendeesPage ],
+ declarations: [ AttendeesPageModal ],
imports: [IonicModule.forRoot()]
}).compileComponents();
- fixture = TestBed.createComponent(AttendeesPage);
+ fixture = TestBed.createComponent(AttendeesPageModal);
component = fixture.componentInstance;
fixture.detectChanges();
}));
diff --git a/src/app/pages/events/attendees/attendees.page.ts b/src/app/pages/events/attendees/attendees.page.ts
index 381044836..e00eb85f4 100644
--- a/src/app/pages/events/attendees/attendees.page.ts
+++ b/src/app/pages/events/attendees/attendees.page.ts
@@ -1,79 +1,144 @@
import { Component, OnInit } from '@angular/core';
import { EventPerson } from 'src/app/models/eventperson.model';
-import { EventsService } from 'src/app/services/events.service';
-import { ModalController, NavController } from '@ionic/angular';
-import { AttendeeModalPage } from '../attendee-modal/attendee-modal.page';
+import { ModalController, NavParams } from '@ionic/angular';
+import { ContactsService } from 'src/app/services/contacts.service';
+import { ThemeService } from 'src/app/services/theme.service'
@Component({
selector: 'app-attendees',
templateUrl: './attendees.page.html',
styleUrls: ['./attendees.page.scss'],
})
-export class AttendeesPage implements OnInit {
+export class AttendeesPageModal implements OnInit {
- eventAttendees: EventPerson[];
- segment:string = "true";
- shouldShowCancel:boolean = true;
+ // Defined by the API
+ contacts: EventPerson[];
+ showLoader: boolean = false;
+ selectedContact: EventPerson[] =[];
+ eventPersons: EventPerson[];
+ adding: "intervenient" | "CC";
+ currentPath = window.location.pathname;
+
+ taskParticipants:EventPerson[] = [];
+ taskParticipantsCc:EventPerson[] = [];
- searchCountryString = ''; // initialize your searchCountryString string empty
-
- constructor(private eventService: EventsService, private modalCtrl: ModalController,
- private navCtrl: NavController) {
- }
+ constructor(
+ private modalCtrl: ModalController,
+ private contactsService: ContactsService,
+ private navParams: NavParams,
+ private modalController: ModalController,
+ public ThemeService: ThemeService) {
+
+ this.adding = this.navParams.get('adding');
+ this.taskParticipants = this.navParams.get('taskParticipants');
+ this.taskParticipantsCc = this.navParams.get('taskParticipantsCc');
+ }
ngOnInit() {
- }
+ this.fetchContacts("");
+
+ if(this.taskParticipants == null || this.taskParticipants == undefined){
+ this.taskParticipants = [];
+ }
- save(){
- this.modalCtrl.dismiss(this.eventAttendees);
- }
-
- close(){
- this.modalCtrl.dismiss(null);
- }
-
- removeAttendee(attendee: EventPerson)
- {
- let index: number = this.eventAttendees.findIndex((att) => {
- return att.EmailAddress == attendee.EmailAddress
- });
-
- this.eventAttendees.splice(index, 1);
+ if(this.taskParticipantsCc == null || this.taskParticipantsCc == undefined){
+ this.taskParticipantsCc = [];
+ }
+
}
- async addAttendees()
- {
- const modal = await this.modalCtrl.create({
- component: AttendeeModalPage,
- componentProps: {
- eventPersons: this.eventAttendees
- },
- cssClass: 'attendee-modal',
- backdropDismiss: false
+ ngOnChanges(event) {}
+
+ save(){
+
+ this.modalController.dismiss({
+ 'taskParticipants': this.taskParticipants,
+ 'taskParticipantsCc': this.taskParticipantsCc
});
+ }
- await modal.present();
+ close() {
+ this.modalController.dismiss(false);
+ }
- modal.onDidDismiss().then((data) => {
- let newattendees: EventPerson[] = data['data'];
+ onChange(evt: any) {
+ this.fetchContacts(evt.detail.value);
+ }
+
+ filterSearchList(itm: EventPerson): boolean {
+
+ const result = this.taskParticipants.concat( this.taskParticipantsCc).find((contact, index)=>{
- if (newattendees != null)
- {
- newattendees.forEach(newattendee => {
- let att = {
- "EmailAddress": newattendee.EmailAddress,
- "Name": newattendee.Name,
- "IsRequired": (this.segment == "true")
- };
- if (this.eventAttendees == null)
- {
- this.eventAttendees = new Array();
- }
- this.eventAttendees.push(att);
- });
+ if(contact.Name.toLocaleLowerCase() == itm.Name.toLocaleLowerCase() && contact.EmailAddress.toLocaleLowerCase() == itm.EmailAddress.toLocaleLowerCase()){
+ index = index;
+ return contact;
}
- });
+
+ })
+
+ return undefined == result;
+
+ }
+
+ remove(itm: EventPerson){
+
+ if(this.adding == "intervenient"){
+
+ this.taskParticipants = this.taskParticipants.filter((contact, index) =>{
+
+ if(contact.Name.toLocaleLowerCase() != itm.Name.toLocaleLowerCase() && contact.EmailAddress.toLocaleLowerCase() != itm.EmailAddress.toLocaleLowerCase()){
+ return contact;
+ }
+ return false;
+
+ });
+
+ } else if (this.adding == "CC") {
+
+ this.taskParticipantsCc = this.taskParticipantsCc.filter((contact, index) =>{
+
+ if(contact.Name.toLocaleLowerCase() != itm.Name.toLocaleLowerCase() && contact.EmailAddress.toLocaleLowerCase() != itm.EmailAddress.toLocaleLowerCase()){
+ return contact;
+ }
+ return false;
+
+ });
+ }
+
+ }
+
+ async selectContact(itm: EventPerson){
+ if(this.adding == "intervenient"){
+ itm.IsRequired = true;
+ this.taskParticipants.push(itm);
+
+ } else if (this.adding == "CC") {
+ itm.IsRequired = false;
+ this.taskParticipantsCc.push(itm);
+ }
+ }
+
+ async fetchContacts(filter: string) {
+ this.showLoader = true;
+
+ this.contactsService.getContacts(filter).subscribe(result =>
+ {
+ if (this.eventPersons != null)
+ {
+ this.eventPersons.forEach(attendee => {
+ const index: number = result.findIndex((cont) => {
+ return cont.EmailAddress.toLocaleLowerCase() == attendee.EmailAddress.toLocaleLowerCase()
+ });
+
+ result.splice(index, 1);
+ });
+ }
+
+ this.contacts = result;
+ this.showLoader = false;
+ }
+ );
}
}
\ No newline at end of file
diff --git a/src/app/pages/events/edit-event/edit-event-routing.module.ts b/src/app/pages/events/edit-event/edit-event-routing.module.ts
new file mode 100644
index 000000000..3616b2106
--- /dev/null
+++ b/src/app/pages/events/edit-event/edit-event-routing.module.ts
@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { EditEventPage } from './edit-event.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: EditEventPage
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class EditEventPageRoutingModule {}
diff --git a/src/app/pages/events/edit-event/edit-event.module.ts b/src/app/pages/events/edit-event/edit-event.module.ts
new file mode 100644
index 000000000..bcd1dc3e4
--- /dev/null
+++ b/src/app/pages/events/edit-event/edit-event.module.ts
@@ -0,0 +1,21 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { EditEventPageRoutingModule } from './edit-event-routing.module';
+
+import { EditEventPage } from './edit-event.page';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+ EditEventPageRoutingModule
+ ],
+ declarations: [EditEventPage],
+ exports: [EditEventPage]
+})
+export class EditEventPageModule {}
diff --git a/src/app/pages/events/edit-event/edit-event.page.html b/src/app/pages/events/edit-event/edit-event.page.html
new file mode 100644
index 000000000..50a9723c8
--- /dev/null
+++ b/src/app/pages/events/edit-event/edit-event.page.html
@@ -0,0 +1,202 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Assunto
+
+
+
+
+ Campo obrigatório
+
+
+ Descrição
+
+
+
+ Localização
+
+
+
+ Calendário
+
+ Pessoal
+ Oficial
+
+
+
+ Tipo do evento
+
+ Reunião
+ Viagem
+ Conferência
+ Encontro
+
+
+
+ Data InÃcio
+
+
+
+ Data Fim
+
+
+
+
+
+
+ Editar
+
+ Participantes
+
+
+
+
+
+
+
+ {{attendee.Name}}
+
+
+
+
+
+
1">
+
+ Ver mais...
+
+
+
+
+
+
+
+ Editar
+
+ Anexos
+
+
+
+
+
+
+
+
+
+ {{ att.Description }}
+ {{ att.CreateDate }}
+
+
+
+
+
+
1">
+
+ Ver mais...
+
+
+
+
+
+
+ Sem anexos
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gravar
+
+
+
+
diff --git a/src/app/pages/events/edit-event/edit-event.page.scss b/src/app/pages/events/edit-event/edit-event.page.scss
new file mode 100644
index 000000000..4fa564390
--- /dev/null
+++ b/src/app/pages/events/edit-event/edit-event.page.scss
@@ -0,0 +1,166 @@
+
+.content{
+ padding: 30px 20px 0 20px !important;
+ margin: 0;
+ float: left;
+ border-left: 1px solid #d8d8d8 !important;
+ }
+ .main-header{
+ font-family: Roboto;
+ background-color: #fff;
+ overflow:hidden;
+ color:#000;
+ transform: translate3d(0, 1px, 0);
+
+ .title-content{
+ margin: 0px auto;
+ overflow: auto;
+ padding: 0 !important;
+ background: #fff;
+ .middle{
+ padding: 0!important;
+ float: left;
+ }
+ }
+
+ .title{
+ font-size: 25px;
+ }
+
+ }
+ .ion-item-container{
+ margin: 15px auto;
+ border: 1px solid #ebebeb;
+ border-radius: 5px;
+ padding-left: 10px;
+ }
+ .ion-item-container-no-border{
+ width: 100%;
+ margin: 0px auto;
+ padding: 0 !important;
+ overflow: auto;
+ }
+ .container-div{
+ margin-bottom: 15px;
+ float: left;
+ overflow: auto;
+ }
+ .ion-item-class-2{
+ margin: 0px auto;
+ }
+ .ion-icon-class{
+ width: 45px;
+ height: 45px;
+ float: left;
+ padding: 10px;
+ font-size: 25px;
+ }
+ ion-select{
+ padding-left: 5px;
+ margin-left: 0;
+ }
+ .ion-input-class{
+ width: calc(100% - 45px);
+ height: 45px;
+ border: 1px solid #ebebeb;
+ border-radius: 5px;
+ padding-left: 5px;
+ padding-right: 10px;
+ float: left;
+ }
+ .ion-input-class-no-height{
+ border: 1px solid #ebebeb;
+ border-radius: 5px;
+ overflow: auto;
+ }
+ .list-people{
+ //width: 256px;
+ float: left;
+
+ }
+ .add-people{
+ width: 45px;
+ float: right;
+ overflow: auto;
+ font-size: 25px;
+ height: 45px;
+ display: flex;
+ }
+ .list-people-title{
+ /* font-size: 13px; */
+ color: #797979;
+ }
+ .attach-document{
+ font-size: 15px;
+ color: var(--title-text-color);
+ margin: 5px 5px 5px 10px;
+ padding: 5px;
+ float: left;
+ }
+ .attach-icon{
+ width: 37px;
+ font-size: 35px;
+ float: left;
+ }
+ .attach-title-item{
+ width: 100%;
+ font-size: 15px;
+ color:var(--title-text-color);
+ }
+ /* SPAN */
+ .span-left{
+ float: left;
+ font-size: 15x;
+ }
+ .span-right{
+ text-align: right;
+ float: right;
+ font-size: 13px;
+ }
+ .container-footer{
+ margin:0 auto;
+ overflow: auto;
+ }
+ .button-cancel {
+ width: 170px;
+ height: 44px;
+ border-radius: 22.5px;
+ --background: #e0e9ee;
+ --color: #061b52;
+ margin:10px;
+ }
+ .button-save {
+ width: 170px;
+ height: 44px;
+ border-radius: 22.5px;
+ --background: #42b9fe;
+ --color:#ffffff;
+ margin:10px;
+ }
+
+ .text-input{
+ width: 100%;
+ border: 1px solid #ebebeb;
+ margin: 0px 15px 15px 0px;
+ padding: 0 !important;
+ border-radius: 5px;
+ }
+
+ /* Error Messages */
+ .error{
+ color:red;
+ font-size: 12px;
+ font-weight: bold;
+ padding-bottom: 20px;
+ }
+ .span-color{
+ color:red;
+ }
+
+
+ .buttons{
+ display: flex;
+ justify-content: space-between;
+ padding: 20px;
+ overflow: auto;
+ }
\ No newline at end of file
diff --git a/src/app/pages/events/edit-event/edit-event.page.spec.ts b/src/app/pages/events/edit-event/edit-event.page.spec.ts
new file mode 100644
index 000000000..f63e92e8d
--- /dev/null
+++ b/src/app/pages/events/edit-event/edit-event.page.spec.ts
@@ -0,0 +1,28 @@
+import { HttpClientModule } from '@angular/common/http';
+import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { EditEventPage } from './edit-event.page';
+
+describe('EditEventPage', () => {
+ let component: EditEventPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(waitForAsync(() => {
+ TestBed.configureTestingModule({
+ declarations: [ EditEventPage ],
+ imports: [
+ IonicModule.forRoot(),
+ HttpClientModule
+ ]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(EditEventPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/events/edit-event/edit-event.page.ts b/src/app/pages/events/edit-event/edit-event.page.ts
new file mode 100644
index 000000000..8324b12c9
--- /dev/null
+++ b/src/app/pages/events/edit-event/edit-event.page.ts
@@ -0,0 +1,243 @@
+import { Component, OnInit } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+import { EventsService } from 'src/app/services/events.service';
+import { Router } from '@angular/router';
+import { Event } from '../../../models/event.model';
+import { EventBody } from 'src/app/models/eventbody.model';
+import { AlertController, ModalController } from '@ionic/angular';
+import { EventPerson } from 'src/app/models/eventperson.model';
+import { AttendeesPageModal } from 'src/app/pages/events/attendees/attendees.page';
+import { AlertService } from 'src/app/services/alert.service';
+import { Attachment } from 'src/app/models/attachment.model';
+import { AttachmentsService } from 'src/app/services/attachments.service';
+import { FormGroup, FormBuilder, Validators } from "@angular/forms";
+import { InAppBrowser } from '@ionic-native/in-app-browser/ngx';
+import { AttachmentsPage } from '../attachments/attachments.page';
+
+@Component({
+ selector: 'app-edit-event',
+ templateUrl: './edit-event.page.html',
+ styleUrls: ['./edit-event.page.scss'],
+})
+
+export class EditEventPage implements OnInit {
+
+ loadedEvent: Event;
+ loadedEventAttachments: Attachment[];
+ pageId: string;
+ showLoader: boolean;
+ backURL: string;
+ ionicForm: FormGroup;
+ isSubmitted = false;
+
+ minDate: Date;
+
+ profile:string;
+
+ constructor(
+ public formBuilder: FormBuilder,
+ public alertController: AlertController,
+ private router: Router,
+ private activatedRoute: ActivatedRoute,
+ private eventsService: EventsService,
+ private modalCtrl: ModalController,
+ private alertService: AlertService,
+ private attachamentsService: AttachmentsService,
+ private route: Router,
+ private iab: InAppBrowser) {
+ this.loadedEvent = new Event();
+ this.loadedEvent.Body = new EventBody();
+
+ }
+
+ ngOnInit() {
+ this.loadEvent();
+ this.loadAttachments();
+ this.ionicForm = this.formBuilder.group({
+ subject: ['', [Validators.required]]
+ })
+ }
+
+ get errorControl() {
+ return this.ionicForm.controls;
+ }
+
+ loadEvent(){
+ let eventid: string;
+ this.activatedRoute.paramMap.subscribe(paramMap =>
+ {
+ if (!paramMap.has("eventId")){
+ return;
+ }
+ else{
+ this.pageId = paramMap.get('eventId');
+ eventid = paramMap.get('eventId');
+
+
+ }
+ if (paramMap.has("caller")){
+ this.backURL = "/home/" + paramMap.get('caller');
+ }
+ }
+ );
+ this.eventsService.getEvent(eventid).subscribe(response => {
+ this.loadedEvent = response;
+ });
+ }
+
+ async openAttendees(){
+ const modal = await this.modalCtrl.create({
+ component: AttendeesPageModal,
+ componentProps: {
+ eventAttendees: this.loadedEvent.Attendees
+ },
+ cssClass: 'attendee modal-desktop',
+ backdropDismiss: false
+ });
+
+ await modal.present();
+
+ modal.onDidDismiss().then((data) => {
+ if (data['data'] != null)
+ {
+ let newattendees: EventPerson[] = data['data'];
+ this.loadedEvent.Attendees = newattendees;
+ }
+ });
+ }
+
+ getEventAttendees(): EventPerson[]
+ {
+ return this.loadedEvent.Attendees;
+ }
+
+ setEventAttendees(newattendes: EventPerson[])
+ {
+ this.loadedEvent.Attendees = newattendes;
+ }
+
+ async deleteConfirm()
+ {
+ const alert = await this.alertController.create({
+ cssClass: 'my-custom-class',
+ header: 'Apagar evento!',
+ message: 'Deseja apagar o evento da agenda ' + this.loadedEvent.CalendarName + '?',
+ buttons: [
+ {
+ text: 'Não',
+ role: 'cancel',
+ cssClass: 'secondary',
+ handler: () => { }
+ }, {
+ text: 'Sim',
+ handler: () => {
+ this.Delete();
+ }
+ }
+ ]
+ });
+
+ await alert.present();
+ }
+
+ Delete()
+ {
+ this.eventsService.deleteEvent(this.loadedEvent.EventId, 0, this.loadedEvent.CalendarName).subscribe(async () =>
+ {
+ const alert = await this.alertController.create({
+ cssClass: 'my-custom-class',
+ header: 'Evento removido',
+ buttons: ['OK']
+ });
+
+ setTimeout(()=>{
+ alert.dismiss();
+ }, 1500);
+
+ this.router.navigate(['/home/events']);
+ });
+ }
+
+ Save()
+ {
+ if (this.ionicForm.valid){
+
+ this.activatedRoute.paramMap.subscribe(paramMap =>{
+ if (paramMap.has("profile")){
+
+
+ }
+ });
+
+ this.eventsService.editEvent(this.loadedEvent, 2, 3).subscribe(async () =>
+ {
+ const alert = await this.alertController.create({
+ cssClass: 'my-custom-class',
+ header: 'Evento actualizado',
+ buttons: ['OK']
+ });
+
+ setTimeout(()=>{
+ alert.dismiss();
+ }, 1500);
+ });
+ }
+ }
+
+ showAlert(){
+ this.alertService.presentAlert("Funcionalidade em desenvolvimento");
+ }
+
+ loadAttachments()
+ {
+ this.attachamentsService.getAttachmentsById(this.pageId).subscribe(res => {
+ this.loadedEventAttachments = res;
+
+
+ });
+ }
+ async viewDocument(documenturl:string)
+ {
+ const url: string = documenturl.replace("webTRIX.Viewer","webTRIX.Viewer.Branch1");
+ const browser = this.iab.create(url,"_blank");
+ browser.show();
+ }
+
+ back()
+ {
+ //this.back();
+ }
+ doRefresh(event){
+ /* this.RefreshEvents(); */
+ event.target.complete();
+ setTimeout(() => {
+ event.target.complete();
+ }, 2000);
+
+ }
+ navigateTo(ev){
+ this.route.navigate(['/home/events',ev]);
+ }
+ async openAttachments(){
+ const modal = await this.modalCtrl.create({
+ component: AttachmentsPage,
+ componentProps: {
+ eventId: this.pageId,
+ attachments: this.loadedEventAttachments
+ },
+ cssClass: 'attachments',
+ backdropDismiss: false
+ });
+
+ await modal.present();
+
+ modal.onDidDismiss().then((data) => {
+ if (data['data'] != null)
+ {
+ let newattendees: EventPerson[] = data['data'];
+ this.loadedEvent.Attendees = newattendees;
+ }
+ });
+
+ }
+}
diff --git a/src/app/pages/events/event-detail-modal/event-detail-modal-routing.module.ts b/src/app/pages/events/event-detail-modal/event-detail-modal-routing.module.ts
new file mode 100644
index 000000000..bebfe4ea1
--- /dev/null
+++ b/src/app/pages/events/event-detail-modal/event-detail-modal-routing.module.ts
@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { EventDetailModalPage } from './event-detail-modal.page';
+
+const routes: Routes = [
+ {
+ path: '',
+ component: EventDetailModalPage
+ }
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class EventDetailModalPageRoutingModule {}
diff --git a/src/app/pages/events/event-detail-modal/event-detail-modal.module.ts b/src/app/pages/events/event-detail-modal/event-detail-modal.module.ts
new file mode 100644
index 000000000..5472c8c36
--- /dev/null
+++ b/src/app/pages/events/event-detail-modal/event-detail-modal.module.ts
@@ -0,0 +1,20 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { EventDetailModalPageRoutingModule } from './event-detail-modal-routing.module';
+
+import { EventDetailModalPage } from './event-detail-modal.page';
+
+@NgModule({
+ imports: [
+ CommonModule,
+ FormsModule,
+ IonicModule,
+ EventDetailModalPageRoutingModule
+ ],
+ declarations: [EventDetailModalPage]
+})
+export class EventDetailModalPageModule {}
diff --git a/src/app/pages/events/event-detail-modal/event-detail-modal.page.html b/src/app/pages/events/event-detail-modal/event-detail-modal.page.html
new file mode 100644
index 000000000..565af41d2
--- /dev/null
+++ b/src/app/pages/events/event-detail-modal/event-detail-modal.page.html
@@ -0,0 +1,215 @@
+
+
+
+
+
+ Visualizar Evento
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Descrição
+
+
+
+ Localização
+
+
+
+ Calendário
+
+ Pessoal
+ Oficial
+
+
+
+ Tipo do evento
+
+ Reunião
+ Viagem
+ Conferência
+ Encontro
+
+
+
+ Data InÃcio
+
+
+
+ Data Fim
+
+
+
+
+
+
+ Editar
+
+ Participantes
+
+
+
+
+
+
+
+ {{attendee.Name}}
+
+
+
+
+
+
1">
+
+ Ver mais...
+
+
+
+
+
+
+
+ Editar
+
+ Anexos
+
+
+
+
+
+
+
+
+
+ {{ att.Description }}
+ {{ att.CreateDate }}
+
+
+
+
+
+
1">
+
+ Ver mais...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sem anexos
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gravar
+
+
+
+
diff --git a/src/app/pages/events/event-detail-modal/event-detail-modal.page.scss b/src/app/pages/events/event-detail-modal/event-detail-modal.page.scss
new file mode 100644
index 000000000..b94403c90
--- /dev/null
+++ b/src/app/pages/events/event-detail-modal/event-detail-modal.page.scss
@@ -0,0 +1,95 @@
+ion-item-group{
+ margin: 15px;
+}
+.div-item{
+ width: 100%;
+ overflow: auto;
+ border-bottom: 1px solid #ccc;
+ margin: 10px 0 5px 0;
+}
+.div-up{
+ width: 100%;
+ overflow: auto;
+}
+.div-up h3{
+ margin: 0;
+ padding: 0;
+ font-size: 17px;
+ width: 100%;
+}
+.div-icon{
+ width: 10%;
+ font-size: 22px;
+ float: left;
+ color: #808080;
+}
+.div-icon ion-icon{
+ display: block;
+ margin: 0 auto;
+
+}
+.div-content-attachment{
+ width: 85%;
+ float: left;
+ padding: 0 0 0 12px;
+}
+.ion-icon-attach{
+ color: #666666;
+ font-size: 20px;
+}
+
+.btn-attach{
+ margin: 15px 0 0 0;
+ --color: #333;
+ --border-color:#333;
+}
+.div-card-button{
+ width: 100%;
+ overflow: auto;
+ padding: 0 !important;
+}
+ion-card{
+ margin: 2.5% !important;
+ width: 45%;
+ float: left;
+}
+.center{
+ text-align: center;
+ float: center;
+}
+
+/* FFOTER */
+.event-detail-buttons{
+ width: 90%;
+ margin: 10px auto;
+}
+.event-detail-buttons ion-button{
+ width: 90%;
+ margin: 0 auto;
+ display: block;
+ margin-bottom: 25px;
+}
+.ion-icon-delete{
+ font-size: 22px;
+ color: red;
+ background-color: white;
+ padding-right: 5px;
+}
+.error{
+ color:red;
+ font-size: 12px;
+ font-weight: bold;
+ padding-bottom: 20px;
+}
+/* .event-detail-buttons{
+ margin-bottom: 80px;
+ margin-top: 10px;
+} */
+.attendees-icon{
+ font-size: 14px;
+}
+.see-more-button{
+ text-transform: initial;
+ font-size: 16px;
+}
+
diff --git a/src/app/pages/events/event-detail-modal/event-detail-modal.page.spec.ts b/src/app/pages/events/event-detail-modal/event-detail-modal.page.spec.ts
new file mode 100644
index 000000000..76c8032a4
--- /dev/null
+++ b/src/app/pages/events/event-detail-modal/event-detail-modal.page.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { IonicModule } from '@ionic/angular';
+
+import { EventDetailModalPage } from './event-detail-modal.page';
+
+describe('EventDetailModalPage', () => {
+ let component: EventDetailModalPage;
+ let fixture: ComponentFixture;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ EventDetailModalPage ],
+ imports: [IonicModule.forRoot()]
+ }).compileComponents();
+
+ fixture = TestBed.createComponent(EventDetailModalPage);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ }));
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/src/app/pages/events/event-detail-modal/event-detail-modal.page.ts b/src/app/pages/events/event-detail-modal/event-detail-modal.page.ts
new file mode 100644
index 000000000..c49c78eab
--- /dev/null
+++ b/src/app/pages/events/event-detail-modal/event-detail-modal.page.ts
@@ -0,0 +1,245 @@
+import { Component, OnInit } from '@angular/core';
+import { FormBuilder, FormGroup, Validators } from '@angular/forms';
+import { ActivatedRoute, Router } from '@angular/router';
+import { AlertController, ModalController } from '@ionic/angular';
+import { Attachment } from 'src/app/models/attachment.model';
+import { Event } from 'src/app/models/event.model';
+import { EventBody } from 'src/app/models/eventbody.model';
+import { EventPerson } from 'src/app/models/eventperson.model';
+import { AlertService } from 'src/app/services/alert.service';
+import { AttachmentsService } from 'src/app/services/attachments.service';
+import { EventsService } from 'src/app/services/events.service';
+import { AttachmentsPage } from '../attachments/attachments.page';
+import { AttendeesPageModal } from '../attendees/attendees.page';
+
+@Component({
+ selector: 'app-event-detail-modal',
+ templateUrl: './event-detail-modal.page.html',
+ styleUrls: ['./event-detail-modal.page.scss'],
+})
+export class EventDetailModalPage implements OnInit {
+
+ loadedEvent: Event;
+ loadedEventAttachments: Attachment[];
+ pageId: string;
+ showLoader: boolean;
+ backURL: string;
+ ionicForm: FormGroup;
+ isSubmitted = false;
+
+ minDate: Date;
+
+ profile:string;
+
+ constructor(
+ public formBuilder: FormBuilder,
+ public alertController: AlertController,
+ private router: Router,
+ private activatedRoute: ActivatedRoute,
+ private eventsService: EventsService,
+ private modalCtrl: ModalController,
+ private alertService: AlertService,
+ private attachamentsService: AttachmentsService,
+ private route: Router,) {
+ this.loadedEvent = new Event();
+ this.loadedEvent.Body = new EventBody();
+ }
+
+ ngOnInit() {
+ this.loadEvent();
+ this.loadAttachments();
+ this.ionicForm = this.formBuilder.group({
+ subject: ['', [Validators.required]]
+ })
+
+ // this.setDefaultTime()
+ }
+
+ // setDefaultTime() {
+ // this.loadedEvent.StartDate = new Date()
+ // this.loadedEvent.EndDate = (new Date(new Date().getTime() + 15 * 60000))
+ // }
+
+ get errorControl() {
+ return this.ionicForm.controls;
+ }
+
+ loadEvent(){
+ let eventid: string;
+ this.activatedRoute.paramMap.subscribe(paramMap =>
+ {
+ if (!paramMap.has("eventId")){
+ return;
+ }
+ else{
+ this.pageId = paramMap.get('eventId');
+ eventid = paramMap.get('eventId');
+
+
+ }
+ if (paramMap.has("caller")){
+ this.backURL = "/home/" + paramMap.get('caller');
+ }
+ }
+ );
+ this.eventsService.getEvent(eventid).subscribe(response => {
+ this.loadedEvent = response;
+ });
+ }
+
+ async openAttendees(){
+ const modal = await this.modalCtrl.create({
+ component: AttendeesPageModal,
+ componentProps: {
+ eventAttendees: this.loadedEvent.Attendees
+ },
+ cssClass: 'attendee modal-desktop',
+ backdropDismiss: false
+ });
+
+ await modal.present();
+
+ modal.onDidDismiss().then((data) => {
+ if (data['data'] != null)
+ {
+ let newattendees: EventPerson[] = data['data'];
+ this.loadedEvent.Attendees = newattendees;
+ }
+ });
+}
+
+ getEventAttendees(): EventPerson[]
+ {
+ return this.loadedEvent.Attendees;
+ }
+
+ setEventAttendees(newattendes: EventPerson[])
+ {
+ this.loadedEvent.Attendees = newattendes;
+ }
+
+ async deleteConfirm()
+ {
+ const alert = await this.alertController.create({
+ cssClass: 'my-custom-class',
+ header: 'Apagar evento!',
+ message: 'Deseja apagar o evento da agenda ' + this.loadedEvent.CalendarName + '?',
+ buttons: [
+ {
+ text: 'Não',
+ role: 'cancel',
+ cssClass: 'secondary',
+ handler: () => { }
+ }, {
+ text: 'Sim',
+ handler: () => {
+ this.Delete();
+ }
+ }
+ ]
+ });
+
+ await alert.present();
+ }
+
+ Delete()
+ {
+ this.eventsService.deleteEvent(this.loadedEvent.EventId, 0, this.loadedEvent.CalendarName).subscribe(async () =>
+ {
+ const alert = await this.alertController.create({
+ cssClass: 'my-custom-class',
+ header: 'Evento removido',
+ buttons: ['OK']
+ });
+
+ setTimeout(()=>{
+ alert.dismiss();
+ }, 1500);
+
+ this.router.navigate(['/home/events']);
+ });
+ }
+
+ Save()
+ {
+ if (this.ionicForm.valid)
+ {
+
+ this.eventsService.putEvent(this.loadedEvent, 2, 3, "md").subscribe(async () =>
+ {
+ const alert = await this.alertController.create({
+ cssClass: 'my-custom-class',
+ header: 'Evento actualizado',
+ buttons: ['OK']
+ });
+
+ setTimeout(()=>{
+ alert.dismiss();
+ }, 1500);
+ });
+ }
+ }
+
+ showAlert(){
+ this.alertService.presentAlert("Funcionalidade em desenvolvimento");
+ }
+
+ loadAttachments()
+ {
+ /* this.attachamentsService.getEventAttachments(this.pageId).subscribe(attachments => {
+ this.loadedEventAttachments = attachments;
+ }); */
+ this.attachamentsService.getAttachmentsById(this.pageId).subscribe(res => {
+
+
+ },(error) => {
+
+
+ });
+ }
+ async viewDocument(documenturl:string)
+ {
+ const url: string = documenturl.replace("webTRIX.Viewer","webTRIX.Viewer.Branch1");
+ /* const browser = this.iab.create(url,"_blank");
+ browser.show(); */
+ }
+
+ back()
+ {
+ //this.back();
+ }
+ doRefresh(event){
+ /* this.RefreshEvents(); */
+ event.target.complete();
+ setTimeout(() => {
+ event.target.complete();
+ }, 2000);
+
+ }
+ navigateTo(ev){
+ this.route.navigate(['/home/events',ev]);
+ }
+ async openAttachments() {
+ const modal = await this.modalCtrl.create({
+ component: AttachmentsPage,
+ componentProps: {
+ eventId: this.pageId,
+ attachments: this.loadedEventAttachments
+ },
+ cssClass: 'attachments',
+ backdropDismiss: false
+ });
+
+ await modal.present();
+
+ modal.onDidDismiss().then((data) => {
+ if (data['data'] != null)
+ {
+ let newattendees: EventPerson[] = data['data'];
+ this.loadedEvent.Attendees = newattendees;
+ }
+ });
+
+ }
+
+}
diff --git a/src/app/pages/events/event-detail/event-detail.page.html b/src/app/pages/events/event-detail/event-detail.page.html
index e7878d3df..15f9c7920 100644
--- a/src/app/pages/events/event-detail/event-detail.page.html
+++ b/src/app/pages/events/event-detail/event-detail.page.html
@@ -3,7 +3,7 @@
- Visualizar Evento
+
@@ -19,12 +19,12 @@
Descrição
@@ -53,41 +53,16 @@
Data InÃcio
Data Fim
-
-
-
+
@@ -101,16 +76,16 @@
- {{attendee.Name}}
+ {{attendee.Name}}
-
+