فهرست منبع

eventOrder can take precedence over start/duration

Adam Shaw 7 سال پیش
والد
کامیت
89f2a2cf86
6فایلهای تغییر یافته به همراه81 افزوده شده و 32 حذف شده
  1. 1 8
      src/View.ts
  2. 0 4
      src/basic/DayGrid.ts
  3. 1 2
      src/component/renderers/EventRenderer.ts
  4. 6 1
      src/list/ListView.ts
  5. 3 1
      src/options.ts
  6. 70 16
      tests/automated/event-render/eventOrder.js

+ 1 - 8
src/View.ts

@@ -67,14 +67,7 @@ export default abstract class View extends DateComponent {
     this.initHiddenDays()
     this.dateProfileGenerator = new this.dateProfileGeneratorClass(this)
 
-    this.eventOrderSpecs = [
-      // TODO: make these parts of the eventOrder default
-      { field: 'start', order: 1 }, // earlier goes first
-      { field: 'duration', order: -1 }, // longer events go first
-      { field: 'isAllDay', order: 1 }, // put all-day events first
-    ].concat(
-      parseFieldSpecs(this.opt('eventOrder'))
-    )
+    this.eventOrderSpecs = parseFieldSpecs(this.opt('eventOrder'))
 
     this.initialize()
   }

+ 0 - 4
src/basic/DayGrid.ts

@@ -711,10 +711,6 @@ export default class DayGrid extends DateComponent {
       }
     }
 
-    // force an order because eventsToSegs doesn't guarantee one
-    // TODO: research if still needed
-    newSegs = this.eventRenderer.sortEventSegs(newSegs)
-
     return newSegs
   }
 

+ 1 - 2
src/component/renderers/EventRenderer.ts

@@ -323,9 +323,8 @@ export default class EventRenderer {
   }
 
 
-  sortEventSegs(segs): Seg[] {
+  sortEventSegs(segs, specs = this.view.eventOrderSpecs): Seg[] {
     let objs = segs.map(buildSegCompareObj)
-    let specs = this.view.eventOrderSpecs
 
     objs.sort(function(obj0, obj1) {
       return compareByFieldSpecs(obj0, obj1, specs)

+ 6 - 1
src/list/ListView.ts

@@ -175,7 +175,12 @@ export default class ListView extends View {
         // append a day header
         tbodyEl.appendChild(this.buildDayHeaderRow(this.dayDates[dayIndex]))
 
-        daySegs = this.eventRenderer.sortEventSegs(daySegs)
+        daySegs = this.eventRenderer.sortEventSegs(
+          daySegs,
+          [
+            { field: 'start', order: 1 } // always put earlier events first, regardless of eventOrder
+          ].concat(this.view.eventOrderSpecs)
+        )
 
         for (i = 0; i < daySegs.length; i++) {
           tbodyEl.appendChild(daySegs[i].el) // append event row

+ 3 - 1
src/options.ts

@@ -65,7 +65,9 @@ export const globalDefaults = {
 
   dropAccept: '*',
 
-  eventOrder: 'title',
+  eventOrder: 'start,-duration,isAllDay,title',
+  // ^ if start tie, longer events go before shorter. final tie-breaker is title text
+
   // rerenderDelay: null,
 
   eventLimit: false,

+ 70 - 16
tests/automated/event-render/eventOrder.js

@@ -3,33 +3,87 @@ describe('eventOrder', function() {
   pushOptions({
     defaultDate: '2018-01-01',
     defaultView: 'month',
-    events: [ // all the same datetime!
-      { id: 'z', title: 'a', start: '2018-01-01T09:00:00', myOrder: 3 },
-      { id: 'y', title: 'b', start: '2018-01-01T09:00:00', myOrder: 1 },
-      { id: 'x', title: 'c', start: '2018-01-01T09:00:00', myOrder: 2 }
-    ],
     eventRender: function(arg) {
       arg.el.setAttribute('data-event-id', arg.event.id)
     }
   })
 
-  it('sorts by title by default', function() {
-    initCalendar()
-    expect(getEventOrder()).toEqual([ 'z', 'y', 'x' ])
+  describe('when all different start times', function() {
+    pushOptions({
+      events: [
+        { id: 'z', title: 'a', start: '2018-01-01T10:00:00' },
+        { id: 'y', title: 'b', start: '2018-01-01T09:00:00' },
+        { id: 'x', title: 'c', start: '2018-01-01T08:00:00' }
+      ]
+    })
+
+    it('will sort by start time by default', function() {
+      initCalendar()
+      expect(getEventOrder()).toEqual([ 'x', 'y', 'z' ])
+    })
+  })
+
+  describe('when all the same date', function() {
+    pushOptions({
+      events: [
+        { id: 'z', title: 'a', start: '2018-01-01T09:00:00', myOrder: 3 },
+        { id: 'y', title: 'b', start: '2018-01-01T09:00:00', myOrder: 1 },
+        { id: 'x', title: 'c', start: '2018-01-01T09:00:00', myOrder: 2 }
+      ]
+    })
+
+    it('sorts by title by default', function() {
+      initCalendar()
+      expect(getEventOrder()).toEqual([ 'z', 'y', 'x' ])
+    })
+
+    it('can sort by a standard prop', function() {
+      initCalendar({
+        eventOrder: 'id'
+      })
+      expect(getEventOrder()).toEqual([ 'x', 'y', 'z' ])
+    })
+
+    it('can sort by a non-standard prop', function() {
+      initCalendar({
+        eventOrder: 'myOrder'
+      })
+      expect(getEventOrder()).toEqual([ 'y', 'x', 'z' ])
+    })
   })
 
-  it('can sort by a standard prop', function() {
-    initCalendar({
-      eventOrder: 'id'
+  describe('when different dates', function() {
+    pushOptions({
+      events: [
+        { id: 'z', title: 'a', start: '2018-01-03T09:00:00', end: '2018-01-06T09:00:00', myOrder: 3 },
+        { id: 'y', title: 'b', start: '2018-01-02T09:00:00', end: '2018-01-06T09:00:00', myOrder: 1 },
+        { id: 'x', title: 'c', start: '2018-01-01T09:00:00', end: '2018-01-06T09:00:00', myOrder: 2 }
+      ]
+    })
+
+    it('sorting by a prop will override date-determined order', function() {
+      initCalendar({
+        eventOrder: 'myOrder'
+      })
+      expect(getEventOrder()).toEqual([ 'y', 'x', 'z' ])
     })
-    expect(getEventOrder()).toEqual([ 'x', 'y', 'z' ])
   })
 
-  it('can sort by a non-standard prop', function() {
-    initCalendar({
-      eventOrder: 'myOrder'
+  describe('when different durations', function() {
+    pushOptions({
+      events: [
+        { id: 'z', title: 'a', start: '2018-01-01T09:00:00', end: '2018-01-04T09:00:00', myOrder: 3 }, // 3 day
+        { id: 'y', title: 'b', start: '2018-01-01T09:00:00', end: '2018-01-02T09:00:00', myOrder: 1 }, // 1 day
+        { id: 'x', title: 'c', start: '2018-01-01T09:00:00', end: '2018-01-03T09:00:00', myOrder: 2 } // 2 day
+      ]
+    })
+
+    it('sorting by a prop will override duration-determined order', function() {
+      initCalendar({
+        eventOrder: 'myOrder'
+      })
+      expect(getEventOrder()).toEqual([ 'y', 'x', 'z' ])
     })
-    expect(getEventOrder()).toEqual([ 'y', 'x', 'z' ])
   })
 
   function getEventOrder() {