aboutsummaryrefslogtreecommitdiffstats
path: root/src/static
diff options
context:
space:
mode:
Diffstat (limited to 'src/static')
-rw-r--r--src/static/css/base.css17
-rw-r--r--src/static/js/dashboard.js199
2 files changed, 190 insertions, 26 deletions
diff --git a/src/static/css/base.css b/src/static/css/base.css
index 1494e77..9fec97e 100644
--- a/src/static/css/base.css
+++ b/src/static/css/base.css
@@ -66,9 +66,6 @@ a[aria-expanded="true"] > i.rotate {
box-shadow: 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(109, 243, 76, 0.6);
transition: border-color ease-in-out .1s,box-shadow ease-in-out .1s;
}
-#grid_wrapper > .row > div:first-child {
- border-right: 1px solid gray;
-}
/* Cursor effects */
.not-allowed {
@@ -81,14 +78,18 @@ a[aria-expanded="true"] > i.rotate {
top: 0;
}
-/* Dropdown for collaborators */
-#drop_results {
- max-height: 10rem;
+.z-2 {
z-index: 2;
}
-#drop_results > li {
- word-wrap: anywhere;
+.mh-30vh {
+ max-height: 30vh;
+}
+
+.overflow-ellipsis {
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
}
/* Graphing for networks */
diff --git a/src/static/js/dashboard.js b/src/static/js/dashboard.js
index f1eff77..b74ead9 100644
--- a/src/static/js/dashboard.js
+++ b/src/static/js/dashboard.js
@@ -4,14 +4,107 @@
form_submission_callbacks = []; //all runnables will be executed before form submission
-
///////////////////
// Global Functions
///////////////////
+function update_page(response) {
+ if( response.redirect )
+ {
+ window.location.replace(response.redirect);
+ return;
+ }
+ draw_breadcrumbs(response.meta);
+ update_exit_button(response.meta);
+ update_side_buttons(response.meta);
+ $("#formContainer").html(response.content);
+}
+
+function update_side_buttons(meta) {
+ const step = meta.active;
+ const page_count = meta.steps.length;
+
+ const back_button = document.getElementById("gob");
+ if (step == 0) {
+ back_button.classList.add("disabled");
+ back_button.disabled = true;
+ } else {
+ back_button.classList.remove("disabled");
+ back_button.disabled = false;
+ }
+
+ const forward_btn = document.getElementById("gof");
+ if (step == page_count - 1) {
+ forward_btn.classList.add("disabled");
+ forward_btn.disabled = true;
+ } else {
+ forward_btn.classList.remove("disabled");
+ forward_btn.disabled = false;
+ }
+}
+
+function update_exit_button(meta) {
+ if (meta.workflow_count == 1) {
+ document.getElementById("cancel_btn").innerText = "Exit Workflow";
+ } else {
+ document.getElementById("cancel_btn").innerText = "Return to Parent";
+ }
+}
+
+function draw_breadcrumbs(meta) {
+ $("#topPagination").children().not(".page-control").remove();
+
+ for (const i in meta.steps) {
+ const step_btn = create_step(meta.steps[i], i == meta["active"]);
+ $("#topPagination li:last-child").before(step_btn);
+ }
+}
+
+function create_step(step_json, active) {
+ const step_dom = document.createElement("li");
+ // First create the dom object depending on active or not
+ step_dom.className = "topcrumb";
+ if (active) {
+ step_dom.classList.add("active");
+ }
+ $(step_dom).html(`<span class="d-flex align-items-center justify-content-center text-capitalize w-100">${step_json['title']}</span>`)
+
+ const code = step_json.valid;
+
+ let stat = "";
+ let msg = "";
+ if (code < 100) {
+ $(step_dom).children().first().append("<i class='ml-2 far fa-square'></i>")
+ stat = "";
+ msg = "";
+ } else if (code < 200) {
+ $(step_dom).children().first().append("<i class='ml-2 fas fa-minus-square'></i>")
+ stat = "invalid";
+ msg = step_json.message;
+ } else if (code < 300) {
+ $(step_dom).children().first().append("<i class='ml-2 far fa-check-square'></i>")
+ stat = "valid";
+ msg = step_json.message;
+ }
+
+ if (step_json.enabled == false) {
+ step_dom.classList.add("disabled");
+ }
+ if (active) {
+ update_message(msg, stat);
+ }
-function updatePage(data){
- updateBreadcrumbs(data['meta']);
- $("formContainer").html(data['content']);
+ return step_dom;
+}
+
+function update_description(title, desc) {
+ document.getElementById("view_title").innerText = title;
+ document.getElementById("view_desc").innerText = desc;
+}
+
+function update_message(message, stepstatus) {
+ document.getElementById("view_message").innerText = message;
+ document.getElementById("view_message").className = "step_message";
+ document.getElementById("view_message").classList.add("message_" + stepstatus);
}
function submitStepForm(next_step = "current"){
@@ -22,11 +115,10 @@ function submitStepForm(next_step = "current"){
"step_form": step_form_data,
"csrfmiddlewaretoken": $("[name=csrfmiddlewaretoken]").val()
});
- console.log(form_data);
$.post(
'/workflow/manager/',
form_data,
- (data) => updatePage(data),
+ (data) => update_page(data),
'json'
).fail(() => alert("failure"));
}
@@ -37,6 +129,58 @@ function run_form_callbacks(){
form_submission_callbacks = [];
}
+function create_workflow(type) {
+ $.ajax({
+ type: "POST",
+ url: "/workflow/create/",
+ data: {
+ "workflow_type": type
+ },
+ headers: {
+ "X-CSRFToken": $('input[name="csrfmiddlewaretoken"]').val()
+ }
+ }).done(function (data, textStatus, jqXHR) {
+ window.location = "/workflow/";
+ }).fail(function (jqxHR, textstatus) {
+ alert("Something went wrong...");
+ });
+}
+
+function add_workflow(type) {
+ data = $.ajax({
+ type: "POST",
+ url: "/workflow/add/",
+ data: {
+ "workflow_type": type
+ },
+ headers: {
+ "X-CSRFToken": $('input[name="csrfmiddlewaretoken"]').val()
+ }
+ }).done(function (data, textStatus, jqXHR) {
+ update_page(data);
+ }).fail(function (jqxHR, textstatus) {
+ alert("Something went wrong...");
+ });
+}
+
+function pop_workflow() {
+ data = $.ajax({
+ type: "POST",
+ url: "/workflow/pop/",
+ headers: {
+ "X-CSRFToken": $('input[name="csrfmiddlewaretoken"]').val()
+ }
+ }).done(function (data, textStatus, jqXHR) {
+ update_page(data);
+ }).fail(function (jqxHR, textstatus) {
+ alert("Something went wrong...");
+ });
+}
+
+function continue_workflow() {
+ window.location.replace("/workflow/");
+}
+
///////////////////
//Class Definitions
///////////////////
@@ -1092,12 +1236,13 @@ class SearchableSelectMultipleWidget {
for( const id in ids )
{
- const result_entry = document.createElement("li");
- const result_button = document.createElement("a");
const obj = this.items[id];
const result_text = this.generate_element_text(obj);
- result_entry.classList.add("list-group-item", "list-group-item-action");
+ const result_entry = document.createElement("a");
+ result_entry.href = "#";
result_entry.innerText = result_text;
+ result_entry.title = result_text;
+ result_entry.classList.add("list-group-item", "list-group-item-action", "overflow-ellipsis", "flex-shrink-0");
result_entry.onclick = function() { searchable_select_multiple_widget.select_item(obj.id); };
const tooltip = document.createElement("span");
const tooltiptext = document.createTextNode(result_text);
@@ -1156,21 +1301,39 @@ class SearchableSelectMultipleWidget {
added_list.removeChild(added_list.firstChild);
}
- let list_html = "";
+ const list_html = document.createElement("div");
+ list_html.classList.add("list-group");
for( const item_id of this.added_items )
{
- const item = this.items[item_id];
+ const times = document.createElement("li");
+ times.classList.add("fas", "fa-times");
+
+ const deleteButton = document.createElement("a");
+ deleteButton.href = "#";
+ deleteButton.innerHTML = "<i class='fas fa-times'></i>"
+ // Setting .onclick/.addEventListener does not work,
+ // which is why I took the setAttribute approach
+ // If anyone knows why, please let me know :]
+ deleteButton.setAttribute("onclick", `searchable_select_multiple_widget.remove_item(${item_id});`);
+ deleteButton.classList.add("btn");
+ const deleteColumn = document.createElement("div");
+ deleteColumn.classList.add("col-auto");
+ deleteColumn.append(deleteButton);
+ const item = this.items[item_id];
const element_entry_text = this.generate_element_text(item);
+ const textColumn = document.createElement("div");
+ textColumn.classList.add("col", "overflow-ellipsis");
+ textColumn.innerText = element_entry_text;
+ textColumn.title = element_entry_text;
+
+ const itemRow = document.createElement("div");
+ itemRow.classList.add("list-group-item", "d-flex", "p-0", "align-items-center");
+ itemRow.append(textColumn, deleteColumn);
- list_html += '<div class="border rounded mt-2 w-100 d-flex align-items-center pl-2">'
- + element_entry_text
- + '<button onclick="searchable_select_multiple_widget.remove_item('
- + item_id
- + ')" class="btn btn-danger ml-auto">Remove</button>';
- list_html += '</div>';
+ list_html.append(itemRow);
}
- added_list.innerHTML = list_html;
+ added_list.innerHTML = list_html.innerHTML;
}
}