...

Замена стандартной ленты на таблицу для внутреннего обмена сообщениями внутри элемента приложения.

Тема в разделе "Примеры сценариев", создана пользователем sabir, 14 май 2023.

Метки:
  1. sabir

    sabir Участник

    К сожалению, на данный момент отсутствуют методы для работы с лентой объекта, временно отложим в сторону использование снифферов. Но не стоит отчаиваться, ведь у нас всегда есть возможность настроить форму с помощью виджета "Код". Так что даже если сейчас небо кажется облачным, мы всегда можем найти свет солнца в наших решениях.
    Для начала добавим в контекст приложения поле типа - строка, зададим имя свойства - json .

    upload_2023-5-14_2-36-15.png
    В это поле мы будем складывать историю сообщений в формате json, предварительно преобразуя ее в строку.

    Перейдем в форму просмотра предварительно создав ее.
    В контексте формы добавим поле типа - строка, зададим название - message.

    upload_2023-5-14_2-42-46.png
    Данное свойство необходимо для ввода сообщения от пользователя.
    Вынесем на форму свойство - сообщение, виджет код и кнопку.

    upload_2023-5-14_2-48-17.png
    Заполним виджет код (tables) следующем скриптом.

    Код:
    
    <style>
      
    table {
        
    marginauto;
        
    width80%;
        
    border-collapsecollapse;
      }

      
    thtd {
        
    border1px solid black;
        
    padding8px;
      }

      
    th {
        
    background-color#f2f2f2;
        
    text-alignleft;
      }

      .
    small-cell {
        
    widthfit-content;
      }

      .
    large-cell {
        
    width60%;
        
    word-break: break-word/* Добавлено свойство для переноса слов */
      
    }
    </
    style>

    <
    table>
      <
    thead>
        <
    tr>
          <
    th class="small-cell">Время</th>
          <
    th class="small-cell">Имя</th>
          <
    th class="large-cell">Сообщение</th>
        </
    tr>
      </
    thead>
      <
    tbody id="chat-table"></tbody>
    </
    table>


    <
    script>

    var 
    data = <%= Context.data.json %>;

    function 
    renderTable(data) {
      const 
    tbody document.querySelector('#chat-table');
      
    tbody.innerHTML '';

      
    data.forEach(({ timenamemessage }) => {
        const 
    tr document.createElement('tr');
        const 
    tdTime document.createElement('td');
        
    tdTime.textContent time;
        const 
    tdName document.createElement('td');
        
    tdName.textContent name;
        const 
    tdMessage document.createElement('td');
        
    tdMessage.textContent message;
        
    tr.appendChild(tdTime);
        
    tr.appendChild(tdName);
        
    tr.appendChild(tdMessage);
      
        
    // Вставляем элемент в начало таблицы
        
    tbody.insertBefore(trtbody.firstChild);
      });
    }

    renderTable(data);

    </script>
    Функция renderTable разбирает json и формирует из него читаемую таблицу.

    Перейдем в кнопку и повесим на неё функцию - message.​
    upload_2023-5-14_2-56-50.png
    Далее перейдем в сценарии и добавим следующий код.


    Код:
    
    /* Client scripts module */


    declare const consoleany;

    // Определение типа для JSON-сообщения
    type Json_message = {
        
    timestring,
        
    namestring,
        
    messagestring
    }

    // Асинхронная функция message()
    async function message(): Promise<void> {
      
        
    // Проверка, что сообщение не является пустым или состоит только из пробелов
        
    if (ViewContext.data.message != undefined && ViewContext.data.message.trim() != "") {
          
            
    // Получение информации о текущем пользователе
            
    let name_user await System.users.getCurrentUser();
          
            
    let json_messageJson_message[] = [];
          
            
    // Проверка, что JSON-строка не пустая и уже существует
            
    if (Context.data.json != "" && Context.data.json) {
              
                
    // Разбор JSON-строки в массив json_message
                
    json_message JSON.parse(Context.data.json);
              
                
    let new_record = {} as Json_message;
              
                
    new_record.name name_user.data.__name.toString();
                
    new_record.time = new Datetime().format("hh:mm:ss");
                
    new_record.message ViewContext.data.message;
              
                
    // Добавление новой записи в массив json_message
                
    json_message.push(new_record);
              
            } else {
              
                
    let new_record = {} as Json_message;
              
                
    new_record.name name_user.data.__name.toString();
                
    new_record.time = new Datetime().format("hh:mm:ss");
                
    new_record.message ViewContext.data.message;
              
                
    // Добавление новой записи в пустой массив json_message
                
    json_message.push(new_record);
              
            }
          

            
    let app await Application.search().where(=> f.__id.eq(Context.data.__id)).first();
          
            if (
    app != undefined) {
              
                
    // Преобразование массива json_message в JSON-строку и сохранение ее в свойство json объекта app
                
    app.data.json JSON.stringify(json_message);
              
                
    // Сохранение изменений в объекте app
                
    await app.save();
              
            }
          
            
    // Очистка поля сообщения после отправки
            
    ViewContext.data.message undefined;
          
        }
    }
    По итогу у нас получается что-то такое, естественно все стили и верстку можно настроить из ходя из потребностей и собственного чувства прекрасного.

    upload_2023-5-14_3-6-45.png

    Вложения: