Для встраивания Angular-компонентов в приложение Creatio используется функциональность Angular Elements. Angular Elements — это npm-пакет, который позволяет упаковывать Angular-компоненты в Custom Elements и определять новые HTML-элементы со стандартным поведением (Custom Elements является частью стандарта Web-Components).
Создание пользовательского Angular-компонента
1. Настроить окружение для разработки компонентов средствами Angular CLI
Для этого установите:
- Node.js® и npm package manager.
- Angular CLI.
Чтобы установить Angular CLI выполните в системной консоли команду:
2. Создать Angular приложение
Выполните в консоли команду ng new и укажите имя приложения, например angular-element-test.
3. Установить пакет Angular Elements
Из папки приложения, созданного на предыдущем шаге, выполните в консоли команду.
4. Создать компонент Angular
Чтобы создать компонент выполните в консоли команду.
5. Зарегистрировать компонент как Custom Element
Чтобы настроить трансформацию компонента в пользовательский HTML-элемент, необходимо внести изменения в файл app.module.ts:
- Добавьте импорт модуля createCustomElement.
- В модуле в секции entryComponents укажите имя компонента.
- В методе ngDoBootstrap зарегистрируйте компонент под HTML-тегом.
6. Выполнить сборку приложения
-
При сборке проекта сгенерируются несколько *.js-файлов. Для простоты дальнейшего использования веб-компонента в Creatio, созданные после сборки файлы рекомендуется поставлять в одном файле. Для этого необходимо в корне приложения создать скрипт build.js.
Пример build.jsЕсли в веб-компоненте используется библиотека lodash, то для ее работы в Creatio необходимо main.js (и при необходимости styles.js) объединять со скриптом, устраняющим конфликты по lodash. Для этого в корне Angular-проекта создаем папку tools и файл lodash-fix.js.
lodash-fix.jsДополнительно для выполнения скрипта в build.js необходимо установить в проекте пакеты concat и fs-extra как dev-dependency. Для этого выполните в командной строке команды:
Установка дополнительных пакетовПо умолчанию для созданного приложения могут быть установлены настройки файла browserslist, которые создают сразу несколько сборок для браузеров, которые поддерживают ES2015, и для тех, которым нужен ES5. Для данного примера мы собираем Angular элемент для современных браузеров.
Пример browserslist -
Добавьте в package.json команды, которые отвечают за сборку элемента. В результате их выполнения, вся бизнес логика помещается в один файл angular-element-component.js, с которым мы будем работать далее.
package.json
Подключение Custom Element в Creatio
Созданный в результате сборки файл angular-element-component.js необходимо встроить в пакет Creatio как файловый контент.
1. Разместить файл в статическом контенте пакета
Для этого скопируйте файл в папку Название пользовательского пакета\Files\src\js, например, MyPackage\Files\src\js.
2. Встроить билд в Creatio
Для этого необходимо в файле bootstrap.js (пакета Creatio, куда Вы хотите загрузить веб-компонент) настроить конфиг с указанием пути к билду.
Для загрузки bootstrap укажите путь к данному файлу. Для этого создайте descriptor.json в Название пользовательского пакета\Files.
Выполните загрузку из файловой системы и компиляцию.
3. Выполнить загрузку компонента в необходимой схеме/модуле
Создайте в пакете схему или модуль, в котором должен быть использован созданный пользовательский элемент, и выполните его загрузку в блоке подключения зависимостей модуля.
4. Создать HTML-элемент и добавить его в модель DOM
Работа с данными
Передача данных в Angular-компонент выполняется через публичные свойства/поля, помеченные декоратором @Input.
Получение данных от компонента реализовано через механизм событий. Для этого необходимо публичное поле (тип EventEmiter<T>) пометить декоратором @Output. Для инициализации события необходимо у поля вызвать метод emit(T) и передать необходимые данные.
Добавьте кнопку в angular-element.component.html.
Использование Shadow DOM
Некоторые компоненты, созданные с помощью Angular и встроенные в Creatio могут быть сконфигурированы так, чтобы реализация компонента была закрыта от внешнего окружения так называемым Shadow DOM.
Shadow DOM — это механизм инкапсуляции компонентов внутри DOM. Благодаря ему, в компоненте есть собственное «теневое» DOM-дерево, к которому нельзя просто так обратиться из главного документа, у него могут быть изолированные CSS-правила и т. д.
Для использования Shadow DOM необходимо в декоратор компонента добавить свойство encapsulation: ViewEncapsulation.ShadowDom.
Создание Acceptance Tests для Shadow DOM
Shadow DOM создает проблему для тестирования компонентов в приложении с помощью приемочных cucumber тестов. К компонентам внутри Shadow DOM нельзя обратится через стандартные селекторы из корневого документа.
Для этого необходимо использовать shadow root как корневой документ и через него обращаться к элементам компонента.
Shadow root — корневая нода компонента внутри Shadow DOM.
Shadow host — нода компонента, внутри которой размещается Shadow DOM.
В классе BPMonline.BaseItem реализованы базовые методы по работе с Shadow DOM.
Метод | Описание |
---|---|
clickShadowItem | Нажать на элемент внутри Shadow DOM компонента. |
getShadowRootElement | По заданному css-селектору Angular компонента возвращает его shadow root, который можно использовать для дальнейших выборок элементов. |
getShadowWebElement | Возвращает экземпляр элемента внутри Shadow DOM по заданному css-селектору. В зависимости от параметра waitForVisible ожидает его появления либо нет. |
getShadowWebElements | Возвращает экземпляры элементов внутри Shadow DOM по заданному css-селектору. |
mouseOverShadowItem | Навести курсор на элемент внутри Shadow DOM. |
waitForShadowItem | Ожидает появления элемента внутри Shadow DOM компонента и возвращает его экземпляр. |
waitForShadowItemExist | Ожидает появления элемента внутри Shadow DOM компонента. |
waitForShadowItemHide | Ожидает скрытие элемента внутри Shadow DOM компонента. |