πŸ“… μƒˆ μΊ˜λ¦°λ” κΈ°λŠ₯: 반볡 이벀트 μ’…λ£Œ λ‚ μ§œ

You can now set an end date for recurring events in Discourse Calendar! :sparkles:

This much-requested feature allows you to specify when a recurring event series should stop, giving you more control over your event scheduling.

Create events that repeat daily, weekly, or monthly - and now determine exactly when they should end.

For more details on the Calendar plugin and its features, visit the official Calendar topic.

In the future, we might add the possibility to exclude specific weekdays.

22개의 μ’‹μ•„μš”

A tricky thing with the work β€œUntil” is that it is not totally obvious if it is included or excluded? Is there anything we can do here to give better clarity?

2개의 μ’‹μ•„μš”

Yeah, Google Calendar has the same issue! They use On, but it suffers from the same ambiguity:

However, I think that most users would safely assume that Until includes that date.

3개의 μ’‹μ•„μš”

Until (included):

?

edit: I did this for now UX: better copy by jjaffeux Β· Pull Request #737 Β· discourse/discourse-calendar Β· GitHub seems like a good simple change.


An alternative solution would be to display the actual date/time next to the date input, but probably overkill?

3개의 μ’‹μ•„μš”

You might want to borrow some ideas from my impementation of the Voucher Start/End dates in the New Voucher dialog in an e-commerce I’m working on:


Another example to demonstrate the flexibility and how we avoid ambiguity in date ranges in the UI:


Technical detail: In our application, we always save dates as β€œtimestamp with timezone” (postgres), so no database setting, nor connection setting, can affect the actual timestamp stored. Even though Postgres does not recommend it, we do it because it gives 100% guarantees of the date correctness in any situation and in any SQL query. You can operate with date timezones right in postgres using their date/time/timezone functions and be certain that it will work 100% correct always. We rely on it.

And then we have a timezone setting for all types of entities that need it: user profiles, markets, vouchers, reporting for accountants, and so on - so that we can translate any dates to any timezones on the fly without hesitation.

The main takeaways here are:

  1. Always store date and time with timezone.
  2. Always store timezone preference.
  3. Be very explicit about dates in the UI, don’t do any magic.
  4. Let the user see the actual dates in the choosen timezone before they click β€œSave”.
1개의 μ’‹μ•„μš”

μ•ˆλ…•ν•˜μ„Έμš”,

제 자체 ν˜ΈμŠ€νŒ… μΈμŠ€ν„΄μŠ€(ν•œ 달 전에 방금 μƒμ„±ν•œ 것)μ—λŠ” μ’…λ£Œ λ‚ μ§œ μ˜΅μ…˜μ΄ 보이지 μ•ŠμŠ΅λ‹ˆλ‹€.

μ œκ°€ λ­”κ°€ 잘λͺ»ν•˜κ³  μžˆλŠ” κ±΄κ°€μš”?

μŠ€ν¬λ¦°μƒ·μ—λŠ” λ‚ μ§œ/μ‹œκ°„ μ‚½μž… λŒ€ν™”μƒμžκ°€ μ•„λ‹ˆλΌ 이벀트 생성 λŒ€ν™”μƒμžκ°€ ν‘œμ‹œλœ 것 κ°™μŠ΅λ‹ˆλ‹€.

μ΄λŠ” Discourse Calendarμ—μ„œ 두 κ°€μ§€ λ‹€λ₯Έ μ›Œν¬ν”Œλ‘œμš°μž…λ‹ˆλ‹€:

  • λ‚ μ§œ/μ‹œκ°„ μ‚½μž…μ€ OP에 [calendar] 블둝이 ν¬ν•¨λœ ν† ν”½μ˜ 닡변에 μ‚¬μš©λ©λ‹ˆλ‹€.
  • 이벀트 생성은 μ‹€μ œ 이벀트([event ...][/event])λ₯Ό μƒμ„±ν•˜λŠ” κ²ƒμœΌλ‘œ, 반볡 이벀트 μ„€μ •(반볡 μ’…λ£Œ λ‚ μ§œ 포함)을 μ‚¬μš©ν•  수 μžˆλŠ” κ³³μž…λ‹ˆλ‹€.

λ”°λΌμ„œ 이 ν† ν”½μ—μ„œ κ³΅μ§€λœ κΈ°λŠ₯을 μ‚¬μš©ν•˜λ €λ©΄, μž‘μ„±κΈ° + 메뉴λ₯Ό μ—΄μ–΄ λ‚ μ§œ/μ‹œκ°„ μ‚½μž… λŒ€μ‹  이벀트 생성을 선택해 λ³΄μ„Έμš”.

μ΅œκ·Όμ— ν•΄λ‹Ή 반볡 이벀트 ν”Œλ‘œμš°λ₯Ό ν…ŒμŠ€νŠΈν•˜λ˜ 쀑, μ œν•œλœ 반볡이 μ™„μ „νžˆ 만료된 ν›„ λ°œμƒν•˜λŠ” μ—£μ§€ μΌ€μ΄μŠ€λ₯Ό λ°œκ²¬ν•˜μ—¬, 이λ₯Ό μˆ˜μ •ν•˜κΈ° μœ„ν•΄ λ‹€μŒ PR을 μ—΄μ—ˆμŠ΅λ‹ˆλ‹€:

1개의 μ’‹μ•„μš”

μ‹€μ œλ‘œλŠ” νŠΉμ • 주제 μ•ˆμ—μ„œ μΊ˜λ¦°λ”(이벀트 μˆ˜μ§‘)λ₯Ό μœ μ§€ν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

μ˜€ν•΄κ°€ μžˆμ—ˆλ˜ 점 μ£„μ†‘ν•©λ‹ˆλ‹€. 이곳에 처음 온 μ‚¬λžŒμ΄λΌμ„œμš”.

사싀 이벀트λ₯Ό 생성할 λ•ŒλŠ” 잘 μž‘λ™ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λ‚ μ§œ/μ‹œκ°„ μ‚½μž… κΈ°λŠ₯μ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠλŠ” 것이 μ•„μ‰¬μšΈ λΏμž…λ‹ˆλ‹€.

λ„μ™€μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

1개의 μ’‹μ•„μš”

λ¬Έμ œμ—†μ–΄μš” :slightly_smiling_face:

μ •λ¦¬ν•˜μžλ©΄, λ‚ μ§œ/μ‹œκ°„ μ‚½μž… κΈ°λŠ₯이 μ‹€μ œλ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ” κ²½μš°λŠ” μ•„λ‹ˆλΌκ³  μƒκ°ν•΄μš”. μ›Œν¬ν”Œλ‘œκ°€ λ‹€λ₯Έ κ²ƒμ΄μ—μš”.

λ‚ μ§œ/μ‹œκ°„ μ‚½μž…μ€ ν† ν”½μ˜ 첫 번째 κ²Œμ‹œκΈ€μ— [calendar] 블둝이 μžˆμ„ λ•Œ, λ‚ μ§œκ°€ μžˆλŠ” 닡변이 ν•΄λ‹Ή ν† ν”½μ˜ μΊ˜λ¦°λ”μ— ν‘œμ‹œλ˜λ„λ‘ ν•  λ•Œ μ‚¬μš©ν•΄μš”.

반면 이벀트 생성은 μ‹€μ œ Discourse 이벀트([event ...][/event])λ₯Ό μƒμ„±ν•΄μš”. 이 ν† ν”½μ—μ„œ λ…Όμ˜λœ 반볡 이벀트 μ’…λ£Œ λ‚ μ§œλŠ” κ·Έ 이벀트 반볡 μ‹œμŠ€ν…œμ— μ μš©λΌμš”.

λ”°λΌμ„œ νŠΉμ • 토픽에 κ΅­ν•œλœ μΊ˜λ¦°λ”λ₯Ό μœ μ§€ν•˜λ €λŠ” 것이 λͺ©ν‘œλΌλ©΄, μ›λž˜ μŠ€ν¬λ¦°μƒ·μ— ν‘œμ‹œλœ μ›Œν¬ν”Œλ‘œκ°€ μ μ ˆν•΄μš”. λ‹€λ§Œ μ΄λ²€νŠΈμ™€ λ™μΌν•œ μ œν•œμ  반볡 κΈ°λŠ₯을 μ‚¬μš©ν•˜μ§€λŠ” μ•Šμ•„μš”.

λ„€, μ΄ν•΄ν–ˆμŠ΅λ‹ˆλ‹€.

μ‚¬μš© μ‚¬λ‘€λŠ” 제 ν•™κ΅μ˜ 달λ ₯을 κ΄€λ¦¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 항상 μž…λ ₯ν•΄μ•Ό ν•  일정이 μžˆμœΌλ―€λ‘œ, ν•™λΆ€λͺ¨ λˆ„κ΅¬λ‚˜ μ£Όμ œμ— 닡글을 달아 μƒˆλ‘œμš΄ 일정을 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ–΄μ œ λ°˜λ³΅λ˜λŠ” 일정을 μž…λ ₯ν•΄μ•Ό ν–ˆλŠ”λ°, λΆˆν–‰νžˆλ„ 이 μ›Œν¬ν”Œλ‘œμš°μ—λŠ” 그런 μ˜΅μ…˜μ΄ μ—†μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μƒˆ λ‚ μ§œλ‘œ 주제λ₯Ό μ—¬λŸ¬ 번 닡글을 달아 μˆ˜λ™μœΌλ‘œ μ²˜λ¦¬ν•΄μ•Ό ν•©λ‹ˆλ‹€(더 ν˜„λͺ…ν•œ 방법이 μžˆλŠ”μ§€ λͺ¨λ₯΄κ² λ„€μš”…).

기쑴의 ν† ν”½ λ‹¨μœ„ [calendar] μ›Œν¬ν”Œλ‘œλ₯Ό μœ μ§€ν•˜λ©΄μ„œ μˆ˜λ™ 닡변을 μžλ™ν™”ν•˜λŠ” 방법이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•œ κ°€μ§€ κ°€λŠ₯성은 μ΄λ©”μΌλ‘œ λ‹΅λ³€ν•  수 μžˆλŠ” κΈ°λŠ₯이 ν™œμ„±ν™”λœ μ „μš© Discourse μ‚¬μš©μžλ₯Ό λ§Œλ“€κ³ , Power Automateλ‚˜ Azure Logic Appκ³Ό 같은 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‚ μ§œκ°€ ν¬ν•¨λœ κ°œλ³„ 닡변을 μƒμ„±ν•œ λ’€ 이메일을 톡해 μΊ˜λ¦°λ” ν† ν”½μœΌλ‘œ μ „μ†‘ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, μ’…λ£ŒμΌμ΄ μžˆλŠ” μ£Όκ°„ μ˜ˆμ•½μ€ μžλ™ν™” 도ꡬλ₯Ό 톡해 ν•„μš”ν•œ κ°œλ³„ λ‹΅λ³€μœΌλ‘œ ν™•μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ ν•™λΆ€λͺ¨λ“€μ€ λΆ„λ¦¬λœ 이벀트 토픽이 μ•„λ‹Œ, ν‰μ†Œμ™€ 같은 단일 ν† ν”½ μΊ˜λ¦°λ”λ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

Discourse의 μ‚¬μš©μžλ³„ 이메일 λ‹΅λ³€ ν‚€ μ„€μ •κ³Ό κ΄€λ ¨ν•˜μ—¬ 주의 깊게 ꡬ성해야 ν•  μ„ΈλΆ€ 사항이 λͺ‡ κ°€μ§€ μžˆμœΌλ―€λ‘œ, 이 ν† ν”½μ—μ„œ ꡬ성 과정을 μžμ„Ένžˆ λ‹€λ£¨κΈ°λŠ” μ μ ˆν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

이 방식이 μœ μš©ν•  것 κ°™λ‹€λ©΄, λ³„λ„μ˜ 메타 ν† ν”½μ—μ„œ ν•¨κ»˜ ν•΄κ²°ν•˜λŠ” 것을 기꺼이 λ„μ™€λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

아직 ν•œ 번만 그런 일이 μžˆμ—ˆμœΌλ‹ˆ, λ‹€μŒμ— λ‹€μ‹œ λ°œμƒν•˜λ©΄ κ·Έλ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬κ² μŠ΅λ‹ˆλ‹€(λ‹€μ‹œ μΌμ–΄λ‚˜μ§€ μ•ŠκΈ°λ₯Ό 바라며).

μ΄λ©”μΌλ‘œ λ‹΅μž₯ν•˜λŠ” 방법은 μœ μ§€ν•˜κ² μŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€. 그런데 일 λ…„ λ‚΄λ‚΄ λ§€μ£Ό μ—΄λ¦¬λŠ” 이벀트의 경우, 52개의 λ‹΅μž₯을 λͺ¨λ‘ 생성해야 ν•œλ‹€λŠ” λœ»μΈκ°€μš”? 그러면 μ£Όμ œκ°€ 읽기 νž˜λ“€μ–΄μ§ˆ 것 같은데…

κ·Έ μ™Έμ—λŠ” κ΄€λ¦¬μž κΆŒν•œμ΄ μžˆμœΌλ―€λ‘œ APIλ₯Ό 톡해 μ˜ˆμ•½μ„ μˆ˜λ™μœΌλ‘œ μΆ”κ°€ν•˜λŠ” 방법도 μ‚¬μš©ν•  수 μžˆμ„ 것 κ°™μŠ΅λ‹ˆλ‹€.

μ•Œλ €μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

λ„€ β€” λΆˆν–‰νžˆλ„ APIλ₯Ό μ‚¬μš©ν•˜λ©΄ λ‹΅κΈ€ 생성은 μžλ™ν™”λ˜μ§€λ§Œ, ν˜Όλž€ λ¬Έμ œλŠ” μ‹€μ œλ‘œ ν•΄κ²°λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν† ν”½ μΊ˜λ¦°λ”μ˜ 경우 κ°œλ³„ μΊ˜λ¦°λ” ν•­λͺ©μ΄ μ—¬μ „νžˆ κ°œλ³„ λ‹΅κΈ€λ‘œ ν‘œμ‹œλ˜λ―€λ‘œμš”.

λ‹€ν–‰νžˆλ„ 거의 λ™μΌν•œ μ‚¬μš© 사둀λ₯Ό λ‹€λ£¨λŠ” κΈ°μ‘΄ κΈ°λŠ₯ μš”μ²­μ„ μ°Ύμ•˜μŠ΅λ‹ˆλ‹€:

이 μ˜ˆμ‹œμ—μ„œλŠ” 12μ£Ό 연속 μˆ˜μš”μΌμ— μ§„ν–‰λ˜λŠ” 과정을 닀루고 있으며, λ™μΌν•œ 점을 μ§€μ ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 즉, λͺ¨λ“  λ°œμƒ 건을 κ°œλ³„μ μœΌλ‘œ μƒμ„±ν•˜λŠ” 것은 번거둭고 토픽을 ν˜Όλž€μŠ€λŸ½κ²Œ λ§Œλ“­λ‹ˆλ‹€.

그듀은 λ‚ μ§œ/μ‹œκ°„ μ‚½μž…μ—μ„œ 반볡 섀정을 ν—ˆμš©ν•˜κ³ , λ§ˆμ§€λ§‰ λ°œμƒ 건을 μœ„ν•œ μ’…λ£Œ λ‚ μ§œλ₯Ό ν•¨κ»˜ μ§€μ •ν•  수 μžˆλ„λ‘ μ œμ•ˆν•˜κ³  μžˆλŠ”λ°, μ΄λŠ” κ·€ν•˜κ°€ ν•„μš”λ‘œ ν•˜λŠ” 것과 맀우 μœ μ‚¬ν•΄ λ³΄μž…λ‹ˆλ‹€.

λ”°λΌμ„œ 52개의 κ²Œμ‹œλ¬Όμ„ μƒμ„±ν•˜λŠ” API/Power Automate 우회 μ†”λ£¨μ…˜μ„ κ΅¬μΆ•ν•˜λŠ” κ²ƒλ³΄λ‹€λŠ”, ν•΄λ‹Ή κΈ°λŠ₯ μš”μ²­μ— 학ꡐ μΊ˜λ¦°λ” μ‚¬μš© 사둀λ₯Ό μΆ”κ°€ν•˜λŠ” 것이 더 λ‚˜μ€ 선택일 κ²ƒμž…λ‹ˆλ‹€.

1개의 μ’‹μ•„μš”

κ³ λ§ˆμ›Œμš”, κ·Έλ ‡κ²Œ ν• κ²Œμš”!

정리가 μ•ˆ 될까 κ±±μ •λœλ‹€λ©΄, μ£Όμ œλ³„ μΊ˜λ¦°λ” λŒ€μ‹  Events_calendar_categories 섀정을 μ‚¬μš©ν•˜κΈΈ ꢌμž₯ν•©λ‹ˆλ‹€. 그리고 λΆ€λͺ¨λ“€μ€ μ•„λž˜ μžλ™ν™”λ₯Ό 톡해 Discourse에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€: