summaryrefslogtreecommitdiff
path: root/modules/field_ui/field_ui.js
blob: b8b8e484bbdcbfdad82adf1a4907a098b983b592 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// $Id$

(function($) {

Drupal.behaviors.fieldManageFields = {
  attach: function (context) {
    attachUpdateSelects(context);
  }
};

function attachUpdateSelects(context) {
  var widgetTypes = Drupal.settings.fieldWidgetTypes;
  var fields = Drupal.settings.fields;

  // Store the default text of widget selects.
  $('#field-overview .widget-type-select', context).each(function () {
    this.initialValue = this.options[0].text;
  });

  // 'Field type' select updates its 'Widget' select.
  $('#field-overview .field-type-select', context).each(function () {
    this.targetSelect = $('.widget-type-select', $(this).parents('tr').eq(0));

    $(this).bind('change keyup', function () {
      var selectedFieldType = this.options[this.selectedIndex].value;
      var options = (selectedFieldType in widgetTypes ? widgetTypes[selectedFieldType] : []);
      this.targetSelect.fieldPopulateOptions(options);
    });

    // Trigger change on initial pageload to get the right widget options
    // when field type comes pre-selected (on failed validation).
    $(this).trigger('change', false);
  });

  // 'Existing field' select updates its 'Widget' select and 'Label' textfield.
  $('#field-overview .field-select', context).each(function () {
    this.targetSelect = $('.widget-type-select', $(this).parents('tr').eq(0));
    this.targetTextfield = $('.label-textfield', $(this).parents('tr').eq(0));

    $(this).bind('change keyup', function (e, updateText) {
      var updateText = (typeof updateText == 'undefined' ? true : updateText);
      var selectedField = this.options[this.selectedIndex].value;
      var selectedFieldType = (selectedField in fields ? fields[selectedField].type : null);
      var selectedFieldWidget = (selectedField in fields ? fields[selectedField].widget : null);
      var options = (selectedFieldType && (selectedFieldType in widgetTypes) ? widgetTypes[selectedFieldType] : []);
      this.targetSelect.fieldPopulateOptions(options, selectedFieldWidget);

      if (updateText) {
        $(this.targetTextfield).attr('value', (selectedField in fields ? fields[selectedField].label : ''));
      }
    });

    // Trigger change on initial pageload to get the right widget options
    // and label when field type comes pre-selected (on failed validation).
    $(this).trigger('change', false);
  });
}

jQuery.fn.fieldPopulateOptions = function (options, selected) {
  return this.each(function () {
    var disabled = false;
    if (options.length == 0) {
      options = [this.initialValue];
      disabled = true;
    }

    // If possible, keep the same widget selected when changing field type.
    // This is based on textual value, since the internal value might be
    // different (options_buttons vs. node_reference_buttons).
    var previousSelectedText = this.options[this.selectedIndex].text;

    var html = '';
    jQuery.each(options, function (value, text) {
      // Figure out which value should be selected. The 'selected' param
      // takes precedence.
      var is_selected = ((typeof selected != 'undefined' && value == selected) || (typeof selected == 'undefined' && text == previousSelectedText));
      html += '<option value="' + value + '"' + (is_selected ? ' selected="selected"' : '') + '>' + text + '</option>';
    });

    $(this).html(html).attr('disabled', disabled ? 'disabled' : '');
  });
};

})(jQuery);