From: fschulze <svn...@pl...> - 2006-12-31 16:10:16
|
Author: fschulze Date: Sun Dec 31 16:10:08 2006 New Revision: 11838 Added: CMFPlone/branches/plip120-tiles-fschulze/skins/plone_ecmascript/tiles.js Modified: CMFPlone/branches/plip120-tiles-fschulze/migrations/v3_0/alphas.py CMFPlone/branches/plip120-tiles-fschulze/profiles/default/jsregistry.xml CMFPlone/branches/plip120-tiles-fschulze/skins/plone_content/folder_listing.pt CMFPlone/branches/plip120-tiles-fschulze/skins/plone_styles/public.css.dtml CMFPlone/branches/plip120-tiles-fschulze/tests/testMigrations.py Log: Added tiles.js, see comments at the top of the file. This is a complete rewrite of the existing plip120 branch with enhanced functionality and proper accessibility. This needs to be thought through in light of kss, as the functionality might interfere, for example kss could add a click handler on a link, but the tile will just use the href of the link instead of the click handler. I don't know a solution for this problem. Modified: CMFPlone/branches/plip120-tiles-fschulze/migrations/v3_0/alphas.py ============================================================================== --- CMFPlone/branches/plip120-tiles-fschulze/migrations/v3_0/alphas.py (original) +++ CMFPlone/branches/plip120-tiles-fschulze/migrations/v3_0/alphas.py Sun Dec 31 16:10:08 2006 @@ -100,6 +100,9 @@ # Add action for plone.app.contentrules addContentRulesAction(portal, out) + # Add tiles.js to ResourceRegistries + addTilesJS(portal, out) + return out def enableZope3Site(portal, out): @@ -469,3 +472,15 @@ self.install_resources() self.install_skins() out.append("Succesfully migrated portal to KSS") + +def addTilesJS(portal, out): + """Add titles.js to ResourceRegistries + """ + jsreg = getToolByName(portal, 'portal_javascripts', None) + script = 'tiles.js' + if jsreg is not None: + script_ids = jsreg.getResourceIds() + # Failsafe: first make sure the stylesheet doesn't exist in the list + if script not in script_ids: + jsreg.registerScript(script) + out.append("Added " + script + " to portal_javascipt") Modified: CMFPlone/branches/plip120-tiles-fschulze/profiles/default/jsregistry.xml ============================================================================== --- CMFPlone/branches/plip120-tiles-fschulze/profiles/default/jsregistry.xml (original) +++ CMFPlone/branches/plip120-tiles-fschulze/profiles/default/jsregistry.xml Sun Dec 31 16:10:08 2006 @@ -65,6 +65,8 @@ <javascript cacheable="True" compression="safe" cookable="True" enabled="True" expression="" id="formsubmithelpers.js" inline="False"/> <javascript cacheable="True" compression="safe" cookable="True" + enabled="True" expression="" id="tiles.js" inline="False"/> + <javascript cacheable="True" compression="safe" cookable="True" enabled="True" expression="python:portal.kupu_library_tool.isKupuEnabled(REQUEST=request)" id="kupunoi18n.js" inline="False"/> Modified: CMFPlone/branches/plip120-tiles-fschulze/skins/plone_content/folder_listing.pt ============================================================================== --- CMFPlone/branches/plip120-tiles-fschulze/skins/plone_content/folder_listing.pt (original) +++ CMFPlone/branches/plip120-tiles-fschulze/skins/plone_content/folder_listing.pt Sun Dec 31 16:10:08 2006 @@ -61,7 +61,7 @@ "> <dt metal:define-macro="listitem" - tal:attributes="class python:test(item_type == 'Event', 'vevent', '')"> + tal:attributes="class python:test(item_type == 'Event', 'vevent linkTile', 'linkTile')"> <span class="summary" tal:attributes="class string:$item_type_class summary" @@ -142,7 +142,7 @@ </dt> - <dd> + <dd class="linkTileAfter"> <span tal:omit-tag="" tal:condition="not:item_description"> </span> Added: CMFPlone/branches/plip120-tiles-fschulze/skins/plone_ecmascript/tiles.js ============================================================================== --- (empty file) +++ CMFPlone/branches/plip120-tiles-fschulze/skins/plone_ecmascript/tiles.js Sun Dec 31 16:10:08 2006 @@ -0,0 +1,78 @@ +/* This looks for elements with the "linkTile" class. If such an element + contains links, then the whole element will be clickable. Either the first + link is used as the target, or if there are more, then the one which has + the optional "primary" class on it. If there is an adjacent sibling with + class "linkTileAfter" then it will be made clickable as well. This is used + in folder_listing to make the dd tags clickable which don't contain a link + but the previous dt tag has one. +*/ + +var linkTiles = { + // browser compatibility functions + stopBubbling: function(e) { + if(!e) window.event.cancelBubble=true; + else (e.stopPropagation) ? e.stopPropagation() : e.cancelBubble=true; + }, + + thisElement: function(e) { + return (e && e.nodeType == 1 && e.tagName != "!") ? e : null; + }, + + nextElementSibling: function(e) { + while (e && (e = e.nextSibling) && !linkTiles.thisElement(e)) continue; + return e; + }, + + _click: function(tile, a) { + return function(e) { + window.location=a.href; + linkTiles.stopBubbling(e); + } + }, + + _mouseover: function(tile, a) { + return function(e) { + window.status=a.href; + addClassName(tile, 'hoverLinkTile'); + linkTiles.stopBubbling(e); + } + }, + + _mouseout: function(tile, a) { + return function(e) { + window.status=''; + removeClassName(tile, 'hoverLinkTile'); + linkTiles.stopBubbling(e); + } + }, + + init: function() { + var tiles = cssQuery(".linkTile") + for(var i = 0; i < tiles.length; i++) { + var tile = tiles[i]; + var hrefs = cssQuery("a", tile); + if (hrefs.length > 1) { + var primary = cssQuery("a.primary", tile); + if (primary.length > 0) { + hrefs = primary; + } + } + if ((hrefs.length > 0) && hrefs[0]) { + var a = hrefs[0]; + // adding event handling + registerEventListener(tile, 'click', linkTiles._click(tile, a), false); + registerEventListener(tile, 'mouseover', linkTiles._mouseover(tile, a), false); + registerEventListener(tile, 'mouseout', linkTiles._mouseout(tile, a), false); + var nextTile = linkTiles.nextElementSibling(tile); + while (nextTile && hasClassName(nextTile, 'linkTileAfter')) { + registerEventListener(nextTile, 'click', linkTiles._click(nextTile, a), false); + registerEventListener(nextTile, 'mouseover', linkTiles._mouseover(nextTile, a), false); + registerEventListener(nextTile, 'mouseout', linkTiles._mouseout(nextTile, a), false); + nextTile = linkTiles.nextElementSibling(nextTile); + } + } + } + } +}; + +registerPloneFunction(linkTiles.init); Modified: CMFPlone/branches/plip120-tiles-fschulze/skins/plone_styles/public.css.dtml ============================================================================== --- CMFPlone/branches/plip120-tiles-fschulze/skins/plone_styles/public.css.dtml (original) +++ CMFPlone/branches/plip120-tiles-fschulze/skins/plone_styles/public.css.dtml Sun Dec 31 16:10:08 2006 @@ -1194,4 +1194,8 @@ border: 1px solid Black; } +.hoverLinkTile { + cursor: pointer; +} + /* </dtml-with> */ Modified: CMFPlone/branches/plip120-tiles-fschulze/tests/testMigrations.py ============================================================================== --- CMFPlone/branches/plip120-tiles-fschulze/tests/testMigrations.py (original) +++ CMFPlone/branches/plip120-tiles-fschulze/tests/testMigrations.py Sun Dec 31 16:10:08 2006 @@ -70,6 +70,7 @@ from Products.CMFPlone.migrations.v3_0.alphas import installKss from Products.CMFPlone.migrations.v3_0.alphas import installRedirectorUtility from Products.CMFPlone.migrations.v3_0.alphas import addContentRulesAction +from Products.CMFPlone.migrations.v3_0.alphas import addTilesJS from zope.app.component.hooks import clearSite from zope.app.component.interfaces import ISite @@ -1541,6 +1542,18 @@ self.portal.portal_actions._delOb('object_buttons') addContentRulesAction(self.portal, []) + def testAddTilesJS(self): + jsreg = self.portal.portal_javascripts + # unregister first + jsreg.unregisterResource('tiles.js') + script_ids = jsreg.getResourceIds() + self.failIf('tiles.js' in script_ids) + # migrate and test again + addTilesJS(self.portal, []) + script_ids = jsreg.getResourceIds() + self.failUnless('tiles.js' in script_ids) + + class TestMigrations_v3_0_Actions(MigrationTest): def afterSetUp(self): |