summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbnewbold <bnewbold@archive.org>2021-02-26 22:33:52 +0000
committerbnewbold <bnewbold@archive.org>2021-02-26 22:33:52 +0000
commitdf79a3dd9ffae5fcb8f32ea331c49ae4e9d998ed (patch)
tree1b4c4b589a43a36c0a11b578d6f4f96c3129213a
parent67ee012ccc63ffcd98964ab58b2bcc49c5b6693a (diff)
parenta5e9309c148019539127f41d7fefd722d0ae3bf2 (diff)
downloadfatcat-df79a3dd9ffae5fcb8f32ea331c49ae4e9d998ed.tar.gz
fatcat-df79a3dd9ffae5fcb8f32ea331c49ae4e9d998ed.zip
Merge branch 'bnewbold-202102-tweaks' into 'master'
Feb 2021 web UI/UX tweaks See merge request webgroup/fatcat!96
-rw-r--r--README.md24
-rw-r--r--guide/src/bibliography.md6
-rw-r--r--python/fatcat_web/auth.py19
-rw-r--r--python/fatcat_web/editing_routes.py6
-rw-r--r--python/fatcat_web/routes.py20
-rw-r--r--python/fatcat_web/search.py11
-rw-r--r--python/fatcat_web/static/fatcat_oa_preservation_jan2021.svg4
-rw-r--r--python/fatcat_web/static/scholar-vaporwave-logo-small.pngbin0 -> 7789 bytes
-rw-r--r--python/fatcat_web/templates/auth_account.html30
-rw-r--r--python/fatcat_web/templates/base.html17
-rw-r--r--python/fatcat_web/templates/changelog.html14
-rw-r--r--python/fatcat_web/templates/container_edit.html9
-rw-r--r--python/fatcat_web/templates/container_search.html4
-rw-r--r--python/fatcat_web/templates/container_view.html35
-rw-r--r--python/fatcat_web/templates/edit_macros.html15
-rw-r--r--python/fatcat_web/templates/editgroup_reviewable.html2
-rw-r--r--python/fatcat_web/templates/editgroup_view.html189
-rw-r--r--python/fatcat_web/templates/editor_annotations.html12
-rw-r--r--python/fatcat_web/templates/editor_editgroups.html12
-rw-r--r--python/fatcat_web/templates/editor_view.html15
-rw-r--r--python/fatcat_web/templates/entity_delete.html3
-rw-r--r--python/fatcat_web/templates/entity_edit_toml.html7
-rw-r--r--python/fatcat_web/templates/entity_history.html10
-rw-r--r--python/fatcat_web/templates/entity_macros.html73
-rw-r--r--python/fatcat_web/templates/entity_view_metadata.html9
-rw-r--r--python/fatcat_web/templates/file_edit.html9
-rw-r--r--python/fatcat_web/templates/file_view.html35
-rw-r--r--python/fatcat_web/templates/fileset_view.html18
-rw-r--r--python/fatcat_web/templates/home.html69
-rw-r--r--python/fatcat_web/templates/release_edit.html2
-rw-r--r--python/fatcat_web/templates/release_save.html31
-rw-r--r--python/fatcat_web/templates/release_search.html12
-rw-r--r--python/fatcat_web/templates/release_view.html190
-rw-r--r--python/fatcat_web/templates/search_macros.html4
-rw-r--r--python/fatcat_web/templates/webcapture_view.html15
-rw-r--r--python/fatcat_web/web_config.py3
36 files changed, 578 insertions, 356 deletions
diff --git a/README.md b/README.md
index 7131ed8a..919b9a2a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-
+<!--
__ _ _
/ _| __ _| |_ ___ __ _| |_
| |_ / _` | __/ __/ _` | __|
@@ -6,16 +6,22 @@
|_| \__,_|\__\___\__,_|\__|
perpetual access to the scholarly record
+-->
+<div align="center">
+ <img src="python/fatcat_web/static/fatcat.jpg" alt="photo of a cat and cup of coffee, by Quinn Kampschroer [CC-0]">
+</div>
+`fatcat`: Perpetual Access to the Scholarly Record
+==================================================
[![pipeline status](https://gitlab.com/bnewbold/fatcat/badges/master/pipeline.svg)](https://gitlab.com/bnewbold/fatcat/commits/master)
[![coverage report](https://gitlab.com/bnewbold/fatcat/badges/master/coverage.svg)](https://gitlab.com/bnewbold/fatcat/commits/master)
This repository contains source code for **fatcat**, an editable catalog of
-published written works (mostly journal articles), with a focus on tracking the
-location and status of full-text copies to ensure "perpetual access". The
-primary public instance runs at [fatcat.wiki](https://fatcat.wiki). Both the
-software project and primary instance are a project of the [Internet
+published research (mostly journal articles), with a focus on tracking the
+location and status of full-text copies on the public web, to ensure long term
+access. The primary public instance runs at [fatcat.wiki](https://fatcat.wiki).
+Both the software project and primary instance are a project of the [Internet
Archive](https://archive.org).
Some resources for learning more about the aims, goals, and structure of this
@@ -25,7 +31,7 @@ overall project:
* **["How the Internet Archive is Ensuring Permanent Access to Open Access Journal Articles"](https://blog.archive.org/2020/09/15/how-the-internet-archive-is-ensuring-permanent-access-to-open-access-journal-articles/)**: archive.org blog post (September 2020)
* **[guide.fatcat.wiki](https://guide.fatcat.wiki)**: project documentation,
including schema overview, HOWTOs, policies, and more
-* **[Fatcat RFC](./fatcat-rfc.md)**: original project design proposal
+* **[Fatcat "Request for Comment" (RFC)](./fatcat-rfc.md)**: original project design proposal
## Getting Started for Developers
@@ -81,3 +87,9 @@ released, while the API server and web interface are strong copyleft (AGPLv3).
For software developers, the "help wanted" tag in Github Issues is a way to
discover bugs and tasks that external folks could contribute to.
+
+## Thanks!
+
+The "cat with coffee" photo at the top of this README is by <a
+href="http://www.kampschroer.com/photography.html">Quinn Kampschroer</a>,
+released under a CC-0 license (public domain).
diff --git a/guide/src/bibliography.md b/guide/src/bibliography.md
index d38c4b04..27ef5ab6 100644
--- a/guide/src/bibliography.md
+++ b/guide/src/bibliography.md
@@ -52,3 +52,9 @@
<div class="csl-entry" style="margin-bottom: 1em;">“Citation Style Language.” <i>Citation Style Language</i>. Accessed March 11, 2019. https://citationstyles.org/.</div>
<div class="csl-entry">“Open Archives Initiative Protocol for Metadata Harvesting.” Accessed March 11, 2019. https://www.openarchives.org/pmh/.</div>
</div>
+
+<!--
+
+Embargo, Tasini, and “Opted Out”: How Many Journal Articles Are Missing from Full-Text Databases. Xiaotian Chen
+
+-->
diff --git a/python/fatcat_web/auth.py b/python/fatcat_web/auth.py
index ed9f2252..74b8e2d6 100644
--- a/python/fatcat_web/auth.py
+++ b/python/fatcat_web/auth.py
@@ -40,7 +40,11 @@ def handle_token_login(token):
session['api_token'] = token
session['editor'] = editor.to_dict()
login_user(load_user(editor.editor_id))
- return redirect("/auth/account")
+ rp = "/auth/account"
+ if session.get('next'):
+ rp = session['next']
+ session.pop('next')
+ return redirect(rp)
# This will need to login/signup via fatcatd API, then set token in session
def handle_oauth(remote, token, user_info):
@@ -71,13 +75,6 @@ def handle_oauth(remote, token, user_info):
editor = resp.editor
api_token = resp.token
- if http_status == 201:
- flash("Welcome to Fatcat! An account has been created for you with a temporary username; you may wish to change it under account settings")
- flash("You must use the same mechanism ({}) to login in the future".format(remote.name))
- flash("Check out 'The Guide' (linked above) for an editing quickstart tutorial")
- else:
- flash("Welcome back {}!".format(editor.username))
-
# write token and username to session
session.permanent = True
session['api_token'] = api_token
@@ -85,7 +82,11 @@ def handle_oauth(remote, token, user_info):
# call login_user(load_user(editor_id))
login_user(load_user(editor.editor_id))
- return redirect("/auth/account")
+ rp = "/auth/account"
+ if session.get('next'):
+ rp = session['next']
+ session.pop('next')
+ return redirect(rp)
# XXX: what should this actually be?
raise Exception("didn't receive OAuth user_info")
diff --git a/python/fatcat_web/editing_routes.py b/python/fatcat_web/editing_routes.py
index 8e3b03b0..61aade72 100644
--- a/python/fatcat_web/editing_routes.py
+++ b/python/fatcat_web/editing_routes.py
@@ -137,11 +137,7 @@ def form_editgroup_get_or_create(api, edit_form):
except ApiException as ae:
app.log.warning(ae)
raise ae
- # set this session editgroup_id
- flash('Started new editgroup <a href="/editgroup/{}">{}</a>'.format(
- eg.editgroup_id,
- eg.editgroup_id,
- ))
+ # set this session editgroup_id (TODO)
return eg
def generic_entity_edit(editgroup_id, entity_type, existing_ident, edit_template):
diff --git a/python/fatcat_web/routes.py b/python/fatcat_web/routes.py
index 02b5258a..7cf1f854 100644
--- a/python/fatcat_web/routes.py
+++ b/python/fatcat_web/routes.py
@@ -3,7 +3,7 @@ import os
import json
import citeproc_styles
from flask import render_template, make_response, send_from_directory, \
- request, url_for, abort, redirect, jsonify, session, flash, Response
+ request, url_for, abort, redirect, jsonify, session, Response
from flask_login import login_required
from flask_wtf.csrf import CSRFError
@@ -685,7 +685,7 @@ def generic_search():
if len(query.split()) != 1:
# multi-term? must be a real search
- return redirect(url_for('release_search', q=query))
+ return redirect(url_for('release_search', q=query, generic=1))
if clean_doi(query):
return redirect(url_for('release_lookup', doi=clean_doi(query)))
@@ -704,7 +704,7 @@ def generic_search():
if clean_orcid(query):
return redirect(url_for('creator_lookup', orcid=clean_orcid(query)))
- return redirect(url_for('release_search', q=query))
+ return redirect(url_for('release_search', q=query, generic=1))
@app.route('/release/search', methods=['GET', 'POST'])
def release_search():
@@ -712,12 +712,21 @@ def release_search():
if 'q' not in request.args.keys():
return render_template('release_search.html', query=ReleaseQuery(), found=None)
+ container_found = None
+ if request.args.get('generic'):
+ container_query = GenericQuery.from_args(request.args)
+ container_query.limit = 1
+ try:
+ container_found = do_container_search(container_query)
+ except Exception:
+ pass
+
query = ReleaseQuery.from_args(request.args)
try:
found = do_release_search(query)
except FatcatSearchError as fse:
return render_template('release_search.html', query=query, es_error=fse), fse.status_code
- return render_template('release_search.html', query=query, found=found)
+ return render_template('release_search.html', query=query, found=found, container_found=container_found)
@app.route('/container/search', methods=['GET', 'POST'])
def container_search():
@@ -986,7 +995,7 @@ def health_json():
def login():
# show the user a list of login options
if not priv_api:
- flash("This web interface not configured with credentials to actually allow login (other than via token)")
+ app.log.warn("This web interface not configured with credentials to actually allow login (other than via token)")
return render_template('auth_login.html')
@app.route('/auth/ia/login', methods=['GET', 'POST'])
@@ -1026,7 +1035,6 @@ def change_username():
# update our session
session['editor'] = editor.to_dict()
load_user(editor.editor_id)
- flash("Username updated successfully")
return redirect('/auth/account')
@app.route('/auth/create_token', methods=['POST'])
diff --git a/python/fatcat_web/search.py b/python/fatcat_web/search.py
index 755b303a..6a419fa8 100644
--- a/python/fatcat_web/search.py
+++ b/python/fatcat_web/search.py
@@ -738,11 +738,12 @@ def get_elastic_container_preservation_by_volume(container_id: str) -> List[dict
buckets = resp.aggregations.volume_preservation.buckets
volume_nums = set([int(h['key']['volume']) for h in buckets if h['key']['volume'].isdigit()])
volume_dicts = dict()
- for num in range(min(volume_nums), max(volume_nums)+1):
- volume_dicts[num] = dict(volume=num, bright=0, dark=0, shadows_only=0, none=0)
- for row in buckets:
- if row['key']['volume'].isdigit():
- volume_dicts[int(row['key']['volume'])][row['key']['preservation']] = int(row['doc_count'])
+ if volume_nums:
+ for num in range(min(volume_nums), max(volume_nums)+1):
+ volume_dicts[num] = dict(volume=num, bright=0, dark=0, shadows_only=0, none=0)
+ for row in buckets:
+ if row['key']['volume'].isdigit():
+ volume_dicts[int(row['key']['volume'])][row['key']['preservation']] = int(row['doc_count'])
if app.config['FATCAT_MERGE_SHADOW_PRESERVATION']:
for k in volume_dicts.keys():
volume_dicts[k]['none'] += volume_dicts[k]['shadows_only']
diff --git a/python/fatcat_web/static/fatcat_oa_preservation_jan2021.svg b/python/fatcat_web/static/fatcat_oa_preservation_jan2021.svg
new file mode 100644
index 00000000..730a5efa
--- /dev/null
+++ b/python/fatcat_web/static/fatcat_oa_preservation_jan2021.svg
@@ -0,0 +1,4 @@
+<?xml version='1.0' encoding='utf-8'?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533" class="pygal-chart" viewBox="0 0 1000 500"><!--Generated with pygal 2.4.0 (lxml) ©Kozea 2012-2016 on 2021-02-26--><!--http://pygal.org--><!--http://github.com/Kozea/pygal--><defs><style type="text/css">#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533{-webkit-user-select:none;-webkit-font-smoothing:antialiased;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .title{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:16px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .legends .legend text{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:14px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis text{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:10px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis text.major{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:10px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .text-overlay text.value{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:16px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .text-overlay text.label{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:10px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:14px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 text.no_data{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:64px}
+#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533{background-color:transparent}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 path,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 rect,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 circle{-webkit-transition:150ms;-moz-transition:150ms;transition:150ms}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .graph &gt; .background{fill:transparent}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .plot &gt; .background{fill:rgba(240,240,240,0.7)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .graph{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 text.no_data{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .title{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .legends .legend text{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .legends .legend:hover text{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis .line{stroke:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis .guide.line{stroke:rgba(0,0,0,0.5)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis .major.line{stroke:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis text.major{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.y .guides:hover .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .line-graph .axis.x .guides:hover .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .stackedline-graph .axis.x .guides:hover .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .xy-graph .axis.x .guides:hover .guide.line{stroke:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis .guides:hover text{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .reactive{fill-opacity:.7;stroke-opacity:.8}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .ci{stroke:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .reactive.active,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .active .reactive{fill-opacity:.8;stroke-opacity:.9;stroke-width:4}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .ci .reactive.active{stroke-width:1.5}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .series text{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip rect{fill:rgba(240,240,240,0.7);stroke:rgba(0,0,0,0.9);-webkit-transition:opacity 150ms;-moz-transition:opacity 150ms;transition:opacity 150ms}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip .label{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip .label{fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip .legend{font-size:.8em;fill:rgba(0,0,0,0.5)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip .x_label{font-size:.6em;fill:rgba(0,0,0,0.9)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip .xlink{font-size:.5em;text-decoration:underline}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip .value{font-size:1.5em}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .bound{font-size:.5em}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .max-value{font-size:.75em;fill:rgba(0,0,0,0.5)}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .map-element{fill:rgba(240,240,240,0.7);stroke:rgba(0,0,0,0.5) !important}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .map-element .reactive{fill-opacity:inherit;stroke-opacity:inherit}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .color-0,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .color-0 a:visited{stroke:red;fill:red}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .color-1,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .color-1 a:visited{stroke:darkolivegreen;fill:darkolivegreen}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .color-2,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .color-2 a:visited{stroke:limegreen;fill:limegreen}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .text-overlay .color-0 text{fill:white}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .text-overlay .color-1 text{fill:white}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .text-overlay .color-2 text{fill:white}
+#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 text.no_data{text-anchor:middle}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .guide.line{fill:none}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .centered{text-anchor:middle}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .title{text-anchor:middle}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .legends .legend text{fill-opacity:1}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.x text{text-anchor:middle}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.x:not(.web) text[transform]{text-anchor:start}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.x:not(.web) text[transform].backwards{text-anchor:end}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.y text{text-anchor:end}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.y text[transform].backwards{text-anchor:start}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.y2 text{text-anchor:start}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.y2 text[transform].backwards{text-anchor:end}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis .guide.line{stroke-dasharray:4,4}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis .major.guide.line{stroke-dasharray:6,6}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .horizontal .axis.y .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .horizontal .axis.y2 .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .vertical .axis.x .guide.line{opacity:0}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .horizontal .axis.always_show .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .vertical .axis.always_show .guide.line{opacity:1 !important}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.y .guides:hover .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.y2 .guides:hover .guide.line,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis.x .guides:hover .guide.line{opacity:1}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .axis .guides:hover text{opacity:1}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .nofill{fill:none}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .subtle-fill{fill-opacity:.2}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .dot{stroke-width:1px;fill-opacity:1}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .dot.active{stroke-width:5px}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .dot.negative{fill:transparent}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 text,#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 tspan{stroke:none !important}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .series text.active{opacity:1}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip rect{fill-opacity:.95;stroke-width:.5}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .tooltip text{fill-opacity:1}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .showable{visibility:hidden}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .showable.shown{visibility:visible}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .gauge-background{fill:rgba(229,229,229,1);stroke:none}#chart-95b0cbdb-ae89-4e10-b430-cd66abb0b533 .bg-lines{stroke:transparent;stroke-width:2px}</style><script type="text/javascript">window.pygal = window.pygal || {};window.pygal.config = window.pygal.config || {};window.pygal.config['95b0cbdb-ae89-4e10-b430-cd66abb0b533'] = {"allow_interruptions": false, "box_mode": "extremes", "classes": ["pygal-chart"], "css": ["file://style.css", "file://graph.css"], "defs": [], "disable_xml_declaration": false, "dots_size": 2.5, "dynamic_print_values": true, "explicit_size": false, "fill": false, "force_uri_protocol": "https", "formatter": null, "half_pie": false, "height": 500, "include_x_axis": false, "inner_radius": 0, "interpolate": null, "interpolation_parameters": {}, "interpolation_precision": 250, "inverse_y_axis": false, "js": ["//kozea.github.io/pygal.js/2.0.x/pygal-tooltips.min.js"], "legend_at_bottom": false, "legend_at_bottom_columns": null, "legend_box_size": 12, "logarithmic": false, "margin": 20, "margin_bottom": null, "margin_left": null, "margin_right": null, "margin_top": null, "max_scale": 16, "min_scale": 4, "missing_value_fill_truncation": "x", "no_data_text": "No data", "no_prefix": false, "order_min": null, "pretty_print": false, "print_labels": false, "print_values": false, "print_values_position": "center", "print_zeroes": true, "range": null, "rounded_bars": null, "secondary_range": null, "show_dots": true, "show_legend": true, "show_minor_x_labels": false, "show_minor_y_labels": true, "show_only_major_dots": false, "show_x_guides": false, "show_x_labels": true, "show_y_guides": true, "show_y_labels": true, "spacing": 10, "stack_from_top": false, "strict": false, "stroke": true, "stroke_style": null, "style": {"background": "transparent", "ci_colors": [], "colors": ["red", "darkolivegreen", "limegreen"], "font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "foreground": "rgba(0, 0, 0, 0.9)", "foreground_strong": "rgba(0, 0, 0, 0.9)", "foreground_subtle": "rgba(0, 0, 0, 0.5)", "guide_stroke_dasharray": "4,4", "label_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "label_font_size": 10, "legend_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "legend_font_size": 14, "major_guide_stroke_dasharray": "6,6", "major_label_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "major_label_font_size": 10, "no_data_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "no_data_font_size": 64, "opacity": ".7", "opacity_hover": ".8", "plot_background": "rgba(240, 240, 240, 0.7)", "stroke_opacity": ".8", "stroke_opacity_hover": ".9", "title_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "title_font_size": 16, "tooltip_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "tooltip_font_size": 14, "transition": "150ms", "value_background": "rgba(229, 229, 229, 1)", "value_colors": [], "value_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "value_font_size": 16, "value_label_font_family": "Consolas, \"Liberation Mono\", Menlo, Courier, monospace", "value_label_font_size": 10}, "title": null, "tooltip_border_radius": 0, "tooltip_fancy_mode": true, "truncate_label": null, "truncate_legend": null, "width": 1000, "x_label_rotation": 20, "x_labels": ["1996", "1997", "1998", "1999", "2000", "2001", "2002", "2003", "2004", "2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017", "2018", "2019"], "x_labels_major": null, "x_labels_major_count": 24, "x_labels_major_every": null, "x_title": "Year", "xrange": null, "y_label_rotation": 0, "y_labels": null, "y_labels_major": null, "y_labels_major_count": null, "y_labels_major_every": null, "y_title": null, "zero": 0, "legends": ["None", "Dark", "Bright"]}</script><script type="text/javascript" xlink:href="https://kozea.github.io/pygal.js/2.0.x/pygal-tooltips.min.js"/></defs><title>Pygal</title><g class="graph stackedbar-graph vertical"><rect x="0" y="0" width="1000" height="500" class="background"/><g transform="translate(144, 20)" class="plot"><rect x="0" y="0" width="833.0473771011382" height="414" class="background"/><g class="axis y always_show"><g class="guides"><path d="M0.000000 406.038462 h833.047377" class="axis major line"/><text x="-5" y="409.53846153846155" class="major">0</text><title>0</title></g><g class="guides"><path d="M0.000000 362.135283 h833.047377" class="guide line"/><text x="-5" y="365.63528319013477" class="">200000</text><title>200000</title></g><g class="guides"><path d="M0.000000 318.232105 h833.047377" class="guide line"/><text x="-5" y="321.73210484180794" class="">400000</text><title>400000</title></g><g class="guides"><path d="M0.000000 274.328926 h833.047377" class="guide line"/><text x="-5" y="277.82892649348116" class="">600000</text><title>600000</title></g><g class="guides"><path d="M0.000000 230.425748 h833.047377" class="guide line"/><text x="-5" y="233.92574814515436" class="">800000</text><title>800000</title></g><g class="guides"><path d="M0.000000 186.522570 h833.047377" class="major guide line"/><text x="-5" y="190.02256979682755" class="major">1000000</text><title>1000000</title></g><g class="guides"><path d="M0.000000 142.619391 h833.047377" class="guide line"/><text x="-5" y="146.11939144850072" class="">1200000</text><title>1200000</title></g><g class="guides"><path d="M0.000000 98.716213 h833.047377" class="guide line"/><text x="-5" y="102.21621310017395" class="">1400000</text><title>1400000</title></g><g class="guides"><path d="M0.000000 54.813035 h833.047377" class="guide line"/><text x="-5" y="58.31303475184717" class="">1600000</text><title>1600000</title></g><g class="guides"><path d="M0.000000 10.909856 h833.047377" class="guide line"/><text x="-5" y="14.409856403520337" class="">1800000</text><title>1800000</title></g></g><g class="axis x"><path d="M0.000000 0.000000 v414.000000" class="line"/><g class="guides"><path d="M32.707790 0.000000 v414.000000" class="major guide line"/><text x="32.707789645797895" y="429.0" class="major" transform="rotate(20 32.707790 429.000000)">1996</text></g><g class="guides"><path d="M66.083085 0.000000 v414.000000" class="major guide line"/><text x="66.08308520273452" y="429.0" class="major" transform="rotate(20 66.083085 429.000000)">1997</text></g><g class="guides"><path d="M99.458381 0.000000 v414.000000" class="major guide line"/><text x="99.45838075967116" y="429.0" class="major" transform="rotate(20 99.458381 429.000000)">1998</text></g><g class="guides"><path d="M132.833676 0.000000 v414.000000" class="major guide line"/><text x="132.83367631660778" y="429.0" class="major" transform="rotate(20 132.833676 429.000000)">1999</text></g><g class="guides"><path d="M166.208972 0.000000 v414.000000" class="major guide line"/><text x="166.20897187354439" y="429.0" class="major" transform="rotate(20 166.208972 429.000000)">2000</text></g><g class="guides"><path d="M199.584267 0.000000 v414.000000" class="major guide line"/><text x="199.584267430481" y="429.0" class="major" transform="rotate(20 199.584267 429.000000)">2001</text></g><g class="guides"><path d="M232.959563 0.000000 v414.000000" class="major guide line"/><text x="232.95956298741766" y="429.0" class="major" transform="rotate(20 232.959563 429.000000)">2002</text></g><g class="guides"><path d="M266.334859 0.000000 v414.000000" class="major guide line"/><text x="266.3348585443543" y="429.0" class="major" transform="rotate(20 266.334859 429.000000)">2003</text></g><g class="guides"><path d="M299.710154 0.000000 v414.000000" class="major guide line"/><text x="299.7101541012909" y="429.0" class="major" transform="rotate(20 299.710154 429.000000)">2004</text></g><g class="guides"><path d="M333.085450 0.000000 v414.000000" class="major guide line"/><text x="333.0854496582275" y="429.0" class="major" transform="rotate(20 333.085450 429.000000)">2005</text></g><g class="guides"><path d="M366.460745 0.000000 v414.000000" class="major guide line"/><text x="366.46074521516414" y="429.0" class="major" transform="rotate(20 366.460745 429.000000)">2006</text></g><g class="guides"><path d="M399.836041 0.000000 v414.000000" class="major guide line"/><text x="399.83604077210083" y="429.0" class="major" transform="rotate(20 399.836041 429.000000)">2007</text></g><g class="guides"><path d="M433.211336 0.000000 v414.000000" class="major guide line"/><text x="433.21133632903747" y="429.0" class="major" transform="rotate(20 433.211336 429.000000)">2008</text></g><g class="guides"><path d="M466.586632 0.000000 v414.000000" class="major guide line"/><text x="466.58663188597404" y="429.0" class="major" transform="rotate(20 466.586632 429.000000)">2009</text></g><g class="guides"><path d="M499.961927 0.000000 v414.000000" class="major guide line"/><text x="499.9619274429107" y="429.0" class="major" transform="rotate(20 499.961927 429.000000)">2010</text></g><g class="guides"><path d="M533.337223 0.000000 v414.000000" class="major guide line"/><text x="533.3372229998473" y="429.0" class="major" transform="rotate(20 533.337223 429.000000)">2011</text></g><g class="guides"><path d="M566.712519 0.000000 v414.000000" class="major guide line"/><text x="566.712518556784" y="429.0" class="major" transform="rotate(20 566.712519 429.000000)">2012</text></g><g class="guides"><path d="M600.087814 0.000000 v414.000000" class="major guide line"/><text x="600.0878141137205" y="429.0" class="major" transform="rotate(20 600.087814 429.000000)">2013</text></g><g class="guides"><path d="M633.463110 0.000000 v414.000000" class="major guide line"/><text x="633.4631096706572" y="429.0" class="major" transform="rotate(20 633.463110 429.000000)">2014</text></g><g class="guides"><path d="M666.838405 0.000000 v414.000000" class="major guide line"/><text x="666.8384052275937" y="429.0" class="major" transform="rotate(20 666.838405 429.000000)">2015</text></g><g class="guides"><path d="M700.213701 0.000000 v414.000000" class="major guide line"/><text x="700.2137007845304" y="429.0" class="major" transform="rotate(20 700.213701 429.000000)">2016</text></g><g class="guides"><path d="M733.588996 0.000000 v414.000000" class="major guide line"/><text x="733.5889963414671" y="429.0" class="major" transform="rotate(20 733.588996 429.000000)">2017</text></g><g class="guides"><path d="M766.964292 0.000000 v414.000000" class="major guide line"/><text x="766.9642918984036" y="429.0" class="major" transform="rotate(20 766.964292 429.000000)">2018</text></g><g class="guides"><path d="M800.339587 0.000000 v414.000000" class="major guide line"/><text x="800.3395874553403" y="429.0" class="major" transform="rotate(20 800.339587 429.000000)">2019</text></g></g><g class="series serie-0 color-0"><g class="bars"><g class="bar"><rect x="18.02265960074578" y="401.74165747351077" rx="0" ry="0" width="29.37026009010423" height="4.296804064950777" class="rect reactive tooltip-trigger"/><desc class="value">19574</desc><desc class="x centered">32.707789645797895</desc><desc class="y centered">403.8900595059862</desc><desc class="x_label">1996</desc></g><g class="bar"><rect x="51.3979551576824" y="401.3256748586604" rx="0" ry="0" width="29.37026009010423" height="4.712786679801127" class="rect reactive tooltip-trigger"/><desc class="value">21469</desc><desc class="x centered">66.08308520273451</desc><desc class="y centered">403.68206819856096</desc><desc class="x_label">1997</desc></g><g class="bar"><rect x="84.77325071461902" y="401.24006366088116" rx="0" ry="0" width="29.37026009010423" height="4.798397877580385" class="rect reactive tooltip-trigger"/><desc class="value">21859</desc><desc class="x centered">99.45838075967114</desc><desc class="y centered">403.6392625996714</desc><desc class="x_label">1998</desc></g><g class="bar"><rect x="118.14854627155565" y="400.8232029824638" rx="0" ry="0" width="29.37026009010423" height="5.215258555997764" class="rect reactive tooltip-trigger"/><desc class="value">23758</desc><desc class="x centered">132.83367631660775</desc><desc class="y centered">403.4308322604627</desc><desc class="x_label">1999</desc></g><g class="bar"><rect x="151.52384182849227" y="400.15543563978576" rx="0" ry="0" width="29.37026009010423" height="5.883025898675783" class="rect reactive tooltip-trigger"/><desc class="value">26800</desc><desc class="x centered">166.20897187354439</desc><desc class="y centered">403.09694858912366</desc><desc class="x_label">2000</desc></g><g class="bar"><rect x="184.8991373854289" y="399.78050249669104" rx="0" ry="0" width="29.37026009010423" height="6.257959041770505" class="rect reactive tooltip-trigger"/><desc class="value">28508</desc><desc class="x centered">199.58426743048102</desc><desc class="y centered">402.9094820175763</desc><desc class="x_label">2001</desc></g><g class="bar"><rect x="218.27443294236554" y="399.4659362238253" rx="0" ry="0" width="29.37026009010423" height="6.572525314636266" class="rect reactive tooltip-trigger"/><desc class="value">29941</desc><desc class="x centered">232.95956298741766</desc><desc class="y centered">402.7521988811434</desc><desc class="x_label">2002</desc></g><g class="bar"><rect x="251.64972849930217" y="398.5874336250753" rx="0" ry="0" width="29.37026009010423" height="7.45102791338627" class="rect reactive tooltip-trigger"/><desc class="value">33943</desc><desc class="x centered">266.3348585443543</desc><desc class="y centered">402.3129475817684</desc><desc class="x_label">2003</desc></g><g class="bar"><rect x="285.0250240562388" y="398.2482815723344" rx="0" ry="0" width="29.37026009010423" height="7.790179966127141" class="rect reactive tooltip-trigger"/><desc class="value">35488</desc><desc class="x centered">299.7101541012909</desc><desc class="y centered">402.14337155539795</desc><desc class="x_label">2004</desc></g><g class="bar"><rect x="318.40031961317544" y="397.38887685616595" rx="0" ry="0" width="29.37026009010423" height="8.649584682295597" class="rect reactive tooltip-trigger"/><desc class="value">39403</desc><desc class="x centered">333.08544965822756</desc><desc class="y centered">401.7136691973137</desc><desc class="x_label">2005</desc></g><g class="bar"><rect x="351.7756151701121" y="396.5415455140432" rx="0" ry="0" width="29.37026009010423" height="9.49691602441834" class="rect reactive tooltip-trigger"/><desc class="value">43263</desc><desc class="x centered">366.4607452151642</desc><desc class="y centered">401.29000352625235</desc><desc class="x_label">2006</desc></g><g class="bar"><rect x="385.15091072704865" y="395.62682279315584" rx="0" ry="0" width="29.37026009010423" height="10.411638745305709" class="rect reactive tooltip-trigger"/><desc class="value">47430</desc><desc class="x centered">399.8360407721008</desc><desc class="y centered">400.8326421658087</desc><desc class="x_label">2007</desc></g><g class="bar"><rect x="418.5262062839853" y="394.43155876262267" rx="0" ry="0" width="29.37026009010423" height="11.606902775838876" class="rect reactive tooltip-trigger"/><desc class="value">52875</desc><desc class="x centered">433.2113363290374</desc><desc class="y centered">400.2350101505421</desc><desc class="x_label">2008</desc></g><g class="bar"><rect x="451.90150184092187" y="393.97518522369177" rx="0" ry="0" width="29.37026009010423" height="12.06327631476978" class="rect reactive tooltip-trigger"/><desc class="value">54954</desc><desc class="x centered">466.586631885974</desc><desc class="y centered">400.00682338107663</desc><desc class="x_label">2009</desc></g><g class="bar"><rect x="485.27679739785856" y="391.48214324118203" rx="0" ry="0" width="29.37026009010423" height="14.556318297279518" class="rect reactive tooltip-trigger"/><desc class="value">66311</desc><desc class="x centered">499.9619274429107</desc><desc class="y centered">398.7603023898218</desc><desc class="x_label">2010</desc></g><g class="bar"><rect x="518.6520929547952" y="391.5286806102313" rx="0" ry="0" width="29.37026009010423" height="14.50978092823027" class="rect reactive tooltip-trigger"/><desc class="value">66099</desc><desc class="x centered">533.3372229998473</desc><desc class="y centered">398.7835710743464</desc><desc class="x_label">2011</desc></g><g class="bar"><rect x="552.0273885117317" y="389.1462746371593" rx="0" ry="0" width="29.37026009010423" height="16.89218690130224" class="rect reactive tooltip-trigger"/><desc class="value">76952</desc><desc class="x centered">566.7125185567838</desc><desc class="y centered">397.5923680878104</desc><desc class="x_label">2012</desc></g><g class="bar"><rect x="585.4026840686685" y="389.791431842988" rx="0" ry="0" width="29.37026009010423" height="16.247029695473543" class="rect reactive tooltip-trigger"/><desc class="value">74013</desc><desc class="x centered">600.0878141137206</desc><desc class="y centered">397.9149466907248</desc><desc class="x_label">2013</desc></g><g class="bar"><rect x="618.7779796256051" y="355.0791643659917" rx="0" ry="0" width="29.37026009010423" height="50.95929717246986" class="rect reactive tooltip-trigger"/><desc class="value">232144</desc><desc class="x centered">633.4631096706572</desc><desc class="y centered">380.5588129522266</desc><desc class="x_label">2014</desc></g><g class="bar"><rect x="652.1532751825416" y="376.8478968023343" rx="0" ry="0" width="29.37026009010423" height="29.19056473612727" class="rect reactive tooltip-trigger"/><desc class="value">132977</desc><desc class="x centered">666.8384052275937</desc><desc class="y centered">391.4431791703979</desc><desc class="x_label">2015</desc></g><g class="bar"><rect x="685.5285707394784" y="376.42115790878853" rx="0" ry="0" width="29.37026009010423" height="29.617303629673017" class="rect reactive tooltip-trigger"/><desc class="value">134921</desc><desc class="x centered">700.2137007845305</desc><desc class="y centered">391.22980972362507</desc><desc class="x_label">2016</desc></g><g class="bar"><rect x="718.9038662964149" y="371.9074721427971" rx="0" ry="0" width="29.37026009010423" height="34.13098939566447" class="rect reactive tooltip-trigger"/><desc class="value">155483</desc><desc class="x centered">733.588996341467</desc><desc class="y centered">388.9729668406293</desc><desc class="x_label">2017</desc></g><g class="bar"><rect x="752.2791618533515" y="366.5734554893671" rx="0" ry="0" width="29.37026009010423" height="39.46500604909443" class="rect reactive tooltip-trigger"/><desc class="value">179782</desc><desc class="x centered">766.9642918984036</desc><desc class="y centered">386.30595851391433</desc><desc class="x_label">2018</desc></g><g class="bar"><rect x="785.6544574102882" y="360.5971353367011" rx="0" ry="0" width="29.37026009010423" height="45.44132620176043" class="rect reactive tooltip-trigger"/><desc class="value">207007</desc><desc class="x centered">800.3395874553403</desc><desc class="y centered">383.31779843758136</desc><desc class="x_label">2019</desc></g></g></g><g class="series serie-1 color-1"><g class="bars"><g class="bar"><rect x="18.02265960074578" y="391.5495346199467" rx="0" ry="0" width="29.37026009010423" height="10.192122853564058" class="rect reactive tooltip-trigger"/><desc class="value">46430</desc><desc class="x centered">32.707789645797895</desc><desc class="y centered">396.64559604672877</desc><desc class="x_label">1996</desc></g><g class="bar"><rect x="51.3979551576824" y="391.1381618388229" rx="0" ry="0" width="29.37026009010423" height="10.187513019837525" class="rect reactive tooltip-trigger"/><desc class="value">46409</desc><desc class="x centered">66.08308520273451</desc><desc class="y centered">396.23191834874166</desc><desc class="x_label">1997</desc></g><g class="bar"><rect x="84.77325071461902" y="390.4978339826126" rx="0" ry="0" width="29.37026009010423" height="10.742229678268586" class="rect reactive tooltip-trigger"/><desc class="value">48936</desc><desc class="x centered">99.45838075967114</desc><desc class="y centered">395.86894882174687</desc><desc class="x_label">1998</desc></g><g class="bar"><rect x="118.14854627155565" y="390.44119888254323" rx="0" ry="0" width="29.37026009010423" height="10.38200409992055" class="rect reactive tooltip-trigger"/><desc class="value">47295</desc><desc class="x centered">132.83367631660775</desc><desc class="y centered">395.6322009325035</desc><desc class="x_label">1999</desc></g><g class="bar"><rect x="151.52384182849227" y="389.1203717619338" rx="0" ry="0" width="29.37026009010423" height="11.03506387785194" class="rect reactive tooltip-trigger"/><desc class="value">50270</desc><desc class="x centered">166.20897187354439</desc><desc class="y centered">394.6379037008598</desc><desc class="x_label">2000</desc></g><g class="bar"><rect x="184.8991373854289" y="389.1162009599907" rx="0" ry="0" width="29.37026009010423" height="10.66430153670035" class="rect reactive tooltip-trigger"/><desc class="value">48581</desc><desc class="x centered">199.58426743048102</desc><desc class="y centered">394.44835172834087</desc><desc class="x_label">2001</desc></g><g class="bar"><rect x="218.27443294236554" y="388.5197762821287" rx="0" ry="0" width="29.37026009010423" height="10.946159941696578" class="rect reactive tooltip-trigger"/><desc class="value">49865</desc><desc class="x centered">232.95956298741766</desc><desc class="y centered">393.992856252977</desc><desc class="x_label">2002</desc></g><g class="bar"><rect x="251.64972849930217" y="387.4037574885142" rx="0" ry="0" width="29.37026009010423" height="11.183676136561076" class="rect reactive tooltip-trigger"/><desc class="value">50947</desc><desc class="x centered">266.3348585443543</desc><desc class="y centered">392.99559555679474</desc><desc class="x_label">2003</desc></g><g class="bar"><rect x="285.0250240562388" y="386.2793970910136" rx="0" ry="0" width="29.37026009010423" height="11.9688844813208" class="rect reactive tooltip-trigger"/><desc class="value">54524</desc><desc class="x centered">299.7101541012909</desc><desc class="y centered">392.26383933167403</desc><desc class="x_label">2004</desc></g><g class="bar"><rect x="318.40031961317544" y="385.0272784445193" rx="0" ry="0" width="29.37026009010423" height="12.36159841164664" class="rect reactive tooltip-trigger"/><desc class="value">56313</desc><desc class="x centered">333.08544965822756</desc><desc class="y centered">391.2080776503426</desc><desc class="x_label">2005</desc></g><g class="bar"><rect x="351.7756151701121" y="384.18697161093235" rx="0" ry="0" width="29.37026009010423" height="12.354573903110861" class="rect reactive tooltip-trigger"/><desc class="value">56281</desc><desc class="x centered">366.4607452151642</desc><desc class="y centered">390.36425856248775</desc><desc class="x_label">2006</desc></g><g class="bar"><rect x="385.15091072704865" y="380.47298223855563" rx="0" ry="0" width="29.37026009010423" height="15.153840554600208" class="rect reactive tooltip-trigger"/><desc class="value">69033</desc><desc class="x centered">399.8360407721008</desc><desc class="y centered">388.0499025158557</desc><desc class="x_label">2007</desc></g><g class="bar"><rect x="418.5262062839853" y="379.07686116707885" rx="0" ry="0" width="29.37026009010423" height="15.354697595543826" class="rect reactive tooltip-trigger"/><desc class="value">69948</desc><desc class="x centered">433.2113363290374</desc><desc class="y centered">386.75420996485076</desc><desc class="x_label">2008</desc></g><g class="bar"><rect x="451.90150184092187" y="376.42752386964906" rx="0" ry="0" width="29.37026009010423" height="17.547661354042702" class="rect reactive tooltip-trigger"/><desc class="value">79938</desc><desc class="x centered">466.586631885974</desc><desc class="y centered">385.2013545466704</desc><desc class="x_label">2009</desc></g><g class="bar"><rect x="485.27679739785856" y="371.6510775812428" rx="0" ry="0" width="29.37026009010423" height="19.831065659939213" class="rect reactive tooltip-trigger"/><desc class="value">90340</desc><desc class="x centered">499.9619274429107</desc><desc class="y centered">381.5666104112124</desc><desc class="x_label">2010</desc></g><g class="bar"><rect x="518.6520929547952" y="372.15464703689815" rx="0" ry="0" width="29.37026009010423" height="19.374033573333122" class="rect reactive tooltip-trigger"/><desc class="value">88258</desc><desc class="x centered">533.3372229998473</desc><desc class="y centered">381.8416638235647</desc><desc class="x_label">2011</desc></g><g class="bar"><rect x="552.0273885117317" y="367.9711131720861" rx="0" ry="0" width="29.37026009010423" height="21.175161465073188" class="rect reactive tooltip-trigger"/><desc class="value">96463</desc><desc class="x centered">566.7125185567838</desc><desc class="y centered">378.5586939046227</desc><desc class="x_label">2012</desc></g><g class="bar"><rect x="585.4026840686685" y="363.1160801944364" rx="0" ry="0" width="29.37026009010423" height="26.67535164855161" class="rect reactive tooltip-trigger"/><desc class="value">121519</desc><desc class="x centered">600.0878141137206</desc><desc class="y centered">376.45375601871217</desc><desc class="x_label">2013</desc></g><g class="bar"><rect x="618.7779796256051" y="325.63220506831016" rx="0" ry="0" width="29.37026009010423" height="29.44695929768153" class="rect reactive tooltip-trigger"/><desc class="value">134145</desc><desc class="x centered">633.4631096706572</desc><desc class="y centered">340.3556847171509</desc><desc class="x_label">2014</desc></g><g class="bar"><rect x="652.1532751825416" y="344.4866445258909" rx="0" ry="0" width="29.37026009010423" height="32.361252276443395" class="rect reactive tooltip-trigger"/><desc class="value">147421</desc><desc class="x centered">666.8384052275937</desc><desc class="y centered">360.6672706641126</desc><desc class="x_label">2015</desc></g><g class="bar"><rect x="685.5285707394784" y="340.7454351829382" rx="0" ry="0" width="29.37026009010423" height="35.675722725850335" class="rect reactive tooltip-trigger"/><desc class="value">162520</desc><desc class="x centered">700.2137007845305</desc><desc class="y centered">358.5832965458634</desc><desc class="x_label">2016</desc></g><g class="bar"><rect x="718.9038662964149" y="328.8966258944" rx="0" ry="0" width="29.37026009010423" height="43.01084624839706" class="rect reactive tooltip-trigger"/><desc class="value">195935</desc><desc class="x centered">733.588996341467</desc><desc class="y centered">350.4020490185985</desc><desc class="x_label">2017</desc></g><g class="bar"><rect x="752.2791618533515" y="315.41198418060316" rx="0" ry="0" width="29.37026009010423" height="51.161471308763964" class="rect reactive tooltip-trigger"/><desc class="value">233065</desc><desc class="x centered">766.9642918984036</desc><desc class="y centered">340.9927198349851</desc><desc class="x_label">2018</desc></g><g class="bar"><rect x="785.6544574102882" y="293.32670982836913" rx="0" ry="0" width="29.37026009010423" height="67.27042550833198" class="rect reactive tooltip-trigger"/><desc class="value">306449</desc><desc class="x centered">800.3395874553403</desc><desc class="y centered">326.9619225825351</desc><desc class="x_label">2019</desc></g></g></g><g class="series serie-2 color-2"><g class="bars"><g class="bar"><rect x="18.02265960074578" y="380.74891371447484" rx="0" ry="0" width="29.37026009010423" height="10.800620905471874" class="rect reactive tooltip-trigger"/><desc class="value">49202</desc><desc class="x centered">32.707789645797895</desc><desc class="y centered">386.1492241672108</desc><desc class="x_label">1996</desc></g><g class="bar"><rect x="51.3979551576824" y="379.34949990462195" rx="0" ry="0" width="29.37026009010423" height="11.788661934200945" class="rect reactive tooltip-trigger"/><desc class="value">53703</desc><desc class="x centered">66.08308520273451</desc><desc class="y centered">385.2438308717224</desc><desc class="x_label">1997</desc></g><g class="bar"><rect x="84.77325071461902" y="377.6721789758241" rx="0" ry="0" width="29.37026009010423" height="12.825655006788452" class="rect reactive tooltip-trigger"/><desc class="value">58427</desc><desc class="x centered">99.45838075967114</desc><desc class="y centered">384.08500647921835</desc><desc class="x_label">1998</desc></g><g class="bar"><rect x="118.14854627155565" y="376.17332446701226" rx="0" ry="0" width="29.37026009010423" height="14.267874415530969" class="rect reactive tooltip-trigger"/><desc class="value">64997</desc><desc class="x centered">132.83367631660775</desc><desc class="y centered">383.30726167477775</desc><desc class="x_label">1999</desc></g><g class="bar"><rect x="151.52384182849227" y="372.6408747371059" rx="0" ry="0" width="29.37026009010423" height="16.479497024827936" class="rect reactive tooltip-trigger"/><desc class="value">75072</desc><desc class="x centered">166.20897187354439</desc><desc class="y centered">380.8806232495199</desc><desc class="x_label">2000</desc></g><g class="bar"><rect x="184.8991373854289" y="369.9548782857552" rx="0" ry="0" width="29.37026009010423" height="19.161322674235464" class="rect reactive tooltip-trigger"/><desc class="value">87289</desc><desc class="x centered">199.58426743048102</desc><desc class="y centered">379.535539622873</desc><desc class="x_label">2001</desc></g><g class="bar"><rect x="218.27443294236554" y="367.13936745827704" rx="0" ry="0" width="29.37026009010423" height="21.380408823851667" class="rect reactive tooltip-trigger"/><desc class="value">97398</desc><desc class="x centered">232.95956298741766</desc><desc class="y centered">377.82957187020287</desc><desc class="x_label">2002</desc></g><g class="bar"><rect x="251.64972849930217" y="362.87241755460315" rx="0" ry="0" width="29.37026009010423" height="24.531339933911056" class="rect reactive tooltip-trigger"/><desc class="value">111752</desc><desc class="x centered">266.3348585443543</desc><desc class="y centered">375.13808752155865</desc><desc class="x_label">2003</desc></g><g class="bar"><rect x="285.0250240562388" y="357.68437896918135" rx="0" ry="0" width="29.37026009010423" height="28.595018121832254" class="rect reactive tooltip-trigger"/><desc class="value">130264</desc><desc class="x centered">299.7101541012909</desc><desc class="y centered">371.9818880300975</desc><desc class="x_label">2004</desc></g><g class="bar"><rect x="318.40031961317544" y="352.2985565653004" rx="0" ry="0" width="29.37026009010423" height="32.72872187921894" class="rect reactive tooltip-trigger"/><desc class="value">149095</desc><desc class="x centered">333.08544965822756</desc><desc class="y centered">368.66291750490984</desc><desc class="x_label">2005</desc></g><g class="bar"><rect x="351.7756151701121" y="345.51793018529304" rx="0" ry="0" width="29.37026009010423" height="38.66904142563931" class="rect reactive tooltip-trigger"/><desc class="value">176156</desc><desc class="x centered">366.4607452151642</desc><desc class="y centered">364.8524508981127</desc><desc class="x_label">2006</desc></g><g class="bar"><rect x="385.15091072704865" y="334.7851396903693" rx="0" ry="0" width="29.37026009010423" height="45.687842548186325" class="rect reactive tooltip-trigger"/><desc class="value">208130</desc><desc class="x centered">399.8360407721008</desc><desc class="y centered">357.6290609644625</desc><desc class="x_label">2007</desc></g><g class="bar"><rect x="418.5262062839853" y="310.766369363675" rx="0" ry="0" width="29.37026009010423" height="68.31049180340386" class="rect reactive tooltip-trigger"/><desc class="value">311187</desc><desc class="x centered">433.2113363290374</desc><desc class="y centered">344.9216152653769</desc><desc class="x_label">2008</desc></g><g class="bar"><rect x="451.90150184092187" y="293.19082949138107" rx="0" ry="0" width="29.37026009010423" height="83.236694378268" class="rect reactive tooltip-trigger"/><desc class="value">379183</desc><desc class="x centered">466.586631885974</desc><desc class="y centered">334.80917668051507</desc><desc class="x_label">2009</desc></g><g class="bar"><rect x="485.27679739785856" y="274.90361909806074" rx="0" ry="0" width="29.37026009010423" height="96.74745848318207" class="rect reactive tooltip-trigger"/><desc class="value">440731</desc><desc class="x centered">499.9619274429107</desc><desc class="y centered">323.2773483396518</desc><desc class="x_label">2010</desc></g><g class="bar"><rect x="518.6520929547952" y="257.1287587960654" rx="0" ry="0" width="29.37026009010423" height="115.02588824083273" class="rect reactive tooltip-trigger"/><desc class="value">523998</desc><desc class="x centered">533.3372229998473</desc><desc class="y centered">314.6417029164818</desc><desc class="x_label">2011</desc></g><g class="bar"><rect x="552.0273885117317" y="228.2062229637547" rx="0" ry="0" width="29.37026009010423" height="139.76489020833142" class="rect reactive tooltip-trigger"/><desc class="value">636696</desc><desc class="x centered">566.7125185567838</desc><desc class="y centered">298.0886680679204</desc><desc class="x_label">2012</desc></g><g class="bar"><rect x="585.4026840686685" y="198.62865171048693" rx="0" ry="0" width="29.37026009010423" height="164.48742848394946" class="rect reactive tooltip-trigger"/><desc class="value">749319</desc><desc class="x centered">600.0878141137206</desc><desc class="y centered">280.8723659524617</desc><desc class="x_label">2013</desc></g><g class="bar"><rect x="618.7779796256051" y="135.33321996981243" rx="0" ry="0" width="29.37026009010423" height="190.29898509849772" class="rect reactive tooltip-trigger"/><desc class="value">866903</desc><desc class="x centered">633.4631096706572</desc><desc class="y centered">230.4827125190613</desc><desc class="x_label">2014</desc></g><g class="bar"><rect x="652.1532751825416" y="126.96944497856441" rx="0" ry="0" width="29.37026009010423" height="217.51719954732647" class="rect reactive tooltip-trigger"/><desc class="value">990895</desc><desc class="x centered">666.8384052275937</desc><desc class="y centered">235.72804475222765</desc><desc class="x_label">2015</desc></g><g class="bar"><rect x="685.5285707394784" y="100.97964145992194" rx="0" ry="0" width="29.37026009010423" height="239.76579372301626" class="rect reactive tooltip-trigger"/><desc class="value">1092248</desc><desc class="x centered">700.2137007845305</desc><desc class="y centered">220.86253832143007</desc><desc class="x_label">2016</desc></g><g class="bar"><rect x="718.9038662964149" y="70.62256927507963" rx="0" ry="0" width="29.37026009010423" height="258.2740566193204" class="rect reactive tooltip-trigger"/><desc class="value">1176562</desc><desc class="x centered">733.588996341467</desc><desc class="y centered">199.75959758473982</desc><desc class="x_label">2017</desc></g><g class="bar"><rect x="752.2791618533515" y="48.72981035990301" rx="0" ry="0" width="29.37026009010423" height="266.68217382070014" class="rect reactive tooltip-trigger"/><desc class="value">1214865</desc><desc class="x centered">766.9642918984036</desc><desc class="y centered">182.07089727025308</desc><desc class="x_label">2018</desc></g><g class="bar"><rect x="785.6544574102882" y="7.961538461538453" rx="0" ry="0" width="29.37026009010423" height="285.3651713668307" class="rect reactive tooltip-trigger"/><desc class="value">1299975</desc><desc class="x centered">800.3395874553403</desc><desc class="y centered">150.6441241449538</desc><desc class="x_label">2019</desc></g></g></g></g><g class="titles"><text x="560.9236885505691" y="480" class="title">Year</text></g><g transform="translate(144, 20)" class="plot overlay"><g class="series serie-0 color-0"/><g class="series serie-1 color-1"/><g class="series serie-2 color-2"/></g><g transform="translate(144, 20)" class="plot text-overlay"><g class="series serie-0 color-0"><text text-anchor="middle" x="32.707789645797895" y="409.2233928393195" class="value showable">19574</text><text text-anchor="middle" x="66.08308520273451" y="409.01540153189427" class="value showable">21469</text><text text-anchor="middle" x="99.45838075967114" y="408.9725959330047" class="value showable">21859</text><text text-anchor="middle" x="132.83367631660775" y="408.764165593796" class="value showable">23758</text><text text-anchor="middle" x="166.20897187354439" y="408.43028192245697" class="value showable">26800</text><text text-anchor="middle" x="199.58426743048102" y="408.2428153509096" class="value showable">28508</text><text text-anchor="middle" x="232.95956298741766" y="408.0855322144767" class="value showable">29941</text><text text-anchor="middle" x="266.3348585443543" y="407.6462809151017" class="value showable">33943</text><text text-anchor="middle" x="299.7101541012909" y="407.47670488873126" class="value showable">35488</text><text text-anchor="middle" x="333.08544965822756" y="407.04700253064703" class="value showable">39403</text><text text-anchor="middle" x="366.4607452151642" y="406.62333685958566" class="value showable">43263</text><text text-anchor="middle" x="399.8360407721008" y="406.165975499142" class="value showable">47430</text><text text-anchor="middle" x="433.2113363290374" y="405.5683434838754" class="value showable">52875</text><text text-anchor="middle" x="466.586631885974" y="405.34015671440994" class="value showable">54954</text><text text-anchor="middle" x="499.9619274429107" y="404.0936357231551" class="value showable">66311</text><text text-anchor="middle" x="533.3372229998473" y="404.1169044076797" class="value showable">66099</text><text text-anchor="middle" x="566.7125185567838" y="402.92570142114374" class="value showable">76952</text><text text-anchor="middle" x="600.0878141137206" y="403.2482800240581" class="value showable">74013</text><text text-anchor="middle" x="633.4631096706572" y="385.89214628555993" class="value showable">232144</text><text text-anchor="middle" x="666.8384052275937" y="396.7765125037312" class="value showable">132977</text><text text-anchor="middle" x="700.2137007845305" y="396.5631430569584" class="value showable">134921</text><text text-anchor="middle" x="733.588996341467" y="394.3063001739626" class="value showable">155483</text><text text-anchor="middle" x="766.9642918984036" y="391.63929184724765" class="value showable">179782</text><text text-anchor="middle" x="800.3395874553403" y="388.6511317709147" class="value showable">207007</text></g><g class="series serie-1 color-1"><text text-anchor="middle" x="32.707789645797895" y="401.9789293800621" class="value showable">46430</text><text text-anchor="middle" x="66.08308520273451" y="401.565251682075" class="value showable">46409</text><text text-anchor="middle" x="99.45838075967114" y="401.2022821550802" class="value showable">48936</text><text text-anchor="middle" x="132.83367631660775" y="400.9655342658368" class="value showable">47295</text><text text-anchor="middle" x="166.20897187354439" y="399.9712370341931" class="value showable">50270</text><text text-anchor="middle" x="199.58426743048102" y="399.7816850616742" class="value showable">48581</text><text text-anchor="middle" x="232.95956298741766" y="399.3261895863103" class="value showable">49865</text><text text-anchor="middle" x="266.3348585443543" y="398.32892889012805" class="value showable">50947</text><text text-anchor="middle" x="299.7101541012909" y="397.59717266500735" class="value showable">54524</text><text text-anchor="middle" x="333.08544965822756" y="396.5414109836759" class="value showable">56313</text><text text-anchor="middle" x="366.4607452151642" y="395.69759189582106" class="value showable">56281</text><text text-anchor="middle" x="399.8360407721008" y="393.383235849189" class="value showable">69033</text><text text-anchor="middle" x="433.2113363290374" y="392.0875432981841" class="value showable">69948</text><text text-anchor="middle" x="466.586631885974" y="390.53468788000373" class="value showable">79938</text><text text-anchor="middle" x="499.9619274429107" y="386.89994374454574" class="value showable">90340</text><text text-anchor="middle" x="533.3372229998473" y="387.17499715689803" class="value showable">88258</text><text text-anchor="middle" x="566.7125185567838" y="383.89202723795603" class="value showable">96463</text><text text-anchor="middle" x="600.0878141137206" y="381.7870893520455" class="value showable">121519</text><text text-anchor="middle" x="633.4631096706572" y="345.6890180504842" class="value showable">134145</text><text text-anchor="middle" x="666.8384052275937" y="366.0006039974459" class="value showable">147421</text><text text-anchor="middle" x="700.2137007845305" y="363.9166298791967" class="value showable">162520</text><text text-anchor="middle" x="733.588996341467" y="355.73538235193183" class="value showable">195935</text><text text-anchor="middle" x="766.9642918984036" y="346.3260531683184" class="value showable">233065</text><text text-anchor="middle" x="800.3395874553403" y="332.29525591586844" class="value showable">306449</text></g><g class="series serie-2 color-2"><text text-anchor="middle" x="32.707789645797895" y="391.4825575005441" class="value showable">49202</text><text text-anchor="middle" x="66.08308520273451" y="390.57716420505574" class="value showable">53703</text><text text-anchor="middle" x="99.45838075967114" y="389.41833981255166" class="value showable">58427</text><text text-anchor="middle" x="132.83367631660775" y="388.64059500811106" class="value showable">64997</text><text text-anchor="middle" x="166.20897187354439" y="386.2139565828532" class="value showable">75072</text><text text-anchor="middle" x="199.58426743048102" y="384.8688729562063" class="value showable">87289</text><text text-anchor="middle" x="232.95956298741766" y="383.1629052035362" class="value showable">97398</text><text text-anchor="middle" x="266.3348585443543" y="380.47142085489196" class="value showable">111752</text><text text-anchor="middle" x="299.7101541012909" y="377.3152213634308" class="value showable">130264</text><text text-anchor="middle" x="333.08544965822756" y="373.99625083824316" class="value showable">149095</text><text text-anchor="middle" x="366.4607452151642" y="370.185784231446" class="value showable">176156</text><text text-anchor="middle" x="399.8360407721008" y="362.9623942977958" class="value showable">208130</text><text text-anchor="middle" x="433.2113363290374" y="350.2549485987102" class="value showable">311187</text><text text-anchor="middle" x="466.586631885974" y="340.1425100138484" class="value showable">379183</text><text text-anchor="middle" x="499.9619274429107" y="328.6106816729851" class="value showable">440731</text><text text-anchor="middle" x="533.3372229998473" y="319.9750362498151" class="value showable">523998</text><text text-anchor="middle" x="566.7125185567838" y="303.42200140125374" class="value showable">636696</text><text text-anchor="middle" x="600.0878141137206" y="286.205699285795" class="value showable">749319</text><text text-anchor="middle" x="633.4631096706572" y="235.81604585239464" class="value showable">866903</text><text text-anchor="middle" x="666.8384052275937" y="241.061378085561" class="value showable">990895</text><text text-anchor="middle" x="700.2137007845305" y="226.1958716547634" class="value showable">1092248</text><text text-anchor="middle" x="733.588996341467" y="205.09293091807317" class="value showable">1176562</text><text text-anchor="middle" x="766.9642918984036" y="187.40423060358643" class="value showable">1214865</text><text text-anchor="middle" x="800.3395874553403" y="155.97745747828714" class="value showable">1299975</text></g></g><g transform="translate(144, 20)" class="plot tooltip-overlay"><g transform="translate(0 0)" style="opacity: 0" class="tooltip"><rect rx="0" ry="0" width="0" height="0" class="tooltip-box"/><g class="text"/></g></g><g transform="translate(10, 30)" class="legends"><g id="activate-serie-0" class="legend reactive activate-serie"><rect x="0.0" y="1.0" width="12" height="12" class="color-0 reactive"/><text x="17.0" y="11.2">None</text></g><g id="activate-serie-1" class="legend reactive activate-serie"><rect x="0.0" y="22.0" width="12" height="12" class="color-1 reactive"/><text x="17.0" y="32.2">Dark</text></g><g id="activate-serie-2" class="legend reactive activate-serie"><rect x="0.0" y="43.0" width="12" height="12" class="color-2 reactive"/><text x="17.0" y="53.2">Bright</text></g></g><g transform="translate(987, 30)" class="legends"/></g></svg> \ No newline at end of file
diff --git a/python/fatcat_web/static/scholar-vaporwave-logo-small.png b/python/fatcat_web/static/scholar-vaporwave-logo-small.png
new file mode 100644
index 00000000..c40f7ec5
--- /dev/null
+++ b/python/fatcat_web/static/scholar-vaporwave-logo-small.png
Binary files differ
diff --git a/python/fatcat_web/templates/auth_account.html b/python/fatcat_web/templates/auth_account.html
index 4a51241a..86b60b25 100644
--- a/python/fatcat_web/templates/auth_account.html
+++ b/python/fatcat_web/templates/auth_account.html
@@ -8,17 +8,23 @@
<i class="settings icon"></i>
Account Settings
</h1>
+<h1 class="ui header">
+ <span class="sub header"><code>editor_{{ current_user.editor_id }}</code></span></h1>
+</h1>
-<p><b>Username:</b> <code>{{ current_user.username }}</code>
-<p><b>Editor Id:</b> <code><a href="/editor/{{ current_user.editor_id }}">{{ current_user.editor_id }}</a></code>
+<a href="/editor/{{ current_user.editor_id }}/editgroups">Edit History</a> -
+<a href="/editor/{{ current_user.editor_id }}/annotations">Comments and Annotation History</a>
<br>
+
+<div class="ui raised segments" style="max-width: 30em; margin-top: 2em; margin-bottom: 2em;">
+
<div class="ui segment">
-<h3 class="ui header">Change Username</h3>
+<h4 class="ui header">Change Username</h4>
<form class="" role="change_username" action="/auth/change_username" method="post">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
<div class="ui form">
- <div class="ui action input medium">
+ <div class="ui action input">
<input type="text" name="username" value="{{ current_user.username }}" aria-label="account username">
<button class="ui red button">Update</button>
</div>
@@ -27,7 +33,7 @@
</div>
<div class="ui segment">
-<h3 class="ui header">Create API Token</h3>
+<h4 class="ui header">Create API Token</h4>
<form class="" role="change_username" action="/auth/create_token" method="post">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
<div class="ui form">
@@ -40,10 +46,14 @@
</form>
</div>
-<br>
-<p>In the future, you will be able to...
-<ul>
- <li>Create and manage bot accounts
-</ul>
+</div>
+<div class="ui info small message">
+ <div class="header">
+ In the future, you will be able to...
+ </div>
+ <ul>
+ <li>Create and manage bot accounts
+ </ul>
+</div>
{% endblock %}
diff --git a/python/fatcat_web/templates/base.html b/python/fatcat_web/templates/base.html
index 8cdc3fbf..73f33d0d 100644
--- a/python/fatcat_web/templates/base.html
+++ b/python/fatcat_web/templates/base.html
@@ -101,14 +101,17 @@
<main class="ui main container" style="margin-top: 6em; margin-bottom: 2em;" {% block main_extra_attr %}{% endblock %}>
{% with messages = get_flashed_messages() %}
{% if messages %}
- <div class="ui message">
+ <div class="ui info message" style="margin: 1em auto; max-width: 45em;">
{# Needs more javascript: <i class="close icon"></i> #}
- <div class="header">Flash Message!</div>
- <ul class="list">
- {% for message in messages %}
- <li>{{ message|safe }}
- {% endfor %}
- </ul>
+ {% if messages|length == 1 %}
+ <div class="header">{{ messages[0]|safe }}</div>
+ {% else %}
+ <ul class="list">
+ {% for message in messages %}
+ <li>{{ message|safe }}
+ {% endfor %}
+ </ul>
+ {% endif %}
</div>
{% endif %}
{% endwith %}
diff --git a/python/fatcat_web/templates/changelog.html b/python/fatcat_web/templates/changelog.html
index 8b899d38..322f3e3b 100644
--- a/python/fatcat_web/templates/changelog.html
+++ b/python/fatcat_web/templates/changelog.html
@@ -7,9 +7,11 @@
<h1 class="ui header">Recent Changes
<div class="sub header"><code>changelog</code></div></h1>
-Limited to the most recent entries.
+<p>This is a feed of all the changes to the catalog, in the order that they are
+accepted. Only the most recent entries are shown, but the API can be used to
+inspect every change all the way back to the start.
-<table class="ui table">
+<table class="ui small table">
<thead><tr><th>Changelog<br>Index
<th>Editgroup
<th>Description
@@ -19,7 +21,7 @@ Limited to the most recent entries.
<br>{{ entry.timestamp.strftime("%Y-%m-%d %H:%M:%S") }}
<td>
{% if entry.editgroup.editor.is_bot %}
- <i class="icon bug"></i>
+ <i class="icon server"></i>
{% else %}
<i class="icon user"></i>
{% endif %}
@@ -28,10 +30,14 @@ Limited to the most recent entries.
</a></code>
<br>
<small><code><a href="/editgroup/{{ entry.editgroup.editgroup_id }}">
- {{ entry.editgroup.editgroup_id }}
+ editgroup_{{ entry.editgroup.editgroup_id }}
</a></code></small>
<td>{% if entry.editgroup.description != None %}{{ entry.editgroup.description }}{% endif %}
{% endfor %}
</table>
+<div style="float: right; font-size: smaller;">
+ <a href="{{ config.FATCAT_API_HOST }}/changelog">As JSON via API</a>
+</div>
+
{% endblock %}
diff --git a/python/fatcat_web/templates/container_edit.html b/python/fatcat_web/templates/container_edit.html
index 99f77d53..1885197c 100644
--- a/python/fatcat_web/templates/container_edit.html
+++ b/python/fatcat_web/templates/container_edit.html
@@ -2,19 +2,14 @@
{% extends "base.html" %}
{% block body %}
+
{% block edit_form_prefix %}
+{{ edit_macros.edit_link_bar('container', existing_ident, 'form') }}
<div class="ui segment">
<h1 class="ui header">Edit Container Entity</h1>
<form class="ui form" id="edit_container_form" method="POST" action="{% if editgroup %}/editgroup/{{ editgroup.editgroup_id }}{% endif %}/container/{{ existing_ident }}/edit">
- <p>Experienced users can also use the <a href="{% if editgroup
- %}/editgroup/{{ editgroup.editgroup_id }}{% endif %}/container/{{
- existing_ident }}/edit/toml">TOML editing form</a> to access all metadata
- fields in a raw format.
- {% if not editgroup %}
- You can also <a href="/container/{{ existing_ident }}/delete">delete this entity</a>.
- {% endif %}
{% endblock %}
<p>See <a href="https://guide.fatcat.wiki/entity_container.html">the catalog
diff --git a/python/fatcat_web/templates/container_search.html b/python/fatcat_web/templates/container_search.html
index bd92dc2b..ec25fa8d 100644
--- a/python/fatcat_web/templates/container_search.html
+++ b/python/fatcat_web/templates/container_search.html
@@ -1,3 +1,4 @@
+{% import "entity_macros.html" as entity_macros %}
{% import "search_macros.html" as search_macros %}
{% extends "base.html" %}
@@ -18,7 +19,7 @@
<form class="" role="search" action="/container/search" method="get">
<div class="ui form">
<div class="ui action input huge fluid">
- <input type="text" placeholder="Query..." name="q" value="{% if query.q %}{{ query.q }}{% endif %}" aria-label="search container metadata"> <button class="ui button">Search</button>
+ <input type="text" placeholder="Query..." name="q" value="{% if query.q %}{{ query.q }}{% endif %}" aria-label="search container metadata"> <button class="ui primary button">Search</button>
</div>
<br>Can also lookup by <b><a href="/container/lookup">identifier</a></b> or search <b><a href="/release/search?q={{ query.q or "" }}">releases</a></b>.
</div>
@@ -35,6 +36,7 @@
{{ search_macros.top_results(query, found) }}
{% for entity in found.results %}
+ {{ entity_macros.container_search_result_row(entity) }}
<div>
<h4 style="margin-top: 1em; margin-bottom: 4px; font-size: 1.1em;">
<a href="/container/{{ entity.ident }}" style="color: #2224c7;">{{ entity['name'] }}</a>
diff --git a/python/fatcat_web/templates/container_view.html b/python/fatcat_web/templates/container_view.html
index bdde6715..128741e5 100644
--- a/python/fatcat_web/templates/container_view.html
+++ b/python/fatcat_web/templates/container_view.html
@@ -46,14 +46,8 @@
</div>
<div class="column" style="flex: 0 0 24em;">
-{% if container._es and container._es.is_oa == True %}
-<div class="ui segment top attached">
- <i class="icon unlock huge orange"></i><b>Open Access Publication</b>
-</div>
-{% endif %}
-
{% if container._stats %}
-<div class="ui segment attached">
+<div class="ui segment top attached">
<div style="text-align: center;">
<div class="ui small statistic">
<div class="value">{{ "{:,}".format(container._stats.total) }}</div>
@@ -61,6 +55,13 @@
</div>
</div>
</div>
+
+{% if container._es and container._es.is_oa == True %}
+<div class="ui segment center aligned attached">
+ <i class="icon unlock large orange"></i><b>Open Access Publication</b>
+</div>
+
+{% endif %}
{% if container._stats.total >= 1 %}
<div class="ui segment attached">
<b>Preservation Status</b><br>
@@ -122,7 +123,8 @@
{% endif %}
{% if container._es.any_kbart == True %}
- <i class="icon check green"></i> In <a href="https://keepers.issn.org/?q=api/search&search[]=MUST=allissn={{ container.issnl }}&search[]=MUST_EXIST=keepers">Keepers Registery</a><br>
+ <i class="icon check green"></i> In <a href="https://keepers.issn.org/?q=api/search&search[]=MUST=allissn={{ container.issnl }}&search[]=MUST_EXIST=keepers">Keepers Registery</a>
+ <br>
{% elif container._es.any_kbart == False %}
<i class="icon times grey"></i> Not in <a href="https://keepers.issn.org/?q=api/search&search[]=MUST=allissn={{ container.issnl }}&search[]=MUST_EXIST=keepers">Keepers Registry</a><br>
{% endif %}
@@ -133,6 +135,23 @@
</div>
{% endif %}
+<div class="ui segment attached">
+<b>Preservation Holdings</b><br>
+{%- if container.extra and container.extra.kbart %}
+ {% for k, v in container.extra.kbart.items() %}
+ <p><span style="text-transform: uppercase;">{{ k }}:</span>
+ {% for span in v.year_spans %}
+ {% if span|length >= 2 %}
+ {{ span[0] }}-{{ span[1] }}
+ {% elif span|length == 1 %}
+ {{ span[0] }}
+ {% endif %}
+ {{ ", " if not loop.last }}
+ {% endfor %}
+ {% endfor %}
+{% endif %}
+</div>
+
<div class="ui segment attached accordion">
<div class="title" style="padding: 0px;"><i class="dropdown icon"></i><b>Lookup Links</b></div>
<div class="content">
diff --git a/python/fatcat_web/templates/edit_macros.html b/python/fatcat_web/templates/edit_macros.html
index d4839373..a7cf725b 100644
--- a/python/fatcat_web/templates/edit_macros.html
+++ b/python/fatcat_web/templates/edit_macros.html
@@ -1,4 +1,17 @@
+{% macro edit_link_bar(entity_type, existing_ident, view) -%}
+ {% set has_form = entity_type in ['release', 'file', 'container'] %}
+ <div class="ui {% if has_form %}four{% else %}three{% endif %} item menu">
+ <a class="item" href="/{{ entity_type }}/{{ existing_ident }}">View</a>
+ {% if has_form %}
+ <a class="item {% if view == 'form' %}active{% endif %}" href="/{{ entity_type }}/{{ existing_ident }}/edit">Edit Form</a>
+ {% endif %}
+ <a class="item {% if view == 'toml' %}active{% endif %}" href="/{{ entity_type }}/{{ existing_ident }}/edit/toml">Edit TOML</a>
+ <a class="red item {% if view == 'delete' %}active{% endif %}" href="/{{ entity_type }}/{{ existing_ident }}/delete">Delete</a>
+ </div>
+{% endmacro %}
+
+
{% macro form_field_errors(field) -%}
{% if field.errors %}
<div class="ui pointing red label">
@@ -71,7 +84,7 @@
<div class="menu">
{% for peg in potential_editgroups %}
<div class="item" data-value="{{ peg.editgroup_id }}">
- <div class="right floated">{{ peg.created }}</div>
+ <div class="right floated">{{ peg.created.strftime('%Y-%m-%d %X') }}</div>
<code><b>editgroup_{{ peg.editgroup_id }}</b></code>
{% if peg.description %}
<br>{{ peg.description[:200] }}
diff --git a/python/fatcat_web/templates/editgroup_reviewable.html b/python/fatcat_web/templates/editgroup_reviewable.html
index 4cfea697..ec1fc1f5 100644
--- a/python/fatcat_web/templates/editgroup_reviewable.html
+++ b/python/fatcat_web/templates/editgroup_reviewable.html
@@ -16,7 +16,7 @@ Limited to the most recent entries.
{% for editgroup in entries %}
<tr><td>
{% if editgroup.editor.is_bot %}
- <i class="icon bug"></i>
+ <i class="icon server"></i>
{% else %}
<i class="icon user"></i>
{% endif %}
diff --git a/python/fatcat_web/templates/editgroup_view.html b/python/fatcat_web/templates/editgroup_view.html
index a36dc3e5..6a9793f7 100644
--- a/python/fatcat_web/templates/editgroup_view.html
+++ b/python/fatcat_web/templates/editgroup_view.html
@@ -12,9 +12,20 @@
<div class="ui divided list">
{% for edit in edits %}
<div class="item">
- <div class="content">
+ <div class="content" style="padding-bottom: 0.5em;">
+ <div style="float: right; font-weight: bold;">
+ <a href="/editgroup/{{ editgroup.editgroup_id }}/{{ entity_type }}/{{ edit.ident }}">[view]</a>
+ {% if auth_to.edit and not editgroup.changelog_index and not editgroup.submitted %}
+ <br><a href="/editgroup/{{ editgroup.editgroup_id }}/{{ entity_type }}/{{ edit.ident }}/edit" style="color: green;">[re-edit]</a>
+ <br>
+ <form id="submit_edit_delete" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/{{ entity_type }}/edit/{{ edit.edit_id }}/delete" style="display:inline;">
+ <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
+ <input type="submit" value="[delete]" style="background:none; color: red; border: none; font-weight:bold; cursor:pointer; padding: 0;"></input>
+ </form>
+ {% endif %}
+ </div>
<div class="header">
- <a href="/{{ entity_type }}/{{ edit.ident }}">{{ entity_type }}/{{ edit.ident }}</a>
+ <a href="/{{ entity_type }}/{{ edit.ident }}">{{ entity_type }}_{{ edit.ident }}</a>
{% if edit.redirect_ident %}
=&gt; redirect to <a href="/{{ entity_type }}/{{ edit.redirect_ident }}">{{ entity_type }}/{{ edit.redirect_ident }}</a>
{% elif not edit.revision %}
@@ -24,14 +35,6 @@
{% else %}
updated
{% endif %}
- <a href="/editgroup/{{ editgroup.editgroup_id }}/{{ entity_type }}/{{ edit.ident }}">[view edit]</a>
- {% if auth_to.edit and not editgroup.changelog_index and not editgroup.submitted %}
- <a href="/editgroup/{{ editgroup.editgroup_id }}/{{ entity_type }}/{{ edit.ident }}/edit" style="color: green;">[re-edit]</a>
- <form id="submit_edit_delete" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/{{ entity_type }}/edit/{{ edit.edit_id }}/delete" style="display:inline;">
- <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
- <input type="submit" value="[delete-edit]" style="background:none; color: red; border: none; padding:9;font-weight:bold;cursor:pointer;"></input>
- </form>
- {% endif %}
</div>
{% if edit.revision %}
Revision: <small><code><a href="/{{ entity_type }}/rev/{{ edit.revision }}">{{ edit.revision }}</a></code></small>
@@ -48,65 +51,126 @@
{# extended by changelog_entry #}
{% block editgroupheader %}
-{% if not editgroup.changelog_index %}
- <div class="ui right floated center aligned segment">
- {% if auth_to.accept %}
- <form id="submit_editgroup_form" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/accept">
- <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
- <button class="ui orange button">Accept Edits</button>
- </form><br>
- {% endif %}
- {% if auth_to.submit %}
- {% if editgroup.submitted %}
- <form id="submit_editgroup_form" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/unsubmit">
- <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
- <button class="ui button">Un-Submit</button>
- </form><br>
- <form id="submit_editgroup_form" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/submit">
- <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
- <button class="ui button">Re-Submit</button>
- </form>
- {% else %}
- <form id="submit_editgroup_form" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/submit">
- <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
- <button class="ui primary button">Submit</button>
- </form>
- {% endif %}
- {% endif %}
+
+<h1 class="ui header">Editgroup
+<span class="sub header"><code>editgroup_{{ editgroup.editgroup_id }}</code></span></h1>
+
+{% if not auth_to.submit %}
+<br clear="all">
+<div class="ui info small message">
+ <div class="header">
+ What is an editgroup?
</div>
+ <p>An editgroup is a set of entity edits, bundled together into a coherent, reviewable bundle.
+</div>
{% endif %}
-<h1 class="ui header">Editgroup
-<span class="sub header"><code>editgroup {{ editgroup.editgroup_id }}</code></span></h1>
-{% endblock %}
+<div class="ui three top attached ordered steps">
-<p><b>What is an editgroup?</b>
-An editgroup is a set of entity edits, bundled together into a coherent,
-reviewable bundle.
-<br>
+ {% if editgroup.changelog_index %}
+ {% set editing_status = "completed" %}
+ {% set submit_status = "completed" %}
+ {% set accept_status = "completed" %}
+ {% elif editgroup.submitted %}
+ {% set editing_status = "completed" %}
+ {% set submit_status = "completed" %}
+ {% set accept_status = "active" %}
+ {% else %}
+ {% set editing_status = "completed" %}
+ {% set submit_status = "active" %}
+ {% set accept_status = "" %}
+ {% endif %}
-<br><b>Status:</b>
-{% if editgroup.changelog_index %}
- Merged (<a href="/changelog/{{ editgroup.changelog_index }}">Changelog #{{ editgroup.changelog_index }}</a>)
-{% elif editgroup.submitted %}
- Submitted ({{ editgroup.submitted.strftime("%Y-%m-%d %H:%M:%S") }})
-{% else %}
- Not Submitted
-{% endif %}
+ <div class="{{ editing_status }} step">
+ <div class="content">
+ <div class="title">
+ {% if not editgroup.changelog_index and auth_to.submit and editgroup.submitted %}
+ <form id="submit_editgroup_form" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/unsubmit">
+ <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
+ <button class="ui primary compact small button" type="submit">Edit</button>
+ </form>
+ {% else %}
+ Edit
+ {% endif %}
+ </div>
+ <div class="description">Make changes to entities</div>
+ </div>
+ </div>
+
+ <div class="{{ submit_status }} step">
+ <div class="content">
+ <div class="title">
+ {% if not editgroup.changelog_index and auth_to.submit and not editgroup.submitted %}
+ <form id="submit_editgroup_form" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/submit">
+ <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
+ <button class="ui primary compact small button" type="submit">Submit</button>
+ </form>
+ {% else %}
+ Submitted
+ {% endif %}
+ </div>
+ <div class="description">For review and feedback from others</div>
+ </div>
+ </div>
+
+ <div class="{{ accept_status }} step">
+ <div class="content">
+ <div class="title">
+ {% if not editgroup.changelog_index and auth_to.accept %}
+ <form id="submit_editgroup_form" method="POST" action="/editgroup/{{ editgroup.editgroup_id }}/accept">
+ <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
+ <button class="ui primary compact small button" type="submit">Accept</button>
+ </form>
+ {% else %}
+ Accepted
+ {% endif %}
+ </div>
+ <div class="description">Changes added to catalog</div>
+ </div>
+ </div>
+
+</div>
+
+{% endblock %}
+
+<table class="ui fixed compact small definition table">
+ <tbody>
+ <tr>
+ <td class="three wide right aligned">Status</td>
+ <td class="seven wide">
+ {% if editgroup.changelog_index %}
+ Merged (<a href="/changelog/{{ editgroup.changelog_index }}">Changelog #{{ editgroup.changelog_index }}</a>)
+ {% elif editgroup.submitted %}
+ Submitted ({{ editgroup.submitted.strftime("%Y-%m-%d %H:%M:%S") }})
+ {% else %}
+ Not Submitted
+ {% endif %}
+ </td>
+ </tr>
+ <tr>
+ <td class="right aligned">Editor</td>
+ <td>
+ <a href="/editor/{{editgroup.editor_id}}">{{ editgroup.editor.username }}</a>
+ </td>
+ </tr>
+ <tr>
+ <td class="right aligned">Description</td>
+ <td>
+ {% if editgroup.description %}
+ {{ editgroup.description }}
+ {% else %}
+ <i>none</i>
+ {% endif %}
+ </td>
+ </tr>
+</tbody></table>
-<br><b>Editor:</b> <a href="/editor/{{editgroup.editor_id}}">{{ editgroup.editor.username }}</a>
-<br><b>Description:</b>
-{% if editgroup.description %}
- {{ editgroup.description }}
-{% else %}
- <i>none</i>
-{% endif %}
{% if editgroup.extra %}
<h4>Extra Metadata (raw JSON)</h4>
{{ entity_macros.extra_metadata(editgroup.extra) }}
{% endif %}
-<br><br style="clear: both;">
+<h3 class="ui header">All Entity Changes</h3>
<div class="ui styled fluid accordion">
{{ edit_list(auth_to, editgroup, editgroup.edits.releases, "release", "Release") }}
{{ edit_list(auth_to, editgroup, editgroup.edits.works, "work", "Work") }}
@@ -116,14 +180,17 @@ reviewable bundle.
{{ edit_list(auth_to, editgroup, editgroup.edits.filesets, "fileset", "File Set") }}
{{ edit_list(auth_to, editgroup, editgroup.edits.webcaptures, "webcapture", "Web Capture") }}
</div>
+<div style="float: right; font-size: smaller;">
+ <a href="{{ config.FATCAT_API_HOST }}/editgroup/{{ editgroup.editgroup_id }}">As JSON via API</a>
+</div>
<br>
-<h2 class="ui header">Comments and Annotations</h2>
+<h3 class="ui header">Comments and Annotations</h3>
{% for annotation in editgroup.annotations|reverse %}
<div class="ui segments">
<div class="ui top attached secondary segment">
{% if annotation.editor.is_bot %}
- <i class="icon bug"></i>
+ <i class="icon server"></i>
{% else %}
<i class="icon user"></i>
{% endif %}
@@ -168,7 +235,7 @@ reviewable bundle.
</div>
<i>Markdown is allowed</i>
<button class="ui right floated primary button">
- <i class="icon edit"></i> Submit
+ <i class="icon edit"></i> Post
</button>
<br>
</form><br>
diff --git a/python/fatcat_web/templates/editor_annotations.html b/python/fatcat_web/templates/editor_annotations.html
index c46039f5..7a8b53cf 100644
--- a/python/fatcat_web/templates/editor_annotations.html
+++ b/python/fatcat_web/templates/editor_annotations.html
@@ -1,16 +1,16 @@
{% extends "base.html" %}
{% block body %}
-<h1 class="ui header">Comments and Annotations
+<h1 class="ui header">{{ editor.username }}: Comments and Annotations
<div class="sub header">
- <code>editor
- <a href="/editor/{{editor.editor_id}}">{{ editor.username }}</a>
- </code>
- </a>
+ <code>editor_{{ editor.editor_id }}</code>
</div>
</h1>
+<a href="/editor/{{ editor.editor_id }}/editgroups">Edit History</a> -
+<a href="/editor/{{ editor.editor_id }}/annotations">Comments and Annotation History</a>
<br>
+<br>
{% for annotation in annotations %}
<div class="ui segments">
<div class="ui top attached secondary segment">
@@ -29,7 +29,7 @@
</div>
</div>
{% else %}
- <i>None!</i>
+ <i>No comments or annotations for this editor!</i>
{% endfor %}
{% endblock %}
diff --git a/python/fatcat_web/templates/editor_editgroups.html b/python/fatcat_web/templates/editor_editgroups.html
index 3c3dd20d..756b3a02 100644
--- a/python/fatcat_web/templates/editor_editgroups.html
+++ b/python/fatcat_web/templates/editor_editgroups.html
@@ -1,15 +1,15 @@
{% extends "base.html" %}
{% block body %}
-<h1 class="ui header">Edit History
+<h1 class="ui header">{{ editor.username }}: Edit History
<div class="sub header">
- <code>editor
- <a href="/editor/{{editor.editor_id}}">{{ editor.username }}</a>
- </code>
- </a>
+ <code>editor_{{editor.editor_id}}</code>
</div>
</h1>
+<a href="/editor/{{ editor.editor_id }}/editgroups">Edit History</a> -
+<a href="/editor/{{ editor.editor_id }}/annotations">Comments and Annotation History</a>
+<br>
<table class="ui table">
<thead><tr>{# <th>Created (UTC) #}
<th>Status
@@ -28,7 +28,7 @@
Work in Progress
{% endif %}
<td><small><code><a href="/editgroup/{{ editgroup.editgroup_id }}">
- {{ editgroup.editgroup_id }}
+ editgroup_{{ editgroup.editgroup_id }}
</a></code></small>
<td>{% if editgroup.description != None %}{{ editgroup.description }}{% endif %}
{% endfor %}
diff --git a/python/fatcat_web/templates/editor_view.html b/python/fatcat_web/templates/editor_view.html
index 6ac58e3d..5906af75 100644
--- a/python/fatcat_web/templates/editor_view.html
+++ b/python/fatcat_web/templates/editor_view.html
@@ -6,11 +6,20 @@
<h1 class="ui header">{{ editor.username }}
<div class="sub header">
- <code>editor {{ editor.editor_id }}</code>
+ <code>editor_{{ editor.editor_id }}</code>
</div>
</h1>
-<p><b><a href="/editor/{{ editor.editor_id }}/editgroups">Edit History</a></b>
-<p><b><a href="/editor/{{ editor.editor_id }}/annotations">Comments and Annotation History</a></b>
+<a href="/editor/{{ editor.editor_id }}/editgroups">Edit History</a> -
+<a href="/editor/{{ editor.editor_id }}/annotations">Comments and Annotation History</a>
+
+<br>
+<br>
+<div class="ui small info message">
+ <div class="header">
+ This page is intentionally bare
+ </div>
+ <p>We don't have much to share about individual editors.
+</div>
{% endblock %}
diff --git a/python/fatcat_web/templates/entity_delete.html b/python/fatcat_web/templates/entity_delete.html
index b2e13af4..5f677992 100644
--- a/python/fatcat_web/templates/entity_delete.html
+++ b/python/fatcat_web/templates/entity_delete.html
@@ -2,6 +2,9 @@
{% extends "base.html" %}
{% block body %}
+
+{{ edit_macros.edit_link_bar(entity_type, existing_ident, 'delete') }}
+
{% block edit_form_prefix %}
<div class="ui segment">
<h1 class="ui header">Delete Entity</h1>
diff --git a/python/fatcat_web/templates/entity_edit_toml.html b/python/fatcat_web/templates/entity_edit_toml.html
index 64768d6e..1ff9010d 100644
--- a/python/fatcat_web/templates/entity_edit_toml.html
+++ b/python/fatcat_web/templates/entity_edit_toml.html
@@ -2,15 +2,14 @@
{% extends "base.html" %}
{% block body %}
+
{% block edit_form_prefix %}
+ {{ edit_macros.edit_link_bar(entity_type, existing_ident, 'toml') }}
<div class="ui segment">
- <h1 class="ui header">Edit Entity (TOML mode)</h1>
+ <h1 class="ui header">Edit Entity</h1>
<form class="ui form" id="edit_toml_form" method="POST" action="{% if editgroup and editgroup.editgroup_id %}/editgroup/{{ editgroup.editgroup_id }}{% endif %}/{{ entity_type }}/{{ existing_ident }}/edit/toml">
- {% if not editgroup %}
- <p>You can also <a href="/{{ entity_type }}/{{ existing_ident }}/delete">delete this entity</a>.
- {% endif %}
{% endblock %}
<p>See <a href="https://guide.fatcat.wiki/entity_release.html">the catalog
diff --git a/python/fatcat_web/templates/entity_history.html b/python/fatcat_web/templates/entity_history.html
index c9f45d84..0115b845 100644
--- a/python/fatcat_web/templates/entity_history.html
+++ b/python/fatcat_web/templates/entity_history.html
@@ -3,9 +3,9 @@
{% block entity_main %}
-<h3 class="ui header">Edit History</h3>
+<h3 class="ui header">Entity Edit History</h3>
-This table only shows <i>merged</i> edits, not work-in-progress.
+This table only shows <i>accepted</i> edits included in the catalog, not any work-in-progress.
<table class="ui table">
<thead><tr><th>Changelog
@@ -17,7 +17,7 @@ This table only shows <i>merged</i> edits, not work-in-progress.
<br>{{ entry.changelog_entry.timestamp.strftime("%Y-%m-%d %H:%M") }}
<td>
{% if entry.editgroup.editor.is_bot %}
- <i class="icon bug"></i>
+ <i class="icon server"></i>
{% else %}
<i class="icon user"></i>
{% endif %}
@@ -34,5 +34,9 @@ This table only shows <i>merged</i> edits, not work-in-progress.
<td>{% if entry.editgroup.description != None %}{{ entry.editgroup.description }}{% endif %}
{% endfor %}
</table>
+<div style="float: right; font-size: smaller;">
+ <a href="{{ config.FATCAT_API_HOST }}/{{ entity_type }}/{{ entity.ident }}/history">As JSON via API</a>
+</div>
+
{% endblock %}
diff --git a/python/fatcat_web/templates/entity_macros.html b/python/fatcat_web/templates/entity_macros.html
index e8a763d2..45f00362 100644
--- a/python/fatcat_web/templates/entity_macros.html
+++ b/python/fatcat_web/templates/entity_macros.html
@@ -5,15 +5,15 @@
<div class="ui segment pink inverted attached">
{% if editgroup.changelog_index %}
<b>Accepted Edit Version</b>
- <p>This is the version of the entity as of a specific merged editgroup:
+ <p>This is the version of the entity as of a specific point in time:
{% elif editgroup.submitted %}
<b>Submitted Edit Version</b>
- <p>This is a version of the entity that has been submitted for approval as part of an editgroup:
+ <p>This is a version of the entity that has been submitted for approval as part of:
{% else %}
<b>Edit In Progress</b>
- <p>This is a version of the entity that has not yet been submitted for approval, part of an editgroup:
+ <p>This is a version of the entity that has not yet been submitted for approval. Part of:
{% endif %}
- <b><a href="/editgroup/{{ editgroup.editgroup_id }}" style="color: white; font-weight: bold;">{{ editgroup.editgroup_id }}</a></b>
+ <a href="/editgroup/{{ editgroup.editgroup_id }}" style="color: white; font-weight: bold; font-size: smaller;"><code>editgroup_{{ editgroup.editgroup_id }}</code></a>
</div>
{% elif entity.state == None and entity.ident == None %}
<div class="ui segment pink inverted attached">
@@ -27,17 +27,15 @@
</div>
{% endif %}
-<div class="ui segment attached">
- <b>Fatcat Bits</b>
- <p>
- {% if entity.state %}
- State is "{{ entity.state }}".
+<div class="ui segment attached" style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">
+ <b>Catalog Record</b>
+ {% if entity.state and entity.state != "active" %}
+ <br>State: <code>{{ entity.state }}</code>
{% endif %}
{% if entity.revision %}
- Revision:
- <br><small><code><a href="/{{ entity_type }}/rev/{{ entity.revision }}">{{ entity.revision }}</a></code></small>
+ <br>Revision: <small><code><a href="/{{ entity_type }}/rev/{{ entity.revision }}">{{ entity.revision }}</a></code></small>
{% endif %}
- <br><a href="
+ <br>API URL: <a href="
{%- if config.FATCAT_DOMAIN == 'dev.fatcat.wiki' -%}
http://localhost:9411
{%- else -%}
@@ -52,7 +50,7 @@
/{{ entity_type }}/rev/{{ entity.revision }}
{% endif %}
{% if expand %}?expand={{ expand}}{% endif %}">
- As JSON object via API
+ JSON
</a>
</div>
@@ -180,11 +178,20 @@
</h4>
- {% if paper.best_pdf_url %}
<div style="float: right; padding: 4px;">
- &nbsp;&nbsp;<a href="{{ paper.best_pdf_url }}" class="ui violet tag label"><i class="file icon"></i>fulltext</a>
+ &nbsp;&nbsp;
+ {% if paper.preservation == "bright" %}
+ {% if paper.best_pdf_url %}
+ <a href="{{ paper.best_pdf_url }}" class="ui green label" style="background-color: #2ca048;"><i class="file icon"></i>bright archive</a>
+ {% else %}
+ <span class="ui green label" style="background-color: #2ca048;">bright archive</span>
+ {% endif %}
+ {% elif paper.preservation == "dark" %}
+ <span class="ui green label" style="background-color: #6e7b71;">dark archive</span>
+ {% else %}
+ <span class="ui grey label" style="background-color: #b71818;">no archive</span>
+ {% endif %}
</div>
- {% endif %}
{# ### AUTHOR ROW #}
{% if paper.contrib_names %}
@@ -232,15 +239,23 @@
{% if paper.doi %}
<a href="https://doi.org/{{paper.doi }}" style="color: green;">doi:{{ paper.doi }}</a> &nbsp;
{% endif %}
- {% if paper.pmid %}
- <a href="https://www.ncbi.nlm.nih.gov/pubmed/{{paper.pmid }}" style="color: green;">pmid:{{ paper.pmid }}</a> &nbsp;
- {% endif %}
{% if paper.pmcid %}
<a href="https://pubmed.ncbi.nlm.nih.gov/{{paper.pmcid }}/" style="color: green;">pmcid:{{ paper.pmcid }}</a> &nbsp;
+ {% elif paper.pmid %}
+ <a href="https://www.ncbi.nlm.nih.gov/pubmed/{{paper.pmid }}" style="color: green;">pmid:{{ paper.pmid }}</a> &nbsp;
{% endif %}
{% if paper.arxiv_id %}
<a href="https://arxiv.org/abs/{{paper.arxiv_id }}" style="color: green;">arXiv:{{ paper.arxiv_id }}</a> &nbsp;
{% endif %}
+ {% if paper.jstor_id %}
+ <a href="https://jstor.org/stable/{{paper.jstor_id }}/" style="color: green;">jstor:{{ paper.jstor_id }}</a> &nbsp;
+ {% endif %}
+ {% if paper.doaj_id %}
+ <a href="https://doaj.org/article/{{paper.doaj_id }}/" style="color: green;">doaj:{{ paper.doaj_id }}</a> &nbsp;
+ {% endif %}
+ {% if paper.doaj_id %}
+ <a href="https://dblp.org/rec/{{ paper.dblp_id }}.html" style="color: green;">dblp:{{ paper.dblp_id }}</a> &nbsp;
+ {% endif %}
{# WIP: elastic release work grouping searches
<br>
@@ -250,6 +265,26 @@
</div>
{% endmacro %}
+
+{% macro container_search_result_row(entity) -%}
+ <div>
+ <h4 style="margin-top: 1em; margin-bottom: 4px; font-size: 1.1em;">
+ <a href="/container/{{ entity.ident }}" style="color: #2224c7;">{{ entity['name'] }}</a>
+ {% if entity.is_oa %}<i class="icon unlock orange small"></i>{% endif %}
+ </h4>
+ {% if entity.publisher %}
+ <h5 style="margin-top: 4px; margin-bottom: 0px; font-size: 1em;">{{ entity.publisher }}</h5>
+ {% endif %}
+ {% if entity.issnl %}
+ <a href="https://portal.issn.org/resource/ISSN/{{entity.issnl }}" style="color: green;">issn:{{ entity.issnl }}</a>
+ {% endif %}
+ {% if entity.container_type %}
+ &nbsp;{{ entity.container_type }}
+ {% endif %}
+ </div>
+{% endmacro %}
+
+
{% macro progress_color(frac) -%}
{% if frac >= 1 %}
green
diff --git a/python/fatcat_web/templates/entity_view_metadata.html b/python/fatcat_web/templates/entity_view_metadata.html
index 5ce97d10..90ce25d9 100644
--- a/python/fatcat_web/templates/entity_view_metadata.html
+++ b/python/fatcat_web/templates/entity_view_metadata.html
@@ -4,13 +4,16 @@
{% block entity_main %}
+<h3>Entity Metadata (schema)</h3>
+{{ entity_macros.extra_metadata(entity._metadata) }}
+<div style="float: right;">
+ <a href="{{ config.FATCAT_API_HOST }}/{{ entity_type }}/{{ entity.ident }}">As JSON via API</a>
+</div>
+
{% if entity.extra %}
<h3>Extra Metadata (raw JSON)</h3>
{{ entity_macros.extra_metadata(entity.extra) }}
{% endif %}
-<h3>Entity Metadata (schema)</h3>
-{{ entity_macros.extra_metadata(entity._metadata) }}
-
{% endblock %}
diff --git a/python/fatcat_web/templates/file_edit.html b/python/fatcat_web/templates/file_edit.html
index 745b0c41..b7ff1d72 100644
--- a/python/fatcat_web/templates/file_edit.html
+++ b/python/fatcat_web/templates/file_edit.html
@@ -2,19 +2,14 @@
{% extends "base.html" %}
{% block body %}
+
{% block edit_form_prefix %}
+{{ edit_macros.edit_link_bar(entity_type, existing_ident) }}
<div class="ui segment">
<h1 class="ui header">Edit File Entity</h1>
<form class="ui form" id="edit_file_form" method="POST" action="{% if editgroup %}/editgroup/{{ editgroup.editgroup_id }}{% endif %}/file/{{ existing_ident }}/edit">
- <p>Experienced users can also use the <a href="{% if editgroup
- %}/editgroup/{{ editgroup.editgroup_id }}{% endif %}/file/{{
- existing_ident }}/edit/toml">TOML editing form</a> to access all metadata
- fields in a raw format.
- {% if not editgroup %}
- You can also <a href="/file/{{ existing_ident }}/delete">delete this entity</a>.
- {% endif %}
{% endblock %}
<p>See <a href="https://guide.fatcat.wiki/entity_file.html">the catalog
diff --git a/python/fatcat_web/templates/file_view.html b/python/fatcat_web/templates/file_view.html
index 02f47a91..608a2a0a 100644
--- a/python/fatcat_web/templates/file_view.html
+++ b/python/fatcat_web/templates/file_view.html
@@ -8,23 +8,23 @@
<div class="ui stackable mobile reversed grid centered">
<div class="column" style="font-size: 16px; flex: 1;">
-<h3>Releases</h3>
+<h3>Associated Releases</h3>
{% if entity.releases != [] %}
{{ entity_macros.release_list(entity.releases) }}
{% else %}
<p>
- This file is not associated with any fatcat release.
+ This file is not associated with any release entity! This makes a is a stub entry in the catalog.
{% endif %}
-<h3>URLs</h3>
+<h3>Public Access URLs</h3>
{% if file.urls != None %}
{{ entity_macros.url_list(file.urls) }}
{% else %}
-No known public URL, mirror, or archive for this file.
+No known archives or mirrors of this file.
{% endif %}
-<h3>Checksums</h3>
+<h3>Data Integrity Checksums</h3>
<table class="ui definition single line fixed compact small unstackable table">
<tbody>
{% if file.sha1 != None %}
@@ -45,22 +45,23 @@ No known public URL, mirror, or archive for this file.
<div class="column" style="flex: 0 0 24em;">
{% if file._es and file._es.best_url %}
-<a href="{{ file._es.best_url }}" class="ui top attached fluid huge green button"><i class="file icon"></i>Download File</a>
+ {# TODO: this currently shows *any* file, though prefers archive.org #}
+ <a href="{{ file._es.best_url }}" class="ui fluid huge black button" style="text-decoration: underline;">
+ <i class="file icon"></i>View Archived File
+ </a>
{% else %}
-<span class="ui top attached fluid huge grey button"><i class="file cross icon"></i>No Download Available</span>
+ <span class="ui fluid huge grey segment"><i class="file cross icon"></i>No Public URL</span>
{% endif %}
+<br>
-{% if file.size != None %}
-<div class="ui segment attached">
- <p><b>Size</b> &nbsp;{{ file.size|filesizeformat }}
+<div class="ui top segment attached">
+ {% if file.size != None %}
+ <b>Size</b> &nbsp;{{ file.size|filesizeformat }}<br>
+ {% endif %}
+ {% if file.mimetype != None %}
+ <b>MIME Type</b> &nbsp;<code>{{ file.mimetype }}</code><br>
+ {% endif %}
</div>
-{% endif %}
-
-{% if file.mimetype != None %}
-<div class="ui segment attached">
- <p><b>File Type</b> &nbsp;<code>{{ file.mimetype }}</code>
-</div>
-{% endif %}
{{ entity_macros.fatcat_bits(entity, "file", "", editgroup) }}
diff --git a/python/fatcat_web/templates/fileset_view.html b/python/fatcat_web/templates/fileset_view.html
index 27d5b6da..4e8bfbad 100644
--- a/python/fatcat_web/templates/fileset_view.html
+++ b/python/fatcat_web/templates/fileset_view.html
@@ -8,14 +8,20 @@
<div class="ui stackable mobile reversed grid centered">
<div class="column" style="font-size: 16px; flex: 1;">
-<h3>Releases</h3>
+<h3>Associated Releases</h3>
{% if entity.releases != [] %}
{{ entity_macros.release_list(entity.releases) }}
{% else %}
<p>
This File Set is not associated with any fatcat release.
{% endif %}
-
+
+<h3>Public Access URLs</h3>
+{% if entity.urls %}
+ {{ entity_macros.url_list(entity.urls) }}
+{% else %}
+No known public URL, mirror, or archive for this File Set.
+{% endif %}
<h3>File Manifest ({{ fileset.manifest|count }})</h3>
{% if fileset.manifest %}
@@ -40,14 +46,6 @@ This File Set is empty (contains no files).
{% endif %}
-<br>
-<h3>Base URLs</h3>
-{% if entity.urls %}
- {{ entity_macros.url_list(entity.urls) }}
-{% else %}
-No known public URL, mirror, or archive for this File Set.
-{% endif %}
-
</div>
<div class="column" style="flex: 0 0 24em;">
diff --git a/python/fatcat_web/templates/home.html b/python/fatcat_web/templates/home.html
index 4288017e..a90b0fb7 100644
--- a/python/fatcat_web/templates/home.html
+++ b/python/fatcat_web/templates/home.html
@@ -32,17 +32,17 @@
<div class="row">
<div class="four wide mobile three wide center aligned column">
<a href="/stats" style="color: black;">
- <h4>110,814,532<br>Papers</h4>
+ <h4>116,741,069<br>Papers</h4>
</a>
</div>
<div class="four wide mobile three wide center aligned column">
<a href="/stats" style="color: black;">
- <h4>26,173,743<br>Fulltext</h4>
+ <h4>28,751,063<br>Accessible</h4>
</a>
</div>
<div class="four wide mobile three wide center aligned column">
<a href="/stats" style="color: black;">
- <h4>151,707<br>Journals</h4>
+ <h4>177,158<br>Journals</h4>
</a>
</div>
</div>
@@ -53,20 +53,19 @@
<div class="ui vertical stripe segment" style="padding-top: 2em; padding-bottom: 2em;">
<div class="ui text container" style="max-width: 800px!important;">
<div class="ui centered grid">
- <div class="row">
+ <div class="stackable row">
<div class="four wide column">
<!-- TODO: don't let it scale down -->
<img src="/static/paper_man_confused.gif" width="130" alt="confused paper man">
</div>
<div class="twelve wide column" style="font-size: 1.2rem;">
- <p><b>Fatcat is a versioned, user-editable catalog of research
+ <p>Fatcat is a versioned, user-editable catalog of research
publications including journal articles, conference proceedings, and
- datasets</b>
+ datasets.
<p>Features include archival file-level metadata (verified digests and
- long-term copies), an
- <b><a href="https://api.{{ config.FATCAT_DOMAIN }}">open, documented API</a></b>,
- and work/release indexing (eg, distinguishing between and linking
- pre-prints, manuscripts, and version-of-record).
+ long-term copies), a <b><a href="/coverage/search">preservation coverage visualizer</a></b>, work/edition grouping, an
+ <b><a href="https://api.{{ config.FATCAT_DOMAIN }}">open API</a></b>,
+ and public metadata dumps.
&nbsp;<a href="/about">Read more...</a>
</div>
</div>
@@ -74,18 +73,37 @@
</div>
</div>
+<div class="ui vertical stripe segment" style="padding-top: 2em; padding-bottom: 2em;">
+ <div class="ui text container" style="max-width: 1200px!important;">
+ <div class="ui middle aligned divided centered grid">
+ <div class="stackable row">
+ <div class="eight wide column" style="font-size: 1.6rem; text-align: center;">
+ <p>Our goal is to ensure long-term access to research content on the
+ "scholarly web" by tracking holes in preservation coverage across
+ digital preservation efforts
+ </div>
+ <div class="seven wide column">
+ <a href="/coverage/search?q=is_oa%3Atrue+year%3A%3E1995+year%3A%3C%3D2019+%28type%3Aarticle-journal+OR+type%3Aarticle+OR+type%3Apaper-conference%29+%21doi_prefix%3A10.5281+%21doi_prefix%3A10.6084">
+ <img alt="coverage visualization tool" src="/static/fatcat_oa_preservation_jan2021.svg" style="width: 100%;">
+ </a>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
<div class="ui vertical stripe segment" style="padding-top: 2em; padding-bottom: 2em; background-color: #F5F5F5;">
<div class="ui text container" style="max-width: 800px!important;">
<div class="ui centered grid">
- <div class="row">
+ <div class="stackable row">
<div class="twelve wide column" style="font-size: 1.2rem;">
<p>This service is hosted at the <b><a
href="https://archive.org">Internet Archive</a></b>, a US
non-profit digital library dedicated to providing Universal Access to All Knowledge.
<a href="https://archive.org/donate/">Donations welcome!</a>
- <p>Development funding comes from
- <b><a href="https://blog.archive.org/2018/03/05/andrew-w-mellon-foundation-awards-grant-to-the-internet-archive-for-long-tail-journal-preservation/">The Andrew Mellon Foundation</a></b>
- to improve preservation and access to "long-tail" open access works on
+ <p>Development for this project funding comes from
+ <b><a href="https://blog.archive.org/2018/03/05/andrew-w-mellon-foundation-awards-grant-to-the-internet-archive-for-long-tail-journal-preservation/">The Andrew Mellon Foundation</a></b>,
+ specifically to capture "long-tail" open access works on
the public web which might otherwise be lost.
</div>
<div class="four wide column">
@@ -96,6 +114,26 @@
</div>
</div>
+<div class="ui vertical stripe segment" style="padding-top: 2em; padding-bottom: 2em;">
+ <div class="ui text container" style="max-width: 800px!important;">
+ <div class="ui centered grid">
+ <div class="stackable row">
+ <div class="four wide column">
+ <a href="https://scholar-qa.archive.org">
+ <img src="/static/scholar-vaporwave-logo-small.png" width="170" alt="IA scholar logo">
+ </a>
+ </div>
+ <div class="twelve wide column" style="font-size: 1.2rem;">
+ <p><b><a href="https://scholar-qa.archive.org">Internet Archive Scholar</a></b>
+ is a sibling service, built on the Fatcat catalog, providing end-user
+ access to and full-text search over research content across the
+ Internet Archive's various holdings.
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
<div class="ui vertical stripe segment" style="background-color: #fffaf3; color: #573a08;">
<div class="ui text container">
<div class="ui centered grid">
@@ -110,6 +148,8 @@
</div>
</div>
+</div>
+
<div class="ui center aligned container">
<br>
@@ -118,7 +158,6 @@
</h2>
<br>
-
{# this div makes the table scrollable on mobile #}
<div style="max-width: 100%; overflow-x: auto;">
<table class="ui single line unstackable table centered" style="max-width: 800px; font-size: 1.1rem; margin-right: auto; margin-left: auto;">
diff --git a/python/fatcat_web/templates/release_edit.html b/python/fatcat_web/templates/release_edit.html
index c26c9850..0ac94be9 100644
--- a/python/fatcat_web/templates/release_edit.html
+++ b/python/fatcat_web/templates/release_edit.html
@@ -2,7 +2,9 @@
{% extends "base.html" %}
{% block body %}
+
{% block edit_form_prefix %}
+{{ edit_macros.edit_link_bar('release', existing_ident, 'form') }}
<div class="ui segment">
<h1 class="ui header">Edit Release Entity</h1>
diff --git a/python/fatcat_web/templates/release_save.html b/python/fatcat_web/templates/release_save.html
index 29875d3d..7dd01fc0 100644
--- a/python/fatcat_web/templates/release_save.html
+++ b/python/fatcat_web/templates/release_save.html
@@ -13,14 +13,14 @@
{% if spn_status == "not-configured" %}
-<div class="ui error message" style="margin: 2em;">
- <div class="header">Error</div>
+<div class="ui error message" style="margin-top: 2em;">
+ <div class="header">Not Available</div>
<p>Save Paper Now feature isn't configured, sorry about that.
</div>
{% elif spn_status == "kafka-error" %}
-<div class="ui error message" style="margin: 2em;">
+<div class="ui error message" style="margin-top: 2em;">
<div class="header">Error</div>
<p>Whoops, something went wrong and we couldn't enqueue your request. This
didn't have anything to do with the URL you supplied; please try again later.
@@ -28,7 +28,7 @@
{% elif spn_status == "success" %}
-<div class="ui positive message" style="margin: 2em;">
+<div class="ui positive message" style="margin-top: 2em;">
<div class="header">Success</div>
<p>URL has been submitted to the bot queue for crawling. If fulltext content
is found, it will be imported into the catalog for review. Keep an eye on the
@@ -40,15 +40,24 @@
<form class="ui form" id="save_release_form" method="POST" action="/release/{{ release.ident }}/save">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
- <br>
- <p>Know of a legit fulltext copy of this publication on the public web?
- Tell us the URL and we will crawl it and provide free perpetual access.
+ <p>If you know of a legitimate public web access option for this work, you
+ can help us preserve it by filling out the form below. Using the Wayback
+ Machine's <a href="https://web.archive.org/save">"Save Page Now"</a> feature,
+ we will attempt to crawl, process, and verify the content and add it to the
+ catalog.
- {{ edit_macros.form_field_basic(form.base_url) }}
+ <p style="margin-top: 1em; margin-bottom: 1em;">If you are the author of this
+ work, and the published version is not publicly available, another option is
+ to upload an version to an institutional or discipline repository. The
+ <a href="https://shareyourpaper.org/">Share Your Paper</a> tool can help with
+ this process.
- <p style="margin-top: 2em; margin-bottom: 2em;"><b>Important:</b> check the publication stage of the file you are
- submitting. We distinguish between pre-prints, manuscripts, and the
- published version of record (if applicable).
+ <p style="margin-top: 1em; margin-bottom: 1em;"><b>Important:</b>
+ double-check the publication stage of the file you are submitting. We
+ distinguish between pre-prints, manuscripts, and the published version of
+ record (if applicable).
+
+ {{ edit_macros.form_field_basic(form.base_url) }}
<div class="ui equal width fields">
{{ edit_macros.form_field_basic(form.release_stage) }}
diff --git a/python/fatcat_web/templates/release_search.html b/python/fatcat_web/templates/release_search.html
index b1021322..59a234c0 100644
--- a/python/fatcat_web/templates/release_search.html
+++ b/python/fatcat_web/templates/release_search.html
@@ -24,7 +24,7 @@
</div>
<div class="ui checkbox" style="float: right; margin: 1em;">
<input type="checkbox" name="fulltext_only" id="fulltext_only" value="true" {% if query.fulltext_only %}checked{% endif %}>
- <label for="fulltext_only">Fulltext Available Only</label>
+ <label for="fulltext_only">Only public full-text</label>
</div>
<br>Can also lookup by <b><a href="/release/lookup">identifier</a></b> or search for <b><a href="/container/search?q={{ query.q or "" }}">containers</a></b> (eg, journals).
</div>
@@ -35,6 +35,16 @@
<div class="ui container text">
<br>
+{% if container_found and container_found.results %}
+ <div class="ui tiny info floating message" style="margin: 0em auto; max-width: 40em;">
+ <div class="header">Were you looking for this journal, instead of publications?</div>
+ <div style="padding-left: 0.5em;">
+ {{ entity_macros.container_search_result_row(container_found.results[0]) }}
+ </div>
+ </div>
+ <br clear="all">
+{% endif %}
+
{% if found %}
{% if found.results %}
diff --git a/python/fatcat_web/templates/release_view.html b/python/fatcat_web/templates/release_view.html
index cc9cf5fe..9464fda2 100644
--- a/python/fatcat_web/templates/release_view.html
+++ b/python/fatcat_web/templates/release_view.html
@@ -79,23 +79,16 @@
<div class="ui stackable mobile reversed grid centered">
<div class="column" style="font-size: 16px; flex: 1;">
-{% if release.abstracts != [] %}
-<h3>Abstract</h3>
-<p><span itemprop="description">{{ release.abstracts[0].content }}</span>
-<br><small><i>In <code>{{ release.abstracts[0].mimetype }}</code> format</i></small>
-{% endif %}
-
-<div class="ui accordion">
<div class="title" itemprop="isPartOf" itemscope itemtype="http://schema.org/Periodical" itemid="#container">
{% if release.release_stage == 'published' %}
- <i class="dropdown icon"></i>Published
+ Published
{% if release.container.ident %}
in <a href="/container/{{ release.container.ident }}"><span itemprop="name">{{ release.container.name }}</span></a>
{% elif release.extra and release.extra.container_name %}
in <span itemprop="name">{{ release.extra.container_name }}</span>
{% endif %}
{% else %}
- <i class="dropdown icon"></i>Released
+ Released
{% if release.release_type %}
as a <i>{{ release.release_type }}</i>
{% endif %}
@@ -105,84 +98,41 @@
{% endif %}
{% if release.publisher %}
by <span itemprop="publisher">{{ release.publisher }}</span>
- {% endif %}
-</div><div class="content" itemscope itemtype="http://schema.org/Periodical" itemid="#container">
- <table class="ui definition single line fixed compact small collapsing unstackable table" style="width: 100%;">
- <tbody>
- {% if release.number != None %}
- <tr><td class="three wide right aligned">Number</td>
- <td class="seven wide">{{ release.number }}
- {% endif %}
- {% if release.version != None %}
- <tr><td class="three wide right aligned">Version</td>
- <td class="seven wide">{{ release.version }}
- {% endif %}
- {% if release.container != None and release.container.issnl != None %}
- <tr><td class="three wide right aligned">ISSN-L</td>
- <td class="seven wide" itemprop="issn">{{ release.container.issnl }}
- {% endif %}
- {% if release.volume != None %}
- <tr itemprop="isPartOf" itemscope itemtype="http://schema.org/PublicationVolume">
- <td class="right aligned">Volume</td>
- <td class="" itemprop="volumeNumber">{{ release.volume }}
- {% endif %}
- {% if release.issue != None %}
- <tr itemprop="isPartOf" itemscope itemtype="http://schema.org/PublicationIssue">
- <td class="right aligned">Issue</td>
- <td class="" itemprop="issueNumber">{{ release.issue }}
- {% endif %}
- {% if release.pages != None %}
- <tr itemprop="isPartOf" itemscope itemtype="http://schema.org/PublicationIssue">
- <td class="right aligned">Page(s)</td>
- <td class="" itemprop="pagination">{{ release.pages }}
- {% endif %}
- {% if release.release_date != None %}
- <tr><td class="right aligned">Release Date</td>
- <td class="">{{ release.release_date }}
- {% elif release.release_year != None %}
- <tr><td class="three wide right aligned">Release Year</td>
- <td class="seven wide">{{ release.release_year }}
- {% endif %}
- {% if release.container != None and release.container.container_type != None %}
- <tr><td class="right aligned">Container Type</td>
- <td class="">{{ release.container.container_type }}
- {% endif %}
- {% if release.publisher != None %}
- <tr><td class="three wide right aligned">Publisher</td>
- <td class="seven wide">{{ release.publisher }}
- {% endif %}
- {% if release.language != None %}
- <tr><td class="right aligned">Primary Language</td>
- <td class=""><code>{{ release.language }}</code>
- (<a href="https://www.loc.gov/standards/iso639-2/php/langcodes_name.php?iso_639_1={{ release.language }}">lookup</a>)
- {% endif %}
+ {% endif %}.
- </tbody>
- </table>
-</div>
+ <p>
+ {% if release.volume != None %}
+ Volume {{ release.volume }}
+ {%- if release.issue != None %}, {% endif %}
+ {% endif %}
+ {% if release.issue != None %}
+ Issue {{ release.issue}}
+ {% endif %}
+ {% if release.pages != None %}
+ {% if release.pages[0].isdigit() %}p{% endif -%}
+ {{ release.pages }}
+ {% endif %}
+ {% if release.release_year != None %}
+ ({{ release.release_year }})
+ {% endif %}
</div>
+{% if release.abstracts != [] %}
+ <h3>Abstract</h3>
+ <p><span itemprop="description">{{ release.abstracts[0].content }}</span>
+ <br><small><i>In <code>{{ release.abstracts[0].mimetype }}</code> format</i></small>
+{% endif %}
+
{% if entity.state == 'active' %}
-<h3>Known Files and URLs</h3>
+<h3>Archived Files and Locations</h3>
{% if entity.files != [] %}
<table class="ui compact fixed table">
-<!--
- <thead>
- <tr><th>SHA-1
- <th>Size (bytes)
- <th>File Type
- <th>Links
- </thead>
--->
<tbody>
{% for file in entity.files %}
<tr><td>{% if file.mimetype != None %}{{ file.mimetype }}&nbsp;&nbsp;{% endif %}
{% if file.size != None %}{{ file.size|filesizeformat }}{% endif %}
<br><small><code><a href="/file/{{ file.ident }}">
- {% if file.sha1 != None %}sha1:{{ file.sha1[:20] + "..." }}
- {% elif file.sha256!= None %}sha256:{{ file.md5[:20] + "..." }}
- {% elif file.md5 != None %}md5:{{ file.md5[:20] + "..." }}
- {% endif %}
+ file_{{ file.ident }}
</a></code></small>
<td class="single line">
{% for url in file.urls[:5] %}
@@ -208,7 +158,7 @@ accessible version.
<tbody>
{% for fileset in entity.filesets %}
<tr><td>{{ fileset.manifest|count }} files &nbsp;{{ fileset._total_size|filesizeformat }}
- <br><small><code><a href="/fileset/{{ fileset.ident }}">fileset:{{ fileset.ident }}</a></code></small>
+ <br><small><code><a href="/fileset/{{ fileset.ident }}">fileset_{{ fileset.ident }}</a></code></small>
<td class="single line">
{% for url in fileset.urls[:5] %}
{% if url.rel == "dweb" %}
@@ -234,7 +184,7 @@ accessible version.
{% for webcapture in entity.webcaptures %}
<tr><td><b><a href="{{ webcapture.original_url }}" style="color: black;">{{ webcapture.original_url }}</a></b>
<br>{{ webcapture.timestamp.strftime("%Y-%m-%d %H:%M:%S") }} | {{ webcapture.cdx|count }} resources
- <br><small><code><a href="/webcapture/{{ webcapture.ident }}">webcapture:{{ webcapture.ident }}</a></code></small>
+ <br><small><code><a href="/webcapture/{{ webcapture.ident }}">webcapture_{{ webcapture.ident }}</a></code></small>
<td class="single line">
{% for url in webcapture.archive_urls[:5] %}
<a href="{{ url.url }}{% if url.rel == "wayback" %}{{ webcapture._wayback_suffix }}{% endif %}">{{ url.url.split('/')[2] }}</a> ({{ url.rel }})<br>
@@ -247,41 +197,42 @@ accessible version.
</table>
{% endif %}
{% endif %}
+</div>
-</div>
<div class="column" style="flex: 0 0 24em;">
-{% if entity.state == 'active' and entity._es and entity._es.best_pdf_url %}
-<a href="{{ entity._es.best_pdf_url }}" class="ui top attached fluid huge green button"><i class="file pdf outline icon"></i>Read Full Text</a>
+{% if entity.state == 'active' and entity._es and entity._es.ia_pdf_url %}
+ <a href="{{ entity._es.ia_pdf_url }}" class="ui top attached fluid huge black button" style="text-decoration: underline;">
+ <i class="file pdf outline icon"></i>Read Archived PDF
+ </a>
{% elif entity.state == 'active' and entity.webcaptures != [] and entity.webcaptures[0].archive_urls != [] and entity.webcaptures[0].archive_urls[0].rel == "wayback" %}
-<a href="{{ entity.webcaptures[0].archive_urls[0].url }}{{ entity.webcaptures[0]._wayback_suffix }}" class="ui top attached fluid huge green button"><i class="file archive outline icon"></i>View Web Archive</a>
-{% elif entity.state == 'active' %}
-<span class="ui top attached fluid huge grey button"><i class="ban icon"></i>No Full Text Available</span>
-
-<a href="/release/{{ release.ident }}/save" class="ui attached fluid huge blue button">
- <i class="cloud download icon"></i>"Save Paper Now"
- <div style="margin-top: 0.8em; font-size: smaller; text-align: left;">
- Know of a fulltext copy of on the public web? Submit a URL and we will archive it
- </div>
-</a>
-
-{# alternative SPN
-<div class="ui segment attached">
- <center>
- <a class="ui blue huge button" href="/release/{{ release.ident }}/save" title="save paper now">Save Paper Now</a>
- </center>
- <p style="margin-top: 0.5em;">Know of a fulltext copy on the public web? Submit a URL and we'll archive it
-</div>
-#}
+ <a href="{{ entity.webcaptures[0].archive_urls[0].url }}{{ entity.webcaptures[0]._wayback_suffix }}" class="ui fluid huge black button" style="text-decoration: underline;">
+ <i class="university icon"></i>Visit Web Archive
+ </a>
+{% endif %}
-{# alternative SPN
-<div class="ui segment attached yellow inverted accordion">
- <b><a href="/release/{{ release.ident }}/save" title="save paper now" style="color: black;">Save Paper Now</a></b>
- <br>know of a fulltext copy on the public web? submit a URL and we'll archive it
-</div>
-#}
+{% if entity.state == 'active' and entity._es %}
+ {% if entity._es.preservation == 'bright' %}
+ <div class="ui top attached fluid compact green inverted center aligned segment" style="padding: 0.5em; border-color: #5550; background-color: #2ca048;">
+ <b>Archived</b>
+ </div>
+ {% elif entity._es.preservation == 'dark' %}
+ <div class="ui top attached fluid large green inverted center aligned segment" style="padding: 0.5em; border-color: #5550; background-color: ##6e7b71;">
+ <b>"Dark" Archived</b>
+ </div>
+ {% else %}
+ <div class="ui top attached fluid large red inverted center aligned segment" style="padding: 0.5em; border-color: #5550; background-color: #b71818;">
+ <b>Not Preserved</b>
+ </div>
+ <div class="ui segment attached">
+ <a href="/release/{{ release.ident }}/save">
+ <b><i class="cloud download icon"></i>Save Paper Now!</b>
+ </a>
+ <p>Know of a fulltext copy of on the public web? Submit a URL and we will archive it
+ </div>
+ {% endif %}
{% endif %}
{% if release.release_type or release.release_stage or release.release_year %}
@@ -305,6 +256,10 @@ accessible version.
{% if release.version %}
<b>Version</b> &nbsp; <code>{{ release.version }}</code><br>
{% endif %}
+ {% if release.language != None %}
+ <b>Language</b> &nbsp; <code>{{ release.language}}</code>
+ <sup><a href="https://www.loc.gov/standards/iso639-2/php/langcodes_name.php?iso_639_1={{ release.language }}">?</a></sup>
+ {% endif %}
</div>
{% endif %}
@@ -357,7 +312,19 @@ accessible version.
{% if release.container != None and release.container._es %}
<div class="ui segment attached">
-<b>Container Metadata</b><br>
+<b><a href="/container/{{ release.container.ident }}">
+{% if release.container.container_type == "journal" %}
+ Journal Metadata
+{% elif release.container.container_type == "proceedings" %}
+ Proceedings Metadata
+{% elif release.container.container_type == "book-series" %}
+ Book Series Metadata
+{% elif release.container.container_type == "blog" %}
+ Blog Metadata
+{% else %}
+ Container Metadata
+{% endif %}
+</a></b><br>
{% if release.container._es.is_oa == True %}
<i class="icon unlock orange"></i>Open Access Publication<br>
{% endif %}
@@ -370,7 +337,9 @@ accessible version.
{% if release.container._es.in_road == True %}
<i class="icon check green"></i> In <a href="http://road.issn.org/issn/{{ release.container.issnl }}">ISSN ROAD</a><br>
{% elif release.container._es.in_road == False %}
+ {# skip 'not in ROAD' display, to reduce UI clutter
<i class="icon times grey"></i> Not in <a href="https://road.issn.org">ISSN ROAD</a><br>
+ #}
{% endif %}
{% if release.container._es.any_kbart == True %}
<i class="icon check green"></i> In <a href="https://keepers.issn.org/?q=api/search&search[]=MUST=allissn={{ release.container.issnl }}&search[]=MUST_EXIST=keepers">Keepers Registery</a><br>
@@ -380,19 +349,18 @@ accessible version.
{% if release.container.issnl != None %}
<i class="icon linkify"></i>ISSN-L: &nbsp;<code>{{ release.container.issnl }}</code><br>
{% endif %}
- <a href="/container/{{ release.container.ident }}" title="container {{ release.container.ident }}"><i class="icon share"></i>Fatcat Entry</a>
</div>
{% endif %}
-<div class="ui segment attached accordion">
+<div class="ui segment attached">
<b><a href="/work/{{ release.work_id }}" title="work {{ release.work_id }}">Work Entity</a></b>
- <br>grouping other versions (eg, pre-print) and variants of this release
+ <br>access all versions, variants, and formats of this works (eg, pre-prints)
</div>
{% if release.state == "active" and release._can_citeproc %}
<div class="ui segment attached accordion">
<div class="title" style="padding: 0px;">
- <i class="dropdown icon"></i><b>Cite This Release</b>
+ <i class="dropdown icon"></i><b>Cite This</b>
</div>
<div class="content">
<a href="/release/{{ release.ident }}.bib">BibTeX</a>
diff --git a/python/fatcat_web/templates/search_macros.html b/python/fatcat_web/templates/search_macros.html
index a207bfbc..cb917c5f 100644
--- a/python/fatcat_web/templates/search_macros.html
+++ b/python/fatcat_web/templates/search_macros.html
@@ -9,7 +9,7 @@
{% endif %}
{{ found.offset + found.count_returned }}
- out of {{ found.count_found }} results
+ out of {{ '{0:,}'.format(found.count_found) }} results
</i>
{%- endmacro %}
@@ -28,7 +28,7 @@
{% endif %}
&nbsp;&nbsp;<i>Showing results {{ found.offset }} &mdash; {{ found.offset +
-found.count_returned }} out of {{ found.count_found }} results</i>&nbsp;&nbsp;
+found.count_returned }} out of {{ '{0:,}'.format(found.count_found) }} results</i>&nbsp;&nbsp;
{% if found.offset + found.limit < found.count_found and found.offset + found.limit < found.deep_page_limit %}
<a href="{{ url_for(endpoint, q=query.q, offset=found.offset + found.limit) }}">Next &#xbb;</a>
diff --git a/python/fatcat_web/templates/webcapture_view.html b/python/fatcat_web/templates/webcapture_view.html
index f2f689f3..b35ee0e2 100644
--- a/python/fatcat_web/templates/webcapture_view.html
+++ b/python/fatcat_web/templates/webcapture_view.html
@@ -8,7 +8,7 @@
<div class="ui stackable mobile reversed grid centered">
<div class="column" style="font-size: 16px; flex: 1;">
-<h3>Releases</h3>
+<h3>Associated Releases</h3>
{% if entity.releases != [] %}
{{ entity_macros.release_list(entity.releases) }}
{% else %}
@@ -16,8 +16,7 @@
This Web Capture is not associated with any fatcat release.
{% endif %}
-<br>
-<h3>Archive URLs</h3>
+<h3>Public Archive URLs</h3>
{% if webcapture.archive_urls != None %}
<table class="ui very basic compact single line fixed table">
<tbody>
@@ -42,7 +41,7 @@ No known public archive for this webcapture.
{% endif %}
-<h3>CDX Rows ({{ webcapture.cdx|count }})</h3>
+<h3>Captured Resources ({{ webcapture.cdx|count }})</h3>
{% if webcapture.cdx %}
<div class="ui celled list">
{% for row in webcapture.cdx %}
@@ -53,7 +52,7 @@ No known public archive for this webcapture.
</div>
<div style="margin-left: 1em;">
{{ row.timestamp.strftime("%Y-%m-%d %H:%M:%S") }}
- {% if row.mimetype %}| {{ row.mimetype }} {% endif %}
+ {% if row.mimetype %}| <code style="font-size: smaller;">{{ row.mimetype }}</code> {% endif %}
{% if row.size %}| {{ row.size|filesizeformat }} {% endif %}
<br>
<code><small style="color: #666;">
@@ -73,11 +72,13 @@ This web capture is empty (contains no resources).
<div class="column" style="flex: 0 0 24em;">
{% if webcapture.state == 'active' and webcapture.archive_urls != [] and webcapture.archive_urls[0].rel == "wayback" %}
-<a href="{{ webcapture.archive_urls[0].url }}{{ webcapture._wayback_suffix }}" class="ui top attached fluid huge green button"><i class="file archive outline icon"></i>View Web Archive</a>
+ <a href="{{ webcapture.archive_urls[0].url }}{{ webcapture._wayback_suffix }}" class="ui fluid huge black button" style="text-decoration: underline;">
+ <i class="university icon"></i>View Web Archive
+ </a>
{% endif %}
{% if webcapture.timestamp != None %}
-<div class="ui segment attached">
+<div class="ui segment top attached">
<p><b>Capture Time</b> &nbsp;{{ webcapture.timestamp.strftime("%Y-%m-%d %H:%M:%S") }}
</div>
{% endif %}
diff --git a/python/fatcat_web/web_config.py b/python/fatcat_web/web_config.py
index 22a704d9..5d2da830 100644
--- a/python/fatcat_web/web_config.py
+++ b/python/fatcat_web/web_config.py
@@ -60,6 +60,9 @@ class Config(object):
WTF_CSRF_CHECK_DEFAULT = False
WTF_CSRF_TIME_LIMIT = None
+ # for login redirects
+ USE_SESSION_FOR_NEXT = True
+
if FATCAT_DOMAIN == "dev.fatcat.wiki":
# "Even more verbose" debug options
#SQLALCHEMY_ECHO = True