mirror of
https://github.com/aquatix/digimarks.git
synced 2025-12-06 20:55:10 +01:00
Tables, template reflowing, docstrings, better index page
This commit is contained in:
@@ -135,6 +135,14 @@ def clean_tags(tags_list: list) -> list:
|
||||
return tags_res
|
||||
|
||||
|
||||
def list_tags_for_bookmarks(bookmarks: list) -> list:
|
||||
"""Generate a unique list of the tags from the list of bookmarks."""
|
||||
tags = []
|
||||
for bookmark in bookmarks:
|
||||
tags += bookmark.tags_list
|
||||
return clean_tags(tags)
|
||||
|
||||
|
||||
def file_type(filename: str) -> str:
|
||||
"""Try to determine the file type for the file in `filename`.
|
||||
|
||||
@@ -392,7 +400,7 @@ def list_bookmarks(
|
||||
offset: int = 0,
|
||||
limit: Annotated[int, Query(le=10000)] = 100,
|
||||
) -> list[Bookmark]:
|
||||
"""List all bookmarks in the database. By default gives back 100 items."""
|
||||
"""List all bookmarks in the database. By default 100 items are returned."""
|
||||
bookmarks = session.exec(
|
||||
select(Bookmark)
|
||||
.where(Bookmark.userkey == user_key, Bookmark.status != Visibility.DELETED)
|
||||
@@ -567,10 +575,7 @@ def list_tags_for_user(
|
||||
) -> list[str]:
|
||||
"""List all tags in use by the user."""
|
||||
bookmarks = session.exec(select(Bookmark).where(Bookmark.userkey == user_key)).all()
|
||||
tags = []
|
||||
for bookmark in bookmarks:
|
||||
tags += bookmark.tags_list
|
||||
return clean_tags(tags)
|
||||
return list_tags_for_bookmarks(bookmarks)
|
||||
|
||||
|
||||
@app.get('/{user_key}', response_class=HTMLResponse)
|
||||
@@ -579,6 +584,7 @@ def page_user_landing(
|
||||
request: Request,
|
||||
user_key: str,
|
||||
):
|
||||
"""HTML page with the main view for the user."""
|
||||
user = session.exec(select(User).where(User.key == user_key)).first()
|
||||
if not user:
|
||||
raise HTTPException(status_code=404, detail='User not found')
|
||||
@@ -588,3 +594,42 @@ def page_user_landing(
|
||||
name='user_index.html',
|
||||
context={'language': language, 'version': DIGIMARKS_VERSION, 'user_key': user_key},
|
||||
)
|
||||
|
||||
|
||||
# def tags_page(userkey):
|
||||
# """Overview of all tags used by user"""
|
||||
# tags = get_cached_tags(userkey)
|
||||
# alltags = []
|
||||
# for tag in tags:
|
||||
# try:
|
||||
# publictag = PublicTag.get(PublicTag.userkey == userkey, PublicTag.tag == tag)
|
||||
# except PublicTag.DoesNotExist:
|
||||
# publictag = None
|
||||
#
|
||||
# total = (
|
||||
# Bookmark.select()
|
||||
# .where(Bookmark.userkey == userkey, Bookmark.tags.contains(tag), Bookmark.status == Bookmark.VISIBLE)
|
||||
# .count()
|
||||
# )
|
||||
# alltags.append({'tag': tag, 'publictag': publictag, 'total': total})
|
||||
# totaltags = len(alltags)
|
||||
# totalbookmarks = Bookmark.select().where(Bookmark.userkey == userkey, Bookmark.status == Bookmark.VISIBLE).count()
|
||||
# totalpublic = PublicTag.select().where(PublicTag.userkey == userkey).count()
|
||||
# totalstarred = Bookmark.select().where(Bookmark.userkey == userkey, Bookmark.starred).count()
|
||||
# totaldeleted = Bookmark.select().where(Bookmark.userkey == userkey, Bookmark.status == Bookmark.DELETED).count()
|
||||
# totalnotes = Bookmark.select().where(Bookmark.userkey == userkey, Bookmark.note != '').count()
|
||||
# totalhttperrorstatus = Bookmark.select().where(Bookmark.userkey == userkey, Bookmark.http_status != 200).count()
|
||||
# theme = get_theme(userkey)
|
||||
# return render_template(
|
||||
# 'tags.html',
|
||||
# tags=alltags,
|
||||
# totaltags=totaltags,
|
||||
# totalpublic=totalpublic,
|
||||
# totalbookmarks=totalbookmarks,
|
||||
# totaldeleted=totaldeleted,
|
||||
# totalstarred=totalstarred,
|
||||
# totalhttperrorstatus=totalhttperrorstatus,
|
||||
# totalnotes=totalnotes,
|
||||
# userkey=userkey,
|
||||
# theme=theme,
|
||||
# )
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* digimarks styling
|
||||
*
|
||||
* Overrides on the digui styling
|
||||
* Overrides on and additions to the digui styling
|
||||
*/
|
||||
|
||||
/* Star, error, note etc */
|
||||
@@ -12,4 +12,14 @@
|
||||
|
||||
.star {
|
||||
color: #ffeb3b;
|
||||
}
|
||||
|
||||
.thumbnail {
|
||||
/*width: 80px;*/
|
||||
width: 66;
|
||||
}
|
||||
|
||||
.thumbnail img {
|
||||
/*width: 72px;*/
|
||||
width: 60px;
|
||||
}
|
||||
@@ -200,7 +200,7 @@ h1 {
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
a, a:hover, a:visited, a:active {
|
||||
a, a:hover, a:visited, a:active, a.button, a.button:hover, a.button:active, a.button:visited {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
@@ -230,9 +230,7 @@ ol li::marker, ul li::marker {
|
||||
|
||||
/* Buttons */
|
||||
|
||||
button, input, select, textarea {
|
||||
border: var(--border-width) solid var(--border-color);
|
||||
border-radius: var(--border-radius);
|
||||
button, .button, input, select, textarea {
|
||||
box-sizing: border-box;
|
||||
color: var(--text-color-secondary);
|
||||
background-color: var(--button-color);
|
||||
@@ -241,7 +239,6 @@ button, input, select, textarea {
|
||||
font-size: 13px;
|
||||
/*line-height: 29px;*/
|
||||
/*padding: 0 10px 0 11px;*/
|
||||
padding: .5rem .5rem;
|
||||
position: relative;
|
||||
text-align: left;
|
||||
text-decoration: none;
|
||||
@@ -251,14 +248,20 @@ button, input, select, textarea {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
button, .button, input, select, textarea, table {
|
||||
border: var(--border-width) solid var(--border-color);
|
||||
border-radius: var(--border-radius);
|
||||
padding: .5rem .5rem;
|
||||
}
|
||||
|
||||
button:hover, .button:hover {
|
||||
/*background-color: #f7fafa;*/
|
||||
/*background-color: #d57803;*/
|
||||
background-color: var(--color-highlight);
|
||||
filter: brightness(80%);
|
||||
}
|
||||
|
||||
button:focus {
|
||||
button:focus, .button:focus {
|
||||
/*border-color: #008296;*/
|
||||
/*box-shadow: rgba(213, 217, 217, .5) 0 2px 5px 0;*/
|
||||
outline: 0;
|
||||
@@ -292,6 +295,16 @@ button:focus {
|
||||
filter: brightness(80%);
|
||||
}
|
||||
|
||||
/* Table */
|
||||
|
||||
th {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
th, td {
|
||||
padding: 0 0.3rem;
|
||||
}
|
||||
|
||||
/* Cards */
|
||||
|
||||
.cards {
|
||||
@@ -311,14 +324,18 @@ button:focus {
|
||||
|
||||
[data-theme='nebula'] .card,
|
||||
[data-theme='nebula'] button,
|
||||
[data-theme='nebula'] .button,
|
||||
[data-theme='nebula'] input,
|
||||
[data-theme='nebula'] select,
|
||||
[data-theme='nebula'] textarea,
|
||||
[data-theme='nebula'] table,
|
||||
[data-theme='nebula-dark'] .card,
|
||||
[data-theme='nebula-dark'] button,
|
||||
[data-theme='nebula-dark'] .button,
|
||||
[data-theme='nebula-dark'] input,
|
||||
[data-theme='nebula-dark'] select,
|
||||
[data-theme='nebula-dark'] textarea {
|
||||
[data-theme='nebula-dark'] textarea,
|
||||
[data-theme='nebula-dark'] table {
|
||||
box-shadow: var(--shadow-color) 0 2px 5px 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}404: Page not found{% endblock %}
|
||||
{% block pageheader %}404: Page not found{% endblock %}
|
||||
{% block pagecontent %}
|
||||
The page you requested was not found.
|
||||
{% block page_header %}404: Page not found{% endblock %}
|
||||
{% block page_content %}
|
||||
The page you requested was not found.
|
||||
{% endblock %}
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
{% block pagecontent %}
|
||||
{% block page_content %}
|
||||
<div id="container" x-data="">
|
||||
|
||||
|
||||
|
||||
@@ -1,113 +1,127 @@
|
||||
{% extends "base.html" %}
|
||||
{% if not action %}
|
||||
{% set action = 'Bookmarks' %}
|
||||
{% set action = 'Bookmarks' %}
|
||||
{% endif %}
|
||||
{% block title %}{{ action }}{% endblock %}
|
||||
{% block pageheader %}{{ action }}{% endblock %}
|
||||
{% block pagecontent %}
|
||||
{% block page_header %}{{ action }}{% endblock %}
|
||||
{% block page_content %}
|
||||
|
||||
{% if tag and not publictag %}
|
||||
<div class="row">
|
||||
<div class="col s12">
|
||||
<a href="{{ url_for('addpublictag', userkey=userkey, tag=tag) }}">Create public page <i class="material-icons right">tag</i></a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if tag and not publictag %}
|
||||
<div class="row">
|
||||
<div class="col s12">
|
||||
<a href="{{ url_for('addpublictag', userkey=userkey, tag=tag) }}">Create public page <i
|
||||
class="material-icons right">tag</i></a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if tag and publictag %}
|
||||
<div class="row">
|
||||
<div class="col s12"><a href="{{ url_for('publictag_page', tagkey=publictag.tagkey) }}">Public link</a></div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if tag and publictag %}
|
||||
<div class="row">
|
||||
<div class="col s12"><a href="{{ url_for('publictag_page', tagkey=publictag.tagkey) }}">Public link</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if message %}
|
||||
<div class="row">
|
||||
<div class="col s12">
|
||||
<div class="card-panel {{ theme.MESSAGE_BACKGROUND }}">
|
||||
{% if message %}
|
||||
<div class="row">
|
||||
<div class="col s12">
|
||||
<div class="card-panel {{ theme.MESSAGE_BACKGROUND }}">
|
||||
<span class="{{ theme.MESSAGE_TEXT }}">
|
||||
{{ message|safe }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="row">
|
||||
<form action="{{ url_for('bookmarks_page', userkey=userkey) }}" name="filterForm" method="POST"
|
||||
autocomplete="off">
|
||||
<div class="input-field col l9 m9 s8">
|
||||
<input placeholder="search text" type="text" name="filter_text" id="filter_text" class="autocomplete"
|
||||
value="{{ filter_text }}" autocomplete="false"/>
|
||||
</div>
|
||||
|
||||
<div class="input-field col l3 m3 s4">
|
||||
<p class="right-align">
|
||||
<button class="btn waves-effect waves-light" type="submit" name="submitBtn" title="Find"><i
|
||||
class="material-icons">search</i></button>
|
||||
{% if show_as and show_as == 'list' %}
|
||||
<a href="{{ url_for('bookmarks_page', userkey=userkey, filtermethod=filtermethod, sortmethod=sortmethod, show_as=None) }}"
|
||||
class="waves-effect waves-light btn" title="Show as cards"><i class="material-icons">apps</i></a>
|
||||
{% else %}
|
||||
<a href="{{ url_for('bookmarks_page', userkey=userkey, filtermethod=filtermethod, sortmethod=sortmethod, show_as='list') }}"
|
||||
class="waves-effect waves-light btn" title="Show as list"><i
|
||||
class="material-icons">reorder</i></a>
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="row">
|
||||
<form action="{{ url_for('bookmarks_page', userkey=userkey) }}" name="filterForm" method="POST" autocomplete="off">
|
||||
<div class="input-field col l9 m9 s8">
|
||||
<input placeholder="search text" type="text" name="filter_text" id="filter_text" class="autocomplete" value="{{ filter_text }}" autocomplete="false" />
|
||||
{% if tags %}
|
||||
<div class="row">
|
||||
<div class="col s12">
|
||||
<ul class="collapsible" data-collapsible="expandable">
|
||||
<li>
|
||||
<div class="collapsible-header"><i class="material-icons">label</i>Filter on
|
||||
star/problem/comment/tag
|
||||
</div>
|
||||
<div class="collapsible-body" style="padding: 10px;">
|
||||
<div class="chip">
|
||||
<a href="{{ url_for('bookmarks_page', userkey=userkey, filtermethod='starred') }}"><i
|
||||
class="tiny material-icons {{ theme.STAR }}">star</i></a>
|
||||
</div>
|
||||
<div class="chip">
|
||||
<a href="{{ url_for('bookmarks_page', userkey=userkey, filtermethod='broken') }}"><i
|
||||
class="tiny material-icons {{ theme.PROBLEM }}">report_problem</i></a>
|
||||
</div>
|
||||
<div class="chip">
|
||||
<a href="{{ url_for('bookmarks_page', userkey=userkey, filtermethod='note') }}"><i
|
||||
class="tiny material-icons {{ theme.COMMENT }}">comment</i></a>
|
||||
</div>
|
||||
{% for tag in tags %}
|
||||
<div class="chip">
|
||||
<a href="{{ url_for('tag_page', userkey=userkey, tag=tag) }}">{{ tag }}</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="input-field col l3 m3 s4">
|
||||
<p class="right-align"><button class="btn waves-effect waves-light" type="submit" name="submitBtn" title="Find"><i class="material-icons">search</i></button>
|
||||
{% if show_as and show_as == 'list' %}
|
||||
<a href="{{ url_for('bookmarks_page', userkey=userkey, filtermethod=filtermethod, sortmethod=sortmethod, show_as=None) }}" class="waves-effect waves-light btn" title="Show as cards"><i class="material-icons">apps</i></a>
|
||||
{% else %}
|
||||
<a href="{{ url_for('bookmarks_page', userkey=userkey, filtermethod=filtermethod, sortmethod=sortmethod, show_as='list') }}" class="waves-effect waves-light btn" title="Show as list"><i class="material-icons">reorder</i></a>
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% if show_as and show_as == 'list' %}
|
||||
{% include 'list.html' %}
|
||||
{% else %}
|
||||
{% include 'cards.html' %}
|
||||
{% endif %}
|
||||
|
||||
{% if tags %}
|
||||
<div class="row">
|
||||
<div class="col s12">
|
||||
<ul class="collapsible" data-collapsible="expandable">
|
||||
<li>
|
||||
<div class="collapsible-header"><i class="material-icons">label</i>Filter on star/problem/comment/tag</div>
|
||||
<div class="collapsible-body" style="padding: 10px;">
|
||||
<div class="chip">
|
||||
<a href="{{ url_for('bookmarks_page', userkey=userkey, filtermethod='starred') }}"><i class="tiny material-icons {{ theme.STAR }}">star</i></a>
|
||||
</div>
|
||||
<div class="chip">
|
||||
<a href="{{ url_for('bookmarks_page', userkey=userkey, filtermethod='broken') }}"><i class="tiny material-icons {{ theme.PROBLEM }}">report_problem</i></a>
|
||||
</div>
|
||||
<div class="chip">
|
||||
<a href="{{ url_for('bookmarks_page', userkey=userkey, filtermethod='note') }}"><i class="tiny material-icons {{ theme.COMMENT }}">comment</i></a>
|
||||
</div>
|
||||
{% for tag in tags %}
|
||||
<div class="chip">
|
||||
<a href="{{ url_for('tag_page', userkey=userkey, tag=tag) }}">{{ tag }}</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</li>
|
||||
</ul>
|
||||
<div class="fixed-action-btn" style="bottom: 20px; right: 20px;">
|
||||
<a class="btn-floating btn-large {{ theme.FAB }}" href="{{ url_for('addbookmark', userkey=userkey) }}">
|
||||
<i class="large material-icons">add</i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if show_as and show_as == 'list' %}
|
||||
{% include 'list.html' %}
|
||||
{% else %}
|
||||
{% include 'cards.html' %}
|
||||
{% endif %}
|
||||
|
||||
<div class="fixed-action-btn" style="bottom: 20px; right: 20px;">
|
||||
<a class="btn-floating btn-large {{ theme.FAB }}" href="{{ url_for('addbookmark', userkey=userkey) }}">
|
||||
<i class="large material-icons">add</i>
|
||||
</a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block extrajs %}
|
||||
<script>
|
||||
function submitFilter() {
|
||||
document.filterForm.submit();
|
||||
}
|
||||
/* Search filter autocomplete */
|
||||
var options = {
|
||||
onAutocomplete: submitFilter,
|
||||
minLength: 3,
|
||||
limit: 10,
|
||||
data: {
|
||||
},
|
||||
}
|
||||
var elem = document.querySelector('.autocomplete');
|
||||
var instance = M.Autocomplete.init(elem, options);
|
||||
/* TODO: fetch from API
|
||||
instance.updateData({
|
||||
});
|
||||
*/
|
||||
</script>
|
||||
<script src="{{ url_for('bookmarks_js', userkey=userkey) }}" ></script>
|
||||
<script>
|
||||
function submitFilter() {
|
||||
document.filterForm.submit();
|
||||
}
|
||||
|
||||
/* Search filter autocomplete */
|
||||
var options = {
|
||||
onAutocomplete: submitFilter,
|
||||
minLength: 3,
|
||||
limit: 10,
|
||||
data: {},
|
||||
}
|
||||
var elem = document.querySelector('.autocomplete');
|
||||
var instance = M.Autocomplete.init(elem, options);
|
||||
/* TODO: fetch from API
|
||||
instance.updateData({
|
||||
});
|
||||
*/
|
||||
</script>
|
||||
<script src="{{ url_for('bookmarks_js', userkey=userkey) }}"></script>
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
var elem = document.querySelector('.autocomplete');
|
||||
var instance = M.Autocomplete.getInstance(elem);
|
||||
instance.updateData({
|
||||
{% for bookmark in bookmarks %}
|
||||
{% if bookmark.favicon %}
|
||||
"{{ bookmark.title | replace('"', '\\"') | replace('\n', '') | replace('\r', '') }}": "{{ url_for('static', filename='favicons/' + bookmark.favicon) }}",
|
||||
{% else %}
|
||||
"{{ bookmark.title | replace('"', '\\"') | replace('\n', '') | replace('\r', '') }}": null,
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
});
|
||||
@@ -1,17 +1,30 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}digimarks{% endblock %}
|
||||
{% block pageheader %}digimarks{% endblock %}
|
||||
{% block pagecontent %}
|
||||
<p>Please visit your personal url, or <a href="https://github.com/aquatix/digimarks">see the digimarks project page</a>.</p>
|
||||
{% block page_header %}digimarks{% endblock %}
|
||||
{% block page_content %}
|
||||
<article>
|
||||
|
||||
<div class="row">
|
||||
<div class="col s12">
|
||||
<div class="card-panel orange lighten-2">
|
||||
<span class="black-text">
|
||||
If you forgot/lost your personal url, contact your digimarks administrator.{# On startup, the personal codes are printed to the standard output (so should be findable in a log). Of course, bookmarks.db contains the user information too.#}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<header>
|
||||
<nav class="menu">
|
||||
<ul>
|
||||
<li><h1>digimarks</h1></li>
|
||||
<li>
|
||||
<a class="button" href="https://github.com/aquatix/digimarks">digimarks project page</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<main>
|
||||
<h1>Welcome to digimarks, your online bookmarking and notes tool</h1>
|
||||
|
||||
<p>Please visit your personal url, or <a href="https://github.com/aquatix/digimarks">see the digimarks
|
||||
project page</a>.</p>
|
||||
|
||||
<p>If you forgot/lost your personal url, contact your digimarks
|
||||
administrator.{# On startup, the personal codes are printed to the standard output (so should be findable in a log). Of course, bookmarks.db contains the user information too.#}
|
||||
</p>
|
||||
</main>
|
||||
|
||||
</article>
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,29 +1,30 @@
|
||||
{% extends "base.html" %}
|
||||
{% if not action %}
|
||||
{% set action = 'Bookmarks' %}
|
||||
{% set action = 'Bookmarks' %}
|
||||
{% endif %}
|
||||
{% block title %}{{ action }}{% endblock %}
|
||||
{% block pageheader %}{{ action }}{% endblock %}
|
||||
{% block pagecontent %}
|
||||
{% block page_header %}{{ action }}{% endblock %}
|
||||
{% block page_content %}
|
||||
|
||||
{% if message %}
|
||||
<div class="row">
|
||||
<div class="col s12">
|
||||
<div class="card-panel orange lighten-2">
|
||||
{% if message %}
|
||||
<div class="row">
|
||||
<div class="col s12">
|
||||
<div class="card-panel orange lighten-2">
|
||||
<span class="white-text">
|
||||
{{ message }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col s12">
|
||||
<a href="{{ url_for('publictag_feed', tagkey=tagkey) }}"><i class="material-icons tiny">rss_feed</i>
|
||||
feed</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col s12">
|
||||
<a href="{{ url_for('publictag_feed', tagkey=tagkey) }}"><i class="material-icons tiny">rss_feed</i> feed</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% include 'cards.html' %}
|
||||
{% include 'cards.html' %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,65 +1,68 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Tags{% endblock %}
|
||||
{% block pageheader %}Tags{% endblock %}
|
||||
{% block pagecontent %}
|
||||
<div class="row">
|
||||
{% block page_header %}Tags{% endblock %}
|
||||
{% block page_content %}
|
||||
<div class="row">
|
||||
|
||||
<div class="col s12">
|
||||
<table class="centered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><i class="material-icons" title="Unique labels">label</i></th>
|
||||
<th><i class="material-icons green-text" title="Public tag pages">present_to_all</i></th>
|
||||
<th><i class="material-icons" title="Total bookmarks">turned_in</i></th>
|
||||
<th><i class="material-icons" title="Bookmarks with notes">comment</i></th>
|
||||
<th><i class="material-icons yellow-text" title="Starred bookmarks">star</i></th>
|
||||
<th><i class="material-icons orange-text" title="HTTP status is not 200 OK">warning</i></th>
|
||||
<th><i class="material-icons red-text" title="Deleted bookmarks">delete</i></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ totaltags }}</td>
|
||||
<td>{{ totalpublic }}</td>
|
||||
<td>{{ totalbookmarks }}</td>
|
||||
<td>{{ totalnotes }}</td>
|
||||
<td>{{ totalstarred }}</td>
|
||||
<td>{{ totalhttperrorstatus }}</td>
|
||||
<td>{{ totaldeleted }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="col s12">
|
||||
<table class="centered">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><i class="material-icons" title="Unique labels">label</i></th>
|
||||
<th><i class="material-icons green-text" title="Public tag pages">present_to_all</i></th>
|
||||
<th><i class="material-icons" title="Total bookmarks">turned_in</i></th>
|
||||
<th><i class="material-icons" title="Bookmarks with notes">comment</i></th>
|
||||
<th><i class="material-icons yellow-text" title="Starred bookmarks">star</i></th>
|
||||
<th><i class="material-icons orange-text" title="HTTP status is not 200 OK">warning</i></th>
|
||||
<th><i class="material-icons red-text" title="Deleted bookmarks">delete</i></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ totaltags }}</td>
|
||||
<td>{{ totalpublic }}</td>
|
||||
<td>{{ totalbookmarks }}</td>
|
||||
<td>{{ totalnotes }}</td>
|
||||
<td>{{ totalstarred }}</td>
|
||||
<td>{{ totalhttperrorstatus }}</td>
|
||||
<td>{{ totaldeleted }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<br /><br />
|
||||
<br/><br/>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Tag</th>
|
||||
<th>Public link</th>
|
||||
<th>Number of bookmarks</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for tag in tags %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ url_for('tag_page', userkey=userkey, tag=tag['tag']) }}">{{ tag['tag'] }}</a>
|
||||
</td>
|
||||
<td>
|
||||
{% if tag['publictag'] %}
|
||||
<a href="{{ url_for('publictag_page', tagkey=tag['publictag'].tagkey) }}">Public link</a> (<a href="{{ url_for('removepublictag', tag=tag['tag'], tagkey=tag['publictag'].tagkey, userkey=userkey) }}">Delete</a> <i class="tiny material-icons red-text">warning</i>)
|
||||
{% else %}
|
||||
<a href="{{ url_for('addpublictag', userkey=userkey, tag=tag['tag']) }}">Create</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{{ tag['total'] }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Tag</th>
|
||||
<th>Public link</th>
|
||||
<th>Number of bookmarks</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for tag in tags %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ url_for('tag_page', userkey=userkey, tag=tag['tag']) }}">{{ tag['tag'] }}</a>
|
||||
</td>
|
||||
<td>
|
||||
{% if tag['publictag'] %}
|
||||
<a href="{{ url_for('publictag_page', tagkey=tag['publictag'].tagkey) }}">Public
|
||||
link</a> (
|
||||
<a href="{{ url_for('removepublictag', tag=tag['tag'], tagkey=tag['publictag'].tagkey, userkey=userkey) }}">Delete</a>
|
||||
<i class="tiny material-icons red-text">warning</i>)
|
||||
{% else %}
|
||||
<a href="{{ url_for('addpublictag', userkey=userkey, tag=tag['tag']) }}">Create</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{{ tag['total'] }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Bookmarks{% endblock %}
|
||||
{% block pageheader %}Bookmarks{% endblock %}
|
||||
{% block pagecontent %}
|
||||
{% block page_header %}Bookmarks{% endblock %}
|
||||
{% block page_content %}
|
||||
<article
|
||||
x-init="$store.digimarks.userKey = '{{ user_key }}'; $store.digimarks.loadCache(); $store.digimarks.getBookmarks()"
|
||||
x-data="">
|
||||
@@ -16,7 +16,7 @@
|
||||
</button>
|
||||
</li>
|
||||
<li>
|
||||
<button @click="$store.digimarks.startAddingBookmark">add bookmark</button>
|
||||
<button @click="$store.digimarks.startAddingBookmark()">add bookmark</button>
|
||||
</li>
|
||||
<li>
|
||||
<button @click="$store.digimarks.loopToNextTheme()" class="theme-toggle">theme</button>
|
||||
@@ -50,12 +50,48 @@
|
||||
</button>
|
||||
</p>
|
||||
|
||||
<table x-cloak x-show="$store.digimarks.show_bookmarks_list">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="2"> </th>
|
||||
<th>Title</th>
|
||||
<th>Note</th>
|
||||
<th>Tags</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<template x-for="bookmark in $store.digimarks.filteredBookmarks" :key="bookmark.id">
|
||||
<tr>
|
||||
<td class="thumbnail">
|
||||
<div class="card-thumb" x-show="bookmark.favicon"><img
|
||||
x-bind:src="'/content/favicons/' + bookmark.favicon"></div>
|
||||
</td>
|
||||
<td>
|
||||
<div x-show="bookmark.starred" class="star"><i class="fa-fw fa-solid fa-star"></i>
|
||||
</div>
|
||||
<div x-show="bookmark.http_status !== 200 && bookmark.http_status !== 304"
|
||||
class="error"><i
|
||||
class="fa-fw fa-solid fa-triangle-exclamation"></i>
|
||||
</div>
|
||||
</td>
|
||||
<td><a x-text="bookmark.title" x-bind:href="bookmark.url" target="_blank"></a></td>
|
||||
<td x-text="bookmark.note"></td>
|
||||
<td>
|
||||
<template x-for="tag in bookmark.tag_list">
|
||||
<span x-text="tag" class="chip"></span>
|
||||
</template>
|
||||
</td>
|
||||
</tr>
|
||||
</template>
|
||||
</tbody>
|
||||
</table>
|
||||
{#
|
||||
<ul x-cloak x-show="$store.digimarks.show_bookmarks_list">
|
||||
<template x-for="bookmark in $store.digimarks.filteredBookmarks" :key="bookmark.id">
|
||||
<li><a x-text="bookmark.title" x-bind:href="bookmark.url" target="_blank"></a></li>
|
||||
</template>
|
||||
</ul>
|
||||
|
||||
#}
|
||||
<section x-cloak x-show="$store.digimarks.show_bookmarks_cards" class="cards">
|
||||
<template x-for="bookmark in $store.digimarks.filteredBookmarks" :key="bookmark.id">
|
||||
<div class="card">
|
||||
@@ -65,7 +101,7 @@
|
||||
<div class="statuses">
|
||||
<div x-show="bookmark.starred" class="star"><i class="fa-fw fa-solid fa-star"></i>
|
||||
</div>
|
||||
<div x-show="bookmark.http_status != 200 && bookmark.http_status != 304"
|
||||
<div x-show="bookmark.http_status !== 200 && bookmark.http_status !== 304"
|
||||
class="error"><i
|
||||
class="fa-fw fa-solid fa-triangle-exclamation"></i>
|
||||
</div>
|
||||
@@ -91,11 +127,24 @@
|
||||
x-transition.opacity>
|
||||
<h1>Tags</h1>
|
||||
|
||||
<ul>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Tag</th>
|
||||
<th>Public link</th>
|
||||
<th>Number of bookmarks</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<template x-for="tag in $store.digimarks.filteredTags" :key="tag">
|
||||
<li x-text="tag"></li>
|
||||
<tr>
|
||||
<td x-text="tag"></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</template>
|
||||
</ul>
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
|
||||
<section x-cloak x-show="$store.digimarks.bookmark_to_edit" x-transition.opacity>
|
||||
|
||||
Reference in New Issue
Block a user