Create js folder. Move Editor to its own file.
This commit is contained in:
parent
aa284c388d
commit
56a998682d
5 changed files with 224 additions and 222 deletions
|
@ -1,225 +1,3 @@
|
|||
var PARAGRAPH_TYPES = new Set(["P", "PRE"]);
|
||||
|
||||
function Editor(elements, on_open, on_save, on_cancel)
|
||||
{
|
||||
/*
|
||||
This class wraps around display elements like headers and paragraphs, and
|
||||
creates inputs / textareas to edit them with.
|
||||
|
||||
The placeholder text for the edit elements comes from the
|
||||
data-editor-placeholder attribute of the display elements if available.
|
||||
|
||||
The on_open, on_save and on_cancel callbacks will receive two arguments:
|
||||
1. This editor object.
|
||||
2. the edit elements as either:
|
||||
If the display elements ALL have data-editor-id attributes,
|
||||
then a dictionary of {data-editor-id: edit_element, ...}.
|
||||
Otherwise, an array of [edit_element, ...] in their original order.
|
||||
|
||||
When your callbacks are used, the default `open`, `save`, `cancel`
|
||||
methods are not called automatically. You should call them from within
|
||||
your function.
|
||||
*/
|
||||
this.cancel = function()
|
||||
{
|
||||
this.close();
|
||||
};
|
||||
|
||||
this.close = function()
|
||||
{
|
||||
for (var index = 0; index < this.display_elements.length; index += 1)
|
||||
{
|
||||
this.display_elements[index].classList.remove("hidden");
|
||||
this.edit_elements[index].classList.add("hidden");
|
||||
}
|
||||
this.open_button.classList.remove("hidden")
|
||||
this.save_button.classList.add("hidden");
|
||||
this.cancel_button.classList.add("hidden");
|
||||
};
|
||||
|
||||
this.hide_spinner = function()
|
||||
{
|
||||
this.spinner.classList.add("hidden");
|
||||
};
|
||||
|
||||
this.open = function()
|
||||
{
|
||||
for (var index = 0; index < this.display_elements.length; index += 1)
|
||||
{
|
||||
var display_element = this.display_elements[index];
|
||||
var edit_element = this.edit_elements[index];
|
||||
display_element.classList.add("hidden");
|
||||
edit_element.classList.remove("hidden");
|
||||
|
||||
var empty_text = display_element.dataset.editorEmptyText;
|
||||
if (empty_text !== undefined && display_element.innerText == empty_text)
|
||||
{
|
||||
edit_element.value = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
edit_element.value = display_element.innerText;
|
||||
}
|
||||
}
|
||||
this.open_button.classList.add("hidden")
|
||||
this.save_button.classList.remove("hidden");
|
||||
this.cancel_button.classList.remove("hidden");
|
||||
};
|
||||
|
||||
this.save = function()
|
||||
{
|
||||
for (var index = 0; index < this.display_elements.length; index += 1)
|
||||
{
|
||||
var display_element = this.display_elements[index];
|
||||
var edit_element = this.edit_elements[index];
|
||||
|
||||
if (display_element.dataset.editorEmptyText !== undefined && edit_element.value == "")
|
||||
{
|
||||
display_element.innerText = display_element.dataset.editorEmptyText;
|
||||
}
|
||||
else
|
||||
{
|
||||
display_element.innerText = edit_element.value;
|
||||
}
|
||||
}
|
||||
|
||||
this.close();
|
||||
};
|
||||
|
||||
this.show_spinner = function()
|
||||
{
|
||||
this.spinner.classList.remove("hidden");
|
||||
};
|
||||
|
||||
this.display_elements = [];
|
||||
this.edit_elements = [];
|
||||
|
||||
this.can_use_element_map = true;
|
||||
this.display_element_map = {};
|
||||
this.edit_element_map = {};
|
||||
|
||||
this.misc_data = {};
|
||||
|
||||
for (var index = 0; index < elements.length; index += 1)
|
||||
{
|
||||
var display_element = elements[index];
|
||||
var edit_element;
|
||||
if (PARAGRAPH_TYPES.has(display_element.tagName))
|
||||
{
|
||||
edit_element = document.createElement("textarea");
|
||||
edit_element.rows = 6;
|
||||
}
|
||||
else
|
||||
{
|
||||
edit_element = document.createElement("input");
|
||||
edit_element.type = "text";
|
||||
}
|
||||
edit_element.classList.add("editor_input");
|
||||
edit_element.classList.add("hidden");
|
||||
|
||||
if (display_element.dataset.editorPlaceholder !== undefined)
|
||||
{
|
||||
edit_element.placeholder = display_element.dataset.editorPlaceholder;
|
||||
}
|
||||
|
||||
if (this.can_use_element_map)
|
||||
{
|
||||
if (display_element.dataset.editorId !== undefined)
|
||||
{
|
||||
this.display_element_map[display_element.dataset.editorId] = display_element;
|
||||
this.edit_element_map[display_element.dataset.editorId] = edit_element;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.can_use_element_map = false;
|
||||
this.edit_element_map = null;
|
||||
this.display_element_map = null;
|
||||
}
|
||||
}
|
||||
|
||||
display_element.parentElement.insertBefore(edit_element, display_element.nextSibling);
|
||||
|
||||
this.display_elements.push(display_element);
|
||||
this.edit_elements.push(edit_element);
|
||||
}
|
||||
|
||||
var self = this;
|
||||
var binder = function(func, fallback)
|
||||
{
|
||||
if (func == undefined)
|
||||
{
|
||||
return fallback;
|
||||
}
|
||||
|
||||
var bound = function()
|
||||
{
|
||||
if (this.can_use_element_map)
|
||||
{
|
||||
func(self, self.edit_element_map, self.display_element_map);
|
||||
}
|
||||
else
|
||||
{
|
||||
func(self, self.edit_elements, self.display_elements);
|
||||
}
|
||||
}
|
||||
return bound;
|
||||
}
|
||||
|
||||
this.bound_open = binder(on_open, this.open);
|
||||
this.bound_save = binder(on_save, this.save);
|
||||
this.bound_cancel = binder(on_cancel, this.cancel);
|
||||
|
||||
var last_element = this.edit_elements[this.edit_elements.length - 1];
|
||||
var toolbox = document.createElement("div");
|
||||
toolbox.classList.add("editor_toolbox");
|
||||
last_element.parentElement.insertBefore(toolbox, last_element.nextSibling);
|
||||
|
||||
this.open_button = document.createElement("button");
|
||||
this.open_button.innerText = "Edit";
|
||||
this.open_button.classList.add("editor_button");
|
||||
this.open_button.classList.add("editor_open_button");
|
||||
this.open_button.classList.add("green_button");
|
||||
this.open_button.onclick = this.bound_open.bind(this);
|
||||
toolbox.appendChild(this.open_button);
|
||||
|
||||
this.save_button = document.createElement("button");
|
||||
this.save_button.innerText = "Save";
|
||||
this.save_button.classList.add("editor_button");
|
||||
this.save_button.classList.add("editor_save_button");
|
||||
this.save_button.classList.add("green_button");
|
||||
this.save_button.classList.add("hidden");
|
||||
this.save_button.onclick = this.bound_save.bind(this);
|
||||
toolbox.appendChild(this.save_button);
|
||||
|
||||
this.cancel_button = document.createElement("button");
|
||||
this.cancel_button.innerText = "Cancel";
|
||||
this.cancel_button.classList.add("editor_button");
|
||||
this.cancel_button.classList.add("editor_cancel_button");
|
||||
this.cancel_button.classList.add("red_button");
|
||||
this.cancel_button.classList.add("hidden");
|
||||
this.cancel_button.onclick = this.bound_cancel.bind(this);
|
||||
toolbox.appendChild(this.cancel_button);
|
||||
|
||||
this.spinner = document.createElement("span");
|
||||
this.spinner.innerText = "Submitting...";
|
||||
this.spinner.classList.add("editor_spinner");
|
||||
this.spinner.classList.add("hidden");
|
||||
toolbox.appendChild(this.spinner);
|
||||
|
||||
for (var index = 0; index < this.edit_elements.length; index += 1)
|
||||
{
|
||||
var edit_element = this.edit_elements[index];
|
||||
if (edit_element.tagName == "TEXTAREA")
|
||||
{
|
||||
bind_box_to_button(edit_element, this.save_button, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
bind_box_to_button(edit_element, this.save_button, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function create_message_bubble(message_area, message_positivity, message_text, lifespan)
|
||||
{
|
||||
if (lifespan === undefined)
|
||||
|
|
221
frontends/etiquette_flask/static/js/editor.js
Normal file
221
frontends/etiquette_flask/static/js/editor.js
Normal file
|
@ -0,0 +1,221 @@
|
|||
var PARAGRAPH_TYPES = new Set(["P", "PRE"]);
|
||||
|
||||
function Editor(elements, on_open, on_save, on_cancel)
|
||||
{
|
||||
/*
|
||||
This class wraps around display elements like headers and paragraphs, and
|
||||
creates inputs / textareas to edit them with.
|
||||
|
||||
The placeholder text for the edit elements comes from the
|
||||
data-editor-placeholder attribute of the display elements if available.
|
||||
|
||||
The on_open, on_save and on_cancel callbacks will receive two arguments:
|
||||
1. This editor object.
|
||||
2. the edit elements as either:
|
||||
If the display elements ALL have data-editor-id attributes,
|
||||
then a dictionary of {data-editor-id: edit_element, ...}.
|
||||
Otherwise, an array of [edit_element, ...] in their original order.
|
||||
|
||||
When your callbacks are used, the default `open`, `save`, `cancel`
|
||||
methods are not called automatically. You should call them from within
|
||||
your function.
|
||||
*/
|
||||
this.cancel = function()
|
||||
{
|
||||
this.close();
|
||||
};
|
||||
|
||||
this.close = function()
|
||||
{
|
||||
for (var index = 0; index < this.display_elements.length; index += 1)
|
||||
{
|
||||
this.display_elements[index].classList.remove("hidden");
|
||||
this.edit_elements[index].classList.add("hidden");
|
||||
}
|
||||
this.open_button.classList.remove("hidden")
|
||||
this.save_button.classList.add("hidden");
|
||||
this.cancel_button.classList.add("hidden");
|
||||
};
|
||||
|
||||
this.hide_spinner = function()
|
||||
{
|
||||
this.spinner.classList.add("hidden");
|
||||
};
|
||||
|
||||
this.open = function()
|
||||
{
|
||||
for (var index = 0; index < this.display_elements.length; index += 1)
|
||||
{
|
||||
var display_element = this.display_elements[index];
|
||||
var edit_element = this.edit_elements[index];
|
||||
display_element.classList.add("hidden");
|
||||
edit_element.classList.remove("hidden");
|
||||
|
||||
var empty_text = display_element.dataset.editorEmptyText;
|
||||
if (empty_text !== undefined && display_element.innerText == empty_text)
|
||||
{
|
||||
edit_element.value = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
edit_element.value = display_element.innerText;
|
||||
}
|
||||
}
|
||||
this.open_button.classList.add("hidden")
|
||||
this.save_button.classList.remove("hidden");
|
||||
this.cancel_button.classList.remove("hidden");
|
||||
};
|
||||
|
||||
this.save = function()
|
||||
{
|
||||
for (var index = 0; index < this.display_elements.length; index += 1)
|
||||
{
|
||||
var display_element = this.display_elements[index];
|
||||
var edit_element = this.edit_elements[index];
|
||||
|
||||
if (display_element.dataset.editorEmptyText !== undefined && edit_element.value == "")
|
||||
{
|
||||
display_element.innerText = display_element.dataset.editorEmptyText;
|
||||
}
|
||||
else
|
||||
{
|
||||
display_element.innerText = edit_element.value;
|
||||
}
|
||||
}
|
||||
|
||||
this.close();
|
||||
};
|
||||
|
||||
this.show_spinner = function()
|
||||
{
|
||||
this.spinner.classList.remove("hidden");
|
||||
};
|
||||
|
||||
this.display_elements = [];
|
||||
this.edit_elements = [];
|
||||
|
||||
this.can_use_element_map = true;
|
||||
this.display_element_map = {};
|
||||
this.edit_element_map = {};
|
||||
|
||||
this.misc_data = {};
|
||||
|
||||
for (var index = 0; index < elements.length; index += 1)
|
||||
{
|
||||
var display_element = elements[index];
|
||||
var edit_element;
|
||||
if (PARAGRAPH_TYPES.has(display_element.tagName))
|
||||
{
|
||||
edit_element = document.createElement("textarea");
|
||||
edit_element.rows = 6;
|
||||
}
|
||||
else
|
||||
{
|
||||
edit_element = document.createElement("input");
|
||||
edit_element.type = "text";
|
||||
}
|
||||
edit_element.classList.add("editor_input");
|
||||
edit_element.classList.add("hidden");
|
||||
|
||||
if (display_element.dataset.editorPlaceholder !== undefined)
|
||||
{
|
||||
edit_element.placeholder = display_element.dataset.editorPlaceholder;
|
||||
}
|
||||
|
||||
if (this.can_use_element_map)
|
||||
{
|
||||
if (display_element.dataset.editorId !== undefined)
|
||||
{
|
||||
this.display_element_map[display_element.dataset.editorId] = display_element;
|
||||
this.edit_element_map[display_element.dataset.editorId] = edit_element;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.can_use_element_map = false;
|
||||
this.edit_element_map = null;
|
||||
this.display_element_map = null;
|
||||
}
|
||||
}
|
||||
|
||||
display_element.parentElement.insertBefore(edit_element, display_element.nextSibling);
|
||||
|
||||
this.display_elements.push(display_element);
|
||||
this.edit_elements.push(edit_element);
|
||||
}
|
||||
|
||||
var self = this;
|
||||
var binder = function(func, fallback)
|
||||
{
|
||||
if (func == undefined)
|
||||
{
|
||||
return fallback;
|
||||
}
|
||||
|
||||
var bound = function()
|
||||
{
|
||||
if (this.can_use_element_map)
|
||||
{
|
||||
func(self, self.edit_element_map, self.display_element_map);
|
||||
}
|
||||
else
|
||||
{
|
||||
func(self, self.edit_elements, self.display_elements);
|
||||
}
|
||||
}
|
||||
return bound;
|
||||
}
|
||||
|
||||
this.bound_open = binder(on_open, this.open);
|
||||
this.bound_save = binder(on_save, this.save);
|
||||
this.bound_cancel = binder(on_cancel, this.cancel);
|
||||
|
||||
var last_element = this.edit_elements[this.edit_elements.length - 1];
|
||||
var toolbox = document.createElement("div");
|
||||
toolbox.classList.add("editor_toolbox");
|
||||
last_element.parentElement.insertBefore(toolbox, last_element.nextSibling);
|
||||
|
||||
this.open_button = document.createElement("button");
|
||||
this.open_button.innerText = "Edit";
|
||||
this.open_button.classList.add("editor_button");
|
||||
this.open_button.classList.add("editor_open_button");
|
||||
this.open_button.classList.add("green_button");
|
||||
this.open_button.onclick = this.bound_open.bind(this);
|
||||
toolbox.appendChild(this.open_button);
|
||||
|
||||
this.save_button = document.createElement("button");
|
||||
this.save_button.innerText = "Save";
|
||||
this.save_button.classList.add("editor_button");
|
||||
this.save_button.classList.add("editor_save_button");
|
||||
this.save_button.classList.add("green_button");
|
||||
this.save_button.classList.add("hidden");
|
||||
this.save_button.onclick = this.bound_save.bind(this);
|
||||
toolbox.appendChild(this.save_button);
|
||||
|
||||
this.cancel_button = document.createElement("button");
|
||||
this.cancel_button.innerText = "Cancel";
|
||||
this.cancel_button.classList.add("editor_button");
|
||||
this.cancel_button.classList.add("editor_cancel_button");
|
||||
this.cancel_button.classList.add("red_button");
|
||||
this.cancel_button.classList.add("hidden");
|
||||
this.cancel_button.onclick = this.bound_cancel.bind(this);
|
||||
toolbox.appendChild(this.cancel_button);
|
||||
|
||||
this.spinner = document.createElement("span");
|
||||
this.spinner.innerText = "Submitting...";
|
||||
this.spinner.classList.add("editor_spinner");
|
||||
this.spinner.classList.add("hidden");
|
||||
toolbox.appendChild(this.spinner);
|
||||
|
||||
for (var index = 0; index < this.edit_elements.length; index += 1)
|
||||
{
|
||||
var edit_element = this.edit_elements[index];
|
||||
if (edit_element.tagName == "TEXTAREA")
|
||||
{
|
||||
bind_box_to_button(edit_element, this.save_button, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
bind_box_to_button(edit_element, this.save_button, false);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -9,6 +9,7 @@
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<link rel="stylesheet" href="/static/common.css">
|
||||
<script src="/static/common.js"></script>
|
||||
<script src="/static/js/editor.js"></script>
|
||||
<script src="/static/photoclipboard.js"></script>
|
||||
|
||||
<style>
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<link rel="stylesheet" href="/static/common.css">
|
||||
<script src="/static/common.js"></script>
|
||||
<script src="/static/js/editor.js"></script>
|
||||
|
||||
<style>
|
||||
#bookmarks
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<link rel="stylesheet" href="/static/common.css">
|
||||
<script src="/static/common.js"></script>
|
||||
<script src="/static/js/editor.js"></script>
|
||||
|
||||
<style>
|
||||
body
|
||||
|
|
Loading…
Reference in a new issue