LeeChSien/angular-option-tree

View on GitHub
src/angular-option-tree.js

Summary

Maintainability
F
3 days
Test Coverage
/*!
 * angular-option-tree v0.8.0
 * Author: Jason Lee
 * License: MIT
 */
(function () {
  'use strict';

  function get_hash_string() {
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    for( var i=0; i < 10; i++ ) {
      text += possible.charAt(Math.floor(Math.random() * possible.length));
    }
    return text;
  }

  function get_preselect_path(json, value) {
    var sub_path = [];
    for (var key in json) {
      if(json[key] === parseInt(json[key], 10)) {
        if(json[key] == value) {
          sub_path.push(key);
          return sub_path;
        }
      } else {
        sub_path = get_preselect_path(json[key], value);
        if(sub_path.length > 0) {
          sub_path.unshift(key);
          return sub_path;
        }
      }
    }
    return [];
  }

  angular.module('option-tree', [])
    .directive('optionTree', function($http) {
      return {
        restrict: 'AC',
        link: function (scope, element, attrs) {
          var element_query_pattern = '',
              isInit = false,
              settings = {
                select_class: $(element).attr('option-tree-class'),
                choose: $(element).attr('option-tree-prompt')
              };

          // Avoid input name is empty
          if(!$(element).attr('name')) {
            $(element).attr('name', get_hash_string());
          }
          element_query_pattern = "input[name='" + element.attr('name') + "']";

          function refresh_preselect(option_tree) {
            if(settings.hasOwnProperty('preselect')) {
              delete settings.preselect;
            }

            if($(element).val()) {
              var path = get_preselect_path(option_tree, $(element).val());
              if(path.length > 0) {
                settings.preselect = {};
                settings.preselect[$(element).attr('name')] = path;
              }
            }
          }

          function bind_option_tree(option_tree) {
            if(isInit) {
              var tempVar = $(element).val();
              $(element_query_pattern).optionTree('destroy');
              $(element).val(tempVar);
            } else {
              isInit = true;
            }

            refresh_preselect(option_tree);
            $(element_query_pattern).optionTree(option_tree, settings);
          }

          scope.$watch(attrs.optionTree, function(option_tree) {
            bind_option_tree(option_tree);
          });

          // Loading Remote Data
          if($(element).attr('option-tree-src')) {
            $http.get($(element).attr('option-tree-src'))
              .success(function(data){
                bind_option_tree(data);
              });
          }
        }
      };
    });
}());