Discourse Events

:partying_face: 이 플러그인은 이제 Bundling more popular plugins with Discourse core 에 따라 Discourse 코어에 번들링됩니다. 직접 호스팅을 하고 이 플러그인을 사용 중이라면, 다음 업그레이드 전에 app.yml에서 플러그인을 제거해야 합니다.

2개의 좋아요

참가자 수 제한 기능을 정말로 필요로 합니다. 많은 행사들이 정원이 제한되어 있기 때문입니다.

현재 행사 시스템에서는 다음을 수행할 수 없습니다:

  • 최대 참가자 수 설정,
  • 누가 먼저 등록했는지 확인 (등록 타임스탬프 없음),
  • 대기 목록 관리 또는 자리가 비면 해당 사람들에게 알림 전송.

다음 기능들이 매우 유용할 것 같습니다:

  1. 정원이 차면 더 이상의 사용자가 등록하지 못하도록 하는 참가자 수 제한(캡).
  2. 행사가 만원이 된 후에도 여전히 참석을 원하는 사람들을 위한 대기 목록.
  3. 자리가 비면 자동으로 전송되는 자동 알림.
  4. 등록 순서를 확인할 수 있는 선택적 타임스탬프 (공정한 우선순위 배정에 유용).

이 기능들은 오프라인 행사나 정원 제한이 있는 행사를 운영하는 커뮤니티에 매우 유용할 것입니다.

이와 유사한 기능이 이미 계획되었거나 개발 중인가요?
아니면 이 사용 사례에 대한 알려진 우회 방법이 있나요?

미리 감사드립니다!

6개의 좋아요

Aurora님, 감사합니다! 네이티브 캘린더 작업이 다시 진행 중이라는 소식을 들을 수 있어 정말 기쁩니다.

또한 커뮤니티 토론에서 여러 번 언급된 고영향 요청 사항 하나를 더 공유하고 싶습니다. 바로 iCal 피드 동기화입니다.

이 내용은 여기서 별도의 전용 주제로 분리되어 논의되고 있습니다:

외부 .ics 피드(예: 학교 시간표, 시정 캘린더, 조직 행사 등)를 구독하여 Discourse 토픽 캘린더에 반영할 수 있다면, 이 기능은 실제 배포 환경에서 훨씬 더 유용해질 것입니다. 그렇지 않으면 이벤트를 수동으로 복사해야 하는데, 이는 오류 발생 가능성이 높고 유지보수가 어렵습니다.

Discourse 팀에서 예정된 구현 범위에 해당 제안의 일부(예: 단방향 iCal 동기화, 피드 새로고침 간격 설정, 선택적 이벤트 태그 등)가 포함되는지에 대한 의견을 주시면 정말 감사하겠습니다.

어쨌든 Discourse Calendar에 새로운 생명을 불어넣어 주셔서 다시 한번 감사드립니다. 앞으로의 발전에 기대가 큽니다!

5개의 좋아요

아래와 같이 작성 도구(composer)에서 바로 이벤트 생성 버튼을 표시하려면, 테마의 헤더에 아래 코드를 사용하세요. admin > appearance > theme > edit > edit code > head (태그 사이에 위치하도록 확인)

데스크톱 환경의 Firefox에서 discourse 3.5.0.beta9-dev에서 테스트 완료

 <!-- Custom Create Event Button (Icon-based, Language-proof) -->
<script>
(()=>{const e=".d-editor-button-bar",t=".btn.no-text.fk-d-menu__trigger.toolbar-menu__options-trigger.toolbar__button.options.toolbar-popup-menu-options",n=".fk-d-menu__inner-content",o=".d-modal.fk-d-menu-modal",c=e=>{const t=e.querySelector('svg use[href="#calendar-day"]');return t?t.closest("button"):null},r=(e,t,n=4e3)=>new Promise((o,c)=>{const r=t(e);if(r)return o(r);const l=new MutationObserver(()=>{const n=t(e);n&&(l.disconnect(),o(n))});l.observe(e,{childList:!0,subtree:!0}),setTimeout(()=>{l.disconnect(),c()},n)}),l=(e=4e3)=>{const t=new MutationObserver(()=>{document.querySelector(o)&&t.disconnect()});t.observe(document.body,{childList:!0,subtree:!0}),setTimeout(()=>t.disconnect(),e)},s=e=>{if(e.querySelector(".custom-create-event-btn"))return;const o=document.createElement("button");o.className="btn no-text btn-icon toolbar__button link custom-create-event-btn",o.title="Create event",o.innerHTML='<svg class="fa d-icon d-icon-calendar-day svg-icon"><use href="#calendar-day"></use></svg>',e.appendChild(o),o.addEventListener("click",async()=>{const e=document.querySelector(t);if(!e)return;e.click();let o=document.querySelector(n);o||(await new Promise((e,t)=>{const c=new MutationObserver(()=>{(o=document.querySelector(n))&&(c.disconnect(),e())});c.observe(document.body,{childList:!0,subtree:!0}),setTimeout(()=>{c.disconnect(),t()},2e3)}));try{(await r(o,c)).click(),l()}catch{}})},u=new MutationObserver(()=>{const t=document.querySelector(e);t&&s(t)});u.observe(document.body,{childList:!0,subtree:!0});const d=document.querySelector(e);d&&s(d)})();
</script>

스크립트를 시도해 봤는데, 이벤트 생성 버튼은 잘 만들어지긴 했습니다. 하지만 그 버튼을 클릭하면 ‘더보기’ 버튼과 동일한 컨텍스트 메뉴가 표시됩니다. 제가 잘못 조작한 것일 수도 있습니다.

1개의 좋아요

업데이트 이후 개선된 것 같으며, 적어도 "Create event"만 표시됩니다.

스크린샷은 독일어입니다. 죄송합니다.

안녕하세요,

최신 버전에서 3.5.0.beta9-dev를 사용하면 정상 동작합니다. 사용 중인 버전이 무엇인지 모르겠네요.

이것은 JavaScript이므로, 브라우저에서 F12를 눌러 콘솔을 열고 발생한 JS 에러를 제공해 주셔야 합니다. (콘솔이 열린 상태에서 해당 버튼을 한 번 클릭하면 그 시점에 어떤 일이 발생하는지에 대한 정보를 얻을 수 있습니다.)

저도 같은 버전 3.5.0.beta9-dev를 사용하고 있습니다.
콘솔 메시지는 다음과 같습니다.


무언가를 잘못하고 있는 것 같습니다 :sweat_smile:

저는 Edge 브라우저를 사용하지 않습니다. 방금 원본 게시글에서 오류를 발견하고 수정한 스크립트로 다시 시도해 주시겠어요? 그래도 작동하지 않으면 나중에 Edge를 설치한 후에 업데이트하겠습니다.

방금 스크립트를 모바일 호환성이 더 좋아지도록 업데이트했습니다. 이제 작동해야 합니다. 원본 게시물에서 스크립트를 복사해서 붙여넣어 주세요.

업데이트된 코드가 Edge 브라우저에서 정상적으로 작동하는 것을 확인했습니다. uBlock과 같은 확장 기능이 있다면 해당 Discourse 페이지에서 항상 비활성화할 수 있지만, 이 문제와 관련이 있다고 생각하지는 않습니다.

죄송하지만 저한테는 계속 같은 문제가 발생합니다. 제가 무언가를 잘못하고 있는 것 같습니다.

그런데 여기에는 스크립트를 제대로 붙여넣고 있습니다.

1개의 좋아요

좋습니다, Gilles의 상황을 덕분에 title 속성이 언어에 따라 달라지는 대신, 아이콘의 고유한 .svg 클래스를 기반으로 한 선택자를 설정할 수 있었습니다. 스크립트도 이제 미니파일이 적용되고 IIFE로 감싸졌습니다.

업데이트된 스크립트는 여기서 찾을 수 있습니다: Discourse Events - #535 by opcourdis

1개의 좋아요

도와주셔서 감사합니다 :+1:

1개의 좋아요

스크립트를 #customization:theme-component로 패키징하고, 적용 대상 카테고리를 선택할 수 있도록 해 주시면 매우 유용할 것 같습니다.

제가 염두에 둔 사용 사례는 ‘이벤트’ 카테고리로, 이벤트 게시를 매우 명확하고 눈에 띄게 만들고 싶습니다.

아마도 이 기능은 다른 훌륭한 개선 사항과 함께 패키징할 수도 있을 것입니다.

1개의 좋아요

아래 내용을 사용하시고, 첫 번째 조건을 수정하여 카테고리 지정을 변경하고, 버튼을 더 눈에 띄게 보이도록 CSS를 활용하시면 됩니다: .btn.no-text.btn-icon.toolbar__button.link.custom-create-event-btn {
order: -1;
}

<script>(()=>{if(!(document.body.classList.contains("category-events")||document.body.classList.contains("category-event2")||document.body.classList.contains("category-event3")))return;const e=".d-editor-button-bar",t=".btn.no-text.fk-d-menu__trigger.toolbar-menu__options-trigger.toolbar__button.options.toolbar-popup-menu-options",n=".fk-d-menu__inner-content",o=".d-modal.fk-d-menu-modal",c=e=>{const t=e.querySelector('svg use[href="#calendar-day"]');return t?t.closest("button"):null},r=(e,t,n=4e3)=>new Promise((o,c)=>{const r=t(e);if(r)return o(r);const l=new MutationObserver(()=>{const n=t(e);n&&(l.disconnect(),o(n))});l.observe(e,{childList:!0,subtree:!0}),setTimeout(()=>{l.disconnect(),c()},n)}),l=(e=4e3)=>{const t=new MutationObserver(()=>{document.querySelector(o)&&t.disconnect()});t.observe(document.body,{childList:!0,subtree:!0}),setTimeout(()=>t.disconnect(),e)},s=e=>{if(e.querySelector(".custom-create-event-btn"))return;const o=document.createElement("button");o.className="btn no-text btn-icon toolbar__button link custom-create-event-btn",o.title="Create event",o.innerHTML='<svg class="fa d-icon d-icon-calendar-day svg-icon"><use href="#calendar-day"></use></svg>',e.appendChild(o),o.addEventListener("click",async()=>{const e=document.querySelector(t);if(!e)return;e.click();let o=document.querySelector(n);o||(await new Promise((e,t)=>{const c=new MutationObserver(()=>{(o=document.querySelector(n))&&(c.disconnect(),e())});c.observe(document.body,{childList:!0,subtree:!0}),setTimeout(()=>{c.disconnect(),t()},2e3)}));try{(await r(o,c)).click(),l()}catch{}})},u=new MutationObserver(()=>{const t=document.querySelector(e);t&&s(t)});u.observe(document.body,{childList:!0,subtree:!0});const d=document.querySelector(e);d&&s(d)})();</script>



제안해 주셔서 감사합니다. 저는 아직 discourse에 익숙하지 않아서 테마 컴포넌트를 확인해 보겠습니다. 버튼 위치가 확실히 더 나은 것 같지만, 이 링크(FEATURE: introduce max attendees for events - Pull Request #34313 - discourse/discourse - GitHub) 덕분에 이벤트 참가자 제한을 위한 제 다른 스크립트가 곧 필요 없게 될 수도 있습니다.

4개의 좋아요

Discourse와 discourse-calendar 플러그인을 최신 버전으로 업그레이드한 후, 관리자로서 다음과 같은 경고가 표시됩니다:

⚠️ 사이트의 게시글 콘텐츠 데코레이터 중 하나가 오류를 발생시켜 게시글이 올바르게 표시되지 않을 수 있습니다.
원인: 'discourse-calendar' 플러그인
(이 메시지는 사이트 관리자만 볼 수 있습니다)
  • 캘린더 플러그인이 더 이상 작동하지 않습니다: 주제 내에서 캘린더 콘텐츠와 이벤트가 표시되지 않습니다.
  • 최근 업그레이드 이전에는 플러그인이 정상적으로 작동했습니다.
  • 현재 제 Discourse 사이트와 모든 공식 플러그인은 최신 상태로 업데이트되어 있습니다.

저희 포럼에서는 Discourse Post Event 플러그인을 사용하고 있습니다.
현재 사용자가 이벤트에 **참가(RSVP)**하면, 해당 주제가 자동으로 “Watching(관심 등록)” 상태로 설정됩니다. 이로 인해 이벤트 주제에 새로운 답글이 달릴 때마다 모든 참가자에게 알림이 전송됩니다.

누군가 이벤트에 참가하더라도 기본 알림 수준을 “Normal(일반)”로 유지하길 원합니다.

사이트 설정을 확인해 보았지만, 이를 변경할 수 있는 옵션을 찾지 못했습니다.
사용자가 이벤트에 RSVP할 때 발생하는 이 자동 “Watching” 동작을 비활성화하거나 변경할 수 있는 방법이 있을까요?

1개의 좋아요

그렇지는 않은 것 같습니다. 하지만 유용한 기능 요청이 될 수 있겠네요.

유용한 우회 방법으로는 토론을 닫아 답변을 막고, 대신 채팅 채널을 연결하는 것입니다(채팅 채널은 기본적으로 알림을 보내지 않습니다).

“오늘” 버튼의 라벨이 오해를 불러일으킬 수 있습니다.

이 버튼은 실제로는 현재 날짜로 이동하는 것이 아니라, 활성 기간 탭(일/주/월/년)의 현재 뷰로 이동합니다. 일, 주, 월 탭에서는 현재 날짜가 화면에 표시되도록 하지만, 년 탭에서는 현재 연도로만 이동합니다(항상 1월부터 시작함).

아래와 같이 개선하는 것이 좋을 것입니다.

  • 기능을 더 정확하게 설명할 수 있도록 "현재"와 같이 이름을 변경하거나
  • 더 나은 방법으로는, 년 목록에서 현재 연도로만 이동하는 것이 아니라 현재 날짜까지 스크롤되도록 하는 것입니다.
1개의 좋아요