-
Примеры
- Реализовать пользовательский компонент на основе элемента классической страницы Creatio
- Реализовать внешний пользовательский компонент
- Реализовать бизнес-логику внешнего пользовательского компонента
- Реализовать валидацию во внешнем пользовательском компоненте
- Добавить внешний пользовательский компонент в библиотеку Freedom UI дизайнера
Creatio предоставляет возможность расширения предустановленного набора компонентов, которые используются для кастомизации страницы Freedom UI, путем реализации пользовательских компонентов.
Виды пользовательских компонентов, которые позволяет реализовать Creatio:
- Пользовательский компонент на основе элемента классической страницы Creatio. Поддерживается с версии Creatio 8.0.2 Atlas и выше.
- Внешний пользовательский компонент (remote module). Поддерживается с версии Creatio 8.0.3 Atlas и выше.
Реализовать пользовательский компонент на основе элемента классической страницы Creatio
Возможность реализовать пользовательский компонент на основе элемента классической страницы доступна в Creatio версии 8.0.2 Atlas и выше.
Чтобы реализовать пользовательский компонент на основе элемента классической страницы Creatio:
- Создайте пользовательский компонент.
- Добавьте пользовательский компонент на страницу Freedom UI.
1. Создать пользовательский компонент
- Создайте схему модуля. Для этого воспользуйтесь инструкцией, которая приведена в статье Клиентский модуль.
-
Реализуйте пользовательский компонент.
-
Добавьте в AMD-модуль зависимость от библиотеки @creatio-devkit/common.
Пример добавления зависимости в AMD-модуль UsrAppClientSchemaNameКод скопирован/* Объявление AMD-модуля. */ define("UsrAppClientSchemaName", ["@creatio-devkit/common"], function (sdk) { ... });
-
Объявите класс компонента.
Пример объявления класса UsrAppClientSchemaNameКод скопирован/* Объявление AMD-модуля. */ define("UsrAppClientSchemaName", ["@creatio-devkit/common"], (sdk) { /* Объявление класса. */ class UsrAppClientSchemaName extends HTMLElement { constructor() { super(); const shadowDom = this.attachShadow({mode: 'open'}); shadowDom.innerHTML = '<h1>UsrAppClientSchemaName works!</h1>' } } ... });
-
Зарегистрируйте компонент.
Пример регистрации компонента UsrAppClientSchemaNameКод скопирован/* Объявление AMD-модуля. */ define("UsrAppClientSchemaName", ["@creatio-devkit/common"], (sdk) { ... /* Регистрация компонента. */ customElements.define('usr-custom-view-element', UsrAppClientSchemaName); ... });
-
Зарегистрируйте компонент в качестве визуального элемента.
Пример регистрации компонента usr-custom-view-elementКод скопирован/* Объявление AMD-модуля. */ define("UsrAppClientSchemaName", ["@creatio-devkit/common"], (sdk) { ... /* Регистрация компонента в качестве визуального элемента. */ sdk.registerViewElement({ type: 'usr.CustomViewElement', selector: 'usr-custom-view-element' }); });
-
2. Добавить пользовательский компонент на страницу Freedom UI
-
В объявлении AMD-модуля в качестве зависимости добавьте модуль пользовательского компонента.
Пример добавления зависимости UsrAppClientSchemaNameКод скопирован/* Объявление AMD-модуля. */ define("UsrAppClientSchemaName1", ["UsrAppClientSchemaName"], () { ... });
-
В секцию viewConfigDiff добавьте конфигурационный объект модуля с пользовательским компонентом.
Пример конфигурационного объекта модуля с пользовательским компонентом UsrCustomViewElement представлен ниже.
Секция viewConfigDiffКод скопированviewConfigDiff: /**SCHEMA_VIEW_CONFIG_DIFF*/[ { "operation": "insert", "name": "UsrAppClientSchemaName", "values": { "type": "usr.CustomViewElement", "layoutConfig": { "column": 1, "row": 1, "colSpan": 3, "rowSpan": 1 } }, "parentName": "Main", "propertyName": "items", "index": 0 } ]/**SCHEMA_VIEW_CONFIG_DIFF*/,
На заметку. Creatio не предоставляет возможности добавления пользовательского компонента на основе элемента классической страницы Creatio в библиотеку элементов Freedom UI дизайнера. Вместо пользовательского компонента на холсте страницы Freedom UI в дизайнере отображается заглушка. Это связано с тем, что элемент классической страницы Creatio реализован на фреймворке ExtJs. Чтобы пользовательский компонент отображался в библиотеке элементов Freedom UI дизайнера, реализуйте внешний пользовательский компонент. Для этого воспользуйтесь инструкцией, которая приведена в пункте Реализовать внешний пользовательский компонент.
Подробный пример реализации пользовательского компонента приведен в статье Реализовать пользовательский компонент на основе элемента классической страницы Creatio.
Реализовать внешний пользовательский компонент
Возможность реализовать внешний пользовательский компонент доступна в Creatio версии 8.0.3 Atlas и выше.
В основе разработки внешнего пользовательского компонента лежит плагин Module Federation. Назначение плагина Module Federation — разделить приложение на множество мелких модулей (компонентов, remote modules), сборка которых выполняется независимо. Этот плагин позволяет разрабатывать пользовательские компоненты на разных фреймворках и использовать разные версии библиотек. Подробнее читайте в официальной документации webpack.
На заметку. При использовании плагина Module Federation могут возникать сложности в работе с библиотеками, которые регистрируют себя в качестве глобальных переменных (например, lodash).
Проект внешнего пользовательского компонента (remote module) построен по модульной структуре. Т. е. бизнес-логика и визуальные элементы объединяются в модули, которые, в свою очередь, могут объединяться в модули высшего порядка.
Пример корневого модуля проекта CrtCdkModule, который содержит вложенные модули CrtInputModule и CrtButtonModule с собственными визуальными элементами представлен на схеме ниже.
Чтобы реализовать внешний пользовательский компонент:
- Создайте Angular-проект для разработки внешнего пользовательского компонента.
- Создайте внешний пользовательский компонент.
- Реализуйте бизнес-логику внешнего пользовательского компонента.
- Добавьте компонент в библиотеку Freedom UI дизайнера (опционально).
- Добавьте внешний пользовательский компонент на страницу Freedom UI.
1. Создать Angular-проект для разработки внешнего пользовательского компонента
Внешний пользовательский компонент разрабатывается в отдельном npm-пакете во внешней IDE. Рассмотрим разработку внешнего пользовательского компонента в Microsoft Visual Studio Code. Рекомендуем использовать компоненты, которые созданы на фреймворке Angular. Для работы фреймворка необходим глобально установленный интерфейс командной строки @angular/cli. Чтобы настроить окружение для разработки компонентов средствами Angular CLI, в терминале командной строки Microsoft Visual Studio Code выполните команду npm install -g @angular/cli.
Способы создания Angular-проекта для разработки внешнего пользовательского компонента:
- Через *.zip-архив, который содержит Angular-проект c шаблоном внешнего пользовательского компонента.
- Через утилиту Clio.
Чтобы создать Angular-проект для разработки внешнего пользовательского компонента с использованием *.zip-архива:
- Скачайте и разархивируйте *.zip-архив.
- Откройте проект в Microsoft Visual Studio Code.
- Во всех файлах проекта измените значение макроса имени Angular-проекта <%projectName%> на имя пакета, в который планируется перенести внешний пользовательский компонент. Для имени пакета используйте нотацию Snake case (например, process_designer).
- Во всех файлах проекта измените значение макроса префикса <%vendorPrefix%> на префикс названия объекта (например, usr). Префикс может содержать символы латинского алфавита в нижнем регистре. Максимальная длина префикса — 50 символов.
- Установите npm-модули. Для этого в терминале командной строки Microsoft Visual Studio Code выполните команду npm i. Операция установки может занять некоторое время.
Чтобы создать Angular-проект для разработки внешнего пользовательского компонента с использованием утилиты Clio:
- Установите утилиту Clio (выполняется однократно). Для этого в терминале Microsoft Visual Studio Code выполните команду dotnet tool install clio -g.
-
Зарегистрируйте в Clio новое приложение Creatio. Для этого в терминале Microsoft Visual Studio Code выполните команду clio reg-web-app someApplicationName -u https://mycreatio.com/ -l SomeLogin -p SomePassword.
someApplicationName — название приложения Creatio.
https://mycreatio.com/ — адрес приложения Creatio.
SomeLogin — логин пользователя для авторизации в приложении Creatio.
SomePassword — пароль пользователя для авторизации в приложении Creatio.
- Установите системный пакет cliogate в вашу рабочую среду. Для этого в терминале Microsoft Visual Studio Code выполните команду clio install-gate someApplicationName.
- Перезапустите ваше приложение Creatio. Для этого в терминале Microsoft Visual Studio Code выполните команду clio restart someApplicationName.
- Создайте новое рабочее пространство. Для этого в терминале Microsoft Visual Studio Code выполните команду clio createw.
-
Создайте проект с внешним пользовательским компонентом. Для этого в терминале Microsoft Visual Studio Code выполните команду clio ui someApplicationName -v usr --package SomePackageName. Если в рабочем пространстве отсутствует пакет с указанным именем, то будет создан новый пакет с указанным названием.
SomePackageName — название пакета для реализации внешнего пользовательского компонента.
- Установите npm-модули. Для этого в терминале командной строки Microsoft Visual Studio Code выполните команду npm i.
- Выполните сборку проекта. Для этого в терминале командной строки Microsoft Visual Studio Code выполните команду npm run build.
- Загрузите изменения с рабочего пространства в приложение Creatio. Для этого в терминале Microsoft Visual Studio Code выполните команду clio pushw -e someApplicationName.
В результате будет создан Angular-проект для разработки внешнего пользовательского компонента.
Подробный пример создания Angular-проекта для разработки внешнего пользовательского компонента приведен в статье Реализовать внешний пользовательский компонент.
2. Создать внешний пользовательский компонент
-
В проекте создайте Angular-компонент. Для этого в терминале командной строки Microsoft Visual Studio Code выполните команду ng g c view-elements/some_component_name.
view-elements указывает, что текущий Angular-компонент является визуальным элементом.
some_component_name — имя пользовательского компонента.
В результате в каталог src/app/view-elements/some_component_name проекта будут добавлены файлы компонента.
-
Укажите, что компонент SomeComponentNameComponent является визуальным элементом.
- Перейдите в файл some_component_name.component.ts.
- В компонент импортируйте функциональность декоратора CrtViewElement из библиотеки @creatio-devkit/common.
- Отметьте компонент декоратором CrtViewElement.
- Сохраните файл.
Файл some_component_name.component.tsКод скопированimport { Component, OnInit } from '@angular/core'; /* Импорт функциональности декоратора CrtViewElement из библиотеки @creatio-devkit/common. */ import { CrtViewElement } from '@creatio-devkit/common'; @Component({ selector: 'usr-some_component_name', templateUrl: './some_component_name.component.html', styleUrls: ['./some_component_name.component.scss'] }) /* Добавляем декоратор CrtViewElement к компоненту SomeComponentNameComponent. */ @CrtViewElement({ selector: 'usr-some_component_name', type: 'usr.SomeComponentName' }) export class SomeComponentNameComponent implements OnInit { constructor() { } ngOnInit(): void { } }
-
Зарегистрируйте визуальный элемент SomeComponentNameComponent в качестве компонента.
- Перейдите в файл app.module.ts.
- В декоратор CrtModule добавьте визуальный элемент SomeComponentNameComponent.
- В методе ngDoBootstrap() корневого модуля AppModule зарегистрируйте визуальный элемент SomeComponentNameComponent в качестве компонента (т. е. Angular Element). Подробнее читайте в официальной документации Angular.
- Сохраните файл.
Файл app.module.tsКод скопированimport { DoBootstrap, Injector, NgModule } from '@angular/core'; /* Импорт функциональности функции createCustomElement из библиотеки @angular/elements. */ import { createCustomElement } from '@angular/elements'; import { BrowserModule } from '@angular/platform-browser'; import { CrtModule } from '@creatio-devkit/common'; import { SomeComponentNameComponent } from './view-elements/some_component_name/some_component_name.component'; @CrtModule({ /* Указывает, что SomeComponentNameComponent является визуальным элементом. */ viewElements: [SomeComponentNameComponent] }) @NgModule({ declarations: [ SomeComponentNameComponent ], imports: [BrowserModule], providers: [], }) export class AppModule implements DoBootstrap { constructor(private _injector: Injector) {} ngDoBootstrap(): void { /* Регистрирует SomeComponentNameComponent в качестве Angular Element. */ const element = createCustomElement(SomeComponentNameComponent, { injector: this._injector, }); customElements.define('usr-some_component_name', element); } }
- Выполните сборку проекта. Для этого в терминале командной строки Microsoft Visual Studio Code выполните команду npm run build.
В результате в каталог dist Angular-проекта будет добавлена сборка с именем <%projectName%>, которое указано на шаге 1.
Подробный пример создания внешнего пользовательского компонента приведен в статье Реализовать внешний пользовательский компонент.
3. Реализовать бизнес-логику внешнего пользовательского компонента
-
В компоненте реализуйте необходимую бизнес-логику.
- Перейдите в файл some_component_name.component.ts.
- В компонент импортируйте функциональность декоратора Input из библиотеки @angular/core.
- В компонент импортируйте функциональность декоратора CrtInput из библиотеки @creatio-devkit/common.
- В класс компонента SomeComponentNameComponent добавьте свойство value, которое отвечает за значение компонента.
- Свойство value отметьте декораторами Input и CrtInput.
- Сохраните файл.
Файл some_component_name.component.tsКод скопирован/* Импорт функциональности декораторов из библиотеки @angular/core. */ import { Component, Input, OnInit } from '@angular/core'; /* Импорт функциональности декораторов из библиотеки @creatio-devkit/common. */ import { CrtInput, CrtViewElement } from '@creatio-devkit/common'; ... export class SomeComponentNameComponent implements OnInit { constructor() { } /* Добавляем декораторы к свойству value. */ @Input() @CrtInput() /* Значение компонента. */ public value: some_value_type; ngOnInit(): void { } }
- В файл some_component_name.component.html добавьте разметку пользовательского компонента.
- В файл some_component_name.component.scss добавьте стили пользовательского компонента.
- Выполните сборку проекта. Для этого в терминале командной строки Microsoft Visual Studio Code выполните команду npm run build.
В результате в каталог dist Angular-проекта будет добавлена сборка с именем <%projectName%>, которое указано на шаге 1.
Подробный пример реализации бизнес-логики внешнего пользовательского компонента приведен в статьях Реализовать бизнес-логику внешнего пользовательского компонента и Реализовать валидацию во внешнем пользовательском компоненте.
4. Добавить компонент в библиотеку Freedom UI дизайнера (опционально)
Рекомендуем добавить внешний пользовательский компонент в библиотеку Freedom UI дизайнера, если планируется его использование при no-code разработке.
Чтобы добавить компонент в библиотеку Freedom UI дизайнера:
-
Настройте отображение компонента в библиотеке Freedom UI дизайнера.
- Перейдите в файл some_component_name.component.ts.
- В компонент импортируйте функциональность декоратора CrtInterfaceDesignerItem из библиотеки @creatio-devkit/common.
- Отметьте компонент декоратором CrtInterfaceDesignerItem со свойством toolbarConfig, которое отвечает за отображение элемента в библиотеке Freedom UI дизайнера.
-
Выполните локализацию внешнего пользовательского компонента.
Выполнение локализации внешнего пользовательского компонента на этапе разработки позволит сэкономить время на переводе уже готового приложения. Для выполнения локализации библиотека @creatio-devkit/common предоставляет сервис системных переменных sdk.SysValuesService, из которого можно получить текущую культуру (системная переменная userCulture).
Действия по локализации, которые позволяет выполнить Creatio версии 8.0.3 Atlas и выше:
- Локализовать метаданные.
- Загрузить переводы из статического контента.
Чтобы локализовать метаданные:
-
Отметьте метаданные, которые нуждаются в локализации. Для этого используйте функцию localize().
Пример использования функции localize()Код скопирован@CrtInterfaceDesignerItem({ toolbarConfig: { /* Локализуемое название компонента. */ caption: localize('SomeComponentName.Caption'), name: 'usr_some_component_name', }, })
-
При вызове функции bootstrapCrtModule() укажите функцию localizeMetadata(). Функция localizeMetadata() используется для перевода метаданных, которые отмечены функцией localize(). В качестве входящего параметра функция localizeMetadata() принимает ключ для перевода значения. Функция возвращает переведенное значение.
Пример использования функции localizeMetadata()Код скопированconst translateService = this._injector.get(TranslateService); bootstrapCrtModule(AppModule, { localizeMetadata: (key: string) => translateService.instant(key), });
Чтобы загрузить переводы из статического контента:
- Узнайте URL, по которому необходимо загрузить переводы. Для этого используйте глобальную переменную __webpack_public_path__. Подробнее читайте в официальной документации webpack.
-
Реализуйте логику загрузки переводов.
Пример загрузки переводов из статического контентаКод скопированdeclare const __webpack_public_path__: string; @NgModule({ imports: [ BrowserModule, HttpClientModule, TranslateModule.forRoot({ defaultLanguage: 'en-US', loader: { provide: TranslateLoader, useFactory: (httpClient: HttpClient) => { return new TranslateHttpLoader( httpClient, __webpack_public_path__ + '/assets/i18n/', '.json' ); }, deps: [HttpClient], }, }), ], ...
- Загрузите изображение, которое планируется отображать в библиотеке Freedom UI дизайнера и в свойстве icon укажите путь к изображению. Рекомендуем использовать изображение в формате *.svg.
- Сохраните файл.
Файл some_component_name.component.scssКод скопирован... /* Импорт функциональности декораторов из библиотеки @creatio-devkit/common. */ import { CrtInput, CrtInterfaceDesignerItem, CrtOutput, CrtValidationInfo, CrtValidationInput, CrtViewElement } from '@creatio-devkit/common'; ... /* Добавляем декоратор CrtViewElement к компоненту SomeComponentNameComponent. */ @CrtInterfaceDesignerItem({ /* Отвечает за отображение элемента в библиотеке Freedom UI дизайнера. */ toolbarConfig: { /* Локализуемое название компонента. */ caption: localize('SomeComponentName.Caption'), name: 'usr_some_component_name', /* Путь к изображению для компонента. */ icon: require('!!raw-loader?{esModule:false}!./some_picture_name.png'), defaultPropertyValues: { /* Локализуемое название компонента в библиотеке Freedom UI дизайнера. */ label: 'Some component name' } } }) ...
- Выполните сборку проекта. Для этого в терминале командной строки Microsoft Visual Studio Code выполните команду npm run build.
В результате в каталог dist Angular-проекта будет добавлена сборка с именем <%projectName%>, которое указано на шаге 1.
Подробный пример добавления компонента в библиотеку Freedom UI дизайнера приведен в статье Добавить внешний пользовательский компонент в библиотеку Freedom UI дизайнера.
5. Добавить внешний пользовательский компонент на страницу Freedom UI
- Создайте пользовательское приложение. Для этого воспользуйтесь инструкцией, которая приведена в статье Создать пользовательское приложение.
- Настройте Creatio для работы в файловой системе. Для этого воспользуйтесь инструкцией, которая приведена в статье Внешние IDE.
-
Выгрузите пакеты в файловую систему.
Способы выгрузки пакетов в файловую систему:
- Через интерфейс приложения.
- Через утилиту Clio.
Чтобы выгрузить пакеты в файловую систему через интерфейс приложения:
-
На панели инструментов раздела [ Конфигурация ] ([ Configuration ]) в группе действий [ Разработка в файловой системе ] ([ File system development mode ]) выберите [ Выгрузить все пакеты в файловую систему ] ([ Download packages to file system ]).
- В каталоге пакета созданного приложения в файловой системе создайте каталог Files/src/js.
- Из каталога dist проекта cкопируйте сборку в каталог Files/src/js. Путь к сборке проекта: Files/src/js/<%projectName%>. Значение параметра <%projectName%> должно совпадать со значением, которое указано на шаге 1.
-
Выполните компиляцию конфигурации. Для этого воспользуйтесь инструкцией, которая приведена в статье Операции в Creatio IDE.
В результате пользовательский компонент будет отображаться в библиотеке Freedom UI дизайнера в группе [ Пользовательские компоненты ] ([ Custom components ]).
Чтобы выгрузить пакеты в файловую систему через утилиту Clio:
- Из каталога dist проекта cкопируйте сборку в каталог Files/src/js. Путь к сборке проекта: Files/src/js/<%projectName%>. Значение параметра <%projectName%> должно совпадать со значением, которое указано на шаге 1.
- Установите пакет в приложение. Для этого в терминале Microsoft Visual Studio Code выполните команду clio install SomePackageName -e someApplicationName.
- Во Freedom UI дизайнере откройте необходимую страницу.
- Добавьте пользовательский компонент на страницу Freedom UI.
- На панели действий Freedom UI дизайнера нажмите на кнопку
. После сохранения настроек страницы открывается исходный код страницы Freedom UI.
-
В секции viewConfigDiff привяжите свойство value пользовательского компонента к соответствующему атрибуту модели.
Секция viewConfigDiffКод скопированviewConfigDiff: /**SCHEMA_VIEW_CONFIG_DIFF*/[ ..., { "operation": "insert", "name": "Input", "values": { ..., /* Свойство, которое определяет тип элемента. */ "type": "usr.Input", /* Свойство, которое определяет значение компонента. Привязано к значению атрибута SomeAttributeName. */ "value": "$SomeAttributeName" }, ... } ]/**SCHEMA_VIEW_CONFIG_DIFF*/,
- На панели инструментов дизайнера клиентского модуля нажмите [ Сохранить ] ([ Save ]).
В результате внешний пользовательский компонент добавлен на страницу Freedom UI.
Подробный пример добавления внешнего пользовательского компонента на страницу Freedom UI приведен в статье Реализовать внешний пользовательский компонент.
Пример реализован для приложения версии 8.0.2 и выше.
Пример. На вкладке [ Хронология контрагента ] ([ Account timeline ]) страницы записи пользовательского раздела [ Requests ] отображать историю работы выбранного контрагента. Вкладка является веб-компонентом. Веб-компонент реализовать на основе 7.Х вкладки [ Хронология ] ([ Timeline ]), которая отображается на странице контакта.
1. Создать приложение
- Используя шаблон [ Данные и бизнес-процессы ] ([ Records & business processes ]), создайте пользовательское приложение Requests. Для этого воспользуйтесь инструкцией, которая приведена в статье Создать пользовательское приложение.
-
В рабочей области страницы приложения Requests откройте страницу [ Страница записи Requests ] ([ Requests form page ]).
Поле [ Название ] ([ Name ]) по умолчанию добавлено на страницу [ Страница записи Requests ] ([ Requests form page ]).
-
Добавьте поле, которое содержит контрагента.
- В рабочую область Freedom UI дизайнера добавьте новое поле типа [ Выпадающий список ] ([ Dropdown ]).
-
На панели действий Freedom UI дизайнера нажмите на кнопку
и на панели настройки заполните свойства поля:
- [ Заголовок ] ([ Title ]) — "Контрагент" ("Account").
- [ Код (на английском) ] ([ Code ]) — "UsrAccount".
- [ Выбор объекта ] ([ Lookup ]) — выберите "Контрагент" ("Account").
- Уберите признак [ Разрешить добавление новых значений ] ([ Enable adding new values ]).
-
Добавьте вкладку, которая содержит историю работы выбранного контрагента.
- В рабочую область Freedom UI дизайнера добавьте новый элемент разметки [ Вкладки ] ([ Tabs ]).
- Удалите вкладку [ Вкладка 2 ] ([ Tab 2 ]), которая по умолчанию добавлена на страницу [ Страница записи Requests ] ([ Requests form page ]).
-
На панели действий Freedom UI дизайнера нажмите на кнопку
и на панели настройки заполните свойство вкладки [ Заголовок ] ([ Title ]) — "Хронология контрагента" ("Account timeline").
- На панели действий Freedom UI дизайнера нажмите [ Сохранить ] ([ Save ]).
2. Создать пользовательский веб-компонент
- Перейдите в раздел [ Конфигурация ] ([ Configuration ]) и выберите пользовательский пакет, в который будет добавлена схема.
-
На панели инструментов реестра раздела нажмите [ Добавить ] —> [ Модуль ] ([ Add ] —> [ Module ]).
-
В дизайнере модуля заполните свойства схемы.
- [ Код ] ([ Code ]) — "UsrTimelineModule".
- [ Заголовок ] ([ Title ]) — "Модуль хронологии" ("Timeline module").
-
Реализуйте пользовательский веб-компонент.
-
В объявлении AMD-модуля в качестве зависимостей добавьте модули @creatio-devkit/common, Base7xViewElement и ckeditor-base.
Зависимости AMD-модуля UsrTimelineModuleКод скопирован/* Объявление AMD-модуля. */ define("UsrTimelineModule", ["@creatio-devkit/common", "Base7xViewElement", "ckeditor-base"], function (sdk, Base7xViewElement) { ... });
-
Объявите класс UsrTimelineModule веб-компонента.
Объявление класса UsrTimelineModuleКод скопирован/* Объявление AMD-модуля. */ define("UsrTimelineModule", ["@creatio-devkit/common", "Base7xViewElement", "ckeditor-base"], function (sdk, Base7xViewElement) { /* Объявление класса. */ class UsrTimelineModule extends Base7xViewElement { set primaryColumnValue(value) { this._primaryColumnValue = value; this._init(); } get primaryColumnValue() { return this._primaryColumnValue; } set entitySchemaName(value) { this._entitySchemaName = value; this._init(); } get entitySchemaName() { return this._entitySchemaName; } set cardSchemaName(value) { this._cardSchemaName = value; this._init(); } get cardSchemaName() { return this._entitySchemaName; } constructor() { super("Timeline"); } _init() { if (this._primaryColumnValue && this._cardSchemaName && this._entitySchemaName) { this.initContext(() => { this._moduleId = this.sandbox.id + "_UsrTimelineModule"; this.sandbox.subscribe("GetColumnsValues", (attributeNames) => this._getColumnValues(attributeNames), null, [this._moduleId]); this.sandbox.subscribe("GetEntityInfo", () => this._getEntityInfo(), null, [this._moduleId]); this._loadTimelineSchemaModule(); }); } } _loadTimelineSchemaModule() { this._moduleId = this.sandbox.loadModule("BaseSchemaModuleV2", { id: this._moduleId, renderTo: this._renderTo, instanceConfig: { schemaName: "TimelineSchema", isSchemaConfigInitialized: true, useHistoryState: false, showMask: true, parameters: { viewModelConfig: { "CardSchemaName": this._cardSchemaName, "ReferenceSchemaName": this._entitySchemaName, "InitialConfig": { "entities": [] } }, }, } }); } _getColumnValues(attributeNames) { const values = {}; attributeNames?.forEach((attributeName) => { switch (attributeName) { case "Id": values[attributeName] = this._primaryColumnValue?.value; break; case "Name": values[attributeName] = this._primaryColumnValue?.displayValue; break; default: break; } }); return values; } _getEntityInfo() { return { entitySchemaName: this._entitySchemaName, primaryColumnValue: this._primaryColumnValue?.value, primaryDisplayColumnValue: this._primaryColumnValue?.displayValue }; } getMessages() { const messages = super.getMessages(); return Object.assign(messages, { "GetColumnsValues": { mode: Terrasoft.MessageMode.PTP, direction: Terrasoft.MessageDirectionType.SUBSCRIBE }, "GetEntityInfo": { mode: Terrasoft.MessageMode.PTP, direction: Terrasoft.MessageDirectionType.SUBSCRIBE } }); } disconnectedCallback() { this.sandbox.unloadModule(this._moduleId, this._renderTo); } } ... });
-
На странице зарегистрируйте веб-компонент UsrTimelineModule.
Регистрация веб-компонента UsrTimelineModuleКод скопирован/* Объявление AMD-модуля. */ define("UsrTimelineModule", ["@creatio-devkit/common", "Base7xViewElement", "ckeditor-base"], function (sdk, Base7xViewElement) { ... /* Регистрация веб-компонента. */ customElements.define('usr-timeline', UsrTimelineModule); ... });
-
Зарегистрируйте веб-компонент usr-timeline в качестве визуального элемента.
Регистрация веб-компонента usr-timelineКод скопирован/* Объявление AMD-модуля. */ define("UsrTimelineModule", ["@creatio-devkit/common", "Base7xViewElement", "ckeditor-base"], function (sdk, Base7xViewElement) { ... /* Регистрация веб-компонента в качестве визуального элемента. */ sdk.registerViewElement({ type: 'usr.Timeline', selector: 'usr-timeline', inputs: { primaryColumnValue: {}, cardSchemaName: {}, entitySchemaName: {} } }); });
Полный исходный код схемы модуляUsrTimelineModuleКод скопирован/* Объявление AMD-модуля. */ define("UsrTimelineModule", ["@creatio-devkit/common", "Base7xViewElement", "ckeditor-base"], function(sdk, Base7xViewElement) { /* Объявление класса. */ class UsrTimelineModule extends Base7xViewElement { set primaryColumnValue(value) { this._primaryColumnValue = value; this._init(); } get primaryColumnValue() { return this._primaryColumnValue; } set entitySchemaName(value) { this._entitySchemaName = value; this._init(); } get entitySchemaName() { return this._entitySchemaName; } set cardSchemaName(value) { this._cardSchemaName = value; this._init(); } get cardSchemaName() { return this._entitySchemaName; } constructor() { super("Timeline"); } _init() { if (this._primaryColumnValue && this._cardSchemaName && this._entitySchemaName) { this.initContext(() => { this._moduleId = this.sandbox.id + "_UsrTimelineModule"; this.sandbox.subscribe("GetColumnsValues", (attributeNames) => this._getColumnValues(attributeNames), null, [this._moduleId]); this.sandbox.subscribe("GetEntityInfo", () => this._getEntityInfo(), null, [this._moduleId]); this._loadTimelineSchemaModule(); }); } } _loadTimelineSchemaModule() { this._moduleId = this.sandbox.loadModule("BaseSchemaModuleV2", { id: this._moduleId, renderTo: this._renderTo, instanceConfig: { schemaName: "TimelineSchema", isSchemaConfigInitialized: true, useHistoryState: false, showMask: true, parameters: { viewModelConfig: { "CardSchemaName": this._cardSchemaName, "ReferenceSchemaName": this._entitySchemaName, "InitialConfig": { "entities": [] } }, }, } }); } _getColumnValues(attributeNames) { const values = {}; attributeNames?.forEach((attributeName) => { switch (attributeName) { case "Id": values[attributeName] = this._primaryColumnValue?.value; break; case "Name": values[attributeName] = this._primaryColumnValue?.displayValue; break; default: break; } }); return values; } _getEntityInfo() { return { entitySchemaName: this._entitySchemaName, primaryColumnValue: this._primaryColumnValue?.value, primaryDisplayColumnValue: this._primaryColumnValue?.displayValue }; } getMessages() { const messages = super.getMessages(); return Object.assign(messages, { "GetColumnsValues": { mode: Terrasoft.MessageMode.PTP, direction: Terrasoft.MessageDirectionType.SUBSCRIBE }, "GetEntityInfo": { mode: Terrasoft.MessageMode.PTP, direction: Terrasoft.MessageDirectionType.SUBSCRIBE } }); } disconnectedCallback() { this.sandbox.unloadModule(this._moduleId, this._renderTo); } } /* Регистрация веб-компонента. */ customElements.define('usr-timeline', UsrTimelineModule); /* Регистрация веб-компонента в качестве визуального элемента. */ sdk.registerViewElement({ type: 'usr.Timeline', selector: 'usr-timeline', inputs: { primaryColumnValue: {}, cardSchemaName: {}, entitySchemaName: {} } }); return Terrasoft.UsrTimelineModule; });
-
- На панели инструментов дизайнера модуля нажмите [ Сохранить ] ([ Save ]).
3. Добавить пользовательский веб-компонент на страницу Freedom UI
- В разделе [ Конфигурация ] ([ Configuration ]) откройте схему UsrRequests_FormPage страницы Freedom UI [ Страница записи Requests ] ([ Requests form page ]).
- На панели действий Freedom UI дизайнера нажмите на кнопку
. Открывается исходный код страницы Freedom UI.
-
Добавьте пользовательский веб-компонент.
-
В объявлении AMD-модуля в качестве зависимости добавьте модуль UsrTimelineModule пользовательского веб-компонента.
Зависимости AMD-модуля UsrRequests_FormPageКод скопирован/* Объявление AMD-модуля. */ define("UsrRequests_FormPage", /**SCHEMA_DEPS*/["UsrTimelineModule"]/**SCHEMA_DEPS*/, function/**SCHEMA_ARGS*/()/**SCHEMA_ARGS*/ { ... });
-
В секцию viewConfigDiff добавьте конфигурационный объект модуля UsrTimelineModule с пользовательским веб-компонентом.
Секция viewConfigDiffКод скопированviewConfigDiff: /**SCHEMA_VIEW_CONFIG_DIFF*/[ ..., { "operation": "insert", "name": "Timeline_qwerty", "values": { "type": "usr.Timeline", "layoutConfig": { "column": 1, "row": 1, "colSpan": 12, "rowSpan": 8 }, "primaryColumnValue": "$UsrAccount", "cardSchemaName": "AccountPageV2", "entitySchemaName": "Account" }, "parentName": "GridContainer_qaocexw", "propertyName": "items", "index": 0 }, ... ]/**SCHEMA_VIEW_CONFIG_DIFF*/,
Полный исходный код схемы страницыUsrRequests_FormPageКод скопирован/* Объявление AMD-модуля. */ define("UsrRequests_FormPage", /**SCHEMA_DEPS*/["UsrTimelineModule"]/**SCHEMA_DEPS*/, function/**SCHEMA_ARGS*/()/**SCHEMA_ARGS*/ { return { viewConfigDiff: /**SCHEMA_VIEW_CONFIG_DIFF*/[ { "operation": "insert", "name": "UsrName", "values": { "layoutConfig": { "column": 1, "row": 1, "colSpan": 1, "rowSpan": 1 }, "type": "crt.Input", "label": "$Resources.Strings.UsrName", "control": "$UsrName" }, "parentName": "LeftAreaProfileContainer", "propertyName": "items", "index": 0 }, { "operation": "insert", "name": "UsrAccount", "values": { "layoutConfig": { "column": 1, "row": 2, "colSpan": 1, "rowSpan": 1 }, "type": "crt.ComboBox", "loading": false, "control": "$UsrAccount", "label": "$Resources.Strings.UsrAccount", "labelPosition": "auto", "listActions": [], "showValueAsLink": true, "placeholder": "", "controlActions": [] }, "parentName": "LeftAreaProfileContainer", "propertyName": "items", "index": 1 }, { "operation": "insert", "name": "TabPanel_grveew2", "values": { "layoutConfig": { "column": 1, "row": 1, "colSpan": 2, "rowSpan": 1 }, "type": "crt.TabPanel", "items": [], "styleType": "default", "bodyBackgroundColor": "primary-contrast-500", "tabTitleColor": "auto", "selectedTabTitleColor": "auto", "headerBackgroundColor": "auto", "underlineSelectedTabColor": "auto" }, "parentName": "ControlGroupContainer", "propertyName": "items", "index": 0 }, { "operation": "insert", "name": "AccountTimeline", "values": { "type": "crt.TabContainer", "items": [], "caption": "#ResourceString(AccountTimeline_caption)#", "iconPosition": "only-text" }, "parentName": "TabPanel_grveew2", "propertyName": "items", "index": 0 }, { "operation": "insert", "name": "GridContainer_qaocexw", "values": { "type": "crt.GridContainer", "items": [], "rows": "minmax(32px, max-content)", "columns": [ "minmax(32px, 1fr)", "minmax(32px, 1fr)" ], "gap": { "columnGap": "large", "rowGap": 0 } }, "parentName": "AccountTimeline", "propertyName": "items", "index": 0 }, { "operation": "insert", "name": "Timeline_qwerty", "values": { "type": "usr.Timeline", "layoutConfig": { "column": 1, "row": 1, "colSpan": 12, "rowSpan": 8 }, "primaryColumnValue": "$UsrAccount", "cardSchemaName": "AccountPageV2", "entitySchemaName": "Account" }, "parentName": "GridContainer_qaocexw", "propertyName": "items", "index": 0 } ]/**SCHEMA_VIEW_CONFIG_DIFF*/, viewModelConfig: /**SCHEMA_VIEW_MODEL_CONFIG*/{ "attributes": { "UsrName": { "modelConfig": { "path": "PDS.UsrName" } }, "Id": { "modelConfig": { "path": "PDS.Id" } }, "UsrAccount": { "modelConfig": { "path": "PDS.UsrAccount" } } } }/**SCHEMA_VIEW_MODEL_CONFIG*/, modelConfig: /**SCHEMA_MODEL_CONFIG*/{ "dataSources": { "PDS": { "type": "crt.EntityDataSource", "config": { "entitySchemaName": "UsrRequests" }, "scope": "page" } }, "primaryDataSourceName": "PDS" }/**SCHEMA_MODEL_CONFIG*/, handlers: /**SCHEMA_HANDLERS*/[]/**SCHEMA_HANDLERS*/, converters: /**SCHEMA_CONVERTERS*/{}/**SCHEMA_CONVERTERS*/, validators: /**SCHEMA_VALIDATORS*/{}/**SCHEMA_VALIDATORS*/ }; });
-
- На панели инструментов дизайнера клиентского модуля нажмите [ Сохранить ] ([ Save ]).
Результат выполнения примера
Чтобы посмотреть результат выполнения примера:
- Перейдите на страницу приложения Requests и нажмите [ Запустить приложение ] ([ Run app ]).
- На панели инструментов приложения Requests нажмите [ Добавить ] ([ New ]).
- В поле [ Название ] ([ Name ]) введите значение "Request's name".
- В поле [ Контрагент ] ([ Account ]) выберите контрагента (например, "Accom").
В результате выполнения примера на странице заявки отображается вкладка [ Хронология контрагента ] ([ Account timeline ]) выбранного контрагента "Accom".
В Freedom UI дизайнере на месте пользовательского веб-компонента отображается заглушка.
Пример реализован для приложения версии 8.0.3 и выше.
Пример. На страницу записи пользовательского раздела [ Requests ] добавить внешний пользовательский компонент на фреймворке Angular.
1. Создать Angular-проект для разработки внешнего пользовательского компонента
Создадим Angular-проект для разработки внешнего пользовательского компонента с использованием *.zip-архива, который содержит Angular-проект c шаблоном внешнего пользовательского компонента.
Чтобы создать Angular-проект для разработки внешнего пользовательского компонента с использованием *.zip-архива:
- Скачайте и разархивируйте *.zip-архив.
- Откройте проект в Microsoft Visual Studio Code.
- Во всех файлах проекта измените значение макроса имени Angular-проекта <%projectName%> на sdk_remote_module_package.
- Во всех файлах проекта измените значение макроса префикса <%vendorPrefix%> на usr.
- Установите npm-модули. Для этого в терминале командной строки Microsoft Visual Studio Code выполните команду npm i.
В результате будет создан Angular-проект для разработки внешнего пользовательского компонента.
2. Создать внешний пользовательский компонент
-
В проекте создайте Angular-компонент. Для этого в терминале командной строки Microsoft Visual Studio Code выполните команду ng g c view-elements/input.
В результате в каталог src/app/view-elements/input проекта будут добавлены файлы компонента InputComponent.
-
Укажите, что компонент InputComponent является визуальным элементом.
- Перейдите в файл input.component.ts.
- В компонент импортируйте функциональность декоратора CrtViewElement из библиотеки @creatio-devkit/common.
- Отметьте компонент декоратором CrtViewElement.
- Сохраните файл.
Файл input.component.tsКод скопированimport { Component, OnInit } from '@angular/core'; /* Импорт функциональности декоратора CrtViewElement из библиотеки @creatio-devkit/common. */ import { CrtViewElement } from '@creatio-devkit/common'; @Component({ selector: 'usr-input', templateUrl: './input.component.html', styleUrls: ['./input.component.scss'] }) /* Добавляем декоратор CrtViewElement к компоненту InputComponent. */ @CrtViewElement({ selector: 'usr-input', type: 'usr.Input' }) export class InputComponent implements OnInit { constructor() { } ngOnInit(): void { } }
-
Зарегистрируйте визуальный элемент InputComponent в качестве компонента.
- Перейдите в файл app.module.ts.
- В декоратор CrtModule добавьте визуальный элемент InputComponent.
- В методе ngDoBootstrap() корневого модуля AppModule зарегистрируйте визуальный элемент InputComponent в качестве компонента (т. е. Angular Element).
- Сохраните файл.
Файл app.module.tsКод скопированimport { DoBootstrap, Injector, NgModule } from '@angular/core'; /* Импорт функциональности функции createCustomElement из библиотеки @angular/elements. */ import { createCustomElement } from '@angular/elements'; import { BrowserModule } from '@angular/platform-browser'; import { CrtModule } from '@creatio-devkit/common'; import { InputComponent } from './view-elements/input/input.component'; @CrtModule({ /* Указывает, что InputComponent является визуальным элементом. */ viewElements: [InputComponent] }) @NgModule({ declarations: [ InputComponent ], imports: [BrowserModule], providers: [], }) export class AppModule implements DoBootstrap { constructor(private _injector: Injector) {} ngDoBootstrap(): void { /* Регистрирует InputComponent в качестве Angular Element. */ const element = createCustomElement(InputComponent, { injector: this._injector, }); customElements.define('usr-input', element); } }
- Выполните сборку проекта. Для этого в терминале командной строки Microsoft Visual Studio Code выполните команду npm run build.
В результате в каталог dist Angular-проекта будет добавлена сборка с именем sdk_remote_module_package.
3. Добавить внешний пользовательский компонент на страницу Freedom UI
- Используя шаблон [ Данные и бизнес-процессы ] ([ Records & business processes ]), создайте пользовательское приложение Requests. Для этого воспользуйтесь инструкцией, которая приведена в статье Создать пользовательское приложение.
- Настройте Creatio для работы в файловой системе. Для этого воспользуйтесь инструкцией, которая приведена в статье Внешние IDE.
-
Выгрузите пакеты в файловую систему. Используем выгрузку через интерфейс приложения. Для этого на панели инструментов раздела [ Конфигурация ] ([ Configuration ]) в группе действий [ Разработка в файловой системе ] ([ File system development mode ]) выберите [ Выгрузить все пакеты в файловую систему ] ([ Download packages to file system ]).
- В каталоге пакета UsrRequests в файловой системе создайте каталог Files/src/js.
- Из каталога dist проекта cкопируйте сборку в каталог Files/src/js. Путь к сборке проекта: Files/src/js/sdk_remote_module_package.
- Выполните компиляцию конфигурации. Для этого воспользуйтесь инструкцией, которая приведена в статье Операции в Creatio IDE.
- В рабочей области страницы приложения Requests откройте страницу [ Страница записи Requests ] ([ Requests form page ]).
- На панели действий Freedom UI дизайнера нажмите на кнопку
. После сохранения настроек страницы открывается исходный код страницы Freedom UI.
-
В секции viewConfigDiff добавьте конфигурационный объект пользовательского компонента.
Секция viewConfigDiffКод скопированviewConfigDiff: /**SCHEMA_VIEW_CONFIG_DIFF*/[ ..., { "operation": "insert", "name": "UsrInput", "values": { "layoutConfig": { "column": 1, "row": 2, "colSpan": 1, "rowSpan": 1 }, /* Свойство, которое определяет тип элемента. */ "type": "usr.Input", }, "parentName": "LeftAreaProfileContainer", "propertyName": "items", "index": 1 } ]/**SCHEMA_VIEW_CONFIG_DIFF*/,
Полный исходный код схемы страницыUsrRequests_FormPageКод скопированdefine("UsrRequests_FormPage", /**SCHEMA_DEPS*/[]/**SCHEMA_DEPS*/, function/**SCHEMA_ARGS*/()/**SCHEMA_ARGS*/ { return { viewConfigDiff: /**SCHEMA_VIEW_CONFIG_DIFF*/[ { "operation": "insert", "name": "UsrName", "values": { "layoutConfig": { "column": 1, "row": 1, "colSpan": 1, "rowSpan": 1 }, "type": "crt.Input", "label": "$Resources.Strings.UsrName", "control": "$UsrName", "labelPosition": "auto" }, "parentName": "LeftAreaProfileContainer", "propertyName": "items" }, { "operation": "insert", "name": "UsrInput", "values": { "layoutConfig": { "column": 1, "row": 2, "colSpan": 1, "rowSpan": 1 }, /* Свойство, которое определяет тип элемента. */ "type": "usr.Input", }, "parentName": "LeftAreaProfileContainer", "propertyName": "items", "index": 1 } ]/**SCHEMA_VIEW_CONFIG_DIFF*/, viewModelConfig: /**SCHEMA_VIEW_MODEL_CONFIG*/{ "attributes": { "UsrName": { "modelConfig": { "path": "PDS.UsrName" } }, "Id": { "modelConfig": { "path": "PDS.Id" } } } }/**SCHEMA_VIEW_MODEL_CONFIG*/, modelConfig: /**SCHEMA_MODEL_CONFIG*/{ "dataSources": { "PDS": { "type": "crt.EntityDataSource", "config": { "entitySchemaName": "UsrRequests" } } } }/**SCHEMA_MODEL_CONFIG*/, handlers: /**SCHEMA_HANDLERS*/[]/**SCHEMA_HANDLERS*/ }; });
- На панели инструментов дизайнера клиентского модуля нажмите [ Сохранить ] ([ Save ]).
Результат выполнения примера
Чтобы посмотреть результат выполнения примера:
- Перейдите на страницу приложения Requests и нажмите [ Запустить приложение ] ([ Run app ]).
- На панели инструментов приложения Requests нажмите [ Добавить ] ([ New ]).
В результате выполнения примера на странице заявки отображается пользовательский компонент, который реализован на фреймворке Angular.
Далее вы можете переходить к реализации бизнес-логики. Подробнее читайте в статье Реализовать бизнес-логику внешнего пользовательского компонента.
Пример реализован для приложения версии 8.0.3 и выше.
Пример. На страницу записи пользовательского раздела [ Requests ] добавить поле. Название и значения пользовательского поля и поля [ Название ] ([ Name ]) совпадают. Поле реализовать с использованием внешнего пользовательского компонента на фреймворке Angular.
1. Реализовать внешний пользовательский компонент
Чтобы реализовать внешний пользовательский компонент, воспользуйтесь инструкцией, которая приведена в статье Реализовать внешний пользовательский компонент.
2. Реализовать поле ввода
-
В компоненте реализуйте поле ввода.
- Перейдите в файл input.component.ts.
- В компонент импортируйте функциональность декоратора Input из библиотеки @angular/core.
- В компонент импортируйте функциональность декоратора CrtInput из библиотеки @creatio-devkit/common.
- В класс компонента InputComponent добавьте свойство value, которое отвечает за значение поля ввода.
- Свойство value отметьте декораторами Input и CrtInput.
- В класс компонента InputComponent добавьте свойство label, которое отвечает за название поля ввода.
- Свойство label отметьте декораторами Input и CrtInput.
- Сохраните файл.
Файл input.component.tsКод скопирован/* Импорт функциональности декораторов из библиотеки @angular/core. */ import { Component, Input, OnInit } from '@angular/core'; /* Импорт функциональности декораторов из библиотеки @creatio-devkit/common. */ import { CrtInput, CrtViewElement } from '@creatio-devkit/common'; ... export class InputComponent implements OnInit { constructor() { } /* Добавляем декораторы к свойству value. */ @Input() @CrtInput() /* Значение поля ввода. */ public value: string = ''; /* Добавляем декораторы к свойству label. */ @Input() @CrtInput() /* Название поля ввода. */ public label!: string; ngOnInit(): void { } }
-
Реализуйте отслеживание изменений значения поля ввода.
- Перейдите в файл input.component.ts.
- В компонент импортируйте функциональность декоратора Output и события EventEmitter из библиотеки @angular/core.
- В компонент импортируйте функциональность декоратора CrtOutput из библиотеки @creatio-devkit/common.
- В класс компонента InputComponent добавьте событие EventEmitter<string>(), которое отслеживает изменение значения в поле ввода.
- Событие EventEmitter<string>() отметьте декораторами Output и CrtOutput.
- Сохраните файл.
Файл input.component.tsКод скопирован/* Импорт функциональности декораторов из библиотеки @angular/core. */ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; /* Импорт функциональности декораторов из библиотеки @creatio-devkit/common. */ import { CrtInput, CrtOutput, CrtViewElement } from '@creatio-devkit/common'; ... export class InputComponent implements OnInit { ... /* Добавляем декораторы к событию EventEmitter<string>(). */ @Output() @CrtOutput() /* Отслеживает изменение значения в поле ввода. */ public valueChange = new EventEmitter<string>(); ... }
Полный исходный код файла input.component.tsФайл input.component.tsКод скопирован/* Импорт функциональности декораторов из библиотеки @angular/core. */ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; /* Импорт функциональности декораторов из библиотеки @creatio-devkit/common. */ import { CrtInput, CrtOutput, CrtViewElement } from '@creatio-devkit/common'; @Component({ selector: 'usr-input', templateUrl: './input.component.html', styleUrls: ['./input.component.scss'] }) /* Добавляем декоратор CrtViewElement к компоненту InputComponent. */ @CrtViewElement({ selector: 'usr-input', type: 'usr.Input' }) export class InputComponent implements OnInit { constructor() { } /* Добавляем декораторы к свойству value. */ @Input() @CrtInput() /* Значение поля ввода. */ public value: string = ''; /* Добавляем декораторы к свойству label. */ @Input() @CrtInput() /* Название поля ввода. */ public label!: string; /* Добавляем декораторы к событию EventEmitter<string>(). */ @Output() @CrtOutput() /* Отслеживает изменение значения в поле ввода. */ public valueChange = new EventEmitter<string>(); ngOnInit(): void { } }
-
В файл input.component.html добавьте разметку пользовательского компонента.
Файл input.component.htmlКод скопирован<div class="wrapper"> <label class="label">{{label}}</label> <input #input class="input" type="text" [value]="value" (keyup)="valueChange.emit(input.value)" /> </div>
-
В файл input.component.scss добавьте стили пользовательского компонента.
Файл input.component.scssКод скопирован.wrapper { display: flex; flex-direction: row; gap: 10px; padding: 10px; align-items: center; }
- Выполните сборку проекта. Для этого в терминале командной строки Microsoft Visual Studio Code выполните команду npm run build.
В результате в каталог dist Angular-проекта будет добавлена сборка с именем sdk_remote_module_package.
3. Добавить поле ввода на страницу Freedom UI
- Добавьте внешний пользовательский компонент на страницу Freedom UI. Для этого воспользуйтесь инструкцией, которая приведена в статье Реализовать внешний пользовательский компонент.
-
В секции viewConfigDiff добавьте поле ввода, которое реализовано во внешнем пользовательском компоненте.
- Привяжите свойство label элемента UsrInput к локализуемой строке названия поля [ Название ] ([ Name ]).
- Привяжите свойство value элемента UsrInput к атрибуту $UsrName модели.
Секция viewConfigDiffКод скопированviewConfigDiff: /**SCHEMA_VIEW_CONFIG_DIFF*/[ ..., { "operation": "insert", "name": "UsrInput", "values": { "layoutConfig": { "column": 1, "row": 2, "colSpan": 1, "rowSpan": 1 }, /* Свойство, которое определяет тип элемента. */ "type": "usr.Input", /* Свойство, которое определяет название поля. Привязано к значению атрибута UsrName. */ "label": "$Resources.Strings.UsrName", /* Свойство, которое определяет значение поля. Привязано к значению атрибута UsrName. */ "value": "$UsrName", }, "parentName": "LeftAreaProfileContainer", "propertyName": "items", "index": 1 } ]/**SCHEMA_VIEW_CONFIG_DIFF*/,
Полный исходный код схемы страницыUsrRequests_FormPageКод скопированdefine("UsrRequests_FormPage", /**SCHEMA_DEPS*/[]/**SCHEMA_DEPS*/, function/**SCHEMA_ARGS*/()/**SCHEMA_ARGS*/ { return { viewConfigDiff: /**SCHEMA_VIEW_CONFIG_DIFF*/[ { "operation": "insert", "name": "UsrName", "values": { "layoutConfig": { "column": 1, "row": 1, "colSpan": 1, "rowSpan": 1 }, "type": "crt.Input", "label": "$Resources.Strings.UsrName", "control": "$UsrName", "labelPosition": "auto" }, "parentName": "LeftAreaProfileContainer", "propertyName": "items" }, { "operation": "insert", "name": "UsrInput", "values": { "layoutConfig": { "column": 1, "row": 2, "colSpan": 1, "rowSpan": 1 }, /* Свойство, которое определяет тип элемента. */ "type": "usr.Input", /* Свойство, которое определяет название поля. Привязано к значению атрибута UsrName. */ "label": "$Resources.Strings.UsrName", /* Свойство, которое определяет значение поля. Привязано к значению атрибута UsrName. */ "value": "$UsrName", }, "parentName": "LeftAreaProfileContainer", "propertyName": "items", "index": 1 } ]/**SCHEMA_VIEW_CONFIG_DIFF*/, viewModelConfig: /**SCHEMA_VIEW_MODEL_CONFIG*/{ "attributes": { "UsrName": { "modelConfig": { "path": "PDS.UsrName" } }, "Id": { "modelConfig": { "path": "PDS.Id" } } } }/**SCHEMA_VIEW_MODEL_CONFIG*/, modelConfig: /**SCHEMA_MODEL_CONFIG*/{ "dataSources": { "PDS": { "type": "crt.EntityDataSource", "config": { "entitySchemaName": "UsrRequests" } } } }/**SCHEMA_MODEL_CONFIG*/, handlers: /**SCHEMA_HANDLERS*/[]/**SCHEMA_HANDLERS*/ }; });
- На панели инструментов дизайнера клиентского модуля нажмите [ Сохранить ] ([ Save ]).
Результат выполнения примера
Чтобы посмотреть результат выполнения примера:
- Перейдите на страницу приложения Requests и нажмите [ Запустить приложение ] ([ Run app ]).
- На панели инструментов приложения Requests нажмите [ Добавить ] ([ New ]).
- В поле [ Название ] ([ Name ]) введите значение "Test".
В результате выполнения примера на странице заявки отображается пользовательское поле. Название и значение пользовательского поля и поля [ Название ] ([ Name ]) совпадают. Поле реализовано с использованием внешнего пользовательского компонента на фреймворке Angular.
При необходимости вы можете настроить валидацию поля ввода. Подробнее читайте в статье Реализовать валидацию во внешнем пользовательском компоненте.
Пример реализован для приложения версии 8.0.3 и выше.
Пример. На странице записи пользовательского раздела [ Requests ] добавить валидатор, который проверяет, что поле заполнено. Поле реализовано с использованием внешнего пользовательского компонента на фреймворке Angular.
1. Реализовать внешний пользовательский компонент
Чтобы реализовать внешний пользовательский компонент, воспользуйтесь инструкцией, которая приведена в статье Реализовать внешний пользовательский компонент.
2. Реализовать поле ввода
Чтобы реализовать поле ввода, воспользуйтесь инструкцией, которая приведена в статье Реализовать бизнес-логику внешнего пользовательского компонента.
3. Реализовать валидацию поля ввода
-
В компоненте получите признак валидности связанного атрибута.
- Перейдите в файл input.component.ts.
- В компонент импортируйте функциональность декоратора CrtValidationInfo из библиотеки @creatio-devkit/common.
- В класс компонента InputComponent добавьте свойство valueValidationInfo, которое отображает информацию о невалидности связанного атрибута.
- Свойство valueValidationInfo отметьте декораторами Input и CrtValidationInput.
- Сохраните файл.
Файл input.component.tsКод скопирован/* Импорт функциональности декораторов из библиотеки @angular/core. */ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; /* Импорт функциональности декораторов из библиотеки @creatio-devkit/common. */ import { CrtInput, CrtOutput, CrtValidationInfo, CrtValidationInput, CrtViewElement } from '@creatio-devkit/common'; ... export class InputComponent implements OnInit { ... /* Добавляем декораторы к свойству valueValidationInfo. */ @Input() @CrtValidationInput() /* Отображает информацию о невалидности значения в поле ввода. */ public valueValidationInfo!: CrtValidationInfo; ... }
Полный исходный код файла input.component.tsФайл input.component.tsКод скопирован/* Импорт функциональности декораторов из библиотеки @angular/core. */ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; /* Импорт функциональности декораторов из библиотеки @creatio-devkit/common. */ import { CrtInput, CrtInterfaceDesignerItem, CrtOutput, CrtValidationInfo, CrtValidationInput, CrtViewElement } from '@creatio-devkit/common'; @Component({ selector: 'usr-input', templateUrl: './input.component.html', styleUrls: ['./input.component.scss'] }) /* Добавляем декоратор CrtViewElement к компоненту InputComponent. */ @CrtViewElement({ selector: 'usr-input', type: 'usr.Input' }) export class InputComponent implements OnInit { constructor() { } /* Добавляем декораторы к свойству value. */ @Input() @CrtInput() /* Значение поля ввода. */ public value: string = ''; /* Добавляем декораторы к свойству label. */ @Input() @CrtInput() /* Название поля ввода. */ public label!: string; /* Добавляем декораторы к событию EventEmitter<string>(). */ @Output() @CrtOutput() /* Отслеживает изменение значения в поле ввода. */ public valueChange = new EventEmitter<string>(); /* Добавляем декораторы к свойству valueValidationInfo. */ @Input() @CrtValidationInput() /* Отображает информацию о невалидности значения в поле ввода. */ public valueValidationInfo!: CrtValidationInfo; ngOnInit(): void { } }
-
В файл input.component.html добавьте разметку пользовательского компонента, если значение поля невалидно.
Файл input.component.htmlКод скопирован<div class="wrapper"> <label class="label">{{label}}</label> <input ... [class.invalid]=" valueValidationInfo && !valueValidationInfo.valid && valueValidationInfo.touched " ... /> </div>
Полный исходный код файла input.component.htmlФайл input.component.htmlКод скопирован<div class="wrapper"> <label class="label">{{label}}</label> <input #input class="input" [class.invalid]=" valueValidationInfo && !valueValidationInfo.valid && valueValidationInfo.touched " type="text" [value]="value" (keyup)="valueChange.emit(input.value)" /> </div>
-
В файл input.component.scss добавьте стили пользовательского компонента.
Файл input.component.scssКод скопирован.wrapper { ... .input.invalid { background-color: #FDD8CF; } }
Полный исходный код файла input.component.scssФайл input.component.scssКод скопирован.wrapper { display: flex; flex-direction: row; gap: 10px; padding: 10px; align-items: center; .input.invalid { background-color: #FDD8CF; } }
- Выполните сборку проекта. Для этого в терминале командной строки Microsoft Visual Studio Code выполните команду npm run build.
В результате в каталог dist Angular-проекта будет добавлена сборка с именем sdk_remote_module_package.
Результат выполнения примера
Чтобы посмотреть результат выполнения примера:
- Перейдите на страницу приложения Requests и нажмите [ Запустить приложение ] ([ Run app ]).
- На панели инструментов приложения Requests нажмите [ Добавить ] ([ New ]).
- В поле [ Название ] ([ Name ]) введите значение "Test".
- Удалите значение в пользовательском поле.
В результате выполнения примера на странице заявки отображается пользовательское поле. Название и значение пользовательского поля и поля [ Название ] ([ Name ]) совпадают. Поле реализовано с использованием внешнего пользовательского компонента на фреймворке Angular.
Далее вы можете переходить к добавлению внешнего пользовательского компонента в библиотеку Freedom UI дизайнера. Подробнее читайте в статье Добавить внешний пользовательский компонент в библиотеку Freedom UI дизайнера.
Пример реализован для приложения версии 8.0.3 и выше.
Пример. Добавить внешний пользовательский компонент в библиотеку Freedom UI дизайнера. Использовать изображение, которое приведено ниже.
1. Реализовать внешний пользовательский компонент
Чтобы реализовать внешний пользовательский компонент, воспользуйтесь инструкцией, которая приведена в статье Реализовать внешний пользовательский компонент.
2. Реализовать поле ввода
Чтобы реализовать поле ввода, воспользуйтесь инструкцией, которая приведена в статье Реализовать бизнес-логику внешнего пользовательского компонента.
3. Реализовать валидацию поля ввода
Чтобы реализовать валидацию поля ввода, воспользуйтесь инструкцией, которая приведена в статье Реализовать валидацию во внешнем пользовательском компоненте.
4. Добавить компонент в библиотеку Freedom UI дизайнера
-
Настройте отображение компонента в библиотеке Freedom UI дизайнера.
- Перейдите в файл input.component.ts.
- В компонент импортируйте функциональность декоратора CrtInterfaceDesignerItem из библиотеки @creatio-devkit/common.
- Отметьте компонент декоратором CrtInterfaceDesignerItem со свойством toolbarConfig, которое отвечает за отображение элемента в библиотеке Freedom UI дизайнера.
- Загрузите изображение, которое планируется отображать в библиотеке Freedom UI дизайнера и в свойстве icon укажите путь к изображению, которое планируется отображать в библиотеке Freedom UI дизайнера. В нашем примере изображение содержится в каталоге input.
- Сохраните файл.
Файл input.component.tsКод скопирован... /* Импорт функциональности декораторов из библиотеки @creatio-devkit/common. */ import { CrtInput, CrtInterfaceDesignerItem, CrtOutput, CrtValidationInfo, CrtValidationInput, CrtViewElement } from '@creatio-devkit/common'; ... /* Добавляем декоратор CrtViewElement к компоненту InputComponent. */ @CrtInterfaceDesignerItem({ /* Отвечает за отображение элемента в библиотеке Freedom UI дизайнера. */ toolbarConfig: { caption: 'Custom Input', name: 'CustomInput', /* Путь к изображению для компонента. */ icon: require('!!raw-loader?{esModule:false}!./icon.png'), defaultPropertyValues: { label: 'Custom input' } } }) ...
Полный исходный код файла input.component.tsФайл input.component.tsКод скопирован/* Импорт функциональности декораторов из библиотеки @angular/core. */ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; /* Импорт функциональности декораторов из библиотеки @creatio-devkit/common. */ import { CrtInput, CrtInterfaceDesignerItem, CrtOutput, CrtValidationInfo, CrtValidationInput, CrtViewElement } from '@creatio-devkit/common'; @Component({ selector: 'usr-input', templateUrl: './input.component.html', styleUrls: ['./input.component.scss'] }) /* Добавляем декоратор CrtViewElement к компоненту InputComponent. */ @CrtViewElement({ selector: 'usr-input', type: 'usr.Input' }) /* Добавляем декоратор CrtViewElement к компоненту InputComponent. */ @CrtInterfaceDesignerItem({ /* Отвечает за отображение элемента в библиотеке Freedom UI дизайнера. */ toolbarConfig: { caption: 'Custom Input', name: 'CustomInput', /* Путь к изображению для компонента. */ icon: require('!!raw-loader?{esModule:false}!./icon.png'), defaultPropertyValues: { label: 'Custom input' } } }) export class InputComponent implements OnInit { constructor() { } /* Добавляем декораторы к свойству value. */ @Input() @CrtInput() /* Значение поля ввода. */ public value: string = ''; /* Добавляем декораторы к свойству label. */ @Input() @CrtInput() /* Название поля ввода. */ public label!: string; /* Добавляем декораторы к событию EventEmitter<string>(). */ @Output() @CrtOutput() /* Отслеживает изменение значения в поле ввода. */ public valueChange = new EventEmitter<string>(); /* Добавляем декораторы к свойству valueValidationInfo. */ @Input() @CrtValidationInput() /* Отображает информацию о невалидности значения в поле ввода. */ public valueValidationInfo!: CrtValidationInfo; ngOnInit(): void { } }
- Выполните сборку проекта. Для этого в терминале командной строки Microsoft Visual Studio Code выполните команду npm run build.
В результате в каталог dist Angular-проекта будет добавлена сборка с именем sdk_remote_module_package.
Результат выполнения примера
Чтобы посмотреть результат выполнения примера, в рабочей области страницы приложения Requests откройте страницу [ Страница записи Requests ] ([ Requests form page ]).
В результате выполнения примера компонент [ Пользовательский ввод ] ([ Custom input ]) отображается в библиотеке Freedom UI дизайнера в группе [ Пользовательские компоненты ] ([ Custom components ]).
Также внешний пользовательский компонент отображается во Freedom UI дизайнере при добавлении на холст.