Skip to content

Commit

Permalink
Merge pull request #48 from plone/toolbar-fixup
Browse files Browse the repository at this point in the history
Toolbar fixup
  • Loading branch information
bloodbare committed Jul 16, 2015
2 parents b821dc5 + 3494e4c commit 1b9920f
Show file tree
Hide file tree
Showing 23 changed files with 385 additions and 409 deletions.
18 changes: 18 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,24 @@ Changelog
- by default, show site logo in social settings
[vangheem]

- Add aria hidden role to avoid screenreaders to nonesense stop by at the
toolbar tiny logo [sneridagh]

- Get rid completely of the plone.skip_links viewlet because it already doesn't
worked OOTB since always and this does not follow modern a11y methods and we
are dropping support for outdated ways [sneridagh]

- Remove all references to "accesskeys" attributes on templates [sneridagh]

- Disabled document_byline viewlet in favor of toolbar action.
[agitator]

- Added documentByLine to @@historyview
[agitator]

- removed DocumentBylineViewlet
[agitator]


2.5.7 (2015-06-05)
------------------
Expand Down
36 changes: 11 additions & 25 deletions plone/app/layout/globals/context.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import warnings

from zope.interface import implements
from zope.component import getMultiAdapter
from zope.component import queryAdapter
Expand Down Expand Up @@ -233,29 +231,17 @@ def actions(self, category=None, max=-1):
context = aq_inner(self.context)
atool = getToolByName(context, "portal_actions")
ttool = getToolByName(context, "portal_types")
if category is None:
warnings.warn(
"The actions method of the context state view was "
"called without a category argument. This is deprecated and "
"won't be supported anymore in Plone 5.",
DeprecationWarning, 3
)
actions = atool.listFilteredActionsFor(
context,
ignore_providers=BLACKLISTED_PROVIDERS,
ignore_categories=BLACKLISTED_CATEGORIES)
else:
actions = []
actions.extend(ttool.listActionInfos(
object=context,
category=category,
max=max,
))
actions.extend(atool.listActionInfos(
object=context,
categories=(category, ),
max=max,
))
actions = []
actions.extend(ttool.listActionInfos(
object=context,
category=category,
max=max,
))
actions.extend(atool.listActionInfos(
object=context,
categories=(category, ),
max=max,
))
return actions

def portlet_assignable(self):
Expand Down
65 changes: 40 additions & 25 deletions plone/app/layout/globals/layout.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,28 @@
from zope.component import getUtility
from plone.registry.interfaces import IRegistry
import json

from Products.CMFCore.utils import getToolByName
from Products.CMFPlone.interfaces.controlpanel import ISiteSchema
from Products.Five.browser.metaconfigure import ViewMixinForTemplates
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from plone.app.layout.globals.interfaces import ILayoutPolicy
from plone.app.layout.globals.interfaces import IViewView
from plone.app.layout.icons.interfaces import IContentIcon
from plone.i18n.normalizer.interfaces import IIDNormalizer
from plone.memoize.view import memoize
from plone.portlets.interfaces import IPortletManager
from plone.portlets.interfaces import IPortletManagerRenderer
from plone.registry.interfaces import IRegistry
from zope.browserpage.viewpagetemplatefile import (
ViewPageTemplateFile as ZopeViewPageTemplateFile
)
from zope.component import getMultiAdapter
from zope.component import queryUtility
from zope.component import getUtility
from zope.component import queryMultiAdapter
from zope.component import queryUtility
from zope.interface import alsoProvides
from zope.interface import implements
from zope.publisher.browser import BrowserView

from Products.CMFCore.utils import getToolByName
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from zope.browserpage.viewpagetemplatefile import (
ViewPageTemplateFile as ZopeViewPageTemplateFile
)
from Products.Five.browser.metaconfigure import ViewMixinForTemplates

from plone.app.layout.globals.interfaces import ILayoutPolicy
from plone.app.layout.globals.interfaces import IViewView
from plone.app.layout.icons.interfaces import IContentIcon


class LayoutPolicy(BrowserView):
"""A view that gives access to various layout related functions.
Expand Down Expand Up @@ -186,23 +187,37 @@ def bodyClass(self, template, view):
for role in user.getRolesInContext(self.context):
body_classes.append('userrole-' + role.lower().replace(' ', '-'))

registry = getUtility(IRegistry)
settings = registry.forInterface(ISiteSchema, prefix='plone', check=False)

# toolbar classes
toolbar_state = self.request.cookies.get('plone-toolbar')
if toolbar_state:
if 'plone-toolbar-left' in toolbar_state:
if 'expanded' in toolbar_state:
try:
left = settings.toolbar_position == 'side'
except KeyError:
left = True
if left:
body_classes.append('plone-toolbar-left')
else:
body_classes.append('plone-toolbar-top')
try:
toolbar_state = self.request.cookies.get('plone-toolbar')
if toolbar_state:
toolbar_state = json.loads(toolbar_state)
else:
toolbar_state = {'expanded': False}
if toolbar_state.get('expanded', True):
body_classes.append('plone-toolbar-expanded')
if left:
body_classes.append('plone-toolbar-left-expanded')
else:
body_classes.append('plone-toolbar-left-default')
if 'plone-toolbar-top' in toolbar_state:
if 'expanded' in toolbar_state:
body_classes.append('plone-toolbar-top-expanded')
else:
if left:
body_classes.append('plone-toolbar-left-default')
else:
body_classes.append('plone-toolbar-top-default')
if 'compressed' in toolbar_state:
body_classes.append('plone-toolbar-compressed')
else:
body_classes.append('plone-toolbar-left-default')
except:
pass

# class for markspeciallinks pattern
properties = getToolByName(context, "portal_properties")
Expand Down
104 changes: 54 additions & 50 deletions plone/app/layout/viewlets/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

from plone.memoize.view import memoize
from zope.component import getMultiAdapter
from zope.component import queryMultiAdapter
from zope.component import getUtility
from zope.deprecation.deprecation import deprecate
from zope.i18n import translate
Expand Down Expand Up @@ -147,15 +148,6 @@ def update(self):
self.enabled = toc


class SkipLinksViewlet(ViewletBase):
index = ViewPageTemplateFile('skip_links.pt')

def update(self):
context_state = getMultiAdapter((self.context, self.request),
name=u'plone_context_state')
self.current_page_url = context_state.current_page_url


class SiteActionsViewlet(ViewletBase):
index = ViewPageTemplateFile('site_actions.pt')

Expand Down Expand Up @@ -242,8 +234,6 @@ def selectedTabs(self, default_tab='index_html', portal_tabs=()):

class PersonalBarViewlet(ViewletBase):

index = ViewPageTemplateFile('personal_bar.pt')

def update(self):
super(PersonalBarViewlet, self).update()
context = aq_inner(self.context)
Expand Down Expand Up @@ -290,13 +280,24 @@ def update(self):

class ContentViewsViewlet(ViewletBase):
index = ViewPageTemplateFile('contentviews.pt')
menu_template = ViewPageTemplateFile('menu.pt')

default_tab = 'nothing'
primary = ['folderContents', 'edit', 'view']

def update(self):
# The drop-down menus are pulled in via a simple content provider
# from plone.app.contentmenu. This behaves differently depending on
# whether the view is marked with IViewView. If our parent view
# provides that marker, we should do it here as well.
super(ContentViewsViewlet, self).update()
if IViewView.providedBy(self.__parent__):
alsoProvides(self, IViewView)

self.tabSet1, self.tabSet2 = self.getTabSets()

@memoize
def prepareObjectTabs(self, default_tab='view',
sort_first=['folderContents']):
"""Prepare the object tabs by determining their order and working
out which tab is selected. Used in global_contentviews.pt
"""
def getTabSets(self):
context = aq_inner(self.context)
context_url = context.absolute_url()
context_fti = context.getTypeInfo()
Expand All @@ -310,8 +311,10 @@ def prepareObjectTabs(self, default_tab='view',
if context_state.is_structural_folder():
action_list = actions('folder')
action_list.extend(actions('object'))
action_list.extend(actions('object_actions'))

tabs = []
tabSet1 = []
tabSet2 = []
found_selected = False
fallback_action = None

Expand Down Expand Up @@ -348,33 +351,55 @@ def prepareObjectTabs(self, default_tab='view',
request_action = context_fti.queryMethodID(
request_action, default=request_action
)
if action_method == request_action:
if action_method == request_action and item['id'] != 'view':
item['selected'] = True
found_selected = True

current_id = item['id']
if current_id == default_tab:
if current_id == self.default_tab:
fallback_action = item

modal = item.get('modal', None)
item['cssClass'] = ''
if modal:
item['cssClass'] += ' pat-plone-modal'
item['url'] += '?ajax_load=1'
if 'ajax_load' not in item['url']:
item['url'] += '?ajax_load=1'

tabs.append(item)
if item['id'] in self.primary:
tabSet1.append(item)
else:
tabSet2.append(item)

if not found_selected and fallback_action is not None:
fallback_action['selected'] = True

def sortOrder(tab):
try:
return sort_first.index(tab['id'])
except ValueError:
return 255
tabSet1.sort(key=lambda item: self.primary.index(item['id']))
return tabSet1, tabSet2

tabs.sort(key=sortOrder)
return tabs
def locked_icon(self):
if not getSecurityManager().checkPermission('Modify portal content',
self.context):
return ""

locked = False
lock_info = queryMultiAdapter((self.context, self.request),
name='plone_lock_info')
if lock_info is not None:
locked = lock_info.is_locked()
else:
context = aq_inner(self.context)
lockable = getattr(context.aq_explicit,
'wl_isLocked', None
) is not None
locked = lockable and context.wl_isLocked()

if not locked:
return ""

portal = self.portal_state.portal()
icon = portal.restrictedTraverse('lock_icon.png')
return icon.tag(title='Locked')


class ManagePortletsFallbackViewlet(ViewletBase):
Expand Down Expand Up @@ -418,27 +443,6 @@ def update(self):
self.breadcrumbs = breadcrumbs_view.breadcrumbs()


class ContentActionsViewlet(ViewletBase):
index = ViewPageTemplateFile('contentactions.pt')

def update(self):
context = aq_inner(self.context)
context_state = getMultiAdapter((context, self.request),
name=u'plone_context_state')

self.object_actions = context_state.actions('object_actions')

# The drop-down menus are pulled in via a simple content provider
# from plone.app.contentmenu. This behaves differently depending on
# whether the view is marked with IViewView. If our parent view
# provides that marker, we should do it here as well.
if IViewView.providedBy(self.__parent__):
alsoProvides(self, IViewView)

def icon(self, action):
return action.get('icon', None)


class TinyLogoViewlet(ViewletBase):
index = ViewPageTemplateFile('tiny_logo.pt')

Expand Down Expand Up @@ -473,4 +477,4 @@ def render_footer_portlets(self):
portlet_manager = getMultiAdapter(
(self.context, self.request, self.__parent__), name='plone.footerportlets')
portlet_manager.update()
return portlet_manager.render()
return portlet_manager.render()
Loading

0 comments on commit 1b9920f

Please sign in to comment.