Merge branch 'release/4.9.1'
This commit is contained in:
@@ -1 +1 @@
|
|||||||
4.8.0
|
4.9.1
|
||||||
|
|||||||
@@ -171,7 +171,10 @@ const onPaste = e => {
|
|||||||
const files = e.clipboardData?.files;
|
const files = e.clipboardData?.files;
|
||||||
if (!files?.length) return;
|
if (!files?.length) return;
|
||||||
|
|
||||||
Array.from(files).forEach(file => {
|
// Filter valid files (non-zero size)
|
||||||
|
Array.from(files)
|
||||||
|
.filter(file => file.size > 0)
|
||||||
|
.forEach(file => {
|
||||||
const { name, type, size } = file;
|
const { name, type, size } = file;
|
||||||
onFileUpload({ file, name, type, size });
|
onFileUpload({ file, name, type, size });
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -676,11 +676,18 @@ function createEditorView() {
|
|||||||
typingIndicator.stop();
|
typingIndicator.stop();
|
||||||
emit('blur');
|
emit('blur');
|
||||||
},
|
},
|
||||||
paste: (_view, event) => {
|
paste: (view, event) => {
|
||||||
if (props.disabled) return;
|
if (props.disabled) return;
|
||||||
const data = event.clipboardData.files;
|
const { files } = event.clipboardData;
|
||||||
if (data.length > 0) {
|
if (!files.length) return;
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
// Paste text content alongside files (e.g., spreadsheet data from Numbers app)
|
||||||
|
// Numbers app includes invalid 0-byte attachments with text, so we paste the text here
|
||||||
|
// while ReplyBox filters and handles valid file attachments
|
||||||
|
const text = event.clipboardData.getData('text/plain');
|
||||||
|
if (text) {
|
||||||
|
view.dispatch(view.state.tr.insertText(text));
|
||||||
|
emitOnChange();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -692,19 +692,19 @@ export default {
|
|||||||
},
|
},
|
||||||
onPaste(e) {
|
onPaste(e) {
|
||||||
// Don't handle paste if compose new conversation modal is open
|
// Don't handle paste if compose new conversation modal is open
|
||||||
if (this.newConversationModalActive) {
|
if (this.newConversationModalActive) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
const data = e.clipboardData.files;
|
const data = e.clipboardData.files;
|
||||||
if (!this.showRichContentEditor && data.length !== 0) {
|
if (!this.showRichContentEditor && data.length !== 0) {
|
||||||
this.$refs.messageInput?.$el?.blur();
|
this.$refs.messageInput?.$el?.blur();
|
||||||
}
|
}
|
||||||
if (!data.length || !data[0]) {
|
|
||||||
return;
|
// Filter valid files (non-zero size)
|
||||||
}
|
Array.from(e.clipboardData.files)
|
||||||
data.forEach(file => {
|
.filter(file => file.size > 0)
|
||||||
|
.forEach(file => {
|
||||||
const { name, type, size } = file;
|
const { name, type, size } = file;
|
||||||
this.onFileUpload({ name, type, size, file: file });
|
this.onFileUpload({ name, type, size, file });
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
toggleUserMention(currentMentionState) {
|
toggleUserMention(currentMentionState) {
|
||||||
|
|||||||
@@ -150,8 +150,6 @@ const derivedAttributes = computed(() =>
|
|||||||
<SettingsLayout
|
<SettingsLayout
|
||||||
:is-loading="uiFlags.isFetching"
|
:is-loading="uiFlags.isFetching"
|
||||||
:loading-message="$t('ATTRIBUTES_MGMT.LOADING')"
|
:loading-message="$t('ATTRIBUTES_MGMT.LOADING')"
|
||||||
:no-records-found="!attributes.length"
|
|
||||||
:no-records-message="$t('ATTRIBUTES_MGMT.LIST.EMPTY_RESULT.404')"
|
|
||||||
>
|
>
|
||||||
<template #header>
|
<template #header>
|
||||||
<BaseSettingsHeader
|
<BaseSettingsHeader
|
||||||
@@ -177,7 +175,7 @@ const derivedAttributes = computed(() =>
|
|||||||
class="max-w-xl"
|
class="max-w-xl"
|
||||||
@tab-changed="onClickTabChange"
|
@tab-changed="onClickTabChange"
|
||||||
/>
|
/>
|
||||||
<div class="grid gap-3">
|
<div v-if="derivedAttributes.length" class="grid gap-3">
|
||||||
<AttributeListItem
|
<AttributeListItem
|
||||||
v-for="attribute in derivedAttributes"
|
v-for="attribute in derivedAttributes"
|
||||||
:key="attribute.id"
|
:key="attribute.id"
|
||||||
@@ -187,6 +185,12 @@ const derivedAttributes = computed(() =>
|
|||||||
@delete="handleDeleteAttribute"
|
@delete="handleDeleteAttribute"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<p
|
||||||
|
v-else
|
||||||
|
class="flex-1 py-20 text-n-slate-12 flex items-center justify-center text-base"
|
||||||
|
>
|
||||||
|
{{ $t('ATTRIBUTES_MGMT.LIST.EMPTY_RESULT.404') }}
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<AddAttribute
|
<AddAttribute
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
shared: &shared
|
shared: &shared
|
||||||
version: '4.9.0'
|
version: '4.9.1'
|
||||||
|
|
||||||
development:
|
development:
|
||||||
<<: *shared
|
<<: *shared
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ class Enterprise::Billing::HandleStripeEventService
|
|||||||
captain_integration
|
captain_integration
|
||||||
advanced_search_indexing
|
advanced_search_indexing
|
||||||
advanced_search
|
advanced_search
|
||||||
|
linear_integration
|
||||||
].freeze
|
].freeze
|
||||||
|
|
||||||
# Additional features available starting with the Business plan
|
# Additional features available starting with the Business plan
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@chatwoot/chatwoot",
|
"name": "@chatwoot/chatwoot",
|
||||||
"version": "4.9.0",
|
"version": "4.9.1",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"eslint": "eslint app/**/*.{js,vue}",
|
"eslint": "eslint app/**/*.{js,vue}",
|
||||||
|
|||||||
Reference in New Issue
Block a user