CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/builder/components/form-components/nested-form-custom.js

Summary

Maintainability
D
2 days
Test Coverage
var _ = require('underscore');
var Backbone = require('backbone');

var CustomForm = Backbone.Form.extend({
  initialize: function (options) {
    this.options = options;
    Backbone.Form.Original.prototype.initialize.call(this, options);
    this.listenTo(this.model, 'updateSchema', this.updateSchema);
  },

  updateSchema: function (schema) {
    var newFields = _.keys(schema);
    var currentFields = _.keys(this.schema);
    var field;
    var options;

    // Remove all fields not present in the new schema
    _.each(currentFields, function (key) {
      if (schema[key] == null) {
        this.fields[key].remove();
        delete this.fields[key];
      }
    }, this);

    // Creat all fields not present in the old schema
    _.each(newFields, function (key) {
      var fieldSchema = schema[key];
      if (this.schema[key] == null) {
        this.fields[key] = this.createField(key, fieldSchema);
        this.renderAddedField(key);
      } else {
        // update schema for this field and render
        field = this.fields[key];
        options = _.extend({}, _.omit(field.editor.options, _.keys(schema[key])), {
          schema: schema[key]
        });

        field.editor._popupManager && field.editor._popupManager.destroy();
        field.editor._dialogView && field.editor._dialogView.clean();
        field.editor.undelegateEvents();
        if (field.editor._destroyBinds) {
          field.editor._destroyBinds();
        }
        field.editor.initialize(options);
        field.editor.delegateEvents();
        field.editor.render();
      }
    }, this);

    // update the schema
    this.schema = _.extend({}, this.schema, schema);
  },

  renderAddedField: function (fieldKey) {
    var self = this;
    var fields = this.fields;
    var $form = this.$el;
    var $ = Backbone.$;

    $form.find('[data-editors]').each(function (i, el) {
      var $container = $(el);
      var selection = $container.attr('data-editors');

      if (_.isUndefined(selection)) return;

      // Work out which fields to include
      var keys = (selection === '*')
        ? self.selectedFields || _.keys(fields)
        : selection.split(',');

      // Add them
      _.each(keys, function (key) {
        var field;
        if (key === fieldKey) {
          field = fields[key];
          $container.append(field.editor.render().el);
        }
      });
    });

    // Render standalone fields
    $form.find('[data-editors]').each(function (i, el) {
      var $container = $(el);
      var selection = $container.attr('data-editors');

      if (_.isUndefined(selection)) return;

      // Work out which fields to include
      var keys = (selection === '*')
        ? self.selectedFields || _.keys(fields)
        : selection.split(',');

      // Add them
      _.each(keys, function (key) {
        var field;
        if (key === fieldKey) {
          field = fields[key];
          $container.append(field.editor.render().el);
        }
      });
    });
  }
});

module.exports = CustomForm;