martymarkenson of Ninjas
9/19/2017 - 4:01 PM

mapper widget

No Description

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

.spinnerWidget {
	margin: auto;
	width: 198px;
	height: 54px;
	border-radius: 5px;
	background-color: #DDDDDD;
	padding: 3px;
	opacity: 0.5;
}

.spinnerButton {
	border-style: none;
	margin: 0;
	padding: 0;
	width: 48px;
	height: 48px;
}

.spinnerButton[disabled] {
	opacity: 0.5;
}
function twxMapper() {
  return {
    elementTag: 'twx-mapper',

    label: 'Mapper',

    properties: [
      {
            name: 'class',
           label: 'Class',
        datatype: 'string',
         default: ''
      },
      {
            name: 'shader',
           label: 'Shader',
        datatype: 'string',
         default: 'green',
 isBindingTarget: true,
       showInput: true
      },
      {
            name: 'polarity',
           label: 'Polarity',
        datatype: 'boolean',
 isBindingTarget: true,
       showInput: true
      },
      {
            name: 'model',
           label: 'Model Id',
        datatype: 'string',
         default: 'model-1',
 isBindingTarget: true,
       showInput: true
      },
      {
            name: 'data',
           label: 'Data',
        datatype: 'string',
         default: false,
 isBindingTarget: true,
       showInput: true
      },
    ],

    events: [
      {
         name: 'complete',
        label: 'Completed'
      },
    ],

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

    runtimeTemplate: function (props) {
      var tmpl = '<div ng-mapper class="ng-hide mapperWidget ' + props.class + '" info-field="me.data" shader-field={{me.shader}} polarity-field={{me.polarity}} model-field={{me.model}}></div>';
      return tmpl;
    }
  }
}

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

(function () {
  'use strict';

  var mapperModule = angular.module('mapper-ng', []);
  mapperModule.directive('ngMapper', ['$timeout', '$http', '$window', '$injector', ngMapper]);

  function ngMapper($timeout, $http, $window, $injector) {

    return {
      restrict: 'EA',
      scope: {
        polarityField : '@',
        shaderField   : '@',
        modelField    : '@',
        infoField     : '='
      },
      template: '<div></div>',
      link: function (scope, element, attr) {

        var lastUpdated = 'unknown';
        scope.data = { shader: undefined, 
                         data: undefined, 
                     polarity: undefined, 
                        model: undefined
                     };
        scope.renderer = $window.cordova ? vuforia : $injector.get('threeJsTmlRenderer');

        var hilite = function(id,rd) {
          var nodeId = scope.data.model + '-' + id;
          rd.setProperties(nodeId,
            {
              shader:scope.data.shader,
              hidden:false
            });      
        };
        var unlite = function(id,rd) {
          var nodeId = scope.data.model + '-' + id;
          rd.setProperties(nodeId,
            {
              shader:'file:Default',
              hidden:true
            });      
        };
        var dotlite = function(id,rd) {
          var nodeId = scope.data.model + '-' + id;
          rd.setProperties(nodeId,
            {
              shader:'dots',
              hidden:false
            });      
        };
        var tolist = function(ids,cb,rd) {
          if (ids != undefined && ids.length > 0) ids.forEach(function(id) {
            cb(id.path,rd);
          });
        };

        var apply = function(re) {
          scope.data.prev = scope.data.results;
          scope.data.results = scope.infoField;

          // work out how many unique NEW items exist
          var left = (scope.data.results != undefined && scope.data.results.length > 0 &&
                      scope.data.prev    != undefined && scope.data.prev.length >0) 
                   ? Enumerable.from(scope.data.results)
                               .except(scope.data.prev,"$.path")
                               .toArray() 
                   : scope.data.results;

          // and work out how many unique OLD items need to be cleared out
          if (re === undefined && scope.data.prev != undefined && scope.data.prev.length > 0) {
            var diff = (scope.data.results != undefined && scope.data.results.length > 0) 
                     ? Enumerable.from(scope.data.prev)
                                 .except(scope.data.results,"$.path")
                                 .toArray() 
                     : scope.data.prev;
            tolist(diff,(scope.data.polarity === 'true') ? unlite : dotlite, scope.renderer);
          }

          tolist(left, hilite, scope.renderer);

          // signal we are done
          scope.$parent.fireEvent('complete');
        };

        var reapply = function() {
          apply(true);
        };

        var updateMapper = function(){
          scope.data.model    = scope.modelField;
          scope.data.polarity = scope.polarityField;
          $timeout(function () {

            // what has changed?  
            if (scope.shaderField != scope.data.shader) {  
              scope.data.shader = scope.shaderField;
              reapply();
            }           
            // if not, run the query again
            else
              apply();
          }, 1);

        };

        scope.$watch('polarityField', function () {
          updateMapper();
        });

        scope.$watch('shaderField', function () {
          updateMapper();
        });

        scope.$watch('modelField', function () {
          updateMapper();
        });

        scope.$watch('infoField', function () {
          updateMapper();
        });
      }
    };
  }

}());