@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,112 +1,112 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { Checkbox } from '../../forms/checkbox/index.js';
|
|
3
|
-
import IconifyIcon from '../../ui/icons/IconifyIcon.svelte';
|
|
4
|
-
import dayjs from 'dayjs';
|
|
5
|
-
import { type MailingMessageCardProps } from './index.js';
|
|
6
|
-
|
|
7
|
-
let {
|
|
8
|
-
id = 0,
|
|
9
|
-
sender = '',
|
|
10
|
-
subject = '',
|
|
11
|
-
date,
|
|
12
|
-
message = '',
|
|
13
|
-
isStared = false,
|
|
14
|
-
isImportant = false,
|
|
15
|
-
isRead = false,
|
|
16
|
-
isChecked = false,
|
|
17
|
-
onItemChecked,
|
|
18
|
-
toggelImportant,
|
|
19
|
-
toggleFavorited,
|
|
20
|
-
onItemSelected,
|
|
21
|
-
showCheckbox = true,
|
|
22
|
-
showMarkAsFavorite = true,
|
|
23
|
-
showMarkAsImportant = true
|
|
24
|
-
}: MailingMessageCardProps = $props();
|
|
25
|
-
|
|
26
|
-
function handleClik(e: any) {
|
|
27
|
-
if (e.target.tagName !== 'INPUT' && e.target.localName !== 'iconify-icon') onItemSelected?.(id);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function formatDate(date: Date | string): string {
|
|
31
|
-
const messageDate = dayjs(date);
|
|
32
|
-
const today = dayjs();
|
|
33
|
-
|
|
34
|
-
if (messageDate.isSame(today, 'day')) {
|
|
35
|
-
return messageDate.format('HH:mm');
|
|
36
|
-
} else if (messageDate.isSame(today.subtract(1, 'day'), 'day')) {
|
|
37
|
-
return 'Yesterday';
|
|
38
|
-
} else if (messageDate.isSame(today, 'year')) {
|
|
39
|
-
return messageDate.format('MMM DD');
|
|
40
|
-
} else {
|
|
41
|
-
return messageDate.format('DD/MM/YYYY');
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
</script>
|
|
45
|
-
|
|
46
|
-
<div
|
|
47
|
-
class:hover:bg-gray-200={!isChecked}
|
|
48
|
-
class="flex items-center border border-gray-300 bg-white px-2 shadow"
|
|
49
|
-
role="button"
|
|
50
|
-
tabindex="0"
|
|
51
|
-
onkeydown={handleClik}
|
|
52
|
-
onclick={handleClik}
|
|
53
|
-
>
|
|
54
|
-
{#if showCheckbox}
|
|
55
|
-
<Checkbox
|
|
56
|
-
checked={isChecked}
|
|
57
|
-
class="cursor-pointer border-2 border-gray-400 transition-colors hover:ring-4 hover:ring-gray-400 focus:ring-0"
|
|
58
|
-
onchange={(e) => {
|
|
59
|
-
const target = e.target;
|
|
60
|
-
onItemChecked?.({ checked: target.checked, id });
|
|
61
|
-
}}
|
|
62
|
-
/>
|
|
63
|
-
{/if}
|
|
64
|
-
<div class="my-1 flex w-full cursor-pointer items-center justify-between p-1">
|
|
65
|
-
<div class="flex w-full items-center">
|
|
66
|
-
<div class="flex">
|
|
67
|
-
<div class="mr-4 flex items-center gap-1 space-x-1">
|
|
68
|
-
<button
|
|
69
|
-
class:hidden={!showMarkAsFavorite}
|
|
70
|
-
onclick={(e) => {
|
|
71
|
-
toggleFavorited?.(id);
|
|
72
|
-
}}
|
|
73
|
-
aria-label="Not starred"
|
|
74
|
-
>
|
|
75
|
-
<IconifyIcon
|
|
76
|
-
style="font-size: 24px"
|
|
77
|
-
icon={isStared ? 'mdi:star' : 'mdi:star-outline'}
|
|
78
|
-
class="flex justify-center transition-colors {isStared
|
|
79
|
-
? 'text-yellow-500 hover:text-yellow-600'
|
|
80
|
-
: 'text-gray-500 hover:text-gray-900'}"
|
|
81
|
-
/>
|
|
82
|
-
</button>
|
|
83
|
-
<button
|
|
84
|
-
class:hidden={!showMarkAsImportant}
|
|
85
|
-
onclick={(e) => {
|
|
86
|
-
toggelImportant?.(id);
|
|
87
|
-
}}
|
|
88
|
-
aria-label="Click to mark this email as important"
|
|
89
|
-
>
|
|
90
|
-
<IconifyIcon
|
|
91
|
-
style="font-size: 18px"
|
|
92
|
-
icon={isImportant ? 'ic:outline-bookmark' : 'solar:bookmark-broken'}
|
|
93
|
-
class="flex justify-center transition-colors {isImportant
|
|
94
|
-
? 'text-yellow-500 hover:text-yellow-600'
|
|
95
|
-
: 'text-gray-500 hover:text-gray-900'}"
|
|
96
|
-
/>
|
|
97
|
-
</button>
|
|
98
|
-
</div>
|
|
99
|
-
<span class="w-56 truncate pr-2" class:font-bold={!isRead}>{sender}</span>
|
|
100
|
-
<span class="w-64 truncate" class:font-bold={!isRead}>{subject}</span>
|
|
101
|
-
<span class="mx-1">-</span>
|
|
102
|
-
</div>
|
|
103
|
-
|
|
104
|
-
<p class=" max-l truncate text-sm text-gray-600 xl:max-w-2xl 2xl:max-w-5xl">{message}</p>
|
|
105
|
-
</div>
|
|
106
|
-
<div class="flex w-32 shrink-0 items-center justify-end">
|
|
107
|
-
<span class="text-sm" class:font-bold={!isRead} class:text-gray-500={isRead}>
|
|
108
|
-
{formatDate(date)}
|
|
109
|
-
</span>
|
|
110
|
-
</div>
|
|
111
|
-
</div>
|
|
112
|
-
</div>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Checkbox } from '../../forms/checkbox/index.js';
|
|
3
|
+
import IconifyIcon from '../../ui/icons/IconifyIcon.svelte';
|
|
4
|
+
import dayjs from 'dayjs';
|
|
5
|
+
import { type MailingMessageCardProps } from './index.js';
|
|
6
|
+
|
|
7
|
+
let {
|
|
8
|
+
id = 0,
|
|
9
|
+
sender = '',
|
|
10
|
+
subject = '',
|
|
11
|
+
date,
|
|
12
|
+
message = '',
|
|
13
|
+
isStared = false,
|
|
14
|
+
isImportant = false,
|
|
15
|
+
isRead = false,
|
|
16
|
+
isChecked = false,
|
|
17
|
+
onItemChecked,
|
|
18
|
+
toggelImportant,
|
|
19
|
+
toggleFavorited,
|
|
20
|
+
onItemSelected,
|
|
21
|
+
showCheckbox = true,
|
|
22
|
+
showMarkAsFavorite = true,
|
|
23
|
+
showMarkAsImportant = true
|
|
24
|
+
}: MailingMessageCardProps = $props();
|
|
25
|
+
|
|
26
|
+
function handleClik(e: any) {
|
|
27
|
+
if (e.target.tagName !== 'INPUT' && e.target.localName !== 'iconify-icon') onItemSelected?.(id);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function formatDate(date: Date | string): string {
|
|
31
|
+
const messageDate = dayjs(date);
|
|
32
|
+
const today = dayjs();
|
|
33
|
+
|
|
34
|
+
if (messageDate.isSame(today, 'day')) {
|
|
35
|
+
return messageDate.format('HH:mm');
|
|
36
|
+
} else if (messageDate.isSame(today.subtract(1, 'day'), 'day')) {
|
|
37
|
+
return 'Yesterday';
|
|
38
|
+
} else if (messageDate.isSame(today, 'year')) {
|
|
39
|
+
return messageDate.format('MMM DD');
|
|
40
|
+
} else {
|
|
41
|
+
return messageDate.format('DD/MM/YYYY');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
</script>
|
|
45
|
+
|
|
46
|
+
<div
|
|
47
|
+
class:hover:bg-gray-200={!isChecked}
|
|
48
|
+
class="flex items-center border border-gray-300 bg-white px-2 shadow"
|
|
49
|
+
role="button"
|
|
50
|
+
tabindex="0"
|
|
51
|
+
onkeydown={handleClik}
|
|
52
|
+
onclick={handleClik}
|
|
53
|
+
>
|
|
54
|
+
{#if showCheckbox}
|
|
55
|
+
<Checkbox
|
|
56
|
+
checked={isChecked}
|
|
57
|
+
class="cursor-pointer border-2 border-gray-400 transition-colors hover:ring-4 hover:ring-gray-400 focus:ring-0"
|
|
58
|
+
onchange={(e) => {
|
|
59
|
+
const target = e.target;
|
|
60
|
+
onItemChecked?.({ checked: target.checked, id });
|
|
61
|
+
}}
|
|
62
|
+
/>
|
|
63
|
+
{/if}
|
|
64
|
+
<div class="my-1 flex w-full cursor-pointer items-center justify-between p-1">
|
|
65
|
+
<div class="flex w-full items-center">
|
|
66
|
+
<div class="flex">
|
|
67
|
+
<div class="mr-4 flex items-center gap-1 space-x-1">
|
|
68
|
+
<button
|
|
69
|
+
class:hidden={!showMarkAsFavorite}
|
|
70
|
+
onclick={(e) => {
|
|
71
|
+
toggleFavorited?.(id);
|
|
72
|
+
}}
|
|
73
|
+
aria-label="Not starred"
|
|
74
|
+
>
|
|
75
|
+
<IconifyIcon
|
|
76
|
+
style="font-size: 24px"
|
|
77
|
+
icon={isStared ? 'mdi:star' : 'mdi:star-outline'}
|
|
78
|
+
class="flex justify-center transition-colors {isStared
|
|
79
|
+
? 'text-yellow-500 hover:text-yellow-600'
|
|
80
|
+
: 'text-gray-500 hover:text-gray-900'}"
|
|
81
|
+
/>
|
|
82
|
+
</button>
|
|
83
|
+
<button
|
|
84
|
+
class:hidden={!showMarkAsImportant}
|
|
85
|
+
onclick={(e) => {
|
|
86
|
+
toggelImportant?.(id);
|
|
87
|
+
}}
|
|
88
|
+
aria-label="Click to mark this email as important"
|
|
89
|
+
>
|
|
90
|
+
<IconifyIcon
|
|
91
|
+
style="font-size: 18px"
|
|
92
|
+
icon={isImportant ? 'ic:outline-bookmark' : 'solar:bookmark-broken'}
|
|
93
|
+
class="flex justify-center transition-colors {isImportant
|
|
94
|
+
? 'text-yellow-500 hover:text-yellow-600'
|
|
95
|
+
: 'text-gray-500 hover:text-gray-900'}"
|
|
96
|
+
/>
|
|
97
|
+
</button>
|
|
98
|
+
</div>
|
|
99
|
+
<span class="w-56 truncate pr-2" class:font-bold={!isRead}>{sender}</span>
|
|
100
|
+
<span class="w-64 truncate" class:font-bold={!isRead}>{subject}</span>
|
|
101
|
+
<span class="mx-1">-</span>
|
|
102
|
+
</div>
|
|
103
|
+
|
|
104
|
+
<p class=" max-l truncate text-sm text-gray-600 xl:max-w-2xl 2xl:max-w-5xl">{message}</p>
|
|
105
|
+
</div>
|
|
106
|
+
<div class="flex w-32 shrink-0 items-center justify-end">
|
|
107
|
+
<span class="text-sm" class:font-bold={!isRead} class:text-gray-500={isRead}>
|
|
108
|
+
{formatDate(date)}
|
|
109
|
+
</span>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
@@ -1,87 +1,87 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { PageLoader } from '../../ui/pageLoader/index.js';
|
|
3
|
-
import { slide } from 'svelte/transition';
|
|
4
|
-
import type { MailingHeaderData, MailingMessageViewerProps, MailingReplyType } from './index.js';
|
|
5
|
-
import MailingHeader from './MailingHeader.svelte';
|
|
6
|
-
import { onMount } from 'svelte';
|
|
7
|
-
import toast from 'svelte-french-toast';
|
|
8
|
-
import { getInitials } from '../../index.js';
|
|
9
|
-
import MailingContent from './MailingContent.svelte';
|
|
10
|
-
|
|
11
|
-
let {
|
|
12
|
-
readMessage,
|
|
13
|
-
recordId = $bindable(0),
|
|
14
|
-
updatePageInfo,
|
|
15
|
-
showReplies = true,
|
|
16
|
-
showHeader = true
|
|
17
|
-
}: MailingMessageViewerProps = $props();
|
|
18
|
-
|
|
19
|
-
let busy = $state(true);
|
|
20
|
-
let header = $state<MailingHeaderData>({} as MailingHeaderData);
|
|
21
|
-
let inputType = $state<MailingReplyType | undefined>(undefined);
|
|
22
|
-
let content = $state('');
|
|
23
|
-
|
|
24
|
-
onMount(async () => {
|
|
25
|
-
try {
|
|
26
|
-
const ret = await readMessage(recordId);
|
|
27
|
-
if (!ret?.success) {
|
|
28
|
-
toast.error(ret?.message);
|
|
29
|
-
recordId = 0;
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
updatePageInfo?.({
|
|
33
|
-
currentPage: 1,
|
|
34
|
-
pageSize: 1,
|
|
35
|
-
totalCount: 1,
|
|
36
|
-
hasNextPage: false,
|
|
37
|
-
hasPreviousPage: false
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
const { data } = ret;
|
|
41
|
-
header = {
|
|
42
|
-
subject: data?.subject ?? '',
|
|
43
|
-
user: {
|
|
44
|
-
firstName: data?.user.firstName ?? '',
|
|
45
|
-
surname: data?.user.surname ?? '',
|
|
46
|
-
staffNumber: data?.user.staffNumber ?? '',
|
|
47
|
-
initials: `${getInitials(data?.user.firstName)}${getInitials(data?.user.surname)}`
|
|
48
|
-
},
|
|
49
|
-
to: data?.to ?? ''
|
|
50
|
-
};
|
|
51
|
-
content = data.message ?? '';
|
|
52
|
-
} catch (error: any) {
|
|
53
|
-
toast.error(error?.message || error);
|
|
54
|
-
} finally {
|
|
55
|
-
busy = false;
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
</script>
|
|
59
|
-
|
|
60
|
-
<div class="h-full w-full">
|
|
61
|
-
{#if busy}
|
|
62
|
-
<PageLoader size={50} />
|
|
63
|
-
{:else}
|
|
64
|
-
<div class="flex h-full w-full flex-col gap-2" in:slide>
|
|
65
|
-
<div class:hidden={!showHeader}>
|
|
66
|
-
<MailingHeader bind:replyType={inputType} data={header} {showReplies} />
|
|
67
|
-
</div>
|
|
68
|
-
<div class="fex-grow h-full w-full">
|
|
69
|
-
<div
|
|
70
|
-
class:h-[71vh]={inputType}
|
|
71
|
-
class:h-full={!inputType}
|
|
72
|
-
class="flex w-full flex-col gap-4"
|
|
73
|
-
>
|
|
74
|
-
<div class="custom-scrollbar h-full flex-grow overflow-y-auto bg-white p-4">
|
|
75
|
-
<MailingContent {content} />
|
|
76
|
-
</div>
|
|
77
|
-
<div class="h-modal p-4 pt-2" class:hidden={!Boolean(inputType) || !showReplies}>
|
|
78
|
-
<div class=" rounded-md bg-white p-4">
|
|
79
|
-
Reply
|
|
80
|
-
<!-- <Reply {inputType} /> -->
|
|
81
|
-
</div>
|
|
82
|
-
</div>
|
|
83
|
-
</div>
|
|
84
|
-
</div>
|
|
85
|
-
</div>
|
|
86
|
-
{/if}
|
|
87
|
-
</div>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { PageLoader } from '../../ui/pageLoader/index.js';
|
|
3
|
+
import { slide } from 'svelte/transition';
|
|
4
|
+
import type { MailingHeaderData, MailingMessageViewerProps, MailingReplyType } from './index.js';
|
|
5
|
+
import MailingHeader from './MailingHeader.svelte';
|
|
6
|
+
import { onMount } from 'svelte';
|
|
7
|
+
import toast from 'svelte-french-toast';
|
|
8
|
+
import { getInitials } from '../../index.js';
|
|
9
|
+
import MailingContent from './MailingContent.svelte';
|
|
10
|
+
|
|
11
|
+
let {
|
|
12
|
+
readMessage,
|
|
13
|
+
recordId = $bindable(0),
|
|
14
|
+
updatePageInfo,
|
|
15
|
+
showReplies = true,
|
|
16
|
+
showHeader = true
|
|
17
|
+
}: MailingMessageViewerProps = $props();
|
|
18
|
+
|
|
19
|
+
let busy = $state(true);
|
|
20
|
+
let header = $state<MailingHeaderData>({} as MailingHeaderData);
|
|
21
|
+
let inputType = $state<MailingReplyType | undefined>(undefined);
|
|
22
|
+
let content = $state('');
|
|
23
|
+
|
|
24
|
+
onMount(async () => {
|
|
25
|
+
try {
|
|
26
|
+
const ret = await readMessage(recordId);
|
|
27
|
+
if (!ret?.success) {
|
|
28
|
+
toast.error(ret?.message);
|
|
29
|
+
recordId = 0;
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
updatePageInfo?.({
|
|
33
|
+
currentPage: 1,
|
|
34
|
+
pageSize: 1,
|
|
35
|
+
totalCount: 1,
|
|
36
|
+
hasNextPage: false,
|
|
37
|
+
hasPreviousPage: false
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const { data } = ret;
|
|
41
|
+
header = {
|
|
42
|
+
subject: data?.subject ?? '',
|
|
43
|
+
user: {
|
|
44
|
+
firstName: data?.user.firstName ?? '',
|
|
45
|
+
surname: data?.user.surname ?? '',
|
|
46
|
+
staffNumber: data?.user.staffNumber ?? '',
|
|
47
|
+
initials: `${getInitials(data?.user.firstName)}${getInitials(data?.user.surname)}`
|
|
48
|
+
},
|
|
49
|
+
to: data?.to ?? ''
|
|
50
|
+
};
|
|
51
|
+
content = data.message ?? '';
|
|
52
|
+
} catch (error: any) {
|
|
53
|
+
toast.error(error?.message || error);
|
|
54
|
+
} finally {
|
|
55
|
+
busy = false;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
</script>
|
|
59
|
+
|
|
60
|
+
<div class="h-full w-full">
|
|
61
|
+
{#if busy}
|
|
62
|
+
<PageLoader size={50} />
|
|
63
|
+
{:else}
|
|
64
|
+
<div class="flex h-full w-full flex-col gap-2" in:slide>
|
|
65
|
+
<div class:hidden={!showHeader}>
|
|
66
|
+
<MailingHeader bind:replyType={inputType} data={header} {showReplies} />
|
|
67
|
+
</div>
|
|
68
|
+
<div class="fex-grow h-full w-full">
|
|
69
|
+
<div
|
|
70
|
+
class:h-[71vh]={inputType}
|
|
71
|
+
class:h-full={!inputType}
|
|
72
|
+
class="flex w-full flex-col gap-4"
|
|
73
|
+
>
|
|
74
|
+
<div class="custom-scrollbar h-full flex-grow overflow-y-auto bg-white p-4">
|
|
75
|
+
<MailingContent {content} />
|
|
76
|
+
</div>
|
|
77
|
+
<div class="h-modal p-4 pt-2" class:hidden={!Boolean(inputType) || !showReplies}>
|
|
78
|
+
<div class=" rounded-md bg-white p-4">
|
|
79
|
+
Reply
|
|
80
|
+
<!-- <Reply {inputType} /> -->
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
{/if}
|
|
87
|
+
</div>
|