diff --git a/app/contributions/routes.py b/app/contributions/routes.py index 1466444c3d1660cd2b0c5a2e8c121629d261ee54..79ed3fa84d38339adbe7c73ad508649d35c01fdc 100644 --- a/app/contributions/routes.py +++ b/app/contributions/routes.py @@ -32,6 +32,14 @@ def contributions(): ) +@bp.route('/tesseract-ocr-pipeline-models') +def tesseract_ocr_pipeline_models(): + return render_template( + 'contributions/tesseract_ocr_pipeline_models.html.j2', + title='Tesseract OCR Pipeline Models' + ) + + @bp.route('/tesseract-ocr-pipeline-models/<hashid:tesseract_ocr_pipeline_model_id>', methods=['GET', 'POST']) def tesseract_ocr_pipeline_model(tesseract_ocr_pipeline_model_id): tesseract_ocr_pipeline_model = TesseractOCRPipelineModel.query.get_or_404(tesseract_ocr_pipeline_model_id) @@ -127,6 +135,14 @@ def create_tesseract_ocr_pipeline_model(): ) +@bp.route('/spacy-nlp-pipeline-models') +def spacy_nlp_pipeline_models(): + return render_template( + 'contributions/spacy_nlp_pipeline_models.html.j2', + title='SpaCy NLP Pipeline Models' + ) + + @bp.route('/spacy-nlp-pipeline-models/<hashid:spacy_nlp_pipeline_model_id>', methods=['GET', 'POST']) def spacy_nlp_pipeline_model(spacy_nlp_pipeline_model_id): spacy_nlp_pipeline_model = SpaCyNLPPipelineModel.query.get_or_404(spacy_nlp_pipeline_model_id) diff --git a/app/corpora/query_results_forms.py b/app/corpora/query_results_forms.py deleted file mode 100644 index bb55e5132ff23afd083bfae7292e29992b694905..0000000000000000000000000000000000000000 --- a/app/corpora/query_results_forms.py +++ /dev/null @@ -1,21 +0,0 @@ -from flask_wtf import FlaskForm -from werkzeug.utils import secure_filename -from wtforms import FileField, StringField, SubmitField, ValidationError -from wtforms.validators import DataRequired, Length - - -class AddQueryResultForm(FlaskForm): - ''' - Form used to import one result json file. - ''' - description = StringField('Description', - validators=[DataRequired(), Length(1, 255)]) - file = FileField('File', validators=[DataRequired()]) - title = StringField('Title', validators=[DataRequired(), Length(1, 32)]) - submit = SubmitField() - - def validate_file(self, field): - if not field.data.filename.lower().endswith('.json'): - raise ValidationError('File does not have an approved extension: ' - '.json') - field.data.filename = secure_filename(field.data.filename) diff --git a/app/corpora/query_results_routes.py b/app/corpora/query_results_routes.py deleted file mode 100644 index 6c22e11efdcad32859216ee1d918f1b41f743718..0000000000000000000000000000000000000000 --- a/app/corpora/query_results_routes.py +++ /dev/null @@ -1,135 +0,0 @@ -from flask import (abort, current_app, flash, make_response, redirect, request, - render_template, url_for, send_from_directory) -from flask_login import current_user, login_required -from . import bp -from . import tasks -from .forms import (AddQueryResultForm, DisplayOptionsForm, - InspectDisplayOptionsForm) -from .. import db -from ..models import QueryResult -import json -import os - - -@bp.route('/result/add', methods=['GET', 'POST']) -@login_required -def add_query_result(): - ''' - View to import a result as a json file. - ''' - abort(503) - form = AddQueryResultForm(prefix='add-query-result-form') - if form.is_submitted(): - if not form.validate(): - return make_response(form.errors, 400) - query_result = QueryResult(user=current_user, - description=form.description.data, - filename=form.file.data.filename, - title=form.title.data) - db.session.add(query_result) - db.session.flush() - db.session.refresh(query_result) - try: - os.makedirs(os.path.dirname(query_result.path)) - except OSError: - current_app.logger.error( - f'Make dir {query_result.path} led to an OSError!') - db.session.rollback() - flash('Internal Server Error', 'error') - return make_response( - {'redirect_url': url_for('.add_query_result')}, 500) - # save the uploaded file - form.file.data.save(query_result.path) - # parse json from file - with open(query_result.path, 'r') as file: - query_result_file_content = json.load(file) - # parse json schema - # with open('app/static/json_schema/nopaque_cqi_py_results_schema.json', 'r') as file: # noqa - # schema = json.load(file) - # try: - # # validate imported json file - # validate(instance=query_result_file_content, schema=schema) - # except Exception: - # tasks.delete_query_result(query_result.id) - # flash('Uploaded file is invalid', 'result') - # return make_response( - # {'redirect_url': url_for('.add_query_result')}, 201) - query_result_file_content.pop('matches') - query_result_file_content.pop('cpos_lookup') - query_result.query_metadata = query_result_file_content - db.session.commit() - flash('Query result added', 'result') - return make_response({'redirect_url': url_for('.query_result', query_result_id=query_result.id)}, 201) # noqa - return render_template('corpora/query_results/add_query_result.html.j2', - form=form, title='Add query result') - - -@bp.route('/result/<hashid:query_result_id>') -@login_required -def query_result(query_result_id): - abort(503) - query_result = QueryResult.query.get_or_404(query_result_id) - if not (query_result.user == current_user - or current_user.is_administrator()): - abort(403) - return render_template('corpora/query_results/query_result.html.j2', - query_result=query_result, title='Query result') - - -@bp.route('/result/<hashid:query_result_id>/inspect') -@login_required -def inspect_query_result(query_result_id): - ''' - View to inspect imported result file in a corpus analysis like interface - ''' - abort(503) - query_result = QueryResult.query.get_or_404(query_result_id) - query_metadata = query_result.query_metadata - if not (query_result.user == current_user - or current_user.is_administrator()): - abort(403) - display_options_form = DisplayOptionsForm( - prefix='display-options-form', - results_per_page=request.args.get('results_per_page', 30), - result_context=request.args.get('context', 20) - ) - inspect_display_options_form = InspectDisplayOptionsForm( - prefix='inspect-display-options-form' - ) - with open(query_result.path, 'r') as query_result_file: - query_result_file_content = json.load(query_result_file) - return render_template( - 'corpora/query_results/inspect.html.j2', - query_result=query_result, - display_options_form=display_options_form, - inspect_display_options_form=inspect_display_options_form, # noqa - query_result_file_content=query_result_file_content, - query_metadata=query_metadata, - title='Inspect query result' - ) - - -@bp.route('/result/<hashid:query_result_id>/delete') -@login_required -def delete_query_result(query_result_id): - abort(503) - query_result = QueryResult.query.get_or_404(query_result_id) - if not (query_result.user == current_user - or current_user.is_administrator()): - abort(403) - flash(f'Query result "{query_result}" marked for deletion', 'result') - tasks.delete_query_result(query_result_id) - return redirect(url_for('services.service', service="corpus_analysis")) - - -@bp.route('/result/<hashid:query_result_id>/download') -@login_required -def download_query_result(query_result_id): - abort(503) - query_result = QueryResult.query.get_or_404(query_result_id) - if not (query_result.user == current_user - or current_user.is_administrator()): - abort(403) - return send_from_directory(as_attachment=True, - directory=os.path.dirname(query_result.path), - filename=query_result.filename) diff --git a/app/corpora/query_results_tasks.py b/app/corpora/query_results_tasks.py deleted file mode 100644 index 653096b3a36e5a0c17d0af749bb760092d761a89..0000000000000000000000000000000000000000 --- a/app/corpora/query_results_tasks.py +++ /dev/null @@ -1,13 +0,0 @@ -from .. import db -from ..decorators import background -from ..models import QueryResult - - -@background -def delete_query_result(query_result_id, *args, **kwargs): - with kwargs['app'].app_context(): - query_result = QueryResult.query.get(query_result_id) - if query_result is None: - raise Exception(f'QueryResult {query_result_id} not found') - query_result.delete() - db.session.commit() diff --git a/app/static/js/RessourceLists/QueryResultList.js b/app/static/js/RessourceLists/QueryResultList.js deleted file mode 100644 index cffc43181ed04f9ddcdefcb10ec2ca3128a73fcf..0000000000000000000000000000000000000000 --- a/app/static/js/RessourceLists/QueryResultList.js +++ /dev/null @@ -1,134 +0,0 @@ -class QueryResultList extends RessourceList { - static autoInit() { - for (let queryResultListElement of document.querySelectorAll('.query-result-list:not(.no-autoinit)')) { - new QueryResultList(queryResultListElement); - } - } - - static options = { - item: ` - <tr class="hoverable"> - <td><b class="title"></b><br><i class="description"></i><br></td> - <td><span class="corpus-title"></span><br><span class="query"></span></td> - <td class="right-align"> - <a class="action-button btn-floating red waves-effect waves-light" data-action="delete"><i class="material-icons">delete</i></a> - <a class="action-button btn-floating waves-effect waves-light" data-action="view"><i class="material-icons">send</i></a> - </td> - </tr> - `.trim(), - ressourceMapper: queryResult => { - return { - 'id': queryResult.id, - 'corpus-title': queryResult.corpus_title, - 'creation-date': queryResult.creation_date, - 'description': queryResult.description, - 'query': queryResult.query, - 'title': queryResult.title - }; - }, - sortArgs: ['creation-date', {order: 'desc'}], - valueNames: [ - {data: ['id']}, - {data: ['creation-date']}, - 'corpus-title', - 'description', - 'query', - 'title' - ] - }; - - constructor(listElement, options = {}) { - super(listElement, {...QueryResultList.options, ...options}); - } - - init(user) { - super._init(user.query_results); - } - - onclick(event) { - let action; - let actionButtonElement; - let deleteModal; - let deleteModalElement; - let queryResultElement; - let queryResultId; - let tmp; - - queryResultElement = event.target.closest('tr[data-id]'); - if (queryResultElement === null) {return;} - queryResultId = queryResultElement.dataset.id; - actionButtonElement = event.target.closest('.action-button[data-action]'); - action = actionButtonElement === null ? 'view' : actionButtonElement.dataset.action; - switch (action) { - case 'delete': - tmp = document.createElement('div'); - tmp.innerHTML = ` - <div class="modal"> - <div class="modal-content"> - <h4>Confirm query result deletion</h4> - <p>Do you really want to delete the query result <b>${app.users[this.userId].query_results[queryResultId].title}</b>? It will be permanently deleted!</p> - </div> - <div class="modal-footer"> - <a href="#!" class="btn modal-close waves-effect waves-light">Cancel</a> - <a class="btn modal-close red waves-effect waves-light" href="/query_results/${queryResultId}/delete"><i class="material-icons left">delete</i>Delete</a> - </div> - </div> - `.trim(); - deleteModalElement = document.querySelector('#modals').appendChild(tmp.firstChild); - deleteModal = M.Modal.init( - deleteModalElement, - { - onCloseEnd: () => { - deleteModal.destroy(); - deleteModalElement.remove(); - } - } - ); - deleteModal.open(); - break; - case 'view': - window.location.href = `/query_results/${queryResultId}`; - break; - default: - break; - } - } - - onPATCH(patch) { - let filteredPatch; - let match; - let operation; - let queryResultId; - let re; - let valueName; - - re = new RegExp(`^/users/${this.userId}/query_results/([A-Za-z0-9]*)`); - filteredPatch = patch.filter(operation => re.test(operation.path)); - for (operation of filteredPatch) { - switch(operation.op) { - case 'add': - re = new RegExp(`^/users/${this.userId}/query_results/([A-Za-z0-9]*)$`); - if (re.test(operation.path)) { - this.add(operation.value); - } - break; - case 'remove': - re = new RegExp(`^/users/${this.userId}/query_results/([A-Za-z0-9]*)$`); - if (re.test(operation.path)) { - [match, queryResultId] = operation.path.match(re); - this.remove(queryResultId); - } - break; - case 'replace': - re = new RegExp(`^/users/${this.userId}/query_results/([A-Za-z0-9]*)/(corpus_title|description|query|title)$`); - if (re.test(operation.path)) { - [match, queryResultId, valueName] = operation.path.match(re); - this.replace(queryResultId, valueName.replace('_', '-'), operation.value); - } - break; - default: - break; - } - } - } -} diff --git a/app/static/js/RessourceLists/RessourceList.js b/app/static/js/RessourceLists/RessourceList.js index a22420545ffe053ce56671e8279103580197756e..871a1e2f89cb6286d860ce559da81fbba43453a5 100644 --- a/app/static/js/RessourceLists/RessourceList.js +++ b/app/static/js/RessourceLists/RessourceList.js @@ -10,9 +10,8 @@ class RessourceList { JobList.autoInit(); JobInputList.autoInit(); JobResultList.autoInit(); - SpacyNLPPipelineModelList.autoInit(); + SpaCyNLPPipelineModelList.autoInit(); TesseractOCRPipelineModelList.autoInit(); - QueryResultList.autoInit(); UserList.autoInit(); } diff --git a/app/static/js/RessourceLists/SpacyNLPPipelineModelList.js b/app/static/js/RessourceLists/SpacyNLPPipelineModelList.js index fcc68a0d3a62ddbb12107a62ec95e923ecc434cc..9a760be0684f11e8d144dd6769f8659257baa816 100644 --- a/app/static/js/RessourceLists/SpacyNLPPipelineModelList.js +++ b/app/static/js/RessourceLists/SpacyNLPPipelineModelList.js @@ -1,7 +1,7 @@ -class SpacyNLPPipelineModelList extends RessourceList { +class SpaCyNLPPipelineModelList extends RessourceList { static autoInit() { for (let spaCyNLPPipelineModelListElement of document.querySelectorAll('.spacy-nlp-pipeline-model-list:not(.no-autoinit)')) { - new SpacyNLPPipelineModelList(spaCyNLPPipelineModelListElement); + new SpaCyNLPPipelineModelList(spaCyNLPPipelineModelListElement); } } @@ -70,7 +70,7 @@ class SpacyNLPPipelineModelList extends RessourceList { }; constructor(listElement, options = {}) { - super(listElement, {...SpacyNLPPipelineModelList.options, ...options}); + super(listElement, {...SpaCyNLPPipelineModelList.options, ...options}); } init (user) { diff --git a/app/static/js/Utils.js b/app/static/js/Utils.js index e6076e43b36d09ce29382add3509b685b32ccbe4..4a2740549e574bda8ba8034030547bdada56feb7 100644 --- a/app/static/js/Utils.js +++ b/app/static/js/Utils.js @@ -33,8 +33,8 @@ class Utils { ` <div class="modal"> <div class="modal-content"> - <h4>Confirm job deletion</h4> - <p>Do you really want to delete the job <b>${corpus.title}</b>? All files will be permanently deleted!</p> + <h4>Confirm Corpus deletion</h4> + <p>Do you really want to delete the Corpus <b>${corpus.title}</b>? All files will be permanently deleted!</p> </div> <div class="modal-footer"> <a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a> @@ -230,8 +230,8 @@ class Utils { ` <div class="modal"> <div class="modal-content"> - <h4>Confirm job deletion</h4> - <p>Do you really want to delete the job <b>${job.title}</b>? All files will be permanently deleted!</p> + <h4>Confirm Job deletion</h4> + <p>Do you really want to delete the Job <b>${job.title}</b>? All files will be permanently deleted!</p> </div> <div class="modal-footer"> <a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a> @@ -327,8 +327,8 @@ class Utils { ` <div class="modal"> <div class="modal-content"> - <h4>Confirm job restart</h4> - <p>Do you really want to restart the job <b>${job.title}</b>? All log and result files will be permanently deleted.</p> + <h4>Confirm Job restart</h4> + <p>Do you really want to restart the Job <b>${job.title}</b>? All Job Results will be permanently deleted.</p> </div> <div class="modal-footer"> <a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a> @@ -378,8 +378,8 @@ class Utils { ` <div class="modal"> <div class="modal-content"> - <h4>Confirm job deletion</h4> - <p>Do you really want to delete the user <b>${user.username}</b>? All files will be permanently deleted!</p> + <h4>Confirm User deletion</h4> + <p>Do you really want to delete the User <b>${user.username}</b>? All files will be permanently deleted!</p> </div> <div class="modal-footer"> <a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a> diff --git a/app/templates/_scripts.html.j2 b/app/templates/_scripts.html.j2 index 49a4d69faae3391cc796d584537ea7dbaade1ff6..323c576cfac70b167924cc32bf6bf935462051cb 100644 --- a/app/templates/_scripts.html.j2 +++ b/app/templates/_scripts.html.j2 @@ -26,7 +26,6 @@ 'js/RessourceLists/JobResultList.js', 'js/RessourceLists/SpacyNLPPipelineModelList.js', 'js/RessourceLists/TesseractOCRPipelineModelList.js', - 'js/RessourceLists/QueryResultList.js', 'js/RessourceLists/UserList.js' %} <script src="{{ ASSET_URL }}"></script> diff --git a/app/templates/contributions/contributions.html.j2 b/app/templates/contributions/contributions.html.j2 index da2cdcad41b2922dc09021a99811baebf05ea508..64f1fac67ac0a7f7faeff252af596308767d551e 100644 --- a/app/templates/contributions/contributions.html.j2 +++ b/app/templates/contributions/contributions.html.j2 @@ -7,42 +7,34 @@ <div class="row"> <div class="col s12"> <h1 id="title">{{ title }}</h1> + </div> - {# Tesseract OCR Models #} - <div> - <h3>My Tesseract OCR Pipeline Models</h3> - <p>Here you can see and edit the models that you have created. You can also create new models.</p> + <div class="col s4"> + <div class="card extension-selector hoverable service-color" data-service="tesseract-ocr-pipeline"> + <a href="{{ url_for('.tesseract_ocr_pipeline_models') }}" style="position: absolute; width: 100%; height: 100%;"></a> + <div class="card-content"> + <span class="card-title" data-service="tesseract-ocr-pipeline"><i class="nopaque-icons service-icon" data-service="tesseract-ocr-pipeline"></i>Tesseract OCR Pipeline Models</span> + <p>Here you can see and edit the models that you have created. You can also create new models.</p> + </div> + </div> + </div> - <div class="row"> - <div class="col s12"> - <div class="card"> - <div class="card-content"> - <div class="tesseract-ocr-pipeline-model-list" data-user-id="{{ current_user.hashid }}"></div> - </div> - <div class="card-action right-align"> - <a href="{{ url_for('.create_tesseract_ocr_pipeline_model') }}" class="btn waves-effect waves-light"><i class="material-icons left">add</i>Create</a> - </div> - </div> - </div> + <div class="col s4"> + <div class="card extension-selector hoverable service-color" data-service="spacy-nlp-pipeline"> + <a href="{{ url_for('.spacy_nlp_pipeline_models') }}" style="position: absolute; width: 100%; height: 100%;"></a> + <div class="card-content"> + <span class="card-title"><i class="nopaque-icons service-icon" data-service="spacy-nlp-pipeline"></i>SpaCy NLP Pipeline Models</span> + <p>Here you can see and edit the models that you have created. You can also create new models.</p> </div> </div> - - {# spaCy NLP Models #} - <div> - <h3>My spaCy NLP Pipeline Models</h3> - <p>Here you can see and edit the models that you have created. You can also create new models.</p> + </div> - <div class="row"> - <div class="col s12"> - <div class="card"> - <div class="card-content"> - <div class="spacy-nlp-pipeline-model-list" data-user-id="{{ current_user.hashid }}"></div> - </div> - <div class="card-action right-align"> - <a href="{{ url_for('.create_spacy_nlp_pipeline_model') }}" class="btn waves-effect waves-light"><i class="material-icons left">add</i>Create</a> - </div> - </div> - </div> + <div class="col s4"> + <div class="card extension-selector hoverable service-color" data-service="transkribus-htr-pipeline"> + <a href="" style="position: absolute; width: 100%; height: 100%;"></a> + <div class="card-content"> + <span class="card-title"><i class="nopaque-icons service-icon" data-service="transkribus-htr-pipeline"></i>Transkribus HTR Pipeline Models</span> + <p>Here you can see and edit the models that you have created. You can also create new models.</p> </div> </div> </div> diff --git a/app/templates/contributions/spacy_nlp_pipeline_models.html.j2 b/app/templates/contributions/spacy_nlp_pipeline_models.html.j2 new file mode 100644 index 0000000000000000000000000000000000000000..f3c7a40ee113b0c49893f6fedc0d8b5312082a6f --- /dev/null +++ b/app/templates/contributions/spacy_nlp_pipeline_models.html.j2 @@ -0,0 +1,25 @@ +{% extends "base.html.j2" %} +{% import "materialize/wtf.html.j2" as wtf %} +{% from "contributions/_breadcrumbs.html.j2" import breadcrumbs with context %} + +{% block page_content %} +<div class="container"> + <div class="row"> + <div class="col s12"> + <h1 id="title">{{ title }}</h1> + <p>Here you can see and edit the models that you have created. You can also create new models.</p> + </div> + + <div class="col s12"> + <div class="card"> + <div class="card-content"> + <div class="spacy-nlp-pipeline-model-list" data-user-id="{{ current_user.hashid }}"></div> + </div> + <div class="card-action right-align"> + <a href="{{ url_for('.create_spacy_nlp_pipeline_model') }}" class="btn waves-effect waves-light"><i class="material-icons left">add</i>Create</a> + </div> + </div> + </div> + </div> +</div> +{% endblock page_content %} diff --git a/app/templates/contributions/tesseract_ocr_pipeline_models.html.j2 b/app/templates/contributions/tesseract_ocr_pipeline_models.html.j2 new file mode 100644 index 0000000000000000000000000000000000000000..3d43d72769ba5204c528102294648ec5e06524bf --- /dev/null +++ b/app/templates/contributions/tesseract_ocr_pipeline_models.html.j2 @@ -0,0 +1,25 @@ +{% extends "base.html.j2" %} +{% import "materialize/wtf.html.j2" as wtf %} +{% from "contributions/_breadcrumbs.html.j2" import breadcrumbs with context %} + +{% block page_content %} +<div class="container"> + <div class="row"> + <div class="col s12"> + <h1 id="title">{{ title }}</h1> + <p>Here you can see and edit the models that you have created. You can also create new models.</p> + </div> + + <div class="col s12"> + <div class="card"> + <div class="card-content"> + <div class="tesseract-ocr-pipeline-model-list" data-user-id="{{ current_user.hashid }}"></div> + </div> + <div class="card-action right-align"> + <a href="{{ url_for('.create_tesseract_ocr_pipeline_model') }}" class="btn waves-effect waves-light"><i class="material-icons left">add</i>Create</a> + </div> + </div> + </div> + </div> +</div> +{% endblock page_content %} diff --git a/app/templates/corpora/analyse_corpus.html.j2 b/app/templates/corpora/analyse_corpus.html.j2 index 779eafd4e707a92d450bacf0639ddd9b391e4464..73ebfd774f0420c7a11e36ad1b0e692399a11dac 100644 --- a/app/templates/corpora/analyse_corpus.html.j2 +++ b/app/templates/corpora/analyse_corpus.html.j2 @@ -1,9 +1,5 @@ {% extends "base.html.j2" %} {% import "materialize/wtf.html.j2" as wtf %} -<style> - a {color: #FFFFFF;} -</style> - {% block main_attribs %} class="service-scheme" data-service="corpus-analysis" id="corpus-analysis-app-container"{% endblock main_attribs %} {% block page_content %} diff --git a/app/templates/main/dashboard.html.j2 b/app/templates/main/dashboard.html.j2 index 0d15651763e1eb99d39cd50cf792a1c1adf9af13..ec03609d0c41a56020d0c0a134793512a8cfd255 100644 --- a/app/templates/main/dashboard.html.j2 +++ b/app/templates/main/dashboard.html.j2 @@ -6,27 +6,18 @@ <div class="row"> <div class="col s12"> <h1 id="title">{{ title }}</h1> + </div> - <h3>My Corpora and Query results</h3> - <p>Create a corpus to interactively perform linguistic analysis or import query results to save interesting passages.</p> - - <div class="row"> - <div class="col s12"> - <ul class="tabs"> - <li class="tab col s6"><a class="active" href="#corpora">Corpora</a></li> - <li class="tab col s6 disabled"><a href="#query-results">Query results</a></li> - </ul> + <div class="col s12" id="corpora"> + <h3>My Corpora</h3> + <p>Create a corpus to interactively perform linguistic analysis.</p> + <div class="card"> + <div class="card-content"> + <div class="corpus-list" data-user-id="{{ current_user.hashid }}"></div> </div> - <div class="col s12" id="corpora"> - <div class="card"> - <div class="card-content"> - <div class="corpus-list" data-user-id="{{ current_user.hashid }}"></div> - </div> - <div class="card-action right-align"> - <a class="btn disabled waves-effect waves-light" href="{{ url_for('corpora.import_corpus') }}">Import Corpus<i class="material-icons right">import_export</i></a> - <a class="btn waves-effect waves-light" href="{{ url_for('corpora.create_corpus') }}">Create corpus<i class="material-icons right">add</i></a> - </div> - </div> + <div class="card-action right-align"> + <a class="btn disabled waves-effect waves-light" href="{{ url_for('corpora.import_corpus') }}">Import Corpus<i class="material-icons right">import_export</i></a> + <a class="btn waves-effect waves-light" href="{{ url_for('corpora.create_corpus') }}">Create corpus<i class="material-icons right">add</i></a> </div> </div> </div> diff --git a/app/templates/services/spacy_nlp_pipeline.html.j2 b/app/templates/services/spacy_nlp_pipeline.html.j2 index 5ad1e97a9806223fbc55e55e711e893d740aa79d..219ac025b076eedf0b7d09c4ee651f966b3839f5 100644 --- a/app/templates/services/spacy_nlp_pipeline.html.j2 +++ b/app/templates/services/spacy_nlp_pipeline.html.j2 @@ -77,7 +77,7 @@ {{ form.model.label }} <span class="helper-text"> <a class="modal-trigger tooltipped" href="#models-modal" data-position="bottom" data-tooltip="See more information about models"><i class="material-icons" style="color:#0064A3;">help_outline</i></a> - <a class="tooltipped" href="{{ url_for('contributions.add_spacy_nlp_pipeline_model') }}" data-position="bottom" data-tooltip="Add your own spaCy NLP models"><i class="material-icons" style="color:#0064A3">new_label</i></a> + <a class="tooltipped" href="{{ url_for('contributions.create_spacy_nlp_pipeline_model') }}" data-position="bottom" data-tooltip="Add your own spaCy NLP models"><i class="material-icons" style="color:#0064A3">new_label</i></a> </span> </div> </div> diff --git a/app/templates/services/tesseract_ocr_pipeline.html.j2 b/app/templates/services/tesseract_ocr_pipeline.html.j2 index 29ff60e8b1079c4b2576d4c13bb6bdcf91e0ba5e..9114b729e2635574ed0e65cc09257179210395e2 100644 --- a/app/templates/services/tesseract_ocr_pipeline.html.j2 +++ b/app/templates/services/tesseract_ocr_pipeline.html.j2 @@ -59,7 +59,7 @@ {{ form.model.label }} <span class="helper-text"> <a class="modal-trigger tooltipped" href="#models-modal" data-position="bottom" data-tooltip="See more information about models"><i class="material-icons" style="color:#00A58B;">help_outline</i></a> - <a class="tooltipped" href="{{ url_for('contributions.add_tesseract_ocr_pipeline_model') }}" data-position="bottom" data-tooltip="Add your own Tesseract OCR models"><i class="material-icons" style="color:#00A58B">new_label</i></a> + <a class="tooltipped" href="{{ url_for('contributions.create_tesseract_ocr_pipeline_model') }}" data-position="bottom" data-tooltip="Add your own Tesseract OCR models"><i class="material-icons" style="color:#00A58B">new_label</i></a> </span> {% for error in form.model.errors %} <span class="helper-text error-color-text">{{ error }}</span>