fix: share the dashboard assistant and count leads from data
The hero ask box now uses the same confirm-before-create path as the assistant, count questions use real filters, and lead mobile, Jalali follow-ups, and rial labels stay consistent. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -22,6 +22,8 @@ const emit = defineEmits<{
|
||||
'update:askQuery': [value: string];
|
||||
ask: [preset?: string];
|
||||
clear: [];
|
||||
busy: [value: boolean];
|
||||
notice: [value: { error: string; done: string }];
|
||||
}>();
|
||||
|
||||
const shortcuts = [
|
||||
@@ -69,7 +71,9 @@ function onVoiceTranscript(text: string) {
|
||||
}
|
||||
|
||||
function looksLikeAction(text: string) {
|
||||
return /بساز|بسازید|ثبت کن|ثبت کنید|اضافه کن|ایجاد کن|یک مشتری|مشتری جدید|یک فعالیت|فعالیت جدید/.test(text);
|
||||
return /بساز|بسازید|ثبت کن|ثبت کنید|اضافه کن|ایجاد کن|یک مشتری|مشتری جدید|یک فعالیت|فعالیت جدید|یک لید|لید جدید/.test(
|
||||
text,
|
||||
);
|
||||
}
|
||||
|
||||
function refreshDraft() {
|
||||
@@ -140,11 +144,13 @@ async function parseCommand(text: string, fallbackToAsk: boolean) {
|
||||
try {
|
||||
const { data } = await api.post<VoiceCommandDraft>('/ai/voice-command', { text });
|
||||
if (data.intent === 'none') {
|
||||
if (fallbackToAsk) {
|
||||
if (fallbackToAsk && !looksLikeAction(text)) {
|
||||
emit('ask', text);
|
||||
return;
|
||||
}
|
||||
voiceError.value = data.summary;
|
||||
voiceError.value = looksLikeAction(text)
|
||||
? 'دستور را کامل نفهمیدم. نام و مشخصات را واضحتر بگویید تا قبل از ساخت، تأیید کنید.'
|
||||
: data.summary;
|
||||
return;
|
||||
}
|
||||
draft.value = data;
|
||||
@@ -177,6 +183,9 @@ async function onTypedSubmit() {
|
||||
await parseCommand(text, true);
|
||||
return;
|
||||
}
|
||||
voiceError.value = '';
|
||||
voiceDone.value = '';
|
||||
draft.value = null;
|
||||
emit('ask');
|
||||
}
|
||||
|
||||
@@ -241,6 +250,16 @@ watch(
|
||||
},
|
||||
);
|
||||
|
||||
watch([voiceBusy, confirming], () => {
|
||||
emit('busy', voiceBusy.value || confirming.value);
|
||||
});
|
||||
|
||||
watch([voiceError, voiceDone], ([error, done]) => {
|
||||
emit('notice', { error, done });
|
||||
});
|
||||
|
||||
defineExpose({ submitFromInput: onTypedSubmit });
|
||||
|
||||
watch(
|
||||
() => props.answer,
|
||||
(value) => {
|
||||
|
||||
@@ -15,6 +15,7 @@ const props = defineProps<{
|
||||
asking?: boolean;
|
||||
askAnswer?: string;
|
||||
askError?: string;
|
||||
statusText?: string;
|
||||
}>();
|
||||
|
||||
const emit = defineEmits<{
|
||||
@@ -113,7 +114,7 @@ const shortcutLabel = computed(() =>
|
||||
<UiIcon name="send" :size="15" />
|
||||
</button>
|
||||
</form>
|
||||
<p v-if="asking" class="hero-ask-status">در حال پاسخ…</p>
|
||||
<p v-if="asking" class="hero-ask-status">{{ statusText || 'در حال پاسخ…' }}</p>
|
||||
<p v-else-if="askError" class="hero-ask-status err">{{ askError }}</p>
|
||||
<p v-else-if="askAnswer" class="hero-ask-status">{{ askAnswer }}</p>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user