Merged V2.1 to HEAD

6609: Portlet UI (doclist, myspaces, mytasks) updates following design review
   6610: AR-1270
   6611: debugging WCM-778.
   6612: Improved API documentation.
   6613: Added store lookup cache to EHCache config for default and extended cluster sample
   6614: AWC-1531 and AWC-1146. Link objects that have targets which the user does not have access to are now filtered from the view.
   6615: AR-1664: Bootstraping from full export fails if file names differs only with a space: my file, my file
   6616: Fixed AR-1519: Possible duplicate entries when moving nodes between stores
   6617: Removed deprecated aspects; Added emailed aspect to messages; Added OOo command line options
   6618: Fix for AWC-1350
   6619: Fix for AWC-1509
   6620: AWC-1179: Searching for users in Invite User Wizard is slow with large number of users
   6621: Changed shutdown logic to avoid classloader cleanup race.
   6622: Fix for AWC-1533 (can't save office docs to Company Home)
   6623: Fix for AR-1705
   6624: Better fix for AWC-1256 (links generated by tinyMCE editor)
   6625: Fixed AR-1713: Transformers that do nothing don't break full text indexing
   6626: Fixed AWC-1438: Added explcit TXT to PDF converter that wraps the PDFBox TextToPDF class
   6627: Portlet templates now handle missing description property on web form
   6628: Fix WCM-788
   6635: Make workflow available for users who cannot see company home
         Resolved conflicted state of 'root\projects\repository\source\java\org\alfresco\repo\workflow\jbpm\JBPMEngine.java'


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6748 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2007-09-11 03:39:41 +00:00
parent fd2ee9fde1
commit f279d99d80
36 changed files with 677 additions and 194 deletions

View File

@@ -13,34 +13,44 @@
</#if> </#if>
</div> </div>
</td> </td>
<td width="24"></td> <td width="24" align="center">
<table cellpadding="0" cellspacing="0" border="0" width="1">
<tr>
<td width="1" style="background-color: #75badd; height: 140px; width: 1px;"></td>
</tr>
</table>
</td>
<td width="300"> <td width="300">
<table width="100%" cellpadding="0" cellspacing="0"> <table width="100%" cellpadding="0" cellspacing="0">
<tr> <tr>
<#assign navurl='/navigate/showDocDetails/' + node.nodeRef.storeRef.protocol + '/' + node.nodeRef.storeRef.identifier + '/' + node.nodeRef.id> <#assign navurl='/navigate/showDocDetails/' + node.nodeRef.storeRef.protocol + '/' + node.nodeRef.storeRef.identifier + '/' + node.nodeRef.id>
<#if node.isLocked > <#if node.isLocked>
<td class="docAction docActionCheckout docActionLocked">(Locked)</td> <td class="docAction docActionCheckout docActionLocked">(Locked)</td>
<#elseif hasAspect(node, "cm:workingcopy") == 1> <#elseif hasAspect(node, "cm:workingcopy") == 1>
<td class="docAction docActionCheckin" <#if node.hasPermission("CheckIn")>onclick='event.cancelBubble=true;MyDocs.checkinItem("${node.name}", "${node.nodeRef}");'</#if>>Check In</td> <td class="docAction docActionCheckin" <#if node.hasPermission("CheckIn")>onclick='event.cancelBubble=true;MyDocs.checkinItem("${node.name}", "${node.nodeRef}");'</#if>>Check In</td>
<#else> <#else>
<td class="docAction docActionCheckout" <#if node.hasPermission("CheckOut")>onclick='event.cancelBubble=true;MyDocs.checkoutItem("${node.name}", "${node.nodeRef}");'</#if>>Check Out</td> <td class="docAction docActionCheckout" <#if node.hasPermission("CheckOut")>onclick='event.cancelBubble=true;MyDocs.checkoutItem("${node.name}", "${node.nodeRef}");'</#if>>Check Out</td>
</#if> </#if>
<#if node.isLocked > <#if node.isLocked>
<td class="docAction docActionEditDetails docActionLocked">Edit Details</td> <td class="docAction docActionEditDetails docActionLocked">Edit Details</td>
<#else> <#else>
<td class="docAction docActionEditDetails" onclick="openWindowCallback('${url.context}/command/ui/editcontentprops?container=plain&amp;noderef=${node.nodeRef}', MyDocs.editDetailsCallback);">Edit Details</td> <td class="docAction docActionEditDetails" onclick="openWindowCallback('${url.context}/command/ui/editcontentprops?container=plain&amp;noderef=${node.nodeRef}', MyDocs.editDetailsCallback);">Edit Details</td>
</#if> </#if>
</tr> </tr>
<tr> <tr>
<#if node.isLocked > <#if node.isLocked>
<td class="docAction docActionUpdate docActionLocked">Update</td> <td class="docAction docActionUpdate docActionLocked">Update</td>
<#else> <#else>
<td class="docAction docActionUpdate" onclick="event.cancelBubble=true;MyDocs.updateItem(this, '${node.nodeRef}');">Update</td> <td class="docAction docActionUpdate" onclick="event.cancelBubble=true;MyDocs.updateItem(this, '${node.nodeRef}');">Update</td>
</#if> </#if>
<td class="docAction docActionViewContent" onclick="window.open('${url.context}${node.downloadUrl}', '_blank');">View Content</td> <td class="docAction docActionViewContent" onclick="window.open('${url.context}${node.downloadUrl}', '_blank');">Download</td>
</tr> </tr>
<tr> <tr>
<#if node.isLocked>
<td class="docAction docActionDelete docActionLocked">Delete</td>
<#else>
<td class="docAction docActionDelete" <#if node.hasPermission("Delete")>onclick='event.cancelBubble=true;MyDocs.deleteItem("${node.name}", "${node.nodeRef}");'</#if>>Delete</td> <td class="docAction docActionDelete" <#if node.hasPermission("Delete")>onclick='event.cancelBubble=true;MyDocs.deleteItem("${node.name}", "${node.nodeRef}");'</#if>>Delete</td>
</#if>
<td class="docAction docActionMoreActions" onclick="window.open('${url.context}${navurl}', '_blank');">More Actions...</td> <td class="docAction docActionMoreActions" onclick="window.open('${url.context}${navurl}', '_blank');">More Actions...</td>
</tr> </tr>
</table> </table>

View File

@@ -33,29 +33,33 @@
<#assign navurl='/navigate/showDocDetails/' + node.nodeRef.storeRef.protocol + '/' + node.nodeRef.storeRef.identifier + '/' + node.nodeRef.id> <#assign navurl='/navigate/showDocDetails/' + node.nodeRef.storeRef.protocol + '/' + node.nodeRef.storeRef.identifier + '/' + node.nodeRef.id>
<#if node.isDocument> <#if node.isDocument>
<tr> <tr>
<#if node.isLocked> <#if node.isLocked>
<td class="spaceAction docActionCheckout docActionLocked">(Locked)</td> <td class="spaceAction docActionCheckout docActionLocked">(Locked)</td>
<#elseif hasAspect(node, "cm:workingcopy") == 1> <#elseif hasAspect(node, "cm:workingcopy") == 1>
<td class="spaceAction docActionCheckin" <#if node.hasPermission("CheckIn")>onclick='event.cancelBubble=true;MySpaces.checkinItem("${node.name}", "${node.nodeRef}");'</#if>>Check In</td> <td class="spaceAction docActionCheckin" <#if node.hasPermission("CheckIn")>onclick='event.cancelBubble=true;MySpaces.checkinItem("${node.name}", "${node.nodeRef}");'</#if>>Check In</td>
<#else> <#else>
<td class="spaceAction docActionCheckout" <#if node.hasPermission("CheckOut")>onclick='event.cancelBubble=true;MySpaces.checkoutItem("${node.name}", "${node.nodeRef}");'</#if>>Check Out</td> <td class="spaceAction docActionCheckout" <#if node.hasPermission("CheckOut")>onclick='event.cancelBubble=true;MySpaces.checkoutItem("${node.name}", "${node.nodeRef}");'</#if>>Check Out</td>
</#if> </#if>
<#if node.isLocked > <#if node.isLocked>
<td class="spaceAction docActionEditDetails docActionLocked">Edit Details</td> <td class="spaceAction docActionEditDetails docActionLocked">Edit Details</td>
<#else> <#else>
<td class="spaceAction docActionEditDetails" onclick="openWindowCallback('${url.context}/command/ui/editcontentprops?container=plain&amp;noderef=${node.nodeRef}', MySpaces.editDetailsCallback);">Edit Details</td> <td class="spaceAction docActionEditDetails" onclick="openWindowCallback('${url.context}/command/ui/editcontentprops?container=plain&amp;noderef=${node.nodeRef}', MySpaces.editDetailsCallback);">Edit Details</td>
</#if> </#if>
</tr> </tr>
<tr> <tr>
<#if node.isLocked > <#if node.isLocked>
<td class="spaceAction docActionUpdate docActionLocked">Update</td> <td class="spaceAction docActionUpdate docActionLocked">Update</td>
<#else> <#else>
<td class="spaceAction docActionUpdate" onclick="event.cancelBubble=true;MySpaces.updateItem(this, '${node.nodeRef}');">Update</td> <td class="spaceAction docActionUpdate" onclick="event.cancelBubble=true;MySpaces.updateItem(this, '${node.nodeRef}');">Update</td>
</#if> </#if>
<td class="spaceAction docActionViewContent" onclick="window.open('${url.context}${node.downloadUrl}', '_blank');">View Content</td> <td class="spaceAction docActionViewContent" onclick="window.open('${url.context}${node.downloadUrl}', '_blank');">View Content</td>
</tr> </tr>
<tr> <tr>
<#if node.isLocked>
<td class="spaceAction docActionDelete docActionLocked">Delete</td>
<#else>
<td class="spaceAction docActionDelete" <#if node.hasPermission("Delete")>onclick='event.cancelBubble=true;MySpaces.deleteItem("${node.name}", "${node.nodeRef}");'</#if>>Delete</td> <td class="spaceAction docActionDelete" <#if node.hasPermission("Delete")>onclick='event.cancelBubble=true;MySpaces.deleteItem("${node.name}", "${node.nodeRef}");'</#if>>Delete</td>
</#if>
<td class="spaceAction docActionMoreActions" onclick="window.open('${url.context}${navurl}', '_blank');">More Actions...</td> <td class="spaceAction docActionMoreActions" onclick="window.open('${url.context}${navurl}', '_blank');">More Actions...</td>
</tr> </tr>
<#else> <#else>

View File

@@ -42,17 +42,17 @@
<table border=0 cellspacing=0 cellpadding=0 class="docTable"> <table border=0 cellspacing=0 cellpadding=0 class="docTable">
<tr> <tr>
<td height="30" class="docHeader"> <td class="docHeader">
<table border="0" cellspacing="6" cellpadding="0" width="100%"> <table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr> <tr>
<th><a id="docFilter0" class="docfilterLink <#if filter=0>docfilterLinkSelected</#if>" href="#" onclick="MyDocs.filter(0); return false;">All Items</a></th> <th><a id="docFilter0" class="docfilterLink <#if filter=0>docfilterLinkSelected</#if>" href="#" onclick="MyDocs.filter(0); return false;"><span>All Items</span></a></th>
<th><a id="docFilter1" class="docfilterLink <#if filter=1>docfilterLinkSelected</#if>" href="#" onclick="MyDocs.filter(1); return false;">Word Documents</a></th> <th><a id="docFilter1" class="docfilterLink <#if filter=1>docfilterLinkSelected</#if>" href="#" onclick="MyDocs.filter(1); return false;"><span>Word Documents</span></a></th>
<th><a id="docFilter2" class="docfilterLink <#if filter=2>docfilterLinkSelected</#if>" href="#" onclick="MyDocs.filter(2); return false;">HTML Documents</a></th> <th><a id="docFilter2" class="docfilterLink <#if filter=2>docfilterLinkSelected</#if>" href="#" onclick="MyDocs.filter(2); return false;"><span>HTML Documents</span></a></th>
<th><a id="docFilter3" class="docfilterLink <#if filter=3>docfilterLinkSelected</#if>" href="#" onclick="MyDocs.filter(3); return false;">PDF Documents</a></th> <th><a id="docFilter3" class="docfilterLink <#if filter=3>docfilterLinkSelected</#if>" href="#" onclick="MyDocs.filter(3); return false;"><span>PDF Documents</span></a></th>
<th><a id="docFilter4" class="docfilterLink <#if filter=4>docfilterLinkSelected</#if>" href="#" onclick="MyDocs.filter(4); return false;">Recently Modified</a></th> <th><a id="docFilter4" class="docfilterLink <#if filter=4>docfilterLinkSelected</#if>" href="#" onclick="MyDocs.filter(4); return false;"><span>Recently Modified</span></a></th>
<td align=right> <th align=right>
<a href="#" onclick="MyDocs.refreshList(); return false;" class="refreshViewLink"><img src="${url.context}/images/icons/reset.gif" border="0" width="16" height="16" style="vertical-align:-25%;padding-right:4px">Refresh</a> <a href="#" onclick="MyDocs.refreshList(); return false;" class="refreshViewLink"><img src="${url.context}/images/icons/reset.gif" border="0" width="16" height="16" style="vertical-align:-25%;padding-right:4px">Refresh</a>
</td> </th>
</tr> </tr>
</table> </table>
</td> </td>
@@ -75,6 +75,10 @@
MyDocs.Query="${query?replace("\"","\\\"")}"; MyDocs.Query="${query?replace("\"","\\\"")}";
</script> </script>
</div> </div>
<div id="docMessagePanel">
<div class="docMessagePanelClose"><img id="docMessagePanelCloseImage" src="${url.context}/images/icons/close_portlet_static.gif" onclick="MyDocs.closeMessage();" /></div>
<div class="docMessagePanelLabel"></div>
</div>
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -87,21 +91,29 @@
</table> </table>
<style type="text/css"> <style type="text/css">
a.docfilterLink:link, a.docfilterLink:visited a.docfilterLink, a.docfilterLink:hover
{ {
color: #8EA1B3; color: #8EA1B3;
font-family: Trebuchet MS, Arial, Helvetica, sans-serif; font-family: Trebuchet MS, Arial, Helvetica, sans-serif;
font-size: 12px; font-size: 12px;
font-weight: bold; font-weight: bold;
text-decoration: none; text-decoration: none;
padding-left: 4px; padding: 8px 4px 16px;
padding-right: 4px; outline: none;
display: block;
} }
a.docfilterLink:hover a.docfilterLink:hover span
{ {
color: #168ECE; color: #168ECE;
background-color: #EEF7FB; background-color: #EEF7FB;
text-decoration: none;
}
a.docfilterLinkSelected
{
background: transparent url("${url.context}/images/parts/doclist_item_marker.png") no-repeat scroll center 29px !important;
padding-bottom: 16px;
} }
a.docfilterLinkSelected:link, a.docfilterLinkSelected:visited a.docfilterLinkSelected:link, a.docfilterLinkSelected:visited
@@ -111,7 +123,7 @@ a.docfilterLinkSelected:link, a.docfilterLinkSelected:visited
.docTable .docTable
{ {
background-color: #F8FCFD; background-color: #FFFFFF;
border: 1px solid #CCD4DB; border: 1px solid #CCD4DB;
} }
@@ -119,7 +131,7 @@ a.docfilterLinkSelected:link, a.docfilterLinkSelected:visited
{ {
height: 320px; height: 320px;
width: 716px; width: 716px;
overflow: auto; overflow: none;
overflow-y: scroll; overflow-y: scroll;
border-top: 1px solid #CCD4DB; border-top: 1px solid #CCD4DB;
border-bottom: 1px solid #CCD4DB; border-bottom: 1px solid #CCD4DB;
@@ -170,6 +182,8 @@ a.docfilterLinkSelected:link, a.docfilterLinkSelected:visited
.docHeader .docHeader
{ {
background-image: url(${url.context}/images/parts/doclist_headerbg.png); background-image: url(${url.context}/images/parts/doclist_headerbg.png);
height: 40px;
vertical-align: top;
} }
@@ -193,12 +207,13 @@ a.docfilterLinkSelected:link, a.docfilterLinkSelected:visited
margin-top: 8px; margin-top: 8px;
} }
.docItem a.docItem, a.docItem:hover
{ {
font-family: Trebuchet MS, Arial, Helvetica, sans-serif; font-family: Trebuchet MS, Arial, Helvetica, sans-serif;
font-size: 14px; font-size: 14px;
color: #515D6B; color: #515D6B;
padding: 0px 8px 6px 40px; padding: 0px 8px 6px 8px;
text-decoration: none;
} }
.docIcon .docIcon
@@ -225,11 +240,16 @@ a.docfilterLinkSelected:link, a.docfilterLinkSelected:visited
.docItemSelected .docItemSelected
{ {
background-color: #CCE7F3 !important; background: #CCE7F3 url("${url.context}/images/parts/doclist_arrow_down.png") no-repeat right top;
border-bottom: 1px solid #0092DD !important; border-bottom: 1px solid #0092DD !important;
border-top: 1px solid #0092DD !important; border-top: 1px solid #0092DD !important;
} }
.docItemSelectedOpen
{
background-image: url("${url.context}/images/parts/doclist_arrow_up.png") !important;
}
.docResource .docResource
{ {
font-family: Trebuchet MS, Arial, Helvetica, sans-serif; font-family: Trebuchet MS, Arial, Helvetica, sans-serif;
@@ -257,12 +277,14 @@ a.docfilterLinkSelected:link, a.docfilterLinkSelected:visited
.docPreview .docPreview
{ {
background-color: #ddebf2;
color: #515D6B; color: #515D6B;
font-family: Trebuchet MS, Arial, Helvetica, sans-serif; font-family: Trebuchet MS, Arial, Helvetica, sans-serif;
overflow: hidden; overflow: hidden;
height: 144px; height: 140px;
width: 410px; width: 406px;
border: 1px solid #0092dd; border: 1px solid #75badd;
padding: 2px;
} }
.docAction .docAction
@@ -344,6 +366,13 @@ a.docfilterLinkSelected:link, a.docfilterLinkSelected:visited
overflow: hidden; overflow: hidden;
} }
a.refreshViewLink
{
padding: 8px 4px 0px 0px;
display: block;
outline: none;
}
a.refreshViewLink:link, a.refreshViewLink:visited, a.refreshViewLink:hover a.refreshViewLink:link, a.refreshViewLink:visited, a.refreshViewLink:hover
{ {
font-family: Trebuchet MS, Arial, Helvetica, sans-serif; font-family: Trebuchet MS, Arial, Helvetica, sans-serif;
@@ -373,4 +402,40 @@ a.refreshViewLink:link, a.refreshViewLink:visited, a.refreshViewLink:hover
background-color: #F8FCFD; background-color: #F8FCFD;
border: 1px solid #CCD4DB; border: 1px solid #CCD4DB;
} }
#docMessagePanel
{
position: absolute;
border: 1px solid #65696C;
background-color: #eeeeee;
width: 250px;
height: 72px;
padding: 8px;
margin-left: 440px;
display: none;
z-index: 1;
-moz-border-radius: 7px;
}
.docMessagePanelClose
{
margin: -4px -4px 2px 2px;
float:right;
}
#docMessagePanelCloseImage
{
cursor: pointer;
display: block;
height: 23px;
width: 23px;
}
.docMessagePanelLabel
{
color: #45494C;
font-family: Trebuchet MS, Arial, Helvetica, sans-serif;
font-size: 12px;
font-weight: bold;
}
</style> </style>

View File

@@ -21,8 +21,8 @@
<a href="${url.context}${d.url}" target="new"><img class="docIconImage" alt="" width="16" height="16" src="${url.context}${d.icon16?replace(".gif",".png")}" border=0></a> <a href="${url.context}${d.url}" target="new"><img class="docIconImage" alt="" width="16" height="16" src="${url.context}${d.icon16?replace(".gif",".png")}" border=0></a>
</div> </div>
<div style="display:none"><img class="docIconImage64" alt="" width="64" height="64" src="${url.context}${d.icon64}"></div> <div style="display:none"><img class="docIconImage64" alt="" width="64" height="64" src="${url.context}${d.icon64}"></div>
<div class="docItem"> <div>
${d.name?html} <a class="docItem" href="${url.context}${d.url}" target="new">${d.name?html}</a>
<span class="docInfo" onclick="event.cancelBubble=true; AlfNodeInfoMgr.toggle('${d.nodeRef}',this);"> <span class="docInfo" onclick="event.cancelBubble=true; AlfNodeInfoMgr.toggle('${d.nodeRef}',this);">
<img src="${url.context}/images/icons/popup.gif" class="popupImage" width="16" height="16" /> <img src="${url.context}/images/icons/popup.gif" class="popupImage" width="16" height="16" />
</span> </span>

View File

@@ -26,13 +26,19 @@
<td align=center height=40 style="border-left: 1px solid #EBE398;"> <td align=center height=40 style="border-left: 1px solid #EBE398;">
<table border="0" cellspacing="8" cellpadding="0" width="100%"> <table border="0" cellspacing="8" cellpadding="0" width="100%">
<tr> <tr>
<th><a class="taskfilterLink <#if filter=0>taskfilterLinkSelected</#if>" href="#" onclick="MyTasks.filter(0); return false;">Tasks to do</a></th> <td>
<th><a class="taskfilterLink <#if filter=1>taskfilterLinkSelected</#if>" href="#" onclick="MyTasks.filter(1); return false;" style="color: #399DF7;">Due Today</a></th> <div id="taskFilterBar">
<th><a class="taskfilterLink <#if filter=2>taskfilterLinkSelected</#if>" href="#" onclick="MyTasks.filter(2); return false;">Next 7 days</a></th> <ul>
<th><a class="taskfilterLink <#if filter=3>taskfilterLinkSelected</#if>" href="#" onclick="MyTasks.filter(3); return false;">No due date</a></th> <li <#if filter=0>class="taskCurrent"</#if>><a href="#" onclick="MyTasks.filter(0); return false;"><span>Tasks to do</span></a></li>
<th><a class="taskfilterLink <#if filter=4>taskfilterLinkSelected</#if>" href="#" onclick="MyTasks.filter(4); return false;" style="color: #DF3704;">Overdue</a></th> <li <#if filter=1>class="taskCurrent"</#if>><a href="#" onclick="MyTasks.filter(1); return false;"><span style="color: #399DF7;">Due Today</span></a></li>
<td width="150" align="right"> <li <#if filter=2>class="taskCurrent"</#if>><a href="#" onclick="MyTasks.filter(2); return false;"><span>Next 7 days</span></a></li>
<a href="#" onclick="MyTasks.refreshList(); return false;" class="refreshViewLink"><img src="${url.context}/images/icons/reset.gif" border="0" width="16" height="16" style="vertical-align:-25%;padding-right:4px">Refresh</a> <li <#if filter=3>class="taskCurrent"</#if>><a href="#" onclick="MyTasks.filter(3); return false;"><span>No due date</span></a></li>
<li <#if filter=4>class="taskCurrent"</#if>><a href="#" onclick="MyTasks.filter(4); return false;"><span style="color: #DF3704;">Overdue</span></a></li>
</ul>
</div>
</td>
<td width="150" align="right" style="padding: 5px 5px 0px 0px;">
<a class="refreshViewLink" href="#" onclick="MyTasks.refreshList(); return false;"><img src="${url.context}/images/icons/reset.gif" border="0" width="16" height="16" style="vertical-align:-25%;padding-right:4px"><span>Refresh</span></a>
</td> </td>
</tr> </tr>
</table> </table>
@@ -52,7 +58,7 @@
<td> <td>
<div id="taskFooter"> <div id="taskFooter">
<#-- the count value is retrieved and set dynamically from the AJAX webscript output above --> <#-- the count value is retrieved and set dynamically from the AJAX webscript output above -->
<span class="taskFooterText">Showing <span id="taskCount">0</span> <#if filter=4>overdue</#if> task(s)<#if filter=1> due today</#if><#if filter=2> due next week</#if><#if filter=3> with no due date set</#if></span> <span onclick="MyTasks.displayMessage('sljfsdfjlsdjifds lsdfj lsidjfoi jsdofij sodfj ');" class="taskFooterText">Showing <span id="taskCount">0</span> <#if filter=4>overdue</#if> task(s)<#if filter=1> due today</#if><#if filter=2> due next week</#if><#if filter=3> with no due date set</#if></span>
</div> </div>
</td> </td>
</tr> </tr>
@@ -61,6 +67,10 @@
<td class="paperEdgeRight">&nbsp;</td> <td class="paperEdgeRight">&nbsp;</td>
</tr> </tr>
</table> </table>
<div id="taskMessagePanel">
<div class="taskMessagePanelClose"><img id="taskMessagePanelCloseImage" src="${url.context}/images/icons/close_portlet_static.gif" onclick="MyTasks.closeMessage();" /></div>
<div class="taskMessagePanelLabel"></div>
</div>
<div style="font-size: 3px;"> <div style="font-size: 3px;">
<span class="paperLeftCorner"></span> <span class="paperLeftCorner"></span>
<span class="paperBottomEdge"></span> <span class="paperBottomEdge"></span>
@@ -110,34 +120,74 @@
overflow: hidden; overflow: hidden;
} }
a.taskfilterLink:link, a.taskfilterLink:visited #taskFilterBar {
float: left;
width: 100%;
}
#taskFilterBar ul {
margin: 0px;
padding: 4px 10px 0px 4px;
list-style: none;
}
#taskFilterBar li {
display: inline;
margin: 0px;
padding: 0px;
height: 27px;
}
#taskFilterBar a {
background: none;
float:left;
margin: 0px;
padding: 0px 0px 0px 4px;
text-decoration: none;
outline: none;
}
#taskFilterBar a span {
background: none;
font-family: Trebuchet MS, Arial, Helvetica, sans-serif;
font-size: 13px;
font-weight: bold;
color: #5A5741;
display: block;
float: none;
padding: 5px 15px 4px 6px;
}
#taskFilterBar a:hover {
background: url("${url.context}/images/parts/marker_effect_left.png") no-repeat left top;
}
#taskFilterBar a:hover span {
background: url("${url.context}/images/parts/marker_effect_right.png") no-repeat right top;
color: #ffffff !important;
}
#taskFilterBar .taskCurrent a {
background: url("${url.context}/images/parts/marker_effect_left.png") no-repeat left top;
}
#taskFilterBar .taskCurrent a span {
background: url("${url.context}/images/parts/marker_effect_right.png") no-repeat right top;
color: #ffffff !important;
}
.refreshViewLink, .refreshViewLink
{
text-decoration: none !important;
}
.refreshViewLink span
{ {
color: #5A5741; color: #5A5741;
font-family: Trebuchet MS, Arial, Helvetica, sans-serif; font-family: Trebuchet MS, Arial, Helvetica, sans-serif;
font-size: 13px; font-size: 13px;
font-weight: bold; font-weight: bold;
text-decoration: none;
padding-left: 4px;
padding-right: 4px;
}
a.taskfilterLink:hover
{
color: #FFFFFF !important;
background-color: #FDB64F;
}
a.taskfilterLinkSelected:link, a.taskfilterLinkSelected:visited
{
color: #FFFFFF !important;
background-color: #FDB64F;
} }
.taskRow .taskRow
{ {
padding-top: 4px; padding-top: 4px;
border-top: 1px solid transparent;
border-bottom: 1px solid #EBE398; border-bottom: 1px solid #EBE398;
border-top: 1px solid #FEF8BC;
} }
#taskFooter #taskFooter
@@ -170,8 +220,8 @@ a.taskfilterLinkSelected:link, a.taskfilterLinkSelected:visited
font-family: Trebuchet MS, Arial, Helvetica, sans-serif; font-family: Trebuchet MS, Arial, Helvetica, sans-serif;
font-size: 14px; font-size: 14px;
color: #5A5741; color: #5A5741;
margin: 0 0 0 24; margin: 0px 0px 0px 24px;
padding: 0px 8px 6px 8px; padding: 0px 8px 8px;
} }
.taskItemOverdue .taskItemOverdue
@@ -199,23 +249,38 @@ a.taskfilterLinkSelected:link, a.taskfilterLinkSelected:visited
font-family: Trebuchet MS, Arial, Helvetica, sans-serif; font-family: Trebuchet MS, Arial, Helvetica, sans-serif;
font-size: 12px; font-size: 12px;
margin: 0px; margin: 0px;
padding: 0px;
display: none; display: none;
overflow: hidden; overflow: hidden;
} }
.taskDetailTopSpacer {
padding: 4px 0px 0px;
}
.taskDetailSeparator
{
border-right: 1px solid #c1af05;
}
.taskItemSelected .taskItemSelected
{ {
background-color: #FFE500 !important; background: #FFE500 url("${url.context}/images/parts/mytasks_arrow_down.png") no-repeat right top;
border-bottom: 1px solid #82770B !important; border-bottom: 1px solid #82770B !important;
border-top: 1px solid #82770B !important; border-top: 1px solid #82770B !important;
} }
.taskItemSelectedOpen
{
background-image: url("${url.context}/images/parts/mytasks_arrow_up.png") !important;
}
.taskResources .taskResources
{ {
border: 1px solid #FFE500; border: 1px solid #FFE500;
background-color: #FEF8BC; background-color: #fff;
margin: 4px 0px 0px 0px; margin: 4px 0px 0px 0px;
width: 360px; width: 300px;
height: 80px; height: 80px;
display: block; display: block;
overflow: hidden; overflow: hidden;
@@ -227,7 +292,7 @@ a.taskfilterLinkSelected:link, a.taskfilterLinkSelected:visited
.taskResourceOdd .taskResourceOdd
{ {
background-color: #F8FCFD; background-color: #FEF8BC;
} }
.taskResourceHeader .taskResourceHeader
@@ -251,33 +316,90 @@ a.resourceLink:link, a.resourceLink:visited
font-family: Trebuchet MS, Arial, Helvetica, sans-serif; font-family: Trebuchet MS, Arial, Helvetica, sans-serif;
} }
.taskActions td .taskAction
{ {
padding: 4px; margin: 0px;
padding: 0px;
} }
a.taskAction:link, a.taskAction:visited .taskAction ul {
{ margin: 0px;
color: #5A5741; padding: 0px;
font-size: 13px; list-style: none;
font-weight: bold; text-align: center;
font-family: Trebuchet MS, Arial, Helvetica, sans-serif; }
border: 1px solid #F6F1BA; .taskAction ul li {
padding-left: 4px; display: inline;
padding-right: 4px; margin: 0px;
padding: 0px;
list-style: none;
} }
a.taskAction:hover .taskAction a {
{ background: url("${url.context}/images/parts/task_btn_normal_right.png") no-repeat 100% 0;
font-size: 13px; float: left;
font-weight: bold; margin: 4px;
font-family: Trebuchet MS, Arial, Helvetica, sans-serif; padding: 0px;
border: 1px solid #F6F1BA;
padding-left: 4px;
padding-right: 4px;
color: #FFFFFF;
background-color: #FDB64F;
text-decoration: none; text-decoration: none;
cursor: pointer;
}
.taskAction a span {
background: url("${url.context}/images/parts/task_btn_normal_left.png") no-repeat;
font-family: Trebuchet MS, Arial, Helvetica, sans-serif;
font-size: 11px;
font-weight: bold;
color: #5A5741;
padding: 4px 1.5em;
float: left;
}
.taskAction a:hover {
background: url("${url.context}/images/parts/task_btn_rollover_right.png") no-repeat 100% 0;
text-decoration: none;
}
.taskAction a:hover span {
background: url("${url.context}/images/parts/task_btn_rollover_left.png") no-repeat;
}
.taskManage ul {
margin: 0px;
padding: 4px 0px 0px;
list-style: none;
}
.taskManage li {
display: inline;
margin: 0px;
padding: 0px;
height: 27px;
}
.taskManage a {
background: url("${url.context}/images/parts/task_btn_normal_left.png") no-repeat left top;
float:left;
margin: 0px;
padding: 0px 0px 0px 8px;
text-decoration: none;
cursor: pointer;
}
.taskManage a span {
background: url("${url.context}/images/parts/task_btn_normal_right.png") no-repeat right top;
font-family: Trebuchet MS, Arial, Helvetica, sans-serif;
font-size: 11px;
font-weight: bold;
color: #5A5741;
display: block;
float: none;
padding: 4px 15px 4px 6px;
}
.taskManage a:hover {
background: url("${url.context}/images/parts/task_btn_rollover_left.png") no-repeat left top;
text-decoration: none;
}
.taskManage a:hover span {
background: url("${url.context}/images/parts/task_btn_rollover_right.png") no-repeat right top;
} }
.taskMetadata .taskMetadata
@@ -321,4 +443,41 @@ a.taskAction:hover
height: 6px; height: 6px;
width: 4px; width: 4px;
} }
#taskMessagePanel
{
position: absolute;
border: 1px solid #65696C;
background-color: #eeeeee;
width: 250px;
height: 72px;
padding: 8px;
margin-left: 440px;
display: none;
z-index: 1;
-moz-border-radius: 7px;
}
.taskMessagePanelClose
{
margin: -4px -4px 2px 2px;
float:right;
}
#taskMessagePanelCloseImage
{
cursor: pointer;
display: block;
height: 23px;
width: 23px;
}
.taskMessagePanelLabel
{
color: #45494C;
font-family: Trebuchet MS, Arial, Helvetica, sans-serif;
font-size: 12px;
font-weight: bold;
}
</style> </style>

View File

@@ -43,39 +43,57 @@
</div> </div>
</div> </div>
<div class="taskDetail"> <div class="taskDetail">
<div class="taskDetailTopSpacer"></div>
<table border="0" cellpadding="0" cellspacing="0" width="100%"> <table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr> <tr>
<td width="182"> <td width="190" class="taskDetailSeparator">
<table cellpadding="2" cellspacing="2" style="margin-left:24px; margin-top:4px"> <table cellpadding="2" cellspacing="2" style="margin-left:24px; margin-top:4px">
<tr><td class="taskMetaprop">Status:</td><td class="taskMetadata">${t.properties["bpm:status"]}</td> <tr><td class="taskMetaprop">Status:</td><td class="taskMetadata">${t.properties["bpm:status"]}</td>
<tr><td class="taskMetaprop">Priority:</td><td class="taskMetadata">${t.properties["bpm:priority"]}</td> <tr><td class="taskMetaprop">Priority:</td><td class="taskMetadata">${t.properties["bpm:priority"]}</td>
<tr><td class="taskMetaprop">Start Date:</td><td class="taskMetadata">${t.startDate?date}</td></tr> <tr><td class="taskMetaprop">Start Date:</td><td class="taskMetadata">${t.startDate?date}</td></tr>
<tr><td class="taskMetaprop">Type:</td><td class="taskMetadata">${t.type?html}</td></tr>
<tr><td class="taskMetaprop">Complete:</td><td class="taskMetadata">${t.properties["bpm:percentComplete"]}%</td> <tr><td class="taskMetaprop">Complete:</td><td class="taskMetadata">${t.properties["bpm:percentComplete"]}%</td>
</table> </table>
</td> </td>
<td width="8">&nbsp;</td> <td width="8">&nbsp;</td>
<td width="360"> <td width="300">
<div class="taskResourceHeader">${t.name?html}:</div> <div class="taskResourceHeader">${t.name?html}:</div>
<div class="taskResources"></div> <div class="taskResources"></div>
<table border="0" class="taskActions"> </td>
<td width="8" class="taskDetailSeparator">&nbsp;</td>
<td align="center">
<table cellpadding="0" cellspacing="0" border="0">
<tr> <tr>
<#list t.transitions as wt> <td>
<td style="text-align: left"><a class="taskAction" href="#" onclick="event.cancelBubble=true; MyTasks.transitionTask('/command/task/end/${t.id}<#if wt.id?exists>/${wt.id}</#if>', 'Workflow action \'${wt.label?html}\' completed.');">${wt.label?html}</a></td> <div class="taskManage">
</#list> <ul>
<td width="70">&nbsp;</td> <li><a href="#" onclick="event.cancelBubble=true; openWindowCallback('${url.context}/command/ui/managetask?id=${t.id}&amp;type=${t.qnameType}&amp;container=plain', MyTasks.manageTaskCallback);"><span><img src="${url.context}/images/icons/manage_workflow_task.gif" align="top" alt="" border="0"> Manage Task</span></a></li>
</ul>
</div>
</td>
</tr> </tr>
</table> </table>
</td> </td>
<td width="16">&nbsp;</td> </tr>
<tr>
<td colspan="2">&nbsp;</td>
<td width="300" align="center">
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td> <td>
<div class="taskMetaprop" style="padding-bottom: 4px;">Manage Task</div> <div class="taskAction">
<a class="taskAction" style="display: block; width: 18px; padding: 4px; margin-left: 20px;" onclick="event.cancelBubble=true;" href="${url.context}/command/ui/managetask?id=${t.id}&type=${t.qnameType}&container=plain" target="new"><img src="${url.context}/images/icons/manage_workflow_task.gif" width="16" height="16" border="0" alt="Manage Task Details" title="Manage Task Details"></a> <ul>
<br> <#list t.transitions as wt>
<br> <li><a href="#" onclick="event.cancelBubble=true; MyTasks.transitionTask('/command/task/end/${t.id}<#if wt.id?exists>/${wt.id}</#if>', 'Workflow action \'${wt.label?html}\' completed.');"><span>${wt.label?html}</span></a></li>
</#list>
</ul>
</div>
</td> </td>
</tr> </tr>
</table> </table>
</td>
<td colspan="2">&nbsp;</td>
</tr>
</table>
</div> </div>
</div> </div>
</#if> </#if>

View File

@@ -48,7 +48,7 @@
<div class="formsRow"> <div class="formsRow">
<img src="${url.context}/images/icons/webform_large.gif" width=32 height=32 border=0> <img src="${url.context}/images/icons/webform_large.gif" width=32 height=32 border=0>
<a class="webformLink" href="${url.context}/c/ui/createwebcontent?sandbox=${sandbox}&webproject=${wp.id}&form=${form.properties["wca:formname"]}&container=plain" target="new">${form.properties.title}</a> <a class="webformLink" href="${url.context}/c/ui/createwebcontent?sandbox=${sandbox}&webproject=${wp.id}&form=${form.properties["wca:formname"]}&container=plain" target="new">${form.properties.title}</a>
<#if form.properties.description?length!=0> <#if (form.properties.description?exists) && (form.properties.description?length!=0)>
<span style="vertical-align:50%">(${form.properties.description})</span> <span style="vertical-align:50%">(${form.properties.description})</span>
</#if> </#if>
</div> </div>

View File

@@ -321,8 +321,6 @@
<aspect name="summarizable"/> <aspect name="summarizable"/>
<aspect name="versionable"/> <aspect name="versionable"/>
<aspect name="templatable"/> <aspect name="templatable"/>
<aspect name="translatable"/>
<aspect name="localizable"/>
<aspect name="emailed"/> <aspect name="emailed"/>
</aspects> </aspects>
<!-- List of aspects to only show in the add features action --> <!-- List of aspects to only show in the add features action -->

View File

@@ -60,6 +60,7 @@ import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.ResultSetRow; import org.alfresco.service.cmr.search.ResultSetRow;
import org.alfresco.service.cmr.search.SearchParameters; import org.alfresco.service.cmr.search.SearchParameters;
import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.web.app.Application; import org.alfresco.web.app.Application;
import org.alfresco.web.app.context.IContextListener; import org.alfresco.web.app.context.IContextListener;
@@ -787,6 +788,10 @@ public class BrowseBean implements IContextListener
{ {
// create our File Link Node representation // create our File Link Node representation
node = new MapNode(nodeRef, this.nodeService, fileInfo.getProperties()); node = new MapNode(nodeRef, this.nodeService, fileInfo.getProperties());
// only display the user has the permissions to navigate to the target of the link
NodeRef destRef = (NodeRef)node.getProperties().get(ContentModel.PROP_LINK_DESTINATION);
if (new Node(destRef).hasPermission(PermissionService.READ) == true)
{
node.addPropertyResolver("url", this.resolverLinkUrl); node.addPropertyResolver("url", this.resolverLinkUrl);
node.addPropertyResolver("webdavUrl", this.resolverLinkWebdavUrl); node.addPropertyResolver("webdavUrl", this.resolverLinkWebdavUrl);
node.addPropertyResolver("cifsPath", this.resolverLinkCifsPath); node.addPropertyResolver("cifsPath", this.resolverLinkCifsPath);
@@ -797,15 +802,21 @@ public class BrowseBean implements IContextListener
this.contentNodes.add(node); this.contentNodes.add(node);
} }
}
else if (ApplicationModel.TYPE_FOLDERLINK.equals(type)) else if (ApplicationModel.TYPE_FOLDERLINK.equals(type))
{ {
// create our Folder Link Node representation // create our Folder Link Node representation
node = new MapNode(nodeRef, this.nodeService, fileInfo.getProperties()); node = new MapNode(nodeRef, this.nodeService, fileInfo.getProperties());
// only display the user has the permissions to navigate to the target of the link
NodeRef destRef = (NodeRef)node.getProperties().get(ContentModel.PROP_LINK_DESTINATION);
if (new Node(destRef).hasPermission(PermissionService.READ) == true)
{
node.addPropertyResolver("icon", this.resolverSpaceIcon); node.addPropertyResolver("icon", this.resolverSpaceIcon);
node.addPropertyResolver("smallIcon", this.resolverSmallIcon); node.addPropertyResolver("smallIcon", this.resolverSmallIcon);
this.containerNodes.add(node); this.containerNodes.add(node);
} }
}
// inform any listeners that a Node wrapper has been created // inform any listeners that a Node wrapper has been created
if (node != null) if (node != null)
@@ -954,6 +965,10 @@ public class BrowseBean implements IContextListener
{ {
// create our File Link Node representation // create our File Link Node representation
node = new MapNode(nodeRef, this.nodeService, false); node = new MapNode(nodeRef, this.nodeService, false);
// only display the user has the permissions to navigate to the target of the link
NodeRef destRef = (NodeRef)node.getProperties().get(ContentModel.PROP_LINK_DESTINATION);
if (new Node(destRef).hasPermission(PermissionService.READ) == true)
{
node.addPropertyResolver("url", this.resolverLinkUrl); node.addPropertyResolver("url", this.resolverLinkUrl);
node.addPropertyResolver("webdavUrl", this.resolverLinkWebdavUrl); node.addPropertyResolver("webdavUrl", this.resolverLinkWebdavUrl);
node.addPropertyResolver("cifsPath", this.resolverLinkCifsPath); node.addPropertyResolver("cifsPath", this.resolverLinkCifsPath);
@@ -966,10 +981,15 @@ public class BrowseBean implements IContextListener
this.contentNodes.add(node); this.contentNodes.add(node);
} }
}
else if (ApplicationModel.TYPE_FOLDERLINK.equals(type)) else if (ApplicationModel.TYPE_FOLDERLINK.equals(type))
{ {
// create our Folder Link Node representation // create our Folder Link Node representation
node = new MapNode(nodeRef, this.nodeService, false); node = new MapNode(nodeRef, this.nodeService, false);
// only display the user has the permissions to navigate to the target of the link
NodeRef destRef = (NodeRef)node.getProperties().get(ContentModel.PROP_LINK_DESTINATION);
if (new Node(destRef).hasPermission(PermissionService.READ) == true)
{
node.addPropertyResolver("icon", this.resolverSpaceIcon); node.addPropertyResolver("icon", this.resolverSpaceIcon);
node.addPropertyResolver("smallIcon", this.resolverSmallIcon); node.addPropertyResolver("smallIcon", this.resolverSmallIcon);
node.addPropertyResolver("path", this.resolverPath); node.addPropertyResolver("path", this.resolverPath);
@@ -977,6 +997,7 @@ public class BrowseBean implements IContextListener
this.containerNodes.add(node); this.containerNodes.add(node);
} }
}
// inform any listeners that a Node wrapper has been created // inform any listeners that a Node wrapper has been created
if (node != null) if (node != null)

View File

@@ -416,7 +416,7 @@ public class SubmitDialog extends BaseDialogBean
diffs.add(diff); diffs.add(diff);
// recursively remove locks from this item // recursively remove locks from this item
recursivelyRemoveLocks(storeId, -1, srcPath); recursivelyRemoveLocks(storeId, -1, this.avmService.lookup(-1, srcPath, true), srcPath);
// If nothing has required notifying the virtualization server // If nothing has required notifying the virtualization server
// so far, check to see if destPath forces a notification // so far, check to see if destPath forces a notification
@@ -635,9 +635,8 @@ public class SubmitDialog extends BaseDialogBean
* Recursively remove locks from a path. Walking child folders looking for files * Recursively remove locks from a path. Walking child folders looking for files
* to remove locks from. * to remove locks from.
*/ */
private void recursivelyRemoveLocks(String webProject, int version, String path) private void recursivelyRemoveLocks(String webProject, int version, AVMNodeDescriptor desc, String path)
{ {
AVMNodeDescriptor desc = this.avmService.lookup(version, path, true);
if (desc.isFile() || desc.isDeletedFile()) if (desc.isFile() || desc.isDeletedFile())
{ {
this.avmLockingService.removeLock(webProject, path.substring(path.indexOf(":") + 1)); this.avmLockingService.removeLock(webProject, path.substring(path.indexOf(":") + 1));
@@ -655,10 +654,12 @@ public class SubmitDialog extends BaseDialogBean
desc = history.get(1); desc = history.get(1);
} }
Map<String, AVMNodeDescriptor> list = avmService.getDirectoryListing(desc, true); Map<String, AVMNodeDescriptor> list = avmService.getDirectoryListingDirect(desc, true);
for (AVMNodeDescriptor child : list.values()) for (Map.Entry<String, AVMNodeDescriptor> child : list.entrySet())
{ {
recursivelyRemoveLocks(webProject, version, child.getPath()); String name = child.getKey();
AVMNodeDescriptor childDesc = child.getValue();
recursivelyRemoveLocks(webProject, version, childDesc, path + "/" + name);
} }
} }
} }

View File

@@ -42,6 +42,8 @@ import javax.transaction.UserTransaction;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.cmr.security.AuthorityService; import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.AuthorityType; import org.alfresco.service.cmr.security.AuthorityType;
import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.security.PermissionService;
@@ -301,16 +303,12 @@ public abstract class InviteUsersWizard extends BaseWizardBean
{ {
// build xpath to match available User/Person objects // build xpath to match available User/Person objects
NodeRef peopleRef = personService.getPeopleContainer(); NodeRef peopleRef = personService.getPeopleContainer();
// NOTE: see SearcherComponentTest
String xpath = "*[like(@" + NamespaceService.CONTENT_MODEL_PREFIX + ":" + "firstName, '%" + contains + "%', false)" +
" or " + "like(@" + NamespaceService.CONTENT_MODEL_PREFIX + ":" + "lastName, '%" + contains + "%', false)]";
List<NodeRef> nodes = searchService.selectNodes( // Use lucene search to retrieve user details
peopleRef, String lucene = "@" + NamespaceService.CONTENT_MODEL_PREFIX + "\\:firstName:*" + contains + "* " +
xpath, "@" + NamespaceService.CONTENT_MODEL_PREFIX + "\\:lastName:*" + contains + "* ";
null, ResultSet resultSet = searchService.query(peopleRef.getStoreRef(), SearchService.LANGUAGE_LUCENE, lucene);
this.namespaceService, List<NodeRef> nodes = resultSet.getNodeRefs();
false);
items = new SelectItem[nodes.size()]; items = new SelectItem[nodes.size()];
for (int index=0; index<nodes.size(); index++) for (int index=0; index<nodes.size(); index++)

View File

@@ -45,6 +45,7 @@ import org.alfresco.model.ContentModel;
import org.alfresco.repo.workflow.WorkflowModel; import org.alfresco.repo.workflow.WorkflowModel;
import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.service.cmr.dictionary.PropertyDefinition;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.workflow.WorkflowDefinition; import org.alfresco.service.cmr.workflow.WorkflowDefinition;
import org.alfresco.service.cmr.workflow.WorkflowPath; import org.alfresco.service.cmr.workflow.WorkflowPath;
import org.alfresco.service.cmr.workflow.WorkflowService; import org.alfresco.service.cmr.workflow.WorkflowService;
@@ -86,8 +87,15 @@ public class StartWorkflowWizard extends BaseWizardBean
protected boolean isItemBeingAdded = false; protected boolean isItemBeingAdded = false;
protected boolean nextButtonDisabled = false; protected boolean nextButtonDisabled = false;
protected NodeService unprotectedNodeService;
private static final Log logger = LogFactory.getLog(StartWorkflowWizard.class); private static final Log logger = LogFactory.getLog(StartWorkflowWizard.class);
public void setUnprotectedNodeService(NodeService unprotectedNodeService)
{
this.unprotectedNodeService = unprotectedNodeService;
}
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
// Wizard implementation // Wizard implementation
@@ -159,7 +167,7 @@ public class StartWorkflowWizard extends BaseWizardBean
for (String addedItem : this.packageItemsToAdd) for (String addedItem : this.packageItemsToAdd)
{ {
NodeRef addedNodeRef = new NodeRef(addedItem); NodeRef addedNodeRef = new NodeRef(addedItem);
this.nodeService.addChild(workflowPackage, addedNodeRef, this.unprotectedNodeService.addChild(workflowPackage, addedNodeRef,
ContentModel.ASSOC_CONTAINS, QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, ContentModel.ASSOC_CONTAINS, QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI,
QName.createValidLocalName((String)this.nodeService.getProperty( QName.createValidLocalName((String)this.nodeService.getProperty(
addedNodeRef, ContentModel.PROP_NAME)))); addedNodeRef, ContentModel.PROP_NAME))));

View File

@@ -41,6 +41,7 @@ import org.chiba.xml.ns.NamespaceConstants;
import org.chiba.xml.events.XFormsEventNames; import org.chiba.xml.events.XFormsEventNames;
import org.chiba.xml.events.XMLEvent; import org.chiba.xml.events.XMLEvent;
import org.chiba.xml.xforms.ChibaBean; import org.chiba.xml.xforms.ChibaBean;
import org.chiba.xml.xforms.exception.XFormsException;
import org.chiba.xml.xforms.XFormsElement; import org.chiba.xml.xforms.XFormsElement;
import org.chiba.xml.events.DOMEventNames; import org.chiba.xml.events.DOMEventNames;
import org.w3c.dom.*; import org.w3c.dom.*;
@@ -96,6 +97,25 @@ public class Schema2XFormsTest
assertEquals("test", ((Element)pointer.getNode()).getTextContent()); assertEquals("test", ((Element)pointer.getNode()).getTextContent());
} }
public void testNumbers()
throws Exception
{
final Document schemaDocument = this.loadTestResourceDocument("xforms/unit-tests/automated/number-test.xsd");
final Document xformsDocument = Schema2XFormsTest.buildXForm(null, schemaDocument, "number-test");
System.err.println("generated xform " + XMLUtil.toString(xformsDocument));
final Element[] repeatedNumbers = Schema2XFormsTest.resolveXFormsControl(xformsDocument, "/number-test/repeated_numbers");
final ChibaBean chibaBean = this.runXForm(xformsDocument);
try
{
chibaBean.dispatch(repeatedNumbers[0].getAttribute("id") + "-insert_before", DOMEventNames.ACTIVATE);
fail("expected to reproduce WCM-778");
}
catch (XFormsException bindingIssue)
{
// tracked as WCM-778
}
}
public void testRepeatConstraintsTest() public void testRepeatConstraintsTest()
throws Exception throws Exception
{ {

View File

@@ -35,6 +35,15 @@
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
</xs:element> </xs:element>
<xs:element name="implicitly_bounded_int" type="xs:int"/>
<xs:element name="repeated_numbers" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="repeated_integer" type="xs:integer"/>
<xs:element name="repeated_int" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence> </xs:sequence>
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>

View File

@@ -4,7 +4,7 @@
<xs:complexType name="multi-input"> <xs:complexType name="multi-input">
<xs:sequence> <xs:sequence>
<xs:element name="string" type="xs:normalizedString"/> <xs:element name="string" type="xs:normalizedString"/>
<xs:element name="int" type="xs:int"/> <xs:element name="integer" type="xs:integer"/>
</xs:sequence> </xs:sequence>
</xs:complexType> </xs:complexType>
<xs:element name="repeat-multi-simple"> <xs:element name="repeat-multi-simple">

View File

@@ -2174,6 +2174,10 @@
<managed-property> <managed-property>
<property-name>workflowService</property-name> <property-name>workflowService</property-name>
<value>#{WorkflowService}</value> <value>#{WorkflowService}</value>
</managed-property>
<managed-property>
<property-name>unprotectedNodeService</property-name>
<value>#{nodeService}</value>
</managed-property> </managed-property>
</managed-bean> </managed-bean>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1001 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 B

View File

@@ -35,9 +35,9 @@
tinyMCE.init({ tinyMCE.init({
theme : "advanced", theme : "advanced",
mode : "exact", mode : "exact",
relative_urls: false,
elements : "editor", elements : "editor",
save_callback : "saveContent", save_callback : "saveContent",
urlconverter_callback: "convertUrl",
plugins : "table", plugins : "table",
theme_advanced_toolbar_location : "top", theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "left", theme_advanced_toolbar_align : "left",
@@ -53,13 +53,6 @@
document.getElementById("wizard:wizard-body:editor-output").value = content; document.getElementById("wizard:wizard-body:editor-output").value = content;
} }
function convertUrl(href, element, onsave)
{
// just return the passed href, this is enough to stop TinyMCE
// from converting the URL to it's relative form
return href;
}
var isIE = (document.all); var isIE = (document.all);
</script> </script>

View File

@@ -41,9 +41,9 @@
tinyMCE.init({ tinyMCE.init({
theme : "advanced", theme : "advanced",
mode : "exact", mode : "exact",
relative_urls: false,
elements : "editor", elements : "editor",
save_callback : "saveContent", save_callback : "saveContent",
urlconverter_callback: "convertUrl",
plugins : "table", plugins : "table",
theme_advanced_toolbar_location : "top", theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "left", theme_advanced_toolbar_align : "left",
@@ -58,14 +58,6 @@
{ {
document.forms['edit-file']['edit-file:editorOutput'].value = content; document.forms['edit-file']['edit-file:editorOutput'].value = content;
} }
function convertUrl(href, element, onsave)
{
// just return the passed href, this is enough to stop TinyMCE
// from converting the URL to it's relative form
return href;
}
</script> </script>

View File

@@ -517,7 +517,7 @@ function openWindowCallback(url, callback)
// Register our "well known" callback function // Register our "well known" callback function
window.alfrescoCallback = openWindowOnCallback; window.alfrescoCallback = openWindowOnCallback;
// Use a named window so that only one dialog is active at a time // Use a named window so that only one dialog is active at a time
window.open(url, 'alfrescoDialog', 'width=1024,height=768'); window.open(url, 'alfrescoDialog', 'width=1024,height=768,scrollbars=yes');
} }
function openWindowOnCallback(fromTimeout) function openWindowOnCallback(fromTimeout)

View File

@@ -2,7 +2,7 @@ var MyDocs = {
IMG_SMALL: 16, IMG_SMALL: 16,
IMG_LARGE: 64, IMG_LARGE: 64,
ANIM_LENGTH: 300, ANIM_LENGTH: 300,
DETAIL_MARGIN: 56, DETAIL_MARGIN: 8,
TITLE_FONT_SIZE: 18, TITLE_FONT_SIZE: 18,
RESOURCE_PANEL_HEIGHT: 150, RESOURCE_PANEL_HEIGHT: 150,
OVERLAY_OPACITY: 0.8, OVERLAY_OPACITY: 0.8,
@@ -20,6 +20,11 @@ var MyDocs = {
// show AJAX loading overlay // show AJAX loading overlay
$('docPanelOverlayAjax').setStyle('visibility', 'visible'); $('docPanelOverlayAjax').setStyle('visibility', 'visible');
$('docPanel').setStyle('visibility', 'hidden'); $('docPanel').setStyle('visibility', 'hidden');
var messagePanel = $('docMessagePanel');
messagePanel.setStyle('opacity', 0);
messagePanel.setStyle('display', 'block');
// fire off the ajax request to populate the doc list - the 'doclistpanel' webscript // fire off the ajax request to populate the doc list - the 'doclistpanel' webscript
// is responsible for rendering just the contents of the main panel div // is responsible for rendering just the contents of the main panel div
YAHOO.util.Connect.asyncRequest( YAHOO.util.Connect.asyncRequest(
@@ -252,6 +257,8 @@ var MyDocs = {
if (!doc.isOpen) if (!doc.isOpen)
{ {
doc.addClass("docItemSelectedOpen");
if (!resource.isLoaded) if (!resource.isLoaded)
{ {
// fire off the ajax request to get the resources for this task // fire off the ajax request to get the resources for this task
@@ -333,6 +340,8 @@ var MyDocs = {
// reset selected class? // reset selected class?
otherDoc.removeClass('docItemSelected'); otherDoc.removeClass('docItemSelected');
otherDoc.removeClass("docItemSelectedOpen");
// move the title back to the left? // move the title back to the left?
var ml = otherItem.getStyle('margin-left').toInt(); var ml = otherItem.getStyle('margin-left').toInt();
if (ml != otherItem.defMarginLeft) if (ml != otherItem.defMarginLeft)
@@ -389,6 +398,8 @@ var MyDocs = {
// flag this document as closed // flag this document as closed
doc.isOpen = false; doc.isOpen = false;
doc.removeClass("docItemSelectedOpen");
// reset resource panel back to it's default height // reset resource panel back to it's default height
animResource[i] = { animResource[i] = {
'height': [resourceHeight, resource.defHeight], 'height': [resourceHeight, resource.defHeight],
@@ -523,6 +534,7 @@ var MyDocs = {
if (response.responseText.indexOf("OK:") == 0) if (response.responseText.indexOf("OK:") == 0)
{ {
MyDocs.refreshList(); MyDocs.refreshList();
MyDocs.displayMessage("A working copy for the checked out item 'Working Copy of " + name + "' has been created.");
} }
else else
{ {
@@ -557,6 +569,7 @@ var MyDocs = {
if (response.responseText.indexOf("OK:") == 0) if (response.responseText.indexOf("OK:") == 0)
{ {
MyDocs.refreshList(); MyDocs.refreshList();
MyDocs.displayMessage("Item 'Working Copy of " + name + "' has been checked in.");
} }
else else
{ {
@@ -764,6 +777,71 @@ var MyDocs = {
{ {
// Refresh the inner panel // Refresh the inner panel
MyDocs.refreshList(true); MyDocs.refreshList(true);
},
/**
* Display a message bubble of helpful info to the user. Calling this function in quick
* succession will cause previous message to be lost as the new ones are displayed.
*
* @param message Message text to display
*/
displayMessage: function(message)
{
var panel = $("docMessagePanel");
if ($defined(panel.timeout))
{
clearTimeout(panel.timeout);
panel.timeout = null;
}
panel.setStyle("opacity", 0);
panel.setStyle("margin-top", -60);
panel.getChildren()[1].setHTML(message);
// reset the close box animation by refreshing the image source
$("docMessagePanelCloseImage").src = getContextPath() + "/images/icons/close_portlet_animation.gif";
panel.fxMessage = new Fx.Styles(panel,
{
duration: 1000,
transition: Fx.Transitions.sineInOut
});
panel.fxMessage.start({'margin-top': -40, 'opacity': [0, 0.75]});
panel.timeout = window.setTimeout(this.fadeOutMessage, 9000);
},
/**
* Timer callback function to fade out the message panel
*/
fadeOutMessage: function()
{
var panel = $("docMessagePanel");
panel.timeout = null;
var fxMessage = new Fx.Styles(panel,
{
duration: 1000,
transition: Fx.Transitions.sineInOut
});
fxMessage.start({'margin-top': -60, 'opacity': [0]});
},
/**
* Close the message panel immediately when the user clicks the close icon
*/
closeMessage: function()
{
var panel = $("docMessagePanel");
if ($defined(panel.timeout))
{
clearTimeout(panel.timeout);
panel.timeout = null;
}
panel.fxMessage.stop();
panel.setStyle("opacity", 0);
} }
}; };

View File

@@ -1,6 +1,6 @@
var MyTasks = { var MyTasks = {
ANIM_LENGTH: 300, ANIM_LENGTH: 300,
DETAIL_PANEL_HEIGHT: 132, DETAIL_PANEL_HEIGHT: 137,
Filter: null, Filter: null,
ServiceContext: null, ServiceContext: null,
@@ -8,6 +8,10 @@ var MyTasks = {
{ {
if ($('taskPanel')) if ($('taskPanel'))
{ {
var messagePanel = $("taskMessagePanel");
messagePanel.setStyle('opacity', 0);
messagePanel.setStyle('display', 'block');
// fire off the ajax request to populate the task panel - the 'mytaskspanel' webscript // fire off the ajax request to populate the task panel - the 'mytaskspanel' webscript
// is responsible for rendering just the contents of the main panel div // is responsible for rendering just the contents of the main panel div
YAHOO.util.Connect.asyncRequest( YAHOO.util.Connect.asyncRequest(
@@ -45,6 +49,12 @@ var MyTasks = {
// hide the ajax wait panel and show the main task panel // hide the ajax wait panel and show the main task panel
$('taskPanelOverlay').setStyle('visibility', 'hidden'); $('taskPanelOverlay').setStyle('visibility', 'hidden');
$('taskPanel').setStyle('visibility', 'visible'); $('taskPanel').setStyle('visibility', 'visible');
if (MyTasks.postInit)
{
MyTasks.postInit();
MyTasks.postInit = null;
}
}, },
parseTaskPanels: function() parseTaskPanels: function()
@@ -170,6 +180,8 @@ var MyTasks = {
// open up this task // open up this task
// flag this task as open // flag this task as open
task.isOpen = true; task.isOpen = true;
task.addClass("taskItemSelected");
task.addClass("taskItemSelectedOpen");
if (task.loadingResources == false) if (task.loadingResources == false)
{ {
@@ -212,6 +224,7 @@ var MyTasks = {
// unhighlight the item title // unhighlight the item title
otherTask.removeClass('taskItemSelected'); otherTask.removeClass('taskItemSelected');
otherTask.removeClass("taskItemSelectedOpen");
// does this task detail panel need resetting back to it's default height? // does this task detail panel need resetting back to it's default height?
var otherHeight = otherDetail.getStyle('height').toInt(); var otherHeight = otherDetail.getStyle('height').toInt();
@@ -237,6 +250,7 @@ var MyTasks = {
// close this task // close this task
// flag this task as closed // flag this task as closed
task.isOpen = false; task.isOpen = false;
task.removeClass("taskItemSelectedOpen");
// fade in info button // fade in info button
animInfo[i] = {'opacity': [infoOpacity, 1]}; animInfo[i] = {'opacity': [infoOpacity, 1]};
@@ -292,21 +306,39 @@ var MyTasks = {
); );
}, },
displayMessage: function(message)
{
var footer = $('taskFooter');
if (footer.oldMessage == undefined)
{
footer.oldMessage = footer.innerHTML;
}
footer.innerHTML = message + ' ' + footer.oldMessage;
},
/** /**
* Refresh the main data list contents within the taskPanel container * Refresh the main data list contents within the taskPanel container
*/ */
refreshList: function() refreshList: function(reopenActive)
{ {
// do we want to remember which panel was open?
if (reopenActive)
{
// do we have an open panel?
var openPanel = $E('#taskPanel .taskItemSelected');
var openPanelId = null;
if (openPanel != null)
{
openPanelId = openPanel.id;
// Re-open the panel if the id still exists
MyTasks.postInit = function()
{
if ($(openPanelId))
{
$(openPanelId).fireEvent("click");
// scroll the open panel into view
var fxScroll = new Fx.Scroll($('taskPanel'),
{
duration: MyTasks.ANIM_LENGTH,
transition: Fx.Transitions.linear
});
fxScroll.toElement($(openPanelId));
}
}
}
}
// empty the main panel div and restart by reloading the panel contents // empty the main panel div and restart by reloading the panel contents
var taskPanel = $('taskPanel'); var taskPanel = $('taskPanel');
taskPanel.setStyle('visibility', 'hidden'); taskPanel.setStyle('visibility', 'hidden');
@@ -322,15 +354,15 @@ var MyTasks = {
*/ */
filter: function(filter) filter: function(filter)
{ {
$$('.taskfilterLink').each(function(filterLink, i) $$('#taskFilterBar li').each(function(filterLink, i)
{ {
if (i == filter) if (i == filter)
{ {
filterLink.addClass("taskfilterLinkSelected"); filterLink.addClass("taskCurrent");
} }
else else
{ {
filterLink.removeClass("taskfilterLinkSelected"); filterLink.removeClass("taskCurrent");
} }
}); });
MyTasks.Filter = filter; MyTasks.Filter = filter;
@@ -361,8 +393,81 @@ var MyTasks = {
var x = a.dueDate; var x = a.dueDate;
var y = b.dueDate; var y = b.dueDate;
return ((x < y) ? -1 : ((x > y) ? 1 : 0)); return ((x < y) ? -1 : ((x > y) ? 1 : 0));
},
/**
* Called when the Manage Task dialog returns
*/
manageTaskCallback: function()
{
// The manage task dialog window has closed
MyTasks.refreshList(true);
},
/**
* Display a message bubble of helpful info to the user. Calling this function in quick
* succession will cause previous message to be lost as the new ones are displayed.
*
* @param message Message text to display
*/
displayMessage: function(message)
{
var panel = $("taskMessagePanel");
if ($defined(panel.timeout))
{
clearTimeout(panel.timeout);
panel.timeout = null;
} }
panel.setStyle("opacity", 0);
panel.setStyle("margin-top", -90);
panel.getChildren()[1].setHTML(message);
// reset the close box animation by refreshing the image source
$("taskMessagePanelCloseImage").src = getContextPath() + "/images/icons/close_portlet_animation.gif";
panel.fxMessage = new Fx.Styles(panel,
{
duration: 1000,
transition: Fx.Transitions.sineInOut
});
panel.fxMessage.start({'margin-top': -70, 'opacity': [0, 0.75]});
panel.timeout = window.setTimeout(this.fadeOutMessage, 9000);
},
/**
* Timer callback function to fade out the message panel
*/
fadeOutMessage: function()
{
var panel = $("taskMessagePanel");
panel.timeout = null;
var fxMessage = new Fx.Styles(panel,
{
duration: 1000,
transition: Fx.Transitions.sineInOut
});
fxMessage.start({'margin-top': -90, 'opacity': [0]});
},
/**
* Close the message panel immediately when the user clicks the close icon
*/
closeMessage: function()
{
var panel = $("taskMessagePanel");
if ($defined(panel.timeout))
{
clearTimeout(panel.timeout);
panel.timeout = null;
}
panel.fxMessage.stop();
panel.setStyle("opacity", 0);
}
}; };
window.addEvent('load', MyTasks.start); window.addEvent('load', MyTasks.start);

View File

@@ -34,7 +34,7 @@ var MyWebFiles = {
var file = files[i]; var file = files[i];
// animated elements defaults // animated elements defaults
file.maxHeight = file.getStyle('height').toInt(); file.maxHeight = Math.max(file.getStyle('height').toInt(), 1);
file.defHeight = 1; file.defHeight = 1;
file.setStyle('height', file.defHeight); file.setStyle('height', file.defHeight);
file.setStyle('display', 'block'); file.setStyle('display', 'block');

View File

@@ -21,7 +21,7 @@ var MyWebForms = {
var frm = frms[i]; var frm = frms[i];
// animated elements defaults // animated elements defaults
frm.maxHeight = frm.getStyle('height').toInt(); frm.maxHeight = Math.max(frm.getStyle('height').toInt(), 1);
frm.defHeight = 1; frm.defHeight = 1;
frm.setStyle('height', frm.defHeight); frm.setStyle('height', frm.defHeight);
frm.setStyle('opacity', 0); frm.setStyle('opacity', 0);