mirror of
https://code.equilibrium.co.ao/ITO/doneit-web.git
synced 2026-04-18 20:47:54 +00:00
fix some bug on blue theme
This commit is contained in:
@@ -135,7 +135,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div> -->
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import { SessionStore } from 'src/app/store/session.service';
|
|||||||
import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'
|
import { HttpErrorHandle } from 'src/app/services/http-error-handle.service'
|
||||||
import { environment } from 'src/environments/environment';
|
import { environment } from 'src/environments/environment';
|
||||||
import { ContactsService } from 'src/app/services/contacts.service';
|
import { ContactsService } from 'src/app/services/contacts.service';
|
||||||
|
import { DomSanitizerService } from 'src/app/services/DomSanitizer.service';
|
||||||
|
|
||||||
const CUSTOM_DATE_FORMATS: NgxMatDateFormats = {
|
const CUSTOM_DATE_FORMATS: NgxMatDateFormats = {
|
||||||
parse: {
|
parse: {
|
||||||
@@ -98,7 +99,8 @@ export class EditEventPage implements OnInit {
|
|||||||
private router: Router,
|
private router: Router,
|
||||||
public ThemeService: ThemeService,
|
public ThemeService: ThemeService,
|
||||||
private httpErrorHandle: HttpErrorHandle,
|
private httpErrorHandle: HttpErrorHandle,
|
||||||
private contactsService: ContactsService
|
private contactsService: ContactsService,
|
||||||
|
private domSanitazerService: DomSanitizerService
|
||||||
) {
|
) {
|
||||||
|
|
||||||
/* this.postEvent = new Event(); */
|
/* this.postEvent = new Event(); */
|
||||||
@@ -363,6 +365,9 @@ export class EditEventPage implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.postEvent.Attendees = this.taskParticipants.concat(this.taskParticipantsCc)
|
this.postEvent.Attendees = this.taskParticipants.concat(this.taskParticipantsCc)
|
||||||
|
this.postEvent.Subject = this.domSanitazerService.sanitizeInput(this.postEvent.Subject);
|
||||||
|
this.postEvent.Location = this.domSanitazerService.sanitizeInput(this.postEvent.Location);
|
||||||
|
this.postEvent.Body.Text = this.domSanitazerService.sanitizeInput(this.postEvent.Body.Text);
|
||||||
|
|
||||||
this.postEvent.EventRecurrence.Type = this.selectedRecurringType;
|
this.postEvent.EventRecurrence.Type = this.selectedRecurringType;
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import { environment } from 'src/environments/environment';
|
|||||||
import { ProcessesService } from 'src/app/services/processes.service';
|
import { ProcessesService } from 'src/app/services/processes.service';
|
||||||
import { TaskService } from 'src/app/services/task.service'
|
import { TaskService } from 'src/app/services/task.service'
|
||||||
import { ContactsService } from 'src/app/services/contacts.service';
|
import { ContactsService } from 'src/app/services/contacts.service';
|
||||||
|
import { DomSanitizerService } from 'src/app/services/DomSanitizer.service';
|
||||||
|
|
||||||
const CUSTOM_DATE_FORMATS: NgxMatDateFormats = {
|
const CUSTOM_DATE_FORMATS: NgxMatDateFormats = {
|
||||||
parse: {
|
parse: {
|
||||||
@@ -111,6 +112,7 @@ export class NewEventPage implements OnInit {
|
|||||||
private processeService: ProcessesService,
|
private processeService: ProcessesService,
|
||||||
public TaskService: TaskService,
|
public TaskService: TaskService,
|
||||||
private contactsService: ContactsService,
|
private contactsService: ContactsService,
|
||||||
|
private domSanitazerService: DomSanitizerService
|
||||||
) {
|
) {
|
||||||
this.loggeduser = SessionStore.user;
|
this.loggeduser = SessionStore.user;
|
||||||
this.postEvent = new Event();
|
this.postEvent = new Event();
|
||||||
@@ -413,6 +415,9 @@ export class NewEventPage implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.postEvent.Attendees = this.taskParticipants.concat(this.taskParticipantsCc);
|
this.postEvent.Attendees = this.taskParticipants.concat(this.taskParticipantsCc);
|
||||||
|
this.postEvent.Subject = this.domSanitazerService.sanitizeInput(this.postEvent.Subject);
|
||||||
|
this.postEvent.Location = this.domSanitazerService.sanitizeInput(this.postEvent.Location);
|
||||||
|
this.postEvent.Body.Text = this.domSanitazerService.sanitizeInput(this.postEvent.Body.Text);
|
||||||
|
|
||||||
let eventId: any;
|
let eventId: any;
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<div class="title-content d-flex justify-between width-100 mb-10">
|
<div class="title-content d-flex justify-between width-100 mb-10">
|
||||||
<div class="left d-flex">
|
<div class="left d-flex">
|
||||||
<button class="btn-no-color d-flex align-center" (click)="goBack()">
|
<button class="btn-no-color d-flex align-center" (click)="goBack()">
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'doneIt' " src="assets/images/theme/doneIt/icons-calendar-arrow-left.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/theme/blue/icons-calendar-arrow-left.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " slot="end" src='assets/images/theme/gov/icons-calendar-arrow-left.svg'></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " slot="end" src='assets/images/theme/gov/icons-calendar-arrow-left.svg'></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'doneIt' " slot="end" src='assets/images/theme/{{ThemeService.currentTheme}}/icons-calendar-arrow-left.svg'></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'doneIt' " slot="end" src='assets/images/theme/{{ThemeService.currentTheme}}/icons-calendar-arrow-left.svg'></ion-icon>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div hidden class="right">
|
<div hidden class="right">
|
||||||
<button class="btn-no-color" (click)="openMessagesOptions()">
|
<button class="btn-no-color" (click)="openMessagesOptions()">
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/theme/blue/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg">
|
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -311,7 +311,8 @@ label {
|
|||||||
.time {
|
.time {
|
||||||
font-family: Roboto;
|
font-family: Roboto;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: var(--header-tab-text-white);
|
/* color: var(--header-tab-text-white); */
|
||||||
|
color: black;
|
||||||
line-height: unset;
|
line-height: unset;
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<div class="title">{{ task.Folio}}</div>
|
<div class="title">{{ task.Folio}}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="div-icon" (click)="openOptions()">
|
<div class="div-icon" (click)="openOptions()">
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " class="font-25 cursor-pointer" src="assets/images/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " class="font-25 cursor-pointer" src="assets/images/theme/blue/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " class="font-25 cursor-pointer" src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " class="font-25 cursor-pointer" src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'doneIt' " class="font-25 cursor-pointer" src="assets/images/theme/{{ThemeService.currentTheme}}/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'doneIt' " class="font-25 cursor-pointer" src="assets/images/theme/{{ThemeService.currentTheme}}/icons-menu.svg"></ion-icon>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<ion-label class="title">{{ task.Folio }}</ion-label>
|
<ion-label class="title">{{ task.Folio }}</ion-label>
|
||||||
</div>
|
</div>
|
||||||
<div class="div-icon" (click)="openOptions()" *ngIf="p.userPermission([p.permissionList.Agenda.access])">
|
<div class="div-icon" (click)="openOptions()" *ngIf="p.userPermission([p.permissionList.Agenda.access])">
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/theme/blue/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'doneIt' " src="assets/images/theme/{{ThemeService.currentTheme}}/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'doneIt' " src="assets/images/theme/{{ThemeService.currentTheme}}/icons-menu.svg"></ion-icon>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="menu-ptions">
|
<div class="menu-ptions">
|
||||||
<button class="btn-no-color" (click)="openOptions(loadedEvent)">
|
<button class="btn-no-color" (click)="openOptions(loadedEvent)">
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/theme/blue/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'doneIt' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'doneIt' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
+1
-1
@@ -17,7 +17,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="menu-ptions">
|
<div class="menu-ptions">
|
||||||
<button class="btn-no-color d-flex" (click)="openOptions()">
|
<button class="btn-no-color d-flex" (click)="openOptions()">
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/theme/blue/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'doneIt' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'doneIt' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="menu-ptions">
|
<div class="menu-ptions">
|
||||||
<button class="btn-no-color" (click)="openOptions()">
|
<button class="btn-no-color" (click)="openOptions()">
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/theme/blue/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="div-icon d-flex">
|
<div class="div-icon d-flex">
|
||||||
<div autoHide="false" class="d-flex" (click)="openOptions()">
|
<div autoHide="false" class="d-flex" (click)="openOptions()">
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " class="font-30-rem cursor-pointer" src="assets/images/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " class="font-30-rem cursor-pointer" src="assets/images/theme/blue/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " class="font-30-rem cursor-pointer" src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " class="font-30-rem cursor-pointer" src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -7,16 +7,17 @@
|
|||||||
<div class="bg-4 d-flex justify-center align-center">
|
<div class="bg-4 d-flex justify-center align-center">
|
||||||
<div class="div-logo">
|
<div class="div-logo">
|
||||||
|
|
||||||
<img *ngIf="ThemeService.currentTheme == 'default' " src='assets/images/fullLogo-no-g.png' alt='logo'>
|
<img *ngIf="ThemeService.currentTheme == 'default' " src='assets/images/donit.jpg' alt='logo'>
|
||||||
<img *ngIf="ThemeService.currentTheme == 'gov' " src='assets/images/theme/gov/governoangola_A.png' alt='logo'>
|
<img *ngIf="ThemeService.currentTheme == 'gov' " src='assets/images/theme/gov/governoangola_A.png' alt='logo'>
|
||||||
<img *ngIf="ThemeService.currentTheme == 'doneIt' " src='assets/images/theme/{{ThemeService.currentTheme}}/governoangola_A.png' alt='logo'>
|
<img *ngIf="ThemeService.currentTheme == 'doneIt' " src='assets/images/doneit.jpg' alt='logo'>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<h3 class="center text-white">Gabinete Digital</h3>
|
<h3 class="center text-white">doneIT</h3>
|
||||||
|
<h3 class="center text-white">Digital Workplace</h3>
|
||||||
<form class="form">
|
<form class="form">
|
||||||
<p class="form-label">Email</p>
|
<p class="form-label">Email</p>
|
||||||
<ion-item class="form-input">
|
<ion-item class="form-input">
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import { TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { DomSanitizerService } from './DomSanitizer.service';
|
||||||
|
|
||||||
|
describe('ActiveTabService', () => {
|
||||||
|
let service: DomSanitizerService;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
TestBed.configureTestingModule({});
|
||||||
|
service = TestBed.inject(DomSanitizerService);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be created', () => {
|
||||||
|
expect(service).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
import { Injectable, SecurityContext } from '@angular/core';
|
||||||
|
import { DomSanitizer } from '@angular/platform-browser';
|
||||||
|
import { Router } from '@angular/router';
|
||||||
|
|
||||||
|
@Injectable({
|
||||||
|
providedIn: 'root'
|
||||||
|
})
|
||||||
|
export class DomSanitizerService {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
constructor(private sanitizer: DomSanitizer) {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sanitizeInput(input: string): string {
|
||||||
|
return this.sanitizer.sanitize(SecurityContext.HTML, input);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,7 +13,7 @@ export class ThemeService {
|
|||||||
'doneIt'
|
'doneIt'
|
||||||
]
|
]
|
||||||
|
|
||||||
private defaultTheme: any = 'gov'
|
private defaultTheme: any = 'default'
|
||||||
currentTheme: 'gov' | 'default' | 'doneIt' = this.defaultTheme
|
currentTheme: 'gov' | 'default' | 'doneIt' = this.defaultTheme
|
||||||
keyName: string
|
keyName: string
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import { removeDuplicate } from 'src/plugin/removeDuplicate.js'
|
|||||||
import { EventToApproveEdit } from 'src/app/models/event.model';
|
import { EventToApproveEdit } from 'src/app/models/event.model';
|
||||||
import { ThemeService } from 'src/app/services/theme.service'
|
import { ThemeService } from 'src/app/services/theme.service'
|
||||||
import { HttpErrorHandle } from 'src/app/services/http-error-handle.service';
|
import { HttpErrorHandle } from 'src/app/services/http-error-handle.service';
|
||||||
|
import { DomSanitizerService } from 'src/app/services/DomSanitizer.service';
|
||||||
|
|
||||||
|
|
||||||
const CUSTOM_DATE_FORMATS: NgxMatDateFormats = {
|
const CUSTOM_DATE_FORMATS: NgxMatDateFormats = {
|
||||||
@@ -131,7 +132,8 @@ export class EditEventToApprovePage implements OnInit {
|
|||||||
private processes:ProcessesService,
|
private processes:ProcessesService,
|
||||||
private toastService: ToastService,
|
private toastService: ToastService,
|
||||||
public ThemeService: ThemeService,
|
public ThemeService: ThemeService,
|
||||||
public httpErrorHandler: HttpErrorHandle
|
public httpErrorHandler: HttpErrorHandle,
|
||||||
|
private domSanitizeService: DomSanitizerService
|
||||||
) {
|
) {
|
||||||
this.isEventEdited = false;
|
this.isEventEdited = false;
|
||||||
}
|
}
|
||||||
@@ -324,6 +326,10 @@ export class EditEventToApprovePage implements OnInit {
|
|||||||
e.IsRequired = false
|
e.IsRequired = false
|
||||||
})
|
})
|
||||||
|
|
||||||
|
this.eventProcess.workflowInstanceDataFields.Subject = this.domSanitizeService.sanitizeInput(this.eventProcess.workflowInstanceDataFields.Subject);
|
||||||
|
this.eventProcess.workflowInstanceDataFields.Location = this.domSanitizeService.sanitizeInput(this.eventProcess.workflowInstanceDataFields.Location);
|
||||||
|
this.eventProcess.workflowInstanceDataFields.Body = this.domSanitizeService.sanitizeInput(this.eventProcess.workflowInstanceDataFields.Body);
|
||||||
|
|
||||||
this.eventProcess.workflowInstanceDataFields.ParticipantsList = this.taskParticipants.concat(this.taskParticipantsCc)
|
this.eventProcess.workflowInstanceDataFields.ParticipantsList = this.taskParticipants.concat(this.taskParticipantsCc)
|
||||||
|
|
||||||
this.eventProcess.workflowInstanceDataFields.ParticipantsList.forEach(e=>{
|
this.eventProcess.workflowInstanceDataFields.ParticipantsList.forEach(e=>{
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import { ThemeService } from 'src/app/services/theme.service'
|
|||||||
import { SessionStore } from 'src/app/store/session.service';
|
import { SessionStore } from 'src/app/store/session.service';
|
||||||
import { HttpErrorHandle } from 'src/app/services/http-error-handle.service';
|
import { HttpErrorHandle } from 'src/app/services/http-error-handle.service';
|
||||||
import { ContactsService } from 'src/app/services/contacts.service'
|
import { ContactsService } from 'src/app/services/contacts.service'
|
||||||
|
import { DomSanitizerService } from 'src/app/services/DomSanitizer.service';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-edit-event',
|
selector: 'app-edit-event',
|
||||||
@@ -100,7 +101,8 @@ export class EditEventPage implements OnInit {
|
|||||||
private attachmentsService: AttachmentsService,
|
private attachmentsService: AttachmentsService,
|
||||||
public ThemeService: ThemeService,
|
public ThemeService: ThemeService,
|
||||||
private httpErrorHandle: HttpErrorHandle,
|
private httpErrorHandle: HttpErrorHandle,
|
||||||
private contactsService: ContactsService
|
private contactsService: ContactsService,
|
||||||
|
private domSanitizeService: DomSanitizerService
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
@@ -344,6 +346,9 @@ export class EditEventPage implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._postEvent.Attendees = this.taskParticipants.concat(this.taskParticipantsCc);
|
this._postEvent.Attendees = this.taskParticipants.concat(this.taskParticipantsCc);
|
||||||
|
this._postEvent.Subject = this.domSanitizeService.sanitizeInput(this._postEvent.Subject);
|
||||||
|
this._postEvent.Location = this.domSanitizeService.sanitizeInput(this._postEvent.Location);
|
||||||
|
this._postEvent.Body.Text = this.domSanitizeService.sanitizeInput(this._postEvent.Body.Text);
|
||||||
|
|
||||||
if(!this._postEvent.EventRecurrence.hasOwnProperty('Type')) {
|
if(!this._postEvent.EventRecurrence.hasOwnProperty('Type')) {
|
||||||
this._postEvent.EventRecurrence.Type = '-1'
|
this._postEvent.EventRecurrence.Type = '-1'
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
|
|
||||||
<div class="ion-item-container" [class.input-error]="Form?.get('Subject')?.invalid && validateFrom ">
|
<div class="ion-item-container" [class.input-error]="Form?.get('Subject')?.invalid && validateFrom ">
|
||||||
<ion-input appInputFilter autocomplete="on" autocorrect="on" spellcheck="true" type="text" placeholder="Assunto*" [(ngModel)]="postEvent.Subject"></ion-input>
|
<ion-input autocomplete="on" autocorrect="on" spellcheck="true" type="text" placeholder="Assunto*" [(ngModel)]="postEvent.Subject"></ion-input>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div *ngIf="Form && validateFrom" >
|
<div *ngIf="Form && validateFrom" >
|
||||||
@@ -293,7 +293,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="ion-input-class-no-height flex-grow-1">
|
<div class="ion-input-class-no-height flex-grow-1">
|
||||||
|
|
||||||
<ion-textarea appInputFilter class="heigh-200" autocomplete="on" autocorrect="on" spellcheck="true" [(ngModel)]="postEvent.Body.Text" placeholder="Detalhes" autoGrow="true" ></ion-textarea>
|
<ion-textarea class="heigh-200" autocomplete="on" autocorrect="on" spellcheck="true" [(ngModel)]="postEvent.Body.Text" placeholder="Detalhes" autoGrow="true" ></ion-textarea>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import { Subject } from 'rxjs';
|
|||||||
|
|
||||||
import { TaskService } from 'src/app/services/task.service'
|
import { TaskService } from 'src/app/services/task.service'
|
||||||
import { ContactsService } from 'src/app/services/contacts.service';
|
import { ContactsService } from 'src/app/services/contacts.service';
|
||||||
|
import { DomSanitizerService } from 'src/app/services/DomSanitizer.service';
|
||||||
const CUSTOM_DATE_FORMATS: NgxMatDateFormats = {
|
const CUSTOM_DATE_FORMATS: NgxMatDateFormats = {
|
||||||
parse: {
|
parse: {
|
||||||
dateInput: "YYYY-MMMM-DD HH:mm"
|
dateInput: "YYYY-MMMM-DD HH:mm"
|
||||||
@@ -147,6 +148,7 @@ export class NewEventPage implements OnInit {
|
|||||||
private processeService: ProcessesService,
|
private processeService: ProcessesService,
|
||||||
public TaskService: TaskService,
|
public TaskService: TaskService,
|
||||||
private contactsService: ContactsService,
|
private contactsService: ContactsService,
|
||||||
|
private domSanitazerService: DomSanitizerService
|
||||||
) {
|
) {
|
||||||
this.dateAdapter.setLocale('pt');
|
this.dateAdapter.setLocale('pt');
|
||||||
this.loggeduser = SessionStore.user;
|
this.loggeduser = SessionStore.user;
|
||||||
@@ -503,6 +505,10 @@ export class NewEventPage implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.postEvent.Attendees = this.taskParticipants.concat(this.taskParticipantsCc);
|
this.postEvent.Attendees = this.taskParticipants.concat(this.taskParticipantsCc);
|
||||||
|
this.postEvent.Subject = this.domSanitazerService.sanitizeInput(this.postEvent.Subject);
|
||||||
|
this.postEvent.Location = this.domSanitazerService.sanitizeInput(this.postEvent.Location);
|
||||||
|
this.postEvent.Body.Text = this.domSanitazerService.sanitizeInput(this.postEvent.Body.Text);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (this.documents.length > 0) {
|
if (this.documents.length > 0) {
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
|
|
||||||
<!-- <div class="div-icon" (click)="openOptions()">
|
<!-- <div class="div-icon" (click)="openOptions()">
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/theme/blue/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'doneIt' " src="assets/images/theme/{{ThemeService.currentTheme}}/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'doneIt' " src="assets/images/theme/{{ThemeService.currentTheme}}/icons-menu.svg"></ion-icon>
|
||||||
</div>
|
</div>
|
||||||
@@ -130,7 +130,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- <div (click)="docIndex(i);LoadDocumentDetails()" class="doc-options">
|
<!-- <div (click)="docIndex(i);LoadDocumentDetails()" class="doc-options">
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/theme/blue/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' "
|
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' "
|
||||||
src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
||||||
</div> -->
|
</div> -->
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<div class="right">
|
<div class="right">
|
||||||
<!-- <div (click)=" ChatSystemService.getGroupRoom(this.roomId).deleteAll()">delete all</div> -->
|
<!-- <div (click)=" ChatSystemService.getGroupRoom(this.roomId).deleteAll()">delete all</div> -->
|
||||||
<button title="Menu" class="btn-no-color" (click)="openGroupMessagesOptions()">
|
<button title="Menu" class="btn-no-color" (click)="openGroupMessagesOptions()">
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/theme/blue/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div hidden class="right">
|
<div hidden class="right">
|
||||||
<button title="Menu" class="btn-no-color" (click)="_openMessagesOptions()">
|
<button title="Menu" class="btn-no-color" (click)="_openMessagesOptions()">
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/theme/blue/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg">
|
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg">
|
||||||
</ion-icon>
|
</ion-icon>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -650,7 +650,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
|
|||||||
resultType: CameraResultType.Base64,
|
resultType: CameraResultType.Base64,
|
||||||
source: CameraSource.Camera
|
source: CameraSource.Camera
|
||||||
});
|
});
|
||||||
|
console.log('Selected: ', file)
|
||||||
var base64 = 'data:image/jpeg;base64,' + file.base64String
|
var base64 = 'data:image/jpeg;base64,' + file.base64String
|
||||||
const compressedImage = await this.compressImageBase64(
|
const compressedImage = await this.compressImageBase64(
|
||||||
base64,
|
base64,
|
||||||
@@ -658,7 +658,7 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
|
|||||||
800, // maxHeight
|
800, // maxHeight
|
||||||
0.9 // quality
|
0.9 // quality
|
||||||
).then((picture) => {
|
).then((picture) => {
|
||||||
console.log('Selected: ', picture)
|
|
||||||
base64 = picture
|
base64 = picture
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -790,42 +790,46 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
|
|||||||
|
|
||||||
//const imageData = await this.fileToBase64Service.convert(file)
|
//const imageData = await this.fileToBase64Service.convert(file)
|
||||||
//
|
//
|
||||||
|
console.log('Selected: ', file)
|
||||||
var base64 = 'data:image/jpeg;base64,' + file.base64String
|
var base64 = 'data:image/jpeg;base64,' + file.base64String
|
||||||
const compressedImage = await this.compressImageBase64(
|
if (file.format == "jpeg" || file.format == "png" || file.format == "gif") {
|
||||||
base64,
|
|
||||||
800, // maxWidth
|
|
||||||
800, // maxHeight
|
|
||||||
0.9 // quality
|
|
||||||
).then((picture) => {
|
|
||||||
console.log('Selected: ', picture)
|
|
||||||
base64 = picture
|
|
||||||
});
|
|
||||||
|
|
||||||
const response = await fetch(base64);
|
const compressedImage = await this.compressImageBase64(
|
||||||
const blob = await response.blob();
|
base64,
|
||||||
|
800, // maxWidth
|
||||||
|
800, // maxHeight
|
||||||
|
0.9 // quality
|
||||||
|
).then((picture) => {
|
||||||
|
|
||||||
console.log(base64)
|
base64 = picture
|
||||||
|
});
|
||||||
|
|
||||||
const formData = new FormData();
|
const response = await fetch(base64);
|
||||||
formData.append("blobFile", blob);
|
const blob = await response.blob();
|
||||||
|
|
||||||
|
console.log(base64)
|
||||||
|
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append("blobFile", blob);
|
||||||
|
|
||||||
|
this.ChatSystemService.getDmRoom(roomId).send({
|
||||||
|
file: {
|
||||||
|
"type": "application/img",
|
||||||
|
"guid": ''
|
||||||
|
},
|
||||||
|
temporaryData: formData,
|
||||||
|
attachments: [{
|
||||||
|
"title": file.path,
|
||||||
|
//"image_url": 'data:image/jpeg;base64,' + file.base64String,
|
||||||
|
"text": "description",
|
||||||
|
"title_link_download": false,
|
||||||
|
}],
|
||||||
|
attachmentsModelData: {
|
||||||
|
fileBase64: base64,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
this.ChatSystemService.getDmRoom(roomId).send({
|
|
||||||
file: {
|
|
||||||
"type": "application/img",
|
|
||||||
"guid": ''
|
|
||||||
},
|
|
||||||
temporaryData: formData,
|
|
||||||
attachments: [{
|
|
||||||
"title": file.path,
|
|
||||||
//"image_url": 'data:image/jpeg;base64,' + file.base64String,
|
|
||||||
"text": "description",
|
|
||||||
"title_link_download": false,
|
|
||||||
}],
|
|
||||||
attachmentsModelData: {
|
|
||||||
fileBase64: base64,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -838,63 +842,69 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy
|
|||||||
|
|
||||||
const file: any = await this.fileService.getFileFromDevice(types);
|
const file: any = await this.fileService.getFileFromDevice(types);
|
||||||
|
|
||||||
const fileName = file.name
|
if (file.type == 'application/pdf' || file.type == 'application/doc' || file.type == 'application/docx' ||
|
||||||
|
file.type == 'application/xls' || file.type == 'application/xlsx' || file.type == 'application/ppt' ||
|
||||||
|
file.type == 'application/pptx' || file.type == 'application/txt') {
|
||||||
|
|
||||||
const validation = this.FileValidatorService.fileNameValidation(fileName)
|
console.log('FILE', file)
|
||||||
|
|
||||||
if(validation.isOk) {
|
const fileName = file.name
|
||||||
|
|
||||||
const encodedData = btoa(JSON.stringify(await this.getBase64(file).catch((error) => {
|
const validation = this.FileValidatorService.fileNameValidation(fileName)
|
||||||
console.error(error);
|
|
||||||
})));
|
|
||||||
|
|
||||||
let blob;
|
if (validation.isOk) {
|
||||||
let formData
|
|
||||||
let fileBase64
|
|
||||||
if (this.platform.is("tablet")) {
|
|
||||||
|
|
||||||
blob = this.fileService.base64toBlob(encodedData, file.type)
|
const encodedData = btoa(JSON.stringify(await this.getBase64(file).catch((error) => {
|
||||||
console.log('BLOB BLOB', blob)
|
console.error(error);
|
||||||
|
})));
|
||||||
|
|
||||||
formData = new FormData();
|
let blob;
|
||||||
formData.append('blobFile', blob);
|
let formData
|
||||||
/* console.log('add file', fileBase64) */
|
let fileBase64
|
||||||
|
if (this.platform.is("tablet")) {
|
||||||
|
|
||||||
|
blob = this.fileService.base64toBlob(encodedData, file.type)
|
||||||
|
console.log('BLOB BLOB', blob)
|
||||||
|
|
||||||
|
formData = new FormData();
|
||||||
|
formData.append('blobFile', blob);
|
||||||
|
/* console.log('add file', fileBase64) */
|
||||||
|
|
||||||
|
} else {
|
||||||
|
blob = this.fileService.base64toBlob(encodedData, file.type)
|
||||||
|
|
||||||
|
fileBase64 = await this._getBase64(file)
|
||||||
|
|
||||||
|
formData = new FormData();
|
||||||
|
formData.append('blobFile', blob);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
this.ChatSystemService.getDmRoom(roomId).send({
|
||||||
|
file: {
|
||||||
|
"type": file.type,
|
||||||
|
"guid": '',
|
||||||
|
},
|
||||||
|
attachments: [{
|
||||||
|
"title": file.name,
|
||||||
|
"name": file.name,
|
||||||
|
//"image_url": res,
|
||||||
|
// "text": "description",
|
||||||
|
"title_link_download": false,
|
||||||
|
}],
|
||||||
|
temporaryData: formData,
|
||||||
|
attachmentsModelData: {
|
||||||
|
fileBase64: fileBase64,
|
||||||
|
}
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
blob = this.fileService.base64toBlob(encodedData, file.type)
|
this.toastService._badRequest("Ficheiro inválido")
|
||||||
|
|
||||||
fileBase64 = await this._getBase64(file)
|
|
||||||
|
|
||||||
formData = new FormData();
|
|
||||||
formData.append('blobFile', blob);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.ChatSystemService.getDmRoom(roomId).send({
|
|
||||||
file: {
|
|
||||||
"type": file.type,
|
|
||||||
"guid": '',
|
|
||||||
},
|
|
||||||
attachments: [{
|
|
||||||
"title": file.name,
|
|
||||||
"name": file.name,
|
|
||||||
//"image_url": res,
|
|
||||||
// "text": "description",
|
|
||||||
"title_link_download": false,
|
|
||||||
}],
|
|
||||||
temporaryData: formData,
|
|
||||||
attachmentsModelData: {
|
|
||||||
fileBase64: fileBase64,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
this.toastService._badRequest("Ficheiro inválido")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_getBase64(file) {
|
_getBase64(file) {
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@
|
|||||||
<ion-label class="title">{{ task.Folio}}</ion-label>
|
<ion-label class="title">{{ task.Folio}}</ion-label>
|
||||||
</div>
|
</div>
|
||||||
<div class="div-icon" (click)="openOptions.emit()">
|
<div class="div-icon" (click)="openOptions.emit()">
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/theme/blue/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<ion-label class="title">{{ task.Folio}}</ion-label>
|
<ion-label class="title">{{ task.Folio}}</ion-label>
|
||||||
</div>
|
</div>
|
||||||
<div class="div-icon" (click)="openOptions.emit()">
|
<div class="div-icon" (click)="openOptions.emit()">
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'default' " src="assets/images/theme/blue/icons-menu.svg"></ion-icon>
|
||||||
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
<ion-icon *ngIf="ThemeService.currentTheme == 'gov' " src="assets/images/theme/gov/icons-menu.svg"></ion-icon>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
@@ -4,4 +4,4 @@ import { doneITProd } from './suport/doneIt'
|
|||||||
import { DevDev } from './suport/dev'
|
import { DevDev } from './suport/dev'
|
||||||
|
|
||||||
|
|
||||||
export const environment: Environment = DevDev;
|
export const environment: Environment = doneITProd;
|
||||||
|
|||||||
@@ -4,4 +4,4 @@ import { doneITDev } from './suport/doneIt'
|
|||||||
import { DevDev } from './suport/dev'
|
import { DevDev } from './suport/dev'
|
||||||
|
|
||||||
|
|
||||||
export const environment: Environment = DevDev
|
export const environment: Environment = doneITDev
|
||||||
|
|||||||
@@ -3,12 +3,16 @@ import { Environment } from './../../app/models/envarioment';
|
|||||||
|
|
||||||
export const doneITProd: Environment = {
|
export const doneITProd: Environment = {
|
||||||
id:'1',
|
id:'1',
|
||||||
apiURL: 'https://API.DONEIT.CO.AO/api/',
|
apiURL: 'https://gdapi-dev.dyndns.info/api/',
|
||||||
|
apiChatUrl: 'https://gdchat-dev.dyndns.info/api/v1/',
|
||||||
|
apiWsChatUrl: 'wss://gdchat-dev.dyndns.info/websocket',
|
||||||
|
apiPCURL: 'https://gdcmapi-dev.dyndns.info/api/',
|
||||||
|
/* apiURL: 'https://API.DONEIT.CO.AO/api/',
|
||||||
apiChatUrl: 'https://CHAT.DONEIT.CO.AO/api/v1/',
|
apiChatUrl: 'https://CHAT.DONEIT.CO.AO/api/v1/',
|
||||||
apiWsChatUrl: 'wss://CHAT.DONEIT.CO.AO/websocket',
|
apiWsChatUrl: 'wss://CHAT.DONEIT.CO.AO/websocket',
|
||||||
apiPCURL: 'http://192.168.0.21:9099/api/',
|
apiPCURL: 'http://192.168.0.21:9099/api/', */
|
||||||
production: true,
|
production: true,
|
||||||
domain: 'equilibrium.co.ao',
|
domain: 'gabinetedigital.local',
|
||||||
defaultuser: '',
|
defaultuser: '',
|
||||||
defaultuserpwd: '',
|
defaultuserpwd: '',
|
||||||
chatOffline: true,
|
chatOffline: true,
|
||||||
@@ -29,14 +33,18 @@ export const doneITProd: Environment = {
|
|||||||
|
|
||||||
export const doneITDev: Environment = {
|
export const doneITDev: Environment = {
|
||||||
id:'1',
|
id:'1',
|
||||||
apiURL: 'https://API.DONEIT.CO.AO/api/',
|
apiURL: 'https://gdapi-dev.dyndns.info/api/',
|
||||||
|
apiChatUrl: 'https://gdchat-dev.dyndns.info/api/v1/',
|
||||||
|
apiWsChatUrl: 'wss://gdchat-dev.dyndns.info/websocket',
|
||||||
|
apiPCURL: 'https://gdcmapi-dev.dyndns.info/api/',
|
||||||
|
/* apiURL: 'https://API.DONEIT.CO.AO/api/',
|
||||||
apiChatUrl: 'https://CHAT.DONEIT.CO.AO/api/v1/',
|
apiChatUrl: 'https://CHAT.DONEIT.CO.AO/api/v1/',
|
||||||
apiWsChatUrl: 'wss://CHAT.DONEIT.CO.AO/websocket',
|
apiWsChatUrl: 'wss://CHAT.DONEIT.CO.AO/websocket',
|
||||||
apiPCURL: 'http://192.168.0.21:9099/api/',
|
apiPCURL: 'http://192.168.0.21:9099/api/', */
|
||||||
production: true,
|
production: true,
|
||||||
domain: 'equilibrium.co.ao',
|
domain: 'gabinetedigital.local',
|
||||||
defaultuser: 'peter.maquiran@equilibrium.co.ao',
|
defaultuser: '',
|
||||||
defaultuserpwd: 'codcodccx',
|
defaultuserpwd: '',
|
||||||
chatOffline: true,
|
chatOffline: true,
|
||||||
presidential: false,
|
presidential: false,
|
||||||
version: versionData,
|
version: versionData,
|
||||||
|
|||||||
Reference in New Issue
Block a user