Changeset 1190
- Timestamp:
- 07/30/08 10:12:36
- Files:
-
- qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/kssactions.zcml (modified) (3 diffs)
- qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/plonetabs.py (modified) (9 diffs)
- qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/resources/plonetabs.css (modified) (4 diffs)
- qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/resources/plonetabs.kss (modified) (3 diffs)
- qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/templates/actionslist.pt (modified) (4 diffs)
- qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/templates/plonetabs.pt (modified) (3 diffs)
- qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/plugins/configure.zcml (modified) (2 diffs)
- qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/plugins/plugin.js (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/kssactions.zcml
r1189 r1190 5 5 <browser:page 6 6 for="plone.app.kss.interfaces.IPortalObject" 7 attribute=" toggleGeneratedTabs"7 attribute="kss_toggleGeneratedTabs" 8 8 class=".plonetabs.PloneTabsControlPanel" 9 9 name="plonetabs-toggleGeneratedTabs" … … 21 21 <browser:page 22 22 for="plone.app.kss.interfaces.IPortalObject" 23 attribute=" toggleRootsVisibility"23 attribute="kss_toggleRootsVisibility" 24 24 class=".plonetabs.PloneTabsControlPanel" 25 25 name="plonetabs-toggleRootsVisibility" … … 32 32 class=".plonetabs.PloneTabsControlPanel" 33 33 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" 34 42 permission="cmf.ManagePortal" 35 43 /> qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/plonetabs.py
r1189 r1190 31 31 32 32 ACTION_ATTRS = ["id", "title", "url_expr", "available_expr", "visible"] 33 UI_ATTRS = {"id": "id", 34 "title": "name", 35 "url_expr": "action", 36 "available_expr": "condition", 37 "visible": "visible"} 33 38 34 39 class PloneTabsControlPanel(PloneKSSView): … … 126 131 # if not errors find (or create) category and set action to it 127 132 if not errors: 128 action = self.addAction(cat_name, form)133 action = self.addAction(cat_name, data) 129 134 IStatusMessage(self.request).addStatusMessage(_(u"'%s' action successfully added." % action.id), type="info") 130 135 self.redirect(search="category=%s" % cat_name) … … 267 272 return not site_properties.getProperty("disable_nonfolderish_sections", False) 268 273 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) 272 280 273 281 def getGeneratedTabs(self): … … 372 380 373 381 @kssaction 374 def toggleGeneratedTabs(self, field, checked='0'):382 def kss_toggleGeneratedTabs(self, field, checked='0'): 375 383 """ Toggle autogenaration setting on configlet """ 376 384 … … 391 399 392 400 @kssaction 393 def toggleRootsVisibility(self, id, checked='0'):401 def kss_toggleRootsVisibility(self, id, checked='0'): 394 402 """ Toggle visibility for portal root objects (exclude_from_nav) """ 395 403 portal = getMultiAdapter((aq_inner(self.context), self.request), name='plone_portal_state').portal() … … 426 434 # update client 427 435 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") 430 440 self.updatePage(cat_name) 431 441 … … 444 454 self.updatePage(cat_name) 445 455 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() 449 501 450 502 @kssaction … … 563 615 564 616 # preprocess 'visible' field (checkbox needs special checking) 565 if form.has_key('visible') :617 if form.has_key('visible') and form['visible']: 566 618 form['visible'] = True 567 619 else: … … 616 668 617 669 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) 618 701 619 702 def validateAction(self, id, category, prefix="tabslist_"): qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/resources/plonetabs.css
r1174 r1190 26 26 */ 27 27 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, */ 31 31 #app.viewing li.editing .edit-fields-wrapper, 32 32 #app #addaction.adding .field-visible, … … 36 36 #app #addaction.adding .field-action label,*/ 37 37 #app #addaction .field-action label, 38 #app #addaction.adding . advanced,38 #app #addaction.adding .collapseAdvanced, 39 39 #app #addaction.adding .field-id, 40 40 #app #addaction.adding .field-condition, … … 68 68 .kssTabsActive #app .field-name dt, 69 69 .kssTabsActive #app .field-action, 70 .kssTabsActive #app . advanced,70 .kssTabsActive #app .collapseAdvanced, 71 71 .kssTabsActive #app .field-id, 72 72 .kssTabsActive #app .field-condition, … … 368 368 } 369 369 370 #app dl. advanced {370 #app dl.collapseAdvanced { 371 371 clear: both; 372 372 } qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/resources/plonetabs.kss
r1189 r1190 21 21 setStateVar-varname: plonetabs-category; 22 22 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; 23 31 } 24 32 … … 79 87 } 80 88 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 81 114 /* Actions edit */ 82 115 #tabslist .tab-title:click { … … 107 140 action-server: plonetabs-editSave; 108 141 plonetabs-editSave-id: nodeAttr(id, true); 109 110 142 plonetabs-editSave-category: stateVar(plonetabs-category); 111 143 } qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/browser/templates/actionslist.pt
r1188 r1190 46 46 <dt><label>Name</label></dt> 47 47 <dd> 48 <span tal:content="error">Validation error output</span>48 <span class="error-container" tal:content="error">Validation error output</span> 49 49 <input type="text" value="" name="title" 50 50 tal:attributes="value python:test(request.get(name, []) != [], request.get(name), tab_title); … … 61 61 <dt><label>URL (Expression)</label></dt> 62 62 <dd> 63 <span tal:content="error">Validation error output</span>63 <span class="error-container" tal:content="error">Validation error output</span> 64 64 <input type="text" value="" name="url_expr" size="30" 65 65 tal:attributes="value python:test(request.get(name, []) != [], request.get(name), tab_url); … … 72 72 <dt><label>Id</label></dt> 73 73 <dd> 74 <span tal:content="error">Validation error output</span>74 <span class="error-container" tal:content="error">Validation error output</span> 75 75 <input type="text" value="" name="id" 76 76 tal:attributes="value python:test(request.get(name, []) != [], request.get(name), tab_id); … … 83 83 <dt><label>Condition (Expression)</label></dt> 84 84 <dd> 85 <span tal:content="error">Validation error output</span>85 <span class="error-container" tal:content="error">Validation error output</span> 86 86 <input type="text" value="" name="available_expr" size="30" 87 87 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 98 98 <dl class="field-name" 99 99 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'])"> 101 101 <dt> 102 102 <label>Name</label> 103 103 </dt> 104 104 <dd> 105 <span tal:content="error">Validation error output</span>105 <span class="error-container" tal:content="error">Validation error output</span> 106 106 <input id="actname" type="text" value="" name="title" 107 107 tal:attributes="value request/title|nothing"/> … … 110 110 <dl class="field-action" 111 111 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'])"> 113 113 <dt> 114 114 <label>URL (Expression)</label> 115 115 </dt> 116 116 <dd> 117 <span tal:content="error">Validation error output</span>117 <span class="error-container" tal:content="error">Validation error output</span> 118 118 <input id="actaction" type="text" value="" size="30" name="url_expr" 119 119 tal:attributes="value request/url_expr|nothing"/> 120 120 </dd> 121 121 </dl> 122 <dl class=" advancedcollapseAdvanced expandedBlock">122 <dl class="collapseAdvanced expandedBlock"> 123 123 <dt class="headerAdvanced">Advanced</dt> 124 124 <dd class="contentAdvanced"> 125 125 <dl class="field-id" 126 126 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'])"> 128 128 <dt> 129 129 <label>Id</label> 130 130 </dt> 131 131 <dd> 132 <span tal:content="error">Validation error output</span>132 <span class="error-container" tal:content="error">Validation error output</span> 133 133 <input id="actid" type="text" value="" name="id" 134 134 tal:attributes="value request/id|nothing" /> … … 137 137 <dl class="field-condition" 138 138 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'])"> 140 140 <dt> 141 141 <label>Condition (Expression)</label> 142 142 </dt> 143 143 <dd> 144 <span tal:content="error">Validation error output</span>144 <span class="error-container" tal:content="error">Validation error output</span> 145 145 <input id="actcondition" type="text" value="" size="30" name="available_expr" 146 146 tal:attributes="value request/available_expr|nothing" /> qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/plugins/configure.zcml
r1188 r1190 22 22 jsfile="plugin.js" 23 23 params_mandatory="" 24 params_optional="collapsed expanded "24 params_optional="collapsed expanded collapse" 25 25 /> 26 26 … … 30 30 params_mandatory="" 31 31 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 33 42 34 43 </configure> qPloneTabs/branches/quintagroup.plonetabs/trunk/quintagroup/plonetabs/plugins/plugin.js
r1188 r1190 42 42 kukit.actionsGlobalRegistry.register("plonetabs-toggleCollapsible", function(oper) { 43 43 ;;; oper.componentName = "[plonetabs-toggleCollapsible] action"; 44 oper.evaluateParameters([], {"collapsed" : "collapsedBlock", "expanded" : "expandedBlock"}); 44 oper.evaluateParameters([], {"collapsed" : "collapsedBlock", 45 "expanded" : "expandedBlock", 46 "collapse": "none"}); 45 47 46 48 var node = oper.node.parentNode; // collapsible section 47 49 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 } 51 58 } 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 } 54 66 } 55 67 … … 58 70 kukit.commandsGlobalRegistry.registerFromAction("plonetabs-toggleCollapsible", kukit.cr.makeSelectorCommand); 59 71 72 kukit.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 81 kukit.commandsGlobalRegistry.registerFromAction("plonetabs-resetForm", kukit.cr.makeSelectorCommand); 82 60 83 kukit.actionsGlobalRegistry.register("plonetabs-handleServerError", function(oper) { 61 84 oper.componentName = "[plonetabs-handleServerError] action";
