Skip to content

Commit

Permalink
initial
Browse files Browse the repository at this point in the history
  • Loading branch information
vangheem committed Dec 22, 2012
0 parents commit 48b54ea
Show file tree
Hide file tree
Showing 24 changed files with 877 additions and 0 deletions.
28 changes: 28 additions & 0 deletions README.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
Introduction
============

This product extends quintagroup.dropdownmenu to add static text to the right
of the menu. This makes it more of a "Mega" menu.

Warning
-------

This product is only meant to be used with 2 levels and will prevent
more levels from being used with quintagroup.dropdownmenu.


How it works
------------

1) add collective.qextendedmenu to list of eggs
2) re-run buildout
3) restart server and install the collective.qextendedmenu on
your plone site
4) on any top level object, click the "Actions" drop down and then
click "Edit Menu Text"
5) select "Show Menu Text" checkbox and fill out html you would like
6) hit "Apply"

*this also assumed you already have sub-menu items in folder you're
applying it to*

6 changes: 6 additions & 0 deletions collective/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
try:
__import__('pkg_resources').declare_namespace(__name__)
except ImportError:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
6 changes: 6 additions & 0 deletions collective/qextendedmenu/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from zope.i18nmessageid import MessageFactory
mf = MessageFactory('collective.qextendedmenu')


def initialize(context):
"""Initializer called when used as a Zope 2 product."""
23 changes: 23 additions & 0 deletions collective/qextendedmenu/browser/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from quintagroup.dropdownmenu.browser.viewlets import GlobalSectionsViewlet
from collective.qextendedmenu.settings import ExtendedMenuSettings


class ExtendedGlobalSectionsViewlet(GlobalSectionsViewlet):
recurse = ViewPageTemplateFile('templates/sections_recurse.pt')

def _content_tabs(self):
"""Return tree of tabs based on content structure"""
results = super(ExtendedGlobalSectionsViewlet, self)._content_tabs()
# go through top level links and add static text if allowed
for item in results:
brain = item['item']
obj = brain.getObject()
settings = ExtendedMenuSettings(obj)
if settings.show:
item['show_static'] = True
item['static_html'] = settings.html.output
else:
item['show_static'] = False
item['static_html'] = u''
return results
36 changes: 36 additions & 0 deletions collective/qextendedmenu/browser/configure.zcml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
i18n_domain="collective.qextendedmenu">

<!-- override viewlet now -->
<browser:viewlet
name="plone.global_sections"
manager="plone.app.layout.viewlets.interfaces.IPortalHeader"
class=".ExtendedGlobalSectionsViewlet"
layer="collective.qextendedmenu.interfaces.ILayer"
permission="zope2.View"
/>

<!-- be more specific -->
<browser:page
name="qextendedmenu-settings"
for="*"
class=".forms.ExtendedMenuSettingsView"
layer="collective.qextendedmenu.interfaces.ILayer"
permission="collective.qextendedmenu.ManageMenuSettings" />

<browser:page
name="qextendedmenu_util"
for="*"
permission="zope2.View"
allowed_interface="collective.qextendedmenu.interfaces.IExtendedMenuUtil"
layer="collective.qextendedmenu.interfaces.ILayer"
class=".utils.ExtendedMenuUtil" />

<browser:resourceDirectory
name="qextendedmenu.resources"
directory="files"
/>

</configure>
41 changes: 41 additions & 0 deletions collective/qextendedmenu/browser/files/styles.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@

#portal-globalnav ul li a {
border-top: none;
border-right: none;
}

#portal-globalnav li > div.drop {
display:none;
left:0;
position:absolute;
top:100%;
z-index:1000;
}

#portal-globalnav li:hover > div.drop,
#portal-globalnav li:hover > div.drop > ul {
display:block;
}

#portal-globalnav li div.drop > ul{
top:0;
float: left;
width: 15em;
position: static;
}

#portal-globalnav > li > div.drop {
background-color: #DDD;
width: 35em;
}

#portal-globalnav > li > div.drop div.static{
float: left;
width: 15em;
padding: 10px;
}

#portal-globalnav ul li a.hasChildrens,
#portal-globalnav ul li a.hasChildrens:hover {
background-image: none;
}
24 changes: 24 additions & 0 deletions collective/qextendedmenu/browser/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from collective.qextendedmenu import mf as _
from z3c.form import form, field
from plone.app.z3cform.layout import wrap_form
from collective.qextendedmenu.interfaces import IExtendedMenuSettings


class ExtendedMenuSettings(form.EditForm):
"""
The page that holds all the gallery settings
"""

fields = field.Fields(IExtendedMenuSettings)

label = _(u'heading_menu_settings_form', default=u'Menu Settings')
# description = _(u'description_gallery_settings_form',
# default=u'Configure the parameters for this gallery.')

# successMessage = _(u'successMessage_gallery_settings_form',
# default=u'Gallery Settings Saved.')
# noChangesMessage = _(u'noChangesMessage_gallery_settings_form',
# default=u'There are no changes in the Gallery settings.')


ExtendedMenuSettingsView = wrap_form(ExtendedMenuSettings)
55 changes: 55 additions & 0 deletions collective/qextendedmenu/browser/templates/sections_recurse.pt
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<tal:master define="level options/level|python:0;
children options/children | nothing;
plonefour view/is_plone_four"
i18n:domain="plone">

<metal:main define-macro="sections_main">
<tal:navitem repeat="node children">
<li tal:define="show_children node/show_children;
children node/children;
item_url node/getURL;
item_icon node/item_icon;
is_current node/currentItem;
is_in_path node/currentParent;
li_curr_class python:is_current and 'selected' or '';
li_extr_class python:(is_in_path and not is_current) and 'selected' or '';
li_extr_class python:(not (is_in_path or is_current)) and li_extr_class + 'plain' or li_extr_class;
item_type node/normalized_portal_type | nothing;
li_class string:${li_curr_class}${li_extr_class};
li_class python:children and li_class or li_class"
tal:attributes="class string:$li_class">

<tal:level define="show_icons view/conf/show_icons;
a_class python:children and 'hasChildrens' or '';
show_static node/show_static|nothing;
ulclass python:'globalSectionsLevel'+str(level);
ulclass python: show_static and ulclass + ' show-static' or ulclass;"
tal:condition="python: level < 3">

<a tal:attributes="href python:item_url;
title node/Description;
class string:${a_class};">
<img tal:condition="python: show_icons and not plonefour"
tal:replace="structure item_icon/html_tag | nothing" />
<span tal:content="node/Title"
tal:attributes="class python: plonefour and show_icons and item_type and 'contenttype-'+ item_type or nothing">Selected Item Title</span>
</a>

<div class="drop" tal:omit-tag="not: node/show_static|nothing">
<ul tal:attributes="class ulclass"
tal:condition="python: len(children) > 0 and show_children">
<li tal:replace="structure python:view.recurse(children=children, level=level+1)">
SubMenu
</li>
</ul>
<div class="static" tal:condition="node/show_static|nothing"
tal:content="structure node/static_html|nothing">
</div>
<div class="visualClear" tal:condition="node/show_static|nothing"><!-- --></div>
</div>
</tal:level>

</li>
</tal:navitem>
</metal:main>
</tal:master>
15 changes: 15 additions & 0 deletions collective/qextendedmenu/browser/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from zope.component import getMultiAdapter
from zope.interface import implements
from Products.Five.browser import BrowserView
from collective.qextendedmenu.interfaces import IExtendedMenuUtil
from Products.CMFCore.interfaces._content import IContentish


class ExtendedMenuUtil(BrowserView):
implements(IExtendedMenuUtil)

def allowed(self):
context_state = getMultiAdapter((self.context, self.request),
name="plone_context_state")
folder = context_state.folder()
return IContentish.providedBy(folder)
31 changes: 31 additions & 0 deletions collective/qextendedmenu/configure.zcml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:five="http://namespaces.zope.org/five"
xmlns:i18n="http://namespaces.zope.org/i18n"
xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
i18n_domain="collective.qextendedmenu">

<five:registerPackage package="." initialize=".initialize" />

<permission
id="collective.qextendedmenu.ManageMenuSettings"
title="collective.qextendedmenu: Manage menu settings"
/>

<include package="quintagroup.dropdownmenu" />
<include package=".browser" />

<adapter
for="Products.CMFCore.interfaces._content.IContentish"
provides="collective.qextendedmenu.interfaces.IExtendedMenuSettings"
factory="collective.qextendedmenu.settings.ExtendedMenuSettings" />

<genericsetup:registerProfile
name="default"
title="collective.qextendedmenu"
directory="profiles/default"
description="Installs the collective.qextendedmenu package"
provides="Products.GenericSetup.interfaces.EXTENSION"
/>

</configure>
19 changes: 19 additions & 0 deletions collective/qextendedmenu/interfaces.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from zope.interface import Interface
from quintagroup.dropdownmenu.interfaces import IDropDownMenuLayer
from zope import schema
from plone.app.textfield import RichText


class ILayer(IDropDownMenuLayer):
pass


class IExtendedMenuSettings(Interface):
show = schema.Bool(title=u"Show Menu Text", default=False)
html = RichText(title=u"HTML", default=u"")


class IExtendedMenuUtil(Interface):

def allowed():
pass
12 changes: 12 additions & 0 deletions collective/qextendedmenu/profiles/default/actions.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0"?>
<object name="portal_actions" meta_type="Plone Actions Tool">
<action-provider name="portal_actions">

<action title="Edit Menu Text" action_id="edit_menu_text" category="object_buttons"
condition_expr="object/@@qextendedmenu_util/allowed"
url_expr="string:${folder_url}/@@qextendedmenu-settings" visible="True">
<permission>collective.qextendedmenu: Manage menu settings</permission>
</action>

</action-provider>
</object>
4 changes: 4 additions & 0 deletions collective/qextendedmenu/profiles/default/browserlayer.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<layers>
<layer name="collective.qextendedmenu"
interface="collective.qextendedmenu.interfaces.ILayer" />
</layers>
6 changes: 6 additions & 0 deletions collective/qextendedmenu/profiles/default/cssregistry.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0"?>
<object name="portal_css" meta_type="Stylesheets Registry">
<stylesheet cacheable="True" compression="safe" cookable="True"
enabled="1" expression="" id="++resource++qextendedmenu.resources/styles.css" media="screen"
rel="stylesheet" rendering="import"/>
</object>
7 changes: 7 additions & 0 deletions collective/qextendedmenu/profiles/default/metadata.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0"?>
<metadata>
<version>1000</version>
<dependencies>
<dependency>profile-quintagroup.dropdownmenu:default</dependency>
</dependencies>
</metadata>
5 changes: 5 additions & 0 deletions collective/qextendedmenu/profiles/default/registry.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<registry>
<record field="content_tabs_level" interface="quintagroup.dropdownmenu.interfaces.IDropDownMenuSettings" name="quintagroup.dropdownmenu.interfaces.IDropDownMenuSettings.content_tabs_level">
<value>2</value>
</record>
</registry>
13 changes: 13 additions & 0 deletions collective/qextendedmenu/profiles/default/rolemap.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0"?>
<rolemap>
<permissions>
<permission name="collective.qextendedmenu: Manage menu settings"
acquire="True">
<role name="Manager" />
<role name="Site Administrator" />
<role name="Editor" />
<role name="Contributor" />
<role name="Owner" />
</permission>
</permissions>
</rolemap>
39 changes: 39 additions & 0 deletions collective/qextendedmenu/settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
from collective.qextendedmenu.interfaces import IExtendedMenuSettings
from persistent.dict import PersistentDict
from zope.annotation.interfaces import IAnnotations
from zope.interface import implements


class ExtendedMenuSettings(object):
"""
Pretty much copied how it is done in Slideshow Folder
hopefully no one is foolish enough to want a custom slider
and a view slider. If they are then the settings will
overlap.
"""
implements(IExtendedMenuSettings)

settings_key = 'collective.qextendedmenu'

def __init__(self, context):
self.context = context
annotations = IAnnotations(self.context)

self._metadata = annotations.get(self.settings_key, None)
if self._metadata is None:
self._metadata = PersistentDict()
annotations[self.settings_key] = self._metadata

def __setattr__(self, name, value):
if name[0] == '_' or name in ['context', 'settings_key']:
self.__dict__[name] = value
else:
self._metadata[name] = value

def __getattr__(self, name):
value = self._metadata.get(name)
if value is None:
v = IExtendedMenuSettings.get(name)
if v:
return v.default
return value
Loading

0 comments on commit 48b54ea

Please sign in to comment.