...

"Нативное" отображение не-переменных контекста на форме c типом данных элмы в виджете "Код".

Тема в разделе "Вопросы по платформе", создана пользователем unam3, 5 июл 2023.

  1. unam3

    unam3 Активный участник

    Можно ли и как отображать не-переменные контекста с типами элмы (TFile: FileItemRef, TBoolean: boolean, TUser: UserItemRef и прочее) контролами элмы в виджете "Код"?
    Последнее редактирование: 12 июл 2023
  2. miliakova

    miliakova Техническая поддержка

    Добрый день! Отображение контролов Элмы в виджете Код описано в статье https://tssdk.elma365.com/ru/interfaces/_102_ui_widgets_.widget.html#contextrow

    Вы можете использовать вывод контекстной строки приложения:

    <%= UI.widget.contextRow('price', { required: true, onChange: Scripts.calcTotal }) %>

    Это строка (название и значение) поля price контекста элемента приложения.

    Можно использовать вывод контекстной строки виджета:

    <%= UI.widget.viewContextRow('count', { required: true, onChange: Scripts.calcTotal }) %>

    Контрол со значением из контекста виджета. Контекст виджета - это служебные переменные, которые используются для настройки виджета. Они нужны для написания сценариев, определяющих поведение виджета, а также для получения информации из приложений, загрузки файлов и т. д. Это более гибкий контекст, чем контекст приложения. В контекст виджета можем записывать значения в сценарии виджета, например:

    async function onInit(): Promise<void> {

    ViewContext.data.polzovatel = await System.users.getCurrentUser();
    ViewContext.data.vybor = true
    }

    Этой гибкости достаточно, чтобы выводить контрол со значением, которое вы зададите.

    Нативно в виджет Код вы можете положить html код, в том числе скопировать контрол элмы из Элементов Инструментов разработчика, но наделять его функциональностью придется самостоятельно.

    Вложения:

    • smtng.png
      smtng.png
      Размер файла:
      76,3 КБ
      Просмотров:
      29
    • stroka.png
      stroka.png
      Размер файла:
      7,4 КБ
      Просмотров:
      26
    Последнее редактирование: 12 июл 2023
  3. unam3

    unam3 Активный участник

    Доброго.
    Обновил и прояснил заголовок и текст поста. Делает ответ неактуальным. Но путь к истине тернист и труден. Вдруг удастся получить необходимое.
  4. miliakova

    miliakova Техническая поддержка

    Не-переменные контекста надо положить в контекст виджета. Через контекстные переменные компоненты системы получают значения, обретают функционал. Строке формы Файл, Пользователь, Выбор да/нет нужны значения из контекста. Расскажите, пожалуйста, подробнее какая задача перед Вами стоит, чем обусловлена необходимость обхода контекста?
  5. unam3

    unam3 Активный участник

    Отображать в форме приложения/задач бп (1) больше пяти таблиц с одинаковой структурой (2) с ячейками только для чтения (3) с полями типа "Файл" и "Пользователи" с выбранным параметром "несколько".


    В этом слуачае не нужен функционал переменных контекста, затраты на их создание и поддержку.

    Можно обойтись генерацией таблицы в виджете "Код". Но для этого надо руками подтягивать имена файлов и пользователей для отображения.
  6. miliakova

    miliakova Техническая поддержка

    Добрый день! Генерация таблицы в виджете "Код" подробно описана в статье https://tssdk.elma365.com/ru/pages/how-to/make-custom-display-of-application-elements.html
    Если нет желания хранить данные в контексте, то создадим интерфейсы, которые наполним данными из приложения-источника.
    Привожу пример Формы просмотра элемента, на которую вынесен виджет код (таблица), в контексте данного виджета (ViewContext) только одно свойство - render (перерисовка таблицы). В сценарии созданы интерфейсы, функция onInit, функция заполнения таблицы данными fillTable, функция getElements, отдающая элементы виджету Код.
    Виджет Код:
    Код:
    
    <% if (ViewContext.data.render) { %>
        <
    div class="objects-container">
        <
    table>
            <
    thead>
                <
    tr>
                    <
    th>Название</th>
                    <
    th>Файлы</th>
                    <
    th>В наличии</th>
                    <
    th>Менеджеры</th>
                </
    tr>
            </
    thead>
            <
    tbody>
                <% for (
    let j=0;  getElements().length;j++) { %>
                    <%= 
    renderRowgetElements()[j] ) %>
               <% } %>
            </
    tbody>
        </
    table>
    </
    div>
    <% } %>

    <% 
    $template renderRow(el) %>
    <
    tr class="material-need-title">
    <
    td><a href="(p:item/forum_tablica/iskhodnoe/<%- el.nazvanie.elementId %>)"><%- el.nazvanie.elementName %></td>
    <
    td>
                 <% for (
    let i=0;  el.files.lengthi++) { %>
                   <
    a href="(p:preview/<%- el.files.fileLink %>/readonly)?active=true)"><%- el.files.fileName %><br/>
                <% } %>
            </
    td>
            <
    td><%- el.bool "В наличии" "Нет в наличии" %></td>
            <
    td>
                <% for (
    let j=0;  el.users.lengthj++) { %>
                   <%- 
    el.users[j].userName %><br/>
                <% } %>
            </
    td>
        </
    tr>
    <% 
    $endtemplate %>

    <
    style>
        .
    objects-container table {
            
    width100%;
            
    border1px solid black;

        }
        .
    objects-container thead {
            
    background-color#82bd8e;
            
    border1px solid black;
        }
        
    th {
            
    text-aligncenter;
            
    border1px solid black;
        }
        .
    objects-container th {
            
    padding18px 6px;
        }
        .
    objects-container td {
            
    padding18px 6px;
            
    border1px solid black;
        }
        
    td {
            
    text-aligncenter;
        }
        
    tr.material-need-title {
            
    font-weightbold;
            
    background-color#e3eef7;
        
    }
    </
    style>
    Сценарий:

    Код:
    
    interface ElementData {
    nazvanieElement;
    filesMyFileData[];
    boolTBoolean;
    usersMyUserData[];
    }
    interface 
    Element {
    elementNamestring;
    elementIdstring
    }
    interface 
    MyFileData {
    fileNamestring;
    fileLinkstring
    }
    interface 
    MyUserData {
    userNamestring;
    userIdstring
    }
    let elementsElementData[]=[];

    async function onInit():pPromise<void>{
    await fillTable();
    }

    async function fillTable(): Promise<void>{
    debugger;
    elements=[];
        const 
    need_elements await Namespace.app.iskhodnoe.search()
    .
    where((fg) => g.and(
    f.__deletedAt.eq(null),
    ))
    .
    size(1000)
    .
    all();
        for (const 
    el of need_elements) {
    let elementElementData
    let files
    TFile[] = el.data.faily!
    let filesDataMyFileData[]=[]
    let usersTUser[] = el.data.polzovateli!
    let usersDataMyUserData[]=[]

    const 
    promises files.map(async (fFileItemRef)=> {
    let data await getFilesData(f);
    filesData.push(data)
            });
    await Promise.all(promises)
            const 
    promises2 users.map(async (uUserItemRef)=> {
    let data2 await getUsersData(u);
    usersData.push(data2)
    });
            
    await Promise.all(promises2)

            
    element = {
    nazvanie: {
    elementNameel.data.__name,
    elementIdel.data.__id
                
    } ,
    filesfilesData,
    boolel.data.vybor_da_net!,
    usersusersData
            
    }
            
    elements.push(element!)
        };
        
    Context.data.render Context.data.render
    }
    async function getFilesData(fFileItemRef): Promise<MyFileData> {
        
    let fetched await f.fetch();
        return {
            
    fileNamefetched.data.__name,
            
    fileLinkfetched.data.__id
        
    }
    }

    async function getUsersData(uUserItemRef): Promise<MyUserData> {
        
    let fetched await u.fetch();
        return {
            
    userNamefetched.data.__name,
            
    userIdfetched.data.__id
        
    }
    }

    function 
    getElements() {
        return 
    elements;
    }

    Вложения:

    • f1.jpg
      f1.jpg
      Размер файла:
      73 КБ
      Просмотров:
      15
    • f2.jpg
      f2.jpg
      Размер файла:
      154,7 КБ
      Просмотров:
      14
    • f3.jpg
      f3.jpg
      Размер файла:
      45,3 КБ
      Просмотров:
      12
    • f4.jpg
      f4.jpg
      Размер файла:
      132,9 КБ
      Просмотров:
      13
    • f5.jpg
      f5.jpg
      Размер файла:
      124 КБ
      Просмотров:
      14
    • f6.jpg
      f6.jpg
      Размер файла:
      100,9 КБ
      Просмотров:
      13
    • f7.jpg
      f7.jpg
      Размер файла:
      102,2 КБ
      Просмотров:
      13
    Последнее редактирование: 1 сен 2023
  7. unam3

    unam3 Активный участник

    Добрый!

    Что сейчас у себя делаю и делается в предоставленном вами коде:
    https://community.elma365.com/ru/threads/2770/#post-4047:~:text=let fetched = await f.fetch();
    https://community.elma365.com/ru/threads/2770/#post-4047:~:text=let fetched = await u.fetch()

    А хотелось бы обертку/функцию вокруг типов (например: FileItemRef, UserItemRef), чтобы скормил в нее id, а она вернула все или указанные поля.