~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/app/javascript/picker/picker_patcher.js

  • Committer: Launchpad Patch Queue Manager
  • Date: 2011-07-27 05:09:36 UTC
  • mfrom: (13465.1.12 picker-wiring-812255)
  • Revision ID: launchpad@pqm.canonical.com-20110727050936-ojqs0bs15umtrydk
[r=sinzui][bug=812255,
 812257] Fix person picker "Assign me" and "Remove" link behaviour and
 add test coverage.

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
 * @param {String} attribute_name The attribute on the resource being
19
19
 *                                modified.
20
20
 * @param {String} content_box_id
21
 
 * @param {Object} config Object literal of config name/value pairs.
 
21
 * @param {Object} config Object literal of config name/value pairs. The
 
22
 *                        values listed below are common for all picker types.
 
23
 *     config.picker_type: the type of picker to create (default or person).
22
24
 *     config.header: a line of text at the top of the widget.
23
25
 *     config.step_title: overrides the subtitle.
24
26
 *     config.null_display_value: Override the default 'None' text.
25
 
 *     config.show_remove_button: Should the remove button be shown?
26
 
 *         Defaults to false, should be a boolean.
27
 
 *     config.show_assign_me_button: Should the 'assign me' button be shown?
28
 
 *         Defaults to false, should be a boolean.
29
27
 *     config.show_search_box: Should the search box be shown.
30
28
 *         Vocabularies that are not huge should not have a search box.
31
29
 */
37
35
        return;
38
36
    }
39
37
 
40
 
    var show_remove_button = false;
41
 
    var show_assign_me_button = false;
42
38
    var null_display_value = 'None';
43
39
    var show_search_box = true;
44
40
 
48
44
        if (config.null_display_value !== undefined) {
49
45
            null_display_value = config.null_display_value;
50
46
        }
51
 
 
52
 
        if (config.show_remove_button !== undefined) {
53
 
            show_remove_button = config.show_remove_button;
54
 
        }
55
 
 
56
 
        if (config.show_assign_me_button !== undefined) {
57
 
            show_assign_me_button = config.show_assign_me_button;
58
 
        }
59
 
 
60
47
        if (config.show_search_box !== undefined) {
61
48
            show_search_box = config.show_search_box;
62
49
        }
63
 
        if (config.picker_type === undefined &&
64
 
                (show_assign_me_button || show_remove_button)) {
65
 
            config.picker_type = 'person';
66
 
        }
67
50
    }
68
51
 
69
52
    var content_box = Y.one('#' + content_box_id);
79
62
                '</div>'));
80
63
    };
81
64
 
82
 
    var update_button_text = function() {
83
 
        var link_text = picker._remove_person_text;
84
 
        if (picker.get('selected_value_metadata') === 'team') {
85
 
            link_text = picker._remove_team_text;
86
 
        }
87
 
        remove_button.set('text', link_text);
88
 
    };
89
 
 
90
 
    var show_hide_buttons = function () {
91
 
        var link = content_box.one('.yui3-activator-data-box a');
92
 
        if (remove_button) {
93
 
            if (link === null || !show_remove_button) {
94
 
                remove_button.addClass('yui3-picker-hidden');
95
 
            } else {
96
 
                remove_button.removeClass('yui3-picker-hidden');
97
 
                update_button_text();
98
 
            }
99
 
        }
100
 
 
101
 
        if (assign_me_button) {
102
 
            if (link !== null
103
 
                && link.get('href').match(LP.links.me + "$") == LP.links.me) {
104
 
                assign_me_button.addClass('yui3-picker-hidden');
105
 
            } else {
106
 
                assign_me_button.removeClass('yui3-picker-hidden');
107
 
            }
108
 
        }
109
 
    };
110
 
 
111
65
    var save = function (picker_result) {
112
66
        activator.renderProcessing();
113
67
        var success_handler = function (entry) {
 
68
          var to_render = null_display_value;
 
69
          var selected_value = null;
 
70
          if (entry.get(attribute_name) !== null) {
 
71
              to_render = entry.getHTML(attribute_name);
 
72
              selected_value = picker_result.api_uri;
 
73
          }
 
74
          // NB We need to set the selected_value_metadata attribute first
 
75
          // because we listen for changes to selected_value.
114
76
          picker.set('selected_value_metadata', picker_result.metadata);
115
 
          activator.renderSuccess(entry.getHTML(attribute_name));
116
 
          show_hide_buttons();
117
 
        };
118
 
 
119
 
        var patch_payload = {};
120
 
        patch_payload[attribute_name] = Y.lp.client.get_absolute_uri(
121
 
            picker_result.api_uri);
122
 
 
123
 
        var client = new Y.lp.client.Launchpad();
124
 
        client.patch(picker._resource_uri, patch_payload, {
125
 
            accept: 'application/json;include=lp_html',
126
 
            on: {
127
 
                success: success_handler,
128
 
                failure: failure_handler
129
 
            }
130
 
        });
131
 
    };
132
 
 
133
 
    // Create a new assign_me and remove_assignee function that uses the
134
 
    // patcher save method instead of the standard picker save.
135
 
    var assign_me = function () {
136
 
        picker.hide();
137
 
        save({
138
 
            image: '/@@/person',
139
 
            title: 'Me',
140
 
            api_uri: LP.links.me
141
 
        });
142
 
    };
143
 
 
144
 
    var remove = function () {
145
 
        picker.hide();
146
 
        activator.renderProcessing();
147
 
        var success_handler = function (entry) {
148
 
            activator.renderSuccess(Y.Node.create(null_display_value));
149
 
            show_hide_buttons();
150
 
        };
151
 
 
152
 
        var patch_payload = {};
153
 
        patch_payload[attribute_name] = null;
154
 
 
155
 
        var client = new Y.lp.client.Launchpad();
156
 
        // Use picker._resource_uri, since it might have been changed
157
 
        // from the outside after the widget has already been initialized.
 
77
          picker.set('selected_value', selected_value);
 
78
          activator.renderSuccess(to_render);
 
79
        };
 
80
 
 
81
        var patch_payload = {};
 
82
        if (Y.Lang.isValue(picker_result.api_uri)) {
 
83
            patch_payload[attribute_name] = Y.lp.client.get_absolute_uri(
 
84
                picker_result.api_uri);
 
85
        } else {
 
86
            patch_payload[attribute_name] = null;
 
87
        }
 
88
 
 
89
        var client = new Y.lp.client.Launchpad();
158
90
        client.patch(picker._resource_uri, patch_payload, {
159
91
            accept: 'application/json;include=lp_html',
160
92
            on: {
167
99
    config.save = save;
168
100
    var picker = namespace.create(vocabulary, config);
169
101
    picker._resource_uri = resource_uri;
170
 
    var remove_button = picker.remove_button;
171
 
    var assign_me_button = picker.assign_me_button;
172
 
    if (show_remove_button) {
173
 
        Y.Event.purgeElement(remove_button);
174
 
        remove_button.on('click', remove);
175
 
    }
176
 
    if (show_assign_me_button) {
177
 
        Y.Event.purgeElement(assign_me_button);
178
 
        assign_me_button.on('click', assign_me);
179
 
    }
180
102
 
181
103
    // If we are to pre-load the vocab, we need a spinner.
182
104
    // We set it up here because we only want to do it once and the
191
113
        if (!show_search_box) {
192
114
          config.temp_spinner.removeClass('unseen');
193
115
          picker.set('min_search_chars', 0);
194
 
          picker.fire('search', '');
 
116
          picker.fire(Y.lazr.picker.Picker.SEARCH, '');
195
117
          picker.get('contentBox').one(
196
118
              '.yui3-picker-search-box').addClass('unseen');
197
119
        }
198
120
        picker.show();
199
121
    });
200
122
    activator.render();
201
 
 
202
 
    show_hide_buttons();
203
 
 
204
123
    return picker;
205
124
};
206
125
 
384
303
    }
385
304
 
386
305
    var new_config = Y.merge(config, {
 
306
        associated_field_id: associated_field_id,
387
307
        align: {
388
308
            points: [Y.WidgetPositionAlign.CC,
389
309
                     Y.WidgetPositionAlign.CC]
402
322
    } else {
403
323
        picker = new Y.lazr.picker.Picker(new_config);
404
324
    }
405
 
    if (associated_field_id != null) {
406
 
        picker.plug(Y.lazr.picker.TextFieldPickerPlugin,
407
 
                    {input_element: '[id="'+associated_field_id+'"]'});
408
 
    }
409
325
 
410
326
    // We don't want the default save to fire since this hides
411
327
    // the form. We want to do this ourselves after any validation has had a
416
332
        Y.log('Got save event.');
417
333
        var picker_result = e.details[Y.lazr.picker.Picker.SAVE_RESULT];
418
334
        var do_save = function() {
 
335
            picker.hide();
419
336
            if (Y.Lang.isFunction(config.save)) {
420
337
                config.save(picker_result);
421
338
            }
435
352
        reset_form(picker);
436
353
    });
437
354
 
438
 
    if (config.extra_no_results_message != null) {
 
355
    if (config.extra_no_results_message !== null) {
439
356
        picker.before('resultsChange', function (e) {
440
357
            var new_results = e.details[0].newVal;
441
358
            if (new_results.length === 0) {
549
466
        }
550
467
    };
551
468
 
552
 
    picker.after('search', search_handler);
 
469
    picker.after(Y.lazr.picker.Picker.SEARCH, search_handler);
553
470
 
554
471
    picker.render();
555
472
    picker.hide();