martymarkenson of Ninjas
9/19/2017 - 3:57 PM

Widget to increment by 1

Widget to increment by 1

.adderElement {
	display: block;
	height: 100%;
	width: 100%;
}

.adderWidget {
	margin: auto;
	width: 198px;
	height: 54px;
	border-radius: 5px;
	background-color: #DDDDDD;
	padding: 3px;
	opacity: 0.5;
}
function twxIncrementer() {
  return {
    elementTag: 'twx-incrementer',

    label: 'Increment',

    properties: [
      {
            name: 'class',
           label: 'Class',
        datatype: 'string',
         default: ''
      },
      {
            name: 'base',
           label: 'Initial Value',
        datatype: 'number',
         default: 0,
 isBindingTarget: true,
       showInput: true
      },
      {
            name: 'quotient',
           label: 'Quotient',
        datatype: 'number',
         default: 1,
 isBindingTarget: true,
       showInput: true
      },
      {
            name: 'sum',
           label: 'Sum',
        datatype: 'number',
         default: false,
 isBindingSource: true,
 isBindingTarget: false,
       showInput: false
      },
    ],

    services: [
      {
         name: 'clki',
        label: 'Clock'
      },
      {
         name: 'reseti',
        label: 'Reset'
      }
    ],

    events: [
      {
         name: 'iclocked',
        label: 'Clk'
      },
    ],

    designTemplate: function () {
      return '<div class="incrementerWidget"></div>';
    },

    runtimeTemplate: function (props) {
      var tmpl = '<div ng-incrementer class="ng-hide incrementerWidget ' + props.class + '" delegate-field="delegate" quotient-field={{me.quotient}} base-field={{me.base}}></div>';
      return tmpl;
    }
  }
}

twxAppBuilder.widget('twxIncrementer', twxIncrementer);
if (typeof module !== 'undefined' && typeof exports !== 'undefined' && module.exports === exports) {
  module.exports = 'incrementer-ng';
}

(function () {
  'use strict';

  var incrementerModule = angular.module('incrementer-ng', []);
  incrementerModule.directive('ngIncrementer', ['$timeout', ngIncrementer]);

  function ngIncrementer($timeout) {

    return {
      restrict: 'EA',
      scope: {
        baseField    : '@',
        quotientField: '@',
        delegateField: '='
      },
      template: '<div></div>',
      link: function (scope, element, attr) {

        var lastUpdated = 'unknown';
        scope.data = {    
                       value: 0, 
                       base : 0,
                       inc  : 0
                     };
        
        // set the value and make sure the widget is updated 
        // too (this triggers anyone watching this value)
        var _seti = function(v) {
          scope.data.value = v;
          scope.$parent.view.wdg[scope.$parent.widgetId]['sum']    = scope.data.value;
        }

        // iterate/increment the current value by the current step
        // and then fire the 'clocked' event to let anyone downstream
        // take action based on the new value
        var clki = function(){
          
          $timeout(function () {
            _seti(scope.data.value + scope.data.inc);
            scope.$parent.fireEvent('iclocked');
          }, 1);

        };

        // reset the value to the defined base/initial value.
        // this in turn will trigger anyone watching the value.
        var reseti = function() {
          _seti(scope.data.base);
        }

        // watch input parameters for any changes
        scope.$watch('quotientField', function () {
          scope.data.inc = (scope.quotientField != undefined) ? parseFloat(scope.quotientField) : 1 ;
        });
        scope.$watch('baseField', function () {
          scope.data.base = (scope.baseField != undefined) ? parseFloat(scope.baseField) : 0 ;
          reseti();
        });

        // if a delegate is assigned, add the widget services
        scope.$watch('delegateField', function (delegate) {
          if (delegate) {
            delegate.clki   = function () { clki();   };
            delegate.reseti = function () { reseti(); };
          }
        });

      }
    };
  }

}());