Réunification du listing des dossier entre le thème par défaut et le thème photo.
authorBenoît Pin <benoit.pin@gmail.com>
Mon, 9 Dec 2013 17:09:02 +0000 (18:09 +0100)
committerBenoît Pin <benoit.pin@gmail.com>
Mon, 9 Dec 2013 17:09:02 +0000 (18:09 +0100)
skins/custom_generic/folder_contents.py [changed mode: 0644->0755]
skins/generic/folder_contents_macros.pt
skins/photo_theme/folder_contents.py [deleted file]
skins/photo_theme/folder_contents_macros.pt [deleted file]

old mode 100644 (file)
new mode 100755 (executable)
index 26fa044..b63159f
@@ -1,4 +1,4 @@
-##parameters=b_start=0, key='', reverse=0, ids=(), items_copy='', items_cut='', items_delete='', items_new='', items_paste='', items_rename='', items_up='', items_down='', items_top='', items_bottom='', items_sort='', template='', macro='', ajax='',**others
+##parameters=b_start=0, key='', reverse=0, ids=(), items_copy='', items_cut='', items_delete='', items_new='', items_paste='', items_rename='', items_up='', items_down='', items_top='', items_bottom='', items_sort='', template='', macro='', ajax=''
 ##
 from Products.Plinn.PloneMisc import Batch
 from DateTime import DateTime
@@ -15,6 +15,7 @@ from Products.CMFDefault.utils import html_marshal
 
 mtool = getToolByName(script, 'portal_membership')
 checkPermission = mtool.checkPermission
+isAnon = mtool.isAnonymousUser()
 utool = getToolByName(script, 'portal_url')
 portal_url = utool()
 
@@ -84,21 +85,6 @@ items_add_allowed = checkPermission(AddPortalContent, context)
 upitems_list_allowed = checkPermission(ListFolderContents, context, 'aq_parent')
 manage_props_allowed = checkPermission(ManageProperties, context)
 
-# information pour remonter au dossier parent
-up_info = {}
-if upitems_list_allowed:
-       up_obj = context.aq_parent
-       if hasattr(up_obj, 'portal_url'):
-               up_url = up_obj.getActionInfo('object/folderContents')['url']
-               up_info = { 'icon': '%s/UpFolder_icon.gif' % portal_url,
-                                       'id': up_obj.getId(),
-                                       'url': up_url }
-       else:
-               up_info = { 'icon': '',
-                                       'id': 'Root',
-                                       'url': '' }
-options['up_info'] = up_info
-
 target = context.getActionInfo(default_target)['url']
 
 if not key:
@@ -109,15 +95,11 @@ elif (key, reverse) == context.getDefaultSorting():
 else:
        is_default = 0
 
-columns = ( {'key': 'Lock',
-                        'title': '',
-                        'width': '16',
-                        'colspan': None}
-                       , {'key': 'Type',
+columns = ( {'key': 'Type',
                         'title': 'Type',
                         'width': None,
                         'colspan': '2'}
-                       , {'key': 'title_or_id',
+                       , {'key': 'id',
                         'title': 'Name',
                         'width': None,
                         'colspan': None}
@@ -125,10 +107,6 @@ columns = ( {'key': 'Lock',
                         'title': 'Last Modified',
                         'width': None,
                         'colspan': None}
-                       , {'key': 'position',
-                        'title': 'Position',
-                        'width': None,
-                        'colspan': None }
                        )
 
 for column in columns: 
@@ -170,37 +148,29 @@ for column in columns:
 context.filterCookie()
 folderfilter = context.REQUEST.get('folderfilter', '')
 filter = context.decodeFolderFilter(folderfilter)
-items = context.listNearestFolderContents(contentFilter=filter)
+items = context.listCatalogedContents(contentFilter=filter)
 sort_dir = reverse and 'desc' or 'asc'
-sortFunc = key in ['Type', 'title_or_id'] and 'nocase' or 'cmp'
+sortFunc = key in ['Type'] and 'nocase' or 'cmp'
 items = sequence.sort( items, ((key, sortFunc, sort_dir),) )
 batch_obj = Batch(items, context.default_batch_size, b_start, orphan=0, quantumleap=1)
 items = []
-i = 1
-display_delete_button = False
+display_delete_button = not isAnon # TODO : à revoir
 for item in batch_obj:
-       item_icon = item.getIcon(1)
-       item_id = item.getId()
-       item_position = key == 'position' and str(b_start + i) or '...'
-       i += 1
-       item_url = item.absolute_url()
-       try : item_delete_allowed = context.objectIdCanBeDeleted(item_id)
-       except : item_delete_allowed = checkPermission(DeleteObjects, context) # std zope perm
-       if not display_delete_button :
-               display_delete_button = item_delete_allowed
+       item_icon = item.getIcon
+       item_id = item.getId
+       item_url = item.getURL()
        items.append(
-               {'lock' : not checkPermission(ModifyPortalContent, item),
-                'checkbox': item_delete_allowed and ('cb_%s' % item_id) or '',
+               {'checkbox': not isAnon,
                 'icon': item_icon and ( '%s/%s' % (portal_url, item_icon) ) or '',
                 'id': item_id,
-                'modified': item.modified().strftime(locale_date_fmt),
-                'position': item_position,
-                'title_or_id': item.title_or_id(),
-                'type': item.Type() or None,
+                'modified': item.modified.strftime(locale_date_fmt),
+                'title_or_id': item.Title or item_id,
+                'type': item.Type or None,
                 'url': item_url } )
 
 options['batch'] = { 'listColumnInfos': tuple(columns),
                                         'listItemInfos': tuple(items),
+                                        'firstItemPos' : b_start + 1,
                                         'sort_key' : key,
                                         'sort_dir' : sort_dir,
                                         'batch_obj': batch_obj }
@@ -233,7 +203,8 @@ options['form'] = { 'action': target,
                                        'listHiddenVarInfos': tuple(hidden_vars),
                                        'listButtonInfos': tuple(buttons),
                                        'is_orderable': is_orderable,
-                                       'is_sortable': is_sortable }
+                                       'is_sortable': is_sortable,
+                                       'items_add_allowed': items_add_allowed }
 if not ajax and is_orderable :
        deltas = range( 1, min(5, length) ) + range(5, length, 5)
        options['form']['listDeltas'] = tuple(deltas)
@@ -243,6 +214,4 @@ if template and macro :
        options['macro'] = macro
        return context.use_macro(**options)
 else :
-       options.update(others)
        return context.folder_contents_template(**options)
-
index e8e84fe..2cb5b03 100644 (file)
   </head>
 
   <body i18n:domain="cmf_default" metal:define-macro="FolderListing"
-                               tal:define="batch_dict options/batch;
-                                                                               batch batch_dict/batch_obj;
-                                                                               listColumnInfos batch_dict/listColumnInfos;
-                                                                               listItemInfos batch_dict/listItemInfos;"
-                               tal:omit-tag="">
+        tal:define="batch_dict options/batch;
+                    batch batch_dict/batch_obj;
+                    listColumnInfos batch_dict/listColumnInfos;
+                    listItemInfos batch_dict/listItemInfos;"
+        tal:omit-tag="">
     <div style="display:none">
       <span id="FolderUrl" tal:content="here/absolute_url" >Folder url for script</span>
       <span tal:condition="options/form/is_orderable" tal:omit-tag="">
-             <span id="FirstItemPos" tal:content="python:listItemInfos[0]['position']">first batch item position</span>
-             <span id="BatchNavigationSize" tal:content="batch/size"></span>
-           </span>
+        <span id="FirstItemPos" tal:content="batch_dict/firstItemPos">first batch item position</span>
+        <span id="BatchNavigationSize" tal:content="batch/size"></span>
+      </span>
     </div>
-       <!-- batch navigation -->
+    <!-- batch navigation -->
     <div tal:define="navBatchBarId string:topNavBatchBar" tal:omit-tag="">
       <span metal:use-macro="here/batch_macros/macros/navigation">batch navigation</span>
     </div>
     <table class="listing" cellspacing="0">
-                       <thead id="FolderListingHeader">
-                               <tr>
-                                       <th tal:attributes="width column_info/width; colspan column_info/colspan" tal:repeat="column_info listColumnInfos" nowrap="nowrap" >
-                                               <a href="." tal:attributes="href column_info/url" tal:content="column_info/title" i18n:translate="">Type</a>
-                                               <span  tal:repeat="img column_info/images" tal:omit-tag="">
-                                                       <a tal:omit-tag="python:not img.has_key('href')"
-                                                                tal:attributes="href img/href|nothing ; title img/alt" i18n:attributes="title"
-                                                                ><img tal:attributes="src img/src ; alt img/alt ; id img/id|nothing" border="0" i18n:attributes="alt" /></a>
-                                               </span>
-                                       </th>
-                                       <td colspan="5" tal:replace="nothing"></td>
-                               </tr>
-                       </thead>
-                       <tbody id="FolderListingBody">
-<tbody tal:repeat="item_info listItemInfos" tal:omit-tag="">
-                   <tr class="" tal:attributes="class python: (even and 'even') or 'odd'" tal:define="even repeat/item_info/even">
-                     <td><img src="." alt="lock" height="16" width="16" border="0"
-                              tal:condition="python:not isAnon and item_info['lock']"
-                              tal:attributes="src here/lock.gif/absolute_url"
-                              i18n:attributes="alt" /></td>
-                     <td>
-                       <input id="" type="checkbox" name="ids:list" value=""
-                              tal:attributes="value item_info/id; id item_info/checkbox" tal:condition="item_info/checkbox" />
-                     </td>
-                     <td>
-                       <a href="." tal:attributes="href item_info/url" tal:condition="item_info/icon">
-                         <img src="." alt="" tal:attributes="src item_info/icon; alt item_info/type" border="0" i18n:attributes="alt" />
-                       </a>
-                     </td>
-                     <td>
-                       <a href="." tal:attributes="href item_info/url" tal:content="item_info/title_or_id">title or id</a>
-                     </td>
-                     <td>
-                       <span tal:replace="item_info/modified">2001</span>
-                     </td>
-                     <td>
-                       <span tal:replace="item_info/position">1</span>
-                     </td>
-                   </tr>
+      <thead id="FolderListingHeader">
+        <tr>
+          <th tal:attributes="width column_info/width; colspan column_info/colspan" tal:repeat="column_info listColumnInfos" nowrap="nowrap" >
+            <a href="." tal:attributes="href column_info/url" tal:content="column_info/title" i18n:translate="">Type</a>
+            <span  tal:repeat="img column_info/images" tal:omit-tag="">
+              <a tal:omit-tag="python:not img.has_key('href')"
+                 tal:attributes="href img/href|nothing ; title img/alt" i18n:attributes="title"
+                 ><img tal:attributes="src img/src ; alt img/alt ; id img/id|nothing" border="0" i18n:attributes="alt" /></a>
+            </span>
+          </th>
+          <td colspan="5" tal:replace="nothing"></td>
+        </tr>
+      </thead>
+      <tbody id="FolderListingBody">
+<tbody tal:repeat="item_info listItemInfos" tal:omit-tag="" metal:define-macro="itemListing">
+        <tr class="" tal:attributes="class python: (even and 'even') or 'odd'" tal:define="even repeat/item_info/even">
+          <td>
+            <input id="" type="checkbox" name="ids:list" value=""
+                   tal:attributes="value item_info/id; id item_info/checkbox" tal:condition="item_info/checkbox" />
+          </td>
+          <td>
+            <a href="." tal:attributes="href item_info/url" tal:condition="item_info/icon">
+              <img src="." alt="" tal:attributes="src item_info/icon; alt item_info/type" border="0" i18n:attributes="alt" />
+            </a>
+          </td>
+          <td>
+            <a href="." tal:attributes="href item_info/url" tal:define="tod item_info/title_or_id; id item_info/id">
+              <span tal:replace="id">id</span>
+              <span tal:condition="python:tod != id">
+                • <span tal:replace="tod">title</span>
+              </span>
+            </a>
+          </td>
+          <td>
+            <span tal:replace="item_info/modified">2001</span>
+          </td>
+        </tr>
 </tbody>
-               </tbody>
+      </tbody>
     </table>
     <!-- batch navigation -->
     <div tal:define="navBatchBarId string:bottomNavBatchBar" tal:omit-tag="">
       <span metal:use-macro="here/batch_macros/macros/navigation">batch navigation</span>
     </div>
-               <script type="text/javascript">
-               //<!--
-                       // variables for drag-and-drop ordered support
-                       var ddEnabled = false
-                       try {
-                               var firstItemPos = parseInt(document.getElementById("FirstItemPos").innerHTML);
-                               ddEnabled = true;
-                       }
-                       catch (e) {}
-
-                       var topNavBatchBar              = document.getElementById("topNavBatchBar");
-                       var bottomNavBatchBar   = document.getElementById("bottomNavBatchBar");
+    <script type="text/javascript">
+               (function(){
+                       // ordering / selecting
+                       var firsItemPosElement = document.getElementById('FirstItemPos');
                        var listing = document.getElementById("FolderListingBody");
-
-                       if (ddEnabled) {
-                               var rows = listing.getElementsByTagName("TR")
-                               for ( var i = 0 ; i < rows.length ; i++ )
-                                       rows[i].pos = i + firstItemPos;
-
-                               var fDDcontroler = new FolderDDropControler(listing);
-                               var topNavBatchBar              = document.getElementById("topNavBatchBar");
-                               var bottomNavBatchBar   = document.getElementById("bottomNavBatchBar");
+                       var orderable = firsItemPosElement ? true : false;
+                       var firstItemPos = orderable ? parseInt(firsItemPosElement.innerHTML, 10) : 1;
+                       var fDDcontroler = new FolderDDropControler(listing, orderable, firstItemPos);
+                       var topNavBatchBar, bottomNavBatchBar;
+                       if (orderable) {
+                               topNavBatchBar = document.getElementById("topNavBatchBar");
+                               bottomNavBatchBar = document.getElementById("bottomNavBatchBar");
                                if (topNavBatchBar && bottomNavBatchBar) {
                                        new DropTarget(topNavBatchBar, fDDcontroler);
                                        new DropTarget(bottomNavBatchBar, fDDcontroler);
                                }
                        }
-
-
                        addListener(document.getElementById("FolderListingHeader"), "click", loadListing);
                        if (topNavBatchBar && bottomNavBatchBar) {
                                addListener(topNavBatchBar, "click", loadListing);
                                addListener(bottomNavBatchBar, "click", loadListing);
                        }
 
-               //-->
-               </script>
+               }());
+    </script>
+    <script type="text/javascript" tal:condition="options/form/items_add_allowed">
+               (function(){
+                       // upload by drag and drop
+                       var uploadUrl = absolute_url() + '/put_upload';
+                       new DDFolderUploader(document.getElementById('ForematterCell'), uploadUrl, document.getElementById("FolderListingBody"));
+               }());
+    </script>
   </body>
 
 </html>
\ No newline at end of file
diff --git a/skins/photo_theme/folder_contents.py b/skins/photo_theme/folder_contents.py
deleted file mode 100755 (executable)
index b63159f..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-##parameters=b_start=0, key='', reverse=0, ids=(), items_copy='', items_cut='', items_delete='', items_new='', items_paste='', items_rename='', items_up='', items_down='', items_top='', items_bottom='', items_sort='', template='', macro='', ajax=''
-##
-from Products.Plinn.PloneMisc import Batch
-from DateTime import DateTime
-locale_date_fmt = context.locale_date_fmt()
-from ZTUtils import make_query
-from Products.CMFCore.utils import getToolByName
-from Products.CMFDefault.permissions import AddPortalContent
-from Products.CMFDefault.permissions import DeleteObjects
-from Products.CMFDefault.permissions import ListFolderContents
-from Products.CMFDefault.permissions import ManageProperties
-from Products.CMFDefault.permissions import ViewManagementScreens
-from Products.CMFDefault.permissions import ModifyPortalContent
-from Products.CMFDefault.utils import html_marshal
-
-mtool = getToolByName(script, 'portal_membership')
-checkPermission = mtool.checkPermission
-isAnon = mtool.isAnonymousUser()
-utool = getToolByName(script, 'portal_url')
-portal_url = utool()
-
-
-form = context.REQUEST.form
-default_target = 'object/folderContents'
-default_kw = {'b_start': b_start, 'key': key, 'reverse': reverse, 'ajax' : ajax}
-if items_copy :
-       if ajax : default_kw['syncFragments']=['rightCell']
-       if context.validateItemIds(**form) and \
-                       context.folder_copy_control(**form) and \
-                       context.setRedirect(context, default_target, **default_kw):
-               return
-elif items_cut :
-       if ajax : default_kw['syncFragments']=['rightCell']
-       if context.validateItemIds(**form) and \
-                       context.folder_cut_control(**form) and \
-                       context.setRedirect(context, default_target, **default_kw):
-                       return
-elif items_delete and \
-               context.validateItemIds(**form) and \
-               context.folder_delete_control(**form) and \
-               context.setRedirect(context, default_target, **default_kw):
-       return
-elif items_new and \
-               context.setRedirect(context, 'object/new', **default_kw):
-       return
-elif items_paste :
-       if ajax : default_kw['syncFragments']=['rightCell']
-       if context.folder_paste_control(**form) and \
-                       context.setRedirect(context, default_target, **default_kw):
-                       return
-elif items_rename and \
-               context.validateItemIds(**form) and \
-               context.setRedirect(context, 'object/rename_items', ids=ids,
-                                                       **default_kw):
-       return
-elif items_sort and \
-               context.folder_sort_control(**form) and \
-               context.setRedirect(context, default_target, b_start=b_start):
-       return
-elif items_up and \
-               context.validateItemIds(**form) and \
-               context.folder_up_control(**form) and \
-               context.setRedirect(context, default_target, **default_kw):
-       return
-elif items_down and \
-               context.validateItemIds(**form) and \
-               context.folder_down_control(**form) and \
-               context.setRedirect(context, default_target, **default_kw):
-       return
-elif items_top and \
-               context.validateItemIds(**form) and \
-               context.folder_top_control(**form) and \
-               context.setRedirect(context, default_target, **default_kw):
-       return
-elif items_bottom and \
-               context.validateItemIds(**form) and \
-               context.folder_bottom_control(**form) and \
-               context.setRedirect(context, default_target, **default_kw):
-       return
-       
-
-options = {}
-
-items_add_allowed = checkPermission(AddPortalContent, context)
-upitems_list_allowed = checkPermission(ListFolderContents, context, 'aq_parent')
-manage_props_allowed = checkPermission(ManageProperties, context)
-
-target = context.getActionInfo(default_target)['url']
-
-if not key:
-       (key, reverse) = context.getDefaultSorting()
-       is_default = 1
-elif (key, reverse) == context.getDefaultSorting():
-       is_default = 1
-else:
-       is_default = 0
-
-columns = ( {'key': 'Type',
-                        'title': 'Type',
-                        'width': None,
-                        'colspan': '2'}
-                       , {'key': 'id',
-                        'title': 'Name',
-                        'width': None,
-                        'colspan': None}
-                       , {'key': 'modified',
-                        'title': 'Last Modified',
-                        'width': None,
-                        'colspan': None}
-                       )
-
-for column in columns: 
-       images = []
-       if key == column['key'] :
-               if not is_default and manage_props_allowed :
-                       images.append( {'src' : getattr(context, 'set_default_sorting.gif').absolute_url(),
-                                                       'alt' : 'Set Sorting as Default',
-                                                       'id'     : 'SetSortingAsDefault',
-                                                       'href': '%s?%s' % (target, make_query(items_sort=True,
-                                                                                                                                 key=key,
-                                                                                                                                 reverse= (key != 'position' and [reverse] or [False])[0] )
-                                                                                                 )
-                                                        }
-                                                        )
-
-               if key != 'position' :
-                       if reverse :
-                               toggleImg = getattr(context, 'arrowDown.gif')
-                               alt = 'descending sort'
-                       else :
-                               toggleImg = getattr(context, 'arrowUp.gif')
-                               alt = 'ascending sort'
-                       query = make_query(key=column['key'], reverse = not reverse)
-               else :  
-                       toggleImg = getattr(context, 'arrowUp.gif')
-                       alt = 'ascending sort'
-                       query = make_query(key=column['key'])
-               images.append( {'src' : toggleImg.absolute_url(), 'alt' : alt} )
-       else :
-               if key != 'position' :
-                       query = make_query(key=column['key'], reverse = reverse)
-               else :
-                       query = make_query(key=column['key'])
-       
-       column['url'] = '%s?%s' % (target, query)
-       column['images'] = images
-
-context.filterCookie()
-folderfilter = context.REQUEST.get('folderfilter', '')
-filter = context.decodeFolderFilter(folderfilter)
-items = context.listCatalogedContents(contentFilter=filter)
-sort_dir = reverse and 'desc' or 'asc'
-sortFunc = key in ['Type'] and 'nocase' or 'cmp'
-items = sequence.sort( items, ((key, sortFunc, sort_dir),) )
-batch_obj = Batch(items, context.default_batch_size, b_start, orphan=0, quantumleap=1)
-items = []
-display_delete_button = not isAnon # TODO : à revoir
-for item in batch_obj:
-       item_icon = item.getIcon
-       item_id = item.getId
-       item_url = item.getURL()
-       items.append(
-               {'checkbox': not isAnon,
-                'icon': item_icon and ( '%s/%s' % (portal_url, item_icon) ) or '',
-                'id': item_id,
-                'modified': item.modified.strftime(locale_date_fmt),
-                'title_or_id': item.Title or item_id,
-                'type': item.Type or None,
-                'url': item_url } )
-
-options['batch'] = { 'listColumnInfos': tuple(columns),
-                                        'listItemInfos': tuple(items),
-                                        'firstItemPos' : b_start + 1,
-                                        'sort_key' : key,
-                                        'sort_dir' : sort_dir,
-                                        'batch_obj': batch_obj }
-
-hidden_vars = []
-for name, value in html_marshal(**default_kw):
-       hidden_vars.append( {'name': name, 'value': value} )
-       
-# buttons
-buttons = []
-if items_add_allowed and context.allowedContentTypes():
-       buttons.append( {'name': 'items_new', 'value': 'New...'} )
-       if items:
-               buttons.append( {'name': 'items_rename', 'value': 'Rename'} )
-               
-if checkPermission(ViewManagementScreens, context) and items:
-       buttons.append( {'name': 'items_cut', 'value': 'Cut'} )
-       buttons.append( {'name': 'items_copy', 'value': 'Copy'} )
-       
-if items_add_allowed and context.cb_dataValid():
-       buttons.append( {'name': 'items_paste', 'value': 'Paste'} )
-       
-if display_delete_button and items:
-       buttons.append( {'name': 'items_delete', 'value': 'Delete'} )
-
-length = batch_obj.sequence_length
-is_orderable = manage_props_allowed and (key == 'position') and length > 1
-is_sortable = manage_props_allowed and not is_default
-options['form'] = { 'action': target,
-                                       'listHiddenVarInfos': tuple(hidden_vars),
-                                       'listButtonInfos': tuple(buttons),
-                                       'is_orderable': is_orderable,
-                                       'is_sortable': is_sortable,
-                                       'items_add_allowed': items_add_allowed }
-if not ajax and is_orderable :
-       deltas = range( 1, min(5, length) ) + range(5, length, 5)
-       options['form']['listDeltas'] = tuple(deltas)
-
-if template and macro :
-       options['template'] = template
-       options['macro'] = macro
-       return context.use_macro(**options)
-else :
-       return context.folder_contents_template(**options)
diff --git a/skins/photo_theme/folder_contents_macros.pt b/skins/photo_theme/folder_contents_macros.pt
deleted file mode 100644 (file)
index 2cb5b03..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-
-  <head>
-    <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
-    <title>folder contents macros</title>
-  </head>
-
-  <body i18n:domain="cmf_default" metal:define-macro="FolderListing"
-        tal:define="batch_dict options/batch;
-                    batch batch_dict/batch_obj;
-                    listColumnInfos batch_dict/listColumnInfos;
-                    listItemInfos batch_dict/listItemInfos;"
-        tal:omit-tag="">
-    <div style="display:none">
-      <span id="FolderUrl" tal:content="here/absolute_url" >Folder url for script</span>
-      <span tal:condition="options/form/is_orderable" tal:omit-tag="">
-        <span id="FirstItemPos" tal:content="batch_dict/firstItemPos">first batch item position</span>
-        <span id="BatchNavigationSize" tal:content="batch/size"></span>
-      </span>
-    </div>
-    <!-- batch navigation -->
-    <div tal:define="navBatchBarId string:topNavBatchBar" tal:omit-tag="">
-      <span metal:use-macro="here/batch_macros/macros/navigation">batch navigation</span>
-    </div>
-    <table class="listing" cellspacing="0">
-      <thead id="FolderListingHeader">
-        <tr>
-          <th tal:attributes="width column_info/width; colspan column_info/colspan" tal:repeat="column_info listColumnInfos" nowrap="nowrap" >
-            <a href="." tal:attributes="href column_info/url" tal:content="column_info/title" i18n:translate="">Type</a>
-            <span  tal:repeat="img column_info/images" tal:omit-tag="">
-              <a tal:omit-tag="python:not img.has_key('href')"
-                 tal:attributes="href img/href|nothing ; title img/alt" i18n:attributes="title"
-                 ><img tal:attributes="src img/src ; alt img/alt ; id img/id|nothing" border="0" i18n:attributes="alt" /></a>
-            </span>
-          </th>
-          <td colspan="5" tal:replace="nothing"></td>
-        </tr>
-      </thead>
-      <tbody id="FolderListingBody">
-<tbody tal:repeat="item_info listItemInfos" tal:omit-tag="" metal:define-macro="itemListing">
-        <tr class="" tal:attributes="class python: (even and 'even') or 'odd'" tal:define="even repeat/item_info/even">
-          <td>
-            <input id="" type="checkbox" name="ids:list" value=""
-                   tal:attributes="value item_info/id; id item_info/checkbox" tal:condition="item_info/checkbox" />
-          </td>
-          <td>
-            <a href="." tal:attributes="href item_info/url" tal:condition="item_info/icon">
-              <img src="." alt="" tal:attributes="src item_info/icon; alt item_info/type" border="0" i18n:attributes="alt" />
-            </a>
-          </td>
-          <td>
-            <a href="." tal:attributes="href item_info/url" tal:define="tod item_info/title_or_id; id item_info/id">
-              <span tal:replace="id">id</span>
-              <span tal:condition="python:tod != id">
-                • <span tal:replace="tod">title</span>
-              </span>
-            </a>
-          </td>
-          <td>
-            <span tal:replace="item_info/modified">2001</span>
-          </td>
-        </tr>
-</tbody>
-      </tbody>
-    </table>
-    <!-- batch navigation -->
-    <div tal:define="navBatchBarId string:bottomNavBatchBar" tal:omit-tag="">
-      <span metal:use-macro="here/batch_macros/macros/navigation">batch navigation</span>
-    </div>
-    <script type="text/javascript">
-               (function(){
-                       // ordering / selecting
-                       var firsItemPosElement = document.getElementById('FirstItemPos');
-                       var listing = document.getElementById("FolderListingBody");
-                       var orderable = firsItemPosElement ? true : false;
-                       var firstItemPos = orderable ? parseInt(firsItemPosElement.innerHTML, 10) : 1;
-                       var fDDcontroler = new FolderDDropControler(listing, orderable, firstItemPos);
-                       var topNavBatchBar, bottomNavBatchBar;
-                       if (orderable) {
-                               topNavBatchBar = document.getElementById("topNavBatchBar");
-                               bottomNavBatchBar = document.getElementById("bottomNavBatchBar");
-                               if (topNavBatchBar && bottomNavBatchBar) {
-                                       new DropTarget(topNavBatchBar, fDDcontroler);
-                                       new DropTarget(bottomNavBatchBar, fDDcontroler);
-                               }
-                       }
-                       addListener(document.getElementById("FolderListingHeader"), "click", loadListing);
-                       if (topNavBatchBar && bottomNavBatchBar) {
-                               addListener(topNavBatchBar, "click", loadListing);
-                               addListener(bottomNavBatchBar, "click", loadListing);
-                       }
-
-               }());
-    </script>
-    <script type="text/javascript" tal:condition="options/form/items_add_allowed">
-               (function(){
-                       // upload by drag and drop
-                       var uploadUrl = absolute_url() + '/put_upload';
-                       new DDFolderUploader(document.getElementById('ForematterCell'), uploadUrl, document.getElementById("FolderListingBody"));
-               }());
-    </script>
-  </body>
-
-</html>
\ No newline at end of file