Прикрепление файлов

Возможно, от исполнителей вам требуется получить не только фотографии, но и видео- или аудиофайлы. В таком случае можно добавить блоки для прикрепления нужных файлов.

Как это выглядит на примере шаблона "Мониторинг объектов в организациях"

Было:

Стало:

Для вашего удобства мы подготовили код для шаблона «Мониторинг объектов в организациях», в котором каждое из полей добавлено по одному разу в первую кнопку для ответа. Используйте этот код для самопроверки. Наши вставки в этом коде вы можете найти поиском слова «кастомизация».

Готовый код
{{#if reviewMode}}
    <div class="header-review">
        <div class="header-review__title">
            {{texts.task_title}}
        </div>
        <div class="header-review__buttons">
            {{#if (equal verdict "ok")}}
                <div class="header-review__btn header-review__btn_green">
                    {{texts.btn_ok.title}}
                </div>
            {{/if}}
            {{#if (equal verdict "no_obj")}}
                <div class="header-review__btn header-review__btn_red">
                    {{texts.btn_no_obj.title}}
                </div>
            {{/if}}
            {{#if (equal verdict "no_org")}}
                <div class="header-review__btn header-review__btn_red">
                    {{texts.btn_no_org.title}}
                </div>
            {{/if}}
        </div>
    </div>
{{else}}
    <div class="header">
        {{texts.task_title}}
    </div>
{{/if}}

<div class="info">
    {{#if reviewMode}}
        <div class="info__review">
            <div class="info__review-block">
                <div class="info__title">
                    {{texts.info_name}}
                </div>
                <div class="info__content">
                    {{name}}
                </div>
            </div>
            <div class="info__review-block">
                <div class="info__title">
                    {{texts.info_address}}
                </div>
                <div class="info__content">
                    {{address}}
                </div>
            </div>
        </div>
    {{else}}
        <div class="info__block">
            <div class="info__title">
                {{texts.info_name}}
            </div>
            <div class="info__content">
                {{name}}
            </div>
        </div>
        <div class="info__block">
            <div class="info__title">
                {{texts.info_address}}
            </div>
            <div class="info__content">
                {{address}}
            </div>
        </div>
    {{/if}}
    <div class="info__block">
        <div class="info__title">
            {{texts.info_description}}
        </div>
        <div class="info__content">
            {{product}}
        </div>
    </div>
    <div class="info__block">
        <div class="info__content">
            <a href={{image}} target="_blank" class="info__link">Ссылка на изображение товара</a>
        </div>
    </div>
</div>

{{#if reviewMode}}
    <div class="review">
        <div class="review__map">
            <div id="{{concat 'map_' id}}" style="width: 100%; height: 400px;"></div>
        </div>
        {{#if (equal verdict "ok")}}
            <div class="review__block">
                <div class="review__title">
                    {{texts.btn_ok.question_1.title}}
                </div>
                <div class="review__imgs-grid">
                    {{#each imgs_facade}}
                        <div class="review__grid-item">
                            <div class="review__grid-inner">
                                <img src="{{this}}" class="review__img" data-rotationdeg="0">
                                <div class="review__rotate-panel">
                                    <span class="review__rotate review__rotate_left">&larr;</span>
                                    <span class="review__rotate review__rotate_right">&rarr;</span>
                                </div>
                            </div>
                        </div>
                    {{/each}}
                </div>
            </div>
            <div class="review__block">
                <div class="review__title">
                    {{texts.btn_ok.question_2.title}}
                </div>
                <div class="review__imgs-grid">
                    {{#each imgs_obj}}
                        <div class="review__grid-item">
                            <div class="review__grid-inner">
                                <img src="{{this}}" class="review__img" data-rotationdeg="0">
                                <div class="review__rotate-panel">
                                    <span class="review__rotate review__rotate_left">&larr;</span>
                                    <span class="review__rotate review__rotate_right">&rarr;</span>
                                </div>
                            </div>
                        </div>
                    {{/each}}
                </div>
            </div>

            <!-- кастомизация начало фрагмента -->
            <!-- фото -->
            <div class="review__block">
              <div class="review__title">
                {{texts.btn_ok.question_new_imgs.title}}
              </div>
              <div class="review__imgs-grid">
                {{#each new_imgs}}
                  <div class="review__grid-item">
                    <div class="review__grid-inner">
                      <img src="{{this}}" class="review__img" data-rotationdeg="0">
                      <div class="review__rotate-panel">
                        <span class="review__rotate review__rotate_left">&larr;</span>
                        <span class="review__rotate review__rotate_right">&rarr;</span>
                      </div>
                    </div>
                  </div>
                {{/each}}
              </div>
            </div>
            
            <!-- видео -->
            <div class="review__block">
              <div class="review__title">
                {{texts.btn_ok.question_new_video.title}}
              </div>
              <div class="review__video-grid">
                {{#each new_video}}
                  <div class="review__video-grid-item">
                    <video width="50%" controls>
                      <source src={{this}} type="video/mp4">        
                    </video>
                  </div>    
                {{/each}}
              </div>
            </div>
            
            <!-- аудио -->
            <div class="review__block">
              <div class="review__title">
                {{texts.btn_ok.question_new_audio.title}}
              </div>
              <div class="review__audio-grid">
                {{#each new_audio}}
                  <div class="review__audio-grid-item">
                    <audio src={{this}} controls type="audio/wav">Невозможно воспроизвести</audio>
                  </div>    
                {{/each}}
              </div>
            </div>
            <!-- кастомизация конец фрагмента -->

        {{/if}}
        {{#if (equal verdict "no_obj")}}
            <div class="review__block">
                <div class="review__title">
                    {{texts.btn_no_obj.question_1.title}}
                </div>
                <div class="review__imgs-grid">
                    {{#each imgs_facade}}
                        <div class="review__grid-item">
                            <div class="review__grid-inner">
                                <img src="{{this}}" class="review__img" data-rotationdeg="0">
                                <div class="review__rotate-panel">
                                    <span class="review__rotate review__rotate_left">&larr;</span>
                                    <span class="review__rotate review__rotate_right">&rarr;</span>
                                </div>
                            </div>
                        </div>
                    {{/each}}
                </div>
            </div>
            <div class="review__block">
                <div class="review__title">
                    {{texts.btn_no_obj.question_2.title}}
                </div>
                <div class="review__imgs-grid">
                    {{#each imgs_plate_or_address}}
                        <div class="review__grid-item">
                            <div class="review__grid-inner">
                                <img src="{{this}}" class="review__img" data-rotationdeg="0">
                                <div class="review__rotate-panel">
                                    <span class="review__rotate review__rotate_left">&larr;</span>
                                    <span class="review__rotate review__rotate_right">&rarr;</span>
                                </div>
                            </div>
                        </div>
                    {{/each}}
                </div>
            </div>
            <div class="review__block">
                <div class="review__title">
                    {{texts.btn_no_obj.question_3.title}}
                </div>
                <div class="review__imgs-grid">
                    {{#each imgs_around_obj}}
                        <div class="review__grid-item">
                            <div class="review__grid-inner">
                                <img src="{{this}}" class="review__img" data-rotationdeg="0">
                                <div class="review__rotate-panel">
                                    <span class="review__rotate review__rotate_left">&larr;</span>
                                    <span class="review__rotate review__rotate_right">&rarr;</span>
                                </div>
                            </div>
                        </div>
                    {{/each}}
                </div>
            </div>
            {{#if comment}}
                <div class="review__block">
                    <div class="review__title">
                        {{texts.btn_no_obj.question_4.title}}
                    </div>
                    <div class="review__comment">
                        {{field type="textarea" name="comment" width="100%" rows=5}}
                    </div>
                </div>
            {{/if}}
        {{/if}}
        {{#if (equal verdict "no_org")}}
            <div class="review__block">
                <div class="review__title">
                    {{texts.btn_no_org.question_1.title}}
                </div>
                <div class="review__imgs-grid">
                    {{#each imgs_around_org}}
                        <div class="review__grid-item">
                            <div class="review__grid-inner">
                                <img src="{{this}}" class="review__img" data-rotationdeg="0">
                                <div class="review__rotate-panel">
                                    <span class="review__rotate review__rotate_left">&larr;</span>
                                    <span class="review__rotate review__rotate_right">&rarr;</span>
                                </div>
                            </div>
                        </div>
                    {{/each}}
                </div>
            </div>
            <div class="review__block">
                <div class="review__title">
                    {{texts.btn_no_org.question_2.title}}
                </div>
                <div class="review__imgs-grid">
                    {{#each imgs_plate_or_address}}
                        <div class="review__grid-item">
                            <div class="review__grid-inner">
                                <img src="{{this}}" class="review__img" data-rotationdeg="0">
                                <div class="review__rotate-panel">
                                    <span class="review__rotate review__rotate_left">&larr;</span>
                                    <span class="review__rotate review__rotate_right">&rarr;</span>
                                </div>
                            </div>
                        </div>
                    {{/each}}
                </div>
            </div>
            <div class="review__block">
                <div class="review__title">
                    {{texts.btn_no_org.question_3.title}}
                </div>
                <div class="review__comment">
                    {{field type="textarea" name="comment" width="100%" rows=5}}
                </div>
            </div>
        {{/if}}
    </div>
{{else}}
    <div class="main">
        <div class="main__title">
            Выберите вариант выполнения задания:
        </div>
        <div class="main__container">
            <div class="main__popup main__popup_hidden">Не выбран ни один вариант ответа</div>
            <div class="main__block">
                <div class="main__btn main__btn_green">
                    {{texts.btn_ok.title}}
                </div>
                <div class="main__content">
                    <div class="main__content-block">
                        <div class="main__content-title main__content-title_req">
                            {{texts.btn_ok.question_1.title}}
                        </div>
                        <div class="main__text">
                            {{texts.btn_ok.question_1.description}}
                        </div>
                        <div class="main__ex">
                            <a href="{{texts.btn_ok.question_1.example_link_1}}" target="_blank" class="main__ex-link">Пример</a>
                        </div>
                        <div class="main__imgs">
                            {{field type="file-img" name="imgs_facade" camera=true preview=true compress=false validation-show="top-left"}}
                        </div>
                    </div>
                    <div class="main__content-block">
                        <div class="main__content-title main__content-title_req">
                            {{texts.btn_ok.question_2.title}}
                        </div>
                        <div class="main__text">
                            {{texts.btn_ok.question_2.description}}
                        </div>
                        <div class="main__ex">
                            <a href="{{texts.btn_ok.question_2.example_link_1}}" target="_blank" class="main__ex-link">Пример</a>
                        </div>
                        <div class="main__imgs">
                            {{field type="file-img" name="imgs_obj" camera=true preview=true compress=false validation-show="top-left"}}
                        </div>
                    </div>

                    <!-- кастомизация начало фрагмента -->
                    <!-- фото -->
                    <div class="main__content-block">
                      <div class="main__content-title main__content-title_req">
                        {{texts.btn_ok.question_new_imgs.title}}
                      </div>
                      <div class="main__text">
                        {{texts.btn_ok.question_new_imgs.description}}
                      </div>
                      <div class="main__ex">
                        <a href="{{texts.btn_ok.question_new_imgs.example_link_1}}" target="_blank" class="main__ex-link">Пример</a>
                      </div>
                      <div class="main__imgs">
                        {{field type="file-img" name="new_imgs" camera=true validation-show="top-left"}}
                      </div>          
                    </div>

                    <!-- видео -->
                    <div class="main__content-block">
                      <div class="main__content-title main__content-title_req">
                        {{texts.btn_ok.question_new_video.title}}
                      </div>
                      <div class="main__text">
                        {{texts.btn_ok.question_new_video.description}}
                      </div>
                      <div class="main__video">
                        {{field type="file" name="new_video" sources="CAMERA GALLERY" fileType="VIDEO" camera=true validation-show="top-left"}}
                      </div>          
                    </div>

                    <!-- аудио -->
                    <div class="main__content-block">
                      <div class="main__content-title main__content-title_req">
                        {{texts.btn_ok.question_new_audio.title}}
                      </div>
                      <div class="main__text">
                        {{texts.btn_ok.question_new_audio.description}}
                      </div>
                      <div class="main__audio">
                        {{field type="file" name="new_audio" sources="RECORDER FILE_MANAGER" fileType="AUDIO" validation-show="top-left"}}
                      </div>          
                    </div>
                    <!-- кастомизация конец фрагмента -->

                </div>
            </div>
            <div class="main__block">
                <div class="main__btn main__btn_red">
                    {{texts.btn_no_obj.title}}
                </div>
                <div class="main__content">
                    <div class="main__content-block">
                        <div class="main__content-title main__content-title_req">
                            {{texts.btn_no_obj.question_1.title}}
                        </div>
                        <div class="main__text">
                            {{texts.btn_no_obj.question_1.description}}
                        </div>
                        <div class="main__ex">
                            <a href="{{texts.btn_no_obj.question_1.example_link_1}}" target="_blank" class="main__ex-link">Пример</a>
                        </div>
                        <div class="main__imgs">
                            {{field type="file-img" name="imgs_facade" camera=true validation-show="top-left"}}
                        </div>
                    </div>
                    <div class="main__content-block">
                        <div class="main__content-title main__content-title_req">
                            {{texts.btn_no_obj.question_2.title}}
                        </div>
                        <div class="main__text">
                            {{texts.btn_no_obj.question_2.description}}
                        </div>
                        <div class="main__ex">
                            <a href="{{texts.btn_no_obj.question_2.example_link_1}}" target="_blank" class="main__ex-link">Пример</a>
                        </div>
                        <div class="main__imgs">
                            {{field type="file-img" name="imgs_plate_or_address" camera=true validation-show="top-left"}}
                        </div>
                    </div>
                    <div class="main__content-block">
                        <div class="main__content-title main__content-title_req">
                            {{texts.btn_no_obj.question_3.title}}
                        </div>
                        <div class="main__text">
                            {{texts.btn_no_obj.question_3.description}}
                        </div>
                        <div class="main__ex">
                            <a href="{{texts.btn_no_obj.question_3.example_link_1}}" target="_blank" class="main__ex-link">Пример</a>
                        </div>
                        <div class="main__imgs">
                            {{field type="file-img" name="imgs_around_obj" camera=true validation-show="top-left"}}
                        </div>
                    </div>
                    <div class="main__content-block">
                        <div class="main__content-title">
                            {{texts.btn_no_obj.question_4.title}}
                        </div>
                        <div class="main__text">
                            {{texts.btn_no_obj.question_4.description}}
                        </div>
                        <div class="main__comment">
                            {{field type="textarea" name="comment" width="100%" rows=5 validation-show="top-left"}}
                        </div>
                    </div>
                </div>
            </div>
            <div class="main__block">
                <div class="main__btn main__btn_red">
                    {{texts.btn_no_org.title}}
                </div>
                <div class="main__content">
                    <div class="main__content-block">
                        <div class="main__text main__text_req">
                            {{texts.btn_no_org.question_1.description}}
                        </div>
                        <div class="main__imgs">
                            {{field type="file-img" name="imgs_around_org" camera=true validation-show="top-left"}}
                        </div>
                    </div>
                    <div class="main__content-block">
                        <div class="main__text main__text_req">
                            {{texts.btn_no_org.question_2.description}}
                        </div>
                        <div class="main__ex">
                            <a href="{{texts.btn_no_org.question_2.example_link_1}}" target="_blank" class="main__ex-link">Пример</a>
                        </div>
                        <div class="main__imgs">
                            {{field type="file-img" name="imgs_plate_or_address" camera=true validation-show="top-left"}}
                        </div>
                    </div>
                    <div class="main__content-block">
                        <div class="main__content-title main__content-title_req">
                            {{texts.btn_no_org.question_3.title}}
                        </div>
                        <div class="main__text">
                            {{texts.btn_no_org.question_3.description}}
                        </div>
                        <div class="main__comment">
                            {{field type="textarea" name="comment" width="100%" rows=5 validation-show="top-left"}}
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
{{/if}}
Редактирование выходной спецификации

Добавьте новые переменные с типом «файл» в выходную спецификацию. В них будут записываться загружаемые исполнителем файлы. Если необходимо, чтобы исполнитель имел возможность загрузить больше одного файла, то отметьте специальный флажок «массив» для переменной.

new_imgs — массив файлов для фотографий;

new_video — массив файлов для видео;

new_audio — массив файлов для аудио.

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

Кнопка для загрузки картинки

Кнопка для записи и загрузки видео

Кнопка для записи и загрузки аудио
Редактирование HTML
  1. Код HTML состоит из блоков, описывающих различные элементы интерфейса. Каждый блок может содержать внутри себя другие блоки. Таких уровней вложенности может быть несколько. Например, блок с описанием кнопки ответа содержит в себе блоки с полями для заполнения. Каждое поле тоже содержит в себе другие элементы, например, заголовок и поле для комментария.

    Каждый блок оформляется так:

    <div class="наименование_блока">
      <!-- код блока, может содержать вложенные блоки -->
      ...
    </div>
  2. Найдите блок main (он начинается со строки <div class="main">). Внутри него расположены блоки main__block, каждый из которых описывает одну из кнопок. Например, в шаблоне «Мониторинг объектов в организациях» есть 3 кнопки для ответа, значит, в блоке main у этого шаблона будет 3 блока main__block для каждой из кнопок.

    У каждой из кнопок есть наименование для обращения к ее свойствам. Например, в шаблоне «Мониторинг объектов в организациях» 3 кнопки называются btn_ok, btn_no_obj и btn_no_org. Запомните наименование той кнопки, в код которой добавляете новые поля.

    Внутри блока main__block расположен блок main__content, который содержит все поля для выбранной кнопки. Описание каждого отдельного поля расположено в блоках main__content-block.

    Найдите нужную кнопку main__block, в ней найдите поле main__content-block, после которого вы хотите добавить новое поле и вставьте после него следующий код:

    <!-- фото -->
    <div class="main__content-block">
      <div class="main__content-title main__content-title_req">
        {{texts.btn_ok.question_new_imgs.title}}
      </div>
      <div class="main__text">
        {{texts.btn_ok.question_new_imgs.description}}
      </div>
      <div class="main__ex">
        <a href="{{texts.btn_ok.question_new_imgs.example_link_1}}" target="_blank" class="main__ex-link">Пример</a>
      </div>
      <div class="main__imgs">
        {{field type="file-img" name="new_imgs" camera=true validation-show="top-left"}}
      </div>          
    </div>
    
    <!-- видео -->
    <div class="main__content-block">
      <div class="main__content-title main__content-title_req">
        {{texts.btn_ok.question_new_video.title}}
      </div>
      <div class="main__text">
        {{texts.btn_ok.question_new_video.description}}
      </div>
      <div class="main__video">
        {{field type="file" name="new_video" sources="CAMERA GALLERY" fileType="VIDEO" camera=true validation-show="top-left"}}
      </div>          
    </div>
    
    <!-- аудио -->
    <div class="main__content-block">
      <div class="main__content-title main__content-title_req">
        {{texts.btn_ok.question_new_audio.title}}
      </div>
      <div class="main__text">
        {{texts.btn_ok.question_new_audio.description}}
      </div>
      <div class="main__audio">
        {{field type="file" name="new_audio" sources="RECORDER FILE_MANAGER" fileType="AUDIO" validation-show="top-left"}}
      </div>          
    </div>

    В этом коде новые поля добавляются для первой кнопки с наименованием btn_ok. Если вы добавили поля для другой кнопки, измените наименование btn_ok на нужное.

  3. Обновите режим приемки.

    Блок review содержит в себе код для каждой кнопки в режиме приемки. Этот код расположен в таких блоках:

    {{#if (equal verdict "ok")}}
      <!-- код для кнопки "ok" в режиме приемки -->
      <div class="review__block">
        <!-- код для поля внутри кнопки "ok" в режиме приемки -->
        ...
      </div>
      ...
    {{/if}}

    Переменная verdict указана в выходной спецификации, в нее будет передаваться значение ответа для той кнопки, которую нажал исполнитель.

    Например, в шаблоне «Мониторинг объектов в организациях» для трех кнопок описаны три выходных значения: ok, no_obj и no_org.

    Блоки review__block содержат описание каждого из полей для данной кнопки.

    Найдите нужную кнопку по строке {{#if (equal verdict "значение_ответа_кнопки")}}, в ней найдите поле review__block, после которого вы хотите добавить новое поле, и вставьте после него следующий код:

    <!-- фото -->
    <div class="review__block">
      <div class="review__title">
        {{texts.btn_ok.question_new_imgs.title}}
      </div>
      <div class="review__imgs-grid">
        {{#each new_imgs}}
          <div class="review__grid-item">
            <div class="review__grid-inner">
              <img src="{{this}}" class="review__img" data-rotationdeg="0">
              <div class="review__rotate-panel">
                <span class="review__rotate review__rotate_left">&larr;</span>
                <span class="review__rotate review__rotate_right">&rarr;</span>
              </div>
            </div>
          </div>
        {{/each}}
      </div>
    </div>
    
    <!-- видео -->
    <div class="review__block">
      <div class="review__title">
        {{texts.btn_ok.question_new_video.title}}
      </div>
      <div class="review__video-grid">
        {{#each new_video}}
          <div class="review__video-grid-item">
            <video width="50%" controls>
              <source src={{this}} type="video/mp4">        
            </video>
          </div>    
        {{/each}}
      </div>
    </div>
    
    <!-- аудио -->
    <div class="review__block">
      <div class="review__title">
        {{texts.btn_ok.question_new_audio.title}}
      </div>
      <div class="review__audio-grid">
        {{#each new_audio}}
          <div class="review__audio-grid-item">
            <audio src={{this}} controls type="audio/wav">Невозможно воспроизвести</audio>
          </div>    
        {{/each}}
      </div>
    </div>

    В этом коде новые поля добавляются для первой кнопки с наименованием btn_ok. Если вы добавили поля для другой кнопки, измените наименование btn_ok на нужное.

Редактирование JS
  1. Код JS состоит из блоков, описывающих различные элементы интерфейса. Эти блоки могут быть вложенными (кнопки содержат набор полей, поля содержат набор элементов и т. д.). Каждый блок заключен в фигурные скобки.

    В общем виде элементы описываются так:

    'свойство': 'значение'

    Значение тоже может состоять из нескольких свойств, в этом случае оно заключается в фигурные скобки и образует следующий уровень вложенности.

  2. В самом начале файла находится константа texts, в которой хранятся все необходимые для интерфейса тексты для каждой кнопки.

    У каждой из кнопок есть наименование для обращения к ее свойствам. Например, в шаблоне «Мониторинг объектов в организациях» 3 кнопки называются btn_ok, btn_no_obj и btn_no_org. Запомните наименование той кнопки, в код которой добавляете новый текст.

    Например, в шаблоне «Мониторинг объектов в организациях» тексты для кнопки btn_ok расположены в следующем блоке кода:

    var texts = {
        //<общий текст для заголовков>
        'btn_ok': {
            'title': 'Я нашел объект',
            'question_1': {
                //<тексты для первого поля (фото фасада организации)>
            },
            'question_2': {
                //<тексты для второго поля (фото объекта)>
            }
        },
  3. Чтобы добавить нужные тексты, поставьте запятую после закрывающей фигурной скобки последнего поля и вставьте следующий код:

    'question_new_imgs': {
      'title': 'Фото',
      'description': 'Сделайте хотя бы 2 фотографии',
      'example_link_1': 'ссылка на пример фото'
    },
    'question_new_video': {
      'title': 'Видео',
      'description': 'Запишите видео'
    },
    'question_new_audio': {
      'title': 'Аудио',
      'description': 'Запишите аудио'
    }
  4. Найдите функцию getTemplateData. Она содержит несколько блоков следующего вида:

    if (<условие проверки заполнения поля>) {
        ...
        <код для отображения загруженных данных>
        ...
    }

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

    // фото
    if (outputValues.new_imgs && outputValues.new_imgs.length > 0) {
      data.new_imgs = [];
      for (var i = 0; i < outputValues.new_imgs.length; i++) {
        data.new_imgs.push(workspaceOptions.apiOrigin + '/api/attachments/' + outputValues.new_imgs[i] + '/preview');
      }
    }
    
    // видео
    if (outputValues.new_video && outputValues.new_video.length > 0) {
      data.new_video = [];
      for (var i = 0; i < outputValues.new_video.length; i++) {
        data.new_video.push(workspaceOptions.apiOrigin + '/api/attachments/' + outputValues.new_video[i] + '/preview');
      }
    }
    
    // аудио
    if (outputValues.new_audio && outputValues.new_audio.length > 0) {
      data.new_audio = [];
      for (var i = 0; i < outputValues.new_audio.length; i++) {
        data.new_audio.push(workspaceOptions.apiOrigin + '/api/attachments/' + outputValues.new_audio[i] + '/preview');
      }
    }
  5. Добавьте валидацию.

    Найдите функцию validate. В ней находится код для проверки заполнения полей для каждой из кнопок. Например, в шаблоне «Мониторинг объектов в организациях» этот код выглядит так:

    if (!solution.output_values.verdict || solution.output_values.verdict === '') {
        this.errors = this.addError('Не выбран ни один вариант ответа', "verdict", this.errors);
    } else if (solution.output_values.verdict === 'ok') {
        // код проверки полей кнопки ok
        if (!solution.output_values.imgs_facade || solution.output_values.imgs_facade.length === 0) {
            // код проверки поля imgs_facade
        }
    
        if (!solution.output_values.imgs_obj || solution.output_values.imgs_obj.length === 0) {
            // код проверки поля imgs_obj
        }
    
    } else if (solution.output_values.verdict === 'no_obj') {
        // код проверки полей кнопки no_obj
    } else if (solution.output_values.verdict === 'no_org') {
        // код проверки полей кнопки no_org
    }

    Значения ответа для кнопок в этом примере, которые передаются в выходную переменную verdict, называются так же, как на шаге обновления режима приемки: ok, no_obj и no_org.

    Найдите блок проверки нужной кнопки и внутри него после любого блока проверки поля вида

    if (!solution... ) {
        // код проверки поля
    }

    добавьте следующий код:

    if (!solution.output_values.new_imgs || solution.output_values.new_imgs.length === 0) {
      this.errors = this.addError('Нужно приложить фото', "new_imgs", this.errors);
    } else if (solution.output_values.new_imgs.length < 2) {
      this.errors = this.addError('Должно быть хотя бы 2 фото', "new_imgs", this.errors);
    }
    
    if (!solution.output_values.new_video || solution.output_values.new_video.length < 1) {
      this.errors = this.addError('Нужно приложить видео', 'new_video', this.errors);
    }
    
    if (!solution.output_values.new_audio || solution.output_values.new_audio.length < 1) {
      this.errors = this.addError('Нужно приложить аудио', 'new_audio', this.errors);
    } 
Редактирование CSS

В конце блока с кодом CSS вставьте стили для новых полей:

.review__video-grid {
  margin: 0px -10px;
}

.review__audio-grid {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -ms-flex-wrap: wrap;
      flex-wrap: wrap;
  margin: 0px -10px;
}

.review__audio-grid-item {
  margin: 10px;
}

.review__video-grid-item {
  margin: 10px;
}

.main__video .field,
.main__audio .field {
  white-space: normal;
}

.main__video .field_file__files__file,
.main__audio .field_file__files__file {
  margin-bottom: 10px;
}