+
+
+
+ {{ activity.owner_name }}
+
+ {{ __('added a') }}
+
+ {{ __('comment') }}
+
+
+
+
+
+ {{ __(timeAgo(activity.creation)) }}
+
+
-
+
+
+
+ {{
+ activity.type == 'Incoming'
+ ? __('Inbound Call')
+ : __('Outbound Call')
+ }}
+
+
+
+
+ {{ __(timeAgo(activity.creation)) }}
+
+
+
+
+
+
+
+
{{ __('Duration') }}
+
+ {{ activity.duration }}
+
+
+
+
+
{{
- activity.type == 'Incoming'
- ? __('Inbound Call')
- : __('Outbound Call')
+ activity.show_recording
+ ? __('Hide Recording')
+ : __('Listen to Call')
}}
-
-
-
- {{ __(timeAgo(activity.creation)) }}
-
-
-
-
-
-
-
{{ __('Duration') }}
-
- {{ activity.duration }}
-
-
-
-
-
- {{
- activity.show_recording
- ? __('Hide Recording')
- : __('Listen to Call')
- }}
-
-
-
-
-
-
-
-
-
- {{ __(activity.caller.label) }}
-
-
- {{ activity.from }}
-
-
-
-
+
+
+
+
-
-
-
-
- {{ __(activity.receiver.label) }}
-
-
- {{ activity.to }}
-
+
+
+ {{ __(activity.caller.label) }}
+
+
+ {{ activity.from }}
+
+
+
+
+
+
+
+
+ {{ __(activity.receiver.label) }}
+
+
+ {{ activity.to }}
-
-
-
-
- {{ activity.owner_name }}
-
- {{ __(activity.type) }}
+
+
+
+
+
+ {{ activity.owner_name }}
+
+
{{ __(activity.type) }}
+
+ {{ __(activity.data.field_label) }}
+
+
{{ __(activity.value) }}
+
+
+
+ {{ getUser(activity.data.old_value).full_name }}
+
+
+ {{ activity.data.old_value }}
+
+
+
{{ __('to') }}
+
+
+
+ {{ getUser(activity.data.value).full_name }}
+
+
+ {{ activity.data.value }}
+
+
+
+
+
+
+
+ {{ __(timeAgo(activity.creation)) }}
+
+
+
+
+
+
+
{{ __(activity.data.field_label) }}
- {{ __(activity.value) }}
+
+
+
+ {{
+ startCase(__(activity.type))
+ }}
-
-
-
-
- {{ __(timeAgo(activity.creation)) }}
-
-
-
-
+
+
+ {{ __(timeAgo(activity.creation)) }}
+
+
+
+
+
+
-
-
-
- {{ __(activity.data.field_label) }}
-
-
-
-
-
{{
- startCase(__(activity.type))
- }}
-
-
-
- {{ getUser(activity.data.old_value).full_name }}
-
-
- {{ activity.data.old_value }}
-
-
-
{{ __('to') }}
-
-
-
- {{ getUser(activity.data.value).full_name }}
-
-
- {{ activity.data.value }}
-
-
-
-
-
-
-
-
- {{ __(timeAgo(activity.creation)) }}
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
@@ -891,6 +882,7 @@
/>
diff --git a/frontend/src/components/EmailContent.vue b/frontend/src/components/EmailContent.vue
new file mode 100644
index 00000000..edade130
--- /dev/null
+++ b/frontend/src/components/EmailContent.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
diff --git a/frontend/src/components/EmailEditor.vue b/frontend/src/components/EmailEditor.vue
index b27e0eb1..d60baaf1 100644
--- a/frontend/src/components/EmailEditor.vue
+++ b/frontend/src/components/EmailEditor.vue
@@ -62,7 +62,7 @@
diff --git a/frontend/src/components/FadedScrollableDiv.vue b/frontend/src/components/FadedScrollableDiv.vue
index 7881b28e..3cc44638 100644
--- a/frontend/src/components/FadedScrollableDiv.vue
+++ b/frontend/src/components/FadedScrollableDiv.vue
@@ -1,16 +1,21 @@
-
-
+
diff --git a/frontend/src/components/ListViews/ContactsListView.vue b/frontend/src/components/ListViews/ContactsListView.vue
index bd31ca4a..2550f76a 100644
--- a/frontend/src/components/ListViews/ContactsListView.vue
+++ b/frontend/src/components/ListViews/ContactsListView.vue
@@ -227,6 +227,8 @@ watch(pageLengthCount, (val, old_value) => {
const listBulkActionsRef = ref(null)
defineExpose({
- customListActions: listBulkActionsRef.value?.customListActions,
+ customListActions: computed(
+ () => listBulkActionsRef.value?.customListActions
+ ),
})
diff --git a/frontend/src/components/ListViews/DealsListView.vue b/frontend/src/components/ListViews/DealsListView.vue
index 94a292d4..3fd04a00 100644
--- a/frontend/src/components/ListViews/DealsListView.vue
+++ b/frontend/src/components/ListViews/DealsListView.vue
@@ -269,6 +269,8 @@ watch(pageLengthCount, (val, old_value) => {
const listBulkActionsRef = ref(null)
defineExpose({
- customListActions: listBulkActionsRef.value?.customListActions,
+ customListActions: computed(
+ () => listBulkActionsRef.value?.customListActions
+ ),
})
diff --git a/frontend/src/components/ListViews/EmailTemplatesListView.vue b/frontend/src/components/ListViews/EmailTemplatesListView.vue
index 1ab985bc..c089296c 100644
--- a/frontend/src/components/ListViews/EmailTemplatesListView.vue
+++ b/frontend/src/components/ListViews/EmailTemplatesListView.vue
@@ -219,6 +219,8 @@ watch(pageLengthCount, (val, old_value) => {
const listBulkActionsRef = ref(null)
defineExpose({
- customListActions: listBulkActionsRef.value?.customListActions,
+ customListActions: computed(
+ () => listBulkActionsRef.value?.customListActions
+ ),
})
diff --git a/frontend/src/components/ListViews/LeadsListView.vue b/frontend/src/components/ListViews/LeadsListView.vue
index fcb09702..4b701274 100644
--- a/frontend/src/components/ListViews/LeadsListView.vue
+++ b/frontend/src/components/ListViews/LeadsListView.vue
@@ -278,6 +278,8 @@ watch(pageLengthCount, (val, old_value) => {
const listBulkActionsRef = ref(null)
defineExpose({
- customListActions: listBulkActionsRef.value?.customListActions,
+ customListActions: computed(
+ () => listBulkActionsRef.value?.customListActions
+ ),
})
diff --git a/frontend/src/components/ListViews/OrganizationsListView.vue b/frontend/src/components/ListViews/OrganizationsListView.vue
index 7368c246..0fb32563 100644
--- a/frontend/src/components/ListViews/OrganizationsListView.vue
+++ b/frontend/src/components/ListViews/OrganizationsListView.vue
@@ -212,6 +212,8 @@ watch(pageLengthCount, (val, old_value) => {
const listBulkActionsRef = ref(null)
defineExpose({
- customListActions: listBulkActionsRef.value?.customListActions,
+ customListActions: computed(
+ () => listBulkActionsRef.value?.customListActions
+ ),
})
diff --git a/frontend/src/components/ListViews/TasksListView.vue b/frontend/src/components/ListViews/TasksListView.vue
index 8bb8fe78..2273697f 100644
--- a/frontend/src/components/ListViews/TasksListView.vue
+++ b/frontend/src/components/ListViews/TasksListView.vue
@@ -230,6 +230,8 @@ watch(pageLengthCount, (val, old_value) => {
const listBulkActionsRef = ref(null)
defineExpose({
- customListActions: listBulkActionsRef.value?.customListActions,
+ customListActions: computed(
+ () => listBulkActionsRef.value?.customListActions
+ ),
})
diff --git a/frontend/src/components/Modals/CallLogModal.vue b/frontend/src/components/Modals/CallLogModal.vue
index 66bd1544..903e76c2 100644
--- a/frontend/src/components/Modals/CallLogModal.vue
+++ b/frontend/src/components/Modals/CallLogModal.vue
@@ -84,7 +84,9 @@
{
+ if (!callLog.value.doc) return []
let details = [
{
icon: h(FeatherIcon, {
- name: props.callLog.type.icon,
+ name: callLog.value.doc.type.icon,
class: 'h-3.5 w-3.5',
}),
name: 'type',
- value: props.callLog.type.label + ' Call',
+ value: callLog.value.doc.type.label + ' Call',
},
{
icon: ContactsIcon,
name: 'receiver',
value: {
- receiver: props.callLog.receiver,
- caller: props.callLog.caller,
+ receiver: callLog.value.doc.receiver,
+ caller: callLog.value.doc.caller,
},
},
{
icon:
- props.callLog.reference_doctype == 'CRM Lead' ? LeadsIcon : Dealsicon,
+ callLog.value.doc.reference_doctype == 'CRM Lead'
+ ? LeadsIcon
+ : Dealsicon,
name: 'reference_doctype',
- value: props.callLog.reference_doctype == 'CRM Lead' ? 'Lead' : 'Deal',
+ value:
+ callLog.value.doc.reference_doctype == 'CRM Lead' ? 'Lead' : 'Deal',
link: () => {
- if (props.callLog.reference_doctype == 'CRM Lead') {
+ if (callLog.value.doc.reference_doctype == 'CRM Lead') {
router.push({
name: 'Lead',
- params: { leadId: props.callLog.reference_docname },
+ params: { leadId: callLog.value.doc.reference_docname },
})
} else {
router.push({
name: 'Deal',
- params: { dealId: props.callLog.reference_docname },
+ params: { dealId: callLog.value.doc.reference_docname },
})
}
},
+ condition: () => callLog.value.doc.reference_docname,
},
{
icon: CalendarIcon,
name: 'creation',
- value: props.callLog.creation.label,
- tooltip: props.callLog.creation.label,
+ value: callLog.value.doc.creation.label,
+ tooltip: callLog.value.doc.creation.label,
},
{
icon: DurationIcon,
name: 'duration',
- value: props.callLog.duration.label,
+ value: callLog.value.doc.duration.label,
},
{
icon: CheckCircleIcon,
name: 'status',
- value: props.callLog.status.label,
- color: props.callLog.status.color,
+ value: callLog.value.doc.status.label,
+ color: callLog.value.doc.status.color,
},
{
icon: h(FeatherIcon, {
@@ -191,7 +200,7 @@ const detailFields = computed(() => {
class: 'h-4 w-4 mt-2',
}),
name: 'recording_url',
- value: props.callLog.recording_url,
+ value: callLog.value.doc.recording_url,
},
{
icon: NoteIcon,
@@ -200,12 +209,14 @@ const detailFields = computed(() => {
},
]
- return details.filter((detail) => detail.value)
+ return details
+ .filter((detail) => detail.value)
+ .filter((detail) => (detail.condition ? detail.condition() : true))
})
function createLead() {
call('crm.fcrm.doctype.crm_call_log.crm_call_log.create_lead_from_call_log', {
- call_log: props.callLog,
+ call_log: callLog.value.doc,
}).then((d) => {
if (d) {
router.push({ name: 'Lead', params: { leadId: d } })
@@ -215,12 +226,45 @@ function createLead() {
watch(show, (val) => {
if (val) {
- callNoteDoc.value = createDocumentResource({
- doctype: 'FCRM Note',
- name: props.callLog.note,
- fields: ['title', 'content'],
- cache: ['note', props.callLog.note],
+ callLog.value = createDocumentResource({
+ doctype: 'CRM Call Log',
+ name: props.name,
+ fields: [
+ 'name',
+ 'caller',
+ 'receiver',
+ 'duration',
+ 'type',
+ 'status',
+ 'from',
+ 'to',
+ 'note',
+ 'recording_url',
+ 'reference_doctype',
+ 'reference_docname',
+ 'creation',
+ ],
+ cache: ['call_log', props.name],
auto: true,
+ transform: (doc) => {
+ for (const key in doc) {
+ doc[key] = getCallLogDetail(key, doc)
+ }
+ return doc
+ },
+ onSuccess: (doc) => {
+ if (!doc.note) {
+ callNoteDoc.value = null
+ return
+ }
+ callNoteDoc.value = createDocumentResource({
+ doctype: 'FCRM Note',
+ name: doc.note,
+ fields: ['title', 'content'],
+ cache: ['note', doc.note],
+ auto: true,
+ })
+ },
})
}
})
diff --git a/frontend/src/components/Modals/EmailTemplateModal.vue b/frontend/src/components/Modals/EmailTemplateModal.vue
index 2cee3742..21702957 100644
--- a/frontend/src/components/Modals/EmailTemplateModal.vue
+++ b/frontend/src/components/Modals/EmailTemplateModal.vue
@@ -55,19 +55,40 @@
{{ __('Content') }}
*
+
(_emailTemplate.response = val)"
- :placeholder="__('Dear {{ lead_name }}, \n\nThis is a reminder for the payment of {{ grand_total }}. \n\nThanks, \nFrappé')"
+ :placeholder="
+ __(
+ 'Dear {{ lead_name }}, \n\nThis is a reminder for the payment of {{ grand_total }}. \n\nThanks, \nFrappé'
+ )
+ "
/>
+
+
+
diff --git a/frontend/src/components/Modals/EmailTemplateSelectorModal.vue b/frontend/src/components/Modals/EmailTemplateSelectorModal.vue
index 2538e7f7..fb414880 100644
--- a/frontend/src/components/Modals/EmailTemplateSelectorModal.vue
+++ b/frontend/src/components/Modals/EmailTemplateSelectorModal.vue
@@ -31,7 +31,14 @@
{{ __('Subject: {0}', [template.subject]) }}
+
+
+
+ updateFilter(filter, data)"
+ />
+ updateFilter(filter, v)"
+ :placeholder="filter.label"
+ />
+
+
+
diff --git a/frontend/src/components/ViewControls.vue b/frontend/src/components/ViewControls.vue
index 9d613b96..092af867 100644
--- a/frontend/src/components/ViewControls.vue
+++ b/frontend/src/components/ViewControls.vue
@@ -96,44 +96,9 @@
:key="filter.name"
class="m-1 min-w-36"
>
-
-
- applyQuickFilter(filter, data)"
- />
- applyQuickFilter(filter, v)"
- :placeholder="filter.label"
- />
- applyQuickFilter(f, v)"
/>
@@ -247,9 +212,7 @@
diff --git a/frontend/src/pages/EmailTemplates.vue b/frontend/src/pages/EmailTemplates.vue
index 4cbb701b..71e41fee 100644
--- a/frontend/src/pages/EmailTemplates.vue
+++ b/frontend/src/pages/EmailTemplates.vue
@@ -114,8 +114,10 @@ const showEmailTemplateModal = ref(false)
const emailTemplate = ref({
subject: '',
response: '',
+ response_html: '',
name: '',
enabled: 1,
+ use_html: 0,
owner: '',
reference_doctype: 'CRM Deal',
})
@@ -125,8 +127,10 @@ function showEmailTemplate(name) {
emailTemplate.value = {
subject: et.subject,
response: et.response,
+ response_html: et.response_html,
name: et.name,
enabled: et.enabled,
+ use_html: et.use_html,
owner: et.owner,
reference_doctype: et.reference_doctype,
}
diff --git a/frontend/src/utils/callLog.js b/frontend/src/utils/callLog.js
new file mode 100644
index 00000000..9b8ad118
--- /dev/null
+++ b/frontend/src/utils/callLog.js
@@ -0,0 +1,84 @@
+import {
+ secondsToDuration,
+ dateFormat,
+ dateTooltipFormat,
+ timeAgo,
+} from '@/utils'
+import { usersStore } from '@/stores/users'
+import { contactsStore } from '@/stores/contacts'
+
+const { getUser } = usersStore()
+const { getContact, getLeadContact } = contactsStore()
+
+export function getCallLogDetail(row, log) {
+ let incoming = log.type === 'Incoming'
+
+ if (row === 'caller') {
+ return {
+ label: incoming
+ ? getContact(log.from)?.full_name ||
+ getLeadContact(log.from)?.full_name ||
+ 'Unknown'
+ : getUser(log.caller).full_name,
+ image: incoming
+ ? getContact(log.from)?.image || getLeadContact(log.from)?.image
+ : getUser(log.caller).user_image,
+ }
+ } else if (row === 'receiver') {
+ return {
+ label: incoming
+ ? getUser(log.receiver).full_name
+ : getContact(log.to)?.full_name ||
+ getLeadContact(log.to)?.full_name ||
+ 'Unknown',
+ image: incoming
+ ? getUser(log.receiver).user_image
+ : getContact(log.to)?.image || getLeadContact(log.to)?.image,
+ }
+ } else if (row === 'duration') {
+ return {
+ label: secondsToDuration(log.duration),
+ icon: 'clock',
+ }
+ } else if (row === 'type') {
+ return {
+ label: log.type,
+ icon: incoming ? 'phone-incoming' : 'phone-outgoing',
+ }
+ } else if (row === 'status') {
+ return {
+ label: statusLabelMap[log.status],
+ color: statusColorMap[log.status],
+ }
+ } else if (['modified', 'creation'].includes(row)) {
+ return {
+ label: dateFormat(log[row], dateTooltipFormat),
+ timeAgo: __(timeAgo(log[row])),
+ }
+ }
+ return log[row]
+}
+
+export const statusLabelMap = {
+ Completed: 'Completed',
+ Initiated: 'Initiated',
+ Busy: 'Declined',
+ Failed: 'Failed',
+ Queued: 'Queued',
+ Cancelled: 'Cancelled',
+ Ringing: 'Ringing',
+ 'No Answer': 'Missed Call',
+ 'In Progress': 'In Progress',
+}
+
+export const statusColorMap = {
+ Completed: 'green',
+ Busy: 'orange',
+ Failed: 'red',
+ Initiated: 'gray',
+ Queued: 'gray',
+ Cancelled: 'gray',
+ Ringing: 'gray',
+ 'No Answer': 'red',
+ 'In Progress': 'blue',
+}
diff --git a/frontend/src/utils/dialogs.js b/frontend/src/utils/dialogs.js
deleted file mode 100644
index 9efdde3b..00000000
--- a/frontend/src/utils/dialogs.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import { Dialog, ErrorMessage } from 'frappe-ui'
-import { h, reactive, ref } from 'vue'
-
-let dialogs = ref([])
-
-export let Dialogs = {
- name: 'Dialogs',
- render() {
- return dialogs.value.map((dialog) => {
- return h(
- Dialog,
- {
- options: dialog,
- modelValue: dialog.show,
- 'onUpdate:modelValue': (val) => (dialog.show = val),
- },
- () => [
- h('p', { class: 'text-p-base text-gray-700' }, dialog.message),
- h(ErrorMessage, { class: 'mt-2', message: dialog.error }),
- ]
- )
- })
- },
-}
-
-export function createDialog(options) {
- let dialog = reactive(options)
- dialog.key = `dialog-${Math.random().toString(36).slice(2, 9)}`
- dialogs.value.push(dialog)
- dialog.show = true
-}
diff --git a/frontend/src/utils/dialogs.jsx b/frontend/src/utils/dialogs.jsx
new file mode 100644
index 00000000..11836e22
--- /dev/null
+++ b/frontend/src/utils/dialogs.jsx
@@ -0,0 +1,41 @@
+import { Dialog, ErrorMessage } from 'frappe-ui'
+import { reactive, ref } from 'vue'
+
+let dialogs = ref([])
+
+export let Dialogs = {
+ name: 'Dialogs',
+ render() {
+ return dialogs.value.map((dialog) => (
+
(dialog.show = val)}
+ >
+ {{
+ 'body-content': () => {
+ return [
+ dialog.message && (
+ {dialog.message}
+ ),
+ dialog.html && (
+
+ ),
+ ,
+ ]
+ },
+ }}
+
+ ))
+ },
+}
+
+export function createDialog(dialogOptions) {
+ let dialog = reactive(dialogOptions)
+ dialog.key = 'dialog-' + dialogs.value.length
+ dialog.show = false
+ setTimeout(() => {
+ dialog.show = true
+ }, 0)
+ dialogs.value.push(dialog)
+}
diff --git a/frontend/src/utils/index.js b/frontend/src/utils/index.js
index 0c3f389e..1cd66c1c 100644
--- a/frontend/src/utils/index.js
+++ b/frontend/src/utils/index.js
@@ -125,19 +125,56 @@ export function setupAssignees(data) {
}))
}
+function getActionsFromScript(script, obj) {
+ let scriptFn = new Function(script + '\nreturn setupForm')()
+ let formScript = scriptFn(obj)
+ return formScript?.actions || []
+}
+
export function setupCustomActions(data, obj) {
if (!data._form_script) return []
- let script = new Function(data._form_script + '\nreturn setupForm')()
- let formScript = script(obj)
- data._customActions = formScript?.actions || []
+
+ let actions = []
+ if (Array.isArray(data._form_script)) {
+ data._form_script.forEach((script) => {
+ actions = actions.concat(getActionsFromScript(script, obj))
+ })
+ } else {
+ actions = getActionsFromScript(data._form_script, obj)
+ }
+
+ data._customActions = actions
+}
+
+function getActionsFromListScript(script, obj) {
+ let scriptFn = new Function(script + '\nreturn setupList')()
+ let listScript = scriptFn(obj)
+ return {
+ actions: listScript?.actions || [],
+ bulk_actions: listScript?.bulk_actions || [],
+ }
}
export function setupListActions(data, obj = {}) {
if (!data.list_script) return []
- let script = new Function(data.list_script + '\nreturn setupList')()
- let listScript = script(obj)
- data.listActions = listScript?.actions || []
- data.bulkActions = listScript?.bulk_actions || []
+
+ let actions = []
+ let bulkActions = []
+
+ if (Array.isArray(data.list_script)) {
+ data.list_script.forEach((script) => {
+ let _actions = getActionsFromListScript(script, obj)
+ actions = actions.concat(_actions.actions)
+ bulkActions = bulkActions.concat(_actions.bulk_actions)
+ })
+ } else {
+ let _actions = getActionsFromListScript(data.list_script, obj)
+ actions = _actions.actions
+ bulkActions = _actions.bulk_actions
+ }
+
+ data.listActions = actions
+ data.bulkActions = bulkActions
}
export function errorMessage(title, message) {
diff --git a/frontend/vite.config.js b/frontend/vite.config.js
index e2b09017..acc963c0 100644
--- a/frontend/vite.config.js
+++ b/frontend/vite.config.js
@@ -1,5 +1,6 @@
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
+import vueJsx from '@vitejs/plugin-vue-jsx'
import path from 'path'
import frappeui from 'frappe-ui/vite'
import { VitePWA } from 'vite-plugin-pwa'
@@ -13,6 +14,7 @@ export default defineConfig({
propsDestructure: true,
},
}),
+ vueJsx(),
VitePWA({
registerType: 'autoUpdate',
devOptions: {
diff --git a/yarn.lock b/yarn.lock
index 0d970e8a..041c3b84 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -29,7 +29,7 @@
jsonpointer "^5.0.0"
leven "^3.1.0"
-"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.24.6":
+"@babel/code-frame@^7.10.4", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.6":
version "7.24.6"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.6.tgz#ab88da19344445c3d8889af2216606d3329f3ef2"
integrity sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==
@@ -42,7 +42,7 @@
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.6.tgz#b3600217688cabb26e25f8e467019e66d71b7ae2"
integrity sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==
-"@babel/core@^7.11.1":
+"@babel/core@^7.11.1", "@babel/core@^7.23.3":
version "7.24.6"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.6.tgz#8650e0e4b03589ebe886c4e4a60398db0a7ec787"
integrity sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==
@@ -167,6 +167,13 @@
dependencies:
"@babel/types" "^7.24.6"
+"@babel/helper-module-imports@~7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0"
+ integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==
+ dependencies:
+ "@babel/types" "^7.22.15"
+
"@babel/helper-module-transforms@^7.24.6":
version "7.24.6"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz#22346ed9df44ce84dee850d7433c5b73fab1fe4e"
@@ -276,7 +283,7 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88"
integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==
-"@babel/parser@^7.24.6":
+"@babel/parser@^7.24.4", "@babel/parser@^7.24.6":
version "7.24.6"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.6.tgz#5e030f440c3c6c78d195528c3b688b101a365328"
integrity sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==
@@ -381,6 +388,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
+"@babel/plugin-syntax-jsx@^7.23.3":
+ version "7.24.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.6.tgz#bcca2964150437f88f65e3679e3d68762287b9c8"
+ integrity sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.6"
+
"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
@@ -437,6 +451,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
+"@babel/plugin-syntax-typescript@^7.24.6":
+ version "7.24.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.6.tgz#769daf2982d60308bc83d8936eaecb7582463c87"
+ integrity sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.24.6"
+
"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357"
@@ -801,6 +822,16 @@
dependencies:
"@babel/helper-plugin-utils" "^7.24.6"
+"@babel/plugin-transform-typescript@^7.23.3":
+ version "7.24.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.6.tgz#339c6127a783c32e28a5b591e6c666f899b57db0"
+ integrity sha512-H0i+hDLmaYYSt6KU9cZE0gb3Cbssa/oxWis7PX4ofQzbvsfix9Lbh8SRk7LCPDlLWJHUiFeHU0qRRpF/4Zv7mQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.24.6"
+ "@babel/helper-create-class-features-plugin" "^7.24.6"
+ "@babel/helper-plugin-utils" "^7.24.6"
+ "@babel/plugin-syntax-typescript" "^7.24.6"
+
"@babel/plugin-transform-unicode-escapes@^7.24.6":
version "7.24.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz#c8ddca8fd5bacece837a4e27bd3b7ed64580d1a8"
@@ -940,7 +971,7 @@
dependencies:
regenerator-runtime "^0.14.0"
-"@babel/template@^7.24.6":
+"@babel/template@^7.23.9", "@babel/template@^7.24.6":
version "7.24.6"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.6.tgz#048c347b2787a6072b24c723664c8d02b67a44f9"
integrity sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==
@@ -949,7 +980,7 @@
"@babel/parser" "^7.24.6"
"@babel/types" "^7.24.6"
-"@babel/traverse@^7.24.6":
+"@babel/traverse@^7.23.9", "@babel/traverse@^7.24.6":
version "7.24.6"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.6.tgz#0941ec50cdeaeacad0911eb67ae227a4f8424edc"
integrity sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==
@@ -965,7 +996,7 @@
debug "^4.3.1"
globals "^11.1.0"
-"@babel/types@^7.24.6", "@babel/types@^7.4.4":
+"@babel/types@^7.22.15", "@babel/types@^7.23.9", "@babel/types@^7.24.6", "@babel/types@^7.4.4":
version "7.24.6"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.6.tgz#ba4e1f59870c10dc2fa95a274ac4feec23b21912"
integrity sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==
@@ -1975,11 +2006,53 @@
resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz#f066abfcd1cbe66267cdbbf0de010d8a41b41597"
integrity sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==
+"@vitejs/plugin-vue-jsx@^3.0.1":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.1.0.tgz#9953fd9456539e1f0f253bf0fcd1289e66c67cd1"
+ integrity sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==
+ dependencies:
+ "@babel/core" "^7.23.3"
+ "@babel/plugin-transform-typescript" "^7.23.3"
+ "@vue/babel-plugin-jsx" "^1.1.5"
+
"@vitejs/plugin-vue@^4.0.0", "@vitejs/plugin-vue@^4.2.3":
version "4.6.2"
resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz#057d2ded94c4e71b94e9814f92dcd9306317aa46"
integrity sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==
+"@vue/babel-helper-vue-transform-on@1.2.2":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.2.tgz#7f1f817a4f00ad531651a8d1d22e22d9e42807ef"
+ integrity sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw==
+
+"@vue/babel-plugin-jsx@^1.1.5":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.2.tgz#eb426fb4660aa510bb8d188ff0ec140405a97d8a"
+ integrity sha512-nYTkZUVTu4nhP199UoORePsql0l+wj7v/oyQjtThUVhJl1U+6qHuoVhIvR3bf7eVKjbCK+Cs2AWd7mi9Mpz9rA==
+ dependencies:
+ "@babel/helper-module-imports" "~7.22.15"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-jsx" "^7.23.3"
+ "@babel/template" "^7.23.9"
+ "@babel/traverse" "^7.23.9"
+ "@babel/types" "^7.23.9"
+ "@vue/babel-helper-vue-transform-on" "1.2.2"
+ "@vue/babel-plugin-resolve-type" "1.2.2"
+ camelcase "^6.3.0"
+ html-tags "^3.3.1"
+ svg-tags "^1.0.0"
+
+"@vue/babel-plugin-resolve-type@1.2.2":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.2.tgz#66844898561da6449e0f4a261b0c875118e0707b"
+ integrity sha512-EntyroPwNg5IPVdUJupqs0CFzuf6lUrVvCspmv2J1FITLeGnUCuoGNNk78dgCusxEiYj6RMkTJflGSxk5aIC4A==
+ dependencies:
+ "@babel/code-frame" "^7.23.5"
+ "@babel/helper-module-imports" "~7.22.15"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/parser" "^7.23.9"
+ "@vue/compiler-sfc" "^3.4.15"
+
"@vue/compiler-core@3.4.21":
version "3.4.21"
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz#868b7085378fc24e58c9aed14c8d62110a62be1a"
@@ -1991,6 +2064,17 @@
estree-walker "^2.0.2"
source-map-js "^1.0.2"
+"@vue/compiler-core@3.4.27":
+ version "3.4.27"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.27.tgz#e69060f4b61429fe57976aa5872cfa21389e4d91"
+ integrity sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==
+ dependencies:
+ "@babel/parser" "^7.24.4"
+ "@vue/shared" "3.4.27"
+ entities "^4.5.0"
+ estree-walker "^2.0.2"
+ source-map-js "^1.2.0"
+
"@vue/compiler-dom@3.4.21":
version "3.4.21"
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz#0077c355e2008207283a5a87d510330d22546803"
@@ -1999,6 +2083,14 @@
"@vue/compiler-core" "3.4.21"
"@vue/shared" "3.4.21"
+"@vue/compiler-dom@3.4.27":
+ version "3.4.27"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz#d51d35f40d00ce235d7afc6ad8b09dfd92b1cc1c"
+ integrity sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==
+ dependencies:
+ "@vue/compiler-core" "3.4.27"
+ "@vue/shared" "3.4.27"
+
"@vue/compiler-sfc@3.4.21":
version "3.4.21"
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz#4af920dc31ab99e1ff5d152b5fe0ad12181145b2"
@@ -2014,6 +2106,21 @@
postcss "^8.4.35"
source-map-js "^1.0.2"
+"@vue/compiler-sfc@^3.4.15":
+ version "3.4.27"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz#399cac1b75c6737bf5440dc9cf3c385bb2959701"
+ integrity sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==
+ dependencies:
+ "@babel/parser" "^7.24.4"
+ "@vue/compiler-core" "3.4.27"
+ "@vue/compiler-dom" "3.4.27"
+ "@vue/compiler-ssr" "3.4.27"
+ "@vue/shared" "3.4.27"
+ estree-walker "^2.0.2"
+ magic-string "^0.30.10"
+ postcss "^8.4.38"
+ source-map-js "^1.2.0"
+
"@vue/compiler-ssr@3.4.21":
version "3.4.21"
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz#b84ae64fb9c265df21fc67f7624587673d324fef"
@@ -2022,6 +2129,14 @@
"@vue/compiler-dom" "3.4.21"
"@vue/shared" "3.4.21"
+"@vue/compiler-ssr@3.4.27":
+ version "3.4.27"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz#2a8ecfef1cf448b09be633901a9c020360472e3d"
+ integrity sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==
+ dependencies:
+ "@vue/compiler-dom" "3.4.27"
+ "@vue/shared" "3.4.27"
+
"@vue/devtools-api@^6.5.0", "@vue/devtools-api@^6.5.1":
version "6.6.1"
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.1.tgz#7c14346383751d9f6ad4bea0963245b30220ef83"
@@ -2064,6 +2179,11 @@
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.21.tgz#de526a9059d0a599f0b429af7037cd0c3ed7d5a1"
integrity sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==
+"@vue/shared@3.4.27":
+ version "3.4.27"
+ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.27.tgz#f05e3cd107d157354bb4ae7a7b5fc9cf73c63b50"
+ integrity sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==
+
"@vueuse/core@10.9.0", "@vueuse/core@^10.3.0", "@vueuse/core@^10.4.1", "@vueuse/core@^10.5.0":
version "10.9.0"
resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.9.0.tgz#7d779a95cf0189de176fee63cee4ba44b3c85d64"
@@ -2372,6 +2492,11 @@ camelcase-css@^2.0.1:
resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
+camelcase@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599:
version "1.0.30001607"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001607.tgz#b91e8e033f6bca4e13d3d45388d87fa88931d9a5"
@@ -3425,6 +3550,11 @@ html-encoding-sniffer@^3.0.0:
dependencies:
whatwg-encoding "^2.0.0"
+html-tags@^3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce"
+ integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==
+
http-proxy-agent@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43"
@@ -3970,6 +4100,13 @@ magic-string@^0.25.0, magic-string@^0.25.7:
dependencies:
sourcemap-codec "^1.4.8"
+magic-string@^0.30.10:
+ version "0.30.10"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e"
+ integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.4.15"
+
magic-string@^0.30.7:
version "0.30.9"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.9.tgz#8927ae21bfdd856310e07a1bc8dd5e73cb6c251d"
@@ -5251,6 +5388,11 @@ supports-preserve-symlinks-flag@^1.0.0:
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+svg-tags@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
+ integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==
+
symbol-tree@^3.2.4:
version "3.2.4"
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"