...

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

Тема в разделе "Скрипты и разработка", создана пользователем 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 {
        
    margin: auto;
        
    width: 80%;
        
    border-collapse: collapse;
      }

      
    th, td {
        
    border: 1px solid black;
        
    padding: 8px;
      }

      
    th {
        
    background-color: #f2f2f2;
        
    text-align: left;
      }

      .
    small-cell {
        
    width: fit-content;
      }

      .
    large-cell {
        
    width: 60%;
        
    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(({ time, name, message }) => {
        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(tr, tbody.firstChild);
      });
    }

    renderTable(data);

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

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


    Код:
    
    /* Client scripts module */


    declare const console: any;

    // Определение типа для JSON-сообщения
    type Json_message = {
        
    time: string,
        
    name: string,
        
    message: string
    }

    // Асинхронная функция message()
    async function message(): Promise<void> {
      
        
    // Проверка, что сообщение не является пустым или состоит только из пробелов
        
    if (ViewContext.data.message != undefined && ViewContext.data.message.trim() != "") {
          
            
    // Получение информации о текущем пользователе
            
    let name_user = await System.users.getCurrentUser();
          
            
    let json_message: Json_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 => 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

    Вложения: