See ChangeLog

Monotone-Parent: eb22f4d3b368a79ce56bcad18f9f176fff0cb73c
Monotone-Revision: 157670819f732591d0987b295faeb89c843803db

Monotone-Author: flachapelle@inverse.ca
Monotone-Date: 2012-09-07T19:46:49
Monotone-Branch: ca.inverse.sogo
maint-2.0.2
Francis Lachapelle 2012-09-07 19:46:49 +00:00
parent 613499c63a
commit e7f0c9c03f
38 changed files with 389 additions and 259 deletions

View File

@ -1,3 +1,26 @@
2012-09-07 Francis Lachapelle <flachapelle@inverse.ca>
* UI/WebServerResources/SchedulerUI.js (tasksListCallback): list
the tasks in a table, along the events table.
(saveTabState): save which of the events or the tasks tab is
selected.
* UI/WebServerResources/SOGoTabsController.js
(attachToTabsContainer): select and show the active tab if it's
defined.
* UI/WebServerResources/HTMLTableElement.js (getSelectedRows):
accept calling this method from a "tbody".
* UI/Scheduler/UIxCalMainView.m (-saveSelectedListAction): new
method to save the name of the selected tab (events or tasks).
(-eventsTabClass): return "active" if the selected tab was "events".
(-tasksTabClass): idem for "tasks".
* UI/Scheduler/UIxCalListingActions.m (-tasksListAction): added
more quick fields, including the calendar name, location, category
and a formatted version of the due date.
2012-09-07 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* OpenChange/MAPIStoreContext.m (CompleteURLFromMapistoreURI):

12
NEWS
View File

@ -1,9 +1,19 @@
2.0.0 (2012-09-DD)
-------------------
New Features
Enhancements
- calendars list and mini-calendar are now always visible
- tasks list has moved to a table in a tabs view along the events list
Bug Fixes
1.3.18a (2012-09-04)
-------------------
Bug Fixes
- fixed display of weekly events with no day mask
- fixed parsing of mail headers
- fixed support for OS X 10.8 (Mounting Lion)
- fixed support for OS X 10.8 (Mountain Lion)
1.3.18 (2012-08-28)
-------------------

View File

@ -502,6 +502,7 @@ validate_endbeforestart = "A data que você informou ocorre antes da data ini
"Title" = "Título";
"Start" = "Início";
"End" = "Fim";
"Due Date" = "Data";
"Location" = "Localização";
"(Private Event)" = "(Evento Privado)";

View File

@ -503,6 +503,7 @@ validate_endbeforestart = "La data/hora de començament és posterior a la d'
"Title" = "Títol";
"Start" = "Inici";
"End" = "Final";
"Due Date" = "Data límit";
"Location" = "Lloc";
"(Private Event)" = "(Esdeveniment privat)";

View File

@ -503,6 +503,7 @@ validate_endbeforestart = "Zadané datum konce je před začátkem události.
"Title" = "Název";
"Start" = "Začátek";
"End" = "Konec";
"Due Date" = "Datum splnění";
"Location" = "Místo";
"(Private Event)" = "(Soukromá událost)";

View File

@ -507,6 +507,7 @@ Behold de aktuelle indstillinger alligevel?";
"Title" = "Titel";
"Start" = "Start";
"End" = "Slut";
"Due Date" = "Forfaldsdato";
"Location" = "Sted";
"(Private Event)" = "(Privat begivenhed)";

View File

@ -1,4 +1,3 @@
/* this file is in UTF-8 format! */
/* Tooltips */
@ -503,6 +502,7 @@ validate_endbeforestart = "Het einde is voor de begindatum.";
"Title" = "Titel";
"Start" = "Begin";
"End" = "Eind";
"Due Date" = "Verloopdatum";
"Location" = "Plaats";
"(Private Event)" = "(Privé-afspraak)";

View File

@ -503,6 +503,7 @@ validate_endbeforestart = "The end date that you entered occurs before the st
"Title" = "Title";
"Start" = "Start";
"End" = "End";
"Due Date" = "Due Date";
"Location" = "Location";
"(Private Event)" = "(Private Event)";

View File

@ -503,6 +503,7 @@ validate_endbeforestart = "La date de fin est avant la date de début.";
"Title" = "Titre";
"Start" = "Début";
"End" = "Fin";
"Due Date" = "Fin prévue";
"Location" = "Lieu";
"(Private Event)" = "(Événement privé)";

View File

@ -503,6 +503,7 @@ validate_endbeforestart = "Ihr Ende ist vor dem Beginndatum.";
"Title" = "Titel";
"Start" = "Beginn";
"End" = "Ende";
"Due Date" = "Fällig";
"Location" = "Ort";
"(Private Event)" = "(Privater Termin)";

View File

@ -503,6 +503,7 @@ validate_endbeforestart = "A megadott befejező dátum korábbi, mint a kezd
"Title" = "Cím";
"Start" = "Kezdés";
"End" = "Befejezés";
"Due Date" = "Lejárat";
"Location" = "Hely";
"(Private Event)" = "(Magán esemény)";

View File

@ -502,6 +502,7 @@ validate_endbeforestart = "Lokadagurinn sem er tilgreindur, er fyrr en byrjun
"Title" = "Titill";
"Start" = "Byrjun";
"End" = "Endir";
"Due Date" = "Lokadagur";
"Location" = "Staðsetning";
"(Private Event)" = "(Einkaviðburður)";

View File

@ -503,6 +503,7 @@ validate_endbeforestart = "La data finale specificata è precedente alla data
"Title" = "Titolo";
"Start" = "Inizio";
"End" = "Fine";
"Due Date" = "Scadenza";
"Location" = "Luogo";
"(Private Event)" = "(Evento privato)";

View File

@ -124,8 +124,8 @@
if (result == NSOrderedSame)
{
// End date
selfTime = [[self objectAtIndex: 4] intValue];
otherTime = [[otherTask objectAtIndex: 4] intValue];
selfTime = [[self objectAtIndex: 5] intValue];
otherTime = [[otherTask objectAtIndex: 5] intValue];
if (selfTime && !otherTime)
result = NSOrderedAscending;
else if (!selfTime && otherTime)
@ -143,8 +143,8 @@
compare: [otherTask objectAtIndex: 1]];
if (result == NSOrderedSame)
// Task name
result = [[self objectAtIndex: 3]
compare: [otherTask objectAtIndex: 3]
result = [[self objectAtIndex: 4]
compare: [otherTask objectAtIndex: 4]
options: NSCaseInsensitiveSearch];
}
}

View File

@ -1,4 +1,3 @@
/* this file is in UTF-8 format! */
/* Tooltips */
@ -502,6 +501,7 @@ validate_endbeforestart = "Angitt sluttdato inntreffer før angitt startdato.
"Title" = "Tittel";
"Start" = "Start";
"End" = "Slutt";
"Due Date" = "Dato";
"Location" = "Plass";
"(Private Event)" = "(Privat hendelse)";

View File

@ -502,6 +502,7 @@ validate_endbeforestart = "Angitt sluttdato inntreffer før angitt startdato.
"Title" = "Tittel";
"Start" = "Start";
"End" = "Slutt";
"Due Date" = "Dato";
"Location" = "Plass";
"(Private Event)" = "(Privat hendelse)";

View File

@ -502,6 +502,7 @@ validate_endbeforestart = "Podana data końca jest wcześniejsza niż data po
"Title" = "Tytuł";
"Start" = "Początek";
"End" = "Koniec";
"Due Date" = "Termin";
"Location" = "Miejsce";
"(Private Event)" = "(Wydarzenie prywatne)";

View File

@ -503,6 +503,7 @@ validate_endbeforestart = "Дата начала позже даты конц
"Title" = "Название";
"Start" = "Начало";
"End" = "Конец";
"Due Date" = "К дате";
"Location" = "Место";
"(Private Event)" = "(Приватное событие)";

View File

@ -503,6 +503,7 @@ validate_endbeforestart = "La fecha/hora de inicio es posterior a la de fin."
"Title" = "Título";
"Start" = "Inicio";
"End" = "Fin";
"Due Date" = "Vencimiento";
"Location" = "Lugar";
"(Private Event)" = "(Evento privado)";

View File

@ -503,6 +503,7 @@ validate_endbeforestart = "La fecha/hora de inicio es posterior a la de fin."
"Title" = "Título";
"Start" = "Inicio";
"End" = "Fin";
"Due Date" = "Vencimiento";
"Location" = "Lugar";
"(Private Event)" = "(Evento privado)";

View File

@ -502,6 +502,7 @@ validate_endbeforestart = "Angivet slutdatumet inträffar före angivet start
"Title" = "Titel";
"Start" = "Start";
"End" = "Slut";
"Due Date" = "Datum";
"Location" = "Plats";
"(Private Event)" = "(Privat händelse)";

View File

@ -96,8 +96,10 @@ static NSArray *tasksFields = nil;
if (!tasksFields)
{
tasksFields = [NSArray arrayWithObjects: @"c_name", @"c_folder",
@"calendarName",
@"c_status", @"c_title", @"c_enddate",
@"c_classification", @"editable", @"erasable",
@"c_classification", @"c_location", @"c_category",
@"editable", @"erasable",
@"c_priority", nil];
[tasksFields retain];
}
@ -1069,14 +1071,17 @@ _computeBlocksPosition (NSArray *blocks)
forComponentOfType: @"vtodo"] objectEnumerator];
while ((task = [tasks nextObject]))
{
statusCode = [[task objectAtIndex: 2] intValue];
statusCode = [[task objectAtIndex: 3] intValue];
if (statusCode != 1 || showCompleted)
{
filteredTask = [NSMutableArray arrayWithArray: task];
endDateStamp = [[task objectAtIndex: 4] intValue];
endDateStamp = [[task objectAtIndex: 5] intValue];
statusFlag = [self _getStatusClassForStatusCode: statusCode
andEndDateStamp: endDateStamp];
[filteredTask addObject: statusFlag];
if (endDateStamp > 0)
[filteredTask addObject: [self _formattedDateForSeconds: endDateStamp
forAllDay: NO]];
[filteredTasks addObject: filteredTask];
}
}

View File

@ -166,7 +166,7 @@
[self _setupContext];
height = [moduleSettings objectForKey: @"DragHandleVertical"];
return ((height && [height intValue] > 0) ? [NSString stringWithFormat: @"%ipx", ([height intValue] - 27)] : nil);
return ((height && [height intValue] > 0) ? [NSString stringWithFormat: @"%ipx", [height intValue]] : nil);
}
- (WOResponse *) saveDragHandleStateAction
@ -192,6 +192,42 @@
return [self responseWithStatus: 204];
}
- (NSString *) eventsTabClass
{
NSString *list;
[self _setupContext];
list = [moduleSettings objectForKey: @"SelectedList"];
return (list && [list compare: @"eventsListView"] == NSOrderedSame)? @"active" : @"";
}
- (NSString *) tasksTabClass
{
NSString *list;
[self _setupContext];
list = [moduleSettings objectForKey: @"SelectedList"];
return (list && [list compare: @"tasksListView"] == NSOrderedSame)? @"active" : @"";
}
- (WOResponse *) saveSelectedListAction
{
WORequest *request;
NSString *selectedList;
[self _setupContext];
request = [context request];
selectedList = [request formValueForKey: @"list"];
[moduleSettings setObject: selectedList
forKey: @"SelectedList"];
[us synchronize];
return [self responseWithStatus: 204];
}
- (unsigned int) firstDayOfWeek
{
SOGoUserDefaults *ud;

View File

@ -502,6 +502,7 @@ validate_endbeforestart = "Дата закінчення передує да
"Title" = "Назва";
"Start" = "Початок";
"End" = "Кінець";
"Due Date" = "Дійсно до";
"Location" = "Місце";
"(Private Event)" = "(Особиста подія)";

View File

@ -502,6 +502,7 @@ validate_endbeforestart = "Mae'r dyddiad gorffen sydd wedi'i roi yn digwydd c
"Title" = "Teitl";
"Start" = "Dechrau";
"End" = "Diwedd";
"Due Date" = "Dyddiad dyledus";
"Location" = "Lleoliad";
"(Private Event)" = "(Digwyddiad preifat)";

View File

@ -50,6 +50,11 @@
pageName = "UIxCalMainView";
actionName = "saveDragHandleState";
};
saveSelectedList = {
protectedBy = "View";
pageName = "UIxCalMainView";
actionName = "saveSelectedList";
};
dateselector = {
protectedBy = "View";
pageName = "UIxCalDateSelector";

View File

@ -88,36 +88,19 @@
</ul>
</div>
<div class="contactFoldersList" id="contactFoldersList">
<div class="tabsContainer" id="smallToolbarContainer">
<ul>
<li target="abToolbar">
<span><var:string label:value="Address Books" /></span>
</li>
</ul>
<div class="tabs">
<div id="abToolbar" class="tab">
<a href="#" class="smallToolbarButton">
<span><img rsrc:src="add-addressbook.png"
label:title="New Addressbook..."/>
</span>
</a>
<a href="#" class="smallToolbarButton">
<span>
<img rsrc:src="add-user-addressbook.png"
label:title="Subscribe to an Addressbook..." />
</span>
</a>
<a href="#" class="smallToolbarButton">
<span>
<img rsrc:src="remove-addressbook.png"
label:title="Remove the selected Addressbook"/>
</span>
</a>
</div>
</div>
<div id="contactFoldersList">
<h6><var:string label:value="Address Books" /></h6>
<div id="abToolbar">
<a href="#" class="smallToolbarButton"
><span><img rsrc:src="add-addressbook.png" label:title="New Addressbook..."
/></span></a>
<a href="#" class="smallToolbarButton"
><span><img rsrc:src="add-user-addressbook.png" label:title="Subscribe to an Addressbook..."
/></span></a>
<a href="#" class="smallToolbarButton"
><span><img rsrc:src="remove-addressbook.png" label:title="Remove the selected Addressbook"
/></span></a>
</div>
<ul id="contactFolders">
<var:foreach list="contactFolders" item="currentFolder"
><li var:id="currentContactFolderId"
@ -129,7 +112,6 @@
></var:foreach
>
</ul>
<var:if condition="hasContactSelectionButtons">
<div class="contactSelection">
<var:component value="selectorComponent" />

View File

@ -26,7 +26,7 @@
DIV#rightDragHandle, DIV#calendarView
{ top: <var:string value="verticalDragHandleStyle" />; }
</var:if><var:if condition="eventsListViewStyle">
DIV#eventsListView
DIV#schedulerTabs
{ height: <var:string value="eventsListViewStyle" />; }
</var:if>
</style>
@ -132,49 +132,60 @@
</div>
<div id="leftPanel">
<div class="tabsContainer" id="schedulerTabs">
<ul>
<li target="dateSelectorView"
><span><var:string label:value="Date" /></span></li>
<li target="calendarSelectorView"
><span><var:string label:value="Calendars" /></span></li>
</ul>
<div class="tabs">
<div id="dateSelectorView" class="tab"
><var:component className="UIxCalDateSelector"
selectedDate="thisMonth"
/></div>
<div id="calendarSelectorView" class="tab"
><var:component className="UIxCalendarSelector"
var:calendarFolders="calendarFolders" /></div>
</div>
</div>
<div id="tasksListView">
<label><input id="showHideCompletedTasks"
type="checkbox" class="checkBox"
/><var:string label:value="Show completed tasks"/></label>
<ul id="tasksList"><!-- space --></ul>
</div>
<div id="dateSelectorView" class=""
><var:component className="UIxCalDateSelector"
selectedDate="thisMonth"
/></div>
<div id="calendarSelectorView"
><var:component className="UIxCalendarSelector"
var:calendarFolders="calendarFolders" /></div>
</div>
<div id="verticalDragHandle" class="dragHandle"><!-- space --></div>
<div id="rightPanel">
<var:component className="UIxCalFilterPanel" />
<div id="eventsListView">
<table id="eventsList" cellspacing="0">
<thead>
<tr>
<td id="titleHeader" class="headerCell headerTitle sortableTableHeader"><var:string label:value="Title"/></td>
<td id="startHeader" class="headerCell headerDateTime sortableTableHeader"><var:string label:value="Start"/></td>
<td id="endHeader" class="headerCell headerDateTime sortableTableHeader"><var:string label:value="End"/></td>
<td id="locationHeader" class="headerCell headerLocation sortableTableHeader"><var:string label:value="Location"/></td>
<td id="calendarNameHeader" class="headerCell headerCalendarName sortableTableHeader"><var:string label:value="Calendar"/></td>
</tr>
</thead>
<tbody><!-- events list --></tbody>
</table>
<div class="tabsContainer" id="schedulerTabs">
<ul>
<li target="eventsListView" var:class="eventsTabClass"
><span><var:string label:value="Events" /></span></li>
<li target="tasksListView" var:class="tasksTabClass"
><span><var:string label:value="Tasks" /></span></li>
</ul>
<div class="tabs">
<div id="eventsListView" class="tab">
<var:component className="UIxCalFilterPanel" />
<table id="eventsList" cellspacing="0">
<thead>
<tr>
<td id="titleHeader" class="headerCell headerTitle sortableTableHeader"><var:string label:value="Title"/></td>
<td id="startHeader" class="headerCell headerDateTime sortableTableHeader"><var:string label:value="Start"/></td>
<td id="endHeader" class="headerCell headerDateTime sortableTableHeader"><var:string label:value="End"/></td>
<td id="locationHeader" class="headerCell headerLocation sortableTableHeader"><var:string label:value="Location"/></td>
<td id="calendarNameHeader" class="headerCell headerCalendarName sortableTableHeader"><var:string label:value="Calendar"/></td>
</tr>
</thead>
<tbody><!-- events list --></tbody>
</table>
</div>
<div id="tasksListView" class="tab">
<label>
<input id="showHideCompletedTasks" type="checkbox" class="checkBox"/><var:string label:value="Show completed tasks"/>
</label>
<table id="tasksList" cellspacing="0">
<thead>
<tr>
<td id="completedHeader" class="headerCell"><entity name="nbsp"/></td>
<td class="headerCell headerTitle sortableTableHeader"><var:string label:value="Title"/></td>
<td class="headerCell headerDateTime sortableTableHeader"><var:string label:value="Due Date"/></td>
<td class="headerCell headerLocation sortableTableHeader"><var:string label:value="Location"/></td>
<td class="headerCell"><var:string label:value="Category"/></td>
<td class="headerCell headerCalendarName sortableTableHeader"><var:string label:value="Calendar"/></td>
</tr>
</thead>
<tbody><!-- tasks list --></tbody>
</table>
</div>
</div>
</div>
<div id="rightDragHandle" class="dragHandle"><!-- space --></div>
<div id="calendarView"><!-- space --></div>

View File

@ -15,6 +15,7 @@ div.colorBox.calendarFolder<var:string value="currentCalendar.folder" />
</var:foreach>
</style>
<div id="calendarSelector">
<h6><var:string label:value="Calendars"/></h6>
<div id="calendarSelectorButtons">
<a href="#" class="smallToolbarButton"
><span><img rsrc:src="add-calendar.png"
@ -33,19 +34,17 @@ div.colorBox.calendarFolder<var:string value="currentCalendar.folder" />
label:title="Remove the selected Calendar"
/></span></a>
</div>
<div id="calendarListWrapper">
<ul id="calendarList">
<var:foreach list="calendars" item="currentCalendar"
><li class="denied" var:id="currentCalendar.id"
var:owner="currentCalendar.owner" >
<input type="checkbox" class="checkBox"
const:disabled="disabled"
var:checked="currentCalendar.active" />
<div var:class="currentCalendarClass">OO</div
><var:string value="currentCalendar.displayName"
/></li>
</var:foreach>
</ul>
</div>
<ul id="calendarList">
<var:foreach list="calendars" item="currentCalendar"
><li class="denied" var:id="currentCalendar.id"
var:owner="currentCalendar.owner" >
<input type="checkbox" class="checkBox"
const:disabled="disabled"
var:checked="currentCalendar.active" />
<div var:class="currentCalendarClass">OO</div
><var:string value="currentCalendar.displayName"
/></li>
</var:foreach>
</ul>
</div>
</container>

View File

@ -103,24 +103,17 @@ TABLE.titletable TD.titlecell SELECT
DIV#contactFoldersList
{ position: absolute;
top: 84px;
top: 82px;
left: 0px;
width: 15em;
background-color: #CCDDEC;
bottom: 0px;
margin: 0px;
padding: 0px;
overflow: hidden; }
DIV#smallToolbarContainer
{ height: 50px;
margin: 0px 2px; }
DIV#smallToolbarContainer > .tabs
{ margin: 0px 2px;
height: 40px; }
DIV#abToolbar
{ height: 38px; }
{ padding-left: 6px; }
SPAN.toolbarButton
{ float: none;
@ -130,27 +123,15 @@ A.toolbarButton
{ text-decoration: none; }
UL#contactFolders
{ display: block;
list-style-type: none;
{ list-style-type: none;
list-style-image: none;
clear: both;
clear: left;
cursor: default;
color: #000;
background: #CCDDEC;
position: absolute; /* required for Safari & IE */
top: 68px; /* leave space for the mini addressbook */
bottom: 0px;
left: 0;
right: 0;
width: auto;
margin: 0px;
padding: 0px;
overflow: auto;
overflow-x: hidden;
border-top: 1px solid #909090;
border-left: 1px solid #909090;
border-bottom: 1px solid #FFFFFF;
border-right: 1px solid #FFFFFF;
-moz-user-select: none;
-khtml-user-select: none;
}
@ -158,11 +139,10 @@ UL#contactFolders
UL#contactFolders LI
{
background-repeat: no-repeat;
background-position: 4px 2px;
background-position: 14px 2px;
cursor: pointer;
line-height: 20px;
height: 20px;
padding-left: 22px;
line-height: 2em;
padding-left: 34px;
margin: 0px;
width: auto;
white-space: nowrap;
@ -334,10 +314,6 @@ SPAN.photoFrame:hover {
-webkit-transform: scale(3.0, 3.0) rotate(0deg) translate(33%, 33%);
-ms-transform: rotate(0deg) scale(3.0, 3.0); }
SPAN.photoFrame:hover IMG.contactPhoto
{
}
/* drag handles */
DIV#dragHandle
{ cursor: e-resize;

View File

@ -1319,10 +1319,8 @@ function initContacts(event) {
configureSelectionButtons();
}
var tabsContainer = $("smallToolbarContainer");
if (tabsContainer) {
var controller = new SOGoTabsController();
controller.attachToTabsContainer(tabsContainer);
var foldersList = $("contactFoldersList");
if (foldersList) {
configureAbToolbar();
// Addressbook import form

View File

@ -8,6 +8,9 @@ Element.addMethods({
return $(tbody).getSelectedNodes();
}
else if (element.tagName == 'TBODY') {
return element.getSelectedNodes();
}
else if (element.tagName == 'UL') {
return element.getSelectedNodes();
}

View File

@ -83,17 +83,20 @@ SOGoTabsController.prototype = {
currentNode.observe("mousedown",
this.onTabMouseDownBound, false);
currentNode.observe("click", this.onTabClickBound, false);
if (currentNode.hasClassName("active"))
this.activeTab = currentNode;
//$(currentNode.getAttribute("target")).hide();
}
this.firstTab.addClassName("first");
this.firstTab.addClassName("active");
this.activeTab = this.firstTab;
if (this.activeTab == null) {
this.activeTab = this.firstTab;
this.activeTab.addClassName("active");
}
var last = nodes.length - 1;
this.lastTab = $(nodes[last]);
var target = $(this.firstTab.getAttribute("target"));
var target = $(this.activeTab.getAttribute("target"));
target.addClassName("active");
}
this.onWindowResizeBound = this.onWindowResize.bindAsEventListener(this);
@ -141,6 +144,7 @@ SOGoTabsController.prototype = {
this.activeTab = $(clickedTab);
this.activeTab.addClassName("active"); // current LI
content.addClassName("active");
this.activeTab.fire("tabs:click", content.id);
// Prototype alternative

View File

@ -4,57 +4,44 @@ DIV#leftPanel
left: 0px;
width: 19.25em;
bottom: 0px;
background-color: #CCDDEC;
overflow: hidden; }
DIV#schedulerTabs
{ position: absolute;
top: 4px;
left: 2px;
right: 2px;
left: 1px;
right: 0px;
height: 186px; }
DIV#tasksListView
{ position: absolute;
top: 200px;
bottom: 0px;
left: 2px;
right: 0px;
overflow: hidden; }
DIV#schedulerTabs .tabs
{ right: 5px; }
DIV#tasksListView H2
{ font-size: 10pt;
margin: 0px;
margin-left: .25em;
padding: 0px; }
DIV#tasksListView LABEL
{ margin: .25em; }
DIV#schedulerTabs .tab
{ left: 0px;
right: 0px; }
DIV#calendarSelectorView
{ top: 3px;
overflow: hidden; }
{ overflow: hidden; }
DIV#calendarsList
{ height: 100%; }
DIV#calendarSelectorButtons
{ padding-left: 6px; }
DIV.colorBox
{ display: inline;
border: 1px solid #333;
font-weight: normal;
margin-right: 3px;
font-size: 80%;
width: 1em;
height: .75em; }
height: .75em;
-webkit-border-radius: 2px;
border-radius: 2px; }
UL#tasksList, UL#calendarList
UL#calendarList
{ cursor: default;
clear: left;
margin: 0px;
padding: 0px;
border-top: 1px solid #909090;
border-left: 1px solid #909090;
border-bottom: 1px solid #FFFFFF;
border-right: 1px solid #FFFFFF;
background-color: #CCDDEC;
list-style-type: none;
list-style-image: none;
overflow: hidden;
@ -62,61 +49,51 @@ UL#tasksList, UL#calendarList
-moz-user-select: none;
-khtml-user-select: none; }
UL#calendarList
{ clear: left;
height: 115px; }
UL#calendarList LI
{ cursor: pointer;
white-space: nowrap; }
UL#tasksList
{ position: absolute;
top: 2em;
left: 0px;
right: 0px;
bottom: .25em; }
UL#tasksList LI
{ cursor: pointer;
width: 100%;
white-space: nowrap; }
white-space: nowrap;
line-height: 2em;
padding-left: 10px; }
UL#tasksList LI.duelater,
UL#tasksList LI.duetoday,
UL#tasksList LI.overdue
#tasksList .duelater,
#tasksList .duetoday,
#tasksList .overdue
{ font-weight: bold; }
UL#tasksList LI.overdue,
UL#tasksList LI.important
#tasksList .overdue,
#tasksList .important
{ color: #f00 !important; }
UL#tasksList LI.duetoday
#tasksList .low
{ color: #666 !important; }
#tasksList .duetoday
{ color: #00f !important; }
UL#tasksList LI.completed SPAN
#tasksList .completed span
{ text-decoration: line-through;
color: #000; }
UL#tasksList LI.important SPAN
#tasksList .important SPAN
{ background-image: url(important.png);
background-repeat: no-repeat;
background-position: 3px 2px;
padding-left: 10px;
}
UL#tasksList LI SPAN
#tasksList SPAN
{ padding-left: 2px; }
UL#tasksList LI._selected.overdue
#tasksList ._selected.overdue
{ color: #fff !important;
background-color: #f00 !important; }
UL#tasksList LI._selected.duetoday
#tasksList ._selected.duetoday
{ color: #fff !important;
background-color: #00f !important; }
UL#tasksList LI._selected.duelater,
UL#tasksList LI._selected.completed
#tasksList ._selected.duelater,
#tasksList ._selected.completed
{ color: #fff !important;
background-color: #9ABCD8 !important; }
@ -129,17 +106,12 @@ DIV#rightPanel
margin-left: 5px;
overflow: hidden; }
/* top list */
DIV#eventsListView
/* top lists in tabs */
DIV#eventsListView,
DIV#tasksListView
{ cursor: default;
position: absolute;
background-color: #FFFFFF;
top: 2.5em;
left: 0px;
right: 0px;
height: 15.5em;
overflow: hidden;
border-left: 1px solid #9B9B9B;
overflow-y: auto; }
DIV#calendarView
@ -174,9 +146,6 @@ DIV#calendarView A
right: 0px;
height: 5px; }
#filterPanel
{ padding-right: .5em; }
DIV#dateSelectorView
{ overflow: hidden; }
@ -184,7 +153,7 @@ DIV#dateSelectorView
{ margin: 0px auto;
height: 13.5em;
background-color: #fff;
border-top: 1px solid #FFFFFF !important;
border-top: 1px solid #909090 !important;
border-left: 1px solid #FFFFFF !important;
border-bottom: 1px solid #909090 !important;
border-right: 1px solid #909090 !important; }
@ -279,21 +248,45 @@ TABLE#dateSelectorTable TD TABLE TD.dayOfToday
{ visibility: hidden;
display: none; }
TABLE#eventsList
TABLE#eventsList,
TABLE#tasksList
{ width: 100%; }
TABLE#eventsList .colorBox
{ margin-left: 2px; }
TABLE#eventsList TD.headerTitle,
TABLE#eventsList TD.headerDateTime
{ width: 30%; }
TABLE#eventsList TD,
TABLE#eventsList TH
TABLE#eventsList TH,
TABLE#tasksList TD,
TABLE#tasksList TH
{ overflow: hidden;
line-height: 1.5em;
white-space: nowrap; } /* pre, normal, nowrap */
TABLE#eventsList TH
TABLE#eventsList TH,
TABLE#tasksList TH
{ white-space: pre; }
TABLE#tasksList TD#completedHeader
{ text-align: center;
width: 20px; }
TABLE#eventsList THEAD TD:last-child,
TABLE#tasksList THEAD TD:last-child
{ border-right: 0px; }
#filterPanel,
.tab label
{ display: block;
margin: 0;
padding: 5px;
background-color: #eee;
background-color: #E6E7E6; }
DIV#eventDialog
{ width: 200px; }

View File

@ -241,8 +241,11 @@ function deleteEvent() {
}
if (sortedNodes[calendar].indexOf(nodes[i].cname) < 0) {
sortedNodes[calendar].push(nodes[i].cname);
if (nodes[i].tagName == 'TR')
events.push(nodes[i].down('td').allTextContent()); // extract the first column only
if (nodes[i].tagName == 'TR') {
var cell = nodes[i].down('td span');
var title = cell.allTextContent();
events.push(title); // extract the first column only
}
else
events.push(nodes[i].allTextContent());
}
@ -422,7 +425,7 @@ function onMenuRawEvent(event) {
var calendar = selectedCalendarCell[0].calendar;
var cname = selectedCalendarCell[0].cname;
var url = ApplicationBaseURL + calendar + "/" + cname + "/raw"
var url = ApplicationBaseURL + calendar + "/" + cname + "/raw";
openGenericWindow(url);
}
@ -918,8 +921,8 @@ function eventsListCallback(http) {
var rows = table.select("TBODY TR");
rows.each(function(e) {
e.remove();
});
e.remove();
});
if (http.responseText.length > 0) {
var data = http.responseText.evalJSON(true);
@ -927,13 +930,14 @@ function eventsListCallback(http) {
var row = createElement("tr");
table.tBodies[0].appendChild(row);
row.addClassName("eventRow");
var calendar = escape(data[i][1]);
var rTime = data[i][16];
var id = escape(data[i][1] + "-" + data[i][0]);
if (rTime)
id += "-" + escape(rTime);
row.setAttribute("id", id);
row.cname = escape(data[i][0]);
row.calendar = escape(data[i][1]);
row.calendar = calendar;
if (rTime)
row.recurrenceTime = escape(rTime);
row.isException = data[i][17];
@ -954,8 +958,13 @@ function eventsListCallback(http) {
var td = createElement("td");
row.appendChild(td);
td.observe("mousedown", listRowMouseDownHandler, true);
td.appendChild(document.createTextNode(data[i][4])); // title
var colorDiv = createElement("div", false, "colorBox calendarFolder" + calendar);
td.appendChild(colorDiv);
colorDiv.update('OO');
var span = createElement("span");
td.appendChild(span);
span.update(data[i][4]); // title
td = createElement("td");
row.appendChild(td);
td.observe("mousedown", listRowMouseDownHandler, true);
@ -1002,57 +1011,98 @@ function eventsListCallback(http) {
}
function tasksListCallback(http) {
var div = $("tasksListView");
if (http.readyState == 4
&& http.status == 200) {
var div = $("tasksListView");
document.tasksListAjaxRequest = null;
var list = $("tasksList");
var table = $("tasksList");
lastClickedRow = -1; // from generic.js
var rows = table.select("TBODY TR");
rows.each(function(e) {
e.remove();
});
if (http.responseText.length > 0) {
var data = http.responseText.evalJSON(true);
list.previousScroll = list.scrollTop;
while (list.childNodes.length)
list.removeChild(list.childNodes[0]);
// [0] Task ID
// [1] Calendar ID
// [2] Calendar name
// [3] Status (0, 1 = completed, 2)
// [4] Title
// [5] Due date (int)
// [6] Classification (0 = public, 1, = private, 2 = confidential)
// [7] Location
// [8] Category
// [9] Editable?
// [10] Erasable?
// [11] Priority (0, 1 = important, 9 = low)
// [12] Status CSS class (duelater, completed, etc)
// (13) Due date (formatted)
for (var i = 0; i < data.length; i++) {
var listItem = createElement("li");
list.appendChild(listItem);
listItem.on("dblclick", editDoubleClickedEvent);
var row = createElement("tr");
table.tBodies[0].appendChild(row);
row.on("dblclick", editDoubleClickedEvent);
var calendar = escape(data[i][1]);
var cname = escape(data[i][0]);
listItem.setAttribute("id", calendar + "-" + cname);
row.setAttribute("id", calendar + "-" + cname);
//listItem.addClassName(data[i][5]); // Classification
listItem.addClassName(data[i][9]); // status (duelater, completed, etc)
listItem.calendar = calendar;
listItem.cname = cname;
listItem.erasable = data[i][7] || IsSuperUser;
row.addClassName(data[i][12]); // status
row.calendar = calendar;
row.cname = cname;
row.erasable = data[i][10] || IsSuperUser;
if (parseInt(data[i][11]) == 1) {
row.addClassName("important");
}
else if (parseInt(data[i][11]) == 9) {
row.addClassName("low");
}
var cell = createElement("td");
row.appendChild(cell);
var input = createElement("input");
input.setAttribute("type", "checkbox");
if (parseInt(data[i][6]) == 0) // editable?
input.setAttribute("disabled", true);
if (parseInt(data[i][8]) == 1) {
listItem.addClassName("important");
}
listItem.appendChild(input);
input.observe("click", updateTaskStatus, true);
cell.appendChild(input);
input.setAttribute("value", "1");
if (data[i][2] == 1)
if (parseInt(data[i][9]) == 0) // editable?
input.setAttribute("disabled", true);
input.addClassName("checkBox");
if (parseInt(data[i][3]) == 1) // completed?
input.setAttribute("checked", "checked");
$(input).addClassName("checkBox");
input.observe("click", updateTaskStatus, true);
cell = createElement("td");
row.appendChild(cell);
var colorDiv = createElement("div", false, "colorBox calendarFolder" + calendar);
cell.appendChild(colorDiv);
colorDiv.update('OO');
listItem.appendChild(colorDiv);
var t = new Element ("span");
t.update(data[i][3]);
listItem.appendChild (t);
cell.appendChild(t);
t.update(data[i][4]); // title
cell = createElement("td");
row.appendChild(cell);
if (data[i][13])
cell.update(data[i][13]); // end date
cell = createElement("td");
row.appendChild(cell);
cell.update(data[i][7]); // location
cell = createElement("td");
row.appendChild(cell);
cell.update(data[i][8]); // category
cell = createElement("td");
row.appendChild(cell);
cell.update(data[i][2]); // calendar name
}
list.scrollTop = list.previousScroll;
table.scrollTop = table.previousScroll;
if (http.callbackData) {
var selectedNodesId = http.callbackData;
@ -1999,7 +2049,7 @@ function onEventsSelectionChange() {
tasksList.addClassName("_unfocused");
deselectAll(tasksList);
var rows = $(this.tBodies[0]).getSelectedNodes();
var rows = $(this).getSelectedNodes();
if (rows.length == 1) {
var row = rows[0];
changeCalendarDisplay( { "day": row.day,
@ -2412,7 +2462,7 @@ function onShowCompletedTasks(event) {
function updateTaskStatus(event) {
var newStatus = (this.checked ? 1 : 0);
_updateTaskCompletion (this.parentNode, newStatus);
_updateTaskCompletion (this.up("tr"), newStatus);
return false;
}
@ -2637,7 +2687,7 @@ function newTask () {
}
function marksTasksAsCompleted () {
var selectedTasks = $$("UL#tasksList LI._selected");
var selectedTasks = $$("#tasksList ._selected");
for (var i = 0; i < selectedTasks.length; i++) {
var task = selectedTasks[i];
@ -2655,7 +2705,7 @@ function _updateTaskCompletion (task, value) {
}
function onMenuRawTask(event) {
var selectedTasks = $$("UL#tasksList LI._selected");
var selectedTasks = $$("#tasksList ._selected");
if (selectedTasks.length != 1) {
return;
}
@ -2706,7 +2756,7 @@ function configureDragHandles() {
handle = $("rightDragHandle");
if (handle) {
handle.addInterface(SOGoDragHandlesInterface);
handle.upperBlock = $("eventsListView");
handle.upperBlock = $("schedulerTabs");
handle.lowerBlock = $("calendarView");
}
}
@ -3106,7 +3156,7 @@ function deletePersonalCalendarCallback(http) {
}
function configureLists() {
var list = $("tasksList");
var list = $$("#tasksList tbody").first();
list.multiselect = true;
list.on("mousedown", onTasksSelectionChange);
list.on("selectstart", listRowMouseDownHandler);
@ -3121,7 +3171,7 @@ function configureLists() {
list.multiselect = true;
configureSortableTableHeaders(list);
TableKit.Resizable.init(list, {'trueResize' : true, 'keepWidth' : true});
list.observe("mousedown", onEventsSelectionChange);
list.down("tbody").on("mousedown", onEventsSelectionChange);
}
function initDateSelectorEvents() {
@ -3223,6 +3273,15 @@ function onDocumentKeydown(event) {
}
}
function saveTabState(event) {
var tab = $(event).memo;
var url = ApplicationBaseURL + "saveSelectedList";
var params = "list=" + tab;
triggerAjaxRequest(url, null, null, params,
{ "Content-type": "application/x-www-form-urlencoded" });
}
function initScheduler() {
sorting["attribute"] = "start";
sorting["ascending"] = true;
@ -3234,6 +3293,7 @@ function initScheduler() {
var tabsContainer = $("schedulerTabs");
var controller = new SOGoTabsController();
controller.attachToTabsContainer(tabsContainer);
schedulerTabs.on("tabs:click", saveTabState);
if (UserSettings['ShowCompletedTasks']) {
showCompletedTasks = parseInt(UserSettings['ShowCompletedTasks']);

View File

@ -55,6 +55,14 @@ LABEL
white-space: nowrap;
margin-left: .5em; }
H6
{ font-size: 11px;
color: #9ABCD8;
color: #627e9c;
text-transform: uppercase;
margin: 10px 0px 5px 0px;
padding-left: 5px; }
TABLE
{ table-layout: fixed;
border-spacing: 0px; }
@ -493,7 +501,7 @@ DIV.noJavascriptErrorMessage A
margin: 0px auto; }
LI.denied
{ background-color: #fefefe;
{ n0background-color: #fefefe;
font-style: italic;
color: #f33; }
@ -507,7 +515,7 @@ TD._selected
color: #fff;
}
LI[class~="_selected"].denied
LI._selected.denied
{
background-color: #f33;
}

View File

@ -1193,7 +1193,7 @@ function initCriteria() {
var searchValue = $("searchValue");
var searchOptions = $("searchOptions");
if (searchValue) {
if (searchValue && searchOptions) {
var firstOption = searchOptions.down("li");
if (firstOption) {
searchCriteria.value = firstOption.getAttribute('id');

View File

@ -171,7 +171,8 @@ TABLE.framenocaption
TABLE.frame TBODY
{ padding: 20px; }
UL#calendarList
UL#calendarList,
UL#contactFolders
{ margin-top: 2px; }
A.toolbarButton SPAN,
@ -179,10 +180,8 @@ A.toolbarButton:hover SPAN {
height: 50px;
padding: 5px 2px 6px 5px;
}
A.smallToolbarButton, A.smallToolbarButton:hover,
A.smallToolbarButton SPAN, A.smallToolbarButton:hover SPAN
{ height: 33px; }
A.smallToolbarButton, A.smallToolbarButton:hover
{ height: 34px; }
A.toolbarButton:active SPAN {
background-position: auto; /*broken*/
}