diff --git a/src/components/TaskTypeSelect.vue b/src/components/TaskTypeSelect.vue index 6831ff2d..ab361df7 100644 --- a/src/components/TaskTypeSelect.vue +++ b/src/components/TaskTypeSelect.vue @@ -141,7 +141,7 @@ export default { buttonTypes() { const taskTypes = {} for (const task of this.options) { - const type = task.category.id + const type = this.getTaskCategory(task.id) if (!taskTypes[type]) { taskTypes[type] = [] } @@ -154,7 +154,7 @@ export default { } result.push({ id: entry[0], - text: entry[1][0].category.name, + text: this.getTextForCategory(entry[0]), icon: this.getCategoryIcon(entry[0]), tasks: entry[1], }) @@ -163,7 +163,7 @@ export default { if (taskTypes.other) { result.push({ id: 'other', - text: taskTypes.other[0].category.name, + text: this.getTextForCategory('other'), icon: this.getCategoryIcon('other'), tasks: taskTypes.other, }) @@ -208,11 +208,7 @@ export default { return taskType.id === this.modelValue }, isCategorySelected(category) { - if (!this.modelValue) { - return false - } - const selectedTask = this.options.find(task => task.id === this.modelValue) - return selectedTask && category.id === selectedTask.category.id + return category.id === this.getTaskCategory(this.modelValue || '') }, onTaskSelected(taskType) { this.$emit('update:model-value', taskType.id) @@ -228,6 +224,44 @@ export default { this.categorySubmenu = null } }, + getTaskCategory(id) { + if (id.startsWith('chatty')) { + return 'chat' + } else if (id.startsWith('context_chat')) { + return 'context' + } else if (id.includes('translate')) { + return 'translate' + } else if (id.startsWith('richdocuments')) { + return 'generate' + } else if (id.includes('image') || id.includes('sticker')) { + return 'image' + } else if (id.includes('audio') || id.includes('speech')) { + return 'audio' + } else if (id.includes('text')) { + return 'text' + } + return 'other' + }, + getTextForCategory(category) { + switch (category) { + case 'chat': + return t('assistant', 'Chat with AI') + case 'context': + return t('assistant', 'Context Chat') + case 'text': + return t('assistant', 'Work with text') + case 'image': + return t('assistant', 'Work with images') + case 'translate': + return t('assistant', 'Translate') + case 'audio': + return t('assistant', 'Work with audio') + case 'generate': + return t('assistant', 'Generate file') + default: + return t('assistant', 'Other') + } + }, getCategoryIcon(category) { switch (category) { case 'chat': diff --git a/src/components/fields/TextInput.vue b/src/components/fields/TextInput.vue index 8372ce86..0d0d63ab 100644 --- a/src/components/fields/TextInput.vue +++ b/src/components/fields/TextInput.vue @@ -9,7 +9,16 @@
{{ limitLabel ?? '' }} + + @update:model-value="$emit('update:value', $event)" + @blur="onEditableBlur" /> { + const ref = this.$refs.input + if (!ref) { + return + } + if (typeof ref.focus === 'function') { + ref.focus() + return + } + const el = ref.$el + if (!el) { + return + } + if (typeof el.focus === 'function') { + el.focus() + return + } + const editable = el.querySelector?.('[contenteditable]') + if (editable && typeof editable.focus === 'function') { + editable.focus() + } + }) + }, + onEditableBlur() { + if (this.isOutput && this.isEditing) { + this.isEditing = false + } + }, }, } @@ -247,6 +293,20 @@ body[dir="rtl"] .choose-file-button { right: 4px; } + .output-wrapper { + display: block !important; + box-sizing: border-box !important; + border: 2px solid var(--color-primary-element) !important; + border-radius: var(--border-radius-large) !important; + padding: 8px !important; + padding-bottom: 42px !important; + max-height: 35vh !important; + overflow-y: auto !important; + .rendered-output, .rendered-output * { + cursor: text; + } + } + .rich-contenteditable__input { min-height: calc(var(--default-clickable-area) + 4px); padding-top: 5px !important; @@ -255,6 +315,7 @@ body[dir="rtl"] .choose-file-button { .shadowed .rich-contenteditable__input { border: 2px solid var(--color-primary-element); padding-bottom: 38px !important; + max-height: 35vh !important; } .shadowed.streaming .rich-contenteditable__input { animation: pulse 2s infinite;