λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

λ…Έλ ₯을 μ΄κΈ°λŠ” 재λŠ₯은 μ—†κ³ 
λ…Έλ ₯을 μ™Έλ©΄ν•˜λŠ” 결과도 μ—†λ‹€.
- 이창호 9단

OPEN SOURCE/FullCalendar

[FullCalendar] ν’€μΊ˜λ¦°λ”(FullCalendar) 속성 - 4, 선택 κΈ°λŠ₯ (Selectable Options)

  Junesker   2025. 2. 10.
λ°˜μ‘ν˜•

μžλ°”μŠ€ν¬λ¦½νŠΈ 기반의 μ˜€ν”ˆμ†ŒμŠ€ FullCalendar

 

 

 

 

 

 

ν’€μΊ˜λ¦°λ”(FullCalendar) 속성 - 4

 

 

 

 

 

FullCalendar JSλ₯Ό ν™œμš©ν•˜λ‹€ 보면 ꡉμž₯히 λ‹€μ–‘ν•œ 속성과 이벀트λ₯Ό λ³Ό 수 μžˆλ‹€. μ—¬λŸ¬ 속성듀이 μ–΄λ–€ νŠΉμ§•λ“€μ„ 가지고 μžˆλŠ”μ§€, ν’€μΊ˜λ¦°λ”κ°€ 가지고 μžˆλŠ” μ΄λ²€νŠΈμ—λŠ” μ–΄λ–€ 것듀이 있으며 ν•΄λ‹Ή μ΄λ²€νŠΈλŠ” μ–΄λ–€ λ™μž‘λ“€μ„ ν¬ν•¨ν•˜κ³  μžˆλŠ”μ§€ 등등에 λŒ€ν•΄μ„œ 잘 λͺ¨λ₯Ό λ•Œκ°€ λ§Žλ‹€. FullCalendar JS 곡식 ν™ˆνŽ˜μ΄μ§€μ—μ„œ μ œκ³΅ν•˜λŠ” Documents νŒŒμΌμ„ 보긴 ν•˜μ§€λ§Œ Docs λ¬Έμ„œλ“€μ„ ν™•μΈν•˜λŠ” 게 아직 μ΅μˆ™μ§€ μ•Šμ€ μ‚¬λžŒμ€ λ¬Έμ„œ λ³΄λŠ” 방법쑰차 μ–΄λ €μšΈ 수 μžˆλ‹€. κ·Έλž˜μ„œ FullCalendar JSμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” 속성듀을 ν•˜λ‚˜μ‹ μ‚΄νŽ΄λ³΄κ³ μž ν•œλ‹€. λ¬Όλ‘  100% λͺ¨λ“  속성듀을 μ „λΆ€ 보면 μ’‹κ² μ§€λ§Œ, κ°€μž₯ μ€‘μš”ν•œ 속성듀 μœ„μ£Όλ‘œ 확인해 보고 κ·Έ 외에 속성듀은 직접 Documentsλ₯Ό 확인해 보길 λ°”λž€λ‹€.

 

 

 

 

 

πŸ“† 4. 선택 κΈ°λŠ₯ (Selectable Options)


 

 

 

 

 

selectable

' μ‚¬μš©μžκ°€ ν΄λ¦­ν•˜κ³  λ“œλž˜κ·Έν•˜μ—¬ μ—¬λŸ¬ λ‚ μ§œλ‚˜ μ‹œκ°„λŒ€λ₯Ό κ°•μ‘° ν‘œμ‹œ '


selectable μ˜΅μ…˜μ€ μ‚¬μš©μžκ°€ ν΄λ¦­ν•˜κ³  λ“œλž˜κ·Έν•˜μ—¬ 선택할 수 μžˆλ„λ‘ ν•˜λŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€. ν•΄λ‹Ή μ˜΅μ…˜μ΄ ν™œμ„±ν™”λ˜μ–΄ 있으면 μ‚¬μš©μžκ°€ μ„ νƒν•˜κ³  μ·¨μ†Œλ˜λŠ” μ‹œμ μ„ λͺ¨λ‹ˆν„°λ§ν•˜λŠ”데 μœ μš©ν•©λ‹ˆλ‹€. ν•΄λ‹Ή μ˜΅μ…˜μ€ ν•„μˆ˜ ν”ŒλŸ¬κ·ΈμΈ( '@fullcalendar/core' )이 ν•„μš”ν•©λ‹ˆλ‹€.  ν•΄λ‹Ή ν”ŒλŸ¬κ·ΈμΈμ€ 'index.global.js'에 ν¬ν•¨λ˜μ–΄ μžˆμ–΄ global.jsλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ 무리없이 μ‚¬μš©ν•  수 μžˆλ‹€.

 

document.addEventListener('DOMContentLoaded', function() {
	var calendarEl = document.getElementById('calendar');
	var calendar = new FullCalendar.Calendar(calendarEl, {
		selectable : true
        	// selectable : false
	});
	calendar.render();
});

 

 

selectable μ˜΅μ…˜μ΄ 'false'둜 λΉ„ν™œμ„±ν™” λ˜μ–΄ μžˆλ‹€λ©΄ μœ„ μ˜μƒμ²˜λŸΌ 선택 μ˜μ—­μ΄ λ‚˜νƒ€λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ˜΅μ…˜ 값을 'true'인 ν™œμ„±μœΌλ‘œ μ„€μ •ν•œλ‹€λ©΄ μ‚¬μš©μžκ°€ μ„ νƒν•œ μ‹œμ μ„ λͺ¨λ‹ˆν„°λ§ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

 

selectMirror

' μ‚¬μš©μžκ°€ λ“œλž˜κ·Έν•˜λŠ” λ™μ•ˆ PlaceHolder 이벀트λ₯Ό 그릴지 μ—¬λΆ€  '


selectMirrorλŠ” FullCalendarμ—μ„œ 선택(selection) μ‹œ μ‹œκ°μ μΈ ν”Όλ“œλ°±μ„ μ œκ³΅ν•˜λŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€. 이 속성을 true둜 μ„€μ •ν•˜λ©΄, μ‚¬μš©μžκ°€ λ“œλž˜κ·Έλ‘œ λ‚ μ§œλ‚˜ μ‹œκ°„ λ²”μœ„λ₯Ό 선택할 λ•Œ, μ‹€μ œλ‘œ 이벀트λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ "미러(mirror)" ν˜•νƒœλ‘œ μž„μ‹œ ν‘œμ‹œκ°€ λ©λ‹ˆλ‹€. 즉, 선택 μ˜μ—­μ΄ 마치 이벀트처럼 μΊ˜λ¦°λ”μ— ν‘œμ‹œλ˜μ–΄ μ‚¬μš©μžμ—κ²Œ 선택 λ²”μœ„λ₯Ό 더 λͺ…ν™•ν•˜κ²Œ λ³΄μ—¬μ£ΌλŠ” 역할을 ν•©λ‹ˆλ‹€. 기본값은 falseμž…λ‹ˆλ‹€.

 

document.addEventListener('DOMContentLoaded', function() {
	var calendarEl = document.getElementById('calendar');
	var calendar = new FullCalendar.Calendar(calendarEl, {
    	selectable: true,
		selectMirror: true
        	// selectMirror: false
	});
	calendar.render();
});

 

 

λ‚ μ§œλ‚˜ μ‹œκ°„ λ²”μœ„λ₯Ό λ“œλž˜κ·Έν•˜λ©΄ νŒŒλž€ 블둝 ν˜•νƒœλ‘œ 선택 μ˜μ—­μ΄ ν‘œμ‹œλ˜λŠ”κ²ƒμ„ 확인할 수 있고, νŒŒλž€ ν•΄λ‹Ή μ˜μ—­μ΄ λ°”λ‘œ selectMirror μ†μ„±μ˜ 값이 true둜 ν™œμ„±ν™”λœ νš¨κ³Όμž…λ‹ˆλ‹€. ν•΄λ‹Ή μ΄λ²€νŠΈλŠ” selectable μ˜΅μ…˜μ˜ 값이 true둜 μ„€μ •λ˜μ–΄μ•Όν•˜κ³ , μ‹€μ œ 이벀트 데이터가 μ €μž₯λ˜κ±°λ‚˜ μΆ”κ°€λ˜μ§€ μ•Šκ³  μ‹œκ°μ μΈ ν‘œμ‹œλ§Œ ν•©λ‹ˆλ‹€. 선택 ν•΄μ œ μ‹œμ—λŠ” Mirror νš¨κ³ΌλŠ” μžλ™μœΌλ‘œ μ‚¬λΌμ§‘λ‹ˆλ‹€. ν•΄λ‹Ή κΈ°λŠ₯은 특히 λ“œλž˜κ·Έλ‘œ μ‹œκ°„ 블둝을 선택할 λ•Œ μœ μš©ν•˜λ©°, 더 직관적인 UIλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

 

 

 

 

 

unselectAuto

' νŽ˜μ΄μ§€μ˜ λ‹€λ₯Έ 곳을 ν΄λ¦­ν•˜λ©΄ ν˜„μž¬ 선택이 μ§€μ›Œμ§‘λ‹ˆλ‹€.  '


unselectAuto 속성은 μ‚¬μš©μžκ°€ 일정을 선택(select)ν•œ ν›„, μΊ˜λ¦°λ”μ˜ λ‹€λ₯Έ 뢀뢄을 ν΄λ¦­ν–ˆμ„ λ•Œ μžλ™μœΌλ‘œ 선택을 ν•΄μ œ(unselect)할지 μ—¬λΆ€λ₯Ό μ œμ–΄ν•˜λŠ” μ†μ„±μž…λ‹ˆλ‹€. 기본값은 'true'(μžλ™ ν•΄μ œ)이고 'false'둜 μ„€μ • μ‹œ μˆ˜λ™μœΌλ‘œ ν•΄μ œν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λ•Œ, selectable μ†μ„±μ˜ 값을 'true'둜 ν•¨κ»˜ μ‚¬μš©ν•©λ‹ˆλ‹€.

 

document.addEventListener('DOMContentLoaded', function() {
	var calendarEl = document.getElementById('calendar');
	var calendar = new FullCalendar.Calendar(calendarEl, {
    	selectable: true,
		unselectAuto: true
        	// unselectAuto: false
	});
	calendar.render();
});

 

[μ™Ό] unselectAuto 속성 true / [였] unselectAuto 속성 false

 

unselectAuto 속성을 true둜 μ„€μ •ν•˜κ²Œλ˜λ©΄ ν•΄λ‹Ή 일자λ₯Ό μ„ νƒν•˜κ³  일정 λ°”λ₯Ό ν΄λ¦­ν•˜κ±°λ‚˜ λ°”κΉ₯ 배경을 ν΄λ¦­ν–ˆμ„ λ•Œ μ„ νƒν•œ 일자의 μ˜μ—­μ΄ ν•΄μ œλ˜λŠ”κ±Έ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. false둜 μ„€μ •ν•˜κ²Œλ˜λ©΄ λ‹€λ₯Έ 뢀뢄을 ν΄λ¦­ν•œλ‹€ν•΄λ„ μ˜μ—­μ΄ ν•΄μ œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μˆ˜λ™μœΌλ‘œ μ˜μ—­ ν•΄μ œλ₯Ό μ§„ν–‰ν•΄μ•Όν•©λ‹ˆλ‹€.

 

 

 

 

 

selectConstraint

' 일정 μ„ νƒμ‹œ 선택 κ°€λŠ₯ν•œ λ²”μœ„λ₯Ό μ œν•œ '


selectConstraint 속성은 일정 선택(select)μ‹œ 선택 κ°€λŠ₯ν•œ λ²”μœ„λ₯Ό μ œν•œν•˜λŠ” μ†μ„±μž…λ‹ˆλ‹€. νŠΉμ • μ‹œκ°„λŒ€ λ˜λŠ” 일정과 κ²ΉμΉ˜μ§€ μ•Šλ„λ‘ μ œν•œν•˜κ³  μ˜ˆμ•½ μ‹œμŠ€ν…œ, λ¦¬μ†ŒμŠ€ 관리, 업무 μΊ˜λ¦°λ”μ—μ„œ μœ μš©ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€. ν•΄λ‹Ή 속성은 selectable 속성이 true μΌλ•Œ, ν•¨κ»˜ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

var calendar = new FullCalendar.Calendar(calendarEl, {
  initialView: 'timeGridWeek',
  selectable: true,          // λ‚ μ§œ/μ‹œκ°„ 선택 κ°€λŠ₯
  selectConstraint: {
    startTime: '09:00',          // μ˜€μ „ 9μ‹œλΆ€ν„°
    endTime: '18:00'             // μ˜€ν›„ 6μ‹œκΉŒμ§€λ§Œ 선택 κ°€λŠ₯
  },
  events: [
    { title: '일정1', start: '2025-02-20T10:00:00', end: '2025-02-20T11:00:00' }
  ]
});
calendar.render();

 

 

 

 

 

 

@Junesker


 

λ°˜μ‘ν˜•

λŒ“κΈ€