@chat21/chat21-ionic 3.0.78-rc.3 → 3.0.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -16
- package/package.json +1 -1
- package/src/app/app.component.scss +1 -1
- package/src/app/app.component.ts +2 -7
- package/src/app/chatlib/conversation-detail/conversation-content/conversation-content.component.ts +1 -8
- package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.html +2 -31
- package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.scss +2 -69
- package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.ts +2 -15
- package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.html +1 -1
- package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.ts +1 -3
- package/src/app/chatlib/conversation-detail/message/info-message/info-message.component.scss +2 -2
- package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.html +34 -62
- package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.scss +18 -58
- package/src/app/chatlib/list-conversations-component/ion-list-conversations/ion-list-conversations.component.ts +10 -14
- package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.html +37 -52
- package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.scss +29 -57
- package/src/app/components/conversation-detail/header-conversation-detail/header-conversation-detail.component.ts +24 -8
- package/src/app/components/ddp-header/ddp-header.component.html +1 -1
- package/src/app/components/ddp-header/ddp-header.component.scss +0 -4
- package/src/app/components/project-item/project-item.component.html +149 -98
- package/src/app/components/project-item/project-item.component.scss +32 -39
- package/src/app/components/project-item/project-item.component.ts +4 -5
- package/src/app/pages/conversation-detail/conversation-detail.page.html +10 -14
- package/src/app/pages/conversation-detail/conversation-detail.page.scss +2 -0
- package/src/app/pages/conversation-detail/conversation-detail.page.ts +43 -156
- package/src/app/pages/conversations-list/conversations-list.page.html +2 -2
- package/src/app/pages/conversations-list/conversations-list.page.scss +2 -2
- package/src/app/pages/conversations-list/conversations-list.page.ts +0 -7
- package/src/assets/i18n/ar.json +265 -268
- package/src/assets/i18n/az.json +0 -3
- package/src/assets/i18n/de.json +0 -3
- package/src/assets/i18n/en.json +0 -3
- package/src/assets/i18n/es.json +0 -3
- package/src/assets/i18n/fr.json +0 -3
- package/src/assets/i18n/it.json +0 -3
- package/src/assets/i18n/kk.json +0 -3
- package/src/assets/i18n/pt.json +0 -3
- package/src/assets/i18n/ru.json +0 -3
- package/src/assets/i18n/sr.json +0 -3
- package/src/assets/i18n/sv.json +0 -3
- package/src/assets/i18n/tr.json +0 -3
- package/src/assets/i18n/uk.json +0 -3
- package/src/assets/i18n/uz.json +0 -3
- package/src/chat21-core/providers/firebase/firebase-typing.service.ts +9 -7
- package/src/chat21-core/utils/constants.ts +0 -4
- package/src/chat21-core/utils/user-typing/user-typing.component.html +5 -8
- package/src/chat21-core/utils/user-typing/user-typing.component.scss +17 -87
- package/src/chat21-core/utils/user-typing/user-typing.component.ts +94 -12
- package/src/chat21-core/utils/utils.ts +1 -5
- package/src/variables.scss +1 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,23 +1,9 @@
|
|
|
1
1
|
# chat21-ionic ver 3.0
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
-
|
|
5
|
-
- changed: replace includes with startsWith for check what type of conversation is in project info conversation-list component
|
|
6
|
-
- added: styleMap integrations to some elements
|
|
7
|
-
- bug-fixed: no tooltip showed if no unserved request are present
|
|
8
|
-
|
|
9
|
-
### 3.0.78-rc.2
|
|
10
|
-
- changed: project item UI and tooltip msg
|
|
11
|
-
- changed: conversation UI in conversations list component
|
|
12
|
-
- changed: conversation detail header component
|
|
13
|
-
- added: open/close info-conversation moved from conversation-header to conversation detail component
|
|
3
|
+
## 3.0.78 in PROD
|
|
4
|
+
- bug-fixed: unassigned request not sound the if is the first at all
|
|
14
5
|
- bug-fixed: canned responses opens in incorrect mode
|
|
15
6
|
|
|
16
|
-
### 3.0.78-rc.1
|
|
17
|
-
- changed: conversation-list page width increased
|
|
18
|
-
- changed: background changed in info-message component
|
|
19
|
-
- changed: project-item UI
|
|
20
|
-
- changed: conversation-list page UI
|
|
21
7
|
|
|
22
8
|
## 3.0.77 in PROD
|
|
23
9
|
|
package/package.json
CHANGED
package/src/app/app.component.ts
CHANGED
|
@@ -102,7 +102,6 @@ export class AppComponent implements OnInit {
|
|
|
102
102
|
public missingConnectionToast: any
|
|
103
103
|
public executedInitializeAppByWatchConnection: boolean = false;
|
|
104
104
|
private isInitialized: boolean = false;
|
|
105
|
-
private hasToSoundUnservedRequestCount: boolean = false;
|
|
106
105
|
private version: string;
|
|
107
106
|
IS_ONLINE: boolean;
|
|
108
107
|
IS_ON_MOBILE_DEVICE: boolean;
|
|
@@ -1125,7 +1124,6 @@ export class AppComponent implements OnInit {
|
|
|
1125
1124
|
if (hasClickedLogout === true) {
|
|
1126
1125
|
this.appStorageService.removeItem('conversations')
|
|
1127
1126
|
this.isInitialized = false;
|
|
1128
|
-
this.hasToSoundUnservedRequestCount = false;
|
|
1129
1127
|
// ----------------------------------------------
|
|
1130
1128
|
// PUSH NOTIFICATIONS
|
|
1131
1129
|
// ----------------------------------------------
|
|
@@ -1150,12 +1148,9 @@ export class AppComponent implements OnInit {
|
|
|
1150
1148
|
|
|
1151
1149
|
subscribeUnservedRequestCount = (unservedRequestCount) => {
|
|
1152
1150
|
if(unservedRequestCount && unservedRequestCount > 0){
|
|
1153
|
-
this.logger.debug("hasToSoundUnservedRequestCount::::", this.
|
|
1154
|
-
if(this.
|
|
1151
|
+
this.logger.debug("hasToSoundUnservedRequestCount::::", this.isInitialized)
|
|
1152
|
+
if(this.isInitialized){
|
|
1155
1153
|
this.manageTabNotification(unservedRequestCount) //sound and alternate title
|
|
1156
|
-
} else {
|
|
1157
|
-
//not sound the first time
|
|
1158
|
-
this.hasToSoundUnservedRequestCount = true
|
|
1159
1154
|
}
|
|
1160
1155
|
}
|
|
1161
1156
|
}
|
package/src/app/chatlib/conversation-detail/conversation-content/conversation-content.component.ts
CHANGED
|
@@ -17,18 +17,11 @@ export class ConversationContentComponent implements OnInit {
|
|
|
17
17
|
@Input() messages: MessageModel[]
|
|
18
18
|
@Input() senderId: string;
|
|
19
19
|
@Input() baseLocation: string;
|
|
20
|
-
@Input() isConversationArchived: boolean;
|
|
21
|
-
@Input() isTypings: boolean;
|
|
22
|
-
@Input() idUserTypingNow: string;
|
|
23
|
-
@Input() nameUserTypingNow: string;
|
|
24
|
-
@Input() typingLocation: string;
|
|
25
|
-
@Input() fullscreenMode: boolean;
|
|
26
20
|
@Input() translationMap: Map<string, string>;
|
|
27
21
|
@Input() stylesMap: Map<string, string>;
|
|
28
22
|
@Output() onBeforeMessageRender = new EventEmitter();
|
|
29
23
|
@Output() onAfterMessageRender = new EventEmitter();
|
|
30
|
-
@Output() onMenuOptionShow = new EventEmitter
|
|
31
|
-
@Output() onEmojiiPickerShow = new EventEmitter<boolean>()
|
|
24
|
+
@Output() onMenuOptionShow = new EventEmitter();
|
|
32
25
|
@Output() onAttachmentButtonClicked = new EventEmitter();
|
|
33
26
|
@Output() onScrollContent = new EventEmitter();
|
|
34
27
|
|
|
@@ -52,19 +52,8 @@
|
|
|
52
52
|
<!-- ----------------------------------------------------------- -->
|
|
53
53
|
<!-- nk - no tag ionic -->
|
|
54
54
|
<!-- ----------------------------------------------------------- -->
|
|
55
|
-
<div class="manage_conversation_info_container" [ngClass]="{'close': !openInfoConversation, 'mobile': isMobile}">
|
|
56
|
-
<ion-button fill="clear" *ngIf="openInfoConversation" (click)="onOpenCloseInfoConversationFN()">
|
|
57
|
-
<ion-icon name="arrow-forward-outline"></ion-icon>
|
|
58
|
-
{{translationMap.get('LABEL_CLOSE_GROUP')}}
|
|
59
|
-
</ion-button>
|
|
60
|
-
<ion-button fill="clear" *ngIf="!openInfoConversation" (click)="onOpenCloseInfoConversationFN()">
|
|
61
|
-
<ion-icon name="arrow-back-outline"></ion-icon>
|
|
62
|
-
{{translationMap.get('LABEL_OPEN_INFO_CONVERSATION')}}
|
|
63
|
-
</ion-button>
|
|
64
|
-
</div>
|
|
65
55
|
|
|
66
56
|
<div class="conversation-wpr" style="height: 100%;">
|
|
67
|
-
|
|
68
57
|
<div *ngFor="let message of messages; let i = index; let first = first; trackBy: trackByFn">
|
|
69
58
|
|
|
70
59
|
<ng-container *ngIf="first || (messages[i - 1].timestamp | date:'d') !== (message.timestamp | date:'d')">
|
|
@@ -92,12 +81,9 @@
|
|
|
92
81
|
<chat-bubble-message class="messages msg_sent" id="message_msg_sent" style="position: relative;"
|
|
93
82
|
[ngClass]="{'has-metadata': (isImage(message) || isFrame(message)), 'privateMsg': (message?.attributes && message?.attributes?.subtype === 'private')}"
|
|
94
83
|
[class.emoticon]="isEmojii(message?.text)"
|
|
95
|
-
[ngStyle]="{'background': stylesMap.get('bubbleSentBackground'), 'color': stylesMap.get('bubbleSentTextColor')}"
|
|
96
84
|
[ngClass]="{'button-in-msg' : message.metadata && message.metadata.button}"
|
|
97
85
|
[message]="message"
|
|
98
|
-
[
|
|
99
|
-
[fontSize]="stylesMap.get('fontSize')"
|
|
100
|
-
[fontFamily]="stylesMap.get('fontFamily')"
|
|
86
|
+
[textColor]="'col-msg-sent'"
|
|
101
87
|
[addAsCannedResponseTooltipText]="addAsCannedResponseTooltipText"
|
|
102
88
|
[areVisibleCAR]="areVisibleCAR"
|
|
103
89
|
[supportMode]="supportMode"
|
|
@@ -135,11 +121,8 @@
|
|
|
135
121
|
<chat-bubble-message class="messages msg_receive" id="message_msg_receive" style="position: relative;"
|
|
136
122
|
[ngClass]="{'has-metadata': (isImage(message) || isFrame(message)), 'privateMsg': (message?.attributes && message?.attributes?.subtype === 'private')}"
|
|
137
123
|
[class.emoticon]="isEmojii(message?.text)"
|
|
138
|
-
[ngStyle]="{'background': stylesMap?.get('bubbleReceivedBackground'), 'color': stylesMap.get('bubbleReceivedTextColor')}"
|
|
139
124
|
[message]="message"
|
|
140
|
-
[
|
|
141
|
-
[fontSize]="stylesMap?.get('fontSize')"
|
|
142
|
-
[fontFamily]="stylesMap?.get('fontFamily')"
|
|
125
|
+
[textColor]="'black'"
|
|
143
126
|
[addAsCannedResponseTooltipText]="addAsCannedResponseTooltipText"
|
|
144
127
|
[areVisibleCAR]="areVisibleCAR"
|
|
145
128
|
[supportMode]="supportMode"
|
|
@@ -173,18 +156,6 @@
|
|
|
173
156
|
</div>
|
|
174
157
|
</div>
|
|
175
158
|
|
|
176
|
-
<div *ngIf="isTypings" class="msg_container base_receive typing_container">
|
|
177
|
-
<!-- !isSameSender(idUserTypingNow, i) -->
|
|
178
|
-
<!-- <div *ngIf="nameUserTypingNow">{{nameUserTypingNow}}</div> -->
|
|
179
|
-
<user-typing
|
|
180
|
-
[themeColor]="stylesMap?.get('themeColor')"
|
|
181
|
-
[translationMap]="translationMap"
|
|
182
|
-
[idUserTypingNow]="idUserTypingNow"
|
|
183
|
-
[nameUserTypingNow]="nameUserTypingNow">
|
|
184
|
-
</user-typing>
|
|
185
|
-
<div class="typing_info" *ngIf="nameUserTypingNow"> {{nameUserTypingNow}} {{translationMap.get('LABEL_IS_WRITING')}}</div>
|
|
186
|
-
</div>
|
|
187
|
-
|
|
188
159
|
</div>
|
|
189
160
|
|
|
190
161
|
<!-- fileType > {{fileType }} uploadProgress {{uploadProgress}} -->
|
|
@@ -33,51 +33,6 @@
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
.manage_conversation_info_container{
|
|
37
|
-
height: 34px;
|
|
38
|
-
display: flex;
|
|
39
|
-
-webkit-box-align: center;
|
|
40
|
-
align-items: center;
|
|
41
|
-
position: fixed;
|
|
42
|
-
transition: transform 300ms ease-in-out 0s;
|
|
43
|
-
transform: translate(0px);
|
|
44
|
-
right: 300px;
|
|
45
|
-
top: 60px;
|
|
46
|
-
z-index:10;
|
|
47
|
-
background: linear-gradient(to right, rgba(226, 232, 239, 0) 128px, rgb(226, 232, 239) 128px);
|
|
48
|
-
|
|
49
|
-
&.close{
|
|
50
|
-
right: 0px;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
&.mobile{
|
|
54
|
-
right: 0px;
|
|
55
|
-
}
|
|
56
|
-
&::before{
|
|
57
|
-
content: "";
|
|
58
|
-
width: 102px;
|
|
59
|
-
height: 34px;
|
|
60
|
-
background-image: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjM0IiB2aWV3Qm94PSIwIDAgMTAyIDM0IiB3aWR0aD0iMTAyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogICAgPHBhdGggZD0ibTEwMiAwaC0xMDJsLjA3MTQwOC40MTk3NTNjMTEuMzE5MTkyLS4wMTU1NTggMjIuMjg4MTkyIDMuOTIwMzM3IDMxLjAxMjA5MiAxMS4xMjc2NDdsNy40ODk0IDYuNTAyIDEuNjUwOCAxLjQyMjkgNi42OTU1IDUuNzhjNi41Mzc0IDUuNjQwNSAxNC44ODU3IDguNzQ1MSAyMy41MjI3IDguNzQ3N2gzMS41NTQxeiIKICAgICAgICAgIGZpbGw9IiNlMmU4ZWYiLz4KPC9zdmc+);
|
|
61
|
-
position: relative;
|
|
62
|
-
left: 50px;
|
|
63
|
-
z-index: -1;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
ion-button {
|
|
67
|
-
text-transform: unset;
|
|
68
|
-
&:hover {
|
|
69
|
-
--background-hover: transparent;
|
|
70
|
-
text-decoration: underline;
|
|
71
|
-
text-decoration-color: var(--ion-color-primary);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
ion-icon{
|
|
76
|
-
margin: 5px;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
|
|
81
36
|
ion-item {
|
|
82
37
|
--padding-end: 0px;
|
|
83
38
|
--inner-padding-end: 0px;
|
|
@@ -111,27 +66,6 @@ ion-item {
|
|
|
111
66
|
color: #080f1a;
|
|
112
67
|
}
|
|
113
68
|
|
|
114
|
-
.typing_container{
|
|
115
|
-
display:flex;
|
|
116
|
-
align-items: center;
|
|
117
|
-
|
|
118
|
-
user-typing {
|
|
119
|
-
text-align: right;
|
|
120
|
-
}
|
|
121
|
-
.typing_info{
|
|
122
|
-
color: var(--basic-gray);
|
|
123
|
-
margin-left: 10px;
|
|
124
|
-
font-size: 12px;
|
|
125
|
-
animation: blinker 1s linear infinite;
|
|
126
|
-
|
|
127
|
-
@keyframes blinker {
|
|
128
|
-
50% {
|
|
129
|
-
opacity: 0;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
69
|
.messages {
|
|
136
70
|
border-radius: 18px;
|
|
137
71
|
padding: 0;
|
|
@@ -208,8 +142,8 @@ ion-item {
|
|
|
208
142
|
}
|
|
209
143
|
/* message */
|
|
210
144
|
.msg_receive {
|
|
211
|
-
background-color: var(--
|
|
212
|
-
color:
|
|
145
|
+
background-color: var(--light-white);
|
|
146
|
+
color: #1a1a1a;
|
|
213
147
|
// max-width: 260px;
|
|
214
148
|
max-width: calc(100% - 70px);
|
|
215
149
|
min-width: 14px;
|
|
@@ -233,7 +167,6 @@ ion-item {
|
|
|
233
167
|
.has-metadata {
|
|
234
168
|
max-width: 100% !important;
|
|
235
169
|
}
|
|
236
|
-
|
|
237
170
|
}
|
|
238
171
|
|
|
239
172
|
.time {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ConversationContentComponent } from '../conversation-content/conversation-content.component';
|
|
2
|
-
import { ChangeDetectorRef, Component, Input, OnInit, Output, EventEmitter
|
|
2
|
+
import { ChangeDetectorRef, Component, Input, OnInit, Output, EventEmitter } from '@angular/core';
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
import { MESSAGE_TYPE_INFO, MESSAGE_TYPE_MINE, MESSAGE_TYPE_OTHERS } from 'src/chat21-core/utils/constants';
|
|
@@ -24,17 +24,14 @@ export class IonConversationDetailComponent extends ConversationContentComponent
|
|
|
24
24
|
@Input() channelType: string;
|
|
25
25
|
@Input() areVisibleCAR: boolean;
|
|
26
26
|
@Input() supportMode: boolean;
|
|
27
|
-
@Input() isMobile: boolean;
|
|
28
27
|
@Output() onElementRendered = new EventEmitter<{element: string, status: boolean}>();
|
|
29
28
|
@Output() onAddUploadingBubble = new EventEmitter<boolean>();
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
|
|
32
30
|
public public_Key: any
|
|
33
31
|
public uploadProgress: number = 100
|
|
34
32
|
public fileType: any
|
|
35
33
|
public browserLang: string;
|
|
36
34
|
public addAsCannedResponseTooltipText: string;
|
|
37
|
-
public openInfoConversation: boolean = true;
|
|
38
35
|
isImage = isImage;
|
|
39
36
|
isFile = isFile;
|
|
40
37
|
isFrame = isFrame;
|
|
@@ -69,11 +66,6 @@ export class IonConversationDetailComponent extends ConversationContentComponent
|
|
|
69
66
|
ngOnInit() {
|
|
70
67
|
this.listenToUploadFileProgress();
|
|
71
68
|
this.setMomentLocaleAndGetTranslation();
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
ngOnChanges(changes: SimpleChanges){
|
|
76
|
-
this.isMobile? this.openInfoConversation = false: null;
|
|
77
69
|
}
|
|
78
70
|
|
|
79
71
|
|
|
@@ -144,11 +136,6 @@ export class IonConversationDetailComponent extends ConversationContentComponent
|
|
|
144
136
|
this.onElementRendered.emit(event)
|
|
145
137
|
}
|
|
146
138
|
|
|
147
|
-
onOpenCloseInfoConversationFN(){
|
|
148
|
-
this.openInfoConversation = !this.openInfoConversation
|
|
149
|
-
this.onOpenCloseInfoConversation.emit(this.openInfoConversation)
|
|
150
|
-
}
|
|
151
|
-
|
|
152
139
|
/**
|
|
153
140
|
* Track by function for ngFor loops
|
|
154
141
|
*
|
package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.html
CHANGED
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
|
|
51
51
|
<chat-text *ngIf="message?.type !=='html'"
|
|
52
52
|
[text]="message?.text"
|
|
53
|
-
[color]="
|
|
53
|
+
[color]="textColor"
|
|
54
54
|
[message]="message"
|
|
55
55
|
(onBeforeMessageRender)="returnOnBeforeMessageRender($event)"
|
|
56
56
|
(onAfterMessageRender)="returnOnAfterMessageRender($event)">
|
package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.ts
CHANGED
|
@@ -18,9 +18,7 @@ import { ModalController } from '@ionic/angular';
|
|
|
18
18
|
export class BubbleMessageComponent implements OnInit, OnChanges {
|
|
19
19
|
|
|
20
20
|
@Input() message: MessageModel;
|
|
21
|
-
@Input()
|
|
22
|
-
@Input() fontSize: string;
|
|
23
|
-
@Input() fontFamily: string;
|
|
21
|
+
@Input() textColor: string;
|
|
24
22
|
@Input() areVisibleCAR: boolean;
|
|
25
23
|
@Input() supportMode: boolean;
|
|
26
24
|
@Output() onBeforeMessageRender = new EventEmitter();
|
package/src/app/chatlib/conversation-detail/message/info-message/info-message.component.scss
CHANGED
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
|
|
7
7
|
.base_info {
|
|
8
8
|
border-radius: 14px;
|
|
9
|
-
|
|
9
|
+
border: 1px solid #C9E4F6;
|
|
10
10
|
padding-left: 4px;
|
|
11
11
|
padding-right: 4px;
|
|
12
12
|
padding: 6px 10px;
|
|
13
13
|
display: inline-block;
|
|
14
|
-
background:
|
|
14
|
+
background: #C9E4F6;
|
|
15
15
|
font-size: 0.70em;
|
|
16
16
|
color: var(--basic-gray);
|
|
17
17
|
margin-left: 5px; //32px;
|
|
@@ -80,70 +80,42 @@
|
|
|
80
80
|
<div tabindex="0"></div>
|
|
81
81
|
|
|
82
82
|
<!-- <div [class.selected]="conversation.uid === uidConvSelected"></div> -->
|
|
83
|
-
<
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
</div>
|
|
102
|
-
<!-- GROUP CONV -->
|
|
103
|
-
<div *ngIf="conversation.uid.startsWith(TYPE_GROUP)">
|
|
104
|
-
<svg xmlns="http://www.w3.org/2000/svg" height="15" width="15" viewBox="0 0 24 24" fill="#000000"><path d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"/></svg>
|
|
105
|
-
<span class="truncate">{{translationsMap.get('GROUP_CHAT')}}</span>
|
|
106
|
-
</div>
|
|
107
|
-
<!-- SUPPORT-GROUP CONV -->
|
|
108
|
-
<div *ngIf="conversation.uid.startsWith(TYPE_SUPPORT_GROUP)">
|
|
109
|
-
<svg xmlns="http://www.w3.org/2000/svg" data-v-78d18411="" width="15" height="15" fill="none" viewBox="0 0 24 24" class="inbox-icon"><path d="M22.002 12C22.002 6.477 17.524 2 12 2 6.476 1.999 2 6.477 2 12.001c0 5.186 3.947 9.45 9.001 9.952V20.11c-.778-.612-1.478-1.905-1.939-3.61h1.94V15H8.737a18.969 18.969 0 0 1-.135-5h6.794c.068.64.105 1.31.105 2h1.5c0-.684-.033-1.353-.095-2h3.358c.154.64.237 1.31.237 2h1.5ZM4.786 16.5h2.722l.102.396c.317 1.17.748 2.195 1.27 3.015a8.532 8.532 0 0 1-4.094-3.41ZM3.736 10h3.358a20.847 20.847 0 0 0-.095 2c0 1.043.075 2.051.217 3H4.043a8.483 8.483 0 0 1-.544-3c0-.682.08-1.347.232-1.983L3.736 10Zm5.122-5.902.023-.008C8.16 5.222 7.611 6.748 7.298 8.5H4.25c.905-2 2.56-3.587 4.608-4.402Zm3.026-.594L12 3.5l.126.006c1.262.126 2.48 2.125 3.045 4.995H8.83c.568-2.878 1.79-4.88 3.055-4.996Zm3.343.76-.107-.174.291.121a8.533 8.533 0 0 1 4.339 4.29h-3.048c-.298-1.665-.806-3.125-1.475-4.237Z M12 19a1 1 0 0 0 1 1h3v2h-.5a.5.5 0 1 0 0 1h4a.5.5 0 0 0 0-1H19v-2h3a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1h-9a1 1 0 0 0-1 1v5Z" fill="currentColor"/></svg>
|
|
110
|
-
<span *ngIf="conversation?.attributes?.project_name" class="truncate">{{conversation?.attributes?.project_name}}</span>
|
|
111
|
-
<span *ngIf="!conversation?.attributes?.project_name" class="truncate">{{conversation?.attributes?.projectId}}</span>
|
|
112
|
-
</div>
|
|
113
|
-
</div>
|
|
114
|
-
<div style="display: flex;">
|
|
115
|
-
<span class="conversation_with truncate" [class.not-read]="conversation.is_new">
|
|
116
|
-
{{conversation.conversation_with_fullname}}
|
|
117
|
-
</span>
|
|
118
|
-
</div>
|
|
119
|
-
<div class="conversation_message truncate-conv-msg" [ngClass]="{'truncate-on-desktop': !isApp}">
|
|
120
|
-
|
|
121
|
-
<!-- -------------------------------------------------------------------------- -->
|
|
122
|
-
<!-- if conversation type is image display the image icon before the message -->
|
|
123
|
-
<!-- -------------------------------------------------------------------------- -->
|
|
124
|
-
<!-- <div *ngIf="conversation.type === 'image'" class="icon-image-before-msg-wpr">
|
|
125
|
-
<ion-icon name="image-outline" class="icon-image-before-msg"></ion-icon>
|
|
126
|
-
</div>
|
|
127
|
-
<p [class.not-read]="conversation.is_new" class="truncate" [ngClass]="{'truncate-on-desktop': !isApp}"
|
|
128
|
-
[innerHTML]="conversation.last_message_text"></p> -->
|
|
129
|
-
|
|
130
|
-
<!-- <div *ngIf="conversation.type === 'image'" class="icon-image-before-msg-wpr"> -->
|
|
131
|
-
<ion-icon *ngIf="conversation.type === 'image' && conversation.type !== 'file' " name="image-outline"
|
|
132
|
-
class="icon-image-before-msg"></ion-icon>
|
|
133
|
-
<ion-icon *ngIf="conversation.type === 'file' && conversation.type !== 'image'" name="attach-outline"
|
|
134
|
-
class="icon-attach-before-msg"></ion-icon>
|
|
135
|
-
<!-- </div> -->
|
|
136
|
-
<!-- [innerHTML]="conversation.last_message_text" -->
|
|
137
|
-
<span [class.not-read]="conversation.is_new">
|
|
138
|
-
{{ conversation.last_message_text }}
|
|
139
|
-
</span>
|
|
83
|
+
<ion-avatar item-start>
|
|
84
|
+
<!-- [style.background-color]="conversation.color" -->
|
|
85
|
+
<div #avatarPlaceholder class="avatar-placeholder"
|
|
86
|
+
[ngStyle]="{'background': 'linear-gradient(rgb(255,255,255) -125%,' + conversation.color + ')'}"
|
|
87
|
+
[innerHTML]="conversation.avatar"></div>
|
|
88
|
+
<div *ngIf="conversation.image" #avatarImage class="avatar-profile"
|
|
89
|
+
[style.background-image]="'url(' + conversation.image + ')'"></div>
|
|
90
|
+
<!-- <div *ngIf="getImageAvatar(conversation.sender)" #avatarImage class="avatar-profile" [style.background-image]="'url(' + getImageAvatar(conversation.sender) + ')'"></div> -->
|
|
91
|
+
</ion-avatar>
|
|
92
|
+
<ion-label>
|
|
93
|
+
<div class="conversation_with truncate">{{conversation.conversation_with_fullname}}</div>
|
|
94
|
+
<div class="conversation_message truncate-conv-msg" [ngClass]="{'truncate-on-desktop': !isApp}">
|
|
95
|
+
|
|
96
|
+
<!-- -------------------------------------------------------------------------- -->
|
|
97
|
+
<!-- if conversation type is image display the image icon before the message -->
|
|
98
|
+
<!-- -------------------------------------------------------------------------- -->
|
|
99
|
+
<!-- <div *ngIf="conversation.type === 'image'" class="icon-image-before-msg-wpr">
|
|
100
|
+
<ion-icon name="image-outline" class="icon-image-before-msg"></ion-icon>
|
|
140
101
|
</div>
|
|
141
|
-
|
|
142
|
-
|
|
102
|
+
<p [class.not-read]="conversation.is_new" class="truncate" [ngClass]="{'truncate-on-desktop': !isApp}"
|
|
103
|
+
[innerHTML]="conversation.last_message_text"></p> -->
|
|
104
|
+
|
|
105
|
+
<!-- <div *ngIf="conversation.type === 'image'" class="icon-image-before-msg-wpr"> -->
|
|
106
|
+
<ion-icon *ngIf="conversation.type === 'image' && conversation.type !== 'file' " name="image-outline"
|
|
107
|
+
class="icon-image-before-msg"></ion-icon>
|
|
108
|
+
<ion-icon *ngIf="conversation.type === 'file' && conversation.type !== 'image'" name="attach-outline"
|
|
109
|
+
class="icon-attach-before-msg"></ion-icon>
|
|
110
|
+
<!-- </div> -->
|
|
111
|
+
<!-- [innerHTML]="conversation.last_message_text" -->
|
|
112
|
+
<span [class.not-read]="conversation.is_new">
|
|
113
|
+
{{ conversation.last_message_text }}
|
|
114
|
+
</span>
|
|
115
|
+
</div>
|
|
116
|
+
</ion-label>
|
|
143
117
|
|
|
144
|
-
<ion-note *ngIf="!conversation.archived" class="conversation_time"
|
|
145
|
-
{{conversation.timestamp | amTimeAgo}}
|
|
146
|
-
</ion-note>
|
|
118
|
+
<ion-note *ngIf="!conversation.archived" class="conversation_time">{{conversation.timestamp | amTimeAgo}}</ion-note>
|
|
147
119
|
|
|
148
120
|
<ion-buttons slot="end">
|
|
149
121
|
<ion-button *ngIf="!conversation.archived" [tooltip]="archiveTooltip" [options]="tooltip_options" placement="bottom" content-type="template"
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
}
|
|
10
10
|
ion-item {
|
|
11
11
|
cursor: pointer;
|
|
12
|
-
height:
|
|
13
|
-
--min-height:
|
|
12
|
+
height: 70px;
|
|
13
|
+
--min-height: 70px;
|
|
14
14
|
position: relative;
|
|
15
15
|
display: flex;
|
|
16
16
|
text-decoration: none;
|
|
@@ -19,13 +19,6 @@ ion-item {
|
|
|
19
19
|
--padding-start: 0;
|
|
20
20
|
--inner-padding-end: 0;
|
|
21
21
|
--background-hover: #000000 !important;
|
|
22
|
-
border-radius: 16px;
|
|
23
|
-
margin: 4px 5px;
|
|
24
|
-
.conv-container{
|
|
25
|
-
width: 84%;
|
|
26
|
-
height: 100%;
|
|
27
|
-
padding: 12px 0;
|
|
28
|
-
}
|
|
29
22
|
.selected {
|
|
30
23
|
// border-radius: 10px;
|
|
31
24
|
// padding-left: 8px;
|
|
@@ -40,13 +33,12 @@ ion-item {
|
|
|
40
33
|
ion-avatar {
|
|
41
34
|
position: relative;
|
|
42
35
|
padding: 0;
|
|
43
|
-
margin:
|
|
44
|
-
height:
|
|
45
|
-
width:
|
|
46
|
-
min-width:
|
|
47
|
-
min-height:
|
|
48
|
-
line-height:
|
|
49
|
-
align-self: end;
|
|
36
|
+
margin: 0 12px 0 8px;
|
|
37
|
+
height: 50px;
|
|
38
|
+
width: 50px;
|
|
39
|
+
min-width: 50px;
|
|
40
|
+
min-height: 50px;
|
|
41
|
+
line-height: 50px;
|
|
50
42
|
.avatar-placeholder {
|
|
51
43
|
position: absolute;
|
|
52
44
|
top: 0;
|
|
@@ -55,7 +47,7 @@ ion-item {
|
|
|
55
47
|
height: 100%;
|
|
56
48
|
border-radius: 50%;
|
|
57
49
|
text-align: center;
|
|
58
|
-
font-size:
|
|
50
|
+
font-size: 20px;
|
|
59
51
|
color: #ffffff;
|
|
60
52
|
font-weight: 500;
|
|
61
53
|
}
|
|
@@ -78,46 +70,22 @@ ion-item {
|
|
|
78
70
|
justify-content: center;
|
|
79
71
|
min-width: 0;
|
|
80
72
|
padding: 0;
|
|
81
|
-
margin: 0;
|
|
82
73
|
font-family: Helvetica, Helvetica, Arial, sans-serif;
|
|
83
74
|
line-height: 1.28;
|
|
84
75
|
text-rendering: optimizeLegibility;
|
|
85
|
-
.conversation_project{
|
|
86
|
-
display: inline-flex;
|
|
87
|
-
align-items: center;
|
|
88
|
-
line-height: 1.2rem;
|
|
89
|
-
font-weight: 500;
|
|
90
|
-
color: #779bbb;
|
|
91
|
-
font-size: 10px;
|
|
92
|
-
max-width: 90%;
|
|
93
|
-
svg {
|
|
94
|
-
fill:#779bbb;
|
|
95
|
-
vertical-align: sub;
|
|
96
|
-
}
|
|
97
|
-
span{
|
|
98
|
-
padding-left: 5px
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
76
|
.conversation_with {
|
|
102
77
|
color: rgba(0, 0, 0, 1);
|
|
103
78
|
font-size: 15px;
|
|
104
79
|
font-weight: 400;
|
|
105
80
|
line-height: 1.4;
|
|
106
|
-
width: 70% !important;
|
|
107
|
-
&.not-read {
|
|
108
|
-
font-weight: 600;
|
|
109
|
-
color: #3c4858; //#1876f2;
|
|
110
|
-
}
|
|
111
81
|
}
|
|
112
|
-
|
|
113
82
|
.conversation_message {
|
|
114
83
|
p {
|
|
115
|
-
color:
|
|
116
|
-
font-size:
|
|
84
|
+
color: rgba(153, 153, 153, 1);
|
|
85
|
+
font-size: 13px;
|
|
117
86
|
font-weight: 400;
|
|
118
87
|
height: 18px;
|
|
119
88
|
vertical-align: middle;
|
|
120
|
-
align-self: center;
|
|
121
89
|
&.not-read {
|
|
122
90
|
font-weight: 600;
|
|
123
91
|
color: #1876f2;
|
|
@@ -125,13 +93,13 @@ ion-item {
|
|
|
125
93
|
}
|
|
126
94
|
|
|
127
95
|
span {
|
|
128
|
-
color:
|
|
129
|
-
font-size:
|
|
96
|
+
color: rgba(153, 153, 153, 1);
|
|
97
|
+
font-size: 13px;
|
|
130
98
|
font-weight: 400;
|
|
131
99
|
height: 18px;
|
|
132
100
|
&.not-read {
|
|
133
101
|
font-weight: 600;
|
|
134
|
-
color: #
|
|
102
|
+
color: #1876f2;
|
|
135
103
|
}
|
|
136
104
|
}
|
|
137
105
|
}
|
|
@@ -139,15 +107,8 @@ ion-item {
|
|
|
139
107
|
ion-note {
|
|
140
108
|
position: absolute;
|
|
141
109
|
right: 8px;
|
|
142
|
-
top:
|
|
110
|
+
top: 4px;
|
|
143
111
|
font-size: 10px;
|
|
144
|
-
display: flex;
|
|
145
|
-
flex-direction: column;
|
|
146
|
-
color: #6e6f73;
|
|
147
|
-
|
|
148
|
-
&.is-on-mobile{
|
|
149
|
-
top: 10px;
|
|
150
|
-
}
|
|
151
112
|
}
|
|
152
113
|
ion-buttons {
|
|
153
114
|
margin: 0;
|
|
@@ -179,10 +140,10 @@ ion-item {
|
|
|
179
140
|
}
|
|
180
141
|
|
|
181
142
|
.notification_point-on-desktop {
|
|
182
|
-
bottom:
|
|
143
|
+
bottom: 29px !important;
|
|
183
144
|
}
|
|
184
145
|
.notification_point-on-mobile {
|
|
185
|
-
bottom:
|
|
146
|
+
bottom: 29px !important;
|
|
186
147
|
right: 8px;
|
|
187
148
|
}
|
|
188
149
|
}
|
|
@@ -248,8 +209,7 @@ ion-item:hover {
|
|
|
248
209
|
}
|
|
249
210
|
|
|
250
211
|
.ion-selected {
|
|
251
|
-
--background:
|
|
252
|
-
border-right: 4px solid #1876f2;
|
|
212
|
+
--background: rgb(231, 241, 255);
|
|
253
213
|
}
|
|
254
214
|
|
|
255
215
|
.time-in-archived {
|