@rkosafo/cai.components 0.0.78 → 0.0.80
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/README.md +8 -8
- package/dist/baseEditor/index.svelte +32 -32
- package/dist/builders/filters/FilterBuilder.svelte +641 -641
- package/dist/forms/FormCheckbox/FormCheckbox.svelte +53 -53
- package/dist/forms/FormClEditor/ClEdito.svelte +68 -68
- package/dist/forms/FormDatepicker/FormDatepicker.svelte +159 -159
- package/dist/forms/FormFileUpload/FormFileUplad.svelte +134 -134
- package/dist/forms/FormInput/FormInput.svelte +87 -87
- package/dist/forms/FormRadio/FormRadio.svelte +53 -53
- package/dist/forms/FormSelect/FormSelect.svelte +88 -88
- package/dist/forms/FormTextarea/FormTextarea.svelte +78 -78
- package/dist/forms/button-toggle/ButtonToggle.svelte +119 -119
- package/dist/forms/button-toggle/CheckIcon.svelte +28 -28
- package/dist/forms/checkbox/Checkbox.svelte +82 -82
- package/dist/forms/checkbox/CheckboxButton.svelte +92 -92
- package/dist/forms/datepicker/Datepicker.svelte +707 -707
- package/dist/forms/form/Form.svelte +69 -69
- package/dist/forms/input/Input.svelte +363 -363
- package/dist/forms/label/Label.svelte +38 -38
- package/dist/forms/radio/Radio.svelte +48 -48
- package/dist/forms/radio/RadioButton.svelte +22 -22
- package/dist/forms/select/Select.svelte +56 -56
- package/dist/forms/textarea/Textarea.svelte +165 -165
- package/dist/forms/toggle/Toggle.svelte +70 -70
- package/dist/layout/Chat/CategorySelector.svelte +52 -52
- package/dist/layout/Chat/ChatEntry.svelte +246 -246
- package/dist/layout/Chat/ChatEntrySkeleton.svelte +81 -81
- package/dist/layout/Chat/ChatHeader.svelte +172 -172
- package/dist/layout/Chat/ChatInput.svelte +207 -207
- package/dist/layout/Chat/DraggableWindow.svelte +230 -230
- package/dist/layout/Chat/PreviewPage.svelte +182 -182
- package/dist/layout/Chat/RichText.svelte +216 -216
- package/dist/layout/ComponentCanvas/Canvas.svelte +40 -40
- package/dist/layout/ComponentCanvas/ComponentRenderer.svelte +85 -85
- package/dist/layout/TF/Content/Content.svelte +21 -21
- package/dist/layout/TF/Header/Header.svelte +166 -166
- package/dist/layout/TF/Sidebar/Sidebar.svelte +148 -148
- package/dist/layout/TF/Wrapper/Wrapper.svelte +17 -17
- package/dist/layout/mailing/MailPaginator.svelte +36 -36
- package/dist/layout/mailing/MailSidebar.svelte +39 -39
- package/dist/layout/mailing/MailToolBar.svelte +174 -174
- package/dist/layout/mailing/MailingContent.svelte +10 -10
- package/dist/layout/mailing/MailingHeader.svelte +55 -55
- package/dist/layout/mailing/MailingMessageCard.svelte +112 -112
- package/dist/layout/mailing/MailingMessageViewer.svelte +87 -87
- package/dist/layout/mailing/MailingModule.svelte +448 -448
- package/dist/styles/docs.css +615 -615
- package/dist/styles/tf-layout.css +185 -185
- package/dist/themes/ThemeProvider.svelte +20 -20
- package/dist/types/index.d.ts +2 -0
- package/dist/typography/heading/Heading.svelte +35 -35
- package/dist/ui/accordion/Accordion.svelte +49 -49
- package/dist/ui/accordion/AccordionItem.svelte +173 -173
- package/dist/ui/alert/Alert.svelte +83 -83
- package/dist/ui/alertDialog/AlertDialog.svelte +40 -40
- package/dist/ui/avatar/Avatar.svelte +77 -77
- package/dist/ui/box/Box.svelte +28 -28
- package/dist/ui/breadcrumb/Breadcrumb.svelte +39 -39
- package/dist/ui/buttons/ActionButton.svelte +234 -234
- package/dist/ui/buttons/Button.svelte +102 -102
- package/dist/ui/buttons/GradientButton.svelte +59 -59
- package/dist/ui/datatable/Datatable.svelte +525 -525
- package/dist/ui/drawer/Drawer.svelte +300 -300
- package/dist/ui/dropdown/Dropdown.svelte +36 -36
- package/dist/ui/dropdown/DropdownDivider.svelte +11 -11
- package/dist/ui/dropdown/DropdownGroup.svelte +14 -14
- package/dist/ui/dropdown/DropdownHeader.svelte +14 -14
- package/dist/ui/dropdown/DropdownItem.svelte +52 -52
- package/dist/ui/footer/Footer.svelte +15 -15
- package/dist/ui/footer/FooterBrand.svelte +37 -37
- package/dist/ui/footer/FooterCopyright.svelte +45 -45
- package/dist/ui/footer/FooterIcon.svelte +22 -22
- package/dist/ui/footer/FooterLink.svelte +33 -33
- package/dist/ui/footer/FooterLinkGroup.svelte +13 -13
- package/dist/ui/icons/IconifyIcon.svelte +7 -7
- package/dist/ui/indicator/Indicator.svelte +42 -42
- package/dist/ui/modal/Modal.svelte +265 -265
- package/dist/ui/notificationList/NotificationList.svelte +123 -123
- package/dist/ui/pageLoader/PageLoader.svelte +14 -14
- package/dist/ui/pageLoader/PageLoader2.svelte +99 -0
- package/dist/ui/pageLoader/PageLoader2.svelte.d.ts +24 -0
- package/dist/ui/pageLoader/index.d.ts +2 -1
- package/dist/ui/pageLoader/index.js +2 -1
- package/dist/ui/paginate/Paginate.svelte +96 -96
- package/dist/ui/speedDial/SpeedDial.svelte +77 -77
- package/dist/ui/speedDial/SpeedDialButton.svelte +75 -75
- package/dist/ui/speedDial/SpeedDialTrigger.svelte +79 -79
- package/dist/ui/tab/Tab.svelte +93 -67
- package/dist/ui/table/Table.svelte +396 -396
- package/dist/ui/tableLoader/TableLoader.svelte +24 -24
- package/dist/ui/toast/Toast.svelte +337 -337
- package/dist/ui/toast/Toast.svelte.d.ts +10 -10
- package/dist/ui/toolbar/Toolbar.svelte +59 -59
- package/dist/ui/toolbar/ToolbarButton.svelte +56 -56
- package/dist/ui/toolbar/ToolbarGroup.svelte +43 -43
- package/dist/ui/tooltip/Tooltip.svelte +51 -51
- package/dist/utils/Popper.svelte +257 -257
- package/dist/utils/closeButton/CloseButton.svelte +88 -88
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.js +3 -3
- package/dist/utils/singleSelection.svelte.js +48 -48
- package/dist/youtube/index.svelte +12 -12
- package/package.json +1 -1
|
@@ -1,246 +1,246 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { IconifyIcon, isExcel, isImage, isPdf, isPPT, isWord } from '../../index.js';
|
|
3
|
-
import { type ChatEntryPageProps } from './index.js';
|
|
4
|
-
import PreviewPage from './PreviewPage.svelte';
|
|
5
|
-
|
|
6
|
-
let { message, time = '', textBorder = true, userId }: ChatEntryPageProps = $props();
|
|
7
|
-
|
|
8
|
-
let showImage = $state(false);
|
|
9
|
-
let selectedFile = $state('');
|
|
10
|
-
|
|
11
|
-
let frame = $state<HTMLIFrameElement | undefined>();
|
|
12
|
-
function onItemClick(e: any) {
|
|
13
|
-
e.target.requestFullscreen();
|
|
14
|
-
e.stopPropagation();
|
|
15
|
-
}
|
|
16
|
-
</script>
|
|
17
|
-
|
|
18
|
-
<div class=" mb-2 {message.mine ? 'flex justify-end' : 'flex justify-start'} ">
|
|
19
|
-
<div class="mx-2 flex flex-col">
|
|
20
|
-
<div class=" {message.mine ? ' text-right ' : ' text-left'} ">
|
|
21
|
-
<span class=" text-sm text-gray-800/70">
|
|
22
|
-
{time}
|
|
23
|
-
</span>
|
|
24
|
-
</div>
|
|
25
|
-
<div class="order-1 flex max-w-sm flex-col space-y-2 text-sm" class:items-end={message.mine}>
|
|
26
|
-
<div>
|
|
27
|
-
<div class="space-y-2">
|
|
28
|
-
<div class="flex" class:justify-end={message.mine} class:justify-start={!message.mine}>
|
|
29
|
-
<div
|
|
30
|
-
class="inline-block bg-gray-200 px-4 py-2 break-normal {message.mine
|
|
31
|
-
? 'rounded-l-md rounded-r-sm border-r-4 border-blue-800 '
|
|
32
|
-
: 'rounded-l-sm rounded-r-md border-l-4 border-yellow-400'} "
|
|
33
|
-
>
|
|
34
|
-
{#if message.message.includes('http' || 'www.')}
|
|
35
|
-
<a
|
|
36
|
-
class={textBorder ? '' : 'bg-yellow-500 px-px '}
|
|
37
|
-
href={message.message}
|
|
38
|
-
target="_blank"
|
|
39
|
-
>
|
|
40
|
-
<p
|
|
41
|
-
class="text-blue-500 underline decoration-blue-500 underline-offset-2 hover:text-blue-700"
|
|
42
|
-
>
|
|
43
|
-
{message.message}
|
|
44
|
-
</p>
|
|
45
|
-
</a>
|
|
46
|
-
{:else}
|
|
47
|
-
<p class={`break-normal ${textBorder ? '' : 'bg-yellow-500 px-px'}`}>
|
|
48
|
-
{message.message}
|
|
49
|
-
</p>
|
|
50
|
-
{/if}
|
|
51
|
-
</div>
|
|
52
|
-
</div>
|
|
53
|
-
{#if message.files && message.files.length}
|
|
54
|
-
{#each message.files as image}
|
|
55
|
-
<div
|
|
56
|
-
class:justify-end={message.mine}
|
|
57
|
-
class:justify-start={!message.mine}
|
|
58
|
-
class:hidden={!isImage(image)}
|
|
59
|
-
>
|
|
60
|
-
<div
|
|
61
|
-
class=" flex rounded-md p-1"
|
|
62
|
-
class:justify-end={message.mine}
|
|
63
|
-
class:justify-start={!message.mine}
|
|
64
|
-
>
|
|
65
|
-
<button class="group relative rounded-md bg-gray-200 p-0.5" onclick={onItemClick}>
|
|
66
|
-
<img
|
|
67
|
-
src={image}
|
|
68
|
-
alt="pic"
|
|
69
|
-
class="max-h-60 w-40 transform rounded-md transition duration-300 ease-in-out group-hover:scale-95"
|
|
70
|
-
/>
|
|
71
|
-
<!-- <div
|
|
72
|
-
class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
|
|
73
|
-
/> -->
|
|
74
|
-
</button>
|
|
75
|
-
</div>
|
|
76
|
-
</div>
|
|
77
|
-
<div
|
|
78
|
-
class:justify-end={message.mine}
|
|
79
|
-
class:justify-start={!message.mine}
|
|
80
|
-
class:hidden={!isPdf(image)}
|
|
81
|
-
>
|
|
82
|
-
<div
|
|
83
|
-
class=" flex rounded-md p-1"
|
|
84
|
-
class:justify-end={message.mine}
|
|
85
|
-
class:justify-start={!message.mine}
|
|
86
|
-
>
|
|
87
|
-
<button
|
|
88
|
-
class="group relative rounded-md bg-gray-200 px-0.5 py-2"
|
|
89
|
-
onclick={(_) => {
|
|
90
|
-
selectedFile = image;
|
|
91
|
-
showImage = true;
|
|
92
|
-
}}
|
|
93
|
-
>
|
|
94
|
-
<IconifyIcon
|
|
95
|
-
icon="vscode-icons:file-type-pdf2"
|
|
96
|
-
style="font-size: 150px;"
|
|
97
|
-
class="transform transition duration-300 ease-in-out group-hover:scale-95"
|
|
98
|
-
/>
|
|
99
|
-
<!-- <div
|
|
100
|
-
class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
|
|
101
|
-
/> -->
|
|
102
|
-
</button>
|
|
103
|
-
</div>
|
|
104
|
-
</div>
|
|
105
|
-
<div
|
|
106
|
-
class:justify-end={message.mine}
|
|
107
|
-
class:justify-start={!message.mine}
|
|
108
|
-
class:hidden={!isWord(image)}
|
|
109
|
-
>
|
|
110
|
-
<div
|
|
111
|
-
class=" flex rounded-md p-1"
|
|
112
|
-
class:justify-end={message.mine}
|
|
113
|
-
class:justify-start={!message.mine}
|
|
114
|
-
>
|
|
115
|
-
<button
|
|
116
|
-
class="group relative rounded-md bg-gray-200 p-0.5"
|
|
117
|
-
onclick={(_) => {
|
|
118
|
-
selectedFile = image;
|
|
119
|
-
showImage = true;
|
|
120
|
-
}}
|
|
121
|
-
>
|
|
122
|
-
<IconifyIcon
|
|
123
|
-
icon="vscode-icons:file-type-word"
|
|
124
|
-
style="font-size: 150px;"
|
|
125
|
-
class="transform transition duration-300 ease-in-out group-hover:scale-95"
|
|
126
|
-
/>
|
|
127
|
-
<!-- <div
|
|
128
|
-
class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
|
|
129
|
-
/> -->
|
|
130
|
-
</button>
|
|
131
|
-
</div>
|
|
132
|
-
</div>
|
|
133
|
-
<div
|
|
134
|
-
class:justify-end={message.mine}
|
|
135
|
-
class:justify-start={!message.mine}
|
|
136
|
-
class:hidden={!isPPT(image)}
|
|
137
|
-
>
|
|
138
|
-
<div
|
|
139
|
-
class=" flex rounded-md p-1"
|
|
140
|
-
class:justify-end={message.mine}
|
|
141
|
-
class:justify-start={!message.mine}
|
|
142
|
-
>
|
|
143
|
-
<button
|
|
144
|
-
class="group relative rounded-md bg-gray-200 p-0.5"
|
|
145
|
-
onclick={(_) => {
|
|
146
|
-
selectedFile = image;
|
|
147
|
-
showImage = true;
|
|
148
|
-
}}
|
|
149
|
-
>
|
|
150
|
-
<IconifyIcon
|
|
151
|
-
icon="vscode-icons:file-type-powerpoint2"
|
|
152
|
-
style="font-size: 150px;"
|
|
153
|
-
class="transform transition duration-300 ease-in-out group-hover:scale-95"
|
|
154
|
-
/>
|
|
155
|
-
<!-- <div
|
|
156
|
-
class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
|
|
157
|
-
/> -->
|
|
158
|
-
</button>
|
|
159
|
-
</div>
|
|
160
|
-
</div>
|
|
161
|
-
<div
|
|
162
|
-
class:justify-end={message.mine}
|
|
163
|
-
class:justify-start={!message.mine}
|
|
164
|
-
class:hidden={!isExcel(image)}
|
|
165
|
-
>
|
|
166
|
-
<div
|
|
167
|
-
class=" flex rounded-md p-1"
|
|
168
|
-
class:justify-end={message.mine}
|
|
169
|
-
class:justify-start={!message.mine}
|
|
170
|
-
>
|
|
171
|
-
<button
|
|
172
|
-
class="group relative rounded-md bg-gray-200 p-0.5"
|
|
173
|
-
onclick={() => {
|
|
174
|
-
selectedFile = image;
|
|
175
|
-
showImage = true;
|
|
176
|
-
}}
|
|
177
|
-
>
|
|
178
|
-
<IconifyIcon
|
|
179
|
-
icon="vscode-icons:file-type-excel"
|
|
180
|
-
style="font-size: 150px;"
|
|
181
|
-
class="transform transition duration-300 ease-in-out group-hover:scale-95"
|
|
182
|
-
/>
|
|
183
|
-
<!-- <div
|
|
184
|
-
class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
|
|
185
|
-
/> -->
|
|
186
|
-
</button>
|
|
187
|
-
</div>
|
|
188
|
-
</div>
|
|
189
|
-
<div
|
|
190
|
-
class:justify-end={message.mine}
|
|
191
|
-
class:justify-start={!message.mine}
|
|
192
|
-
class:hidden={isImage(image) ||
|
|
193
|
-
isPPT(image) ||
|
|
194
|
-
isPdf(image) ||
|
|
195
|
-
isWord(image) ||
|
|
196
|
-
isExcel(image)}
|
|
197
|
-
>
|
|
198
|
-
<div
|
|
199
|
-
class=" flex rounded-md p-1"
|
|
200
|
-
class:justify-end={message.mine}
|
|
201
|
-
class:justify-start={!message.mine}
|
|
202
|
-
>
|
|
203
|
-
<button
|
|
204
|
-
class="group relative rounded-md bg-gray-200 p-0.5"
|
|
205
|
-
onclick={(_) => {
|
|
206
|
-
selectedFile = image;
|
|
207
|
-
showImage = true;
|
|
208
|
-
}}
|
|
209
|
-
>
|
|
210
|
-
<IconifyIcon
|
|
211
|
-
icon="bxs:file"
|
|
212
|
-
style="font-size: 150px;"
|
|
213
|
-
class="transform transition duration-300 ease-in-out group-hover:scale-95"
|
|
214
|
-
/>
|
|
215
|
-
<!-- <div
|
|
216
|
-
class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
|
|
217
|
-
/> -->
|
|
218
|
-
</button>
|
|
219
|
-
</div>
|
|
220
|
-
<iframe src={image} title={image} class="flex-grow" bind:this={frame}></iframe>
|
|
221
|
-
</div>
|
|
222
|
-
<!-- {/if} -->
|
|
223
|
-
{/each}
|
|
224
|
-
{/if}
|
|
225
|
-
</div>
|
|
226
|
-
<!-- {/if} -->
|
|
227
|
-
</div>
|
|
228
|
-
<div class:hidden={!message.mine}>
|
|
229
|
-
<p class:hidden={userId === message.user?.id} class="text-sm text-gray-500 antialiased">
|
|
230
|
-
{message.user?.firstName}
|
|
231
|
-
{message?.user?.otherNames ?? ''}
|
|
232
|
-
{message.user?.surname}
|
|
233
|
-
{message.user?.staffNumber ?? ''}
|
|
234
|
-
</p>
|
|
235
|
-
</div>
|
|
236
|
-
</div>
|
|
237
|
-
</div>
|
|
238
|
-
</div>
|
|
239
|
-
|
|
240
|
-
<PreviewPage
|
|
241
|
-
title="Attachment Preview"
|
|
242
|
-
bind:open={showImage}
|
|
243
|
-
showActions={false}
|
|
244
|
-
fullImage
|
|
245
|
-
src={{ content: selectedFile, name: '', file: '' }}
|
|
246
|
-
/>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { IconifyIcon, isExcel, isImage, isPdf, isPPT, isWord } from '../../index.js';
|
|
3
|
+
import { type ChatEntryPageProps } from './index.js';
|
|
4
|
+
import PreviewPage from './PreviewPage.svelte';
|
|
5
|
+
|
|
6
|
+
let { message, time = '', textBorder = true, userId }: ChatEntryPageProps = $props();
|
|
7
|
+
|
|
8
|
+
let showImage = $state(false);
|
|
9
|
+
let selectedFile = $state('');
|
|
10
|
+
|
|
11
|
+
let frame = $state<HTMLIFrameElement | undefined>();
|
|
12
|
+
function onItemClick(e: any) {
|
|
13
|
+
e.target.requestFullscreen();
|
|
14
|
+
e.stopPropagation();
|
|
15
|
+
}
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<div class=" mb-2 {message.mine ? 'flex justify-end' : 'flex justify-start'} ">
|
|
19
|
+
<div class="mx-2 flex flex-col">
|
|
20
|
+
<div class=" {message.mine ? ' text-right ' : ' text-left'} ">
|
|
21
|
+
<span class=" text-sm text-gray-800/70">
|
|
22
|
+
{time}
|
|
23
|
+
</span>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="order-1 flex max-w-sm flex-col space-y-2 text-sm" class:items-end={message.mine}>
|
|
26
|
+
<div>
|
|
27
|
+
<div class="space-y-2">
|
|
28
|
+
<div class="flex" class:justify-end={message.mine} class:justify-start={!message.mine}>
|
|
29
|
+
<div
|
|
30
|
+
class="inline-block bg-gray-200 px-4 py-2 break-normal {message.mine
|
|
31
|
+
? 'rounded-l-md rounded-r-sm border-r-4 border-blue-800 '
|
|
32
|
+
: 'rounded-l-sm rounded-r-md border-l-4 border-yellow-400'} "
|
|
33
|
+
>
|
|
34
|
+
{#if message.message.includes('http' || 'www.')}
|
|
35
|
+
<a
|
|
36
|
+
class={textBorder ? '' : 'bg-yellow-500 px-px '}
|
|
37
|
+
href={message.message}
|
|
38
|
+
target="_blank"
|
|
39
|
+
>
|
|
40
|
+
<p
|
|
41
|
+
class="text-blue-500 underline decoration-blue-500 underline-offset-2 hover:text-blue-700"
|
|
42
|
+
>
|
|
43
|
+
{message.message}
|
|
44
|
+
</p>
|
|
45
|
+
</a>
|
|
46
|
+
{:else}
|
|
47
|
+
<p class={`break-normal ${textBorder ? '' : 'bg-yellow-500 px-px'}`}>
|
|
48
|
+
{message.message}
|
|
49
|
+
</p>
|
|
50
|
+
{/if}
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
{#if message.files && message.files.length}
|
|
54
|
+
{#each message.files as image}
|
|
55
|
+
<div
|
|
56
|
+
class:justify-end={message.mine}
|
|
57
|
+
class:justify-start={!message.mine}
|
|
58
|
+
class:hidden={!isImage(image)}
|
|
59
|
+
>
|
|
60
|
+
<div
|
|
61
|
+
class=" flex rounded-md p-1"
|
|
62
|
+
class:justify-end={message.mine}
|
|
63
|
+
class:justify-start={!message.mine}
|
|
64
|
+
>
|
|
65
|
+
<button class="group relative rounded-md bg-gray-200 p-0.5" onclick={onItemClick}>
|
|
66
|
+
<img
|
|
67
|
+
src={image}
|
|
68
|
+
alt="pic"
|
|
69
|
+
class="max-h-60 w-40 transform rounded-md transition duration-300 ease-in-out group-hover:scale-95"
|
|
70
|
+
/>
|
|
71
|
+
<!-- <div
|
|
72
|
+
class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
|
|
73
|
+
/> -->
|
|
74
|
+
</button>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
<div
|
|
78
|
+
class:justify-end={message.mine}
|
|
79
|
+
class:justify-start={!message.mine}
|
|
80
|
+
class:hidden={!isPdf(image)}
|
|
81
|
+
>
|
|
82
|
+
<div
|
|
83
|
+
class=" flex rounded-md p-1"
|
|
84
|
+
class:justify-end={message.mine}
|
|
85
|
+
class:justify-start={!message.mine}
|
|
86
|
+
>
|
|
87
|
+
<button
|
|
88
|
+
class="group relative rounded-md bg-gray-200 px-0.5 py-2"
|
|
89
|
+
onclick={(_) => {
|
|
90
|
+
selectedFile = image;
|
|
91
|
+
showImage = true;
|
|
92
|
+
}}
|
|
93
|
+
>
|
|
94
|
+
<IconifyIcon
|
|
95
|
+
icon="vscode-icons:file-type-pdf2"
|
|
96
|
+
style="font-size: 150px;"
|
|
97
|
+
class="transform transition duration-300 ease-in-out group-hover:scale-95"
|
|
98
|
+
/>
|
|
99
|
+
<!-- <div
|
|
100
|
+
class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
|
|
101
|
+
/> -->
|
|
102
|
+
</button>
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
<div
|
|
106
|
+
class:justify-end={message.mine}
|
|
107
|
+
class:justify-start={!message.mine}
|
|
108
|
+
class:hidden={!isWord(image)}
|
|
109
|
+
>
|
|
110
|
+
<div
|
|
111
|
+
class=" flex rounded-md p-1"
|
|
112
|
+
class:justify-end={message.mine}
|
|
113
|
+
class:justify-start={!message.mine}
|
|
114
|
+
>
|
|
115
|
+
<button
|
|
116
|
+
class="group relative rounded-md bg-gray-200 p-0.5"
|
|
117
|
+
onclick={(_) => {
|
|
118
|
+
selectedFile = image;
|
|
119
|
+
showImage = true;
|
|
120
|
+
}}
|
|
121
|
+
>
|
|
122
|
+
<IconifyIcon
|
|
123
|
+
icon="vscode-icons:file-type-word"
|
|
124
|
+
style="font-size: 150px;"
|
|
125
|
+
class="transform transition duration-300 ease-in-out group-hover:scale-95"
|
|
126
|
+
/>
|
|
127
|
+
<!-- <div
|
|
128
|
+
class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
|
|
129
|
+
/> -->
|
|
130
|
+
</button>
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
<div
|
|
134
|
+
class:justify-end={message.mine}
|
|
135
|
+
class:justify-start={!message.mine}
|
|
136
|
+
class:hidden={!isPPT(image)}
|
|
137
|
+
>
|
|
138
|
+
<div
|
|
139
|
+
class=" flex rounded-md p-1"
|
|
140
|
+
class:justify-end={message.mine}
|
|
141
|
+
class:justify-start={!message.mine}
|
|
142
|
+
>
|
|
143
|
+
<button
|
|
144
|
+
class="group relative rounded-md bg-gray-200 p-0.5"
|
|
145
|
+
onclick={(_) => {
|
|
146
|
+
selectedFile = image;
|
|
147
|
+
showImage = true;
|
|
148
|
+
}}
|
|
149
|
+
>
|
|
150
|
+
<IconifyIcon
|
|
151
|
+
icon="vscode-icons:file-type-powerpoint2"
|
|
152
|
+
style="font-size: 150px;"
|
|
153
|
+
class="transform transition duration-300 ease-in-out group-hover:scale-95"
|
|
154
|
+
/>
|
|
155
|
+
<!-- <div
|
|
156
|
+
class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
|
|
157
|
+
/> -->
|
|
158
|
+
</button>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
<div
|
|
162
|
+
class:justify-end={message.mine}
|
|
163
|
+
class:justify-start={!message.mine}
|
|
164
|
+
class:hidden={!isExcel(image)}
|
|
165
|
+
>
|
|
166
|
+
<div
|
|
167
|
+
class=" flex rounded-md p-1"
|
|
168
|
+
class:justify-end={message.mine}
|
|
169
|
+
class:justify-start={!message.mine}
|
|
170
|
+
>
|
|
171
|
+
<button
|
|
172
|
+
class="group relative rounded-md bg-gray-200 p-0.5"
|
|
173
|
+
onclick={() => {
|
|
174
|
+
selectedFile = image;
|
|
175
|
+
showImage = true;
|
|
176
|
+
}}
|
|
177
|
+
>
|
|
178
|
+
<IconifyIcon
|
|
179
|
+
icon="vscode-icons:file-type-excel"
|
|
180
|
+
style="font-size: 150px;"
|
|
181
|
+
class="transform transition duration-300 ease-in-out group-hover:scale-95"
|
|
182
|
+
/>
|
|
183
|
+
<!-- <div
|
|
184
|
+
class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
|
|
185
|
+
/> -->
|
|
186
|
+
</button>
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
189
|
+
<div
|
|
190
|
+
class:justify-end={message.mine}
|
|
191
|
+
class:justify-start={!message.mine}
|
|
192
|
+
class:hidden={isImage(image) ||
|
|
193
|
+
isPPT(image) ||
|
|
194
|
+
isPdf(image) ||
|
|
195
|
+
isWord(image) ||
|
|
196
|
+
isExcel(image)}
|
|
197
|
+
>
|
|
198
|
+
<div
|
|
199
|
+
class=" flex rounded-md p-1"
|
|
200
|
+
class:justify-end={message.mine}
|
|
201
|
+
class:justify-start={!message.mine}
|
|
202
|
+
>
|
|
203
|
+
<button
|
|
204
|
+
class="group relative rounded-md bg-gray-200 p-0.5"
|
|
205
|
+
onclick={(_) => {
|
|
206
|
+
selectedFile = image;
|
|
207
|
+
showImage = true;
|
|
208
|
+
}}
|
|
209
|
+
>
|
|
210
|
+
<IconifyIcon
|
|
211
|
+
icon="bxs:file"
|
|
212
|
+
style="font-size: 150px;"
|
|
213
|
+
class="transform transition duration-300 ease-in-out group-hover:scale-95"
|
|
214
|
+
/>
|
|
215
|
+
<!-- <div
|
|
216
|
+
class="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity rounded-md"
|
|
217
|
+
/> -->
|
|
218
|
+
</button>
|
|
219
|
+
</div>
|
|
220
|
+
<iframe src={image} title={image} class="flex-grow" bind:this={frame}></iframe>
|
|
221
|
+
</div>
|
|
222
|
+
<!-- {/if} -->
|
|
223
|
+
{/each}
|
|
224
|
+
{/if}
|
|
225
|
+
</div>
|
|
226
|
+
<!-- {/if} -->
|
|
227
|
+
</div>
|
|
228
|
+
<div class:hidden={!message.mine}>
|
|
229
|
+
<p class:hidden={userId === message.user?.id} class="text-sm text-gray-500 antialiased">
|
|
230
|
+
{message.user?.firstName}
|
|
231
|
+
{message?.user?.otherNames ?? ''}
|
|
232
|
+
{message.user?.surname}
|
|
233
|
+
{message.user?.staffNumber ?? ''}
|
|
234
|
+
</p>
|
|
235
|
+
</div>
|
|
236
|
+
</div>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
|
|
240
|
+
<PreviewPage
|
|
241
|
+
title="Attachment Preview"
|
|
242
|
+
bind:open={showImage}
|
|
243
|
+
showActions={false}
|
|
244
|
+
fullImage
|
|
245
|
+
src={{ content: selectedFile, name: '', file: '' }}
|
|
246
|
+
/>
|
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { fade } from 'svelte/transition';
|
|
3
|
-
import type { ChatEntrySkeletonProps } from './index.js';
|
|
4
|
-
|
|
5
|
-
let { isMobile = false, messageCount = 5 }: ChatEntrySkeletonProps = $props();
|
|
6
|
-
</script>
|
|
7
|
-
|
|
8
|
-
<div class="flex h-full w-full flex-col overflow-x-hidden overflow-y-auto">
|
|
9
|
-
<div
|
|
10
|
-
class="chat-list-pane relative isolate flex h-full w-full flex-col overflow-x-hidden overflow-y-auto bg-green-50/40 !bg-contain !bg-center !bg-no-repeat"
|
|
11
|
-
>
|
|
12
|
-
{#if messageCount === 0}
|
|
13
|
-
<div
|
|
14
|
-
class="mx-auto flex min-h-full max-w-[12rem] flex-col items-center justify-center gap-1 text-center text-base font-semibold text-gray-400"
|
|
15
|
-
>
|
|
16
|
-
<div class="h-20 w-20 rounded-full bg-gray-400 opacity-20"></div>
|
|
17
|
-
<span class="text-sm"> Select a query to view the conversation </span>
|
|
18
|
-
</div>
|
|
19
|
-
{:else}
|
|
20
|
-
<!-- Received message skeletons -->
|
|
21
|
-
{#each Array(Math.ceil(messageCount / 2)) as _, i}
|
|
22
|
-
<div transition:fade={{ delay: i * 100 }} class="flex flex-col items-start gap-2 p-4">
|
|
23
|
-
<div class="flex items-center gap-2">
|
|
24
|
-
<div class="h-8 w-8 animate-pulse rounded-full bg-gray-200"></div>
|
|
25
|
-
<div class="h-4 w-20 animate-pulse rounded-full bg-gray-200"></div>
|
|
26
|
-
</div>
|
|
27
|
-
<div class="ml-10 flex flex-col gap-1">
|
|
28
|
-
<div class="h-4 w-64 animate-pulse rounded-md bg-gray-200"></div>
|
|
29
|
-
<div class="h-4 w-48 animate-pulse rounded-md bg-gray-200"></div>
|
|
30
|
-
<div class="h-4 w-32 animate-pulse rounded-md bg-gray-200"></div>
|
|
31
|
-
</div>
|
|
32
|
-
<div class="ml-10 h-3 w-24 animate-pulse rounded-full bg-gray-200"></div>
|
|
33
|
-
</div>
|
|
34
|
-
{/each}
|
|
35
|
-
|
|
36
|
-
<!-- Sent message skeletons -->
|
|
37
|
-
{#each Array(Math.floor(messageCount / 2)) as _, i}
|
|
38
|
-
<div
|
|
39
|
-
transition:fade={{ delay: (i + Math.ceil(messageCount / 2)) * 100 }}
|
|
40
|
-
class="flex flex-col items-end gap-2 p-4"
|
|
41
|
-
>
|
|
42
|
-
<div class="flex gap-1">
|
|
43
|
-
<div class="flex flex-col items-end gap-1">
|
|
44
|
-
<div class="h-4 w-20 animate-pulse rounded-full bg-gray-200"></div>
|
|
45
|
-
<div class="h-4 w-56 animate-pulse rounded-md bg-gray-200"></div>
|
|
46
|
-
<div class="h-4 w-40 animate-pulse rounded-md bg-gray-200"></div>
|
|
47
|
-
<div class="h-3 w-20 animate-pulse rounded-full bg-gray-200"></div>
|
|
48
|
-
</div>
|
|
49
|
-
<div class="flex items-center gap-2">
|
|
50
|
-
<div class="h-8 w-8 animate-pulse rounded-full bg-gray-200"></div>
|
|
51
|
-
</div>
|
|
52
|
-
</div>
|
|
53
|
-
</div>
|
|
54
|
-
{/each}
|
|
55
|
-
{/if}
|
|
56
|
-
</div>
|
|
57
|
-
|
|
58
|
-
<!-- Input area skeleton -->
|
|
59
|
-
<div class={`border-t bg-white p-2 ${isMobile ? 'pb-20' : 'pb-2'}`}>
|
|
60
|
-
<div class="flex items-center gap-2">
|
|
61
|
-
<div class="h-10 flex-1 animate-pulse rounded-full bg-gray-200"></div>
|
|
62
|
-
<div class="h-10 w-10 animate-pulse rounded-full bg-gray-200"></div>
|
|
63
|
-
</div>
|
|
64
|
-
</div>
|
|
65
|
-
</div>
|
|
66
|
-
|
|
67
|
-
<style>
|
|
68
|
-
.animate-pulse {
|
|
69
|
-
animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
@keyframes pulse {
|
|
73
|
-
0%,
|
|
74
|
-
100% {
|
|
75
|
-
opacity: 1;
|
|
76
|
-
}
|
|
77
|
-
50% {
|
|
78
|
-
opacity: 0.5;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
</style>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { fade } from 'svelte/transition';
|
|
3
|
+
import type { ChatEntrySkeletonProps } from './index.js';
|
|
4
|
+
|
|
5
|
+
let { isMobile = false, messageCount = 5 }: ChatEntrySkeletonProps = $props();
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<div class="flex h-full w-full flex-col overflow-x-hidden overflow-y-auto">
|
|
9
|
+
<div
|
|
10
|
+
class="chat-list-pane relative isolate flex h-full w-full flex-col overflow-x-hidden overflow-y-auto bg-green-50/40 !bg-contain !bg-center !bg-no-repeat"
|
|
11
|
+
>
|
|
12
|
+
{#if messageCount === 0}
|
|
13
|
+
<div
|
|
14
|
+
class="mx-auto flex min-h-full max-w-[12rem] flex-col items-center justify-center gap-1 text-center text-base font-semibold text-gray-400"
|
|
15
|
+
>
|
|
16
|
+
<div class="h-20 w-20 rounded-full bg-gray-400 opacity-20"></div>
|
|
17
|
+
<span class="text-sm"> Select a query to view the conversation </span>
|
|
18
|
+
</div>
|
|
19
|
+
{:else}
|
|
20
|
+
<!-- Received message skeletons -->
|
|
21
|
+
{#each Array(Math.ceil(messageCount / 2)) as _, i}
|
|
22
|
+
<div transition:fade={{ delay: i * 100 }} class="flex flex-col items-start gap-2 p-4">
|
|
23
|
+
<div class="flex items-center gap-2">
|
|
24
|
+
<div class="h-8 w-8 animate-pulse rounded-full bg-gray-200"></div>
|
|
25
|
+
<div class="h-4 w-20 animate-pulse rounded-full bg-gray-200"></div>
|
|
26
|
+
</div>
|
|
27
|
+
<div class="ml-10 flex flex-col gap-1">
|
|
28
|
+
<div class="h-4 w-64 animate-pulse rounded-md bg-gray-200"></div>
|
|
29
|
+
<div class="h-4 w-48 animate-pulse rounded-md bg-gray-200"></div>
|
|
30
|
+
<div class="h-4 w-32 animate-pulse rounded-md bg-gray-200"></div>
|
|
31
|
+
</div>
|
|
32
|
+
<div class="ml-10 h-3 w-24 animate-pulse rounded-full bg-gray-200"></div>
|
|
33
|
+
</div>
|
|
34
|
+
{/each}
|
|
35
|
+
|
|
36
|
+
<!-- Sent message skeletons -->
|
|
37
|
+
{#each Array(Math.floor(messageCount / 2)) as _, i}
|
|
38
|
+
<div
|
|
39
|
+
transition:fade={{ delay: (i + Math.ceil(messageCount / 2)) * 100 }}
|
|
40
|
+
class="flex flex-col items-end gap-2 p-4"
|
|
41
|
+
>
|
|
42
|
+
<div class="flex gap-1">
|
|
43
|
+
<div class="flex flex-col items-end gap-1">
|
|
44
|
+
<div class="h-4 w-20 animate-pulse rounded-full bg-gray-200"></div>
|
|
45
|
+
<div class="h-4 w-56 animate-pulse rounded-md bg-gray-200"></div>
|
|
46
|
+
<div class="h-4 w-40 animate-pulse rounded-md bg-gray-200"></div>
|
|
47
|
+
<div class="h-3 w-20 animate-pulse rounded-full bg-gray-200"></div>
|
|
48
|
+
</div>
|
|
49
|
+
<div class="flex items-center gap-2">
|
|
50
|
+
<div class="h-8 w-8 animate-pulse rounded-full bg-gray-200"></div>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
{/each}
|
|
55
|
+
{/if}
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<!-- Input area skeleton -->
|
|
59
|
+
<div class={`border-t bg-white p-2 ${isMobile ? 'pb-20' : 'pb-2'}`}>
|
|
60
|
+
<div class="flex items-center gap-2">
|
|
61
|
+
<div class="h-10 flex-1 animate-pulse rounded-full bg-gray-200"></div>
|
|
62
|
+
<div class="h-10 w-10 animate-pulse rounded-full bg-gray-200"></div>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
<style>
|
|
68
|
+
.animate-pulse {
|
|
69
|
+
animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
@keyframes pulse {
|
|
73
|
+
0%,
|
|
74
|
+
100% {
|
|
75
|
+
opacity: 1;
|
|
76
|
+
}
|
|
77
|
+
50% {
|
|
78
|
+
opacity: 0.5;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
</style>
|