Rename tag_object -> tag_card.
This commit is contained in:
parent
7373730f90
commit
7f9c7085f0
9 changed files with 72 additions and 73 deletions
|
@ -156,7 +156,6 @@ Here is a brief overview of the project to help you learn your way around:
|
|||
- When batch fetching objects, consider whether or not a NoSuch should be raised. Perhaps a warningbag should be used.
|
||||
- Find a way to batch the fetching of photo tags in a way that isn't super ugly (e.g. on an album page, the photos themselves are batched, but then the `photo.get_tags()` on each one is not. In order to batch this we would have to have a separate function that fetches a whole bunch of tags and assigns them to the photo object).
|
||||
- Check for embedded cover art when thumbnailing audio files.
|
||||
- Rename "tag_object" to tag card and unify the card experience.
|
||||
- Batch movement of Albums... but without winding up with a second clipboard system?
|
||||
- Overall, more dynamism with cards and tag objects and updating page without requiring refresh.
|
||||
- Serve RSS/Atom forms of search results.
|
||||
|
|
|
@ -165,22 +165,22 @@ is hovered over.
|
|||
{
|
||||
display: none;
|
||||
}
|
||||
.tag_object:hover ~ * .remove_tag_button,
|
||||
.tag_object:hover ~ .remove_tag_button,
|
||||
.tag_card:hover ~ * .remove_tag_button,
|
||||
.tag_card:hover ~ .remove_tag_button,
|
||||
.remove_tag_button:hover,
|
||||
.remove_tag_button_perm:hover
|
||||
{
|
||||
display:inline;
|
||||
}
|
||||
|
||||
.tag_object
|
||||
.tag_card
|
||||
{
|
||||
border-radius: 2px;
|
||||
padding-left: 2px;
|
||||
padding-right: 2px;
|
||||
|
||||
background-color: var(--color_tag_object_bg);
|
||||
color: var(--color_tag_object_fg);
|
||||
background-color: var(--color_tag_card_bg);
|
||||
color: var(--color_tag_card_fg);
|
||||
|
||||
font-size: 0.9em;
|
||||
text-decoration: none;
|
||||
|
|
|
@ -15,6 +15,6 @@
|
|||
--color_shadow: rgba(0, 0, 0, 0.5);
|
||||
--color_highlight: rgba(255, 255, 255, 0.5);
|
||||
|
||||
--color_tag_object_bg: #fff;
|
||||
--color_tag_object_fg: black;
|
||||
--color_tag_card_bg: #fff;
|
||||
--color_tag_card_fg: black;
|
||||
}
|
||||
|
|
|
@ -15,8 +15,8 @@
|
|||
--color_shadow: rgba(0, 0, 0, 0.5);
|
||||
--color_highlight: rgba(255, 255, 255, 0.5);
|
||||
|
||||
--color_tag_object_bg: #e6e6e6;
|
||||
--color_tag_object_fg: black;
|
||||
--color_tag_card_bg: #e6e6e6;
|
||||
--color_tag_card_fg: black;
|
||||
}
|
||||
|
||||
button,
|
||||
|
|
|
@ -15,6 +15,6 @@
|
|||
--color_shadow: rgba(0, 0, 0, 0.5);
|
||||
--color_highlight: rgba(255, 255, 255, 0.5);
|
||||
|
||||
--color_tag_object_bg: #fff;
|
||||
--color_tag_object_fg: blue;
|
||||
--color_tag_card_bg: #fff;
|
||||
--color_tag_card_fg: blue;
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<html>
|
||||
<head>
|
||||
{% import "header.html" as header %}
|
||||
{% import "tag_object.html" as tag_object %}
|
||||
{% import "tag_card.html" as tag_card %}
|
||||
<title>{{photo.basename}} | Photos</title>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
|
@ -161,7 +161,7 @@
|
|||
{% set tags = photo.get_tags()|sort(attribute='name') %}
|
||||
{% for tag in tags %}
|
||||
<li>
|
||||
{{tag_object.tag_object(tag, link="info", with_alt_description=True)}}<!--
|
||||
{{tag_card.create_tag_card(tag, link="info", with_alt_description=True)}}<!--
|
||||
--><button
|
||||
class="remove_tag_button red_button"
|
||||
onclick="return remove_photo_tag_form('{{photo.id}}', '{{tag.name}}');">
|
||||
|
@ -305,26 +305,26 @@ function add_photo_tag_callback(response)
|
|||
return;
|
||||
}
|
||||
const this_tags = document.getElementById("this_tags");
|
||||
const tag_objects = this_tags.getElementsByClassName("tag_object");
|
||||
for (const tag_object of tag_objects)
|
||||
const tag_cards = this_tags.getElementsByClassName("tag_card");
|
||||
for (const tag_card of tag_cards)
|
||||
{
|
||||
if (tag_object.innerText === response.data.tagname)
|
||||
if (tag_card.innerText === response.data.tagname)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
const li = document.createElement("li");
|
||||
const tag_object = document.createElement("a");
|
||||
tag_object.className = "tag_object"
|
||||
tag_object.href = "/tag/" + response.data.tagname;
|
||||
tag_object.innerText = response.data.tagname;
|
||||
const tag_card = document.createElement("a");
|
||||
tag_card.className = "tag_card"
|
||||
tag_card.href = "/tag/" + response.data.tagname;
|
||||
tag_card.innerText = response.data.tagname;
|
||||
const remove_button = document.createElement("button");
|
||||
remove_button.className = "remove_tag_button red_button"
|
||||
remove_button.onclick = () => remove_photo_tag_form(PHOTO_ID, response.data.tagname);
|
||||
li.appendChild(tag_object);
|
||||
li.appendChild(tag_card);
|
||||
li.appendChild(remove_button);
|
||||
this_tags.appendChild(li);
|
||||
sort_tag_objects();
|
||||
sort_tag_cards();
|
||||
}
|
||||
|
||||
function remove_photo_tag_form(photo_id, tagname)
|
||||
|
@ -340,12 +340,12 @@ function remove_photo_tag_callback(response)
|
|||
{
|
||||
return;
|
||||
}
|
||||
const tag_objects = document.getElementById("this_tags").getElementsByClassName("tag_object");
|
||||
for (const tag_object of tag_objects)
|
||||
const tag_cards = document.getElementById("this_tags").getElementsByClassName("tag_card");
|
||||
for (const tag_card of tag_cards)
|
||||
{
|
||||
if (tag_object.innerText === response.data.tagname)
|
||||
if (tag_card.innerText === response.data.tagname)
|
||||
{
|
||||
const li = tag_object.parentElement;
|
||||
const li = tag_card.parentElement;
|
||||
li.parentElement.removeChild(li);
|
||||
}
|
||||
}
|
||||
|
@ -456,14 +456,14 @@ function set_searchhidden_callback(response)
|
|||
|
||||
// UI //////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function sort_tag_objects()
|
||||
function sort_tag_cards()
|
||||
{
|
||||
const tag_list = document.getElementById("this_tags");
|
||||
const lis = Array.from(tag_list.children).filter(el => el.getElementsByClassName("tag_object").length);
|
||||
const lis = Array.from(tag_list.children).filter(el => el.getElementsByClassName("tag_card").length);
|
||||
function compare(li1, li2)
|
||||
{
|
||||
const tag1 = li1.querySelector(".tag_object:last-of-type").innerText;
|
||||
const tag2 = li2.querySelector(".tag_object:last-of-type").innerText;
|
||||
const tag1 = li1.querySelector(".tag_card:last-of-type").innerText;
|
||||
const tag2 = li2.querySelector(".tag_card:last-of-type").innerText;
|
||||
return tag1 < tag2 ? -1 : 1;
|
||||
}
|
||||
lis.sort(compare);
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
<!DOCTYPE html5>
|
||||
<html>
|
||||
<head>
|
||||
{% import "photo_card.html" as photo_card %}
|
||||
{% import "album_card.html" as album_card %}
|
||||
{% import "header.html" as header %}
|
||||
{% import "tag_object.html" as tag_object %}
|
||||
{% import "album_card.html" as album_card %}
|
||||
{% import "photo_card.html" as photo_card %}
|
||||
{% import "tag_card.html" as tag_card %}
|
||||
{% import "clipboard_tray.html" as clipboard_tray %}
|
||||
<title>Search</title>
|
||||
<meta charset="UTF-8">
|
||||
|
@ -200,7 +200,7 @@
|
|||
{% if search_kwargs[key] %}
|
||||
{% for tag in search_kwargs[key] %}
|
||||
<li class="search_builder_{{tagtype}}_inputted">
|
||||
{{tag_object.tag_object(tag, link='info', with_alt_description=True)}}<!--
|
||||
{{tag_card.create_tag_card(tag, link='info', with_alt_description=True)}}<!--
|
||||
--><button class="remove_tag_button red_button"
|
||||
onclick="return remove_searchtag(ul_{{tagtype}}, '{{tag.name}}', inputted_{{tagtype}});"></button>
|
||||
</li>
|
||||
|
@ -327,28 +327,28 @@
|
|||
<ul id="tags_on_this_page_list">
|
||||
{% for tag in total_tags %}
|
||||
<li>
|
||||
{{tag_object.tag_object(
|
||||
{{tag_card.create_tag_card(
|
||||
tag,
|
||||
link=None,
|
||||
onclick="return tags_on_this_page_add_must(event, '" + tag.name + "');",
|
||||
innertext="(+)",
|
||||
)}}
|
||||
|
||||
{{tag_object.tag_object(
|
||||
{{tag_card.create_tag_card(
|
||||
tag,
|
||||
link=None,
|
||||
onclick="return tags_on_this_page_add_may(event, '" + tag.name + "');",
|
||||
innertext="(~)",
|
||||
)}}
|
||||
|
||||
{{tag_object.tag_object(
|
||||
{{tag_card.create_tag_card(
|
||||
tag,
|
||||
link=None,
|
||||
onclick="return tags_on_this_page_add_forbid(event, '" + tag.name + "');",
|
||||
innertext="(x)",
|
||||
)}}
|
||||
|
||||
{{tag_object.tag_object(
|
||||
{{tag_card.create_tag_card(
|
||||
tag,
|
||||
link="info",
|
||||
with_alt_description=True,
|
||||
|
@ -412,7 +412,7 @@ function add_searchtag(ul, value, inputted_list, li_class)
|
|||
new_li.className = li_class;
|
||||
|
||||
const new_span = document.createElement("span");
|
||||
new_span.className = "tag_object";
|
||||
new_span.className = "tag_card";
|
||||
new_span.innerHTML = value;
|
||||
|
||||
const new_delbutton = document.createElement("button")
|
||||
|
@ -465,11 +465,11 @@ function remove_searchtag(ul, value, inputted_list)
|
|||
//console.log(lis);
|
||||
for (const li of lis)
|
||||
{
|
||||
const tag_object = li.children[0];
|
||||
if (! tag_object.classList.contains("tag_object"))
|
||||
const tag_card = li.children[0];
|
||||
if (! tag_card.classList.contains("tag_card"))
|
||||
{continue}
|
||||
|
||||
const tagname = tag_object.innerHTML;
|
||||
const tagname = tag_card.innerHTML;
|
||||
if (tagname != value)
|
||||
{continue}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<!--
|
||||
tag: The Tag object
|
||||
extra_classes:
|
||||
Space-separated string, if you want more than "tag_object".
|
||||
Space-separated string, if you want more than "tag_card".
|
||||
innertext:
|
||||
A string to use as the innertext.
|
||||
Otherwise, will use the name based on the other parameters.
|
||||
|
@ -15,7 +15,7 @@
|
|||
with_alt_description:
|
||||
True: Include the description in the alt text
|
||||
-->
|
||||
{%- macro tag_object(
|
||||
{%- macro create_tag_card(
|
||||
tag,
|
||||
extra_classes="",
|
||||
innertext=None,
|
||||
|
@ -34,7 +34,7 @@
|
|||
None: None,
|
||||
}.get(link, link)
|
||||
-%}
|
||||
{%- set class = ("tag_object" + " " + extra_classes).strip() -%}
|
||||
{%- set class = ("tag_card" + " " + extra_classes).strip() -%}
|
||||
{%- set title = (with_alt_description and tag.description) or None -%}
|
||||
{%- set innertext = innertext_safe or (innertext or tag.name)|e -%}
|
||||
{%- set element = "a" if (link or onclick) else "span" -%}
|
|
@ -2,7 +2,7 @@
|
|||
<html>
|
||||
<head>
|
||||
{% import "header.html" as header %}
|
||||
{% import "tag_object.html" as tag_object %}
|
||||
{% import "tag_card.html" as tag_card %}
|
||||
{% if specific_tag is none %}
|
||||
<title>Tags</title>
|
||||
{% else %}
|
||||
|
@ -95,7 +95,7 @@ h2, h3
|
|||
{% if specific_tag %}
|
||||
<div id="hierarchy_self" class="panel">
|
||||
<div id="tag_metadata">
|
||||
<h2>{{tag_object.tag_object(
|
||||
<h2>{{tag_card.create_tag_card(
|
||||
specific_tag,
|
||||
link="search",
|
||||
id="name_text",
|
||||
|
@ -129,9 +129,9 @@ h2, h3
|
|||
<ul id="parent_list">
|
||||
{% for ancestor in specific_tag.get_parents() %}
|
||||
<li>
|
||||
{{tag_object.tag_object(ancestor, link="search_musts", innertext="(+)")}}
|
||||
{{tag_object.tag_object(ancestor, link="search_forbids", innertext="(x)")}}
|
||||
{{tag_object.tag_object(ancestor, link="info", innertext=ancestor.name, with_alt_description=True)}}
|
||||
{{tag_card.create_tag_card(ancestor, link="search_musts", innertext="(+)")}}
|
||||
{{tag_card.create_tag_card(ancestor, link="search_forbids", innertext="(x)")}}
|
||||
{{tag_card.create_tag_card(ancestor, link="info", innertext=ancestor.name, with_alt_description=True)}}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
@ -148,9 +148,9 @@ h2, h3
|
|||
<ul id="tag_list">
|
||||
{% for (qualified_name, tag) in tags %}
|
||||
<li>
|
||||
{{tag_object.tag_object(tag, link="search_musts", innertext="(+)")}}
|
||||
{{tag_object.tag_object(tag, link="search_forbids", innertext="(x)")}}
|
||||
{{tag_object.tag_object(tag, link="info", innertext=qualified_name, with_alt_description=True)-}}
|
||||
{{tag_card.create_tag_card(tag, link="search_musts", innertext="(+)")}}
|
||||
{{tag_card.create_tag_card(tag, link="search_forbids", innertext="(x)")}}
|
||||
{{tag_card.create_tag_card(tag, link="info", innertext=qualified_name, with_alt_description=True)-}}
|
||||
{% if specific_tag or '.' in qualified_name -%}
|
||||
<button
|
||||
class="remove_tag_button red_button button_with_confirm"
|
||||
|
@ -181,9 +181,9 @@ h2, h3
|
|||
{% if include_synonyms %}
|
||||
{% for synonym in tag.get_synonyms()|sort %}
|
||||
<li>
|
||||
{{-tag_object.tag_object(tag, link="search_musts", innertext="(+)")}}
|
||||
{{tag_object.tag_object(tag, link="search_forbids", innertext="(x)")}}
|
||||
{{tag_object.tag_object(tag, link='info', innertext=qualified_name + '+' + synonym)-}}
|
||||
{{-tag_card.create_tag_card(tag, link="search_musts", innertext="(+)")}}
|
||||
{{tag_card.create_tag_card(tag, link="search_forbids", innertext="(x)")}}
|
||||
{{tag_card.create_tag_card(tag, link='info', innertext=qualified_name + '+' + synonym)-}}
|
||||
<button
|
||||
class="remove_tag_button red_button button_with_confirm"
|
||||
data-holder-class="confirm_holder_remove_synonym"
|
||||
|
@ -216,11 +216,11 @@ h2, h3
|
|||
<ul>
|
||||
{% for synonym in synonyms %}
|
||||
<li>
|
||||
{{tag_object.tag_object(specific_tag, link="search_musts", innertext="(+)")}}
|
||||
{{tag_card.create_tag_card(specific_tag, link="search_musts", innertext="(+)")}}
|
||||
|
||||
{{tag_object.tag_object(specific_tag, link="search_forbids", innertext="(x)")}}
|
||||
{{tag_card.create_tag_card(specific_tag, link="search_forbids", innertext="(x)")}}
|
||||
|
||||
{{tag_object.tag_object(specific_tag, link=none, innertext=synonym)-}}
|
||||
{{tag_card.create_tag_card(specific_tag, link=none, innertext=synonym)-}}
|
||||
<button
|
||||
class="remove_tag_button red_button button_with_confirm"
|
||||
data-onclick="return remove_specific_synonym_form(event);"
|
||||
|
@ -319,10 +319,10 @@ function add_synonym_form(event)
|
|||
api.tags.add_synonym(SPECIFIC_TAG, syn_name, callback);
|
||||
}
|
||||
|
||||
function tag_object_from_li(li)
|
||||
function tag_card_from_li(li)
|
||||
{
|
||||
const tag_objects = li.getElementsByClassName("tag_object");
|
||||
return tag_objects[tag_objects.length - 1];
|
||||
const tag_cards = li.getElementsByClassName("tag_card");
|
||||
return tag_cards[tag_cards.length - 1];
|
||||
}
|
||||
|
||||
function easybake_form()
|
||||
|
@ -349,8 +349,8 @@ function delete_specific_tag_form(event)
|
|||
{
|
||||
const delete_button = event.target;
|
||||
const hierarchy_self = delete_button.closest("#hierarchy_self");
|
||||
const tag_object = tag_object_from_li(hierarchy_self);
|
||||
const tag_name = tag_object.innerText;
|
||||
const tag_card = tag_card_from_li(hierarchy_self);
|
||||
const tag_name = tag_card.innerText;
|
||||
return api.tags.delete(tag_name, api.tags.callback_go_to_tags);
|
||||
}
|
||||
|
||||
|
@ -358,8 +358,8 @@ function delete_tag_form(event)
|
|||
{
|
||||
const delete_button = event.target;
|
||||
const li = delete_button.closest("li");
|
||||
const tag_object = tag_object_from_li(li);
|
||||
const tag_name = tag_object.innerText.split(".").pop();
|
||||
const tag_card = tag_card_from_li(li);
|
||||
const tag_name = tag_card.innerText.split(".").pop();
|
||||
return api.tags.delete(tag_name, tag_action_callback);
|
||||
}
|
||||
|
||||
|
@ -367,8 +367,8 @@ function remove_child_form(event)
|
|||
{
|
||||
const delete_button = event.target;
|
||||
const li = delete_button.closest("li");
|
||||
const tag_object = tag_object_from_li(li);
|
||||
const qual_name = tag_object.innerText;
|
||||
const tag_card = tag_card_from_li(li);
|
||||
const qual_name = tag_card.innerText;
|
||||
let tag_name;
|
||||
let parent_name;
|
||||
if (qual_name.indexOf(".") != -1)
|
||||
|
@ -389,8 +389,8 @@ function remove_specific_synonym_form(event)
|
|||
{
|
||||
const delete_button = event.target;
|
||||
const li = delete_button.closest("li");
|
||||
const tag_object = tag_object_from_li(li);
|
||||
const synonym = tag_object.innerText;
|
||||
const tag_card = tag_card_from_li(li);
|
||||
const synonym = tag_card.innerText;
|
||||
return api.tags.remove_synonym(SPECIFIC_TAG, synonym, tag_action_callback);
|
||||
}
|
||||
|
||||
|
@ -398,8 +398,8 @@ function remove_synonym_form(event)
|
|||
{
|
||||
const delete_button = event.target;
|
||||
const li = delete_button.closest("li");
|
||||
const tag_object = tag_object_from_li(li);
|
||||
const parts = tag_object.innerText.split(".").pop().split("+");
|
||||
const tag_card = tag_card_from_li(li);
|
||||
const parts = tag_card.innerText.split(".").pop().split("+");
|
||||
const synonym = parts.pop();
|
||||
const tag_name = parts.pop();
|
||||
return api.tags.remove_synonym(tag_name, synonym, tag_action_callback);
|
||||
|
|
Loading…
Reference in a new issue