@chat21/chat21-ionic 3.0.75-rc.2 → 3.0.76-rc.1

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.
Files changed (46) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/deploy_amazon_beta.sh +1 -1
  3. package/package.json +1 -1
  4. package/src/app/app.component.ts +2 -2
  5. package/src/app/chatlib/conversation-detail/conversation-content/conversation-content.component.ts +7 -7
  6. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.html +8 -8
  7. package/src/app/chatlib/conversation-detail/ion-conversation-detail/ion-conversation-detail.component.ts +5 -6
  8. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.html +4 -4
  9. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.scss +0 -10
  10. package/src/app/chatlib/conversation-detail/message/bubble-message/bubble-message.component.ts +4 -9
  11. package/src/app/chatlib/conversation-detail/message/frame/frame.component.ts +8 -3
  12. package/src/app/chatlib/conversation-detail/message/image/image.component.ts +2 -2
  13. package/src/app/chatlib/conversation-detail/message/message-attachment/message-attachment.component.ts +6 -1
  14. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.html +0 -2
  15. package/src/app/components/conversation-detail/message-text-area/message-text-area.component.ts +1 -1
  16. package/src/app/components/project-item/project-item.component.ts +3 -2
  17. package/src/app/pages/conversation-detail/conversation-detail.page.html +22 -6
  18. package/src/app/pages/conversation-detail/conversation-detail.page.scss +10 -0
  19. package/src/app/pages/conversation-detail/conversation-detail.page.ts +126 -67
  20. package/src/app/pages/conversations-list/conversations-list.page.ts +28 -2
  21. package/src/app/pages/loader-preview/loader-preview.page.ts +8 -27
  22. package/src/app/services/canned-responses/canned-responses.service.ts +43 -7
  23. package/src/app/services/websocket/websocket.service.ts +9 -8
  24. package/src/app/utils/scrollbar-theme.directive.ts +2 -1
  25. package/src/assets/i18n/ar.json +2 -0
  26. package/src/assets/i18n/az.json +2 -0
  27. package/src/assets/i18n/de.json +2 -0
  28. package/src/assets/i18n/en.json +2 -0
  29. package/src/assets/i18n/es.json +2 -0
  30. package/src/assets/i18n/fr.json +2 -0
  31. package/src/assets/i18n/it.json +2 -0
  32. package/src/assets/i18n/kk.json +2 -0
  33. package/src/assets/i18n/pt.json +2 -0
  34. package/src/assets/i18n/ru.json +2 -0
  35. package/src/assets/i18n/sr.json +2 -0
  36. package/src/assets/i18n/sv.json +2 -0
  37. package/src/assets/i18n/tr.json +2 -0
  38. package/src/assets/i18n/uk.json +2 -0
  39. package/src/assets/i18n/uz.json +2 -0
  40. package/src/chat-config-mqtt-localhost.json +2 -1
  41. package/src/chat21-core/providers/firebase/firebase-conversation-handler.ts +14 -4
  42. package/src/chat21-core/providers/firebase/firebase-conversations-handler.ts +1 -1
  43. package/src/chat21-core/providers/mqtt/mqtt-conversation-handler.ts +22 -0
  44. package/src/chat21-core/utils/constants.ts +3 -1
  45. package/src/chat21-core/utils/utils.ts +14 -0
  46. package/src/global.scss +27 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # chat21-ionic ver 3.0
2
2
 
3
+ ### 3.0.76-rc.1
4
+ - changed: senderFullName in list conversation for guest users with guest#uuid[0..5]
5
+ - added: multi-language to MEMBER_LEFT_GROUP and LEAD_UPDATED info messages
6
+ - added: onElementRendered event to image/frame/mesagge-attachment to scroll content after element is rendered
7
+ - added: enabled possibility to edit or delete a canned response created by yourself
8
+ - added: disable footer component of an archived conversation if it's been more than 10 days
9
+ - removed: scrollBar from conversation-detail page
10
+
11
+ ## 3.0.75 in PROD
12
+
3
13
  ### 3.0.75-rc.2
4
14
  - bug-fixed: unserved request count not updated correctly after a request is assigned
5
15
 
@@ -12,7 +12,7 @@ sed -i -e "s/$URL_VER/g" src/utils/constants.ts
12
12
 
13
13
  ionic cordova platform add browser --save
14
14
  #ionic cordova build browser --prod --release
15
- ionic cordova build --env=pre browser #--prod --verbose
15
+ ionic cordova build --env=pre browser #--prod --verbose
16
16
 
17
17
  cp -p src/firebase-messaging-sw.js platforms/browser/www/
18
18
  cp -p src/manifest.json platforms/browser/www/
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@chat21/chat21-ionic",
3
3
  "author": "Tiledesk SRL",
4
- "version": "3.0.75-rc.2",
4
+ "version": "3.0.76-rc.1",
5
5
  "license": "MIT License",
6
6
  "homepage": "https://tiledesk.com/",
7
7
  "repository": {
@@ -798,7 +798,7 @@ export class AppComponent implements OnInit {
798
798
  pageUrl += IDConv + '/' + FullNameConv + '/' + Convtype
799
799
  }
800
800
  // replace(/\(/g, '%28').replace(/\)/g, '%29') -> used for the encoder of any round brackets
801
- this.router.navigateByUrl(pageUrl.replace(/\(/g, '%28').replace(/\)/g, '%29'));
801
+ this.router.navigateByUrl(pageUrl.replace(/\(/g, '%28').replace(/\)/g, '%29').replace( /#/g, "%23" ));
802
802
 
803
803
 
804
804
  // const DASHBOARD_URL = this.appConfigProvider.getConfig().DASHBOARD_URL;
@@ -1150,7 +1150,7 @@ export class AppComponent implements OnInit {
1150
1150
 
1151
1151
  subscribeUnservedRequestCount = (unservedRequestCount) => {
1152
1152
  if(unservedRequestCount && unservedRequestCount > 0){
1153
- console.log("hasToSoundUnservedRequestCount::::", this.hasToSoundUnservedRequestCount, this.isInitialized)
1153
+ this.logger.debug("hasToSoundUnservedRequestCount::::", this.hasToSoundUnservedRequestCount, this.isInitialized)
1154
1154
  if(this.hasToSoundUnservedRequestCount){
1155
1155
  this.manageTabNotification(unservedRequestCount) //sound and alternate title
1156
1156
  } else {
@@ -263,29 +263,29 @@ export class ConversationContentComponent implements OnInit {
263
263
 
264
264
  // ========= begin:: event emitter function ============//
265
265
 
266
- returnOnAttachmentButtonClicked(event: any) {
266
+ onAttachmentButtonClickedFN(event: any) {
267
267
  this.onAttachmentButtonClicked.emit(event)
268
268
  }
269
269
 
270
- returnOnBeforeMessageRender(event) {
270
+ onBeforeMessageRenderFN(event) {
271
271
  //decommentare se in html c'è solamente component tiledesk-text
272
272
  //const messageOBJ = { message: this.message, sanitizer: this.sanitizer, messageEl: event.messageEl, component: event.component}
273
273
  this.onBeforeMessageRender.emit(event)
274
274
  }
275
275
 
276
- returnOnAfterMessageRender(event) {
276
+ onAfterMessageRenderFN(event) {
277
277
  this.onAfterMessageRender.emit(event)
278
278
  }
279
279
 
280
- onImageRenderedFN(event) {
281
- const imageRendered = event;
282
- if (imageRendered && this.scrollMe) {
280
+ onElementRenderedFN(event) {
281
+ const elementRendered = event;
282
+ if (elementRendered.status && this.scrollMe) {
283
283
  const divScrollMe = this.scrollMe.nativeElement;
284
284
  const checkContentScrollPosition = this.checkContentScrollPosition(divScrollMe);
285
285
  this.scrollToBottom() // SCROLLO SEMPRE
286
286
  // if (!checkContentScrollPosition) { // SE NON SONO ALLA FINE, SCROLLO CONTENT
287
287
  // }
288
-
288
+
289
289
  }
290
290
  }
291
291
 
@@ -87,9 +87,9 @@
87
87
  [addAsCannedResponseTooltipText]="addAsCannedResponseTooltipText"
88
88
  [areVisibleCAR]="areVisibleCAR"
89
89
  [supportMode]="supportMode"
90
- (onBeforeMessageRender)="returnOnBeforeMessageRender($event)"
91
- (onAfterMessageRender)="returnOnAfterMessageRender($event)"
92
- (onImageRendered)="onImageRenderedFN($event)">
90
+ (onBeforeMessageRender)="onBeforeMessageRenderFN($event)"
91
+ (onAfterMessageRender)="onAfterMessageRenderFN($event)"
92
+ (onElementRendered)="onElementRenderedFN($event)">
93
93
  </chat-bubble-message>
94
94
 
95
95
  <!-- icon status message -->
@@ -126,10 +126,9 @@
126
126
  [addAsCannedResponseTooltipText]="addAsCannedResponseTooltipText"
127
127
  [areVisibleCAR]="areVisibleCAR"
128
128
  [supportMode]="supportMode"
129
- (onBeforeMessageRender)="returnOnBeforeMessageRender($event)"
130
- (onAfterMessageRender)="returnOnAfterMessageRender($event)"
131
- (onImageRendered)="onImageRenderedFN($event)"
132
- >
129
+ (onBeforeMessageRender)="onBeforeMessageRenderFN($event)"
130
+ (onAfterMessageRender)="onAfterMessageRenderFN($event)"
131
+ (onElementRendered)="onElementRenderedFN($event)">
133
132
  </chat-bubble-message>
134
133
  </div>
135
134
 
@@ -139,7 +138,8 @@
139
138
  [message]="message"
140
139
  [isLastMessage]="isLastMessage(message?.uid)"
141
140
  [stylesMap]="stylesMap"
142
- (onAttachmentButtonClicked)="returnOnAttachmentButtonClicked($event)">
141
+ (onElementRendered)="onElementRenderedFN($event)"
142
+ (onAttachmentButtonClicked)="onAttachmentButtonClickedFN($event)">
143
143
  </chat-message-attachment>
144
144
  </div>
145
145
  </div>
@@ -24,7 +24,7 @@ export class IonConversationDetailComponent extends ConversationContentComponent
24
24
  @Input() channelType: string;
25
25
  @Input() areVisibleCAR: boolean;
26
26
  @Input() supportMode: boolean;
27
- @Output() onImageRendered = new EventEmitter<boolean>()
27
+ @Output() onElementRendered = new EventEmitter<{element: string, status: boolean}>();
28
28
  @Output() onAddUploadingBubble = new EventEmitter<boolean>();
29
29
 
30
30
  public public_Key: any
@@ -94,8 +94,7 @@ export class IonConversationDetailComponent extends ConversationContentComponent
94
94
  // this.translate.getTranslation(chat_lang).subscribe((labels: string) => {
95
95
  // console.log('[CONVS-DETAIL] translations: ', labels);
96
96
  // });
97
- this.translate.get('AddAsCannedResponse')
98
- .subscribe((text: string) => {
97
+ this.translate.get('AddAsCannedResponse').subscribe((text: string) => {
99
98
  // console.log('[CONVS-DETAIL] AddAsCannedResponse translated: ', text);
100
99
  this.addAsCannedResponseTooltipText = text
101
100
  })
@@ -132,9 +131,9 @@ export class IonConversationDetailComponent extends ConversationContentComponent
132
131
  this.onAddUploadingBubble.emit(value);
133
132
  }
134
133
 
135
- onImageRenderedFN(event) {
136
- this.logger.log('[CONVS-DETAIL][ION-CONVS-DETAIL] - onImageRenderedFN:::ionic', event)
137
- this.onImageRendered.emit(event)
134
+ onElementRenderedFN(event) {
135
+ this.logger.log('[CONVS-DETAIL][ION-CONVS-DETAIL] - onElementRenderedFN:::ionic', event)
136
+ this.onElementRendered.emit(event)
138
137
  }
139
138
 
140
139
  /**
@@ -3,7 +3,7 @@
3
3
  <!-- isImage >{{isImage(message) }} message.metadata.width {{message?.metadata?.width }} -->
4
4
  <div id="bubble-message"
5
5
  [ngStyle]="{'padding': (isImage(message) || isFrame(message))?'0px':'0 8px', 'width': (isImage(message) || isFrame(message))? sizeImage?.width + 'px' : null }"
6
- class="messages primary-color" [class.emoticon]="message?.emoticon">
6
+ class="messages primary-color">
7
7
 
8
8
 
9
9
  <div>
@@ -22,7 +22,7 @@
22
22
  [metadata]="message.metadata"
23
23
  [width]="sizeImage?.width"
24
24
  [height]="sizeImage?.height"
25
- (onImageRendered)="onImageRenderedFN($event)">
25
+ (onElementRendered)="onElementRenderedFN($event)">
26
26
  </chat-image>
27
27
 
28
28
  <!-- [width]="getMetadataSize(message.metadata).width" -->
@@ -30,7 +30,8 @@
30
30
  <chat-frame *ngIf="isFrame(message)"
31
31
  [metadata]="message.metadata"
32
32
  [width]="message.metadata.width"
33
- [height]="message.metadata.height">
33
+ [height]="message.metadata.height"
34
+ (onElementRendered)="onElementRenderedFN($event)">
34
35
  </chat-frame>
35
36
 
36
37
  <!-- <chat-frame *ngIf="message.metadata && message.metadata.type && message.metadata.type.includes('video')"
@@ -51,7 +52,6 @@
51
52
  [text]="message?.text"
52
53
  [color]="textColor"
53
54
  [message]="message"
54
- [class.chat-text-emoticon]="message?.emoticon"
55
55
  (onBeforeMessageRender)="returnOnBeforeMessageRender($event)"
56
56
  (onAfterMessageRender)="returnOnAfterMessageRender($event)">
57
57
  </chat-text>
@@ -46,13 +46,6 @@
46
46
  }
47
47
  }
48
48
 
49
- // &:hover .message-date{
50
- // display: flex;
51
- // }
52
-
53
- // .message-date {
54
- // display: none;
55
- // }
56
49
  }
57
50
  // > .button-native
58
51
  .btn-add-msg-as-canned-response {
@@ -64,8 +57,5 @@
64
57
  box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.6);
65
58
  }
66
59
 
67
- // .emoticon {
68
- // padding: 35px 0px !important;
69
- // }
70
60
 
71
61
 
@@ -23,7 +23,7 @@ export class BubbleMessageComponent implements OnInit, OnChanges {
23
23
  @Input() supportMode: boolean;
24
24
  @Output() onBeforeMessageRender = new EventEmitter();
25
25
  @Output() onAfterMessageRender = new EventEmitter();
26
- @Output() onImageRendered = new EventEmitter<boolean>()
26
+ @Output() onElementRendered = new EventEmitter<{element: string, status: boolean}>();
27
27
  isImage = isImage;
28
28
  isFile = isFile;
29
29
  isFrame = isFrame;
@@ -53,7 +53,7 @@ export class BubbleMessageComponent implements OnInit, OnChanges {
53
53
  }
54
54
 
55
55
  ngOnInit() {
56
- this.setMomentLocale()
56
+ // this.setMomentLocale()
57
57
  }
58
58
 
59
59
 
@@ -140,14 +140,9 @@ export class BubbleMessageComponent implements OnInit, OnChanges {
140
140
  sizeImage.width = MAX_WIDTH_IMAGES;
141
141
  sizeImage.height = MAX_WIDTH_IMAGES / ratio;
142
142
  }
143
- // metadata.width = sizeImage.width
144
- // metadata.height = sizeImage.height
145
143
  return sizeImage
146
144
  }
147
145
 
148
-
149
-
150
-
151
146
  /**
152
147
  * function customize tooltip
153
148
  */
@@ -195,8 +190,8 @@ export class BubbleMessageComponent implements OnInit, OnChanges {
195
190
  this.onAfterMessageRender.emit(messageOBJ)
196
191
  }
197
192
 
198
- onImageRenderedFN(event) {
199
- this.onImageRendered.emit(event)
193
+ onElementRenderedFN(event){
194
+ this.onElementRendered.emit({element: event.element, status: event.status})
200
195
  }
201
196
 
202
197
  async presentCreateCannedResponseModal(): Promise<any> {
@@ -1,5 +1,5 @@
1
1
  import { DomSanitizer } from '@angular/platform-browser';
2
- import { Component, Input, OnInit } from '@angular/core';
2
+ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
3
3
 
4
4
  @Component({
5
5
  selector: 'chat-frame',
@@ -11,8 +11,10 @@ export class FrameComponent implements OnInit {
11
11
  @Input() metadata: any;
12
12
  @Input() width: string;
13
13
  @Input() height: string;
14
+ @Output() onElementRendered = new EventEmitter<{element: string, status: boolean}>();
14
15
 
15
16
  url: any;
17
+ loading: boolean = true
16
18
  constructor(private sanitizer: DomSanitizer) { }
17
19
 
18
20
  ngOnInit() {
@@ -23,11 +25,14 @@ export class FrameComponent implements OnInit {
23
25
  // this.height = this.getSizeImg(this.metadata).height;
24
26
  }
25
27
 
26
-
27
-
28
28
  ngOnDestroy(){
29
29
  this.url = null;
30
30
  }
31
31
 
32
+ onLoaded(event){
33
+ this.loading = false
34
+ this.onElementRendered.emit({element: "image", status:true})
35
+ }
36
+
32
37
 
33
38
  }
@@ -10,7 +10,7 @@ export class ImageComponent implements OnInit {
10
10
  @Input() metadata: any;
11
11
  @Input() width: string;
12
12
  @Input() height: number;
13
- @Output() onImageRendered = new EventEmitter<boolean>();
13
+ @Output() onElementRendered = new EventEmitter<{element: string, status: boolean}>();
14
14
 
15
15
  loading: boolean = true
16
16
  tooltipMessage: string;
@@ -44,7 +44,7 @@ export class ImageComponent implements OnInit {
44
44
 
45
45
  onLoaded(event) {
46
46
  this.loading = false
47
- this.onImageRendered.emit(true)
47
+ this.onElementRendered.emit({element: "image", status:true})
48
48
  }
49
49
 
50
50
  _downloadImage(url: string, fileName: string) {
@@ -11,10 +11,11 @@ import { MessageModel } from 'src/chat21-core/models/message';
11
11
  export class MessageAttachmentComponent implements OnInit {
12
12
 
13
13
  // ========= begin:: Input/Output values ============//
14
- @Output() onAttachmentButtonClicked = new EventEmitter<any>();
15
14
  @Input() message: MessageModel;
16
15
  @Input() isLastMessage: boolean;
17
16
  @Input() stylesMap: Map<string, string>;
17
+ @Output() onAttachmentButtonClicked = new EventEmitter<any>();
18
+ @Output() onElementRendered = new EventEmitter<{element: string, status: boolean}>()
18
19
  // ========= end:: Input/Output values ============//
19
20
 
20
21
  public type: string;
@@ -45,6 +46,10 @@ export class MessageAttachmentComponent implements OnInit {
45
46
  }
46
47
  }
47
48
 
49
+ ngAfterViewInit(){
50
+ this.onElementRendered.emit({element: 'attachment', status: true})
51
+ }
52
+
48
53
  returnOnAttachmentButtonClicked(event: any){
49
54
  if ( event && event.target ) {
50
55
  const ev = {target: event.target, message: this.message, currentTarget: this }
@@ -68,9 +68,7 @@
68
68
  style="font-size: 30px;transform: rotate(42deg);"></ion-icon>
69
69
  <input #fileInput type="file" (change)="onFileSelected($event)" capture="camera" id="file-input"
70
70
  [accept]="fileUploadAccept">
71
-
72
71
  </ion-button>
73
-
74
72
  </div>
75
73
 
76
74
  <!-- <ion-icon (click)="showEmojiPicker = !showEmojiPicker" color="secondary" name="happy" style="zoom:2;"></ion-icon> -->
@@ -52,11 +52,11 @@ export class MessageTextAreaComponent implements OnInit, AfterViewInit, OnChange
52
52
  @Input() isOpenInfoConversation: boolean;
53
53
  @Input() translationMap: Map<string, string>;
54
54
  @Input() dropEvent: any;
55
+ @Input() disableTextarea: boolean;
55
56
  @Output() eventChangeTextArea = new EventEmitter<object>();
56
57
  @Output() hasClickedOpenCannedResponses = new EventEmitter<boolean>();
57
58
  @Output() eventSendMessage = new EventEmitter<object>();
58
59
  @Output() onPresentModalScrollToBottom = new EventEmitter<boolean>();
59
- @Input() disableTextarea: boolean;
60
60
 
61
61
  public conversationEnabled = false;
62
62
  public messageString: string;
@@ -311,10 +311,11 @@ export class ProjectItemComponent implements OnInit {
311
311
  }
312
312
  });
313
313
  //not sound if unservedRequest is already chached and web-sk is closed and restart again
314
- if(this.unservedRequestCount !== count){
315
- this.unservedRequestCount = count;
314
+ if(count > this.unservedRequestCount ){
316
315
  this.events.publish('unservedRequest:count', this.unservedRequestCount)
317
316
  }
317
+ this.unservedRequestCount = count;
318
+
318
319
  }
319
320
  }, error => {
320
321
  this.logger.error('[PROJECT-ITEM] UNSERVED REQUEST COUNT * error * ', error)
@@ -118,6 +118,7 @@
118
118
  </ion-grid>
119
119
 
120
120
 
121
+
121
122
  <ion-conversation-detail *ngIf="isHovering === false" #conversationContentDetail
122
123
  [channelType]="channelType"
123
124
  [messages]="messages"
@@ -126,12 +127,12 @@
126
127
  [areVisibleCAR]="areVisibleCAR"
127
128
  [supportMode]= "supportMode"
128
129
  [stylesMap]="styleMap"
129
- (onBeforeMessageRender)="returnOnBeforeMessageRender($event)"
130
- (onAfterMessageRender)="returnOnAfterMessageRender($event)"
131
- (onAttachmentButtonClicked)="returnOnAttachmentButtonClicked($event)"
130
+ (onBeforeMessageRender)="onBeforeMessageRenderFN($event)"
131
+ (onAfterMessageRender)="onAfterMessageRenderFN($event)"
132
+ (onAttachmentButtonClicked)="onAttachmentButtonClickedFN($event)"
132
133
  (onScrollContent)="returnOnScrollContent($event)"
133
134
  (onMenuOptionShow)="returnOnMenuOption($event)"
134
- (onImageRendered)="onImageRenderedFN($event)"
135
+ (onElementRendered)="onElementRenderedFN($event)"
135
136
  (onAddUploadingBubble)="addUploadingBubbleEvent($event)">
136
137
  </ion-conversation-detail>
137
138
 
@@ -149,12 +150,27 @@
149
150
  <!-- ----------------------------------------------------------- -->
150
151
  <!-- Canned responses -->
151
152
  <!-- ----------------------------------------------------------- -->
153
+ <!-- <app-canned-response *ngIf="!HIDE_CANNED_RESPONSES"
154
+ [conversationWith]="conversationWith"
155
+ [conversationWithFullname]="conversationWithFullname"
156
+ [currentString]="messageStr"
157
+ [translationMap]="translationMap">
158
+ </app-canned-response> -->
159
+
160
+
152
161
  <div id="canned">
153
162
  <ion-list class="canned-list" *ngIf="tagsCannedFilter.length > 0 && HIDE_CANNED_RESPONSES === false">
154
163
  <ion-item button="true" [ngClass]="{'is_active_item': i == arrowkeyLocation}" lines="none"
155
- class="canned-item" id="{{'canned-item_'+ i }}"
156
- *ngFor="let canned of tagsCannedFilter; let i = index;" [innerHtml]="canned.title"
164
+ class="canned-item no-ripple" id="{{'canned-item_'+ i }}"
165
+ *ngFor="let canned of tagsCannedFilter; let i = index;"
157
166
  (click)="replaceTagInMessage(canned, $event)">
167
+ <div class="cannedContent">
168
+ <ion-input [(ngModel)]="canned.title" class="title" id="{{'titleCanned_'+canned._id}}" [disabled]="canned.disabled"></ion-input>
169
+ <ion-input [(ngModel)]="canned.text" class="text" [disabled]="canned.disabled"></ion-input>
170
+ </div>
171
+ <ion-icon class="canned-item-icon" name="checkmark-sharp" slot=end *ngIf="canned.createdBy === loggedUser.uid && !canned.disabled" (click)="onConfirmEditCanned(canned, $event)"></ion-icon>
172
+ <ion-icon class="canned-item-icon" name="pencil-sharp" slot=end *ngIf="canned.createdBy === loggedUser.uid && canned.disabled" (click)="onEditCanned(canned, $event)"></ion-icon>
173
+ <ion-icon class="canned-item-icon" name="trash-bin-outline" slot=end *ngIf="canned.createdBy === loggedUser.uid" (click)="onDeleteCanned(canned, $event)"></ion-icon>
158
174
  </ion-item>
159
175
  <ion-item class="canned-item add-canned-response-wpr" button="true" lines="none" (click)="presentCreateCannedResponseModal()">
160
176
  <ion-icon class="add-canned-response-icon" name="flash-outline"></ion-icon>
@@ -383,6 +383,16 @@ ion-content {
383
383
  }
384
384
  }
385
385
  }
386
+
387
+ #canned{
388
+ ion-input {
389
+ --padding-bottom:0px;
390
+ &.text{
391
+ font-style: italic;
392
+ }
393
+
394
+ }
395
+ }
386
396
  }
387
397
 
388
398
  .chat-area-apps-sidebar-wide {