mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-07-06 00:45:09 +00:00
@@ -51,8 +51,8 @@
|
||||
}
|
||||
angular.module('SOGo.SchedulerUI')
|
||||
.value('CalendarSettings', {
|
||||
EventDragDayLength: 24 * 4,
|
||||
EventDragHorizontalOffset: 3
|
||||
EventDragDayLength: 24 * 4, // hour quarters
|
||||
EventDragHorizontalOffset: 3 // pixels
|
||||
})
|
||||
.factory('Calendar', Calendar.$factory);
|
||||
|
||||
|
||||
@@ -281,7 +281,7 @@
|
||||
* @returns a promise of a collection of objects describing the events blocks
|
||||
*/
|
||||
Component.$eventsBlocks = function(view, startDate, endDate) {
|
||||
var params, futureComponentData, i, j, dates = [],
|
||||
var params, futureComponentData, i, j, dayDates = [], dayNumbers = [],
|
||||
deferred = Component.$q.defer();
|
||||
|
||||
params = { view: view.toLowerCase(), sd: startDate.getDayString(), ed: endDate.getDayString() };
|
||||
@@ -306,7 +306,7 @@
|
||||
|
||||
Component.$views = [];
|
||||
Component.$timeout(function() {
|
||||
_.forEach(views, function(data) {
|
||||
_.forEach(views, function(data, viewIndex) {
|
||||
var components = [], blocks = {}, allDayBlocks = {}, viewData;
|
||||
|
||||
// Change some attributes names
|
||||
@@ -325,24 +325,27 @@
|
||||
_.forEach(_.flatten(data.allDayBlocks), _.bind(associateComponent, components));
|
||||
|
||||
// Build array of dates
|
||||
if (dates.length === 0)
|
||||
for (i = 0; i < data.blocks.length; i++) {
|
||||
dates.push(startDate.getDayString());
|
||||
startDate.addDays(1);
|
||||
}
|
||||
if (dayDates.length === 0) {
|
||||
dayDates = _.flatMap(data.days, 'date');
|
||||
dayNumbers = _.flatMap(data.days, 'number');
|
||||
}
|
||||
|
||||
// Convert array of blocks to object with days as keys
|
||||
// Convert array of blocks to an object literal with date strings as keys
|
||||
for (i = 0; i < data.blocks.length; i++) {
|
||||
for (j = 0; j < data.blocks[i].length; j++)
|
||||
data.blocks[i][j].dayNumber = i;
|
||||
blocks[dates[i]] = data.blocks[i];
|
||||
for (j = 0; j < data.blocks[i].length; j++) {
|
||||
data.blocks[i][j].dayIndex = i + (viewIndex * data.blocks.length);
|
||||
data.blocks[i][j].dayNumber = dayNumbers[i];
|
||||
}
|
||||
blocks[dayDates[i]] = data.blocks[i];
|
||||
}
|
||||
|
||||
// Convert array of all-day blocks to object with days as keys
|
||||
for (i = 0; i < data.allDayBlocks.length; i++) {
|
||||
for (j = 0; j < data.allDayBlocks[i].length; j++)
|
||||
data.allDayBlocks[i][j].dayNumber = i;
|
||||
allDayBlocks[dates[i]] = data.allDayBlocks[i];
|
||||
for (j = 0; j < data.allDayBlocks[i].length; j++) {
|
||||
data.allDayBlocks[i][j].dayIndex = i + (viewIndex * data.allDayBlocks.length);
|
||||
data.allDayBlocks[i][j].dayNumber = dayNumbers[i];
|
||||
}
|
||||
allDayBlocks[dayDates[i]] = data.allDayBlocks[i];
|
||||
}
|
||||
|
||||
// "blocks" is now an object literal with the following structure:
|
||||
@@ -1057,7 +1060,7 @@
|
||||
var _this = this, options, path, component, date, dlp;
|
||||
|
||||
component = this.$omit();
|
||||
dlp = Component.$Preferences.constructor.$mdDateLocaleProvider;
|
||||
dlp = Component.$Preferences.$mdDateLocaleProvider;
|
||||
|
||||
// Format dates and times
|
||||
component.startDate = component.start ? component.start.format(dlp, '%Y-%m-%d') : '';
|
||||
|
||||
@@ -123,6 +123,17 @@
|
||||
url += view[1];
|
||||
else
|
||||
url += 'week';
|
||||
// Append today's date or next enabled weekday
|
||||
var now = new Date();
|
||||
if (Preferences.defaults.SOGoCalendarWeekdays) {
|
||||
var weekDays = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'];
|
||||
var weekDay = weekDays[now.getDay()];
|
||||
while (Preferences.defaults.SOGoCalendarWeekdays.indexOf(weekDay) < 0) {
|
||||
now.addDays(1);
|
||||
weekDay = weekDays[now.getDay()];
|
||||
}
|
||||
}
|
||||
url += '/' + now.getDayString();
|
||||
$location.replace().url(url);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
|
||||
function updateGhost() {
|
||||
// From SOGoEventDragGhostController._updateGhosts
|
||||
var showGhost, isRelative, originalDay, currentDay, wasOtherBlock,
|
||||
var showGhost, isRelative, currentDay, wasOtherBlock,
|
||||
start, duration, durationLeft, maxDuration, enableTransition;
|
||||
|
||||
showGhost = false;
|
||||
@@ -95,7 +95,6 @@
|
||||
// The view of the dragging block is the scrolling view of this ghost block
|
||||
|
||||
isRelative = scrollViewCtrl.type === 'multiday-allday';
|
||||
originalDay = scope.block.pointerHandler.originalEventCoordinates.dayNumber;
|
||||
currentDay = scope.block.pointerHandler.currentEventCoordinates.dayNumber;
|
||||
start = scope.block.pointerHandler.currentEventCoordinates.start;
|
||||
durationLeft = scope.block.pointerHandler.currentEventCoordinates.duration;
|
||||
@@ -103,7 +102,6 @@
|
||||
|
||||
if (angular.isUndefined(durationLeft))
|
||||
return;
|
||||
|
||||
duration = durationLeft;
|
||||
if (duration > maxDuration)
|
||||
duration = maxDuration;
|
||||
@@ -118,7 +116,7 @@
|
||||
)) {
|
||||
// This ghost block (day) is the first of the dragging event
|
||||
showGhost = true;
|
||||
if (!isRelative) {
|
||||
if (!isRelative) {
|
||||
// Show start hour and set the vertical position
|
||||
scope.block.startHour = getStartTime(start);
|
||||
wasOtherBlock = parseInt(iElement.css('top')) === 0;
|
||||
|
||||
@@ -25,11 +25,13 @@
|
||||
},
|
||||
controller: sgCalendarScrollViewController,
|
||||
link: function(scope, element, attrs, controller) {
|
||||
var view, scrollView, type, lastScroll, deregisterDragStart, deregisterDragStop;
|
||||
var view, scrollView, type, lastScroll, days, deregisterDragStart, deregisterDragStop;
|
||||
|
||||
view = null;
|
||||
scrollView = element[0];
|
||||
type = scope.type; // multiday, multiday-allday, monthly, unknown?
|
||||
lastScroll = 0;
|
||||
days = null;
|
||||
|
||||
// Listen to dragstart and dragend events
|
||||
deregisterDragStart = $rootScope.$on('calendar:dragstart', onDragStart);
|
||||
@@ -56,6 +58,7 @@
|
||||
type: type,
|
||||
quarterHeight: quarterHeight,
|
||||
scrollStep: 6 * quarterHeight,
|
||||
dayNumbers: getDayNumbers(),
|
||||
maxX: getMaxColumns(),
|
||||
|
||||
// Expose a reference of the view element
|
||||
@@ -94,7 +97,7 @@
|
||||
var width, height, leftOffset, topOffset, nodes, domRect, tileHeader;
|
||||
|
||||
height = width = leftOffset = topOffset = 0;
|
||||
nodes = scrollView.getElementsByClassName('day0');
|
||||
nodes = scrollView.getElementsByClassName('day');
|
||||
|
||||
if (nodes.length > 0) {
|
||||
domRect = nodes[0].getBoundingClientRect();
|
||||
@@ -109,6 +112,22 @@
|
||||
return { height: height, width: width, offset: { left: leftOffset, top: topOffset } };
|
||||
}
|
||||
|
||||
function getDayNumbers() {
|
||||
var viewType = null, isMultiColumn, days, total, sum;
|
||||
|
||||
if (scrollView.attributes['sg-view'])
|
||||
viewType = scrollView.attributes['sg-view'].value;
|
||||
isMultiColumn = (viewType == 'multicolumndayview');
|
||||
days = scrollView.getElementsByTagName('sg-calendar-day');
|
||||
|
||||
return _.map(days, function(element, index) {
|
||||
if (isMultiColumn)
|
||||
return index;
|
||||
else
|
||||
return parseInt(element.attributes['sg-day-number'].value);
|
||||
});
|
||||
}
|
||||
|
||||
function getMaxColumns() {
|
||||
var max = 0;
|
||||
|
||||
@@ -153,9 +172,9 @@
|
||||
function updateFromPointerHandler() {
|
||||
var scrollStep, pointerHandler, pointerCoordinates, now, scrollY, minY, delta;
|
||||
|
||||
scrollStep = view.scrollStep;
|
||||
pointerHandler = Component.$ghost.pointerHandler;
|
||||
if (pointerHandler) {
|
||||
if (view && pointerHandler) {
|
||||
scrollStep = view.scrollStep;
|
||||
pointerCoordinates = pointerHandler.getContainerBasedCoordinates(view);
|
||||
|
||||
if (pointerCoordinates) {
|
||||
|
||||
@@ -42,12 +42,12 @@
|
||||
});
|
||||
|
||||
function initGrips() {
|
||||
var component, dayNumber, blockIndex, isFirstBlock, isLastBlock,
|
||||
var component, dayIndex, blockIndex, isFirstBlock, isLastBlock,
|
||||
dragGrip, leftGrip, rightGrip, topGrip, bottomGrip;
|
||||
|
||||
component = scope.block.component;
|
||||
dayNumber = scope.block.dayNumber;
|
||||
blockIndex = _.findIndex(component.blocks, ['dayNumber', dayNumber]);
|
||||
dayIndex = scope.block.dayIndex;
|
||||
blockIndex = _.findIndex(component.blocks, ['dayIndex', dayIndex]);
|
||||
isFirstBlock = (blockIndex === 0);
|
||||
isLastBlock = (blockIndex === component.blocks.length - 1);
|
||||
|
||||
@@ -78,12 +78,12 @@
|
||||
}
|
||||
|
||||
function onDragDetect(ev) {
|
||||
var block, dragMode, eventType, startDate, newData, newComponent, pointerHandler;
|
||||
var dragMode, pointerHandler;
|
||||
|
||||
ev.stopPropagation();
|
||||
|
||||
dragMode = 'move-event';
|
||||
|
||||
|
||||
if (scope.block && scope.block.component) {
|
||||
// Move or resize existing component
|
||||
if (ev.target.className == 'dragGrip-top' ||
|
||||
@@ -220,6 +220,10 @@
|
||||
delta.x = this.x - otherCoordinates.x;
|
||||
delta.y = this.y - otherCoordinates.y;
|
||||
|
||||
if (Calendar.$view) {
|
||||
delta.days = Calendar.$view.dayNumbers[this.x] - Calendar.$view.dayNumbers[otherCoordinates.x];
|
||||
}
|
||||
|
||||
return delta;
|
||||
},
|
||||
|
||||
@@ -247,6 +251,7 @@
|
||||
|
||||
SOGoEventDragEventCoordinates.prototype = {
|
||||
dayNumber: -1,
|
||||
weekDay: -1,
|
||||
start: -1,
|
||||
duration: -1,
|
||||
|
||||
@@ -257,21 +262,29 @@
|
||||
},
|
||||
|
||||
initFromBlock: function(block) {
|
||||
var prevDayNumber = -1;
|
||||
|
||||
if (this.eventType === 'monthly') {
|
||||
this.start = 0;
|
||||
this.duration = block.component.blocks.length * 96;
|
||||
this.duration = block.component.blocks.length * CalendarSettings.EventDragDayLength;
|
||||
}
|
||||
else {
|
||||
// Get the start (first quarter) from the event's first block
|
||||
// Compute overall length
|
||||
this.start = block.component.blocks[0].start;
|
||||
this.duration = _.sumBy(block.component.blocks, function(b) {
|
||||
return b.length;
|
||||
var delta, currentDayNumber;
|
||||
|
||||
currentDayNumber = b.dayNumber;
|
||||
if (prevDayNumber < 0)
|
||||
delta = 0;
|
||||
else
|
||||
delta = currentDayNumber - prevDayNumber - 1;
|
||||
prevDayNumber = currentDayNumber;
|
||||
|
||||
return b.length + delta * CalendarSettings.EventDragDayLength;
|
||||
});
|
||||
}
|
||||
|
||||
// Get the dayNumber from the event's first block
|
||||
this.dayNumber = block.component.blocks[0].dayNumber;
|
||||
},
|
||||
|
||||
initFromCalendar: function(calendarNumber) {
|
||||
@@ -411,13 +424,17 @@
|
||||
|
||||
// Compute delta wrt to position of mouse at dragstart on the day/quarter grid
|
||||
var delta = this.currentViewCoordinates.getDelta(this.originalViewCoordinates);
|
||||
var deltaQuarters = delta.x * CalendarSettings.EventDragDayLength + delta.y;
|
||||
var deltaQuarters = delta.days * CalendarSettings.EventDragDayLength + delta.y;
|
||||
$log.debug('quarters delta ' + deltaQuarters);
|
||||
|
||||
if (angular.isUndefined(this.originalEventCoordinates.start)) {
|
||||
this.originalEventCoordinates.dayNumber = this.originalViewCoordinates.x;
|
||||
// Creating new appointment from DnD
|
||||
this.originalEventCoordinates.dayNumber = Calendar.$view.dayNumbers[this.originalViewCoordinates.x];
|
||||
this.originalEventCoordinates.start = this.originalViewCoordinates.y;
|
||||
}
|
||||
else if (this.originalEventCoordinates.dayNumber < 0) {
|
||||
this.originalEventCoordinates.dayNumber = Calendar.$view.dayNumbers[scope.block.component.blocks[0].dayIndex];
|
||||
}
|
||||
// if (currentView == "multicolumndayview")
|
||||
// this._updateMulticolumnViewDayNumber_SEDGC();
|
||||
// else
|
||||
@@ -461,12 +478,9 @@
|
||||
else if (this.currentEventCoordinates.start >= CalendarSettings.EventDragDayLength) {
|
||||
deltaDays = Math.floor(this.currentEventCoordinates.start / CalendarSettings.EventDragDayLength);
|
||||
this.currentEventCoordinates.start -= deltaDays * CalendarSettings.EventDragDayLength;
|
||||
|
||||
// This dayNumber needs to be updated with the calendar number.
|
||||
// if (currentView == "multicolumndayview")
|
||||
// this._updateMulticolumnViewDayNumber_SEDGC();
|
||||
this.currentEventCoordinates.dayNumber += deltaDays;
|
||||
}
|
||||
|
||||
$log.debug('event coordinates ' + JSON.stringify(this.currentEventCoordinates));
|
||||
$rootScope.$emit('calendar:drag');
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user