Changeset 1190

Show
Ignore:
Timestamp:
07/30/08 10:12:36
Author:
piv
Message:

almost finished with action adding, added kss form validation. it's important to reset form after adding yet and autogenerate id from title on user input

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/kssactions.zcml

    r1189 r1190  
    55    <browser:page 
    66        for="plone.app.kss.interfaces.IPortalObject" 
    7         attribute="toggleGeneratedTabs" 
     7        attribute="kss_toggleGeneratedTabs" 
    88        class=".plonetabs.PloneTabsControlPanel" 
    99        name="plonetabs-toggleGeneratedTabs" 
     
    2121    <browser:page 
    2222        for="plone.app.kss.interfaces.IPortalObject" 
    23         attribute="toggleRootsVisibility" 
     23        attribute="kss_toggleRootsVisibility" 
    2424        class=".plonetabs.PloneTabsControlPanel" 
    2525        name="plonetabs-toggleRootsVisibility" 
     
    3232        class=".plonetabs.PloneTabsControlPanel" 
    3333        name="plonetabs-deleteAction" 
     34        permission="cmf.ManagePortal" 
     35        /> 
     36     
     37    <browser:page 
     38        for="plone.app.kss.interfaces.IPortalObject" 
     39        attribute="kss_addAction" 
     40        class=".plonetabs.PloneTabsControlPanel" 
     41        name="plonetabs-addAction" 
    3442        permission="cmf.ManagePortal" 
    3543        /> 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/plonetabs.py

    r1189 r1190  
    3131 
    3232ACTION_ATTRS = ["id", "title", "url_expr", "available_expr", "visible"] 
     33UI_ATTRS = {"id": "id", 
     34            "title": "name", 
     35            "url_expr": "action", 
     36            "available_expr": "condition", 
     37            "visible": "visible"} 
    3338 
    3439class PloneTabsControlPanel(PloneKSSView): 
     
    126131        # if not errors find (or create) category and set action to it 
    127132        if not errors: 
    128             action = self.addAction(cat_name, form
     133            action = self.addAction(cat_name, data
    129134            IStatusMessage(self.request).addStatusMessage(_(u"'%s' action successfully added." % action.id), type="info") 
    130135            self.redirect(search="category=%s" % cat_name) 
     
    267272        return not site_properties.getProperty("disable_nonfolderish_sections", False) 
    268273     
    269     def getActionsList(self, category="portal_tabs", errors={}): 
    270         """ See interface """ 
    271         return self.actionslist_template(category=category, errors=errors) 
     274    def getActionsList(self, category="portal_tabs", errors={}, tabs=[]): 
     275        """ See interface """ 
     276        kw = {'category': category, 'errors': errors} 
     277        if tabs: 
     278            kw['tabs'] = tabs 
     279        return self.actionslist_template(**kw) 
    272280     
    273281    def getGeneratedTabs(self): 
     
    372380     
    373381    @kssaction 
    374     def toggleGeneratedTabs(self, field, checked='0'): 
     382    def kss_toggleGeneratedTabs(self, field, checked='0'): 
    375383        """ Toggle autogenaration setting on configlet """ 
    376384         
     
    391399     
    392400    @kssaction 
    393     def toggleRootsVisibility(self, id, checked='0'): 
     401    def kss_toggleRootsVisibility(self, id, checked='0'): 
    394402        """ Toggle visibility for portal root objects (exclude_from_nav) """ 
    395403        portal = getMultiAdapter((aq_inner(self.context), self.request), name='plone_portal_state').portal() 
     
    426434        # update client 
    427435        ksscore = self.getCommandSet("core") 
    428         method = (checked == '1') and ksscore.removeClass or ksscore.addClass 
    429         method(ksscore.getHtmlIdSelector(id), value="invisible") 
     436        if checked == '1': 
     437            ksscore.removeClass(ksscore.getHtmlIdSelector(id), value="invisible") 
     438        else: 
     439            ksscore.addClass(ksscore.getHtmlIdSelector(id), value="invisible") 
    430440        self.updatePage(cat_name) 
    431441     
     
    444454        self.updatePage(cat_name) 
    445455     
    446     @kssaction 
    447     def oldAddAction(self, id, name, action='', category='portal_tabs', condition='', visible=False): 
    448         pass 
     456    #@kssaction 
     457    def kss_addAction(self, id, category, title, url_expr, available_expr, visible=False): 
     458        """ KSS method to add new portal action """ 
     459        # extract posted data 
     460        id, cat_name, data = self.parseAddForm({'id':id, 
     461                                                'category': category, 
     462                                                'title': title, 
     463                                                'url_expr': url_expr, 
     464                                                'available_expr': available_expr, 
     465                                                'visible': visible}) 
     466         
     467        # validate posted data 
     468        errors = self.validateActionFields(cat_name, data) 
     469         
     470        # if not errors find (or create) category and set action to it 
     471        kssplone = self.getCommandSet('plone') 
     472        if not errors: 
     473            action = self.addAction(cat_name, data) 
     474             
     475            # update client 
     476            # add one more action to actions list 
     477            ksscore = self.getCommandSet('core') 
     478            content = self.getActionsList(category=cat_name, tabs=[action,]) 
     479            ksscore.insertHTMLAsLastChild(ksscore.getHtmlIdSelector('tabslist'), content) 
     480             
     481            # hide adding form 
     482            ksscore.removeClass(ksscore.getHtmlIdSelector('addaction'), 'adding') 
     483            self.kss_toggleCollapsible(ksscore.getCssSelector('#addaction .collapseAdvanced .headerAdvanced'), collapse='true') 
     484             
     485            # reset adding form 
     486            self.kss_resetForm(ksscore.getHtmlIdSelector('addaction')) 
     487             
     488            # issue portal message 
     489            kssplone.issuePortalMessage(_(u"'%s' action successfully added." % action.id), msgtype="info") 
     490             
     491            # update page 
     492            self.updatePage(cat_name) 
     493        else: 
     494            # send error message 
     495            kssplone.issuePortalMessage(_(u"Please correct the indicated errors."), msgtype="error") 
     496         
     497        # update errors on client fomr 
     498        self.kss_issueErrors(errors) 
     499 
     500        return self.render() 
    449501     
    450502    @kssaction 
     
    563615         
    564616        # preprocess 'visible' field (checkbox needs special checking) 
    565         if form.has_key('visible')
     617        if form.has_key('visible') and form['visible']
    566618            form['visible'] = True 
    567619        else: 
     
    616668         
    617669        return (action_id, category, action) 
     670     
     671    def kss_issueErrors(self, errors, fields=ACTION_ATTRS): 
     672        """ Display error messages on the client """ 
     673        ksscore = self.getCommandSet('core') 
     674        for field in fields: 
     675            self.kss_issueFieldError(ksscore, field, errors.get(field, False)) 
     676     
     677    def kss_issueFieldError(self, ksscore, name, error): 
     678        """ Issue this error message for the field """ 
     679        field_selector = ksscore.getCssSelector('#addaction .field-%s' % UI_ATTRS.get(name, name)) 
     680        field_error_selector = ksscore.getCssSelector('#addaction .field-%s .error-container' % UI_ATTRS.get(name, name)) 
     681        if error: 
     682            ksscore.replaceInnerHTML(field_error_selector, _(error)) 
     683            ksscore.addClass(field_selector, 'error') 
     684        else: 
     685            ksscore.clearChildNodes(field_error_selector) 
     686            ksscore.removeClass(field_selector, 'error') 
     687     
     688    def kss_toggleCollapsible(self, selector, collapsed=None, expanded=None, collapse=None): 
     689        """ KSS Server command to add plonetabs-toggleCollapsible client action to response """ 
     690        command = self.commands.addCommand('plonetabs-toggleCollapsible', selector) 
     691        if collapsed is not None: 
     692            data = command.addParam('collapsed', collapsed) 
     693        if expanded is not None: 
     694            data = command.addParam('expanded', expanded) 
     695        if collapse is not None: 
     696            data = command.addParam('collapse', collapse) 
     697     
     698    def kss_resetForm(self, selector): 
     699        """ KSS Server command to reset form on client """ 
     700        command = self.commands.addCommand('plonetabs-resetForm', selector) 
    618701     
    619702    def validateAction(self, id, category, prefix="tabslist_"): 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/resources/plonetabs.css

    r1174 r1190  
    2626*/ 
    2727 
    28 .kssTabsActive #app.viewing             .reorder-controls, 
    29 .kssTabsActive #app.sorting             .sort-controls, 
    30 /* #app.viewing li.editing             .editform, */ 
     28.kssTabsActive #app.viewing         .reorder-controls, 
     29.kssTabsActive #app.sorting         .sort-controls, 
     30/* #app.viewing li.editing          .editform, */ 
    3131#app.viewing li.editing             .edit-fields-wrapper, 
    3232#app #addaction.adding              .field-visible, 
     
    3636#app #addaction.adding              .field-action label,*/ 
    3737#app #addaction                     .field-action label, 
    38 #app #addaction.adding              .advanced, 
     38#app #addaction.adding              .collapseAdvanced, 
    3939#app #addaction.adding              .field-id, 
    4040#app #addaction.adding              .field-condition, 
     
    6868.kssTabsActive #app                 .field-name dt, 
    6969.kssTabsActive #app                 .field-action, 
    70 .kssTabsActive #app                 .advanced, 
     70.kssTabsActive #app                 .collapseAdvanced, 
    7171.kssTabsActive #app                 .field-id, 
    7272.kssTabsActive #app                 .field-condition, 
     
    368368 } 
    369369 
    370 #app dl.advanced {  
     370#app dl.collapseAdvanced {  
    371371    clear: both; 
    372372} 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/resources/plonetabs.kss

    r1189 r1190  
    2121    setStateVar-varname: plonetabs-category; 
    2222    setStateVar-value: currentFormVar(); 
     23} 
     24 
     25/* Collapse expanded sections on load */ 
     26.collapseAdvanced:load { 
     27    action-client: removeClass; 
     28    removeClass-value: expandedBlock; 
     29    action-client: addClass; 
     30    addClass-value: collapsedBlock; 
    2331} 
    2432 
     
    7987} 
    8088 
     89/* Add form rules */ 
     90#actname:focus { 
     91    action-client: addClass; 
     92    addClass-kssSelector: htmlid(addaction); 
     93    addClass-value: adding; 
     94} 
     95 
     96#buttoncancel:click { 
     97    evt-click-preventdefault: true; 
     98    action-client: removeClass; 
     99    removeClass-kssSelector: htmlid(addaction); 
     100    removeClass-value: adding; 
     101    action-client: plonetabs-toggleCollapsible; 
     102    plonetabs-toggleCollapsible-kssSelector: css('#addaction .collapseAdvanced .headerAdvanced'); 
     103    plonetabs-toggleCollapsible-collapse: true; 
     104} 
     105 
     106#buttonadd:click, 
     107#addaction:submit { 
     108    evt-click-preventdefault: true; 
     109    action-server: plonetabs-addAction; 
     110    plonetabs-addAction-kssSubmitForm: currentForm(); 
     111    plonetabs-addAction-error: plonetabs-handleServerError; 
     112} 
     113 
    81114/* Actions edit */ 
    82115#tabslist .tab-title:click { 
     
    107140    action-server: plonetabs-editSave; 
    108141    plonetabs-editSave-id: nodeAttr(id, true); 
    109      
    110142    plonetabs-editSave-category: stateVar(plonetabs-category); 
    111143} 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/templates/actionslist.pt

    r1188 r1190  
    4646        <dt><label>Name</label></dt> 
    4747        <dd> 
    48           <span tal:content="error">Validation error output</span> 
     48          <span class="error-container" tal:content="error">Validation error output</span> 
    4949          <input type="text" value="" name="title" 
    5050                 tal:attributes="value python:test(request.get(name, []) != [], request.get(name), tab_title); 
     
    6161            <dt><label>URL (Expression)</label></dt> 
    6262            <dd> 
    63               <span tal:content="error">Validation error output</span> 
     63              <span class="error-container" tal:content="error">Validation error output</span> 
    6464              <input type="text" value="" name="url_expr"     size="30" 
    6565                     tal:attributes="value python:test(request.get(name, []) != [], request.get(name), tab_url); 
     
    7272            <dt><label>Id</label></dt> 
    7373            <dd> 
    74               <span tal:content="error">Validation error output</span> 
     74              <span class="error-container" tal:content="error">Validation error output</span> 
    7575              <input type="text" value="" name="id" 
    7676                     tal:attributes="value python:test(request.get(name, []) != [], request.get(name), tab_id); 
     
    8383            <dt><label>Condition (Expression)</label></dt> 
    8484            <dd> 
    85               <span tal:content="error">Validation error output</span> 
     85              <span class="error-container" tal:content="error">Validation error output</span> 
    8686              <input type="text" value="" name="available_expr"  size="30" 
    8787                     tal:attributes="value python:test(request.get(name, []) != [], request.get(name), tab_cond); 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/templates/plonetabs.pt

    r1174 r1190  
    9898    <dl class="field-name" 
    9999        tal:define="error errors/title|nothing" 
    100         tal:attributes="class python:test(error, 'field-name error', 'field-name')"> 
     100        tal:attributes="class python:test(error, '%s error' % attrs['class'], attrs['class'])"> 
    101101      <dt> 
    102102        <label>Name</label> 
    103103      </dt> 
    104104      <dd> 
    105         <span tal:content="error">Validation error output</span> 
     105        <span class="error-container" tal:content="error">Validation error output</span> 
    106106        <input id="actname" type="text" value="" name="title" 
    107107               tal:attributes="value request/title|nothing"/> 
     
    110110    <dl class="field-action" 
    111111        tal:define="error errors/url_expr|nothing" 
    112         tal:attributes="class python:test(error, 'field-action error', 'field-action')"> 
     112        tal:attributes="class python:test(error, '%s error' % attrs['class'], attrs['class'])"> 
    113113      <dt> 
    114114        <label>URL (Expression)</label> 
    115115      </dt> 
    116116      <dd> 
    117         <span tal:content="error">Validation error output</span> 
     117        <span class="error-container" tal:content="error">Validation error output</span> 
    118118        <input id="actaction" type="text" value="" size="30" name="url_expr" 
    119119               tal:attributes="value request/url_expr|nothing"/> 
    120120      </dd> 
    121121    </dl> 
    122     <dl class="advanced collapseAdvanced expandedBlock"> 
     122    <dl class="collapseAdvanced expandedBlock"> 
    123123      <dt class="headerAdvanced">Advanced</dt> 
    124124      <dd class="contentAdvanced"> 
    125125        <dl class="field-id" 
    126126            tal:define="error errors/id|nothing" 
    127             tal:attributes="class python:test(error, 'field-id error', 'field-id')"> 
     127            tal:attributes="class python:test(error, '%s error' % attrs['class'], attrs['class'])"> 
    128128          <dt> 
    129129            <label>Id</label> 
    130130          </dt> 
    131131          <dd> 
    132             <span tal:content="error">Validation error output</span> 
     132            <span class="error-container" tal:content="error">Validation error output</span> 
    133133            <input id="actid" type="text" value="" name="id" 
    134134                   tal:attributes="value request/id|nothing" /> 
     
    137137        <dl class="field-condition" 
    138138            tal:define="error errors/available_expr|nothing" 
    139             tal:attributes="class python:test(error, 'field-condition error', 'field-condition')"> 
     139            tal:attributes="class python:test(error, '%s error' % attrs['class'], attrs['class'])"> 
    140140          <dt> 
    141141            <label>Condition (Expression)</label> 
    142142          </dt> 
    143143          <dd> 
    144             <span tal:content="error">Validation error output</span> 
     144            <span class="error-container" tal:content="error">Validation error output</span> 
    145145            <input id="actcondition" type="text" value="" size="30" name="available_expr" 
    146146                   tal:attributes="value request/available_expr|nothing" /> 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/plugins/configure.zcml

    r1188 r1190  
    2222        jsfile="plugin.js" 
    2323        params_mandatory="" 
    24         params_optional="collapsed expanded
     24        params_optional="collapsed expanded collapse
    2525        /> 
    2626 
     
    3030        params_mandatory="" 
    3131        params_optional="message" 
    32         />         
     32        /> 
     33     
     34    <kss:action 
     35        name="plonetabs-resetForm" 
     36        command_factory="selector" 
     37        jsfile="plugin.js" 
     38        params_mandatory="" 
     39        params_optional="" 
     40        /> 
     41 
    3342     
    3443</configure> 
  • qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/plugins/plugin.js

    r1188 r1190  
    4242kukit.actionsGlobalRegistry.register("plonetabs-toggleCollapsible", function(oper) { 
    4343;;; oper.componentName = "[plonetabs-toggleCollapsible] action"; 
    44     oper.evaluateParameters([], {"collapsed" : "collapsedBlock", "expanded" : "expandedBlock"}); 
     44    oper.evaluateParameters([], {"collapsed" : "collapsedBlock", 
     45                                 "expanded" : "expandedBlock", 
     46                                 "collapse": "none"}); 
    4547 
    4648    var node = oper.node.parentNode;  // collapsible section 
    4749 
    48     if (hasClassName(node, oper.parms.collapsed)) { 
    49         removeClassName(node, oper.parms.collapsed); 
    50         addClassName(node, oper.parms.expanded); 
     50    if (oper.parms.collapse != "none") { 
     51        if (oper.parms.collapse == "true") { 
     52            removeClassName(node, oper.parms.expanded); 
     53            addClassName(node, oper.parms.collapsed); 
     54        } else { 
     55            removeClassName(node, oper.parms.collapsed); 
     56            addClassName(node, oper.parms.expanded); 
     57        } 
    5158    } else { 
    52         removeClassName(node, oper.parms.expanded); 
    53         addClassName(node, oper.parms.collapsed); 
     59        if (hasClassName(node, oper.parms.collapsed)) { 
     60            removeClassName(node, oper.parms.collapsed); 
     61            addClassName(node, oper.parms.expanded); 
     62        } else { 
     63            removeClassName(node, oper.parms.expanded); 
     64            addClassName(node, oper.parms.collapsed); 
     65        } 
    5466    } 
    5567 
     
    5870kukit.commandsGlobalRegistry.registerFromAction("plonetabs-toggleCollapsible", kukit.cr.makeSelectorCommand); 
    5971 
     72kukit.actionsGlobalRegistry.register("plonetabs-resetForm", function(oper) { 
     73;;; oper.componentName = "[plonetabs-resetForm] action"; 
     74    oper.evaluateParameters([], {}); 
     75 
     76    var form = oper.node; 
     77    alert(form.name + 'form reseted'); 
     78 
     79}); 
     80 
     81kukit.commandsGlobalRegistry.registerFromAction("plonetabs-resetForm", kukit.cr.makeSelectorCommand); 
     82 
    6083kukit.actionsGlobalRegistry.register("plonetabs-handleServerError", function(oper) { 
    6184    oper.componentName = "[plonetabs-handleServerError] action";