diff --git a/src/client/Client.js b/src/client/Client.js
index 924bcff..a047945 100644
--- a/src/client/Client.js
+++ b/src/client/Client.js
@@ -1,7 +1,7 @@
/**
* Liza client
*
- * Copyright (C) 2017 R-T Specialty, LLC.
+ * Copyright (C) 2017, 2018 R-T Specialty, LLC.
*
* This file is part of the Liza Data Collection Framework
*
@@ -2616,24 +2616,6 @@ module.exports = Class( 'Client' )
// perform event (XXX: replace me; see above)
switch ( event_name )
{
- case 'set':
- var setdata = {};
- var maxi = data.value.length - 1;
-
- setdata[ data.elementName ] = [];
-
- // use last available index (just as assertions do)
- for ( var i in data.indexes )
- {
- var desti = data.indexes[ i ];
- var srci = Math.min( desti, maxi );
-
- setdata[ data.elementName ][ desti ] = data.value[ srci ];
- }
-
- this._quote.setData( setdata );
- break;
-
case 'reset':
var reset = {};
reset[ data.elementName ] = data.indexes;
diff --git a/src/client/ClientDependencyFactory.js b/src/client/ClientDependencyFactory.js
index 759f312..03b2682 100644
--- a/src/client/ClientDependencyFactory.js
+++ b/src/client/ClientDependencyFactory.js
@@ -369,6 +369,8 @@ module.exports = Class( 'ClientDependencyFactory',
'show': field_vis_handler,
'hide': field_vis_handler,
+ 'set': requireh( 'ValueSetEventHandler' )( client ),
+
'action$cvv2Dialog': requireh( 'Cvv2DialogEventHandler' )( jquery )
} );
}
diff --git a/src/client/event/ValueSetEventHandler.js b/src/client/event/ValueSetEventHandler.js
new file mode 100644
index 0000000..77ad029
--- /dev/null
+++ b/src/client/event/ValueSetEventHandler.js
@@ -0,0 +1,86 @@
+/**
+ * Value set event handler
+ *
+ * Copyright (C) 2018 R-T Specialty, LLC.
+ *
+ * This file is part of the Liza Data Collection Framework
+ *
+ * Liza is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+"use strict";
+
+const Class = require( 'easejs' ).Class;
+const EventHandler = require( './EventHandler' );
+
+
+/**
+ * Set field values
+ */
+module.exports = Class( 'ValueSetEventHandler' )
+ .implement( EventHandler )
+ .extend(
+{
+ /**
+ * Client
+ * @type {Client}
+ */
+ 'private _client': null,
+
+
+ /**
+ * Initialize with client
+ *
+ * Ideally we don't want the client (Law of Demeter), but at the point
+ * that this class is instantiated, a quote may not yet be
+ * initialized. Refactoring is needed.
+ *
+ * @param {Client} client
+ */
+ constructor( client )
+ {
+ this._client = client;
+ },
+
+
+ /**
+ * Set value of specified fields
+ *
+ * If the destination index exceeds the number of indexes of the source
+ * field, the last available source index will be used. This matches
+ * the behavior of assertions.
+ *
+ * @param {string} event_id event id
+ * @param {function(*,Object)} callback continuation to invoke on completion
+ * @param {Object} data event data
+ *
+ * @return {EventHandler} self
+ */
+ 'public handle'(
+ event_id, callback, { elementName: field_name, indexes, value }
+ )
+ {
+ const quote = this._client.getQuote();
+ const maxi = value.length - 1;
+
+ const set_data = indexes.reduce( ( result, desti ) =>
+ {
+ result[ desti ] = value[ Math.min( desti, maxi ) ];
+ return result;
+ }, [] );
+
+ quote.setData( { [field_name]: set_data } );
+ callback();
+ },
+} );
diff --git a/test/event/ValueSetEventHandlerTest.js b/test/event/ValueSetEventHandlerTest.js
new file mode 100644
index 0000000..50523b7
--- /dev/null
+++ b/test/event/ValueSetEventHandlerTest.js
@@ -0,0 +1,99 @@
+/**
+ * Test case for ValueSetEventHandler
+ *
+ * Copyright (C) 2018 R-T Specialty, LLC.
+ *
+ * This file is part of the Liza Data Collection Framework
+ *
+ * Liza is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+"use strict";
+
+const event = require( '../../' ).client.event;
+const expect = require( 'chai' ).expect;
+const Class = require( 'easejs' ).Class;
+
+const { ValueSetEventHandler: Sut } = event;
+
+
+describe( 'ValueSetEventHandler', () =>
+{
+ it( "sets relative indexes up until last source index", done =>
+ {
+ const expected = {
+ foo: [ "zero", "one", "one" ],
+ };
+
+ let qcalled = false;
+ const quote = {
+ setData( data )
+ {
+ expect( data ).to.deep.equal( expected );
+ qcalled = true;
+ }
+ };
+
+ const callback = () =>
+ {
+ expect( qcalled ).to.be.true;
+ done();
+ };
+
+ Sut( { getQuote: () => quote } )
+ .handle(
+ '',
+ callback,
+ {
+ elementName: 'foo',
+ indexes: [ 0, 1, 2 ],
+ value: [ "zero", "one" ],
+ }
+ );
+ } );
+
+
+ it( "sets only given indexes", done =>
+ {
+ const expected = {
+ bar: [ , "set1", "set2" ],
+ };
+
+ let qcalled = false;
+ const quote = {
+ setData( data )
+ {
+ expect( data ).to.deep.equal( expected );
+ qcalled = true;
+ }
+ };
+
+ const callback = () =>
+ {
+ expect( qcalled ).to.be.true;
+ done();
+ };
+
+ Sut( { getQuote: () => quote } )
+ .handle(
+ '',
+ callback,
+ {
+ elementName: 'bar',
+ indexes: [ 1, 2 ],
+ value: [ "ignore", "set1", "set2", "extra" ],
+ }
+ );
+ } );
+} );