Sfoglia il codice sorgente

Added: Introduce `bindOneToMany()` binding helper.

Maciej Gołaszewski 7 anni fa
parent
commit
a6c9ea01c8

+ 28 - 0
packages/ckeditor5-ui/src/bindings/bindonetomany.js

@@ -0,0 +1,28 @@
+/**
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+/**
+ * @module ui/bindings/getbindingtargets
+ */
+
+export default function bindOneToMany( dropdownModel, boundProperty, collection, collectionProperty, callback ) {
+	dropdownModel.bind( boundProperty ).to(
+		// Bind to #isOn of each button...
+		...getBindingTargets( collection, collectionProperty ),
+		// ...and chose the title of the first one which #isOn is true.
+		callback
+	);
+}
+
+// Returns an array of binding components for
+// {@link module:utils/observablemixin~Observable#bind} from a set of iterable
+// buttons.
+//
+// @param {Iterable.<module:ui/button/buttonview~ButtonView>} buttons
+// @param {String} attribute
+// @returns {Array.<String>}
+function getBindingTargets( buttons, attribute ) {
+	return Array.prototype.concat( ...buttons.map( button => [ button, attribute ] ) );
+}

+ 0 - 21
packages/ckeditor5-ui/src/bindings/getbindingtargets.js

@@ -1,21 +0,0 @@
-/**
- * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-/**
- * @module ui/bindings/getbindingtargets
- */
-
-/**
- * Returns an array of binding components for
- * {@link module:utils/observablemixin~Observable#bind} from a set of iterable
- * buttons.
- *
- * @param {Iterable.<module:ui/button/buttonview~ButtonView>} buttons
- * @param {String} attribute
- * @returns {Array.<String>}
- */
-export default function getBindingTargets( buttons, attribute ) {
-	return Array.prototype.concat( ...buttons.map( button => [ button, attribute ] ) );
-}

+ 0 - 19
packages/ckeditor5-ui/src/dropdown/helpers/enablemodelifoneisenabled.js

@@ -1,19 +0,0 @@
-/**
- * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-import getBindingTargets from '../../bindings/getbindingtargets';
-
-/**
- * @module ui/dropdown/helpers/enablemodelifoneisenabled
- */
-
-export default function enableModelIfOneIsEnabled( model, observables ) {
-	model.bind( 'isEnabled' ).to(
-		// Bind to #isEnabled of each observable...
-		...getBindingTargets( observables, 'isEnabled' ),
-		// ...and set it true if any observable #isEnabled is true.
-		( ...areEnabled ) => areEnabled.some( isEnabled => isEnabled )
-	);
-}

+ 37 - 0
packages/ckeditor5-ui/tests/bindings/bindonetomany.js

@@ -0,0 +1,37 @@
+/**
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+import Model from '../../src/model';
+
+import bindOneToMany from './../../src/bindings/bindonetomany';
+
+describe( 'bindOneToMany()', () => {
+	it( 'binds observable property to collection property using callback', () => {
+		const model = new Model();
+		const observables = [
+			new Model( { property: false } ),
+			new Model( { property: false } ),
+			new Model( { property: false } )
+		];
+
+		bindOneToMany( model, 'property', observables, 'property',
+			( ...areEnabled ) => areEnabled.some( property => property )
+		);
+
+		expect( model.property ).to.be.false;
+
+		observables[ 0 ].property = true;
+
+		expect( model.property ).to.be.true;
+
+		observables[ 0 ].property = false;
+
+		expect( model.property ).to.be.false;
+
+		observables[ 1 ].property = true;
+
+		expect( model.property ).to.be.true;
+	} );
+} );

+ 0 - 34
packages/ckeditor5-ui/tests/dropdown/helpers/enablemodelifoneisenabled.js

@@ -1,34 +0,0 @@
-/**
- * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md.
- */
-
-import Model from '../../../src/model';
-
-import enableModelIfOneIsEnabled from '../../../src/dropdown/helpers/enablemodelifoneisenabled';
-
-describe( 'enableModelIfOneIsEnabled()', () => {
-	it( 'Bind to #isEnabled of each observable  and set it true if any observable #isEnabled is true', () => {
-		const model = new Model();
-		const observables = [
-			new Model( { isEnabled: false } ),
-			new Model( { isEnabled: false } ),
-			new Model( { isEnabled: false } )
-		];
-		enableModelIfOneIsEnabled( model, observables );
-
-		expect( model.isEnabled ).to.be.false;
-
-		observables[ 0 ].isEnabled = true;
-
-		expect( model.isEnabled ).to.be.true;
-
-		observables[ 0 ].isEnabled = false;
-
-		expect( model.isEnabled ).to.be.false;
-
-		observables[ 1 ].isEnabled = true;
-
-		expect( model.isEnabled ).to.be.true;
-	} );
-} );