mirror of
https://code.equilibrium.co.ao/ITO/doneit-web.git
synced 2026-04-20 21:35:50 +00:00
Merge branch 'feature/chat' of https://bitbucket.org/equilibriumito/gabinete-digital into feature/chat
This commit is contained in:
@@ -20,7 +20,7 @@ ion-content{
|
|||||||
}
|
}
|
||||||
.div-icon{
|
.div-icon{
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 50%;
|
width: fit-content;
|
||||||
float: right;
|
float: right;
|
||||||
font-size: 35px;
|
font-size: 35px;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
@@ -104,7 +104,7 @@ ion-content{
|
|||||||
color: #000;
|
color: #000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@media only screen and (min-width: 1024px) {
|
@media only screen and (min-width: 801px) {
|
||||||
.main-content{
|
.main-content{
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -103,7 +103,6 @@ export class ChatPage implements OnInit {
|
|||||||
){
|
){
|
||||||
this.loggedUserChat = authService.ValidatedUserChat['data'];
|
this.loggedUserChat = authService.ValidatedUserChat['data'];
|
||||||
this.headers = new HttpHeaders();
|
this.headers = new HttpHeaders();
|
||||||
this.loadMessage();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
@@ -140,16 +139,16 @@ hideRefreshButton(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
loadMessage(){
|
/* loadMessage(){
|
||||||
this.chatService.messages.subscribe(msg => {
|
this.chatService.messages.subscribe(msg => {
|
||||||
console.log("Response from websocket: " + msg);
|
console.log("Response from websocket: " + msg);
|
||||||
});
|
});
|
||||||
}
|
} */
|
||||||
sendMsg() {
|
/* sendMsg() {
|
||||||
console.log("new message from client to websocket: ", this.message);
|
console.log("new message from client to websocket: ", this.message);
|
||||||
this.chatService.messages.next(this.message);
|
this.chatService.messages.next(this.message);
|
||||||
this.message.msg = "";
|
this.message.msg = "";
|
||||||
}
|
} */
|
||||||
|
|
||||||
|
|
||||||
/* Fim websockets functions */
|
/* Fim websockets functions */
|
||||||
@@ -168,11 +167,9 @@ sendMsg() {
|
|||||||
this.showEmptyComponent=true;
|
this.showEmptyComponent=true;
|
||||||
}
|
}
|
||||||
openGroupContactsPage(data){
|
openGroupContactsPage(data){
|
||||||
console.log(data);
|
|
||||||
this.groupRoomId = data;
|
this.groupRoomId = data;
|
||||||
console.log(this.groupRoomId);
|
|
||||||
this.closeAllDesktopComponents();
|
this.closeAllDesktopComponents();
|
||||||
if(window.innerWidth <= 1024){
|
if(window.innerWidth < 801){
|
||||||
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -180,8 +177,8 @@ sendMsg() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
openMessagesPage(rid) {
|
openMessagesPage(rid) {
|
||||||
if( window.innerWidth <= 1024){
|
if( window.innerWidth < 801){
|
||||||
//this.openMessagesModal(rid);
|
this.openMessagesModal(rid);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
this.closeAllDesktopComponents();
|
this.closeAllDesktopComponents();
|
||||||
@@ -194,7 +191,7 @@ sendMsg() {
|
|||||||
console.log('OK');
|
console.log('OK');
|
||||||
this.closeAllDesktopComponents();
|
this.closeAllDesktopComponents();
|
||||||
|
|
||||||
if( window.innerWidth <= 1024){
|
if( window.innerWidth < 801){
|
||||||
this.selectContact();
|
this.selectContact();
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -203,7 +200,7 @@ sendMsg() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
openNewGroupPage() {
|
openNewGroupPage() {
|
||||||
if( window.innerWidth <= 1024){
|
if( window.innerWidth < 801){
|
||||||
this.newGroup();
|
this.newGroup();
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -213,7 +210,7 @@ sendMsg() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
openEditGroupPage(rid) {
|
openEditGroupPage(rid) {
|
||||||
if( window.innerWidth <= 1024){
|
if( window.innerWidth < 801){
|
||||||
this.editGroup(rid);
|
this.editGroup(rid);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -225,7 +222,7 @@ sendMsg() {
|
|||||||
openGroupMessagesPage(rid) {
|
openGroupMessagesPage(rid) {
|
||||||
console.log(rid);
|
console.log(rid);
|
||||||
|
|
||||||
if( window.innerWidth <= 1024){
|
if( window.innerWidth < 801){
|
||||||
this.openGroupMessagesModal(rid);
|
this.openGroupMessagesModal(rid);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
<ion-label>Esta conversa passou a grupo</ion-label><br />
|
<ion-label>Esta conversa passou a grupo</ion-label><br />
|
||||||
<ion-label>A conversa original mantêm-se como chat individual</ion-label>
|
<ion-label>A conversa original mantêm-se como chat individual</ion-label>
|
||||||
</div>
|
</div>
|
||||||
<div *ngFor="let msg of messages" class="messages">
|
<div *ngFor="let msg of messages" class="messages" #scrollMe>
|
||||||
<div *ngIf="msg.t != 'r'" class='incoming-{{msg.u.username!=loggedUser.me.username}}'>
|
<div *ngIf="msg.t != 'r'" class='incoming-{{msg.u.username!=loggedUser.me.username}}'>
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<ion-label>{{msg.u.name}}</ion-label>
|
<ion-label>{{msg.u.name}}</ion-label>
|
||||||
@@ -90,7 +90,7 @@
|
|||||||
<div class="width-80">
|
<div class="width-80">
|
||||||
<ion-item class="ion-no-padding type-message" lines="none">
|
<ion-item class="ion-no-padding type-message" lines="none">
|
||||||
<ion-textarea clearOnEdit="true" placeholder="Escrever uma mensagem" auto-grow class="message-input" rows="1" [(ngModel)]="message"></ion-textarea>
|
<ion-textarea clearOnEdit="true" placeholder="Escrever uma mensagem" auto-grow class="message-input" rows="1" [(ngModel)]="message"></ion-textarea>
|
||||||
<button class="btn-no-color" (click)="notImplemented()">
|
<button hidden class="btn-no-color" (click)="notImplemented()">
|
||||||
<ion-icon slot="end" src="assets/icon/icons-chat-mic.svg"></ion-icon>
|
<ion-icon slot="end" src="assets/icon/icons-chat-mic.svg"></ion-icon>
|
||||||
</button>
|
</button>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|||||||
@@ -82,7 +82,7 @@
|
|||||||
<div class="width-70">
|
<div class="width-70">
|
||||||
<ion-item class="ion-no-padding ion-no-margin type-message" lines="none">
|
<ion-item class="ion-no-padding ion-no-margin type-message" lines="none">
|
||||||
<ion-textarea clearOnEdit="true" placeholder="Escrever uma mensagem" auto-grow class="message-input" rows="1" [(ngModel)]="message"></ion-textarea>
|
<ion-textarea clearOnEdit="true" placeholder="Escrever uma mensagem" auto-grow class="message-input" rows="1" [(ngModel)]="message"></ion-textarea>
|
||||||
<button class="btn-no-color" (click)="notImplemented()">
|
<button hidden class="btn-no-color" (click)="notImplemented()">
|
||||||
<!-- <ion-icon slot="end" src="assets/icon/icons-chat-mic.svg"></ion-icon> -->
|
<!-- <ion-icon slot="end" src="assets/icon/icons-chat-mic.svg"></ion-icon> -->
|
||||||
</button>
|
</button>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ export class MessagesPage implements OnInit, AfterViewChecked {
|
|||||||
/* setInterval(()=>{ */
|
/* setInterval(()=>{ */
|
||||||
this.load();
|
this.load();
|
||||||
/* }, 9000); */
|
/* }, 9000); */
|
||||||
this.el = document.getElementById("scrollToBottom");
|
/* this.el = document.getElementById("scrollToBottom");
|
||||||
this.el.scrollTop = this.el.scrollHeight - this.el.scrollTop;
|
this.el.scrollTop = this.el.scrollHeight - this.el.scrollTop; */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,10 +61,12 @@ export class MessagesPage implements OnInit, AfterViewChecked {
|
|||||||
close(){
|
close(){
|
||||||
this.modalController.dismiss();
|
this.modalController.dismiss();
|
||||||
}
|
}
|
||||||
|
|
||||||
load(){
|
load(){
|
||||||
this.loadMessages();
|
this.loadMessages();
|
||||||
this.getChatMembers();
|
this.getChatMembers();
|
||||||
}
|
}
|
||||||
|
|
||||||
doRefresh(ev:any){
|
doRefresh(ev:any){
|
||||||
this.load();
|
this.load();
|
||||||
ev.target.complete();
|
ev.target.complete();
|
||||||
@@ -78,7 +80,6 @@ export class MessagesPage implements OnInit, AfterViewChecked {
|
|||||||
try {
|
try {
|
||||||
this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight;
|
this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight;
|
||||||
} catch(err) { }
|
} catch(err) { }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sendMessage(){
|
sendMessage(){
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ export class ChatService {
|
|||||||
X_User_Id:any;
|
X_User_Id:any;
|
||||||
X_Auth_Token:any;
|
X_Auth_Token:any;
|
||||||
|
|
||||||
SERVER_URL = 'wss://www.tabularium.pt/websocket';
|
//SERVER_URL = 'wss://www.tabularium.pt/websocket';
|
||||||
public messages: Subject<any>;
|
//public messages: Subject<any>;
|
||||||
loggedUserChat:any;
|
loggedUserChat:any;
|
||||||
bindOnMessage: any;
|
bindOnMessage: any;
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ export class ChatService {
|
|||||||
private authService: AuthService,
|
private authService: AuthService,
|
||||||
private storage: Storage,
|
private storage: Storage,
|
||||||
private storageService:StorageService,
|
private storageService:StorageService,
|
||||||
private wsService: WebsocketService,
|
//private wsService: WebsocketService,
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
this.loggedUserChat = authService.ValidatedUserChat;
|
this.loggedUserChat = authService.ValidatedUserChat;
|
||||||
@@ -42,11 +42,11 @@ export class ChatService {
|
|||||||
headers: this.headers,
|
headers: this.headers,
|
||||||
};
|
};
|
||||||
|
|
||||||
this.messages = <Subject<any>>this.wsService.connect(this.SERVER_URL).map((response: MessageEvent): any => {
|
/* this.messages = <Subject<any>>this.wsService.connect(this.SERVER_URL).map((response: MessageEvent): any => {
|
||||||
let data = JSON.parse(response.data);
|
let data = JSON.parse(response.data);
|
||||||
console.log(data);
|
console.log(data);
|
||||||
return (JSON.stringify(data));
|
return (JSON.stringify(data));
|
||||||
});
|
}); */
|
||||||
}
|
}
|
||||||
|
|
||||||
getAllChannels(){
|
getAllChannels(){
|
||||||
|
|||||||
@@ -36,8 +36,8 @@
|
|||||||
<ion-label> {{message}} Esta conversa passou a grupo</ion-label><br />
|
<ion-label> {{message}} Esta conversa passou a grupo</ion-label><br />
|
||||||
<ion-label>A conversa original mantêm-se como chat individual</ion-label>
|
<ion-label>A conversa original mantêm-se como chat individual</ion-label>
|
||||||
</div>
|
</div>
|
||||||
<div class="messages">
|
<div class="messages" #scrollMe>
|
||||||
<div class="container-width-100" *ngFor="let msg of messages">
|
<div class="container-width-100" *ngFor="let msg of messages" #scrollMe>
|
||||||
<div *ngIf="msg.t != 'r'" class='incoming-{{msg.u.username!=loggedUser.me.username}} max-width-45'>
|
<div *ngIf="msg.t != 'r'" class='incoming-{{msg.u.username!=loggedUser.me.username}} max-width-45'>
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<ion-label>{{msg.u.name}}</ion-label>
|
<ion-label>{{msg.u.name}}</ion-label>
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
<div class="width-80">
|
<div class="width-80">
|
||||||
<ion-item class="ion-no-padding type-message" lines="none">
|
<ion-item class="ion-no-padding type-message" lines="none">
|
||||||
<ion-textarea clearOnEdit="true" placeholder="Escrever uma mensagem" auto-grow class="message-input" rows="1" [(ngModel)]="message"></ion-textarea>
|
<ion-textarea clearOnEdit="true" placeholder="Escrever uma mensagem" auto-grow class="message-input" rows="1" [(ngModel)]="message"></ion-textarea>
|
||||||
<button class="btn-no-color" (click)="notImplemented()">
|
<button hidden class="btn-no-color">
|
||||||
<ion-icon slot="end" src="assets/icon/icons-chat-mic.svg"></ion-icon>
|
<ion-icon slot="end" src="assets/icon/icons-chat-mic.svg"></ion-icon>
|
||||||
</button>
|
</button>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|||||||
@@ -183,9 +183,14 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
|
||||||
|
|
||||||
ion-textarea{
|
ion-textarea{
|
||||||
|
width: fit-content;
|
||||||
|
display: block;
|
||||||
margin: 0 !important;
|
margin: 0 !important;
|
||||||
align-self: center;
|
align-self: center;
|
||||||
|
//border: 1px solid red;
|
||||||
|
//overflow: auto;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Component, OnChanges, OnInit, Input, SimpleChanges, Output, EventEmitter} from '@angular/core';
|
import { Component, OnChanges, OnInit, Input, SimpleChanges, Output, EventEmitter, ViewChild, ElementRef, AfterViewChecked} from '@angular/core';
|
||||||
import { ActionSheetController, AnimationController, MenuController, ModalController, PopoverController } from '@ionic/angular';
|
import { ActionSheetController, AnimationController, MenuController, ModalController, PopoverController } from '@ionic/angular';
|
||||||
import { AlertService } from 'src/app/services/alert.service';
|
import { AlertService } from 'src/app/services/alert.service';
|
||||||
import { AuthService } from 'src/app/services/auth.service';
|
import { AuthService } from 'src/app/services/auth.service';
|
||||||
@@ -14,11 +14,11 @@ import { GroupContactsPage } from './group-contacts/group-contacts.page';
|
|||||||
templateUrl: './group-messages.page.html',
|
templateUrl: './group-messages.page.html',
|
||||||
styleUrls: ['./group-messages.page.scss'],
|
styleUrls: ['./group-messages.page.scss'],
|
||||||
})
|
})
|
||||||
export class GroupMessagesPage implements OnInit, OnChanges {
|
export class GroupMessagesPage implements OnInit, OnChanges, AfterViewChecked {
|
||||||
showLoader: boolean;
|
showLoader: boolean;
|
||||||
isGroupCreated:boolean;
|
isGroupCreated:boolean;
|
||||||
loggedUser: any;
|
loggedUser: any;
|
||||||
message:any;
|
message:any="";
|
||||||
leaveStatus:any;
|
leaveStatus:any;
|
||||||
messages:any;
|
messages:any;
|
||||||
|
|
||||||
@@ -34,6 +34,8 @@ export class GroupMessagesPage implements OnInit, OnChanges {
|
|||||||
@Output() openGroupContacts:EventEmitter<any> = new EventEmitter<any>();
|
@Output() openGroupContacts:EventEmitter<any> = new EventEmitter<any>();
|
||||||
@Output() openEditGroupPage:EventEmitter<any> = new EventEmitter<any>();
|
@Output() openEditGroupPage:EventEmitter<any> = new EventEmitter<any>();
|
||||||
|
|
||||||
|
@ViewChild('scrollMe') private myScrollContainer: ElementRef;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private menu: MenuController,
|
private menu: MenuController,
|
||||||
private modalController: ModalController,
|
private modalController: ModalController,
|
||||||
@@ -49,6 +51,7 @@ export class GroupMessagesPage implements OnInit, OnChanges {
|
|||||||
}
|
}
|
||||||
ngOnChanges(changes: SimpleChanges): void {
|
ngOnChanges(changes: SimpleChanges): void {
|
||||||
this.getRoomInfo();
|
this.getRoomInfo();
|
||||||
|
this.scrollToBottom();
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
@@ -57,8 +60,16 @@ export class GroupMessagesPage implements OnInit, OnChanges {
|
|||||||
console.log(this.roomId);
|
console.log(this.roomId);
|
||||||
}
|
}
|
||||||
|
|
||||||
notImplemented(){
|
ngAfterViewChecked() {
|
||||||
this.alertService.presentAlert('Funcionalidade em desenvolvimento');
|
this.scrollToBottom();
|
||||||
|
}
|
||||||
|
|
||||||
|
scrollToBottom(): void {
|
||||||
|
try {
|
||||||
|
this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight;
|
||||||
|
} catch(err) { }
|
||||||
|
finally {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
openGroupContactsPage(){
|
openGroupContactsPage(){
|
||||||
@@ -73,6 +84,7 @@ export class GroupMessagesPage implements OnInit, OnChanges {
|
|||||||
this.getRoomInfo();
|
this.getRoomInfo();
|
||||||
ev.target.complete();
|
ev.target.complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
get watch(){
|
get watch(){
|
||||||
this.getRoomInfo();
|
this.getRoomInfo();
|
||||||
console.log('here watching');
|
console.log('here watching');
|
||||||
|
|||||||
@@ -48,7 +48,6 @@
|
|||||||
|
|
||||||
|
|
||||||
<ion-footer>
|
<ion-footer>
|
||||||
FOOter
|
|
||||||
<div class="container width-100 d-flex">
|
<div class="container width-100 d-flex">
|
||||||
<div>
|
<div>
|
||||||
<button class="btn-no-color" (click)="openSendMessageOptions()">
|
<button class="btn-no-color" (click)="openSendMessageOptions()">
|
||||||
@@ -58,7 +57,7 @@
|
|||||||
<div class="width-80">
|
<div class="width-80">
|
||||||
<ion-item class="ion-no-padding type-message" lines="none">
|
<ion-item class="ion-no-padding type-message" lines="none">
|
||||||
<ion-textarea clearOnEdit="true" placeholder="Escrever uma mensagem" auto-grow class="message-input" rows="1" [(ngModel)]="message"></ion-textarea>
|
<ion-textarea clearOnEdit="true" placeholder="Escrever uma mensagem" auto-grow class="message-input" rows="1" [(ngModel)]="message"></ion-textarea>
|
||||||
<button class="btn-no-color" (click)="notImplemented()">
|
<button hidden class="btn-no-color" (click)="notImplemented()">
|
||||||
<ion-icon slot="end" src="assets/icon/icons-chat-mic.svg"></ion-icon>
|
<ion-icon slot="end" src="assets/icon/icons-chat-mic.svg"></ion-icon>
|
||||||
</button>
|
</button>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
|
|||||||
@@ -45,15 +45,14 @@ export class MessagesPage implements OnInit, AfterViewChecked, OnChanges {
|
|||||||
/* this.dm = this.navParams.get('dm'); */
|
/* this.dm = this.navParams.get('dm'); */
|
||||||
}
|
}
|
||||||
ngOnChanges(changes: SimpleChanges): void {
|
ngOnChanges(changes: SimpleChanges): void {
|
||||||
console.log(this.roomId);
|
//this.load();
|
||||||
this.load();
|
|
||||||
|
|
||||||
//throw new Error('Method not implemented.');
|
//throw new Error('Method not implemented.');
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
|
|
||||||
//this.scrollToBottom();
|
this.scrollToBottom();
|
||||||
|
|
||||||
/* setInterval(()=>{ */
|
/* setInterval(()=>{ */
|
||||||
this.load();
|
this.load();
|
||||||
@@ -80,20 +79,17 @@ export class MessagesPage implements OnInit, AfterViewChecked, OnChanges {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngAfterViewChecked() {
|
ngAfterViewChecked() {
|
||||||
//this.scrollToBottom();
|
this.scrollToBottom();
|
||||||
console.log(this.roomId);
|
|
||||||
}
|
}
|
||||||
/* scrollToBottom(): void {
|
|
||||||
const loader = this.toastService.loading()
|
|
||||||
|
|
||||||
|
scrollToBottom(): void {
|
||||||
try {
|
try {
|
||||||
this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight;
|
this.myScrollContainer.nativeElement.scrollTop = this.myScrollContainer.nativeElement.scrollHeight;
|
||||||
} catch(err) { }
|
} catch(err) { }
|
||||||
finally {
|
finally {
|
||||||
loader.remove()
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} */
|
|
||||||
loadMoreMessages(ev:any){
|
loadMoreMessages(ev:any){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
export const environment = {
|
export const environment = {
|
||||||
production: false,
|
production: false,
|
||||||
apiURL: 'https://equilibrium.dyndns.info/GabineteDigital.Services/V4/api/',
|
/* apiURL: 'https://equilibrium.dyndns.info/GabineteDigital.Services/V4/api/', */
|
||||||
/* apiURL: 'http://gpr-dev-01.gabinetedigital.local/GabineteDigital.Services/V4/api/', */
|
apiURL: 'http://gpr-dev-01.gabinetedigital.local/GabineteDigital.Services/V4/api/',
|
||||||
apiChatUrl: 'https://www.tabularium.pt/api/v1/',
|
apiChatUrl: 'https://www.tabularium.pt/api/v1/',
|
||||||
/* apiChatUrl: 'http://chat.gabinetedigital.local:3000/api/v1/', */
|
/* apiChatUrl: 'http://chat.gabinetedigital.local:3000/api/v1/', */
|
||||||
domain: 'gabinetedigital.local', //gabinetedigital.local
|
domain: 'gabinetedigital.local', //gabinetedigital.local
|
||||||
|
|||||||
Reference in New Issue
Block a user