...

Отключение возможности добавления новых строк в Таблицу (переменная типа Таблица)

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

  1. alekc_bpm87

    alekc_bpm87 Эксперт

    Иногда возникает необходимость отключения возможности пользователю добавления новых строк в таблицу, и при этом необходимо оставить возможность - редактирования уже существующих записей в таблице. В таком кейсе - переключить таблицу в режим Только для чтения - не подойдет. Штатного механизма реализации тоже нет.
    Для реализации потребуется скрыть последнюю строку таблицы с формы, тем самым пользователь не сможет добавлять новые строки в таблицу, и при этом возможность редактирования существующих строк - останется.
    jquery скрипт на форме с таблицей, в виджет коде:
    Код:
    
    <script>
    $(
    document).ready(async () => {
        
    window.setTimeout(async () => {
                $(`
    elma-type-table-full-line[data-index="<%=ViewContext.data.num%>"]`).css('display''none');
        }, 
    100)
    });
    </script>
    Клиентский сценарий на форме, для вычисления последней строки, которую и нужно скрыть. Получаем путем вычисления общего количества строк в таблице + 1:
    Код:
    
    /* Client scripts module */
    async function onInit () {
        if(
    Context.data.table)
        {
            
    ViewContext.data.num Context.data.table.length 1;
        }
    }
    Последнее редактирование: 5 апр 2023
  2. v.sinyavin

    v.sinyavin Новичок

    Когда на форме несколько таблиц скрипт скрывает строку под соответствующим номером в каждой таблице. Для скрытия в конкретной таблице автор @alekc_87 подсказал решение: таблице назначаем html класс (в примере myTable) и используем в виджет коде выборку:
    <script>
    $(document).ready(async () => {
    window.setTimeout(async () => {
    let table = document.querySelector(`.myTable`);
    table.querySelector(`elma-type-table-full-line[data-index="<%=ViewContext.data.num%>"]`).style.display = 'none';
    }, 200)
    });
    </script>
  3. zaycev_a

    zaycev_a Новичок

    Предложу свой вариант без создания контекстной переменной. Как и в предыдущем варианте таблице назначаем класс "table_a".
    $(document).ready( ... отрабатывает только в самом начале при загрузке страницы, но если таблица была обновлена, то пустая строка вылезет снова и ее нужно снова скрыть. В моем случае нужно еще разок вызвать hide_new_row

    1. Объявляем переменную
    declare const hide_new_row: Function;

    2. Пишем виджет код:
    <script>
    function hide_new_row_timer_a() {
    const tables = $('.table_a table');
    const table = tables[0];
    const children = $(table).children()
    const childrenLen = $(children).length;
    const lastRow = $(children)[childrenLen - 1];
    $(lastRow).css("display", "none");
    }
    function hide_new_row() {
    setTimeout(hide_new_row_timer_a, 300);
    }
    </script>

    3. Вызываем из сценария на загрузку:
    async function onLoad() {
    hide_new_row();
    }
    Последнее редактирование: 26 июл 2023
  4. v.sinyavin

    v.sinyavin Новичок

    не совсем понял где flag_onLoad брать
  5. zaycev_a

    zaycev_a Новичок

    Точно - рудимент остался. Нужно удалить эту строчку.
  6. dm.nikitin

    dm.nikitin Новичок

    У меня отработал более простой вариант

    Оставляем тот же код на этапе инициализации
    Код:
    
    async function onInit() {
        if (
    Context.data.table_for_attachments) {
            
    ViewContext.data.row_num Context.data.table_for_attachments.length 1;
        }
    }

    Но вместо скрипта просто добавляем стиль
    Код:
    
    <style>
        .
    target_table elma-type-table-full-line[data-index="<%=ViewContext.data.row_num%>"] {
            
    displaynone;
        }
    </
    style>
    Соответственно, класс target_table вешаем на таблицу
  7. nicolasolenev

    nicolasolenev Новичок

    достаточно использовать псевдо-класс :last-child (скрипт не нужен)
    <style>
    .target_table table elma-type-table-full-line:last-child {
    display: none;
    }
    </style>