Thibau/datalift-datacubeviz

View on GitHub
datacubeviz/src/web/public/static/js/extends/handlers.js

Summary

Maintainability
A
2 hrs
Test Coverage
define([
  'jquery',
  'knockout',
  'config/global',
  'bootstrap',
  'datatables'
], function ($, ko, g) {
  'use strict';

  // A custom binding to handle the enter key (could go in a separate library)
  ko.bindingHandlers.enterKey = {
    init: function (element, valueAccessor, allBindingsAccessor, data) {
      var wrappedHandler, newValueAccessor;

      // wrap the handler with a check for the enter key
      wrappedHandler = function (data, event) {
        if (event.keyCode === g.ENTER_KEY) {
          valueAccessor().call(this, data, event);
        }
      };

      // create a valueAccessor with the options that we would want to pass to the event binding
      newValueAccessor = function () {
        return {
          keyup: wrappedHandler
        };
      };

      // call the real event binding's init function
      ko.bindingHandlers.event.init(element, newValueAccessor, allBindingsAccessor, data);
    }
  };

  // Wrapper to hasfocus that also selects text and applies focus async
  ko.bindingHandlers.selectAndFocus = {
    init: function (element, valueAccessor, allBindingsAccessor) {
      ko.bindingHandlers.hasfocus.init(element, valueAccessor, allBindingsAccessor);
      ko.utils.registerEventHandler(element, 'focus', function () {
        element.focus();
      });
    },
    update: function (element, valueAccessor) {
      ko.utils.unwrapObservable(valueAccessor()); // for dependency
      // ensure that element is visible before trying to focus
      setTimeout(function () {
        ko.bindingHandlers.hasfocus.update(element, valueAccessor);
      }, 0);
    }
  };

  // Custom binding to trigger Bootstrap modals.
  ko.bindingHandlers['modal'] = {
    init: function (element) {
      $(element).modal({show : false});
    },
    update: function (element, valueAccessor) {
      var value = ko.utils.unwrapObservable(valueAccessor());

      if (value) {
        $(element).modal('show');
      } else {
        $(element).modal('hide');
      }
    }
  };

  // Custom binding to trigger Bootstrap tooltips.
  ko.bindingHandlers['tooltip'] = {
    init: function (element, valueAccessor) {
      var value = ko.utils.unwrapObservable(valueAccessor());
      $(element).tooltip({
        title: value
      });
    },
    update: function (element, valueAccessor) {
      var value = ko.utils.unwrapObservable(valueAccessor());
      $(element).tooltip({
        title: value
      });
    }
  };

  /**
   * knockout.bindingHandlers.dataTable.js v1.0
   *
   * Copyright (c) 2011, Josh Buckley (joshbuckley.co.uk).
   * License: MIT (http://www.opensource.org/licenses/mit-license.php)
   *
   * Modified to work with observable options and to be able to reload options
   * when they change.
   * And to only reload everything if we are switching to the right tab.
   */
  ko.bindingHandlers.dataTable = {
      init: function (element, valueAccessor) {},
      update: function (element, valueAccessor) {
        var binding = ko.utils.unwrapObservable(valueAccessor());

        // We don't need to refresh the table if the displayed tab isn't the right one.
        if (binding.visible) {
          var table = $(element).dataTable(binding.options());
          table.fnClearTable();
          table.fnAddData(binding.data());
        }
      }
    };

    /**
     * A custom binding handler to truncate text if it is
     * longuer than a given length.
     */
    ko.bindingHandlers.truncate = {
      init: function (element, valueAccessor) {},
      update: function (element, valueAccessor) {
        var binding = ko.utils.unwrapObservable(valueAccessor());

        var truncatedText = binding.text;
        if (binding.text.length > binding.max) {
          var nextSpace = binding.text.indexOf(' ', binding.max - 5);
          truncatedText = binding.text.substring(0, Math.min(binding.max + 5, Math.max(nextSpace, binding.max - 5))) + '…';
        }

        $(element).html(truncatedText);
      }
    };

});