function LINKNAME() {
  const urls = [];
  {% if products %}
    {% for product in products %}
      {% for actione in product.actione %}
        {% if actione.url %}
          urls.push('{{ actione.url }}');
        {% endif %}
      {% endfor %}
    {% endfor %}
  {% endif %}
  const isOkay = confirm(`Открыть ${urls.length} вкладок?`);
  if (!isOkay){
    alert('Сообщение при отмене');
    return;
  }
  // открываем
  const batchSize = 5; // по сколько за 1 раз одновременно открывать
  const pause = 3; // пауза в секундах между пачками
  let iteration = 0;
  while (urls.length) {
    const batch = urls.splice(0, batchSize);
    setTimeout(() => batch.forEach(url => window.open(url)), iteration * pause * 1000);
    iteration++;
  }
}08:40. В этот момент можно выбросить событие. Считайте, что «Событие» == «Звонок».08:39 стало 08:40 – предыдущее значение ещё-не, а текущее уже-да. Вот тогда и выбрасывать событие.changeTo() повторяются одинаковые действия. Сможете выдвинуть их во внешнюю функцию?      setTimeout() на нужные количества миллисекунд.      const has3 = arr => {
  for (let i = 2; i < arr.length; i++) {
    if (arr[i] === arr[i - 1] && arr[i] === arr[i - 2]) {
      return true;
    }
  }
  return false;
}
has3([1,2,3,3,4,5,5,5,6]) // true
has3([1,2,3,3,4,5,5,6,6]) // false- translations['photo.select_a_photo_to_attach']
+ translations.photo.select_a_photo_to_attachoProgressBar['total'] а не oProgressBar.total и другие подобные?empty() ?  Это не PHP.codeInput не объявленаconst codeInput = `
  <div>
    строка 1 ${translations.photo.select_a_photo_to_attach} продолжение
    строка 2
  </div>
`;let previousTimer;
const startTimer = (word, delay, callback) => {
  const timer = setInterval(
    () => {
      if (previousTimer !== timer) {
        clearInterval(previousTimer);
        previousTimer = timer;
      }
      callback();
    },
    delay
  );
};
startTimer('t1', 280, () => console.log('cb t1'));
startTimer('t2', 1200, () => console.log('cb t2'));
startTimer('t3', 910, () => console.log('cb t3'));
// t1, t1, t1, t3, t2, t2, t2...const x = foo?.bar?.foo?.bar?.foo?.bar ?? 'default';
// не вызовет ошибки при отсутствии свойства
// использование с именами свойств из переменых/констант:
const foo = { bar: { foo: { bar: { foo: { bar: 'foobar' }}}}};
const FOO = 'foo';
const BAR = 'bar';
foo?.[BAR]?.[FOO]?.bar?.foo?.[BAR]  // "foobar"try .. catch:let x;
try {
  x = foo.bar.foo.bar.foo.bar;
} catch() {
  x = 'default';
}.text() запишет только текст, без разметки HTML – иконка пропадёт// итерации 1-го этапа:
{}
{'iowa': 12}
{'iowa': 12 + 42 = 54}
{'iowa': 54, 'zero': 58}
{'iowa': 54, 'zero': 58 + 32 = 90}{'iowa': 54, 'zero': 90} в массив как у вас ожидается.