From 3874d71540d4c4387cea9de264d13c2314e1619a Mon Sep 17 00:00:00 2001 From: Aaron Newton Date: Thu, 3 Nov 2011 12:52:12 -0700 Subject: [PATCH] New delegator: set/erase/toggleProperty --- Source/Delegators/Delegator.SetProperty.js | 37 +++++++++++ .../Delegators/Delegator.SetProperty.js | 64 +++++++++++++++++++ Tests/Specs/package.yml | 1 + package.yml | 1 + 4 files changed, 103 insertions(+) create mode 100644 Source/Delegators/Delegator.SetProperty.js create mode 100644 Tests/Specs/more-behaviors/Delegators/Delegator.SetProperty.js diff --git a/Source/Delegators/Delegator.SetProperty.js b/Source/Delegators/Delegator.SetProperty.js new file mode 100644 index 0000000..832c0e3 --- /dev/null +++ b/Source/Delegators/Delegator.SetProperty.js @@ -0,0 +1,37 @@ +/* +--- +description: Provides methods to set or toggle properties on target elements. +provides: [Delegator.setProperty, eraseProperty, toggleProperty] +requires: [Behavior/Delegator, Core/Element] +script: Delegator.SetProperty.js +name: Delegator.SetProperty + +... +*/ +(function(){ + var triggers = {}; + + ['set', 'erase', 'toggle'].each(function(action){ + + triggers[action + 'Property'] = { + require: ['property'], + handler: function(event, link, api){ + var target = link; + if (api.get('target') && api.get('target') != 'self') { + target = link.getElement(api.get('target')); + if (!target) api.fail('could not locate target element to ' + action + ' its class', link); + } + if (action == 'set' || (action == 'toggle' && target.get(api.get('property')) != api.get('value'))){ + if (api.get('value') === null) api.fail('Could not retrieve eraseproperty-value option from element.'); + target.set(api.get('property'), api.get('value')); + } else { + target.erase(api.get('property')); + } + } + }; + + }); + + Delegator.register('click', triggers); + +})(); \ No newline at end of file diff --git a/Tests/Specs/more-behaviors/Delegators/Delegator.SetProperty.js b/Tests/Specs/more-behaviors/Delegators/Delegator.SetProperty.js new file mode 100644 index 0000000..28d41a2 --- /dev/null +++ b/Tests/Specs/more-behaviors/Delegators/Delegator.SetProperty.js @@ -0,0 +1,64 @@ +/* +--- +name: Delegator.SetProperty Tests +description: n/a +requires: [More-Behaviors/Delegator.setProperty] +provides: [Delegator.SetProperty.Tests] +... +*/ + + +(function(){ + var dom = new Element('div', {'class':'foo'}).set('html', + '

\ + Toggle the title value\ + Toggle the title value\ + Add the title value\ + Add the title value\ + Remove the title value\ + Remove the title value\ +

' + ); + + var del = new Delegator().attach(dom), + setParent = dom.getElement('a#setParent'), + setSelf = dom.getElement('a#setSelf'), + eraseParent = dom.getElement('a#eraseParent'), + eraseSelf = dom.getElement('a#eraseSelf'), + toggleParent = dom.getElement('a#toggleParent'), + toggleSelf = dom.getElement('a#toggleSelf'); + + describe('Delegator.SetProperty', function(){ + it('should toggle the title on a target', function(){ + expect(dom.get('title')).toBe(null); + del.trigger('toggleProperty', toggleParent, 'click'); + expect(dom.get('title')).toBe('set'); + del.trigger('toggleProperty', toggleParent, 'click'); + expect(dom.get('title')).toBe(null); + }); + it('should toggle the title of itself', function(){ + expect(toggleSelf.get('title')).toBe(null); + del.trigger('toggleProperty', toggleSelf, 'click'); + expect(toggleSelf.get('title')).toBe('set'); + del.trigger('toggleProperty', toggleSelf, 'click'); + expect(toggleSelf.get('title')).toBe(null); + }); + it('should add and erase the title to a target', function(){ + expect(dom.get('title')).toBe(null); + del.trigger('setProperty', setParent, 'click'); + expect(dom.get('title')).toBe('set'); + del.trigger('eraseProperty', eraseParent, 'click'); + expect(dom.get('title')).toBe(null); + }); + it('should add and erase it\'s own title property', function(){ + expect(setSelf.get('title')).toBe(null); + del.trigger('setProperty', setSelf, 'click'); + expect(setSelf.get('title')).toBe('set'); + setSelf.erase('title'); + eraseSelf.set('title', 'set'); + expect(eraseSelf.get('title')).toBe('set'); + del.trigger('eraseProperty', eraseSelf, 'click'); + expect(eraseSelf.get('title')).toBe(null); + }); + }); +})(); \ No newline at end of file diff --git a/Tests/Specs/package.yml b/Tests/Specs/package.yml index 3088743..b2da67f 100644 --- a/Tests/Specs/package.yml +++ b/Tests/Specs/package.yml @@ -20,4 +20,5 @@ sources: - "more-behaviors/Delegators/Delegator.Ajax.js" - "more-behaviors/Delegators/Delegator.CheckAllOrNone.js" - "more-behaviors/Delegators/Delegator.FxReveal.js" + - "more-behaviors/Delegators/Delegator.SetProperty.js" - "more-behaviors/Delegators/Delegator.SubmitLink.js" \ No newline at end of file diff --git a/package.yml b/package.yml index bbcb60b..2e466a7 100644 --- a/package.yml +++ b/package.yml @@ -24,4 +24,5 @@ sources: - "Source/Delegators/Delegator.Ajax.js" - "Source/Delegators/Delegator.CheckAllOrNone.js" - "Source/Delegators/Delegator.FxReveal.js" + - "Source/Delegators/Delegator.SetProperty.js" - "Source/Delegators/Delegator.SubmitLink.js"