@chat21/chat21-web-widget 5.1.26 → 5.1.27-rc1
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/.github/workflows/docker-community-push-latest.yml +23 -13
- package/.github/workflows/docker-image-tag-community-tag-push.yml +22 -12
- package/CHANGELOG.md +88 -13
- package/Dockerfile +4 -5
- package/angular.json +2 -1
- package/deploy_amazon_beta.sh +17 -7
- package/docs/changelog/this-branch.md +36 -0
- package/package.json +1 -1
- package/src/app/app.component.html +9 -2
- package/src/app/app.component.scss +59 -0
- package/src/app/app.component.ts +128 -33
- package/src/app/component/conversation-detail/conversation/conversation.component.html +13 -2
- package/src/app/component/conversation-detail/conversation/conversation.component.scss +30 -2
- package/src/app/component/conversation-detail/conversation/conversation.component.ts +190 -5
- package/src/app/component/conversation-detail/conversation-audio-recorder/conversation-audio-recorder.component.ts +16 -3
- package/src/app/component/conversation-detail/conversation-content/conversation-content.component.html +12 -9
- package/src/app/component/conversation-detail/conversation-content/conversation-content.component.scss +15 -1
- package/src/app/component/conversation-detail/conversation-content/conversation-content.component.ts +1 -1
- package/src/app/component/conversation-detail/conversation-footer/conversation-footer.component.html +103 -80
- package/src/app/component/conversation-detail/conversation-footer/conversation-footer.component.scss +40 -13
- package/src/app/component/conversation-detail/conversation-footer/conversation-footer.component.ts +40 -1
- package/src/app/component/conversation-detail/conversation-header/conversation-header.component.html +4 -4
- package/src/app/component/conversation-detail/conversation-header/conversation-header.component.ts +1 -0
- package/src/app/component/eyeeye-catcher-card/eyeeye-catcher-card.component.ts +0 -18
- package/src/app/component/home/home.component.html +3 -3
- package/src/app/component/launcher-button/launcher-button.component.html +1 -1
- package/src/app/component/launcher-button/launcher-button.component.ts +3 -2
- package/src/app/providers/global-settings.service.ts +38 -0
- package/src/app/providers/translator.service.ts +2 -0
- package/src/app/sass/_variables.scss +1 -0
- package/src/app/utils/globals.ts +8 -2
- package/src/assets/i18n/en.json +2 -0
- package/src/assets/i18n/es.json +2 -0
- package/src/assets/i18n/fr.json +2 -0
- package/src/assets/i18n/it.json +2 -0
- package/src/chat21-core/providers/tiledesk/tiledesk-requests.service.ts +1 -1
- package/src/chat21-core/utils/utils.ts +5 -2
- package/src/iframe-style.css +5 -5
- package/deploy_amazon_prod.sh +0 -41
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
name: Docker Image Community latest CI
|
|
2
2
|
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
5
|
branches: [ master ]
|
|
6
|
-
pull_request:
|
|
7
|
-
branches: [ master ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ master ]
|
|
8
8
|
|
|
9
9
|
jobs:
|
|
10
10
|
push_to_registry:
|
|
@@ -12,12 +12,22 @@ jobs:
|
|
|
12
12
|
runs-on: ubuntu-latest
|
|
13
13
|
|
|
14
14
|
steps:
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
15
|
+
- name: Check out the repo
|
|
16
|
+
uses: actions/checkout@v2
|
|
17
|
+
|
|
18
|
+
- name: Set up Docker Buildx
|
|
19
|
+
uses: docker/setup-buildx-action@v2
|
|
20
|
+
|
|
21
|
+
- name: Log in to Docker Hub
|
|
22
|
+
uses: docker/login-action@v2
|
|
23
|
+
with:
|
|
24
|
+
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
25
|
+
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
26
|
+
|
|
27
|
+
- name: Build and push multiarch Docker image
|
|
28
|
+
uses: docker/build-push-action@v3
|
|
29
|
+
with:
|
|
30
|
+
context: .
|
|
31
|
+
push: true
|
|
32
|
+
platforms: linux/amd64,linux/arm64
|
|
33
|
+
tags: chat21/chat21-web-widget:latest
|
|
@@ -3,20 +3,30 @@ name: Publish Docker Community image tags
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
5
|
tags:
|
|
6
|
-
- '**'
|
|
7
|
-
jobs:
|
|
6
|
+
- '**' # Trigger su qualsiasi tag
|
|
8
7
|
|
|
8
|
+
jobs:
|
|
9
9
|
push_to_registry:
|
|
10
10
|
name: Push Docker image to Docker Hub
|
|
11
11
|
runs-on: ubuntu-latest
|
|
12
|
+
|
|
12
13
|
steps:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
14
|
+
- name: Check out the repo
|
|
15
|
+
uses: actions/checkout@v2
|
|
16
|
+
|
|
17
|
+
- name: Set up Docker Buildx
|
|
18
|
+
uses: docker/setup-buildx-action@v2
|
|
19
|
+
|
|
20
|
+
- name: Log in to Docker Hub
|
|
21
|
+
uses: docker/login-action@v2
|
|
22
|
+
with:
|
|
23
|
+
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
24
|
+
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
25
|
+
|
|
26
|
+
- name: Build and push multiarch Docker image
|
|
27
|
+
uses: docker/build-push-action@v3
|
|
28
|
+
with:
|
|
29
|
+
context: .
|
|
30
|
+
push: true
|
|
31
|
+
platforms: linux/amd64,linux/arm64
|
|
32
|
+
tags: chat21/chat21-web-widget:${{ github.ref_name }}
|
package/CHANGELOG.md
CHANGED
|
@@ -6,29 +6,54 @@
|
|
|
6
6
|
### **Copyrigth**:
|
|
7
7
|
*Tiledesk SRL*
|
|
8
8
|
|
|
9
|
-
# 5.1.
|
|
10
|
-
- **
|
|
9
|
+
# 5.1.27-rc1
|
|
10
|
+
- **added**: closeChatInConversation parameters
|
|
11
|
+
- **added**: close chat button under textarea footer component
|
|
11
12
|
|
|
12
|
-
# 5.1.
|
|
13
|
+
# 5.1.26-rc6
|
|
14
|
+
- **changed**: mobile always opens fullscreen and ignores legacy stored size”.
|
|
15
|
+
- **changed**: changed user-typing
|
|
16
|
+
|
|
17
|
+
# 5.1.26-rc5
|
|
18
|
+
- **changed**: Hide the resize-widget button when on mobile
|
|
19
|
+
- **added**: added "I'm thinking" when the bot responds
|
|
20
|
+
|
|
21
|
+
# 5.1.26-rc4
|
|
22
|
+
- **changed**: decoupled callout from signin
|
|
23
|
+
|
|
24
|
+
# 5.1.26-rc3
|
|
25
|
+
- **changed**: start with authentication if a proactive message has been set, so if a rule has been set on at one chatbot in the project
|
|
26
|
+
|
|
27
|
+
# 5.1.26-rc2
|
|
28
|
+
- **changed**: start with authentication if hasCalloutInWidgetConfig is true
|
|
29
|
+
|
|
30
|
+
# 5.1.26-rc1
|
|
31
|
+
- **bug fixed**: improved audio recording/upload flow by ignoring empty recorder chunks, preserving the recorder MIME type when creating the audio blob/file, and uploading audio directly without Base64 conversion
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# 5.1.25-rc1
|
|
13
35
|
- **bug fixed**: attachment buttons in messages now respect the container max width and wrap/break long labels instead of being clipped
|
|
14
36
|
|
|
15
|
-
# 5.1.24
|
|
37
|
+
# 5.1.24-rc2
|
|
38
|
+
- **bug fixed**: minor fix in marked pipe to avoid rendering html tags
|
|
39
|
+
|
|
40
|
+
# 5.1.24-rc1
|
|
16
41
|
- **security**: hardened Markdown link rendering by blocking dangerous protocols (e.g. `javascript:`, `data:`, `vbscript:`) and preventing unsafe links from being rendered as anchors
|
|
17
42
|
- **changed**: refactored `MarkedPipe` to simplify Markdown parsing, improve link rendering via a custom `marked` renderer, and streamline newline handling (`\\n` → `\n`)
|
|
18
43
|
|
|
19
|
-
# 5.1.
|
|
20
|
-
- **changed**: API for upload a file/iamges
|
|
21
|
-
|
|
22
|
-
# 5.1.22
|
|
23
|
-
- **changed**: Updated Launch.js for Wix and Shopify by bypassing scrdoc
|
|
24
|
-
|
|
25
|
-
# 5.1.21
|
|
44
|
+
# 5.1.20-rc3
|
|
26
45
|
- **bug fixed**: saved the widget's size state to local storage (in HP conversations)
|
|
27
46
|
|
|
28
|
-
# 5.1.20
|
|
47
|
+
# 5.1.20-rc2
|
|
48
|
+
- **changed**: API for upload a file/iamges
|
|
29
49
|
- **changed**: marked pipe do not render /n
|
|
30
50
|
|
|
51
|
+
# 5.1.20-rc1
|
|
52
|
+
- **changed**: API for upload a file/iamges
|
|
53
|
+
|
|
31
54
|
# 5.1.19
|
|
55
|
+
|
|
56
|
+
# 5.1.19-rc1
|
|
32
57
|
- **bug fixed**: show bottom scroll button and unread message badge only when I'm not at the bottom of the page
|
|
33
58
|
- **changed**: allow HTML code to be inserted into messages, but do not parse the code. Ensure coexistence with Markdown.
|
|
34
59
|
- **bug fixed**: after sending a multi-line message, the text area remains open on multiple lines.
|
|
@@ -38,6 +63,7 @@
|
|
|
38
63
|
- **changed**: saved the widget's size state to local storage. The parameter flow is (default → storage → settings → URL)
|
|
39
64
|
|
|
40
65
|
# 5.1.18
|
|
66
|
+
# 5.1.15-rc3
|
|
41
67
|
- **added**: Implemented Shadow DOM in the text component to isolate HTML and Markdown rendering in a safe and protected context
|
|
42
68
|
- **changed**: Adapted text component styles to support Shadow DOM (removed ::ng-deep, added styles for common markdown elements)
|
|
43
69
|
- **security**: HTML/Markdown content is now rendered in an isolated Shadow DOM, improving security and preventing interference with the rest of the application
|
|
@@ -48,6 +74,12 @@
|
|
|
48
74
|
# 5.1.16
|
|
49
75
|
- **changed**: "close chat" header conversation menu button enabled in chatbot-panel.html
|
|
50
76
|
|
|
77
|
+
# 5.1.15-rc2
|
|
78
|
+
- **bug-fixed**: Bug fix for ifame message width
|
|
79
|
+
|
|
80
|
+
# 5.1.15-rc1
|
|
81
|
+
- **changed**: Load local translations before remote ones
|
|
82
|
+
|
|
51
83
|
# 5.1.15
|
|
52
84
|
- **changed**: Load local translations before remote ones
|
|
53
85
|
|
|
@@ -56,14 +88,57 @@
|
|
|
56
88
|
|
|
57
89
|
# 5.1.13
|
|
58
90
|
- **bug-fixed**: set default widget size
|
|
91
|
+
|
|
92
|
+
# 5.1.7-rc16
|
|
93
|
+
- **bug-fixed**: set default widget size
|
|
94
|
+
|
|
95
|
+
# 5.1.7-rc15
|
|
96
|
+
- **bug-fixed**: set the color of the buttons with visibility control to the font color
|
|
97
|
+
|
|
98
|
+
# 5.1.7-rc14
|
|
99
|
+
- **bug-fixed**: departmentId and departmentName is incorrect in attributes
|
|
100
|
+
|
|
101
|
+
# 5.1.7-rc13
|
|
102
|
+
- **changed**: Force authentication if ageChangeVisibilityDesktop or PageChangeVisibilityMobile is OPEN
|
|
103
|
+
|
|
104
|
+
# 5.1.7-rc12
|
|
105
|
+
- **changed**: Force authentication if ageChangeVisibilityDesktop or PageChangeVisibilityMobile is OPEN
|
|
106
|
+
- **changed**: Set the default autoStart value to false
|
|
107
|
+
- **added**: Added the open widget loading spinner
|
|
108
|
+
- **changed**: Load the widget without authentication and display the speech bubble
|
|
109
|
+
|
|
110
|
+
# 5.1.7-rc11
|
|
111
|
+
- **changed**: set default value autoStart false
|
|
112
|
+
- **added**:added loading spinner
|
|
113
|
+
|
|
114
|
+
# 5.1.7-rc10
|
|
115
|
+
- **changed**: load widget without authentication and display the balloon
|
|
116
|
+
|
|
117
|
+
# 5.1.7-rc9
|
|
118
|
+
- **removed**: 'DOMAIN_NOT_ALLOWED' in textarea footer component
|
|
119
|
+
|
|
120
|
+
# 5.1.7-rc8
|
|
121
|
+
# changes in the branch
|
|
122
|
+
- **changed**: Load local translations before remote ones
|
|
123
|
+
- **bug-fixed**: set default widget size
|
|
59
124
|
- **changed**: Updated the translations of the tooltips in the footer-component
|
|
60
125
|
- **changed**: Refactored the network-offline component and made it generic for displaying errors (now error-alert.component)
|
|
61
|
-
|
|
126
|
+
|
|
127
|
+
# 5.1.7-rc7
|
|
128
|
+
- **bug-fixed**: button new_conversation always appear. added subscription to conversationAdded
|
|
129
|
+
|
|
130
|
+
# 5.1.7-rc6
|
|
131
|
+
- **added**: Added MAX_ATTACHMENT_ERROR error message when uploading a file larger than 10 MB
|
|
62
132
|
|
|
63
133
|
# 5.1.12
|
|
64
134
|
- **bug-fixed**: check showEmojiFooterButton to enable/disable emojii
|
|
65
135
|
- **bug-fixed**: markdown is fired as an emojii and blocked by isEmojii check fn
|
|
66
136
|
|
|
137
|
+
# 5.1.7-rc7
|
|
138
|
+
- **bug-fixed**: button new_conversation always appear. added subscription to conversationAdded
|
|
139
|
+
|
|
140
|
+
# 5.1.7-rc6
|
|
141
|
+
- **added**: Added MAX_ATTACHMENT_ERROR error message when uploading a file larger than 10 MB
|
|
67
142
|
|
|
68
143
|
# 5.1.7-rc5
|
|
69
144
|
- **bug-fixed**: bug fixed BUTTON STYLES
|
package/Dockerfile
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
### STAGE 1: Build ###
|
|
2
2
|
|
|
3
3
|
# We label our stage as ‘builder’
|
|
4
|
-
FROM node:20.12.2-alpine3.19 as builder
|
|
4
|
+
FROM --platform=$BUILDPLATFORM node:20.12.2-alpine3.19 as builder
|
|
5
5
|
|
|
6
6
|
COPY package.json package-lock.json ./
|
|
7
7
|
|
|
@@ -15,12 +15,11 @@ COPY . .
|
|
|
15
15
|
|
|
16
16
|
## Build the angular app in production mode and store the artifacts in dist folder
|
|
17
17
|
|
|
18
|
-
RUN npx ng build --configuration="prod" --output-path=dist --base-href=./ --output-hashing=none
|
|
19
18
|
|
|
19
|
+
RUN npx ng build --configuration="prod" --output-path=dist --base-href=./ --output-hashing=none
|
|
20
20
|
|
|
21
21
|
### STAGE 2: Setup ###
|
|
22
|
-
|
|
23
|
-
FROM nginx:1.14.1-alpine
|
|
22
|
+
FROM --platform=$BUILDPLATFORM nginx:1.14.1-alpine
|
|
24
23
|
|
|
25
24
|
## Copy our default nginx config
|
|
26
25
|
COPY nginx.conf /etc/nginx/nginx.conf
|
|
@@ -33,4 +32,4 @@ COPY --from=builder /ng-app/dist/browser /usr/share/nginx/html
|
|
|
33
32
|
|
|
34
33
|
RUN echo "Chat21 Web Widget Started!!"
|
|
35
34
|
|
|
36
|
-
CMD ["/bin/sh",
|
|
35
|
+
CMD ["/bin/sh", "-c", "envsubst < /usr/share/nginx/html/widget-config-template.json > /usr/share/nginx/html/widget-config.json && exec nginx -g 'daemon off;'"]
|
package/angular.json
CHANGED
|
@@ -44,7 +44,8 @@
|
|
|
44
44
|
"src/environments/real_data/widget-config-docker.json",
|
|
45
45
|
"src/environments/real_data/widget-config-native-mqtt.json",
|
|
46
46
|
"src/environments/real_data/widget-config-native-prod.json",
|
|
47
|
-
"src/environments/real_data/widget-config-aws-stage.json"
|
|
47
|
+
"src/environments/real_data/widget-config-aws-stage.json",
|
|
48
|
+
"src/environments/real_data/widget-config-aws-aruba.json"
|
|
48
49
|
],
|
|
49
50
|
"styles": [
|
|
50
51
|
"src/app/sass/styles.scss"
|
package/deploy_amazon_beta.sh
CHANGED
|
@@ -2,8 +2,16 @@
|
|
|
2
2
|
version=`node -e 'console.log(require("./package.json").version)'`
|
|
3
3
|
echo "version $version"
|
|
4
4
|
|
|
5
|
+
npm i
|
|
6
|
+
|
|
7
|
+
cp src/environments/real_data/environment.pre.ts src/environments/environment.pre.ts
|
|
8
|
+
|
|
5
9
|
ng build --configuration="pre" --aot=true --base-href
|
|
6
10
|
|
|
11
|
+
### SET HASHING : START ###
|
|
12
|
+
cp ./src/launch_template.js ./dist/browser/launch.js
|
|
13
|
+
node ./src/build_launch.js
|
|
14
|
+
### SET HASHING : END ###
|
|
7
15
|
|
|
8
16
|
# ########## --->>>> NATIVE-MQTT folder START <<<<<------ ########## #
|
|
9
17
|
|
|
@@ -23,15 +31,17 @@ ng build --configuration="pre" --aot=true --base-href
|
|
|
23
31
|
|
|
24
32
|
|
|
25
33
|
# ########## --->>>> FIREBASE folder START <<<<<------ ########## #
|
|
26
|
-
cd dist
|
|
27
|
-
aws s3 sync . s3://tiledesk-widget-pre/v5/$version/ --cache-control max-age=300
|
|
28
|
-
aws s3 sync . s3://tiledesk-widget-pre/v5/ --cache-control
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
cd ..
|
|
34
|
+
cd dist/browser
|
|
35
|
+
aws s3 sync . s3://tiledesk-widget-pre/v5/$version/ --cache-control max-age=300 --exclude='launch.js' #7days
|
|
36
|
+
aws s3 sync . s3://tiledesk-widget-pre/v5/$version/ --cache-control "no-store,no-cache,private" --exclude='*' --include='launch.js'
|
|
37
|
+
aws s3 sync . s3://tiledesk-widget-pre/v5/ --cache-control max-age=300 --exclude='launch.js' #7days
|
|
38
|
+
aws s3 sync . s3://tiledesk-widget-pre/v5/ --cache-control "no-store,no-cache,private" --exclude='*' --include='launch.js'
|
|
39
|
+
cd ../..
|
|
33
40
|
|
|
34
41
|
aws cloudfront create-invalidation --distribution-id E2V5O0YPR61V8P --paths "/*"
|
|
42
|
+
|
|
43
|
+
git restore src/environments/environment.pre.ts
|
|
44
|
+
|
|
35
45
|
# echo new version deployed $NEW_VER/$NEW_BUILD/ on s3://tiledesk-widget-pre/v2
|
|
36
46
|
echo new version deployed $version/ on s3://tiledesk-widget-pre/v5 and s3://tiledesk-widget-pre/v5/$version/
|
|
37
47
|
echo available on https://s3.eu-west-1.amazonaws.com/tiledesk-widget-pre/v5/index.html
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# This branch: identificazione bot o umano
|
|
2
|
+
|
|
3
|
+
## Obiettivo
|
|
4
|
+
|
|
5
|
+
In questo branch e' stata introdotta una logica esplicita per capire, all'apertura della conversazione, se l'ultimo responder lato server e' un **bot** oppure un **umano**.
|
|
6
|
+
|
|
7
|
+
## Come viene fatta l'identificazione
|
|
8
|
+
|
|
9
|
+
- La valutazione parte dai messaggi gia' caricati in conversazione.
|
|
10
|
+
- Viene cercato l'**ultimo messaggio ricevuto dal server** (non inviato dal client corrente).
|
|
11
|
+
- Quel messaggio viene classificato con una funzione dedicata (`classifyMessageSenderKind`) che usa piu' segnali:
|
|
12
|
+
- `attributes.flowAttributes.chatbot_id` (quando presente indica bot)
|
|
13
|
+
- pattern del mittente (es. `senderId` con prefisso bot, quando applicabile)
|
|
14
|
+
- informazioni del mittente (`sender_fullname` e metadati associati)
|
|
15
|
+
|
|
16
|
+
## Regola speciale per messaggi di sistema
|
|
17
|
+
|
|
18
|
+
Se l'ultimo messaggio utile e' di tipo `system`, viene fatto un controllo aggiuntivo:
|
|
19
|
+
|
|
20
|
+
- se in `attributes` e' presente un evento con `messagelabel.key = MEMBER_JOINED_GROUP`
|
|
21
|
+
- e rappresenta il passaggio della conversazione a un operatore
|
|
22
|
+
|
|
23
|
+
allora la conversazione viene forzata a **Umano** anche se altri indizi potrebbero suggerire bot.
|
|
24
|
+
|
|
25
|
+
## Risultato in UI
|
|
26
|
+
|
|
27
|
+
- In apertura conversazione viene mostrato un badge con stato:
|
|
28
|
+
- `Bot`
|
|
29
|
+
- `Umano`
|
|
30
|
+
- Questo stato viene ricalcolato al variare dei messaggi ricevuti.
|
|
31
|
+
|
|
32
|
+
## Effetto sui feedback utente
|
|
33
|
+
|
|
34
|
+
- Il messaggio temporaneo `"sto pensando..."` viene mostrato solo quando la conversazione risulta di tipo **Bot**.
|
|
35
|
+
- Alla ricezione della prima risposta dal server, `"sto pensando..."` viene nascosto **immediatamente**.
|
|
36
|
+
- Non e' previsto alcun tempo minimo di visualizzazione del messaggio.
|
package/package.json
CHANGED
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
******* EYE-CATCHER (aka CALLOUT) *********
|
|
121
121
|
*******************************************
|
|
122
122
|
tabindex -> 20 -->
|
|
123
|
-
<chat-eyeeye-catcher-card *ngIf="
|
|
123
|
+
<chat-eyeeye-catcher-card *ngIf="!g.isOpenNewMessage"
|
|
124
124
|
(onOpenChat)="onOpenCloseWidget($event)"
|
|
125
125
|
(onCloseEyeCatcherCard)="onCloseEyeCatcherCard($event)">
|
|
126
126
|
</chat-eyeeye-catcher-card>
|
|
@@ -145,5 +145,12 @@
|
|
|
145
145
|
<chat-launcher-button *ngIf="isInitialized"
|
|
146
146
|
(onButtonClicked)="onOpenCloseWidget($event)">
|
|
147
147
|
</chat-launcher-button>
|
|
148
|
-
|
|
148
|
+
|
|
149
|
+
<!-- Loading Spinner -->
|
|
150
|
+
<div *ngIf="loading" class="tiledesk-loading-overlay">
|
|
151
|
+
<div class="tiledesk-loading-spinner">
|
|
152
|
+
<div class="spinner-circle"></div>
|
|
153
|
+
<div class="loading-text">{{ translationMap.get('LABEL_LOADING') }}</div>
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
149
156
|
</div>
|
|
@@ -761,4 +761,63 @@ chat-root {
|
|
|
761
761
|
}
|
|
762
762
|
}
|
|
763
763
|
|
|
764
|
+
// ========= BEGIN: LOADING SPINNER ========= //
|
|
765
|
+
.tiledesk-loading-overlay {
|
|
766
|
+
position: absolute;
|
|
767
|
+
top: 0;
|
|
768
|
+
left: 0;
|
|
769
|
+
width: 100%;
|
|
770
|
+
height: 100%;
|
|
771
|
+
background-color: rgba(248, 249, 250, 0.95);
|
|
772
|
+
display: flex;
|
|
773
|
+
justify-content: center;
|
|
774
|
+
align-items: center;
|
|
775
|
+
z-index: 9999;
|
|
776
|
+
backdrop-filter: blur(2px);
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
.tiledesk-loading-spinner {
|
|
780
|
+
display: flex;
|
|
781
|
+
flex-direction: column;
|
|
782
|
+
align-items: center;
|
|
783
|
+
gap: 16px;
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
.spinner-circle {
|
|
787
|
+
width: 50px;
|
|
788
|
+
height: 50px;
|
|
789
|
+
border: 4px solid rgba(59, 130, 246, 0.2);
|
|
790
|
+
border-top-color: #3b82f6;
|
|
791
|
+
border-radius: 50%;
|
|
792
|
+
animation: spin 0.8s linear infinite;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
@keyframes spin {
|
|
796
|
+
0% {
|
|
797
|
+
transform: rotate(0deg);
|
|
798
|
+
}
|
|
799
|
+
100% {
|
|
800
|
+
transform: rotate(360deg);
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
.loading-text {
|
|
805
|
+
font-family: var(--font-family-bubble-message, 'Roboto', 'Google Sans', Helvetica, Arial, sans-serif);
|
|
806
|
+
font-size: 14px;
|
|
807
|
+
font-weight: 500;
|
|
808
|
+
color: #3b82f6;
|
|
809
|
+
letter-spacing: 0.5px;
|
|
810
|
+
animation: pulse 1.5s ease-in-out infinite;
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
@keyframes pulse {
|
|
814
|
+
0%, 100% {
|
|
815
|
+
opacity: 1;
|
|
816
|
+
}
|
|
817
|
+
50% {
|
|
818
|
+
opacity: 0.5;
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
// ========= END: LOADING SPINNER ========= //
|
|
822
|
+
|
|
764
823
|
}
|