Блог

Как использовать автофокус и проверку орфографии в Odoo 18

post-title

Когда дело доходит до создания интерактивных и удобных пользовательских интерфейсов в Odoo, фреймворк OWL постоянно развивается, и Odoo 18 представляет несколько действительно полезных хуков, которые упрощают жизнь разработчикам.

Среди них выделяются useAutofocus и useSpellCheck как элегантные декларативные решения для управления фокусировкой и проверкой орфографии элементов пользовательского интерфейса без необходимости ручного манипулирования DOM.

В этом блоге мы рассмотрим:

  • Что делают функции useAutofocus и useSpellCheck
  • Как реализовать их в ваших OWL-компонентах
  • Пример с чистым пользовательским интерфейсом и кодом.

В конце вы увидите, как просто улучшить пользовательский опыт всего несколькими строками кода.

Понимание «крючков»

1. useSpellCheck([options])

Этот хук позволяет выполнять проверку орфографии в элементах ввода или текстовых областях с помощью декларативного стиля OWL.

Аргументы:

Option Type Description
refName string The useRef reference for the element that will be spellcheck-enabled

Примеры вариантов использования:

  • Включить проверку орфографии в браузере для одного поля ввода.
  • Настройте отдельные элементы, чтобы включить или отключить проверку орфографии.

2. useAutofocus()

Этот хук автоматически фокусируется на элементе ввода при монтировании компонента. Нет необходимости вручную вызывать метод `.focus()`, OWL сделает это за вас.

Настройка проекта (манифест)

Прежде чем писать код, убедитесь, что ваш пользовательский модуль имеет правильную структуру. Типичная структура...

Файл __manifest__.py может выглядеть следующим образом:

{
    'Name': 'Your Module Name',
    'version': '1.0',
    'summary': 'Demonstration of useAutofocus and useSpellCheck hooks in OWL 18',
    'depends': ['web'],
    'data': [
        'views/your_module_actions.xml',
    ],
    'assets': {
        'web.assets_backend': [
            'Your_module_name/static/src/js/component.xml',
            'Your_module_name/static/src/js/component.js',
        ],
    },
    'application': False,
}

XML-шаблон (макет пользовательского интерфейса)

Вот наш лаконичный и современный шаблон пользовательского интерфейса:

<t t-name="YourComponent.template_name">
    <div class="main" style="
        display: flex;
        justify-content: center;
        align-items: center;
        height: 100vh;
        background-color: #f8f9fa;">
        <div style="
            text-align: center;
            padding: 20px;
            background: white;
            border-radius: 12px;
            box-shadow: 0 4px 12px rgba(0,0,0,0.1);">
            <h1 style="margin-bottom: 20px; font-family: sans-serif; color: #333;">Welcome</h1>
            <div class="main" t-ref="root">
                <input t-ref="spellcheck"
                       type="text"
                       style="width: 250px; padding: 8px; margin-bottom: 10px; border: 1px solid #ccc; border-radius: 4px;"/><br/>
                <textarea t-ref="custom"
                          spellcheck="false"
                          style="width: 250px; height: 80px; padding: 8px; margin-bottom: 10px; border: 1px solid #ccc; border-radius: 4px;"/><br/>
                 <input t-ref="autofocus" type="text"
                        style="width: 250px; padding: 8px; margin-bottom: 10px; border: 1px solid #ccc; border-radius: 4px;"
                        />
                <div t-ref="container">
                    <input type="text"
                           style="width: 250px; padding: 8px; margin-bottom: 10px; border: 1px solid #ccc; border-radius: 4px;"/><br/>
                </div>
            </div>
        </div>
    </div>
</t>

Компонент JavaScript

Вот как мы воплощаем все это в жизнь с помощью крючков OWL:

/** @odoo-module **/
import { registry } from "@web/core/registry";
import { Component } from "@odoo/owl";
import { useSpellCheck } from "@web/core/utils/hooks";
import { useAutofocus } from "@web/core/utils/hooks";
export class YourComponent extends Component {
   static template = "YourComponent.template_nam";
   setup() {
       this.simpleRef = useSpellCheck();
       this.customRef = useSpellCheck({ refName: "custom" });
       this.nodeRef = useSpellCheck({ refName: "container" });
       this.inputRef = useAutofocus();
     }
}
registry.category("actions").add("YourComponent", YourComponent);

Как это работает (пошагово)

1. Проверка орфографии:

  • Функция useSpellCheck() автоматически включает проверку орфографии для поля ввода по умолчанию.
  • С помощью refName можно указывать конкретные ссылки, например, пользовательские или даже узлы контейнера.

2. Автофокус:

  • Функция useAutofocus() гарантирует, что поле ввода получит фокус при монтировании компонента — идеально подходит для поисковых строк, быстрых форм или модальных окон.

3. Интеграция пользовательского интерфейса:

  • При запуске этого действия (через серверное действие или пользовательский пункт меню) компонент отображается, и все эти свойства применяются автоматически.

XML: Действие и пункт меню

Добавьте это в файл views/your_module_actions.xml вашего модуля (убедитесь, что он включен в ваш манифест в разделе data)

<odoo>
    <!-- Client Action -->
    <record id="action_test_hook" model="ir.actions.client">
        <field name="name">Test Hook Demo</field>
        <field name="tag">YourComponent</field>
    </record>
    <!-- Menu Item -->
    <menuitem id="menu_test_hook_root"
              name="Test Hook"
              parent="base.menu_custom"
              sequence="10"
              action="action_test_hook"/>
</odoo>

Заключение

В OWL 18 разработка фронтенда стала чище и приятнее. Новые хуки useAutofocus и useSpellCheck устраняют необходимость в ручных запросах к DOM или уловках JavaScript — вместо этого вы объявляете поведение на уровне компонента, сохраняя ваш код элегантным, поддерживаемым и соответствующим реактивному дизайну OWL.

Независимо от того, создаете ли вы формы, чат-интерфейсы или пользовательские панели управления, эти хуки — простые инструменты, которые могут значительно улучшить пользовательский опыт с минимальными усилиями.