diff --git a/UI/MailerUI/UIxMailListActions.m b/UI/MailerUI/UIxMailListActions.m index 5ae707e6c..4dd20ad95 100644 --- a/UI/MailerUI/UIxMailListActions.m +++ b/UI/MailerUI/UIxMailListActions.m @@ -54,6 +54,7 @@ #import #import #import +#import #import #import #import @@ -329,7 +330,7 @@ WORequest *request; request = [context request]; - urlParams = [request contentAsString] objectFromJSONString]; + urlParams = [[request contentAsString] objectFromJSONString]; sortingAttributes = [urlParams objectForKey:@"sortingAttributes"]; sort = [sortingAttributes objectForKey:@"sort"]; @@ -404,7 +405,8 @@ { EOQualifier *qualifier, *searchQualifier; WORequest *request; - NSDictionary *filters, *sortingAttributes, *content; + NSDictionary *sortingAttributes, *content; + NSArray *filters; NSString *searchBy, *searchArgument, *searchInput, *searchString, *match; NSMutableArray *searchArray; int nbFilters, i; @@ -428,8 +430,12 @@ searchBy = [NSString stringWithString:[[filters objectAtIndex:i] objectForKey:@"searchBy"]]; searchArgument = [NSString stringWithString:[[filters objectAtIndex:i] objectForKey:@"searchArgument"]]; searchInput = [NSString stringWithString:[[filters objectAtIndex:i] objectForKey:@"searchInput"]]; - - searchString = [NSString stringWithFormat:@"(%@ %@: '%@')", searchBy, searchArgument, searchInput]; + + if ([[[filters objectAtIndex:i] objectForKey:@"negative"] boolValue]) + searchString = [NSString stringWithFormat:@"(not (%@ %@: '%@'))", searchBy, searchArgument, searchInput]; + else + searchString = [NSString stringWithFormat:@"(%@ %@: '%@')", searchBy, searchArgument, searchInput]; + searchQualifier = [EOQualifier qualifierWithQualifierFormat:searchString]; [searchArray addObject:searchQualifier]; } diff --git a/UI/Templates/MailerUI/UIxMailSearch.wox b/UI/Templates/MailerUI/UIxMailSearch.wox index 2e77b13e3..388648a13 100644 --- a/UI/Templates/MailerUI/UIxMailSearch.wox +++ b/UI/Templates/MailerUI/UIxMailSearch.wox @@ -14,31 +14,10 @@
  • - - + @@ -63,9 +42,9 @@ @@ -76,25 +55,22 @@
    - + - +
    -
    - - - + - - + - - + - - @@ -109,4 +85,6 @@ +
    +
    diff --git a/UI/WebServerResources/UIxMailSearch.css b/UI/WebServerResources/UIxMailSearch.css index 80969374d..9430167dd 100644 --- a/UI/WebServerResources/UIxMailSearch.css +++ b/UI/WebServerResources/UIxMailSearch.css @@ -1,29 +1,33 @@ /*************** Table adjustment *****************/ -TABLE#searchMailHeader, TABLE#searchFiltersList, TABLE#searchMailFooter +TABLE#searchMailHeader { width: 100%; } TABLE#searchFiltersList, TABLE#searchMailFooter { border: 1px solid #909090; - margin-top: 1em; padding:2px; border-radius: 3px; } TABLE#searchFiltersList { - display:block; - max-height:100px; + display:inline-block; + max-height:105px; + height:105px; overflow:auto; - width:672px; + width:674px; + margin-top: 1em; } TABLE#searchMailFooter { - height:141px; - min-height: 110px; + position:absolute; + left:10px; + width:680px; + top:240px; + height:194px; } .buttonsCell @@ -36,17 +40,18 @@ TABLE#searchMailFooter width:45%; } -.filterRow -{ - cellspacing=0; -} - .scrollbar { overflow-y:auto; - height:106px; - width:676px; + height:171px; position:absolute; + top:21px; + left:0; + right:0; +} + +#td_table_1, #td_table_2, #td_table_3, #td_table_4 { + width:25%; } /*************** Table adjustment : search results *****************/ @@ -54,6 +59,37 @@ TABLE#searchMailFooter cursor:pointer; } +.td_header { + border: solid #909090 1px; + position:absolute; + top:-1px; + width:157px; + cursor:pointer; + background: -webkit-linear-gradient(left top, #f0f1f0 , #e6e7e6); /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(bottom right, #f0f1f0, #e6e7e6); /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(bottom right, #f0f1f0, #e6e7e6); /* For Firefox 3.6 to 15 */ + background: linear-gradient(to bottom right, #f0f1f0 , #e6e7e6); /* Standard syntax */ +} + +.td_header:hover +{text-decoration: underline; } + +#subjectHeader { + left:-1px; + border-top-left-radius: 3px; +} +#fromHeader { + left:166px; +} +#toHeader { + left:333px; +} +#dateHeader { + left:500px; + width:168px; + border-top-right-radius: 3px; +} + /*************** Button adjustment *****************/ #headerButtons @@ -72,7 +108,10 @@ TABLE#searchMailFooter } DIV#optionsButtons -{ float:left; } +{ + position:absolute; + bottom:10px; +} .button { @@ -82,14 +121,84 @@ DIV#optionsButtons #changeHeader { width:15px} -DIV.bottomToolbar { - margin:0; - position:relative; - border-radius:5px; +#resizeFrame +{ + text-align: -webkit-right; + margin-top:1em; +} + +#resizeButton +{ + display:inline-block; + text-align: -webkit-center; +} + + +#resultsFound { + position:absolute; + bottom:25px; + right:10px; +} + + +#imgPosition +{ position: absolute; + right: 17px; + top: 233px; + z-index: 1; +} + +#listCollapse +{ position: absolute; + top: .2em; + right: 0; + margin: 0.5em 1em; } + +#listCollapse img +{ position: absolute; } + +#listCollapse img.collapse +{ clip: rect(0 18px 18px 0); + left: 0; + top: 0; } + +#listCollapse img.collapse:hover +{ clip: rect(0 36px 18px 18px); + left: -18px; } + +#listCollapse img.rise +{ clip: rect(18px 18px 36px 0); + left: 0; + top: -18px; } + +#listCollapse img.rise:hover +{ clip: rect(18px 36px 36px 18px); + left: -18px; } + +#filterButtons +{ width:40px; + cursor:pointer; +} + +/* Glow */ +.glow { + display: inline-block; + -webkit-transition-duration: 0.3s; + transition-duration: 0.3s; + -webkit-transition-property: box-shadow; + transition-property: box-shadow; + -webkit-transform: translateZ(0); + transform: translateZ(0); + box-shadow: 0 0 1px rgba(0, 0, 0, 0); +} +.glow:hover, .glow:focus, .glow:active { + box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); } /*************** Lists *****************/ .hidden { display:none; } + + diff --git a/UI/WebServerResources/UIxMailSearch.js b/UI/WebServerResources/UIxMailSearch.js index e9c3245e0..aecbc9400 100644 --- a/UI/WebServerResources/UIxMailSearch.js +++ b/UI/WebServerResources/UIxMailSearch.js @@ -49,10 +49,14 @@ function onSearchClick() { for (j = 0; j < searchArgumentsOptions.length ; j++) { if (searchArgumentsOptions[j].selected) { filter.searchArgument = searchArgumentsOptions[j].innerText; - if (filter.searchArgument == "contains") + filter.negative = false; + if (filter.searchArgument == "contains") { filter.searchArgument = "doesContain"; - else - filter.searchArgument = "NOT doesContain"; + } + else if (filter.searchArgument == "does not contain") { + filter.searchArgument = "doesContain"; + filter.negative = true; + } break; } } @@ -73,7 +77,7 @@ function onSearchClick() { } else { stopOngoingSearch = true; - $("searchButton").down().innerText = _("Search"); + onSearchEnd(); } } @@ -155,16 +159,20 @@ function searchMailsCallback(http) { row.writeAttribute("folderName", http.callbackData.folderName); var cell1 = row.insertCell(0); + cell1.writeAttribute("id", "td_table_1"); cell1.innerHTML = response.headers[i][3]; var cell2 = row.insertCell(1); + cell2.writeAttribute("id", "td_table_2"); cell2.innerHTML = response.headers[i][4]; var cell3 = row.insertCell(2); - cell3.innerHTML = response.headers[i][7]; + cell3.writeAttribute("id", "td_table_3"); + cell3.innerHTML = response.headers[i][0]; var cell4 = row.insertCell(3); - cell4.innerHTML = response.headers[i][12]; + cell4.writeAttribute("id", "td_table_4"); + cell4.innerHTML = response.headers[i][7]; } } @@ -195,12 +203,23 @@ function searchMailsCallback(http) { document.searchMailsAjaxRequest = triggerAjaxRequest(urlstr, searchMailsCallback, callbackData, content, {"content-type": "application/json"}); } else { - $("searchButton").down().innerText = _("Search"); + onSearchEnd(); } } } +function onSearchEnd() { + $("searchButton").down().innerText = _("Search"); + var nbResults = $$(".resultsRow").length; + if (nbResults == 1) + $("resultsFound").innerHTML = nbResults + " " + _("result found"); + else if (nbResults > 0) + $("resultsFound").innerHTML = nbResults + " " + _("results found"); + else + $("resultsFound").innerHTML = ""; +} + function onCancelClick() { disposeDialog(); $("searchMailView").remove(); @@ -261,31 +280,27 @@ function onAddFilter() { var cell4 = row.insertCell(3); Element.addClassName(cell4, "buttonsCell"); - var element4 = document.createElement("a"); - var element5 = document.createElement("a"); - var buttonsDiv = document.createElement("div"); - var spanAddFilter = document.createElement("span"); - var imageAddFilter = document.createElement("img"); - var spanRemoveFilter = document.createElement("span"); - var imageRemoveFilter = document.createElement("img"); - Element.addClassName(element4, "addFilterButton"); - Element.addClassName(buttonsDiv, "bottomToolbar"); - element4.writeAttribute("name", "addFilter"); - element4.writeAttribute("id", "addFilterButtonRow" + rowCount); - element4.writeAttribute("onclick", "onAddFilter(this)"); - imageAddFilter.writeAttribute("src", "/SOGo.woa/WebServerResources/add-icon.png"); - spanAddFilter.appendChild(imageAddFilter); - element4.appendChild(spanAddFilter); - buttonsDiv.appendChild(element4); - Element.addClassName(element5, "removeFilterButton"); - element5.writeAttribute("name", "removeFilter"); - element5.writeAttribute("id", "removeFilterButtonRow" + rowCount); - element5.writeAttribute("onclick", "onRemoveFilter(this)"); + var buttonsDiv = document.createElement("div"); + var imageAddFilter = document.createElement("img"); + var imageRemoveFilter = document.createElement("img"); + imageAddFilter.writeAttribute("src", "/SOGo.woa/WebServerResources/add-icon.png"); imageRemoveFilter.writeAttribute("src", "/SOGo.woa/WebServerResources/remove-icon.png"); - spanRemoveFilter.appendChild(imageRemoveFilter); - element5.appendChild(spanRemoveFilter); - buttonsDiv.appendChild(element5); + Element.addClassName(imageAddFilter, "addFilterButton"); + Element.addClassName(imageAddFilter, "glow"); + Element.addClassName(imageRemoveFilter, "removeFilterButton"); + Element.addClassName(imageRemoveFilter, "glow"); + imageAddFilter.writeAttribute("name", "addFilter"); + imageAddFilter.writeAttribute("id", "addFilterButtonRow" + rowCount); + imageAddFilter.writeAttribute("onclick", "onAddFilter(this)"); + imageRemoveFilter.writeAttribute("name", "removeFilter"); + imageRemoveFilter.writeAttribute("id", "removeFilterButtonRow" + rowCount); + imageRemoveFilter.writeAttribute("onclick", "onRemoveFilter(this)"); + buttonsDiv.writeAttribute("id", "filterButtons"); + + buttonsDiv.appendChild(imageAddFilter); + buttonsDiv.appendChild(imageRemoveFilter); + cell4.appendChild(buttonsDiv); } @@ -333,24 +348,37 @@ function onDeleteClick(event) { } function onResizeClick() { - var resizeAttrribute = $("resizeButton").getAttribute("name"); - if (resizeAttrribute == "resizeUp") { - $("searchFiltersList").style.display = "none"; - $("searchMailFooter").style.height = "300px"; - $("resultsTable").style.height = "265px"; - $("resizeUp").style.display = "none"; - $("resizeDown").style.display = "block"; - $("resizeButton").writeAttribute("name", "resizeDown"); + var searchFiltersList = jQuery("#searchFiltersList"); + var searchMailFooter = jQuery("#searchMailFooter"); + var resultsTable = jQuery("#resultsTable"); + var imgPosition = jQuery("#imgPosition"); + var state = 'collapse'; + var img = $("listCollapse").select('img').first(); + + + if (searchFiltersList[0].visible()) { + searchFiltersList.fadeOut(300, function() { + searchMailFooter.animate({ top:"120px" }, {queue: false, duration: 100}); + resultsTable.animate({height:"288px"}, 100); + searchMailFooter.animate({height:"312px" }, {queue: false, duration: 100, complete: function() { + img.removeClassName('collapse').addClassName('rise'); + $("resultsFound").style.bottom = "40px;"; + }}); + imgPosition.animate({ top:"113px" }, {duration: 100}); + }); } else { - $("searchFiltersList").style.display = "block"; - $("searchMailFooter").style.height = "141px"; - $("resultsTable").style.height = "106px"; - $("resizeUp").style.display = "block"; - $("resizeDown").style.display = "none"; - $("resizeButton").writeAttribute("name", "resizeUp"); + state = 'rise'; + searchMailFooter.animate({height:"194px"}, {queue: false, duration: 100}); + searchMailFooter.animate({top:"240px" }, {queue: false, duration: 100, complete:function() { + searchFiltersList.fadeIn(); + img.removeClassName('rise').addClassName('collapse'); + $("resultsFound").style.bottom = "25px;"; + }}); + imgPosition.animate({ top:"233px" }, {duration: 100}); + resultsTable.animate({height:"171px"}, 100); + } - } /*************** Init ********************/ @@ -363,6 +391,4 @@ function initSearchMailView () { // Observers : Event.on(element, eventName[, selector], callback) $("searchMailFooter").down("tbody").on("mousedown", "tr", onResultSelectionChange); $("searchMailFooter").down("tbody").on("dblclick", "tr", onOpenClick); - - } \ No newline at end of file diff --git a/UI/WebServerResources/generic.css b/UI/WebServerResources/generic.css index 736d556d4..b32901017 100644 --- a/UI/WebServerResources/generic.css +++ b/UI/WebServerResources/generic.css @@ -660,15 +660,14 @@ DIV.dialog > DIV DIV.dialog.searchMail { position: relative; - margin: 0px; padding: 0px; opacity: 1; width: 700px; - margin: 100px auto; + margin: 2em auto; } -DIV.dialog.searchMail > DIV { - padding: 10px; +DIV.dialog.searchMail > DIV { + min-height:467px; } DIV.dialog.none
    - +
    + + + - -