Неопределенное имя файла ICS

:information_source: Обзор

При нажатии на кнопку «Добавить в календарь» в модальном окне предпросмотра события (которое появляется после клика по дате события), загружаемый файл .ics называется undefined.ics, а заголовок события внутри календарного файла также установлен как SUMMARY:undefined. Однако загрузка календаря через опцию «Добавить в календарь» в меню с тремя точками события работает как положено: имя события используется как для имени файла, так и для заголовка в календаре.

:walking_woman: Шаги для воспроизведения

  1. Создайте или откройте тему с событием.

  2. Нажмите на дату события, отображаемую в сообщении, чтобы развернуть модальное окно предпросмотра:

  3. В модальном окне нажмите на кнопку Добавить в календарь.

  4. Сохраните сгенерированный файл .ics.

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

:white_check_mark: Ожидаемый результат

  • Загружаемый файл .ics должен называться в соответствии с названием события.
  • Содержимое календарного файла должно содержать корректное поле SUMMARY: с названием события.

:x: Фактический результат

  • Загружаемый файл называется undefined.ics.
  • Название события в календарном файле указано как SUMMARY:undefined.
  • (При загрузке через меню с тремя точками и имя файла, и заголовок указаны корректно.)

:books: Дополнительная информация

  • Пример некорректного содержимого ICS:
    BEGIN:VCALENDAR
    VERSION:2.0
    PRODID:-//Discourse//EN
    BEGIN:VEVENT
    UID:1762794000000_1762801200000
    DTSTAMP:20251105T173754Z
    DTSTART:20251110T170000Z
    DTEND:20251110T190000Z
    SUMMARY:undefined
    END:VEVENT
    END:VCALENDAR
    

Протестировано на Meta и нескольких других сайтах Discourse, результат одинаковый.

4 лайка

Это сложный случай, Dax, который является побочным эффектом нашего конвейера.

Мы генерируем bbcode для дат здесь:

А затем обрабатываем его здесь:

Таким образом, в контексте обработанного HTML-фрагмента ссылка «скачать ics» не знает, к какому посту (или событию) она относится.

У нас также есть другой конвейер для генерации ics по адресу:

Поэтому с инженерной точки зрения нам нужно решить, что делать:

  1. Научить «обработку дат» перенаправлять генерацию ics в Discourse Calendar.

ИЛИ

  1. Предоставить Discourse Local Dates достаточно контекста, чтобы он мог независимо генерировать ics и оставить код фрагментированным.

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

5 лайков

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

редактирование: Конечно, @dax уже об этом сказал, но я не внимательно прочитал!

6 лайков

Здесь очень много изменений:

Сегодня пятница (по крайней мере, где-то ;p), поэтому я отложу слияние до понедельника.

Это изменение крайне масштабное и должно значительно улучшить поддержку формата ICS.

  • Объединена конвейерная обработка генерации ICS — теперь используется единый механизм как для функции «Добавить в календарь», так и для кликов по датам.
  • Исправлено множество тонкостей в формате ICS:
    • Мы передаём RRULE, поэтому при добавлении повторяющегося события в календарь оно будет корректно обработано.
    • Соблюдены правильные разрывы строк CRLF и общие требования формата ICS.
    • Добавлена поддержка часовых поясов: при добавлении события в календарь будет указываться правильный часовой пояс, а не UTC. Это обеспечит корректную работу повторяющихся событий.
  • Расширен формат локальных дат для поддержки опционально закодированных ICS-файлов.

У меня остался открытый вопрос: поддерживать ли RRULE или отказаться от него.

Если вы нажмёте здесь:

Мы планируем добавить повторяющееся событие целиком или только один его экземпляр?

Аналогичный вопрос возникает здесь:

@lindsey Я пока не определился, можно аргументировать оба варианта.

  1. Я кликнул на повторяющееся событие и хочу добавить всю его повторяющуюся серию в календарь.

ИЛИ

  1. Я кликнул на КОНКРЕТНЫЙ ЭКЗЕМПЛЯР повторяющегося события и хочу добавить только его.

Я реализовал вариант (1), так как считаю его более правильным, но готов изменить на вариант (2), если вы предпочтёте его.

7 лайков

Сообщение было объединено с существующей темой: Страница предстоящих событий не работает после последнего обновления

Я понимаю аргументы в пользу обоих вариантов, но сам тоже предпочитаю вариант 1. Мне кажется, что он не только более корректен, но и проще «исправить», если это не то, чего хотел пользователь, поскольку большинство календарных приложений позволяют легко удалить лишние события одним действием (например, Google Календарь):

Таким образом, неудобство:

  • Я не хотел подтверждать участие во всех событиях, поэтому мне нужно удалить лишние

намного меньше, чем неудобство:

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

Круто, я оставил RSVP для всех.

Сегодня это объединили :confetti_ball:

5 лайков

Эта тема была автоматически закрыта через 4 дня. Новые ответы больше не принимаются.