diff --git a/form.js b/form.js
new file mode 100644
index 0000000000000000000000000000000000000000..ed93a437965cb503ddd726a9ad7188be88bf830d
--- /dev/null
+++ b/form.js
@@ -0,0 +1,68 @@
+const table = {
+  "interactive": { "max_cpu": 48, "max_hour": 2, "max_gpu": -1 },
+  "express": { "max_cpu": 48, "max_hour": 2, "max_gpu": -1 },
+  "short": { "max_cpu": 48, "max_hour": 12, "max_gpu": -1 },
+  "pascalnodes": { "max_cpu": 28, "max_hour": 12, "max_gpu": 4 },
+  "pascalnodes-medium": { "max_cpu": 28, "max_hour": 48, "max_gpu": 4 },
+  "medium": { "max_cpu": 48, "max_hour": 50, "max_gpu": -1 },
+  "long": { "max_cpu": 48, "max_hour": 150, "max_gpu": -1 },
+  "intel-dcb": { "max_cpu": 24, "max_hour": 150, "max_gpu": -1 },
+  "amd-hdr100": { "max_cpu": 128, "max_hour": 150, "max_gpu": -1 },
+  "largemem": { "max_cpu": 24, "max_hour": 50, "max_gpu": -1 },
+  "largemem-long": { "max_cpu": 24, "max_hour": 150, "max_gpu": -1 },
+  "amperenodes": { "max_cpu": 128, "max_hour": 12, "max_gpu": 2 },
+  "amperenodes-medium": { "max_cpu": 128, "max_hour": 48, "max_gpu": 2 },
+}
+
+function set_max_value(form_id, value) {
+  const form_element = $(form_id);
+  form_element.attr({'max': value});
+}
+
+function set_partition_change_handler() {
+  let partition_select = $("#batch_connect_session_context_bc_partition");
+  partition_select.change( function(e) {
+    toggle_gpu_visibility(e);
+  });
+}
+
+function toggle_gpu_visibility(event) {
+  const partition = event.target.value;
+  const cpu_selector = '#batch_connect_session_context_bc_num_slots';
+  const gpu_selector = '#batch_connect_session_context_bc_num_gpus';
+  const hour_selector = '#batch_connect_session_context_bc_num_hours';
+
+  toggle_visibilty_of_form_group(gpu_selector, table[partition]["max_gpu"] != -1);
+  set_max_value(cpu_selector, table[partition]["max_cpu"]);
+  set_max_value(gpu_selector, table[partition]["max_gpu"]);
+  set_max_value(hour_selector, table[partition]["max_hour"]);
+}
+
+function toggle_visibilty_of_form_group(form_id, show) {
+  let form_element = $(form_id);
+  let parent = form_element;
+
+  while (
+    (! parent[0].classList.contains('form-group')) &&
+    (! parent.is('html')) // ensure that we don't loop infinitely
+  ) {
+    parent = parent.parent();
+  }
+
+  // If parent is HTML then something has gone wrong and visibility should not be changed
+  if ( parent.is('html') ) {
+    return;
+  }
+
+  if(show) {
+    parent.show();
+  } else {
+    parent.hide();
+  }
+}
+
+toggle_gpu_visibility(
+  // Fake the event
+  { target: document.querySelector('#batch_connect_session_context_bc_partition') }
+);
+set_partition_change_handler();
diff --git a/form.yml.erb b/form.yml.erb
index aff53991f1f49c5afbe874796da2bd73bd1e76d5..24c5b9d186c584571fab2501cbe853b298847088 100644
--- a/form.yml.erb
+++ b/form.yml.erb
@@ -69,6 +69,7 @@ attributes:
     value: 1
 
   bc_num_slots:
+    widget: "number_field"
     label: Number of CPU
     value: 1
     min: 1
@@ -84,6 +85,7 @@ attributes:
     step: 1
 
   bc_num_gpus:
+    widget: "number_field"
     label: Number of GPUs
     value: 1
     min: 1