From 4acb2424e62cbd64bc92a5dec2cbe1e2b7096157 Mon Sep 17 00:00:00 2001 From: Max Kanat-Alexander Date: Mon, 21 Jun 2010 19:10:21 -0700 Subject: Bug 22353: Automatic duplicate bug detection on enter_bug.cgi r=glob, a=mkanat --- js/bug.js | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 js/bug.js (limited to 'js') diff --git a/js/bug.js b/js/bug.js new file mode 100644 index 000000000..8cee68efc --- /dev/null +++ b/js/bug.js @@ -0,0 +1,117 @@ +/* The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is the Bugzilla Bug Tracking System. + * + * The Initial Developer of the Original Code is Everything Solved, Inc. + * Portions created by Everything Solved are Copyright (C) 2010 Everything + * Solved, Inc. All Rights Reserved. + * + * Contributor(s): Max Kanat-Alexander + */ + +/* This library assumes that the needed YUI libraries have been loaded + already. */ + +YAHOO.bugzilla.dupTable = { + counter: 0, + dataSource: null, + updateTable: function(dataTable, product_name, summary_field) { + if (summary_field.value.length < 4) return; + + YAHOO.bugzilla.dupTable.counter = YAHOO.bugzilla.dupTable.counter + 1; + YAHOO.util.Connect.setDefaultPostHeader('application/json', true); + var json_object = { + version : "1.1", + method : "Bug.possible_duplicates", + id : YAHOO.bugzilla.dupTable.counter, + params : { + product : product_name, + summary : summary_field.value, + limit : 7, + include_fields : [ "id", "summary", "status", "resolution", + "update_token" ] + } + }; + var post_data = YAHOO.lang.JSON.stringify(json_object); + + var callback = { + success: dataTable.onDataReturnInitializeTable, + failure: dataTable.onDataReturnInitializeTable, + scope: dataTable, + argument: dataTable.getState() + }; + dataTable.showTableMessage(dataTable.get("MSG_LOADING"), + YAHOO.widget.DataTable.CLASS_LOADING); + YAHOO.util.Dom.removeClass('possible_duplicates_container', + 'bz_default_hidden'); + dataTable.getDataSource().sendRequest(post_data, callback); + }, + formatBugLink: function(el, oRecord, oColumn, oData) { + el.innerHTML = '' + + oData + ''; + }, + formatStatus: function(el, oRecord, oColumn, oData) { + var resolution = oRecord.getData('resolution'); + if (resolution) { + el.innerHTML = oData + ' ' + resolution; + } + else { + el.innerHTML = oData; + } + }, + formatCcButton: function(el, oRecord, oColumn, oData) { + var url = 'process_bug.cgi?id=' + oRecord.getData('id') + + '&addselfcc=1&token=' + escape(oData); + var button = document.createElement('button'); + button.setAttribute('type', 'button'); + button.innerHTML = YAHOO.bugzilla.dupTable.addCcMessage; + button.onclick = function() { window.location = url; return false; }; + el.appendChild(button); + }, + init_ds: function() { + var new_ds = new YAHOO.util.XHRDataSource("jsonrpc.cgi"); + new_ds.connTimeout = 30000; + new_ds.connMethodPost = true; + new_ds.connXhrMode = "cancelStaleRequests"; + new_ds.maxCacheEntries = 3; + new_ds.responseSchema = { + resultsList : "result.bugs", + metaFields : { error: "error", jsonRpcId: "id" }, + }; + // DataSource can't understand a JSON-RPC error response, so + // we have to modify the result data if we get one. + new_ds.doBeforeParseData = + function(oRequest, oFullResponse, oCallback) { + if (oFullResponse.error) { + oFullResponse.result = {}; + oFullResponse.result.bugs = []; + if (console) { + console.log("JSON-RPC error:", oFullResponse.error); + } + } + return oFullResponse; + } + + this.dataSource = new_ds; + }, + init: function(data) { + if (this.dataSource == null) this.init_ds(); + data.options.initialLoad = false; + var dt = new YAHOO.widget.DataTable(data.container, data.columns, + this.dataSource, data.options); + YAHOO.util.Event.on(data.summary_field, 'blur', + function(e) { + YAHOO.bugzilla.dupTable.updateTable(dt, data.product_name, + YAHOO.util.Event.getTarget(e)) + } + ); + }, +}; -- cgit v1.2.3-24-g4f1b