summaryrefslogtreecommitdiffstats
path: root/webapp/static/widgets.js
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/static/widgets.js')
-rw-r--r--webapp/static/widgets.js358
1 files changed, 358 insertions, 0 deletions
diff --git a/webapp/static/widgets.js b/webapp/static/widgets.js
new file mode 100644
index 0000000000..3187d1af92
--- /dev/null
+++ b/webapp/static/widgets.js
@@ -0,0 +1,358 @@
+/*
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+// utilities
+// =============================================================================
+
+function trim(str)
+{
+ return str.replace(/^\s+|\s+$/g, '');
+}
+
+function add_input(mom, type, name, value)
+{
+ var input = document.createElement("input");
+ input.type = type;
+ if (name) input.name = name
+ if (value) input.value = value;
+ mom.appendChild(input);
+ return input;
+}
+
+function add_option(select, text, value, selected)
+{
+ var opt = document.createElement("option");
+ opt.text = text;
+ opt.value = value;
+ opt.selected = selected;
+ select.appendChild(opt);
+ return opt;
+}
+
+function set_error(me, error)
+{
+ var o = me.error_div;
+ if (error) {
+ var N = o.childNodes.length;
+ for (var i=0; i<N; i++) {
+ o.removeChild(o.childNodes[0]);
+ }
+ o.appendChild(document.createTextNode(error));
+ o.style.display = "block";
+ } else {
+ o.style.display = "none";
+ }
+}
+
+// UserGroupField
+// =============================================================================
+
+function UserGroupField_add_keydown(ev, me)
+{
+ if (ev.keyCode == 13) {
+ // enter
+ UserGroupField_add(me);
+ return false;
+ }
+ return true;
+}
+
+function UserGroupField_insertEntry(me, entry)
+{
+ var type = entry["type"];
+ var key = entry["key"];
+ var display_name;
+ if (type == "user") {
+ display_name = entry["real_name"] + " <" + entry["email"] + ">";
+ } else if (type == "group") {
+ display_name = "Group: " + entry["name"];
+ }
+
+ var tr = me.table.insertRow(me.table.rows.length-1);
+ var td = tr.insertCell(-1);
+ td.appendChild(document.createTextNode(display_name));
+ var td = tr.insertCell(-1);
+ var input = document.createElement("input");
+ var input = add_input(td, "button", null, "delete");
+ input.onclick = function () { UserGroupField_delete(me, tr); };
+ add_input(td, "hidden", me.name + "_keys", key);
+
+ me.people[me.people.length] = key;
+}
+
+function UserGroupField_insertField(mom, name, allow_users, allow_groups, initial)
+{
+ var me = new Object();
+ me.name = name;
+ me.allow_users = allow_users;
+ me.allow_groups = allow_groups;
+ me.people = []; // The users and groups already added
+
+ // the table
+ me.table = document.createElement("table");
+
+ // the add field button
+ var tr = me.table.insertRow(-1);
+ var td = tr.insertCell(-1);
+ me.add_text = add_input(td, "text", name + "_add", "");
+ me.add_text.onkeypress = function(ev) {
+ return UserGroupField_add_keydown(ev, me);
+ };
+ var td = tr.insertCell(-1);
+ var add_button = add_input(td, "button", null, "add");
+ add_button.onclick = function() {
+ UserGroupField_add(me);
+ };
+ var td = tr.insertCell(-1);
+ me.error_div = document.createElement("div");
+ me.error_div.style.display = "none";
+ me.error_div.style.color = "red"; // TODO(joeo) CSS!
+ td.appendChild(me.error_div);
+
+ for (var i=0; i<initial.length; i++) {
+ UserGroupField_insertEntry(me, initial[i]);
+ }
+
+ mom.appendChild(me.table);
+}
+
+function UserGroupField_add(me)
+{
+ // figure out the value they want
+ var val = trim(me.add_text.value);
+ if (val.length == 0) {
+ // bail if it is empty
+ me.add_text.value = "";
+ return;
+ }
+
+ if (me.add_text.ajaxController) {
+ me.add_text.ajaxController.cancel();
+ }
+ me.add_text.ajaxController = get_json(
+ "/admin/people_info?op=get_user_info&id=" + escape(val)
+ + "&allow_users=" + me.allow_users + "&allow_groups=" + me.allow_groups,
+ function(success, result) {
+ if (!success) {
+ show_bad_connection_error("UserGroupField_add_callback");
+ return;
+ }
+
+ if (!result) {
+ if (me.allow_users && me.allow_groups) {
+ set_error(me, "Not a registered email address or group name.");
+ } else if (me.allow_users) {
+ set_error(me, "Not a registered email address.");
+ } else if (me.allow_groups) {
+ set_error(me, "Not a registered group name.");
+ }
+ return;
+ }
+
+ // check to make sure it is not a duplicate
+ var key = result["key"];
+ var type = result["type"];
+ for (var i=0; i<me.people.length; i++) {
+ if (me.people[i] == key) {
+ if (type == "user") {
+ set_error(me, "That user is already added.");
+ } else {
+ set_error(me, "That group is already added.");
+ }
+ return;
+ }
+ }
+
+ // add the new row and hidden inputs
+ UserGroupField_insertEntry(me, result);
+
+ // clear the error and text box
+ set_error(me, null);
+ me.add_text.value = "";
+ });
+}
+
+function UserGroupField_delete(me, tr)
+{
+ me.table.deleteRow(tr);
+}
+
+
+// ApproversField
+// =============================================================================
+
+function ApproversField_insertEntry(me, entry)
+{
+ var files;
+ var key;
+ var approvers;
+ var verifiers;
+ var bad_files;
+ if (entry) {
+ files = entry["files"];
+ bad_files = entry["bad_files"];
+ key = entry["key"];
+ approvers = entry["approvers"];
+ verifiers = entry["verifiers"];
+ } else {
+ files = "";
+ bad_files = "";
+ key = "added_" + me.key_index;
+ me.key_index = me.key_index + 1;
+ approvers = [];
+ verifiers = [];
+ }
+ var field_key = me.name + "_" + key;
+
+ var tr = me.table.insertRow(me.table.rows.length);
+ var td = tr.insertCell(-1);
+
+ var style = me.styles["approval"];
+ if (style) {
+ td.className = style;
+ }
+
+ if (bad_files.length > 0) {
+ var bad_files_div = document.createElement("div");
+ td.appendChild(bad_files_div);
+ bad_files_div.className = "bad_files";
+ bad_files_div.appendChild(document.createTextNode("Illegal file paths:"));
+ var bad_files_ul = document.createElement("ul");
+ bad_files_div.appendChild(bad_files_ul);
+ for (var i in bad_files) {
+ var bad_file_li = document.createElement("li");
+ bad_files_ul.appendChild(bad_file_li);
+ bad_file_li.appendChild(document.createTextNode(bad_files[i]));
+ }
+ }
+
+ var textarea = document.createElement("textarea");
+ textarea.name = field_key + "_files";
+ textarea.cols = 100;
+ textarea.rows = 5;
+ textarea.appendChild(document.createTextNode(files));
+ td.appendChild(textarea);
+
+ me.keys_field = add_input(td, "hidden", me.name + "_keys", key);
+
+ var field_table = document.createElement("table");
+ field_table.width = "100%";
+ td.appendChild(field_table);
+ var field_tr = field_table.insertRow(-1);
+ var field_td = document.createElement("th");
+ field_tr.appendChild(field_td);
+ field_td.appendChild(document.createTextNode("Approvers"));
+ field_td = document.createElement("th");
+ field_tr.appendChild(field_td);
+ field_td.appendChild(document.createTextNode("Verifiers"));
+ var field_tr = field_table.insertRow(-1);
+ field_td = field_tr.insertCell(-1);
+ UserGroupField_insertField(field_td, field_key + "_approvers", true, true, approvers);
+
+ field_td = field_tr.insertCell(-1);
+ UserGroupField_insertField(field_td, field_key + "_verifiers", true, true, verifiers);
+
+
+ var td = tr.insertCell(-1);
+ td.vAlign = "top";
+ var input = add_input(td, "button", null, "delete");
+ input.onclick = function () { ApproversField_delete(me, tr); };
+ if (style) {
+ td.className = style;
+ }
+}
+
+function ApproversField_insertField(mom, name, initial, styles)
+{
+ var me = new Object();
+ me.name = name;
+ me.key_index = 0;
+ me.styles = styles;
+
+ mom = document.getElementById(mom);
+
+ me.div = document.createElement("div");
+ me.table = document.createElement("table");
+ me.div.appendChild(me.table);
+
+ for (var i=0; i<initial.length; i++) {
+ ApproversField_insertEntry(me, initial[i]);
+ }
+
+ var add_button = add_input(me.div, "button", null, "Add Approver");
+ add_button.onclick = function() { ApproversField_add(me); };
+
+ mom.appendChild(me.div);
+}
+
+function ApproversField_add(me)
+{
+ ApproversField_insertEntry(me, null);
+}
+
+function ApproversField_delete(me, tr)
+{
+ me.table.deleteRow(tr);
+}
+
+
+// ApproversField
+// =============================================================================
+
+function ProjectField_insertEntry(me, name, project_list, value)
+{
+ var s = document.createElement("select");
+ s.name = name;
+ s.className = "project-field"
+ me.mom.appendChild(s);
+ add_option(s, "--", null, value == null);
+ for (var i in project_list) {
+ var p = project_list[i];
+ add_option(s, p["name"], p["key"], p["key"] == value);
+ }
+ me.last = s;
+
+ s.onclick = function() {
+ if (s.selectedIndex == 0) {
+ // the -- item
+ if (s != me.last) {
+ me.mom.removeChild(s);
+ }
+ } else {
+ if (s == me.last) {
+ ProjectField_insertEntry(me, name, project_list, "--");
+ }
+ }
+ };
+}
+
+function ProjectField_insertField(mom, name, project_list, initial)
+{
+ var me = new Object();
+ me.mom = mom;
+
+ var current = new Array(initial.length);
+ for (var i in initial) {
+ current[i] = initial[i];
+ }
+
+ for (var i in current) {
+ ProjectField_insertEntry(me, name, project_list, current[i]);
+ }
+ ProjectField_insertEntry(me, name, project_list, null);
+}
+