libreqda 1.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- CHANGELOG.md +481 -0
- libreqda-1.2.0.dist-info/LICENSE.txt +28 -0
- libreqda-1.2.0.dist-info/METADATA +131 -0
- libreqda-1.2.0.dist-info/RECORD +255 -0
- libreqda-1.2.0.dist-info/WHEEL +4 -0
- libreqda-1.2.0.dist-info/entry_points.txt +4 -0
- scripts/babelrc +8 -0
- scripts/dist/LICENSE.txt +33 -0
- scripts/dist/RELEASE.txt +23 -0
- scripts/dist/macos/libreqda.icns +0 -0
- scripts/dist/macos/macos.spec +43 -0
- scripts/dist/macos/plist.patch +10 -0
- scripts/dist/macos/taguette.icns +0 -0
- scripts/dist/macos/taguette_console_wrapper +4 -0
- scripts/dist/macos.sh +32 -0
- scripts/dist/pyinstaller_entrypoint.py +19 -0
- scripts/dist/windows/windows-installer.iss +51 -0
- scripts/dist/windows/windows.spec +39 -0
- scripts/edugain/worker_update_edugain_idps.py +89 -0
- scripts/edugain/worker_update_edugain_idps.sh +9 -0
- scripts/make_password_reset_link.py +56 -0
- scripts/make_theme.py +99 -0
- scripts/new_db_revision.sh +8 -0
- scripts/register_user.py +76 -0
- scripts/update_pot.sh +33 -0
- scripts/update_translations.sh +17 -0
- scripts/validate.py +140 -0
- scripts/wipe_and_disable_user.py +90 -0
- taguette/__init__.py +13 -0
- taguette/access_control.py +145 -0
- taguette/convert.py +623 -0
- taguette/database/__init__.py +177 -0
- taguette/database/base.py +9 -0
- taguette/database/copy.py +433 -0
- taguette/database/models.py +920 -0
- taguette/demodata.py +688 -0
- taguette/export.py +500 -0
- taguette/extract.py +287 -0
- taguette/import_codebook.py +110 -0
- taguette/l10n/de_DE/LC_MESSAGES/taguette_javascript.mo +0 -0
- taguette/l10n/de_DE/LC_MESSAGES/taguette_main.mo +0 -0
- taguette/l10n/el_EL/LC_MESSAGES/taguette_javascript.mo +0 -0
- taguette/l10n/el_GR/LC_MESSAGES/taguette_javascript.mo +0 -0
- taguette/l10n/el_GR/LC_MESSAGES/taguette_main.mo +0 -0
- taguette/l10n/en_US/LC_MESSAGES/taguette_javascript.mo +0 -0
- taguette/l10n/en_US/LC_MESSAGES/taguette_main.mo +0 -0
- taguette/l10n/es_ES/LC_MESSAGES/taguette_javascript.mo +0 -0
- taguette/l10n/es_ES/LC_MESSAGES/taguette_main.mo +0 -0
- taguette/l10n/fr_FR/LC_MESSAGES/taguette_javascript.mo +0 -0
- taguette/l10n/fr_FR/LC_MESSAGES/taguette_main.mo +0 -0
- taguette/l10n/id_ID/LC_MESSAGES/taguette_javascript.mo +0 -0
- taguette/l10n/id_ID/LC_MESSAGES/taguette_main.mo +0 -0
- taguette/l10n/it_IT/LC_MESSAGES/taguette_javascript.mo +0 -0
- taguette/l10n/it_IT/LC_MESSAGES/taguette_main.mo +0 -0
- taguette/l10n/nl_NL/LC_MESSAGES/taguette_javascript.mo +0 -0
- taguette/l10n/nl_NL/LC_MESSAGES/taguette_main.mo +0 -0
- taguette/l10n/pt_PT/LC_MESSAGES/taguette_javascript.mo +0 -0
- taguette/l10n/pt_PT/LC_MESSAGES/taguette_main.mo +0 -0
- taguette/l10n/sv_SE/LC_MESSAGES/taguette_javascript.mo +0 -0
- taguette/l10n/sv_SE/LC_MESSAGES/taguette_main.mo +0 -0
- taguette/loki_handler.py +107 -0
- taguette/main.py +649 -0
- taguette/migrations/env.py +72 -0
- taguette/migrations/script.py.mako +24 -0
- taguette/migrations/versions/09c662cd9483_make_documents_filename_not_null.py +39 -0
- taguette/migrations/versions/1b29e68900c1_add_user_roles.py +55 -0
- taguette/migrations/versions/1b96a606551d_update_user_to_have_a_display_name.py +34 -0
- taguette/migrations/versions/2467bab602b7_add_color_column_to_tags_table.py +33 -0
- taguette/migrations/versions/382db36f20f4_add_user_disabled.py +66 -0
- taguette/migrations/versions/43d6c240309d_remove_document_groups.py +81 -0
- taguette/migrations/versions/447d636f72c5_cascades.py +40 -0
- taguette/migrations/versions/491de2dc7cd7_add_indexes.py +51 -0
- taguette/migrations/versions/4c55b3b3ff30_user_login_length.py +58 -0
- taguette/migrations/versions/61a4abcc8769_user_with_parent_for_permissions.py +40 -0
- taguette/migrations/versions/6489b5f9cfb5_increase_password_hash_size.py +34 -0
- taguette/migrations/versions/679f625e6e6a_fix_unique_tags.py +59 -0
- taguette/migrations/versions/77c4543a5b9b_add_parent_id_column_to_collection_table.py +41 -0
- taguette/migrations/versions/7c94b7a31e69_add_is_archived_column_to_projets.py +39 -0
- taguette/migrations/versions/7f56de97e3c8_change_edugain_displayname_length.py +42 -0
- taguette/migrations/versions/807c0cc0ecf6_remove_invalid_hltags.py +43 -0
- taguette/migrations/versions/80b1cc9d4c22_add_user_email.py +35 -0
- taguette/migrations/versions/91ade71ccf4d_add_user_language.py +28 -0
- taguette/migrations/versions/955db2e523d1_add_collections_tables_and_associations_.py +60 -0
- taguette/migrations/versions/a1b2c3d4e5f6_add_user_hide_code_counts.py +28 -0
- taguette/migrations/versions/b23f3b7a638e_add_user_password_change_date.py +36 -0
- taguette/migrations/versions/b7c1e2d3f4a5_add_project_compact_layout.py +28 -0
- taguette/migrations/versions/bc8e0e0677e9_rename_command_fields.py +126 -0
- taguette/migrations/versions/bce44849c2f2_lowercase_logins.py +96 -0
- taguette/migrations/versions/ca076140922f_update_user_for_external_logins.py +32 -0
- taguette/migrations/versions/d86c45d7aa8a_add_document_direction.py +127 -0
- taguette/migrations/versions/db5e31a0233d_remove_blank_highlights.py +88 -0
- taguette/migrations/versions/dd37d9027a24_unique_tags.py +68 -0
- taguette/migrations/versions/de678cef2a94_add_project_id_to_collections_and_.py +41 -0
- taguette/migrations/versions/e459991d960e_add_table_edugainidps.py +39 -0
- taguette/migrations/versions/e4cf92942271_add_index.py +29 -0
- taguette/migrations/versions/e4e090a5b511_remove_commands_document_id_fk.py +38 -0
- taguette/migrations/versions/e9a9f1c77971_add_favorite_column_to_document.py +32 -0
- taguette/migrations/versions/ecb4065de575_don_t_use_server_default_now_timezone_.py +44 -0
- taguette/migrations/versions/fbdc29566f62_edugain_fix_field_type.py +42 -0
- taguette/migrations/versions/fdc6eb54b034_add_parent_id_column_to_tags_table.py +31 -0
- taguette/static/README.md +34 -0
- taguette/static/alt_templates/.gitkeep +0 -0
- taguette/static/assets/test/logos/monsters-university-logo.png +0 -0
- taguette/static/css/custom.css +1696 -0
- taguette/static/css/fa-all.min.css +5 -0
- taguette/static/css/themed.css +3 -0
- taguette/static/css/themed.css.map +25 -0
- taguette/static/css/vendor/bootstrap-treeview.min.css +1 -0
- taguette/static/css/vendor/bootstrap.min.css +6 -0
- taguette/static/css/vendor/font/context-menu-icons.eot +0 -0
- taguette/static/css/vendor/font/context-menu-icons.ttf +0 -0
- taguette/static/css/vendor/font/context-menu-icons.woff +0 -0
- taguette/static/css/vendor/font/context-menu-icons.woff2 +0 -0
- taguette/static/css/vendor/hierarchy-select.min.css +1 -0
- taguette/static/css/vendor/introjs.min.css +2 -0
- taguette/static/css/vendor/jquery.contextMenu.min.css +16 -0
- taguette/static/favicon.ico +0 -0
- taguette/static/js/codebook-viz.js +428 -0
- taguette/static/js/collection/context-menu.js +180 -0
- taguette/static/js/collection/hierarchy-select.js +71 -0
- taguette/static/js/collection/manager.js +217 -0
- taguette/static/js/document/context-menu.js +92 -0
- taguette/static/js/document/custom-select.js +82 -0
- taguette/static/js/document/manager.js +943 -0
- taguette/static/js/document/treeview.js +593 -0
- taguette/static/js/highlight/README.md +18 -0
- taguette/static/js/highlight/crud.js +119 -0
- taguette/static/js/highlight/extracts.js +497 -0
- taguette/static/js/highlight/loader.js +109 -0
- taguette/static/js/highlight/renderer.js +405 -0
- taguette/static/js/login.js +15 -0
- taguette/static/js/permissions.js +153 -0
- taguette/static/js/polling-event.js +145 -0
- taguette/static/js/project/intro.js +524 -0
- taguette/static/js/project/manager.js +0 -0
- taguette/static/js/project/search.js +124 -0
- taguette/static/js/tag/context-menu.js +133 -0
- taguette/static/js/tag/explore-codes.js +400 -0
- taguette/static/js/tag/hierarchy-select.js +69 -0
- taguette/static/js/tag/manager.js +545 -0
- taguette/static/js/tag/treeview.js +613 -0
- taguette/static/js/taguette.js +1790 -0
- taguette/static/js/utilities.js +714 -0
- taguette/static/js/vendor/bootstrap-treeview-custum.js +421 -0
- taguette/static/js/vendor/bootstrap-treeview-custum.min.js +1 -0
- taguette/static/js/vendor/bootstrap-treeview-default.min.js +1 -0
- taguette/static/js/vendor/bootstrap.bundle.min.js +7 -0
- taguette/static/js/vendor/bootstrap.bundle.min.js.map +1 -0
- taguette/static/js/vendor/hierarchy-select.min.js +1 -0
- taguette/static/js/vendor/introjs.min.js +17 -0
- taguette/static/js/vendor/jquery-3.7.1.js +2 -0
- taguette/static/js/vendor/jquery.contextMenu.min.js +2 -0
- taguette/static/libreqda.ico +0 -0
- taguette/static/logo-h.png +0 -0
- taguette/static/logo.png +0 -0
- taguette/static/logo_blanc.png +0 -0
- taguette/static/missing.png +0 -0
- taguette/static/robots.txt +2 -0
- taguette/static/scss/components/_badge.scss +42 -0
- taguette/static/scss/components/_button.scss +169 -0
- taguette/static/scss/components/_checkbox.scss +40 -0
- taguette/static/scss/components/_context_menu.scss +28 -0
- taguette/static/scss/components/_custom_select.scss +150 -0
- taguette/static/scss/components/_dropdown.scss +43 -0
- taguette/static/scss/components/_form.scss +54 -0
- taguette/static/scss/components/_modal.scss +57 -0
- taguette/static/scss/components/_project_card.scss +163 -0
- taguette/static/scss/components/_tag.scss +308 -0
- taguette/static/scss/components/_treeview.scss +76 -0
- taguette/static/scss/custom.scss +809 -0
- taguette/static/scss/layout/_credits.scss +62 -0
- taguette/static/scss/layout/_footer.scss +6 -0
- taguette/static/scss/layout/_navigation.scss +165 -0
- taguette/static/scss/layout/_sidebar.scss +37 -0
- taguette/static/scss/themes/default/_variables.scss +103 -0
- taguette/static/scss/themes/default/theme.css +3 -0
- taguette/static/scss/themes/default/theme.css.map +26 -0
- taguette/static/scss/themes/default/theme.scss +4 -0
- taguette/static/webfonts/BadScript-OFL.txt +94 -0
- taguette/static/webfonts/BadScript.ttf +0 -0
- taguette/static/webfonts/Montserrat-Light.ttf +0 -0
- taguette/static/webfonts/Montserrat-OFL.txt +93 -0
- taguette/static/webfonts/fa-brands-400.eot +0 -0
- taguette/static/webfonts/fa-brands-400.svg +1184 -0
- taguette/static/webfonts/fa-brands-400.ttf +0 -0
- taguette/static/webfonts/fa-brands-400.woff +0 -0
- taguette/static/webfonts/fa-brands-400.woff2 +0 -0
- taguette/static/webfonts/fa-regular-400.eot +0 -0
- taguette/static/webfonts/fa-regular-400.svg +467 -0
- taguette/static/webfonts/fa-regular-400.ttf +0 -0
- taguette/static/webfonts/fa-regular-400.woff +0 -0
- taguette/static/webfonts/fa-regular-400.woff2 +0 -0
- taguette/static/webfonts/fa-solid-900.eot +0 -0
- taguette/static/webfonts/fa-solid-900.svg +2618 -0
- taguette/static/webfonts/fa-solid-900.ttf +0 -0
- taguette/static/webfonts/fa-solid-900.woff +0 -0
- taguette/static/webfonts/fa-solid-900.woff2 +0 -0
- taguette/templates/alt_templates/.gitkeep +0 -0
- taguette/templates/archived_projects.html +50 -0
- taguette/templates/auth/account.html +74 -0
- taguette/templates/auth/cilogon.login.html +89 -0
- taguette/templates/auth/email_reset_password.html +5 -0
- taguette/templates/auth/external_account.html +60 -0
- taguette/templates/auth/login.html +144 -0
- taguette/templates/auth/reset_password.html +27 -0
- taguette/templates/auth/token_needed.html +7 -0
- taguette/templates/base.html +209 -0
- taguette/templates/bug_report.html +158 -0
- taguette/templates/cookies_prompt.html +15 -0
- taguette/templates/downloads.html +127 -0
- taguette/templates/email_bug_report.txt +9 -0
- taguette/templates/email_reset_password.txt +5 -0
- taguette/templates/error.html +8 -0
- taguette/templates/export_codebook.html +20 -0
- taguette/templates/export_document.html +20 -0
- taguette/templates/export_highlights.html +47 -0
- taguette/templates/index.html +347 -0
- taguette/templates/maintenance.html +8 -0
- taguette/templates/messages.js +74 -0
- taguette/templates/modal/change_document.html +68 -0
- taguette/templates/modal/create_collection.html +100 -0
- taguette/templates/modal/create_document.html +84 -0
- taguette/templates/modal/create_highlight.html +38 -0
- taguette/templates/modal/create_tag.html +73 -0
- taguette/templates/modal/explore_codes.html +58 -0
- taguette/templates/modal/manage_collaborators.html +44 -0
- taguette/templates/modal/merge_tag.html +49 -0
- taguette/templates/new_password.html +32 -0
- taguette/templates/partials/alert.html +16 -0
- taguette/templates/partials/codebook_viz_modal.html +34 -0
- taguette/templates/partials/confirm.html +17 -0
- taguette/templates/partials/document_toolbar.html +37 -0
- taguette/templates/partials/hlinfo.html +13 -0
- taguette/templates/partials/project_card.html +44 -0
- taguette/templates/partials/project_card_archived.html +41 -0
- taguette/templates/partials/project_sidebar.html +99 -0
- taguette/templates/partials/spinner.html +11 -0
- taguette/templates/permissions.html +54 -0
- taguette/templates/project.html +288 -0
- taguette/templates/project_delete.html +17 -0
- taguette/templates/project_import.html +122 -0
- taguette/templates/project_import_codebook.html +34 -0
- taguette/templates/project_import_codebook_confirm.html +49 -0
- taguette/templates/project_new.html +31 -0
- taguette/templates/tos.html +8 -0
- taguette/templates/trans.js +7 -0
- taguette/templates/welcome.html +15 -0
- taguette/utils.py +177 -0
- taguette/validate.py +141 -0
- taguette/version_check.py +102 -0
- taguette/web/__init__.py +252 -0
- taguette/web/api.py +1835 -0
- taguette/web/base.py +864 -0
- taguette/web/export.py +338 -0
- taguette/web/views.py +1618 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
{% extends "base.html" %}
|
|
2
|
+
{% set active_page = "index" %}
|
|
3
|
+
|
|
4
|
+
{% block morejs %}
|
|
5
|
+
<script type="text/javascript">
|
|
6
|
+
const user_login = {{ user_login }};
|
|
7
|
+
let is_demo = {{ is_demo }};
|
|
8
|
+
let demo_highlights_location = [[],[],[]];
|
|
9
|
+
</script>
|
|
10
|
+
<script type="text/javascript" src="{{ reverse_url('trans.js') }}?lang={{ user.language }}"></script>
|
|
11
|
+
|
|
12
|
+
<!-- Utilities -->
|
|
13
|
+
<script type="text/javascript" src="{{ static_url('js/utilities.js') }}"></script>
|
|
14
|
+
|
|
15
|
+
<script src="{{ static_url('js/project/intro.js') }}"></script>
|
|
16
|
+
{% endblock %}
|
|
17
|
+
|
|
18
|
+
{% block contents %}
|
|
19
|
+
<div class="container py-4">
|
|
20
|
+
{% if show_credits %}
|
|
21
|
+
<div class="credits-container">
|
|
22
|
+
<div class="credits-info-box">
|
|
23
|
+
<p>{% trans %}Maintained by{% endtrans %}</p>
|
|
24
|
+
<div class="credits-logo"></div>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
{% endif %}
|
|
28
|
+
{% if multiuser %}
|
|
29
|
+
<h1>{% trans user_login=user.login %}Welcome {{ user_display_name }}{% endtrans %}</h1>
|
|
30
|
+
{% else %}
|
|
31
|
+
<h1>{% trans %}Welcome!{% endtrans %}</h1>
|
|
32
|
+
{% endif %}
|
|
33
|
+
|
|
34
|
+
<!-- Actions list -->
|
|
35
|
+
<div class="d-flex flex-column flex-sm-row justify-content-start mb-4 mt-4">
|
|
36
|
+
{% if can_create_project %}
|
|
37
|
+
<a href="{{ reverse_url('new_project') }}" class="btn btn-primary me-sm-3 mb-2">
|
|
38
|
+
<i class="fas fa-plus"></i> {% trans %}Create a new project{% endtrans %}
|
|
39
|
+
</a>
|
|
40
|
+
{% endif %}
|
|
41
|
+
|
|
42
|
+
{% if can_import_project %}
|
|
43
|
+
<a href="{{ reverse_url('import_project') }}" class="btn btn-primary me-sm-3 mb-2">
|
|
44
|
+
<i class="fas fa-file-download"></i> {% trans %}Import a project file{% endtrans %}
|
|
45
|
+
</a>
|
|
46
|
+
{% endif %}
|
|
47
|
+
{% if can_change_role and is_multiuser %}
|
|
48
|
+
<a href="{{ reverse_url('permissions') }}" class="btn btn-primary me-sm-3 mb-2">
|
|
49
|
+
<i class="fas fa-user-lock"></i> {% trans %}Sponsor someone{% endtrans %}
|
|
50
|
+
</a>
|
|
51
|
+
{% endif %}
|
|
52
|
+
<a href="#" class="btn btn-secondary me-sm-3 mb-2" id="a-start-demo">
|
|
53
|
+
<i class="fas fa-play"></i> {% trans %}Demo project{% endtrans %}
|
|
54
|
+
</a>
|
|
55
|
+
<a href="{{ reverse_url('archived_projects') }}" class="btn btn-outline-secondary me-sm-3 mb-2">
|
|
56
|
+
<i class="fas fa-archive"></i> {% trans %}Archived projects{% endtrans %}
|
|
57
|
+
</a>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
{% if projects|length > 1 %}
|
|
61
|
+
<div class="mb-3">
|
|
62
|
+
<div class="input-group" style="max-width: 300px;">
|
|
63
|
+
<span class="input-group-text"><i class="fas fa-search"></i></span>
|
|
64
|
+
<input type="text" class="form-control" id="project-search" placeholder="{% trans %}Search projects...{% endtrans %}">
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
{% endif %}
|
|
68
|
+
{% if not can_import_project %}
|
|
69
|
+
<p class="alert alert-info">{% trans %}Please note that you cannot create a project at this time. You must be sponsored by a Canadian Access Federation (CAF) user.{% endtrans %}</p>
|
|
70
|
+
{% endif %}
|
|
71
|
+
<!-- Projects List -->
|
|
72
|
+
<div class="main">
|
|
73
|
+
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-2 row-cols-lg-4 g-4" id="demo-project-container">
|
|
74
|
+
{% if projects %}
|
|
75
|
+
{% for project in projects %}
|
|
76
|
+
{% include 'partials/project_card.html' %}
|
|
77
|
+
{% endfor %}
|
|
78
|
+
{% else %}
|
|
79
|
+
<div class="col project empty">
|
|
80
|
+
<div class="col project">
|
|
81
|
+
<a href="#" class="no-underline">
|
|
82
|
+
<div class="project-card">
|
|
83
|
+
<div class="d-flex justify-content-end px-3 pt-3">
|
|
84
|
+
<!-- <i class="fas fa-edit" onclick=""></i>-->
|
|
85
|
+
</div>
|
|
86
|
+
<div class="px-3 d-flex align-items-center">
|
|
87
|
+
<div class="project-icon mr-2 d-flex align-items-center justify-content-center">
|
|
88
|
+
<span class="text"></span>
|
|
89
|
+
</div>
|
|
90
|
+
<h3 class="name px-3"></h3>
|
|
91
|
+
</div>
|
|
92
|
+
<div class="px-3 pt-4 description-container">
|
|
93
|
+
<p class="quote2 description-text">{% trans %}No projects available at the moment. Create or import one to get started.{% endtrans %}</p>
|
|
94
|
+
</div>
|
|
95
|
+
<hr class="custom-hr mt-auto">
|
|
96
|
+
<div class="d-flex justify-content-between px-3 pb-3 stats-container">
|
|
97
|
+
<div class="d-flex align-items-center">
|
|
98
|
+
<i class="fas fa-file"></i>
|
|
99
|
+
<span class="quote2 mx-2"></span>
|
|
100
|
+
</div>
|
|
101
|
+
<div class="d-flex align-items-center">
|
|
102
|
+
<i class="fas fa-tag"></i>
|
|
103
|
+
<span class="quote2 mx-2"></span>
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
</a>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
{% endif %}
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
<!-- No results message -->
|
|
114
|
+
<div id="no-results-message" class="text-center py-4 d-none">
|
|
115
|
+
<i class="fas fa-search fa-2x text-muted mb-2"></i>
|
|
116
|
+
<p class="text-muted">{% trans %}No projects found matching your search.{% endtrans %}</p>
|
|
117
|
+
</div>
|
|
118
|
+
|
|
119
|
+
<!-- Pagination buttons -->
|
|
120
|
+
{% if projects|length > 8 %}
|
|
121
|
+
<div class="text-center mt-4" id="projects-pagination">
|
|
122
|
+
<button class="btn btn-outline-primary" id="btn-show-more">
|
|
123
|
+
<i class="fas fa-chevron-down"></i> {% trans %}Show more{% endtrans %}
|
|
124
|
+
<span class="badge bg-secondary ms-2" id="hidden-count">{{ projects|length - 8 }}</span>
|
|
125
|
+
</button>
|
|
126
|
+
<button class="btn btn-outline-secondary d-none" id="btn-show-less">
|
|
127
|
+
<i class="fas fa-chevron-up"></i> {% trans %}Show less{% endtrans %}
|
|
128
|
+
</button>
|
|
129
|
+
</div>
|
|
130
|
+
{% endif %}
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
|
|
134
|
+
<!-- Edit Project Modal -->
|
|
135
|
+
<div class="modal fade" id="editProjectModal" tabindex="-1" aria-labelledby="editProjectModalLabel" aria-hidden="true">
|
|
136
|
+
<div class="modal-dialog">
|
|
137
|
+
<div class="modal-content">
|
|
138
|
+
<div class="modal-header">
|
|
139
|
+
<h5 class="modal-title" id="editProjectModalLabel">{% trans %}Edit project{% endtrans %}</h5>
|
|
140
|
+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
141
|
+
</div>
|
|
142
|
+
<div class="modal-body">
|
|
143
|
+
<form id="edit-project-form">
|
|
144
|
+
<input type="hidden" id="edit-project-id">
|
|
145
|
+
<div class="mb-3">
|
|
146
|
+
<label for="edit-project-name" class="form-label">{% trans %}Name{% endtrans %}</label>
|
|
147
|
+
<input type="text" class="form-control" id="edit-project-name" required>
|
|
148
|
+
</div>
|
|
149
|
+
<div class="mb-3">
|
|
150
|
+
<label for="edit-project-description" class="form-label">{% trans %}Description{% endtrans %}</label>
|
|
151
|
+
<textarea class="form-control" id="edit-project-description" rows="3"></textarea>
|
|
152
|
+
</div>
|
|
153
|
+
</form>
|
|
154
|
+
</div>
|
|
155
|
+
<div class="modal-footer">
|
|
156
|
+
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{% trans %}Cancel{% endtrans %}</button>
|
|
157
|
+
<button type="button" class="btn btn-primary" id="btn-save-project">{% trans %}Save{% endtrans %}</button>
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
<script>
|
|
164
|
+
document.addEventListener('DOMContentLoaded', function() {
|
|
165
|
+
const btnShowMore = document.getElementById('btn-show-more');
|
|
166
|
+
const btnShowLess = document.getElementById('btn-show-less');
|
|
167
|
+
const hiddenCount = document.getElementById('hidden-count');
|
|
168
|
+
const container = document.getElementById('demo-project-container');
|
|
169
|
+
const searchInput = document.getElementById('project-search');
|
|
170
|
+
const paginationDiv = document.getElementById('projects-pagination');
|
|
171
|
+
const noResultsMsg = document.getElementById('no-results-message');
|
|
172
|
+
|
|
173
|
+
if (!container) return;
|
|
174
|
+
|
|
175
|
+
const projects = Array.from(container.querySelectorAll('.col.project'));
|
|
176
|
+
const initialCount = 8;
|
|
177
|
+
const stepCount = 4;
|
|
178
|
+
let visibleCount = initialCount;
|
|
179
|
+
let filteredProjects = projects;
|
|
180
|
+
let searchTerm = '';
|
|
181
|
+
|
|
182
|
+
function filterProjects() {
|
|
183
|
+
if (!searchTerm) {
|
|
184
|
+
filteredProjects = projects;
|
|
185
|
+
} else {
|
|
186
|
+
const term = searchTerm.toLowerCase();
|
|
187
|
+
filteredProjects = projects.filter(function(el) {
|
|
188
|
+
const name = el.querySelector('h3')?.textContent?.toLowerCase() || '';
|
|
189
|
+
const desc = el.querySelector('.description-text')?.textContent?.toLowerCase() || '';
|
|
190
|
+
return name.includes(term) || desc.includes(term);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function updateVisibility() {
|
|
196
|
+
const isSearching = searchTerm.length > 0;
|
|
197
|
+
|
|
198
|
+
projects.forEach(function(el) {
|
|
199
|
+
el.style.display = 'none';
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
if (isSearching) {
|
|
203
|
+
// Show all matching results when searching
|
|
204
|
+
filteredProjects.forEach(function(el) {
|
|
205
|
+
el.style.display = '';
|
|
206
|
+
});
|
|
207
|
+
// Hide pagination when searching
|
|
208
|
+
if (paginationDiv) paginationDiv.style.display = 'none';
|
|
209
|
+
// Show no results message if needed
|
|
210
|
+
if (noResultsMsg) {
|
|
211
|
+
if (filteredProjects.length === 0) {
|
|
212
|
+
noResultsMsg.classList.remove('d-none');
|
|
213
|
+
} else {
|
|
214
|
+
noResultsMsg.classList.add('d-none');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
} else {
|
|
218
|
+
// Hide no results message
|
|
219
|
+
if (noResultsMsg) noResultsMsg.classList.add('d-none');
|
|
220
|
+
// Normal pagination
|
|
221
|
+
filteredProjects.slice(0, visibleCount).forEach(function(el) {
|
|
222
|
+
el.style.display = '';
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
if (paginationDiv) {
|
|
226
|
+
paginationDiv.style.display = '';
|
|
227
|
+
const remaining = filteredProjects.length - visibleCount;
|
|
228
|
+
|
|
229
|
+
if (remaining > 0) {
|
|
230
|
+
btnShowMore.classList.remove('d-none');
|
|
231
|
+
hiddenCount.textContent = remaining;
|
|
232
|
+
} else {
|
|
233
|
+
btnShowMore.classList.add('d-none');
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (visibleCount > initialCount) {
|
|
237
|
+
btnShowLess.classList.remove('d-none');
|
|
238
|
+
} else {
|
|
239
|
+
btnShowLess.classList.add('d-none');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Initial state
|
|
246
|
+
updateVisibility();
|
|
247
|
+
|
|
248
|
+
if (btnShowMore) {
|
|
249
|
+
btnShowMore.addEventListener('click', function() {
|
|
250
|
+
visibleCount = Math.min(visibleCount + stepCount, filteredProjects.length);
|
|
251
|
+
updateVisibility();
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
if (btnShowLess) {
|
|
256
|
+
btnShowLess.addEventListener('click', function() {
|
|
257
|
+
visibleCount = initialCount;
|
|
258
|
+
updateVisibility();
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (searchInput) {
|
|
263
|
+
searchInput.addEventListener('input', function() {
|
|
264
|
+
searchTerm = this.value.trim();
|
|
265
|
+
visibleCount = initialCount;
|
|
266
|
+
filterProjects();
|
|
267
|
+
updateVisibility();
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Edit project functionality
|
|
272
|
+
const editModal = document.getElementById('editProjectModal');
|
|
273
|
+
const editProjectId = document.getElementById('edit-project-id');
|
|
274
|
+
const editProjectName = document.getElementById('edit-project-name');
|
|
275
|
+
const editProjectDescription = document.getElementById('edit-project-description');
|
|
276
|
+
const btnSaveProject = document.getElementById('btn-save-project');
|
|
277
|
+
|
|
278
|
+
document.querySelectorAll('.action-edit').forEach(function(link) {
|
|
279
|
+
link.addEventListener('click', function(e) {
|
|
280
|
+
e.preventDefault();
|
|
281
|
+
const projectId = this.dataset.projectId;
|
|
282
|
+
const projectName = this.dataset.projectName;
|
|
283
|
+
const projectDescription = this.dataset.projectDescription || '';
|
|
284
|
+
|
|
285
|
+
editProjectId.value = projectId;
|
|
286
|
+
editProjectName.value = projectName;
|
|
287
|
+
editProjectDescription.value = projectDescription;
|
|
288
|
+
|
|
289
|
+
const modal = new bootstrap.Modal(editModal);
|
|
290
|
+
modal.show();
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
if (btnSaveProject) {
|
|
295
|
+
btnSaveProject.addEventListener('click', function() {
|
|
296
|
+
const projectId = editProjectId.value;
|
|
297
|
+
const name = editProjectName.value.trim();
|
|
298
|
+
const description = editProjectDescription.value.trim();
|
|
299
|
+
|
|
300
|
+
if (!name) {
|
|
301
|
+
editProjectName.classList.add('is-invalid');
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
editProjectName.classList.remove('is-invalid');
|
|
305
|
+
|
|
306
|
+
const xsrf = getCookie('_xsrf');
|
|
307
|
+
fetch('/api/project/' + projectId + '?_xsrf=' + encodeURIComponent(xsrf), {
|
|
308
|
+
method: 'POST',
|
|
309
|
+
headers: {
|
|
310
|
+
'Content-Type': 'application/json',
|
|
311
|
+
},
|
|
312
|
+
body: JSON.stringify({
|
|
313
|
+
name: name,
|
|
314
|
+
description: description
|
|
315
|
+
})
|
|
316
|
+
})
|
|
317
|
+
.then(function(response) {
|
|
318
|
+
if (response.ok) {
|
|
319
|
+
window.location.reload();
|
|
320
|
+
} else {
|
|
321
|
+
console.error('Error saving project');
|
|
322
|
+
}
|
|
323
|
+
})
|
|
324
|
+
.catch(function(error) {
|
|
325
|
+
console.error('Error saving project:', error);
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// Archive project functionality
|
|
331
|
+
document.querySelectorAll('.action-archive').forEach(function(link) {
|
|
332
|
+
link.addEventListener('click', function(e) {
|
|
333
|
+
e.preventDefault();
|
|
334
|
+
const projectId = this.dataset.projectId;
|
|
335
|
+
const xsrf = getCookie('_xsrf');
|
|
336
|
+
fetch('/project/' + projectId + '/archive?_xsrf=' + encodeURIComponent(xsrf), {
|
|
337
|
+
method: 'POST'
|
|
338
|
+
}).then(function(response) {
|
|
339
|
+
if (response.ok) {
|
|
340
|
+
window.location.reload();
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
});
|
|
346
|
+
</script>
|
|
347
|
+
{% endblock %}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// This file doesn't load until messages are available.
|
|
2
|
+
// It reads pushed messages, filters by schedule + dismissals stored in
|
|
3
|
+
// localStorage, then renders one Bootstrap alert per surviving message.
|
|
4
|
+
(function() {
|
|
5
|
+
var messages = {{ messages }};
|
|
6
|
+
var container = document.getElementById('messages-div');
|
|
7
|
+
if (!container) { return; }
|
|
8
|
+
|
|
9
|
+
var STORAGE_KEY = 'libreqda.dismissed_messages';
|
|
10
|
+
var dismissed = {};
|
|
11
|
+
try {
|
|
12
|
+
dismissed = JSON.parse(
|
|
13
|
+
window.localStorage.getItem(STORAGE_KEY) || '{}') || {};
|
|
14
|
+
} catch (e) {
|
|
15
|
+
dismissed = {};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function saveDismissed() {
|
|
19
|
+
try {
|
|
20
|
+
window.localStorage.setItem(STORAGE_KEY, JSON.stringify(dismissed));
|
|
21
|
+
} catch (e) { /* ignore */ }
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
var now = Date.now();
|
|
25
|
+
function parseTs(v) {
|
|
26
|
+
if (!v) { return null; }
|
|
27
|
+
var t = Date.parse(v);
|
|
28
|
+
return isNaN(t) ? null : t;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
for (var i = 0; i < messages.length; ++i) {
|
|
32
|
+
var msg = messages[i];
|
|
33
|
+
if (!msg || !msg.html) { continue; }
|
|
34
|
+
|
|
35
|
+
var start = parseTs(msg.start_at);
|
|
36
|
+
var end = parseTs(msg.end_at);
|
|
37
|
+
if (start !== null && now < start) { continue; }
|
|
38
|
+
if (end !== null && now > end) { continue; }
|
|
39
|
+
if (msg.id && dismissed[msg.id]) { continue; }
|
|
40
|
+
|
|
41
|
+
var severity = msg.severity || 'secondary';
|
|
42
|
+
var alert = document.createElement('div');
|
|
43
|
+
alert.className = 'alert alert-' + severity;
|
|
44
|
+
alert.setAttribute('role', 'alert');
|
|
45
|
+
if (msg.dismissible !== false) {
|
|
46
|
+
alert.className += ' alert-dismissible fade show';
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
var body = document.createElement('span');
|
|
50
|
+
body.innerHTML = msg.html;
|
|
51
|
+
alert.appendChild(body);
|
|
52
|
+
|
|
53
|
+
if (msg.dismissible !== false) {
|
|
54
|
+
var btn = document.createElement('button');
|
|
55
|
+
btn.type = 'button';
|
|
56
|
+
btn.className = 'btn-close';
|
|
57
|
+
btn.setAttribute('data-bs-dismiss', 'alert');
|
|
58
|
+
btn.setAttribute(
|
|
59
|
+
'aria-label',
|
|
60
|
+
'{% trans "accessible label to close a pushed message" %}Close{% endtrans %}');
|
|
61
|
+
(function(id) {
|
|
62
|
+
btn.addEventListener('click', function() {
|
|
63
|
+
if (id) {
|
|
64
|
+
dismissed[id] = Date.now();
|
|
65
|
+
saveDismissed();
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
})(msg.id);
|
|
69
|
+
alert.appendChild(btn);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
container.appendChild(alert);
|
|
73
|
+
}
|
|
74
|
+
})();
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
<!-- Change document modal -->
|
|
2
|
+
<div class="modal fade" id="document-change-modal" tabindex="-1" role="dialog" data-bs-backdrop="static">
|
|
3
|
+
<div class="modal-dialog modal-dialog-centered" role="document">
|
|
4
|
+
<form id="document-change-form" class="modal-content">
|
|
5
|
+
<div class="modal-header">
|
|
6
|
+
<h5 class="modal-title">{% trans "modal window title" %}Edit document{% endtrans %}</h5>
|
|
7
|
+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
8
|
+
</div>
|
|
9
|
+
<div class="modal-body">
|
|
10
|
+
<input type="hidden" id="document-change-id" />
|
|
11
|
+
<div class="container">
|
|
12
|
+
<div class="row">
|
|
13
|
+
<div class="col-md-6 form-group">
|
|
14
|
+
<input type="text" class="form-control mb-3" id="document-change-name"
|
|
15
|
+
name="document-change-name" placeholder="{% trans " document change form placeholder"
|
|
16
|
+
%}Name{% endtrans %}" required />
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="row">
|
|
20
|
+
<div class="col-12 form-group">
|
|
21
|
+
<div class="form-check form-check-inline">
|
|
22
|
+
<input class="form-check-input" type="radio" name="document-change-direction"
|
|
23
|
+
id="document-change-direction-ltr" value="LEFT_TO_RIGHT" checked />
|
|
24
|
+
<label class="form-check-label" for="document-change-direction-ltr">{% trans %}Left to
|
|
25
|
+
right{% endtrans %}</label>
|
|
26
|
+
</div>
|
|
27
|
+
<div class="form-check form-check-inline">
|
|
28
|
+
<input class="form-check-input" type="radio" name="document-change-direction"
|
|
29
|
+
id="document-change-direction-rtl" value="RIGHT_TO_LEFT" />
|
|
30
|
+
<label class="form-check-label" for="document-change-direction-rtl">{% trans %}Right to
|
|
31
|
+
left{% endtrans %}</label>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
<div class="row">
|
|
36
|
+
<div class="col form-group">
|
|
37
|
+
<label for="document-change-collection-hierarchy-select" class="form-label">{% trans
|
|
38
|
+
%}Collections{% endtrans %}</label>
|
|
39
|
+
<div class='dropdown hierarchy-select' id='document-change-collection-hierarchy-select'>
|
|
40
|
+
<button class="btn btn-secondary dropdown-toggle" type="button"
|
|
41
|
+
id="dropdownMenuButtonDocumentChangeCollection" data-bs-toggle="dropdown"
|
|
42
|
+
aria-expanded="false"></button>
|
|
43
|
+
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButtonDocumentChangeCollection">
|
|
44
|
+
<div class="hs-searchbox">
|
|
45
|
+
<input type="text" class="form-control" autocomplete="off">
|
|
46
|
+
</div>
|
|
47
|
+
<div class='hs-menu-inner'>
|
|
48
|
+
</div>
|
|
49
|
+
</ul>
|
|
50
|
+
<input class="d-none" id="document-change-collection-id"
|
|
51
|
+
name="document-change-collection-id" readonly="readonly" aria-hidden="true"
|
|
52
|
+
type="text" />
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
<textarea class="form-control" id="document-change-description" name="document-change-description"
|
|
57
|
+
placeholder="{% trans " document change form placeholder" %}Description{% endtrans
|
|
58
|
+
%}"></textarea>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
<div class="modal-footer">
|
|
62
|
+
<button type="submit" class="btn btn-primary">{% trans %}Save & Close{% endtrans %}</button>
|
|
63
|
+
<button type="button" id="document-change-delete" class="btn btn-danger" data-bs-dismiss="modal">{%
|
|
64
|
+
trans %}Delete document{% endtrans %}</button>
|
|
65
|
+
</div>
|
|
66
|
+
</form>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
<!-- Add collection modal -->
|
|
2
|
+
<div class="modal fade" id="collection-add-modal" tabindex="-1" role="dialog" data-bs-backdrop="static">
|
|
3
|
+
<div class="modal-dialog modal-dialog-centered modal-lg" role="document" style="max-width: 1100px; width: 95vw;">
|
|
4
|
+
<form id="collection-add-form" class="modal-content">
|
|
5
|
+
<div class="modal-header">
|
|
6
|
+
<h5 id="collection-add-label-new" class="modal-title">{% trans "modal window title" %}Add a collection{%
|
|
7
|
+
endtrans %}</h5>
|
|
8
|
+
<h5 id="collection-add-label-change" class="modal-title" style="display: none;">{% trans "modal window
|
|
9
|
+
title" %}Edit collection{% endtrans %}</h5>
|
|
10
|
+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
11
|
+
</div>
|
|
12
|
+
<div class="modal-body">
|
|
13
|
+
<input type="hidden" id="collection-add-id" />
|
|
14
|
+
|
|
15
|
+
<!-- Reset button centered at top -->
|
|
16
|
+
<div class="text-center mb-3">
|
|
17
|
+
<button type="button" class="btn btn-sm btn-outline-danger"
|
|
18
|
+
id="collection-reset-selection" style="display: none;">
|
|
19
|
+
<i class="fas fa-undo"></i> {% trans %}Reset{% endtrans %}
|
|
20
|
+
</button>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<div class="container">
|
|
24
|
+
<div class="row">
|
|
25
|
+
<!-- Collection information -->
|
|
26
|
+
<div class="col-md-4">
|
|
27
|
+
<div class="form-group mb-3">
|
|
28
|
+
<label for="collection-add-name" class="form-label">{% trans %}Collection name{%
|
|
29
|
+
endtrans %}</label>
|
|
30
|
+
<input type="text" class="form-control" id="collection-add-name"
|
|
31
|
+
name="collection-add-name" required maxlength="200"
|
|
32
|
+
placeholder="{% trans %}Collection name{% endtrans %}">
|
|
33
|
+
</div>
|
|
34
|
+
<div class="form-group mb-3">
|
|
35
|
+
<label for="collection-add-description" class="form-label">{% trans %}Description{%
|
|
36
|
+
endtrans %}</label>
|
|
37
|
+
<textarea class="form-control" id="collection-add-description"
|
|
38
|
+
name="collection-add-description" rows="3" maxlength="1000"
|
|
39
|
+
placeholder="{% trans %}Description (optional){% endtrans %}"></textarea>
|
|
40
|
+
</div>
|
|
41
|
+
<div class="form-group mb-3">
|
|
42
|
+
<label for="collection-hierarchy-select" class="form-label">{% trans %}Parent
|
|
43
|
+
collection{%
|
|
44
|
+
endtrans %}</label>
|
|
45
|
+
<div class='dropdown hierarchy-select' id='collection-hierarchy-select'>
|
|
46
|
+
<button class="btn btn-secondary dropdown-toggle" type="button"
|
|
47
|
+
id="dropdownMenuButtonCollection" data-bs-toggle="dropdown"
|
|
48
|
+
aria-expanded="false"></button>
|
|
49
|
+
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButtonCollection">
|
|
50
|
+
<div class="hs-searchbox">
|
|
51
|
+
<input type="text" class="form-control" autocomplete="off">
|
|
52
|
+
</div>
|
|
53
|
+
<div class='hs-menu-inner'>
|
|
54
|
+
</div>
|
|
55
|
+
</ul>
|
|
56
|
+
<input class="d-none" id="collection-add-parent-id" name="collection-add-parent-id"
|
|
57
|
+
readonly="readonly" aria-hidden="true" type="text" />
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<!-- Document selection -->
|
|
63
|
+
<div class="col-md-8">
|
|
64
|
+
<div class="form-group">
|
|
65
|
+
<!-- Selected documents -->
|
|
66
|
+
<div id="collection-selected-documents" class="mb-3" style="display: none;">
|
|
67
|
+
<small class="text-muted">{% trans %}Currently assigned to the collection: {% endtrans %}:</small>
|
|
68
|
+
<div id="collection-selected-documents-list"
|
|
69
|
+
class="border rounded p-2 bg-light" style="min-height: 40px;">
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
|
|
73
|
+
<!-- Label above search -->
|
|
74
|
+
<label class="form-label">{% trans %}Add documents to this collection{%
|
|
75
|
+
endtrans %}</label>
|
|
76
|
+
|
|
77
|
+
<!-- Search input -->
|
|
78
|
+
<input type="text" id="collection-documents-search" class="form-control mb-2"
|
|
79
|
+
placeholder="{% trans %}Search documents...{% endtrans %}">
|
|
80
|
+
|
|
81
|
+
<!-- Available documents list -->
|
|
82
|
+
<div id="collection-add-documents-list"
|
|
83
|
+
class="document-selection-list border rounded p-2"
|
|
84
|
+
style="max-height: 50vh; overflow-y: auto;"></div>
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
<div class="modal-footer">
|
|
91
|
+
<button type="submit" class="btn btn-primary" data-test-id="collection-add-submit-button">{% trans
|
|
92
|
+
%}Save & Close{% endtrans %}</button>
|
|
93
|
+
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="collection-add-cancel">{%
|
|
94
|
+
trans %}Cancel{% endtrans %}</button>
|
|
95
|
+
<button type="button" class="btn btn-danger" id="collection-add-delete" style="display: none;">{% trans
|
|
96
|
+
%}Delete collection{% endtrans %}</button>
|
|
97
|
+
</div>
|
|
98
|
+
</form>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|