Changeset 1174

Show
Ignore:
Timestamp:
07/24/08 06:21:33
Author:
piv
Message:

fully refactored action adding and validation

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup.plonetabs.egg-info/PKG-INFO

    r1081 r1174  
    11Metadata-Version: 1.0 
    22Name: quintagroup.plonetabs 
    3 Version: 0.5dev 
     3Version: 0.5dev-r1095 
    44Summary: Quintagroup Plone Tabs 
    55Home-page: http://projects.quintagroup.com/products/wiki/qPloneTabs 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup.plonetabs.egg-info/SOURCES.txt

    r1081 r1174  
    22setup.cfg 
    33setup.py 
     4docs/HISTORY.txt 
     5docs/INSTALL.txt 
     6docs/LICENSE.GPL 
     7docs/LICENSE.txt 
    48quintagroup/__init__.py 
    59quintagroup.plonetabs.egg-info/PKG-INFO 
     
    913quintagroup.plonetabs.egg-info/namespace_packages.txt 
    1014quintagroup.plonetabs.egg-info/not-zip-safe 
    11 quintagroup.plonetabs.egg-info/paster_plugins.txt 
    1215quintagroup.plonetabs.egg-info/requires.txt 
    1316quintagroup.plonetabs.egg-info/top_level.txt 
    1417quintagroup/plonetabs/__init__.py 
     18quintagroup/plonetabs/config.py 
     19quintagroup/plonetabs/configure.zcml 
     20quintagroup/plonetabs/profiles.zcml 
    1521quintagroup/plonetabs/tests.py 
     22quintagroup/plonetabs/version.txt 
     23quintagroup/plonetabs/browser/__init__.py 
     24quintagroup/plonetabs/browser/configure.zcml 
     25quintagroup/plonetabs/browser/interfaces.py 
     26quintagroup/plonetabs/browser/kssactions.zcml 
     27quintagroup/plonetabs/browser/manage.zcml 
     28quintagroup/plonetabs/browser/plonetabs.py 
     29quintagroup/plonetabs/browser/resources.zcml 
     30quintagroup/plonetabs/browser/images/busy_icon.gif 
     31quintagroup/plonetabs/browser/images/drag.gif 
     32quintagroup/plonetabs/browser/images/plonetabs.gif 
     33quintagroup/plonetabs/browser/images/trash.gif 
     34quintagroup/plonetabs/browser/images/treeCollapsed.gif 
     35quintagroup/plonetabs/browser/images/treeExpanded.gif 
     36quintagroup/plonetabs/browser/resources/plonetabs.css 
     37quintagroup/plonetabs/browser/resources/plonetabs.kss 
     38quintagroup/plonetabs/browser/templates/actionslist.pt 
     39quintagroup/plonetabs/browser/templates/autogenerated.pt 
     40quintagroup/plonetabs/browser/templates/plonetabs.pt 
     41quintagroup/plonetabs/browser/templates/sections.pt 
     42quintagroup/plonetabs/plugins/__init__.py 
     43quintagroup/plonetabs/plugins/configure.zcml 
     44quintagroup/plonetabs/plugins/plugin.js 
     45quintagroup/plonetabs/profiles/default/actionicons.xml 
     46quintagroup/plonetabs/profiles/default/controlpanel.xml 
     47quintagroup/plonetabs/profiles/default/cssregistry.xml 
     48quintagroup/plonetabs/profiles/default/kssregistry.xml 
     49quintagroup/plonetabs/profiles/default/propertiestool.xml 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/configure.zcml

    r1092 r1174  
    1616        allowed_interface = ".interfaces.IPloneTabsControlPanel" 
    1717        /> 
     18 
     19    <browser:page 
     20        name="plonetabs-header-macro" 
     21        for="*" 
     22        template="templates/plonetabs_header_macro.pt" 
     23        permission="zope.Public" 
     24        /> 
    1825     
    1926</configure> 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/plonetabs.py

    r1094 r1174  
    11import copy, sys 
    2  
    32from Acquisition import aq_inner 
     3from OFS.CopySupport import CopyError 
    44 
    55from zope.interface import implements 
     
    88from zope.schema.interfaces import IVocabularyFactory 
    99from zope.exceptions import UserError 
    10  
    11 from OFS.CopySupport import CopyError 
     10from zope.app.container.interfaces import INameChooser 
    1211 
    1312from Products.CMFCore.utils import getToolByName 
     
    1514from Products.CMFCore.ActionInformation import Action, ActionCategory 
    1615from Products.CMFCore.Expression import Expression 
    17 from Products.CMFEditions.setuphandlers import DEFAULT_POLICIES 
    1816from Products.CMFPlone import PloneMessageFactory as _ 
    19 from Products.CMFPlone import PloneMessageFactory as pmf 
    2017from Products.CMFPlone import utils 
    2118from Products.CMFPlone.browser.navigation import get_view_url 
     
    4239    actionslist_template = ViewPageTemplateFile("templates/actionslist.pt") 
    4340    autogenerated_template = ViewPageTemplateFile("templates/autogenerated.pt") 
     41     
     42    # custom templates used to update page sections 
    4443    sections_template = ViewPageTemplateFile("templates/sections.pt") 
    4544     
     
    5554         
    5655        # action handler def handler(self, form) 
    57         if action == "add_action"
    58             if submitted
     56        if submitted
     57            if form.has_key('add.add')
    5958                postback = self.manage_addAction(form, errors) 
    60         elif action == "edit_action": 
    61             if submitted: 
     59            elif form.has_key("edit.save"): 
    6260                postback = self.manage_editAction(form, errors) 
    63         elif action == "delete_action": 
    64             postback = self.manage_deleteAction(self.request, errors) 
    65         #elif action == "visible_action": 
    66                 #pass 
    67         elif action == "moveup_action": 
    68             postback = self.manage_moveUpAction(self.request, errors) 
    69         elif action == "movedown_action": 
    70             postback = self.manage_moveDownAction(self.request, errors) 
    71         elif action == "set_autogeneration": 
    72             if submitted: 
     61            elif form.has_key("edit.delete"): 
     62                postback = self.manage_deleteAction(form, errors) 
     63            elif form.has_key("edit.moveup"): 
     64                postback = self.manage_moveUpAction(form, errors) 
     65            elif form.has_key("edit.movedown"): 
     66                postback = self.manage_moveDownAction(form, errors) 
     67            elif form.has_key("autogenerated.save"): 
    7368                postback = self.manage_setAutogeneration(form, errors) 
    74         else: 
    75             postback = True 
     69            else: 
     70                postback = True 
    7671         
    7772        if postback: 
     
    119114        return False 
    120115     
    121     def manage_addAction(self, form, errors): 
     116    def manage_addAction(self, form, errs): 
    122117        """ Add a new action to given category, if category doesn't exist, create it """ 
    123          
    124         # extract data from request's form 
    125         id = form.get("id") 
    126         category = form.get("category") 
     118        cat_name = form['category'] 
    127119         
    128120        # before checking for existence category we will validate all input data 
    129121        # and issue errors if needed 
    130          
    131         # create and validate action 
    132         if not id: 
    133             errors["id"] = _(u"Id field is required") 
    134         if not form.get("title"): 
    135             errors["title"] = _(u"Title field is required") 
    136  
    137         action = Action(id) 
    138         for prop in ACTION_ATTRS: 
    139             if prop != "id": 
    140                 try: 
    141                     if prop == "visible": 
    142                         value = int(form.get(prop, '0')) 
    143                     else: 
    144                         value = form.get(prop) 
    145                      
    146                     action._setPropValue(prop, value) 
    147                 except Exception, e: 
    148                     errors[prop] = "%s" % str(e) 
     122        errors = self.validateActionFields(form) 
    149123         
    150124        # if not errors find (or create) category and set action to it 
    151125        if not errors: 
    152             portal_actions = getToolByName(self.context, "portal_actions") 
    153             cat_container = None 
    154              
    155             if category not in map(lambda x: x.id, filter(lambda x: IActionCategory.providedBy(x), portal_actions.objectValues())): 
    156                 try: 
    157                     portal_actions._setObject(category, ActionCategory(category)) 
    158                 except Exception, e: 
    159                     errors["select_category"] = "%s" % str(e) 
    160                 else: 
    161                     cat_container = portal_actions[category] 
    162             else: 
    163                 cat_container = portal_actions[category] 
    164              
    165             if cat_container is not None: 
    166                 try: 
    167                     cat_container._setObject(id, action) 
    168                 except Exception, e: 
    169                     errors["id"] = "%s" % str(e) 
    170          
    171         if not errors: 
    172             IStatusMessage(self.request).addStatusMessage(_(u"'%s' action successfully added." % id), type="info") 
    173             self.redirect(search="category=%s" % category) 
     126            action = self.addAction(cat_name, form) 
     127            IStatusMessage(self.request).addStatusMessage(_(u"'%s' action successfully added." % action.id), type="info") 
     128            self.redirect(search="category=%s" % cat_name) 
    174129            return False 
    175130        else: 
     131            errs.update(errors) 
    176132            IStatusMessage(self.request).addStatusMessage(_(u"Please correct the indicated errors."), type="error") 
    177133            return True 
    178134     
    179     def manage_editAction(self, form, errors): 
    180         """ Add a new action to given category, if category doesn't exist, create it """ 
     135    def manage_editAction(self, form, errs): 
     136        """ Process after edit form post """ 
    181137        portal_actions = getToolByName(self.context, "portal_actions") 
    182138         
     
    251207        return True 
    252208     
    253     def manage_deleteAction(self, request, errors): 
     209    def manage_deleteAction(self, form, errors): 
    254210        """ Delete action with given id/category """ 
    255211        portal_actions = getToolByName(self.context, "portal_actions") 
    256212 
    257         id = request.get("id", "") 
    258         category = request.get("category", "") 
     213        id = form.get("orig_id", "") 
     214        category = form.get("category", "") 
    259215         
    260216        if category not in portal_actions.objectIds(): 
     
    267223                cat_container.manage_delObjects(ids=[id,]) 
    268224                IStatusMessage(self.request).addStatusMessage(_(u"'%s' action in '%s' category successfully deleted" % (id, category)), type="info") 
    269          
    270         self.redirect(search="category=%s" % category) 
    271         return False 
    272      
    273     def manage_moveUpAction(self, request, errors): 
     225                 
     226                # redirect to form after successfull deletion 
     227                self.redirect(search="category=%s" % category) 
     228                return False 
     229         
     230        # return form with errors 
     231        return True 
     232 
     233     
     234    def manage_moveUpAction(self, form, errors): 
    274235        """ Move up given action by one position """ 
    275236        portal_actions = getToolByName(self.context, "portal_actions") 
    276  
    277         id = request.get("id", "") 
    278         category = request.get("category", "") 
     237         
     238        id = form.get("orig_id", "") 
     239        category = form.get("category", "") 
    279240         
    280241        if category not in portal_actions.objectIds(): 
     
    287248                cat_container.moveObjectsUp([id,], 1) 
    288249                IStatusMessage(self.request).addStatusMessage(_(u"'%s' action in '%s' category moved up" % (id, category)), type="info") 
    289          
    290         self.redirect(search="category=%s" % category) 
    291         return False 
    292      
    293     def manage_moveDownAction(self, request, errors): 
     250                 
     251                # redirect to form after successfull deletion 
     252                self.redirect(search="category=%s" % category) 
     253                return False 
     254         
     255        # return form with errors 
     256        return True 
     257     
     258    def manage_moveDownAction(self, form, errors): 
    294259        """ Move up given action by one position """ 
    295260        portal_actions = getToolByName(self.context, "portal_actions") 
    296  
    297         id = request.get("id", "") 
    298         category = request.get("category", "") 
     261         
     262        id = form.get("orig_id", "") 
     263        category = form.get("category", "") 
    299264         
    300265        if category not in portal_actions.objectIds(): 
     
    307272                cat_container.moveObjectsDown([id,], 1) 
    308273                IStatusMessage(self.request).addStatusMessage(_(u"'%s' action in '%s' category moved down" % (id, category)), type="info") 
    309          
    310         self.redirect(search="category=%s" % category) 
    311         return False 
     274                 
     275                # redirect to form after successfull deletion 
     276                self.redirect(search="category=%s" % category) 
     277                return False 
     278         
     279        # return form with errors 
     280        return True 
    312281     
    313282    def redirect(self, url="", search="", hash=""): 
     
    478447    ########################## 
    479448     
    480     def updateGlobalSections(self, ksscore): 
    481         """ Method for updating global-sections on client """ 
    482         ksscore.replaceHTML( 
    483             ksscore.getHtmlIdSelector("portal-globalnav"), 
    484             self.sections_template(), 
    485             withKssSetup="False") 
    486      
    487      
    488     # XXX TODO 
    489     #def updateSection(self, ksscore, section): 
    490         #""" Method for updating global-sections on client """ 
    491          
    492         #replace_id = section 
    493         #macro = SECTION_MAPPING.get(section, None) 
    494          
    495         #if macro is not None: 
    496             #ksscore.replaceHTML( 
    497                 #ksscore.getHtmlIdSelector(replace_id), 
    498                 #self.macroContent(macro), 
    499                 ##self.sections_template(), 
    500                 #withKssSetup="False") 
    501      
    502449    def validateAction(self, id, category, prefix="tabslist_"): 
    503450        """ If action with given id and category doesn't exist - raise kss exception """ 
     
    533480         
    534481        # update global-sections viewlet 
    535         self.updateGlobalSections(ksscore
     482        self.updatePortalTabs(
    536483     
    537484    @kssaction 
     
    554501            ksscore.addClass(ksscore.getHtmlIdSelector(id), value="invisible") 
    555502         
    556         # update global-sections viewlet 
    557         if category == "portal_tabs": 
    558             self.updateGlobalSections(ksscore) 
     503        self.updatePage(category) 
    559504     
    560505    @kssaction 
     
    583528         
    584529        # update global-sections viewlet 
    585         self.updateGlobalSections(ksscore
     530        self.updatePortalTabs(
    586531     
    587532    @kssaction 
     
    604549        # XXX TODO: fade effect during removing, for this kukit js action/command plugin needed 
    605550         
    606         # update global-sections viewlet 
    607         if category == "portal_tabs": 
    608             self.updateGlobalSections(ksscore) 
     551        self.updatePage(category) 
     552     
     553    @kssaction 
     554    def oldAddAction(self, id, name, action='', category='portal_tabs', condition='', visible=False): 
     555        pass 
    609556     
    610557    @kssaction 
     
    646593        return action_info 
    647594     
    648  
    649  
    650  
    651  
    652  
    653  
    654  
    655  
    656  
    657  
     595     
     596     
     597        if not id: 
     598            errors["id"] = _(u"Id field is required") 
     599        if not form.get("title"): 
     600            errors["title"] = _(u"Title field is required") 
     601 
     602        action = Action(id) 
     603        for prop in ACTION_ATTRS: 
     604            if prop != "id": 
     605                try: 
     606                    if prop == "visible": 
     607                        value = int(form.get(prop, '0')) 
     608                    else: 
     609                        value = form.get(prop) 
     610                     
     611                    action._setPropValue(prop, value) 
     612                except Exception, e: 
     613                    errors[prop] = "%s" % str(e) 
     614     
     615    def validateActionFields(self, data): 
     616        """ Check action fields on validity """ 
     617        errors = {} 
     618         
     619        # get or create (if necessary) actions category 
     620        cat_name = data['category'] 
     621        category = self.getOrCreateCategory(cat_name) 
     622         
     623        # validate action id 
     624        chooser = INameChooser(category) 
     625        try: 
     626            chooser.checkName(data['id'], self.context) 
     627        except Exception, e: 
     628            errors['id'] = "%s" % str(e) 
     629         
     630        # validate action name 
     631        if not data['title'].strip(): 
     632            errors['title'] = 'Empty or invalid id specified' 
     633         
     634        # validate condition expression 
     635        if data['available_expr']: 
     636            try: 
     637                Expression(data['available_expr']) 
     638            except Exception, e: 
     639                errors["available_expr"] = "%s" % str(e) 
     640         
     641        # validate action expression 
     642        if data['url_expr']: 
     643            try: 
     644                Expression(data['url_expr']) 
     645            except Exception, e: 
     646                errors["url_expr"] = "%s" % str(e) 
     647         
     648        return errors 
     649     
     650    def getOrCreateCategory(self, name): 
     651        portal_actions = getToolByName(self.context, 'portal_actions') 
     652        if name not in map(lambda x: x.id, filter(lambda x: IActionCategory.providedBy(x), portal_actions.objectValues())): 
     653            portal_actions._setObject(name, ActionCategory(name)) 
     654            category = portal_actions[name] 
     655        else: 
     656            category = portal_actions[name] 
     657        return category 
     658     
     659    def addAction(self, cat_name, data): 
     660        """ Create and add new action to category with given name """ 
     661         
     662        # get or create category if it's necessary 
     663        id = data.pop('id') 
     664        category = self.getOrCreateCategory(cat_name) 
     665         
     666        # add action 
     667        action = Action(id, **data) 
     668        category._setObject(id, action) 
     669        return action 
     670     
     671    # KSS Methods that are used to update different parts of the page 
     672    # according to category 
     673     
     674    def updatePage(self, category): 
     675        """ Seek for according method in class and calls it if found 
     676            Example of making up method's name: 
     677                portal_tabs => updatePortalTabs """ 
     678        method_name = 'update%sPageSection' % ''.join(map(lambda x: x.capitalize(), category.split('_'))) 
     679        if hasattr(self, method_name): 
     680            getattr(self, method_name)() 
     681     
     682    def updatePortalTabsPageSection(self): 
     683        """ Method for updating global-sections on client """ 
     684        ksscore = self.getCommandSet("core") 
     685        ksscore.replaceHTML( 
     686            ksscore.getHtmlIdSelector("portal-globalnav"), 
     687            self.sections_template(), 
     688            withKssSetup="False") 
     689     
     690    def updateSiteActionsPageSection(self): 
     691        """ Method for updating site action on client """ 
     692        ksszope = self.getCommandSet("zope") 
     693        ksszope.refreshViewlet( 
     694            self.getCommandSet("core").getHtmlIdSelector("portal-siteactions"), 
     695            "plone.portalheader", 
     696            "plone.site_actions") 
     697     
     698    def updateUserPageSection(self): 
     699        """ Method for updating site action on client """ 
     700        ksszope = self.getCommandSet("zope") 
     701        ksszope.refreshViewlet( 
     702            self.getCommandSet("core").getHtmlIdSelector("portal-personaltools-wrapper"), 
     703            "plone.portaltop", 
     704            "plone.personal_bar") 
     705 
     706 
     707 
     708 
     709 
     710 
     711 
     712 
     713 
     714 
     715 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/resources/plonetabs.css

    r1095 r1174  
    6060 
    6161#app                                .drag-handle, 
    62 .kssTabsActive #app                 .delete, 
     62#app                                .delete, 
    6363.kssTabsActive #app                 .visibility, 
    6464/* .kssTabsActive #app                 .editform, */ 
     
    7373.kssTabsActive #app                 .add-controls, 
    7474.kssTabsActive #app                 .change-button, 
    75 .kssTabsActive #app                 .up-arrow, 
    76 .kssTabsActive #app                 .down-arrow, 
    7775#app                                .editcancel { 
    7876    display: none; 
     
    8078 
    8179#app.working #busy, 
    82 #app.viewing ul.csshover li:hover    .delete, 
    83 #app.viewing ul.csshover li.onHover  .delete, 
     80.kssTabsActive #app.viewing ul.csshover li:hover    .delete, 
     81.kssTabsActive #app.viewing ul.csshover li.onHover  .delete, 
    8482#app.viewing ul.csshover li:hover    .visibility, 
    8583#app.viewing ul.csshover li.onHover  .visibility, 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/resources/plonetabs.kss

    r1092 r1174  
    1616} 
    1717 
    18 #actions_category:load { 
     18#select_category:load { 
    1919    action-client: setStateVar; 
    2020    setStateVar-varname: plonetabs-category; 
     
    2424#select_category:change { 
    2525    action-client: plonetabs-redirectTo; 
    26     plonetabs-redirectTo-search: currentFormVar(); 
     26    plonetabs-redirectTo-searchparams: 'category'; 
     27    plonetabs-redirectTo-searchvalues: currentFormVar(); 
    2728} 
    2829 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/templates/actionslist.pt

    r1095 r1174  
    1717  <a class="delete" href="#" 
    1818     tal:attributes="href string:${context/portal_url}/@@plonetabs-controlpanel?action=delete_action&category=${category}&id=${id}">Delete</a> 
    19   <a href="#" title="Move up" class="up-arrow" 
    20      tal:condition="not:repeat/tab/start" 
    21      tal:attributes="href string:${context/portal_url}/@@plonetabs-controlpanel?action=moveup_action&category=${category}&id=${id}"> 
    22     &uarr; 
    23   </a> 
    24   <a href="#" title="Move down" class="down-arrow" 
    25      tal:condition="not:repeat/tab/end" 
    26      tal:attributes="href string:${context/portal_url}/@@plonetabs-controlpanel?action=movedown_action&category=${category}&id=${id}"> 
    27     &darr; 
    28   </a> 
    2919 
    3020  <span class="url-helper" tal:content="tab/url_expr">Tab Action</span> 
     
    3929 
    4030    <input type="hidden" name="orig_id" value="orig_id" tal:attributes="value id" /> 
    41     <input type="hidden" name="action" value="edit_action" /> 
    4231    <input type="hidden" name="category" value="current_category" tal:attributes="value category" /> 
    4332    <input type="hidden" name="form.submitted:boolean" value="True" /> 
     
    10796 
    10897      <div> 
    109         <input type="submit" class="editsave"   i18n:attributes="value" value="Save"   /> 
    110         <input type="submit" class="editcancel" i18n:attributes="value" value="Cancel" /> 
    111         <input type="reset"  class="editreset"  i18n:attributes="value" value="Reset"  /> 
     98        <input type="submit" class="editsave"   i18n:attributes="value" name="edit.save" value="Save" /> 
     99        <input type="submit" class="editcancel" i18n:attributes="value" name="edit.cancel" value="Cancel" /> 
     100        <input type="reset"  class="editreset"  i18n:attributes="value" name="edit.reset" value="Reset" /> 
     101        <input type="submit"  class="editdelete"  i18n:attributes="value" name="edit.delete" value="Delete" /> 
     102        <input type="submit"  class="editmoveup"  i18n:attributes="value" name="edit.moveup" value="Move Up" 
     103               tal:condition="not:repeat/tab/start" /> 
     104        <input type="submit"  class="editmovedown"  i18n:attributes="value" name="edit.movedown" value="Move Down" 
     105               tal:condition="not:repeat/tab/end" /> 
    112106      </div> 
    113107 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/templates/autogenerated.pt

    r1087 r1174  
    1 <metal:block use-macro="here/global_defines/macros/defines" /> 
    2  
    3 <tal:cache tal:define="lang language; 
    4                        charset site_properties/default_charset|string:utf-8"> 
    5   <metal:cache use-macro="here/global_cache_settings/macros/cacheheaders"> 
    6     Get the global cache headers located in global_cache_settings. 
    7   </metal:cache> 
    8 </tal:cache> 
     1<metal:header_macro use-macro="context/@@plonetabs-header-macro/macros/header" /> 
    92 
    103<tal:tabs tal:define="dummy python:request.RESPONSE.setHeader('Expires', 'Mon, 26 Jul 1996 05:00:00 GMT')" 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/templates/plonetabs.pt

    r1094 r1174  
    6060          </tal:options> 
    6161        </select> 
    62         <input class="change-button" type="submit" name="selectcategory_button" value="Change" /> 
     62        <input class="change-button" type="submit" name="category.change" value="Change" /> 
    6363      </div> 
    6464    </form> 
    6565  </div> 
    66  
    67   <input type="hidden" name="category" value="portal_tabs" id="actions_category" 
    68          tal:attributes="value category" /> 
    6966 
    7067  <div class="reorder-controls" 
     
    8885        action="@@plonetabs-controlpanel" 
    8986        tal:attributes="action string:${portal_url}/${attrs/action}"> 
    90     <input type="hidden" name="action" value="add_action" /> 
    9187    <input type="hidden" name="form.submitted:boolean" value="True" /> 
    9288    <input type="hidden" name="category" value="category" tal:attributes="value category" /> 
     
    155151    </dl> 
    156152    <div class="add-controls"> 
    157       <input type="submit" id="buttonadd" i18n:attributes="value" value="Add" /> 
    158       <input type="submit" id="buttoncancel" i18n:attributes="value" value="Cancel" /> 
     153      <input type="submit" id="buttonadd" i18n:attributes="value" name="add.add" value="Add" /> 
     154      <input type="submit" id="buttoncancel" i18n:attributes="value" name="add.cancel" value="Cancel" /> 
    159155    </div> 
    160156  </form> 
     
    167163          tal:attributes="action string:${portal_url}/${attrs/action}"> 
    168164 
    169       <input type="hidden" name="action" value="set_autogeneration" /> 
    170165      <input type="hidden" name="form.submitted:boolean" value="True" /> 
    171166 
     
    208203 
    209204      <div id="autogeneration_controls"> 
    210           <input class="submit-button" type="submit" name="generated_roots_button" value="Save" /> 
     205          <input class="submit-button" type="submit" name="autogenerated.save" value="Save" /> 
    211206      </div> 
    212207 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/templates/sections.pt

    r1085 r1174  
    1 <metal:block use-macro="here/global_defines/macros/defines" /> 
    2  
    3 <tal:cache tal:define="lang language; 
    4                        charset site_properties/default_charset|string:utf-8"> 
    5   <metal:cache use-macro="here/global_cache_settings/macros/cacheheaders"> 
    6     Get the global cache headers located in global_cache_settings. 
    7   </metal:cache> 
    8 </tal:cache> 
     1<metal:header_macro use-macro="here/@@plonetabs-header-macro/macros/header" /> 
    92 
    103<tal:tabs i18n:domain="plone"> 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/plugins/configure.zcml

    r1082 r1174  
    1414        jsfile="plugin.js" 
    1515        params_mandatory="" 
    16         params_optional="protocol host pathname search hash" 
     16        params_optional="protocol host pathname search searchparams searchvalues hash" 
    1717        /> 
    1818     
    19 <!--     <kss:action 
    20         name="plone-removeLockProtection
     19    <kss:action 
     20        name="plonetabs-toggleCollapsible
    2121        command_factory="selector" 
    2222        jsfile="plugin.js" 
     23        params_mandatory="" 
     24        params_optional="collapsed expanded" 
    2325        /> 
    24  
    25      <kss:action 
    26         name="plone-initLockingProtection" 
    27         command_factory="selector" 
    28         jsfile="plugin.js" 
    29         /> 
    30  
    31     <kss:action 
    32         name="plone-initKupu" 
    33         command_factory="selector" 
    34         jsfile="plugin.js" 
    35         /> 
    36  
    37     <kss:action 
    38         name="plone-followLink" 
    39         command_factory="selector" 
    40         jsfile="plugin.js" 
    41         /> 
    42  
    43     <kss:action 
    44         name="plone-submitCurrentForm" 
    45         command_factory="selector" 
    46         jsfile="plugin.js" 
    47         /> 
    48  
    49     <kss:action 
    50         name="plone-initFormTabs" 
    51         command_factory="selector" 
    52         jsfile="plugin.js" 
    53         /> 
    54  
    55     <kss:action 
    56         name="plone-formProtectionCheck" 
    57         command_factory="selector" 
    58         jsfile="plugin.js" 
    59         /> 
    60  
    61     <kss:eventtype 
    62         name="plone-formProtectionChecked" 
    63         jsfile="plugin.js" 
    64         /> 
    65  
    66     <kss:eventtype 
    67         name="plone-formProtectionFailed" 
    68         jsfile="plugin.js" 
    69         /> 
    70  
    71     <kss:action 
    72         name="plone-initFormProtection" 
    73         command_factory="selector" 
    74         jsfile="plugin.js" 
    75         /> 
    76  
    77     <kss:action 
    78         name="plone-initShiftDetection" 
    79         command_factory="global" 
    80         jsfile="plugin.js" 
    81         /> 
    82  
    83     <kss:action 
    84         name="plone-initCheckBoxSelection" 
    85         command_factory="global" 
    86         jsfile="plugin.js" 
    87         /> 
    88  
    89     <kss:action 
    90         name="plone-createCheckBoxSelection" 
    91         command_factory="selector" 
    92         jsfile="plugin.js" 
    93         /> 
    94  
    95     <kss:action 
    96         name="plone-initDragAndDrop" 
    97         command_factory="global" 
    98         jsfile="plugin.js" 
    99         />--> 
    100  
     26     
    10127</configure> 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/plugins/plugin.js

    r1087 r1174  
    77;;; oper.componentName = "[plonetabs-redirectTo] action"; 
    88    var wl = window.location; 
    9     oper.evaluateParameters([], {"protocol" : wl.protocol, 
    10                                  "host"     : wl.host, 
    11                                  "pathname" : wl.pathname, 
    12                                  "search"   : wl.search, 
    13                                  "hash"     : wl.hash}); 
     9    oper.evaluateParameters([], {"protocol"     : wl.protocol, 
     10                                 "host"         : wl.host, 
     11                                 "pathname"     : wl.pathname, 
     12                                 "search"       : wl.search, 
     13                                 "searchparams" : "", 
     14                                 "searchvalues" : "", 
     15                                 "hash"         : wl.hash}); 
    1416 
    1517    // normalize parameters 
     
    1719    var host = oper.parms.host; 
    1820    var pathname = oper.parms.pathname; 
    19     var search = (oper.parms.search.substr(0, 1) == "?") ? "" : "?" + oper.parms.search; 
     21    if ((params = oper.parms.searchparams) && (values = oper.parms.searchvalues)) { 
     22        search = "?"; 
     23        params = params.split(","); 
     24        values = values.split(","); 
     25        for (var i = 0; i < params.length; i++) { 
     26            search += params[i] + '=' + values[i] + '&'; 
     27        } 
     28        search = (search.slice(search.length - 1) == '&') ? search.slice(0, search.length - 1) : search; 
     29    } else { 
     30        search = oper.parms.search; 
     31        search = (search && search.substr(0, 1) == "?") ? search : (search ? "?" + search : ""); 
     32    } 
    2033    var hash = (oper.parms.hash.length > 1) ? ((oper.parms.hash.substr(0, 1) == "#" ? "" : "#") + oper.parms.hash) : ""; 
    2134