SimpleDayGridEventRenderer.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { htmlEscape, cssToStr } from '../util/html'
  2. import FgEventRenderer from '../component/renderers/FgEventRenderer'
  3. import { Seg } from '../component/DateComponent'
  4. /* Event-rendering methods for the DayGrid class
  5. ----------------------------------------------------------------------------------------------------------------------*/
  6. // "Simple" is bad a name. has nothing to do with SimpleDayGrid
  7. export default abstract class SimpleDayGridEventRenderer extends FgEventRenderer {
  8. // Builds the HTML to be used for the default element for an individual segment
  9. renderSegHtml(seg: Seg, mirrorInfo) {
  10. let { options } = this.context
  11. let eventRange = seg.eventRange
  12. let eventDef = eventRange.def
  13. let eventUi = eventRange.ui
  14. let allDay = eventDef.allDay
  15. let isDraggable = eventUi.startEditable
  16. let isResizableFromStart = allDay && seg.isStart && eventUi.durationEditable && options.eventResizableFromStart
  17. let isResizableFromEnd = allDay && seg.isEnd && eventUi.durationEditable
  18. let classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo)
  19. let skinCss = cssToStr(this.getSkinCss(eventUi))
  20. let timeHtml = ''
  21. let timeText
  22. let titleHtml
  23. classes.unshift('fc-day-grid-event', 'fc-h-event')
  24. // Only display a timed events time if it is the starting segment
  25. if (seg.isStart) {
  26. timeText = this.getTimeText(eventRange)
  27. if (timeText) {
  28. timeHtml = '<span class="fc-time">' + htmlEscape(timeText) + '</span>'
  29. }
  30. }
  31. titleHtml =
  32. '<span class="fc-title">' +
  33. (htmlEscape(eventDef.title || '') || '&nbsp;') + // we always want one line of height
  34. '</span>'
  35. return '<a class="' + classes.join(' ') + '"' +
  36. (eventDef.url ?
  37. ' href="' + htmlEscape(eventDef.url) + '"' :
  38. ''
  39. ) +
  40. (skinCss ?
  41. ' style="' + skinCss + '"' :
  42. ''
  43. ) +
  44. '>' +
  45. '<div class="fc-content">' +
  46. (options.dir === 'rtl' ?
  47. titleHtml + ' ' + timeHtml : // put a natural space in between
  48. timeHtml + ' ' + titleHtml //
  49. ) +
  50. '</div>' +
  51. (isResizableFromStart ?
  52. '<div class="fc-resizer fc-start-resizer"></div>' :
  53. ''
  54. ) +
  55. (isResizableFromEnd ?
  56. '<div class="fc-resizer fc-end-resizer"></div>' :
  57. ''
  58. ) +
  59. '</a>'
  60. }
  61. // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined
  62. computeEventTimeFormat() {
  63. return {
  64. hour: 'numeric',
  65. minute: '2-digit',
  66. omitZeroMinute: true,
  67. meridiem: 'narrow'
  68. }
  69. }
  70. computeDisplayEventEnd() {
  71. return false // TODO: somehow consider the originating DayGrid's column count
  72. }
  73. }