Options
All
  • Public
  • Public/Protected
  • All
Menu

Namespace PageList

Содержание

  1. Просто список
  2. Список заполняем данными
  3. Список с bindingProperty
  4. Список с заданным элементом строки
  5. Изменение списка в runtime
  6. Добавление меню в список и установка границы
  7. Кнопки с пиктограммами FontAwesome
  8. Добавление, удаление и редактирование строк списка

Сразу посмотреть пример формы из раздела 8.

1. Просто список

Замените содержимое simple.ts из примера в статье "Начало работы" следующим содержанием и пресоберите приложение:

/*Инструкции для WebPack, который скопирует эти файлы в ваш каталог*/
import './index.html';
import 'ui-organizer/page.css';
import 'ui-organizer/style.css';
import 'ui-organizer/vars.css';

/*Описание формы simpleForm*/
import type {IForm, IList} from "ui-organizer";
import { AppManager, UIList, UIForm} from "ui-organizer";

export let form: IForm = <IForm>{
    type: UIForm,
    name: 'simpleForm',
    elements: [
        <IList>{
            type: UIList,
            value: ["Кофе", "Чай", "Прохладительные напитки"]
        }
    ]
}

/*Инициализация приложения AppManager*/
var Global: any = window;
Global.AppManager = AppManager;
Global.onpopstate = AppManager.onPopState;

AppManager.init(document.querySelector('#app'))
    .then(async ()=>{
        AppManager.add([form]);
        AppManager.open('simpleForm', {});
    })

Здесь мы создали простую форму с единственным элементом IList и указали у элемента IList свойство value.

2. Cписок заполняем данными

Замените содержимое simple.ts из примера в статье "Начало работы" следующим содержанием и пресоберите приложение:

/*Инструкции для WebPack, который скопирует эти файлы в ваш каталог*/
import './index.html';
import 'ui-organizer/page.css';
import 'ui-organizer/style.css';
import 'ui-organizer/vars.css';

/*Описание формы simpleForm*/
import type {IForm, IList} from "ui-organizer";
import { AppManager, UIList, UIForm} from "ui-organizer";

export let form: IForm = <IForm>{
    type: UIForm,
    name: 'simpleForm',
    elements: [
        <IList>{
            type: UIList
        }
    ]
}

let data = [
    "Кофе",
    "Чай",
    "Прохладительные напитки"
]

/*Инициализация приложения AppManager*/
var Global: any = window;
Global.AppManager = AppManager;
Global.onpopstate = AppManager.onPopState;

AppManager.init(document.querySelector('#app'))
    .then(async ()=>{
        AppManager.add([form]);
        AppManager.open('simpleForm', data);
    })

Здесь мы создали простую форму с единственным элементом IList и передали ей данные data. Как вы можете заметить мы не указали какими элементами будут строки списка и откуда брать данные.
Форма передала списку данные целиком и список увидев массив, просто сформировал из него строки списка.

3. Cписок с bindingProperty

Внесите изменения:

/*Инструкции для WebPack, который скопирует эти файлы в ваш каталог*/
import './index.html';
import 'ui-organizer/page.css';
import 'ui-organizer/style.css';
import 'ui-organizer/vars.css';

/*Описание формы simpleForm*/
import type {IForm, IList} from "ui-organizer";
import { AppManager, UIList, UIForm } from "ui-organizer";

export let form: IForm = <IForm>{
    type: UIForm,
    name: 'simpleForm',
    elements: [
        <IList>{
            type: UIList,
            name: 'myList',
            bindingProperty: 'objectList'
        }
    ]
}

let data = {
    objectList: [
        {
            item: "Кофе",
            value: "Эспрессо"
        },
        {
            item: "Чай",
            value: "Зеленый чай"
        },
        {
            item: "Прохладительные напитки",
            value: "Апельсиновый сок"
        }
    ]
}

/*Инициализация приложения AppManager*/
var Global: any = window;
Global.AppManager = AppManager;
Global.onpopstate = AppManager.onPopState;

AppManager.init(document.querySelector('#app'))
    .then(async ()=>{
        AppManager.add([form]);
        AppManager.open('simpleForm', data);
    })

Как видите, мы добавили к элементу IList одно свойство bindingProperty, которое определяет откуда брать данные и изменили данные.
Теперь списку передается массив объектов. Элемент IList устроен так, что если не указано дополнительно (как указать будет в следующем разделе), то текст строки списка - это значение первого ключа передаваемого объекта.

Причем, сами данные - это те самые объекты, которые передали. Вы можете убедится в этом вызвав средство разработчика в браузере (F12) и выполнив в консоли следующий код:

AppManager.activeForm.getElement('myList').getData()

для выполнения этого кода мы в IList добавили свойство name: 'myList'.

Если значением свойства item в данных будет объект, то тексту строки списка будет задано строковое представление этого объекта.

4. Список с заданным элементом строки

Для строки списка можно задать любой элемент формы, наследник IDataElement, например: IDataElement, IStr и др.

/*Инструкции для WebPack, который скопирует эти файлы в ваш каталог*/
import './index.html';
import 'ui-organizer/page.css';
import 'ui-organizer/style.css';
import 'ui-organizer/vars.css';

/*Описание формы simpleForm*/
import type {IDataElement, IForm, IList} from "ui-organizer";
import { AppManager, UIList, UIForm, UIDataElement} from "ui-organizer";

export let form: IForm = <IForm>{
    type: UIForm,
    name: 'simpleForm',
    elements: [
        <IList>{
            type: UIList,
            name: 'myList',
            bindingProperty: 'objectList',
            itemsElement: <IDataElement>{
                type: UIDataElement,
                bindingProperty: 'value'
            }
        }
    ]
}

let data = {
    objectList: [
        {
            item: "Кофе",
            value: "Эспрессо"
        },
        {
            item: "Чай",
            value: "Зеленый чай"
        },
        {
            item: "Прохладительные напитки",
            value: "Апельсиновый сок"
        }
    ]
}

/*Инициализация приложения AppManager*/
var Global: any = window;
Global.AppManager = AppManager;
Global.onpopstate = AppManager.onPopState;

AppManager.init(document.querySelector('#app'))
    .then(async ()=>{
        AppManager.add([form]);
        AppManager.open('simpleForm', data);
    })

В IList мы добавили свойство itemsElement и присвоили ему объект IDataElement. Объекту IDataElement, в свою очередь, задали свойство bindingProperty: 'value'. Тем самым имеем список с текстом строк списка: "Эспрессо" и т.д.

На самом деле, когда свойство itemsElement не задано у элемента IList, то "под капотом" создается этот обьект IDataElement, и ему подставляются данные, как описано в первых двух разделах.

5. Изменение списка в runtime

Список заполняется в результате установки данных, но в runtime (после установки данных) мы можем обработать эти данные и изменить строки списка.

/*Инструкции для WebPack, который скопирует эти файлы в ваш каталог*/
import './index.html';
import 'ui-organizer/page.css';
import 'ui-organizer/style.css';
import 'ui-organizer/vars.css';

/*Описание формы simpleForm*/
import type {IDataElement, IForm, IList, IListItem} from "ui-organizer";
import { AppManager, UIList, UIForm, UIDataElement, UISetDataEvent} from "ui-organizer";

export let form: IForm = <IForm>{
    type: UIForm,
    name: 'simpleForm',
    elements: [
        <IList>{
            type: UIList,
            name: 'myList',
            bindingProperty: 'objectList',
            itemsElement: <IDataElement>{
                type: UIDataElement,
                bindingProperty: 'value'
            },
            async onAfterSetData(event: UISetDataEvent, form: IForm, elem: IList): Promise<void> {
                elem.items.forEach(item => {
                    let itemData = (<IListItem>item).getData();
                    (<IListItem>item).element.value = itemData.item + ': ' + itemData.value;
                });
            }
        }
    ]
}


let data = {
    objectList: [
        {
            item: "Кофе",
            value: "Эспрессо"
        },
        {
            item: "Чай",
            value: "Зеленый чай"
        },
        {
            item: "Прохладительные напитки",
            value: "Апельсиновый сок"
        }
    ]
}

/*Инициализация приложения AppManager*/
var Global: any = window;
Global.AppManager = AppManager;
Global.onpopstate = AppManager.onPopState;

AppManager.init(document.querySelector('#app'))
    .then(async ()=>{
        AppManager.add([form]);
        AppManager.open('simpleForm', data);
    })

Здесь в элементе IList мы добавили метод onAfterSetData(), который вызывается после установки данных.

В этом методе мы перебираем строки списка. Для каждой строоки списка получаем доступ к элементу IDataElement следующим образом: (<IListItem>item).element. И присваеваем новое значение.

Вы можете реализовать это немного по-другому:

export let form: IForm = <IForm>{
    type: UIForm,
    name: 'simpleForm',
    elements: [
        <IList>{
            type: UIList,
            name: 'myList',
            bindingProperty: 'objectList',
            itemsElement: <IDataElement>{
                type: UIDataElement,
                async onAfterSetData(event: UISetDataEvent, form: IForm, elem: IDataElement) {
                    elem.value = event.data.item + ': ' + event.data.value;
                }
            }
        }
    ]
}

Здесь мы добавили метод onAfterSetData() уже в элементе IDataElement. Чтобы работать с данными - объектом

{
    item: "Кофе",
    value: "Эспрессо"
}

в этом элементе, мы убрали свойство bindingProperty: 'value'.

6. Добавление меню в список и установка окантовки

/*Инструкции для WebPack, который скопирует эти файлы в ваш каталог*/
import './index.html';
import 'ui-organizer/page.css';
import 'ui-organizer/style.css';
import 'ui-organizer/vars.css';

/*Описание формы simpleForm*/
import type {IDataElement, IForm, IList, IMenu, IMenuItem} from "ui-organizer";
import { AppManager, UIList, UIForm, UIMenu, UIMenuItem, UIDataElement, UIMouseEvent, UISetDataEvent} from "ui-organizer";

export let form: IForm = <IForm>{
    type: UIForm,
    name: 'simpleForm',
    elements: [
        <IList>{
            type: UIList,
            name: 'myList',
            // bindingProperty: 'objectList',
            bordered: true,
            menu: <IMenu>{
                type: UIMenu,
                elements: [
                    <IMenuItem>{
                        type: UIMenuItem,
                        caption: 'objectList',
                        async onClick(event:UIMouseEvent, form: IForm, menu: IMenu, menuItem: IMenuItem) {
                            let list: IList = form.getElement('myList') as IList;
                            let data: any = form.getData();
                            list.setData(data.objectList);
                        }
                    },
                    <IMenuItem>{
                        type: UIMenuItem,
                        caption: 'fooList',
                        async onClick(event:UIMouseEvent, form: IForm, menu: IMenu, menuItem: IMenuItem) {
                            let list: IList = form.getElement('myList') as IList;
                            let data: any = form.getData();
                            list.setData(data.fooList);
                        }
                    },
                ]
            },
            itemsElement: <IDataElement>{
                type: UIDataElement,
                async onAfterSetData(event: UISetDataEvent, form: IForm, elem: IDataElement): Promise<void> {
                    elem.value = event.data.item + ': ' + event.data.value;
                }
            }
        }
    ]
}

let data = {
    objectList: [
        {
            item: "Кофе",
            value: "Эспрессо"
        },
        {
            item: "Чай",
            value: "Зеленый чай"
        },
        {
            item: "Прохладительные напитки",
            value: "Апельсиновый сок"
        }
    ],
    fooList: [
        {
            item: "Инструменты",
            value: "Дрель"
        },
        {
            item: "Хозинвентарь",
            value: "Лопата"
        }
    ]
}

/*Инициализация приложения AppManager*/
var Global: any = window;
Global.AppManager = AppManager;
Global.onpopstate = AppManager.onPopState;

AppManager.init(document.querySelector('#app'))
    .then(async ()=>{
        AppManager.add([form]);
        AppManager.open('simpleForm', data);
    })

В список IList мы добавили меню IMenu с двумя кнопками: objectList и fooList. И в данные добавили еще один массив: fooList.

Кнопка с соответствующим названием подставляет в список одноименный массив.
В событии onClick кнопок мы получаем у формы элемент IList с названием 'myList' и данные. И устанавливаем списку соответствующие данные.

Обратите внимание, что у спсика IList мы убрали свойство bindingProperty: 'objectList'.

Ну, и для демонстрации установили границу элемента - добавили свойство bordered: true.

7. Кнопки с пиктограммами FontAwesome

Для использования пиктограмм FontAwesome можете указать на html странице таблицу стилей с font awesome.

index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>ui-organizer simple form</title>
    <link rel="stylesheet" href="page.css">
    <link rel="stylesheet" href="style.css">    
    <!-- Например --><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css">
    <style>
        /* Просто, поместили форму посередине страницы */
        body { width: 50%; margin: 0px auto 0px auto}
    </style>
</head>
<body>
    <div id="app">
    </div>
    <script type="text/javascript" src="index.js"></script>
</body>
</html>

Но, в связи с блокированием cdn сервисов в России этот вариант вас может не устроить. Вы можете сделать по-другому - скачать бибилиотеку fontawesome:

Смотреть как...
  1. Установите необходимые библиотеки:

    npm install @fortawesome/fontawesome-free copy-webpack-plugin
    
  2. Измените файл 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'], } };


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>
...

Для каждой кнопки меню IMenuItem и списка IList укажите свойство figAwesome.

simple.ts

/*Инструкции для WebPack, который скопирует эти файлы в ваш каталог*/
import './index.html';
import 'ui-organizer/page.css';
import 'ui-organizer/style.css';
import 'ui-organizer/vars.css';

/*Описание формы simpleForm*/
import type {IDataElement, IFigAwesome, IForm, IList, IMenu, IMenuItem} from "ui-organizer";
import { AppManager, UIList, UIForm, UIMenu, UIMenuItem, UIDataElement, IconDisplay, UIMouseEvent, UISetDataEvent} from "ui-organizer";

export let form: IForm = <IForm>{
    type: UIForm,
    name: 'simpleForm',
    elements: [
        <IList>{
            type: UIList,
            name: 'myList',
            // bindingProperty: 'objectList',
            bordered: true,
            iconDisplay: IconDisplay.iconAndText,
            figAwesome: <IFigAwesome>{
                faClass: ['fas', 'fa-feather-pointed', 'fa-lg'],
                faStyle: ['color: grey']
            },
            menu: <IMenu>{
                type: UIMenu,
                elements: [
                    <IMenuItem>{
                        type: UIMenuItem,
                        caption: 'objectList',
                        iconDisplay: IconDisplay.icon,
                        figAwesome: <IFigAwesome>{
                            faClass: ['fas', 'fa-coffee', 'fa-lg'],
                            faStyle: ['color: grey;']
                        },
                        async onClick(event:UIMouseEvent, form: IForm, menu: IMenu, menuItem: IMenuItem) {
                            let list: IList = form.getElement('myList') as IList;
                            let data: any = form.getData();
                            list.setData(data.objectList);
                        }
                    },
                    <IMenuItem>{
                        type: UIMenuItem,
                        caption: 'fooList',
                        iconDisplay: IconDisplay.icon,
                        figAwesome: <IFigAwesome>{
                            faClass: ['fas', 'fa-tools', 'fa-lg'],
                            faStyle: ['color: grey;']
                        },
                        async onClick(event:UIMouseEvent, form: IForm, menu: IMenu, menuItem: IMenuItem) {
                            let list: IList = form.getElement('myList') as IList;
                            let data: any = form.getData();
                            list.setData(data.fooList);
                        }
                    },
                ]
            },
            itemsElement: <IDataElement>{
                type: UIDataElement,
                async onAfterSetData(event:UISetDataEvent, form: IForm, elem: IDataElement) {
                    elem.value = event.data.item + ': ' + event.data.value;
                }
            }
        }
    ]
}

let data = {
    objectList: [
        {
            item: "Кофе",
            value: "Эспрессо"
        },
        {
            item: "Чай",
            value: "Зеленый чай"
        },
        {
            item: "Прохладительные напитки",
            value: "Апельсиновый сок"
        }
    ],
    fooList: [
        {
            item: "Инструменты",
            value: "Дрель"
        },
        {
            item: "Хозинвентарь",
            value: "Лопата"
        }
    ]
}

/*Инициализация приложения AppManager*/
var Global: any = window;
Global.AppManager = AppManager;
Global.onpopstate = AppManager.onPopState;

AppManager.init(document.querySelector('#app'))
    .then(async ()=>{
        AppManager.add([form]);
        AppManager.open('simpleForm', data);
    })

Можете разместить меню с любой стороны списка. Например для размещения слева укажите:

  • у IList свойство menuPosition: Position.left,
  • у IMenu свойство grouping: Grouping.vertical.

8. Добавление, удаление и редактирование строк списка

Для использования пиктограмм FontAwesome укажите на html странице таблицу стилей с font awesome см. раздел 7.

В примере ниже мы добавили три кнопки (описали меню с тремя кнопками отдельно в переменной menu):

Обратите внимание, что метод list.edit() не изменяeт данные. Для изменения данных в элемент myList мы добавили метод onAfterEdit(), в котором преобразуем данные так как нам надо.

Для просмотра данных в результате манипуляции со списком используйте следующий код в панели разработчика:

AppManager.activeForm.getElement('myList').getData()

simple.ts

/*Инструкции для WebPack, который скопирует эти файлы в ваш каталог*/
import './index.html';
import 'ui-organizer/page.css';
import 'ui-organizer/style.css';
import 'ui-organizer/vars.css';

/*Описание формы simpleForm*/
import type {IDataElement, IFigAwesome, IForm, IList, IListItem, IMenu, IMenuItem} from "ui-organizer";
import { AppManager, UIList, UIForm, UIMenu, UIMenuItem, UIDataElement, IconDisplay, UIMouseEvent, UIEditEvent, UISetDataEvent} from "ui-organizer";

let menu: IMenu = <IMenu>{
    type: UIMenu,
    elements: [
        <IMenuItem>{
            type: UIMenuItem,
            caption: 'add',
            iconDisplay: IconDisplay.icon,
            figAwesome: <IFigAwesome>{
                faClass: ['fas', 'fa-plus', 'fa-lg'],
                faStyle: ['color: grey;']
            },
            async onClick(event:UIMouseEvent, form: IForm, menu: IMenu, menuItem: IMenuItem) {
                let list: IList = form.getElement('myList') as IList;
                let listItem: IListItem = await list.addItem();
                listItem.setData({ item: "Новая строка", value: "Значение" });
                
            }
        },
        <IMenuItem>{
            type: UIMenuItem,
            caption: 'remove',
            iconDisplay: IconDisplay.icon,
            figAwesome: <IFigAwesome>{
                faClass: ['fas', 'fa-minus', 'fa-lg'],
                faStyle: ['color: grey;']
            },
            async onClick(event:UIMouseEvent, form: IForm, menu: IMenu, menuItem: IMenuItem) {
                let list: IList = form.getElement('myList') as IList;
                /**Функция getSelected возвращает массив выделенных строк,
                 * так как у нас нет множественного выделения (атрибут multipleSelect не задан),
                 * то выбираем первый и единственный элемент массива, если выделена хоть одна строка.
                 */
                list.removeItem(list.getSelected()[0]?.id);
            }
        },
        <IMenuItem>{
            type: UIMenuItem,
            caption: 'edit',
            iconDisplay: IconDisplay.icon,
            figAwesome: <IFigAwesome>{
                faClass: ['fas', 'fa-edit', 'fa-lg'],
                faStyle: ['color: grey;']
            },
            async onClick(event:UIMouseEvent, form: IForm, menu: IMenu, menuItem: IMenuItem) {
                let list: IList = form.getElement('myList') as IList;
                await list.edit();
            }
        }
    ]
}

export let form: IForm = <IForm>{
    type: UIForm,
    name: 'simpleForm',
    elements: [
        <IList>{
            type: UIList,
            name: 'myList',
            bindingProperty: 'objectList',
            bordered: true,
            textSelect: false,
            iconDisplay: IconDisplay.iconAndText,
            figAwesome: <IFigAwesome>{
                faClass: ['fas', 'fa-feather-pointed', 'fa-lg'],
                faStyle: ['color: grey']
            },
            menu: menu,
            itemsElement: <IDataElement>{
                type: UIDataElement,
                textSelect: false,
                async onAfterSetData(event: UISetDataEvent, form: IForm, elem: IDataElement) {
                    elem.value = event.data.item + ': ' + event.data.value;
                },
                async onDblClick(event, form, elem, item) {
                    let list: IList = form.getElement('myList') as IList;
                    await list.edit(elem.id);
                },
            },
            async onAfterEdit(event:UIEditEvent, form:IForm, elem: IDataElement, item:IDataElement){
                let arr = event.value.split(':');
                item.setData({
                    item:arr[0],
                    value:arr[1]
                });
            }
        }
    ]
}

let data = {
    objectList: [
        {
            item: "Кофе",
            value: "Эспрессо"
        },
        {
            item: "Чай",
            value: "Зеленый чай"
        },
        {
            item: "Прохладительные напитки",
            value: "Апельсиновый сок"
        }
    ],
}

/*Инициализация приложения AppManager*/
var Global: any = window;
Global.AppManager = AppManager;
Global.onpopstate = AppManager.onPopState;

AppManager.init(document.querySelector('#app'))
    .then(async ()=>{
        AppManager.add([form]);
        AppManager.open('simpleForm', data);
    })

Generated using TypeDoc