Нужна помощь в интеграции кода из Edittext в Discourse

Я создал этот таймер с помощью следующего кода, он работает локально, но у меня возникли трудности с его интеграцией на мой форум. Кто-нибудь, пожалуйста, помогите?

<!-- HTML (Добавьте это в раздел Header) -->
<style>
  button {
    padding: 5px;
    margin: 2px;
    cursor: pointer;
    border: none;
    color: white;
    width: 100px; /* Установите желаемую ширину для всех кнопок */
    border-radius: 5px;
  }

  #readTaskButton {
    background: #008000; /* Более тёмный зелёный для лучшей видимости на тёмном фоне */
  }

  #enterRoomButton {
    background: #DAA520; /* Более тёмный жёлтый */
  }

  #pauseButton {
    background: #A0522D; /* Более тёмный оранжевый */
  }

  #stopButton {
    background: #FF0000; /* Более тёмный красный */
  }
</style>

<div style="display: flex; align-items: center; justify-content: center;">
  <div style="display: flex; flex-direction: column; align-items: center; margin-right: 20px;">
    <button id="readTaskButton" onclick="startTimer(90)">Прочитать задание</button>
    <button id="enterRoomButton" onclick="startTimer(480)">Войти в комнату</button>
  </div>
  <div id="timer" style="font-size: 2em; text-align: center; margin: 0 20px;" onclick="togglePauseResume()">00:00</div>
  <div style="display: flex; flex-direction: column; align-items: center; margin-left: 20px;">
    <button id="pauseButton" onclick="togglePauseResume()">Пауза</button>
    <button id="stopButton" onclick="stopTimer()">Стоп</button>
  </div>
</div>

<!-- JavaScript (Добавьте это в раздел Footer) -->
<script>
  let timer;
  let totalSeconds;
  let isShortTimer = true;
  let isPaused = false;

  function startTimer(duration) {
    resetTimer();
    totalSeconds = duration;
    timer = setInterval(updateTimer, 1000);
  }

  function togglePauseResume() {
    if (isPaused) {
      resumeTimer();
    } else {
      pauseTimer();
    }
    updateButtonLabel();
  }

  function updateButtonLabel() {
    const button = document.getElementById('pauseButton');
    button.innerText = isPaused ? 'Продолжить' : 'Пауза';
  }

  function pauseTimer() {
    clearInterval(timer);
    isPaused = true;
  }

  function resumeTimer() {
    isPaused = false;
    timer = setInterval(updateTimer, 1000);
  }

  function stopTimer() {
    resetTimer();
    updateButtonLabel();
  }

  function updateTimer() {
    if (totalSeconds <= 0) {
      if (isShortTimer) {
        isShortTimer = false;
        startTimer(480); // Автоматически запустить более длинный таймер после начального
      } else {
        isShortTimer = true;
        startTimer(90); // Автоматически запустить начальный таймер после более длинного
      }
    }

    const minutes = Math.floor(totalSeconds / 60);
    const seconds = totalSeconds % 60;

    const formattedTime = `${formatTime(minutes)}:${formatTime(seconds)}`;
    document.getElementById('timer').innerText = formattedTime;

    totalSeconds--;
  }

  function formatTime(time) {
    return time < 10 ? '0' + time : time;
  }

  function resetTimer() {
    clearInterval(timer);
    document.getElementById('timer').innerText = '00:00';
  }
</script>

Привет,

Чтобы это работало, нужно вставить JS в Head!
Также будьте осторожны с CSS для button — лучше создать специфичный селектор, чтобы не перезаписать стили по умолчанию.

В идеале стоит создать компонент темы и использовать outlet для обработки HTML и логики. Я могу показать это позже!

Большое спасибо за ответ.

Я попробовал. Я создал новый компонент темы и с помощью опции «Редактировать CSS/HTML» вставил этот код в раздел common > header. Я вижу таймер на сайте, но проблема в том, что таймер не работает. У него есть кнопки «Воспроизвести» и «Остановить», локально всё работает отлично, но на сайте отображается только таймер без функционала.


Я также проверил консоль через инструмент «Инспектор», и вот какая ошибка там отображается.

Да, ваш код блокируется CSP (см. настройки безопасности).

Вы можете добавить unsafe-inline в белый список в настройках, но это, похоже, не лучшая идея.

В вашем случае, чтобы ваш код работал с включённым CSP, я считаю, что вам нужно обрабатывать клик по-другому.


Кстати, вот компонент темы, использующий ваш код: https://github.com/Arkshine/discourse-timer-component.
Не стесняйтесь форкнуть его и установить на свой Discourse.

Надеюсь, мой код не слишком ужасен, но это был бы предпочтительный способ в отличие от добавления простого JavaScript в данном контексте.
Он должен работать так же, с дополнительными функциями реактивности, настройками и локализацией.

Это может показаться сложным, но это отличная возможность погрузиться в разработку компонентов темы! Не стесняйтесь спрашивать, если что-то непонятно. :slight_smile:

Настоятельно рекомендую использовать Discourse Theme CLI, если вы хотите работать с ним локально. Это очень удобно!

Я не могу выразить вам достаточно благодарности за помощь в этом. Это потрясающе!!
Вы вдохновили меня на изучение этого. :heart:

У меня есть несколько изменений и вопросов по поводу таймера. Могу я поделиться ими с вами?

Запросы:

  1. Какова цель кнопки «Ожидание»?

Критические немедленные изменения:

  1. Это непрерывный таймер: сначала он запускается на 1:30, затем переходит на 8:00 минут, затем снова на 1:30 и так далее, никогда не завершаясь.

  2. Когда таймер работает, пользователи должны иметь возможность перейти напрямую к 8:00 минутам, нажав кнопку «Войти в комнату», или переключиться на таймер 1:30, нажав «Читать задачу». Следовательно, отключение кнопок «Пауза» и «Стоп», когда таймер не работает, имеет смысл, но отключение кнопок «Читать задачу» и «Войти в комнату» во время работы таймера лишит пользователей возможности пропустить таймер.

Будущие изменения:

  1. Добавление голосового сообщения в начале таймера 1:30, в начале таймера 8:00 минут, при оставшихся 2:00 минутах таймера 8:00 минут и, наконец, в конце таймера 8:00 минут (что по сути является началом таймера 1:30). Всего три голосовых сообщения.
  2. Добавление всплывающего уведомления для каждого голосового сообщения, которое появляется и исчезает, не занимая весь экран, а отображаясь в области, где расположен таймер.

Я определённо не понял всё в вашем коде; похоже :smile:

Бессмысленно позволять нажимать на кнопки паузы/остановки, если таймер ещё не запущен. То же самое касается отображения «пауза» или «возобновить», поэтому получается, что в режиме ожидания у вас активный таймер. На самом деле я бы скрыл эту кнопку. Но, думаю, использовать метку «пауза» по умолчанию — это нормально.

Он чередуется между ними, понятно. Я думал, это цикл с одним из этих таймеров.
Не совсем понимаю контекст, это выглядит довольно странно, но я могу это исправить. :smile:

Понял.

Давайте сначала исправлю это. :slight_smile:

Привет,

Для меня невероятно видеть, как этот таймер оживает. Ты потрясающий и вдохновляющий человек.

Это таймер для экзамена, который проводят врачи. Я тоже врач и пытаюсь помочь другим врачам.

Экзамен состоит из 16 комнат, в каждой из которых находится один из 16 разных пациентов, которых нам нужно диагностировать и лечить. Перед входом в любую комнату снаружи находится задание, которое можно прочитать за 1 минуту 30 секунд, после чего вы входите в комнату. У вас есть 8 минут, чтобы выполнить задание и справиться с пациентом. Этот цикл повторяется для всех 16 комнат. В общей сложности на прохождение экзамена уходит 3 часа.

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

Надеюсь, это дает необходимый контекст. :innocent:

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

Спасибо за объяснение контекста, теперь я понимаю! :+1:

Я обнаружил ошибку: при нажатии на кнопку «Читать задачу» таймер переключается с 1:30 на 8:00, а затем зацикливается на 1:30. При нажатии на кнопку «Войти в комнату» таймер переключается с 8:00 на 1:30, а затем зацикливается на 8:00.

Моя вина. Исправил. Я проверил только первый цикл, так как торопился, и не заметил, что переключение после этого не произошло. :smile:

Ничего страшного!

Я тоже начну изучать материалы, которые вы прислали ранее. Если у меня возникнут вопросы, я обязательно свяжусь с вами.

Теперь проблема заключается в следующем: при нажатии кнопки «Прочитать задание» таймер запускается с 1:30 и зацикливается на 8:00.

1:30 > 8:00 > 8:00 > 8:00 ..

Если нажать кнопку «Войти в комнату», таймер запускается с 8:00 и зацикливается на 1:30.

8:00 > 1:30 > 1:30 > 1:30 ..

В идеале должен быть плавный, непрерывный цикл с чередованием 1:30 и 8:00, где точка старта определяется первой нажатой кнопкой.

Например, если нажать кнопку «Прочитать задание», таймер должен начинаться с 1:30, а затем переходить в чередующийся цикл между 8:00 и 1:30:

1:30 > 8:00 > 1:30 > 8:00 ..

Если нажать кнопку «Войти в комнату», таймер должен начинаться с 8:00 и следовать чередующемуся циклу между 1:30 и 8:00:

8:00 > 1:30 > 8:00 > 1:30 ..

Вы уверены, что обновили и перезагрузили страницу? Вы описываете ошибку до исправления, и сейчас я не могу её воспроизвести. Я снова протестировал, и цикл работает, как и ожидалось.

Только что проверил, всё работает как положено. :innocent::heart:

Теперь я думаю, что хотел бы научиться вносить изменения в таймер самостоятельно. Так что я перестану вас беспокоить. :joy:

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

Задача: добавить название «PLAB 2 Timer» прямо над самим таймером, вот так:

Можете ли вы подсказать, с чего мне начать?

Первый шаг — установка Discourse для разработки. Это упростит тестирование.

Затем вы можете сделать форк моего компонента, клонировать его в удобное место и использовать Discourse Theme CLI.

Посмотрите на код <template>...</template>. Вы можете добавить туда свой текст.
CSS находится в файле common/common.scss.

Вы можете локализовать свой текст, добавив запись в locales/en.yml, а затем использовать {{I18n.t(themePrefix("my_translation_key"))}}.