Для изучения IStr изменяйте содержимое файла simple.ts из примера в статье "Начало работы".
Для сравнения элемента IStr с элементом IElement и элементом IContextElement добавим на форму соответствующие элементы.
Для визуализации размеров элементов мы к каждому элементу добавили свойство bordered.
/*Инструкции для WebPack, который скопирует эти файлы в ваш каталог*/import'./index.html';import'ui-organizer/page.css';import'ui-organizer/style.css';import'ui-organizer/vars.css';/*Описание формы simpleForm*/importtype { IContextElement, IElement, IForm, IStr} from"ui-organizer";import { AppManager, UIForm } from"ui-organizer";exportletform: IForm = <IForm>{type:UIForm,name:'simpleForm',elements: [ <IElement>{type:'IElement',value:'Элемент',bordered:true }, <IContextElement>{type:'IContextElement',value:'Элемент с меню',bordered:true }, <IStr>{type:'IStr',value:'Строка',bordered:true }, ]}/*Инициализация приложения AppManager*/varGlobal: any = window;Global.AppManager = AppManager;Global.onpopstate = AppManager.onPopState;AppManager.init(document.querySelector('#app')) .then(async ()=>{AppManager.add([form]);AppManager.open('simpleForm', {}); })
Как можете заметить элемент IStr, в отличие от IElement, занимает все оставшиеся пространство формы (как и элемент IContextElement). Это связано с тем, что в элементе IStr как и в элементе IContextElement по умолчанию свойство flex установлено в Flex.flexible (описание выравнивания смотрите здесь).
Установите свойство flex в Flex.fixed. Увидите, что элементы в простейшем случае выглядят одинаково.
Если на момент установки данных свойство value равно undefined, то текст элемента устанавливается данными. В примере ниже мы закомментировали свойство value.
Мы добавили свойство bindingProperty в каждый элемент, значение соответствует данным. И передаем данные в метод открытия формы.
/*Инструкции для WebPack, который скопирует эти файлы в ваш каталог*/import'./index.html';import'ui-organizer/page.css';import'ui-organizer/style.css';import'ui-organizer/vars.css';/*Описание формы simpleForm*/importtype { IContextElement, IDataElement, IElement, IForm, IStr} from"ui-organizer";import { AppManager, UIForm } from"ui-organizer";exportletform: IForm = <IForm>{type:UIForm,name:'simpleForm',elements: [ <IDataElement>{type:'IDataElement',// value: 'Элемент',bordered:true,bindingProperty:'dataElement' }, <IContextElement>{type:'IContextElement',// value: 'Элемент с меню',bordered:true,bindingProperty:'contextElement' }, <IStr>{type:'IStr',// value: 'Строка',bordered:true,bindingProperty:'str' }, ]}letdata = {dataElement:'Данные элемента IDataElement',contextElement:'Данные элемента IContextElement',str:'Данные элемента IStr',}/*Инициализация приложения AppManager*/varGlobal: any = window;Global.AppManager = AppManager;Global.onpopstate = AppManager.onPopState;AppManager.init(document.querySelector('#app')) .then(async ()=>{AppManager.add([form]);AppManager.open('simpleForm', data); })
Свойство value было заполнено данными и они отображаются на экране. Повторная установка данных не влияет на значение value (если оно не undefined).
Если вы раскомментируете свойство value увидите результат из предыдущего раздела.
3.Добавьтесоответствующуюстрокув html:```html<!DOCTYPE html><html><head> ... <link rel="stylesheet" href="fontawesome-free/css/all.min.css"><!--скопирован программой webpack в ./dist/fontawesome-free/css из папки node_modules/@fortawesome/fontawesome-free/css/all.min.css--> </head>...
Добавим к элементу IStr меню, которое позволит просматривать данные переданные форме. В данных передадим набор элементов управления с описанием.
Для этого мы добавили интерфейс IMyForm, для облегчения написания программы.
/*Инструкции для WebPack, который скопирует эти файлы в ваш каталог*/import'./index.html';import'ui-organizer/page.css';import'ui-organizer/style.css';import'ui-organizer/vars.css';/*Описание формы simpleForm*/importtype { IElement, IFigAwesome, IForm, IMenu, IMenuItem, IStr} from"ui-organizer";import { AppManager, ContentType, IconDisplay, UIForm, UIMenu, UIMenuItem, UISetDataEvent, UIMouseEvent } from"ui-organizer";exportinterfaceIMyFormextendsIForm {itemNumber: number, //Номер в массиве данных, который сейчас отображается на форме.//Чтобы каждый раз не выполнять form.getElement('<имя IStr>'), к тому же мы не задали имя IStr.textElement: IStr,//Элемент управления IStr, который отображает изначальный текст. strElement: IStr,//Элемент управления IStr, который отображает преобразованный текст в соответствии с типом contentType.getValue(number:number): string//Формирует строку из данных и сохраняет номер в itemNumber.}exportletform: IMyForm = <IMyForm>{type:UIForm,name:'simpleForm',elements: [ <IElement>{type:'IElement',bordered:true,value:'В первом элементе IStr отображается первоначальный текст c разметкой Markdown.\n\Во втором элементе IStr отображается отформатированный текст Markdown.\n\Используйте кнопки навигации вперед-назад в меню второго элемента IStr.', }, <IStr>{type:'IStr',caption:'Первоначальный текст MD',bordered:true,asynconAfterSetData(event: UISetDataEvent, form: IMyForm, elem: IStr) {form.textElement = elem;elem.value = form.getValue(0); } }, <IStr>{type:'IStr',caption:'Отформатированный MD',contentType:ContentType.md,bordered:true,menu: <IMenu>{type:UIMenu,elements: [ <IMenuItem>{type:UIMenuItem,caption:'Назад',iconDisplay:IconDisplay.icon,figAwesome: <IFigAwesome>{faClass: ['fas', 'fa-chevron-left', 'fa-lg'],faStyle: ['color: grey;'] },asynconClick(event: UIMouseEvent, form: IMyForm) {if (form.itemNumber == 0) return;letitemNumber: number = form.itemNumber - 1;form.textElement.value = form.getValue(itemNumber);form.strElement.value = form.getValue(itemNumber); } }, <IMenuItem>{type:UIMenuItem,caption:'Вперед',iconDisplay:IconDisplay.icon,figAwesome: <IFigAwesome>{faClass: ['fas', 'fa-chevron-right', 'fa-lg'],faStyle: ['color: grey;'] },asynconClick(event: UIMouseEvent, form: IMyForm) {letmaxItemNumber: number = Array.isArray(form.getData()) ? form.getData().length -1 : 0;if (form.itemNumber == maxItemNumber) return;letitemNumber: number = form.itemNumber + 1;form.textElement.value = form.getValue(itemNumber); form.strElement.value = form.getValue(itemNumber); } }, ] },asynconAfterSetData(event: UISetDataEvent, form: IMyForm, elem: IStr) {form.strElement = elem;elem.value = form.getValue(0); } }, ],itemNumber:0,textElement:undefined,strElement:undefined,getValue(number: number): string { (<IMyForm>this).itemNumber = number;letdata = (<IMyForm>this).getData();if (!Array.isArray(data) || data.length == 0) thrownewError('Данные не являются массивом или пустой массив.');return`${data[number].header}\n${data[number].description}\n${data[number].parent}`; }}letdata = [ {header:'## IElement',description:'Базовый элемент управления. Это обычный div элемент с текстом.',parent:`Нет родительского элемента` }, {header:'## IDataElement',description:'Элемент управления с данными. Здесь можно задать и получить данные элемента.',parent:`Является наследником **IElement**` }, {header:'## IContextElement',description:'Элемент управления с меню и контекстным меню.',parent:`Является наследником **IDataElement**` }, {header:'## IProperty',description:'Элемент управления поле ввода.',parent:`Является наследником **IDataElement**` }, {header:'## IList',description:'Элемент управления список.',parent:`Является наследником **IContextElement**` }, {header:'## IStr',description:'Элемент "Строка". Позволяет отображать текст, html, markdown, ссылку.',parent:`Является наследником **IContextElement**` },]/*Инициализация приложения AppManager*/varGlobal: any = window;Global.AppManager = AppManager;Global.onpopstate = AppManager.onPopState;AppManager.init(document.querySelector('#app')) .then(async ()=>{AppManager.add([form]);AppManager.open('simpleForm', data); })
В методе onAfterSetData первого элемента управления IStr мы устанавливаем свойство textElement формы IMyForm и выполняем первоначальное заполнение свойства value первого элемента управления IStr (contentType = ContentType.text).
В методе onAfterSetData второго элемента управления IStr мы устанавливаем свойство strElement формы IMyForm и выполняем первоначальное заполнение свойства value второго элемента управления IStr (contentType = ContentType.md).
Далее обрабатываем click кнопок меню, где увеличиваем или уменьшаем счетчик индекса массива данных, которые должны отображаться, и заполняем свойство value обоих элементов управления IStr.
Содержание:
Сразу посмотреть пример формы из раздела 4.
1. Сравнение строки и элемента
Для изучения IStr изменяйте содержимое файла simple.ts из примера в статье "Начало работы".
Для сравнения элемента IStr с элементом IElement и элементом IContextElement добавим на форму соответствующие элементы. Для визуализации размеров элементов мы к каждому элементу добавили свойство
bordered
.Как можете заметить элемент IStr, в отличие от IElement, занимает все оставшиеся пространство формы (как и элемент IContextElement). Это связано с тем, что в элементе IStr как и в элементе IContextElement по умолчанию свойство
flex
установлено вFlex.flexible
(описание выравнивания смотрите здесь).Установите свойство
flex
вFlex.fixed
. Увидите, что элементы в простейшем случае выглядят одинаково.2. Первоначальная установка данных
Если на момент установки данных свойство
value
равно undefined, то текст элемента устанавливается данными. В примере ниже мы закомментировали свойствоvalue
.Мы добавили свойство
bindingProperty
в каждый элемент, значение соответствует данным. И передаем данные в метод открытия формы.Свойство
value
было заполнено данными и они отображаются на экране. Повторная установка данных не влияет на значениеvalue
(если оно не undefined).Если вы раскомментируете свойство
value
увидите результат из предыдущего раздела.3. IStr - text, html, markdown
В примере ниже создадим три IStr элемента с разным типом контента.
Первый элемент отображает text, который мы передали в свойство
value
элемента.Второй элемент отображает html, который мы передали в свойство
value
элемента.Второй элемент отображает html, который получается преобразованием markdown текста, который мы передали в свойство
value
элемента.4. IStr с меню
Перед добавлением меню в IStr измените содержимое index.html для использования пиктограмм awesome.
Но, в связи с блокированием cdn сервисов в России этот вариант вас может не устроить. Вы можете сделать по-другому - скачать бибилиотеку fontawesome:
Смотреть как...
Установите необходимые библиотеки:
Измените файл webpack.config.js добавив copy-webpack-plugin: ```javascript const path = require('path'); const UIOrganizerWebpackPlugin = require('ui-organizer-webpack-plugin'); /---Добавили copy-webpack-plugin/ const CopyPlugin = require("copy-webpack-plugin"); /---/
module.exports = { mode: 'development', entry: './simple.ts', output: { filename: 'index.js', path: path.resolve(__dirname,
./dist
), assetModuleFilename: '[name][ext]' }, module: { rules: [ { test: /.ts?$/, use: 'ts-loader' }, { test: /.css$/, type: 'asset/resource',}, { test: /.html$/, type: 'asset/resource', },
], }, plugins: [ new UIOrganizerWebpackPlugin(), /---Добавили copy-webpack-plugin*/
new CopyPlugin({ patterns: [ /*Копируем шрифты и таблицы стилей в папку ./dist/ { from: "./node_modules/@fortawesome/fontawesome-free", to: "./fontawesome-free" }, ], }), /---*/ ], resolve: { extensions: ['.ts', '.js'], } };
Добавим к элементу IStr меню, которое позволит просматривать данные переданные форме. В данных передадим набор элементов управления с описанием.
Для этого мы добавили интерфейс IMyForm, для облегчения написания программы.
В методе
onAfterSetData
первого элемента управления IStr мы устанавливаем свойствоtextElement
формы IMyForm и выполняем первоначальное заполнение свойстваvalue
первого элемента управления IStr (contentType = ContentType.text
).В методе
onAfterSetData
второго элемента управления IStr мы устанавливаем свойствоstrElement
формы IMyForm и выполняем первоначальное заполнение свойстваvalue
второго элемента управления IStr (contentType = ContentType.md
).Далее обрабатываем
click
кнопок меню, где увеличиваем или уменьшаем счетчик индекса массива данных, которые должны отображаться, и заполняем свойствоvalue
обоих элементов управления IStr.Generated using TypeDoc