some work on ListCalendar

This commit is contained in:
rlx 2011-10-09 21:13:16 +00:00
commit efca832c76
10 changed files with 532 additions and 192 deletions

View file

@ -85,18 +85,7 @@ Ox.Calendar = function(options, self) {
});
self.options.events.forEach(function(event) {
if (!event.end) {
event.end = Ox.formatDate(new Date(), '%Y-%m-%d');
event.current = true;
}
event.id = Ox.isUndefined(event.id) ? Ox.uid() : event.id;
event.startTime = Ox.parseDate(event.start, true);
event.endTime = Ox.parseDate(event.end, true);
event.rangeText = Ox.formatDateRange(event.start, event.end, true);
event.durationText = Ox.formatDateRangeDuration(event.start, event.end, true);
if (event.current) {
event.rangeText = event.rangeText.split(' - ').shift() + ' - ...';
}
event = getEventData(event);
});
self.maxZoom = 32;
@ -586,6 +575,22 @@ Ox.Calendar = function(options, self) {
return new Date(+event.startTime + getEventDuration(event) / 2);
}
function getEventData(event) {
if (!event.end) {
event.end = Ox.formatDate(new Date(), '%Y-%m-%d');
event.current = true;
}
event.id = Ox.isUndefined(event.id) ? Ox.uid() : event.id;
event.startTime = Ox.parseDate(event.start, true);
event.endTime = Ox.parseDate(event.end, true);
event.rangeText = Ox.formatDateRange(event.start, event.end, true);
event.durationText = Ox.formatDateRangeDuration(event.start, event.end, true);
if (event.current) {
event.rangeText = event.rangeText.split(' - ').shift() + ' - ...';
}
return event;
}
function getEventDuration(event) {
return event.endTime - event.startTime;
}
@ -626,7 +631,66 @@ Ox.Calendar = function(options, self) {
}
});
return $element;
};
}
function getLines() {
self.lineEvents = [];
self.$content.find('.OxLine').remove();
self.options.events.filter(function(event) {
// filter out events with types not shown
// and events outside the visible area <-- commented out to keep layout from changing
return self.options.showTypes.indexOf(event.type) > -1
/*&& overlaps(event, calendarEvent)*/;
}).sort(function(a, b) {
// sort events (dates first, people last, longer before shorter)
if (a.type == 'date' && b.type != 'date') {
return -1;
} else if (a.type != 'date' && b.type == 'date') {
return 1;
} else if (a.type == 'person' && b.type != 'person') {
return 1;
} else if (a.type != 'person' && b.type == 'person') {
return -1;
} else if ((b.endTime - b.startTime) != (a.endTime - a.startTime)) {
return (b.endTime - b.startTime) - (a.endTime - a.startTime);
} else /*if (a.startTime < b.startTime || a.startTime > b.startTime)*/ {
return a.startTime - b.startTime;
}
}).forEach(function(event, i) {
var line = self.lineEvents.length;
// traverse lines
Ox.forEach(self.lineEvents, function(events, line_) {
var fits = true;
// traverse events in line
Ox.forEach(events, function(event_) {
// if overlaps, check next line
if (overlaps(event, event_)) {
fits = false;
return false;
}
});
if (fits) {
line = line_;
return false;
}
});
if (line == self.lineEvents.length) {
self.lineEvents[line] = [];
self.$lines[line] = Ox.Element()
.addClass('OxLine')
.css({
top: (line * 16) + 'px'
})
.appendTo(self.$content);
}
self.lineEvents[line].push(event);
});
self.contentHeight = Math.max(
self.lineEvents.length * 16,
self.options.height - 72 // 24 + 16 + 16 + 16
);
self.$content.css({height: self.contentHeight + 'px'});
}
function getMouseDate(e) {
return new Date(+self.options.date + (
@ -825,65 +889,6 @@ Ox.Calendar = function(options, self) {
});
}
function getLines() {
self.lineEvents = [];
self.$content.find('.OxLine').remove();
self.options.events.filter(function(event) {
// filter out events with types not shown
// and events outside the visible area <-- commented out to keep layout from changing
return self.options.showTypes.indexOf(event.type) > -1
/*&& overlaps(event, calendarEvent)*/;
}).sort(function(a, b) {
// sort events (dates first, people last, longer before shorter)
if (a.type == 'date' && b.type != 'date') {
return -1;
} else if (a.type != 'date' && b.type == 'date') {
return 1;
} else if (a.type == 'person' && b.type != 'person') {
return 1;
} else if (a.type != 'person' && b.type == 'person') {
return -1;
} else if ((b.endTime - b.startTime) != (a.endTime - a.startTime)) {
return (b.endTime - b.startTime) - (a.endTime - a.startTime);
} else /*if (a.startTime < b.startTime || a.startTime > b.startTime)*/ {
return a.startTime - b.startTime;
}
}).forEach(function(event, i) {
var line = self.lineEvents.length;
// traverse lines
Ox.forEach(self.lineEvents, function(events, line_) {
var fits = true;
// traverse events in line
Ox.forEach(events, function(event_) {
// if overlaps, check next line
if (overlaps(event, event_)) {
fits = false;
return false;
}
});
if (fits) {
line = line_;
return false;
}
});
if (line == self.lineEvents.length) {
self.lineEvents[line] = [];
self.$lines[line] = Ox.Element()
.addClass('OxLine')
.css({
top: (line * 16) + 'px'
})
.appendTo(self.$content);
}
self.lineEvents[line].push(event);
});
self.contentHeight = Math.max(
self.lineEvents.length * 16,
self.options.height - 72 // 24 + 16 + 16 + 16
);
self.$content.css({height: self.contentHeight + 'px'});
}
function renderEvents() {
var calendarEvent = getCalendarEvent(),
height;
@ -1030,11 +1035,13 @@ Ox.Calendar = function(options, self) {
}
}
self.setOption = function(key, val) {
self.setOption = function(key, value) {
if (key == 'date') {
} else if (key == 'height') {
//that.css({height: self.options.height + 'px'});
} else if (key == 'selected') {
selectEvent(value);
} else if (key == 'width') {
//that.css({width: self.options.width + 'px'});
//self.$zoomInput.options({size: self.options.width});
@ -1044,8 +1051,67 @@ Ox.Calendar = function(options, self) {
}
};
that.addEvent = function(event) {
Ox.print('CALENDAR ADD EVENT', event)
self.options.events.push(event);
getLines();
renderCalendar();
selectEvent(event.id);
return that;
};
/*@
that.editEvent <f> Edit event data
(id, key, value) -> <o> Calendar object
{id, {key: value, ...}} -> <o> Calendar object
@*/
that.editEvent = function() {
var args = Ox.makeArray(arguments),
id = args.shift(),
data = Ox.makeObject(args),
event = Ox.getObjectById(self.options.events, id),
$element = getEventElementById(id);
Ox.forEach(data, function(value, key) {
if ($element) {
Ox.print('ELEMENT', $element, id)
if (key == 'name') {
$element && $element.html('&nbsp;' + value + '&nbsp;');
} else if (key == 'type') {
$element.removeClass('Ox' + Ox.toTitleCase(event[key]))
.addClass('Ox' + Ox.toTitleCase(value))
} else if (key == 'end') {
$element[
value === '' ? 'addClass' : 'removeClass'
]('OxCurrent');
}
}
event[key] = value;
event = getEventData(event);
Ox.print(key, value, 'EVENT:', event)
if ($element) {
getLines();
renderCalendar();
}
});
return that;
};
that.getBounds = function() {
return getCalendarEvent();
};
that.panToEvent = function() {
panToSelected();
return that;
};
that.removeEvent = function() {
Ox.print('REMOVE ... SELF.OPTIONS', self.options)
var index = Ox.getPositionById(self.options.events, self.selected);
self.options.events.splice(index, 1);
getLines();
renderCalendar();
return that;
};
that.resizeCalendar = function() {
@ -1054,10 +1120,12 @@ Ox.Calendar = function(options, self) {
self.$zoomInput.options({size: self.options.width});
getLines();
renderCalendar();
return that;
};
that.zoomToEvent = function() {
zoomToSelected();
return that;
};
return that;