From 60a77b8ba79da02f86943ea88417d0762189bfc4 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Mon, 14 Feb 2022 23:21:42 +0100 Subject: [PATCH 01/17] =?UTF-8?q?WIP:=20r=C3=A9organisation=20code=20bulle?= =?UTF-8?q?tins?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- app/but/bulletin_but.py | 33 ++++++---- app/models/formsemestre.py | 1 + app/scodoc/sco_bulletins.py | 86 +++++++++++++-------------- app/scodoc/sco_bulletins_generator.py | 2 +- app/scodoc/sco_bulletins_pdf.py | 22 +++++-- app/scodoc/sco_preferences.py | 5 +- app/views/notes.py | 2 +- sco_version.py | 2 +- 9 files changed, 89 insertions(+), 68 deletions(-) diff --git a/README.md b/README.md index 209a2a01..f571216a 100644 --- a/README.md +++ b/README.md @@ -20,10 +20,10 @@ Flask, SQLAlchemy, au lien de Python2/Zope dans les versions précédentes). ### État actuel (26 jan 22) - - 9.1 (master) reproduit l'ensemble des fonctions de ScoDoc 7 (donc pas de BUT), sauf: + - 9.1.5x (master) reproduit l'ensemble des fonctions de ScoDoc 7 (donc pas de BUT), sauf: - ancien module "Entreprises" (obsolète) et ajoute la gestion du BUT. - - 9.2 (branche refactor_nt) est la version de développement. + - 9.2 (branche dev92) est la version de développement. ### Lignes de commandes diff --git a/app/but/bulletin_but.py b/app/but/bulletin_but.py index 5d4fd74f..771746bf 100644 --- a/app/but/bulletin_but.py +++ b/app/but/bulletin_but.py @@ -9,14 +9,15 @@ import datetime from flask import url_for, g -from app.models.formsemestre import FormSemestre +from app.comp.res_but import ResultatsSemestreBUT +from app.models import FormSemestre, Identite from app.scodoc import sco_utils as scu from app.scodoc import sco_bulletins_json +from app.scodoc import sco_bulletins_pdf from app.scodoc import sco_preferences from app.scodoc.sco_codes_parcours import UE_SPORT from app.scodoc.sco_utils import fmt_note -from app.comp.res_but import ResultatsSemestreBUT class BulletinBUT: @@ -28,6 +29,7 @@ class BulletinBUT: def __init__(self, formsemestre: FormSemestre): """ """ self.res = ResultatsSemestreBUT(formsemestre) + self.prefs = sco_preferences.SemPreferences(formsemestre.id) def etud_ue_mod_results(self, etud, ue, modimpls) -> dict: "dict synthèse résultats dans l'UE pour les modules indiqués" @@ -84,7 +86,7 @@ class BulletinBUT: "saes": self.etud_ue_mod_results(etud, ue, res.saes), } if ue.type != UE_SPORT: - if sco_preferences.get_preference("bul_show_ue_rangs", res.formsemestre.id): + if self.prefs["bul_show_ue_rangs"]: rangs, effectif = res.ue_rangs[ue.id] rang = rangs[etud.id] else: @@ -155,9 +157,7 @@ class BulletinBUT: if e.visibulletin and ( modimpl_results.evaluations_etat[e.id].is_complete - or sco_preferences.get_preference( - "bul_show_all_evals", res.formsemestre.id - ) + or self.prefs["bul_show_all_evals"] ) ], } @@ -216,9 +216,11 @@ class BulletinBUT: else: return f"Bonus de {fmt_note(bonus_vect.iloc[0])}" - def bulletin_etud(self, etud, formsemestre, force_publishing=False) -> dict: - """Le bulletin de l'étudiant dans ce semestre. - Si force_publishing, rempli le bulletin même si bul_hide_xml est vrai + def bulletin_etud( + self, etud: Identite, formsemestre, force_publishing=False + ) -> dict: + """Le bulletin de l'étudiant dans ce semestre: dict pour la version JSON / HTML. + - Si force_publishing, rempli le bulletin même si bul_hide_xml est vrai (bulletins non publiés). """ res = self.res @@ -239,7 +241,9 @@ class BulletinBUT: }, "formsemestre_id": formsemestre.id, "etat_inscription": etat_inscription, - "options": sco_preferences.bulletin_option_affichage(formsemestre.id), + "options": sco_preferences.bulletin_option_affichage( + formsemestre.id, self.prefs + ), } if not published: return d @@ -312,3 +316,12 @@ class BulletinBUT: ) return d + + def bulletin_etud_complet(self, etud) -> dict: + """Bulletin dict complet avec toutes les infos pour les bulletins pdf""" + d = self.bulletin_etud(force_publishing=True) + d["filigranne"] = sco_bulletins_pdf.get_filigranne( + self.res.get_etud_etat(etud.id), self.prefs + ) + # XXX TODO A COMPLETER + raise NotImplementedError() diff --git a/app/models/formsemestre.py b/app/models/formsemestre.py index 24514248..2d491d7e 100644 --- a/app/models/formsemestre.py +++ b/app/models/formsemestre.py @@ -117,6 +117,7 @@ class FormSemestre(db.Model): return f"<{self.__class__.__name__} {self.id} {self.titre_num()}>" def to_dict(self): + "dict (compatible ScoDoc7)" d = dict(self.__dict__) d.pop("_sa_instance_state", None) # ScoDoc7 output_formators: (backward compat) diff --git a/app/scodoc/sco_bulletins.py b/app/scodoc/sco_bulletins.py index 93a926b6..64284105 100644 --- a/app/scodoc/sco_bulletins.py +++ b/app/scodoc/sco_bulletins.py @@ -28,30 +28,21 @@ """Génération des bulletins de notes """ -from app.models import formsemestre -import time -import pprint import email -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -from email.mime.base import MIMEBase -from email.header import Header -from reportlab.lib.colors import Color -import urllib +import pprint +import time from flask import g, request from flask import url_for from flask_login import current_user from flask_mail import Message -from app.models.moduleimpls import ModuleImplInscription -import app.scodoc.sco_utils as scu -from app.scodoc.sco_utils import ModuleType -import app.scodoc.notesdb as ndb +from app import email from app import log +from app.but import bulletin_but from app.comp import res_sem from app.comp.res_common import NotesTableCompat -from app.models import FormSemestre +from app.models import FormSemestre, Identite, ModuleImplInscription from app.scodoc.sco_permissions import Permission from app.scodoc.sco_exceptions import AccessDenied, ScoValueError from app.scodoc import html_sco_header @@ -60,9 +51,9 @@ from app.scodoc import sco_abs from app.scodoc import sco_abs_views from app.scodoc import sco_bulletins_generator from app.scodoc import sco_bulletins_json +from app.scodoc import sco_bulletins_pdf from app.scodoc import sco_bulletins_xml from app.scodoc import sco_codes_parcours -from app.scodoc import sco_cache from app.scodoc import sco_etud from app.scodoc import sco_evaluation_db from app.scodoc import sco_formations @@ -73,7 +64,9 @@ from app.scodoc import sco_photos from app.scodoc import sco_preferences from app.scodoc import sco_pvjury from app.scodoc import sco_users -from app import email +import app.scodoc.sco_utils as scu +from app.scodoc.sco_utils import ModuleType +import app.scodoc.notesdb as ndb # ----- CLASSES DE BULLETINS DE NOTES from app.scodoc import sco_bulletins_standard @@ -190,28 +183,18 @@ def formsemestre_bulletinetud_dict(formsemestre_id, etudid, version="long"): show_mention=prefs["bul_show_mention"], ) - if dpv: - I["decision_sem"] = dpv["decisions"][0]["decision_sem"] - else: - I["decision_sem"] = "" I.update(infos) I["etud_etat_html"] = _get_etud_etat_html( formsemestre.etuds_inscriptions[etudid].etat ) I["etud_etat"] = nt.get_etud_etat(etudid) - I["filigranne"] = "" + I["filigranne"] = sco_bulletins_pdf.get_filigranne(I["etud_etat"], prefs) I["demission"] = "" - if I["etud_etat"] == "D": + if I["etud_etat"] == scu.DEMISSION: I["demission"] = "(Démission)" - I["filigranne"] = "Démission" elif I["etud_etat"] == sco_codes_parcours.DEF: I["demission"] = "(Défaillant)" - I["filigranne"] = "Défaillant" - elif (prefs["bul_show_temporary"] and not I["decision_sem"]) or prefs[ - "bul_show_temporary_forced" - ]: - I["filigranne"] = prefs["bul_temporary_txt"] # --- Appreciations cnx = ndb.GetDBConnexion() @@ -687,6 +670,7 @@ def etud_descr_situation_semestre( descr_defaillance : "Défaillant" ou vide si non défaillant. decision_jury : "Validé", "Ajourné", ... (code semestre) descr_decision_jury : "Décision jury: Validé" (une phrase) + decision_sem : decisions_ue : noms (acronymes) des UE validées, séparées par des virgules. descr_decisions_ue : ' UE acquises: UE1, UE2', ou vide si pas de dec. ou si pas show_uevalid descr_mention : 'Mention Bien', ou vide si pas de mention ou si pas show_mention @@ -696,7 +680,7 @@ def etud_descr_situation_semestre( # --- Situation et décisions jury - # demission/inscription ? + # démission/inscription ? events = sco_etud.scolar_events_list( cnx, args={"etudid": etudid, "formsemestre_id": formsemestre_id} ) @@ -763,11 +747,15 @@ def etud_descr_situation_semestre( infos["situation"] += " " + infos["descr_defaillance"] dpv = sco_pvjury.dict_pvjury(formsemestre_id, etudids=[etudid]) + if dpv: + infos["decision_sem"] = dpv["decisions"][0]["decision_sem"] + else: + infos["decision_sem"] = "" if not show_decisions: return infos, dpv - # Decisions de jury: + # Décisions de jury: pv = dpv["decisions"][0] dec = "" if pv["decision_sem_descr"]: @@ -819,11 +807,15 @@ def formsemestre_bulletinetud( except: sco_etud.log_unknown_etud() raise ScoValueError("étudiant inconnu") - # API, donc erreurs admises en ScoValueError - sem = sco_formsemestre.get_formsemestre(formsemestre_id, raise_soft_exc=True) + + formsemestre: FormSemestre = FormSemestre.query.get(formsemestre_id) + if not formsemestre: + # API, donc erreurs admises + raise ScoValueError(f"semestre {formsemestre_id} inconnu !") + sem = formsemestre.to_dict() bulletin = do_formsemestre_bulletinetud( - formsemestre_id, + formsemestre, etudid, format=format, version=version, @@ -835,7 +827,6 @@ def formsemestre_bulletinetud( filename = scu.bul_filename(sem, etud, format) return scu.send_file(bulletin, filename, mime=scu.get_mime_suffix(format)[0]) - sem = sco_formsemestre.get_formsemestre(formsemestre_id) H = [ _formsemestre_bulletinetud_header_html( etud, etudid, sem, formsemestre_id, format, version @@ -892,14 +883,14 @@ def can_send_bulletin_by_mail(formsemestre_id): def do_formsemestre_bulletinetud( - formsemestre_id, - etudid, + formsemestre: FormSemestre, + etudid: int, version="long", # short, long, selectedevals format="html", nohtml=False, - xml_with_decisions=False, # force decisions dans XML - force_publishing=False, # force publication meme si semestre non publie sur "portail" - prefer_mail_perso=False, # mails envoyes sur adresse perso si non vide + xml_with_decisions=False, # force décisions dans XML + force_publishing=False, # force publication meme si semestre non publié sur "portail" + prefer_mail_perso=False, # mails envoyés sur adresse perso si non vide ): """Génère le bulletin au format demandé. Retourne: (bul, filigranne) @@ -908,7 +899,7 @@ def do_formsemestre_bulletinetud( """ if format == "xml": bul = sco_bulletins_xml.make_xml_formsemestre_bulletinetud( - formsemestre_id, + formsemestre.id, etudid, xml_with_decisions=xml_with_decisions, force_publishing=force_publishing, @@ -919,7 +910,7 @@ def do_formsemestre_bulletinetud( elif format == "json": bul = sco_bulletins_json.make_json_formsemestre_bulletinetud( - formsemestre_id, + formsemestre.id, etudid, xml_with_decisions=xml_with_decisions, force_publishing=force_publishing, @@ -927,8 +918,13 @@ def do_formsemestre_bulletinetud( ) return bul, "" - I = formsemestre_bulletinetud_dict(formsemestre_id, etudid) - etud = I["etud"] + if formsemestre.formation.is_apc(): + etud = Identite.query.get(etudid) + r = bulletin_but.BulletinBUT(formsemestre) + I = r.bulletin_etud_complet(etud, formsemestre) + else: + I = formsemestre_bulletinetud_dict(formsemestre.id, etudid) + etud = I["etud"] if format == "html": htm, _ = sco_bulletins_generator.make_formsemestre_bulletinetud( @@ -954,7 +950,7 @@ def do_formsemestre_bulletinetud( elif format == "pdfmail": # format pdfmail: envoie le pdf par mail a l'etud, et affiche le html # check permission - if not can_send_bulletin_by_mail(formsemestre_id): + if not can_send_bulletin_by_mail(formsemestre.id): raise AccessDenied("Vous n'avez pas le droit d'effectuer cette opération !") if nohtml: @@ -983,7 +979,7 @@ def do_formsemestre_bulletinetud( ) + htm return h, I["filigranne"] # - mail_bulletin(formsemestre_id, I, pdfdata, filename, recipient_addr) + mail_bulletin(formsemestre.id, I, pdfdata, filename, recipient_addr) emaillink = '%s' % ( recipient_addr, recipient_addr, diff --git a/app/scodoc/sco_bulletins_generator.py b/app/scodoc/sco_bulletins_generator.py index 04a9efae..aafdc09f 100644 --- a/app/scodoc/sco_bulletins_generator.py +++ b/app/scodoc/sco_bulletins_generator.py @@ -99,7 +99,7 @@ def bulletin_get_class_name_displayed(formsemestre_id): return "invalide ! (voir paramètres)" -class BulletinGenerator(object): +class BulletinGenerator: "Virtual superclass for PDF bulletin generators" "" # Here some helper methods # see sco_bulletins_standard.BulletinGeneratorStandard subclass for real methods diff --git a/app/scodoc/sco_bulletins_pdf.py b/app/scodoc/sco_bulletins_pdf.py index 94cfcf6b..748fd5a0 100644 --- a/app/scodoc/sco_bulletins_pdf.py +++ b/app/scodoc/sco_bulletins_pdf.py @@ -61,12 +61,10 @@ from reportlab.platypus.doctemplate import BaseDocTemplate from flask import g, request from app import log, ScoValueError -from app.comp import res_sem -from app.comp.res_common import NotesTableCompat from app.models import FormSemestre from app.scodoc import sco_cache -from app.scodoc import sco_formsemestre +from app.scodoc import sco_codes_parcours from app.scodoc import sco_pdf from app.scodoc import sco_preferences from app.scodoc import sco_etud @@ -190,7 +188,7 @@ def get_formsemestre_bulletins_pdf(formsemestre_id, version="selectedevals"): i = 1 for etud in formsemestre.get_inscrits(include_demdef=True, order=True): frag, filigranne = sco_bulletins.do_formsemestre_bulletinetud( - formsemestre_id, + formsemestre, etud.id, format="pdfpart", version=version, @@ -239,8 +237,9 @@ def get_etud_bulletins_pdf(etudid, version="selectedevals"): filigrannes = {} i = 1 for sem in etud["sems"]: + formsemestre = FormSemestre.query.get(sem["formsemestre_id"]) frag, filigranne = sco_bulletins.do_formsemestre_bulletinetud( - sem["formsemestre_id"], + formsemestre, etudid, format="pdfpart", version=version, @@ -275,3 +274,16 @@ def get_etud_bulletins_pdf(etudid, version="selectedevals"): ) return pdfdoc, filename + + +def get_filigranne(etud_etat: str, prefs) -> str: + """Texte à placer en "filigranne" sur le bulletin pdf""" + if etud_etat == scu.DEMISSION: + return "Démission" + elif etud_etat == sco_codes_parcours.DEF: + return "Défaillant" + elif (prefs["bul_show_temporary"] and not I["decision_sem"]) or prefs[ + "bul_show_temporary_forced" + ]: + return prefs["bul_temporary_txt"] + return "" diff --git a/app/scodoc/sco_preferences.py b/app/scodoc/sco_preferences.py index b639d5ee..e0fcc537 100644 --- a/app/scodoc/sco_preferences.py +++ b/app/scodoc/sco_preferences.py @@ -2114,7 +2114,7 @@ class BasePreferences(object): return form -class SemPreferences(object): +class SemPreferences: """Preferences for a formsemestre""" def __init__(self, formsemestre_id=None): @@ -2270,9 +2270,8 @@ def doc_preferences(): return "\n".join([" | ".join(x) for x in L]) -def bulletin_option_affichage(formsemestre_id: int) -> dict: +def bulletin_option_affichage(formsemestre_id: int, prefs: SemPreferences) -> dict: "dict avec les options d'affichages (préférences) pour ce semestre" - prefs = SemPreferences(formsemestre_id) fields = ( "bul_show_abs", "bul_show_abs_modules", diff --git a/app/views/notes.py b/app/views/notes.py index efad2808..b0b812a1 100644 --- a/app/views/notes.py +++ b/app/views/notes.py @@ -1925,7 +1925,7 @@ def formsemestre_bulletins_mailetuds( nb_send = 0 for etudid in etudids: h, _ = sco_bulletins.do_formsemestre_bulletinetud( - formsemestre_id, + formsemestre, etudid, version=version, prefer_mail_perso=prefer_mail_perso, diff --git a/sco_version.py b/sco_version.py index 23fba006..035ab07f 100644 --- a/sco_version.py +++ b/sco_version.py @@ -1,7 +1,7 @@ # -*- mode: python -*- # -*- coding: utf-8 -*- -SCOVERSION = "9.1.56" +SCOVERSION = "9.2a-57" SCONAME = "ScoDoc" From b165bc26593ed817dde0e335ce0de33c4a6af1db Mon Sep 17 00:00:00 2001 From: lehmann Date: Tue, 15 Feb 2022 11:45:56 +0100 Subject: [PATCH 02/17] =?UTF-8?q?Rang=20+=20am=C3=A9lioration=20espacement?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/static/css/releve-but.css | 19 +++++++++++++++++-- app/static/js/releve-but.js | 1 + 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/static/css/releve-but.css b/app/static/css/releve-but.css index a20c8bfa..02cceb94 100644 --- a/app/static/css/releve-but.css +++ b/app/static/css/releve-but.css @@ -97,7 +97,8 @@ section>div:nth-child(1){ .hide_coef .synthese em, .hide_coef .eval>em, .hide_date_inscr .dateInscription, -.hide_ects .ects{ +.hide_ects .ects, +.hide_rangs .rang{ display: none; } @@ -158,7 +159,10 @@ section>div:nth-child(1){ text-align: right; } .rang{ - text-decoration: underline var(--couleurIntense); + font-weight: bold; +} +.ue .rang{ + font-weight: 400; } .decision{ margin: 5px 0; @@ -186,6 +190,9 @@ section>div:nth-child(1){ .synthese h3{ background: var(--couleurFondTitresUE); } +.synthese .ue>div{ + text-align: right; +} .synthese em, .eval em{ opacity: 0.6; @@ -308,6 +315,14 @@ h3{ margin-bottom: 8px; } +@media screen and (max-width: 700px) { + section{ + padding: 16px; + } + .syntheseModule, .eval { + margin: 0; + } +} /*.absences{ display: grid; grid-template-columns: auto auto; diff --git a/app/static/js/releve-but.js b/app/static/js/releve-but.js index 5dcd9e5b..c0273e6a 100644 --- a/app/static/js/releve-but.js +++ b/app/static/js/releve-but.js @@ -254,6 +254,7 @@ class releveBUT extends HTMLElement {
Moyenne : ${dataUE.moyenne?.value || "-"}
+
Rang : ${dataUE.moyenne?.rang} / ${dataUE.moyenne?.total}
Bonus : ${dataUE.bonus || 0} - Malus : ${dataUE.malus || 0} From 799f3542cc61e5d645fb77fe8ef8fc7cbbe6171d Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Thu, 17 Feb 2022 16:29:01 +0100 Subject: [PATCH 03/17] DataTables2022 --- .../css/dataTables.bootstrap.css | 289 + .../css/dataTables.bootstrap.min.css | 1 + .../css/dataTables.bootstrap4.css | 307 + .../css/dataTables.bootstrap4.min.css | 1 + .../css/dataTables.bootstrap5.css | 328 + .../css/dataTables.bootstrap5.min.css | 5 + .../css/dataTables.bulma.css | 252 + .../css/dataTables.bulma.min.css | 3 + .../css/dataTables.dataTables.css | 555 + .../css/dataTables.dataTables.min.css | 1 + .../css/dataTables.foundation.css | 215 + .../css/dataTables.foundation.min.css | 1 + .../css/dataTables.jqueryui.css | 612 + .../css/dataTables.jqueryui.min.css | 1 + .../css/dataTables.semanticui.css | 199 + .../css/dataTables.semanticui.min.css | 1 + .../css/jquery.dataTables.css | 482 + .../css/jquery.dataTables.min.css | 1 + .../DataTables-1.11.4/images/sort_asc.png | Bin 0 -> 160 bytes .../images/sort_asc_disabled.png | Bin 0 -> 146 bytes .../DataTables-1.11.4/images/sort_both.png | Bin 0 -> 201 bytes .../DataTables-1.11.4/images/sort_desc.png | Bin 0 -> 158 bytes .../images/sort_desc_disabled.png | Bin 0 -> 148 bytes .../js/dataTables.bootstrap.js | 182 + .../js/dataTables.bootstrap.min.js | 14 + .../js/dataTables.bootstrap4.js | 184 + .../js/dataTables.bootstrap4.min.js | 14 + .../js/dataTables.bootstrap5.js | 184 + .../js/dataTables.bootstrap5.min.js | 14 + .../DataTables-1.11.4/js/dataTables.bulma.js | 200 + .../js/dataTables.bulma.min.js | 15 + .../js/dataTables.dataTables.js | 37 + .../js/dataTables.dataTables.min.js | 5 + .../js/dataTables.foundation.js | 174 + .../js/dataTables.foundation.min.js | 9 + .../js/dataTables.jqueryui.js | 166 + .../js/dataTables.jqueryui.min.js | 15 + .../js/dataTables.semanticui.js | 212 + .../js/dataTables.semanticui.min.js | 15 + .../DataTables-1.11.4/js/jquery.dataTables.js | 15345 +++++++++++ .../js/jquery.dataTables.min.js | 187 + .../css/fixedColumns.bootstrap.css | 61 + .../css/fixedColumns.bootstrap.min.css | 1 + .../css/fixedColumns.bootstrap4.css | 61 + .../css/fixedColumns.bootstrap4.min.css | 1 + .../css/fixedColumns.bootstrap5.css | 80 + .../css/fixedColumns.bootstrap5.min.css | 1 + .../css/fixedColumns.bulma.css | 23 + .../css/fixedColumns.bulma.min.css | 1 + .../css/fixedColumns.dataTables.css | 35 + .../css/fixedColumns.dataTables.min.css | 1 + .../css/fixedColumns.foundation.css | 35 + .../css/fixedColumns.foundation.min.css | 1 + .../css/fixedColumns.jqueryui.css | 22 + .../css/fixedColumns.jqueryui.min.css | 1 + .../css/fixedColumns.semanticui.css | 36 + .../css/fixedColumns.semanticui.min.css | 1 + .../js/dataTables.fixedColumns.js | 612 + .../js/dataTables.fixedColumns.min.js | 40 + .../js/fixedColumns.bootstrap.js | 40 + .../js/fixedColumns.bootstrap.min.js | 1 + .../js/fixedColumns.bootstrap4.js | 43 + .../js/fixedColumns.bootstrap4.min.js | 5 + .../js/fixedColumns.bootstrap5.js | 36 + .../js/fixedColumns.bootstrap5.min.js | 5 + .../js/fixedColumns.bulma.js | 36 + .../js/fixedColumns.bulma.min.js | 5 + .../js/fixedColumns.dataTables.js | 43 + .../js/fixedColumns.dataTables.min.js | 5 + .../js/fixedColumns.foundation.js | 43 + .../js/fixedColumns.foundation.min.js | 5 + .../js/fixedColumns.jqueryui.js | 36 + .../js/fixedColumns.jqueryui.min.js | 5 + .../js/fixedColumns.semanticui.js | 43 + .../js/fixedColumns.semanticui.min.js | 5 + .../css/fixedHeader.bootstrap.css | 16 + .../css/fixedHeader.bootstrap.min.css | 1 + .../css/fixedHeader.bootstrap4.css | 16 + .../css/fixedHeader.bootstrap4.min.css | 1 + .../css/fixedHeader.bootstrap5.css | 16 + .../css/fixedHeader.bootstrap5.min.css | 1 + .../css/fixedHeader.bulma.css | 20 + .../css/fixedHeader.bulma.min.css | 1 + .../css/fixedHeader.dataTables.css | 18 + .../css/fixedHeader.dataTables.min.css | 1 + .../css/fixedHeader.foundation.css | 16 + .../css/fixedHeader.foundation.min.css | 1 + .../css/fixedHeader.jqueryui.css | 14 + .../css/fixedHeader.jqueryui.min.css | 1 + .../css/fixedHeader.semanticui.css | 13 + .../css/fixedHeader.semanticui.min.css | 1 + .../js/dataTables.fixedHeader.js | 1041 + .../js/dataTables.fixedHeader.min.js | 42 + .../js/fixedHeader.bootstrap.js | 38 + .../js/fixedHeader.bootstrap.min.js | 5 + .../js/fixedHeader.bootstrap4.js | 38 + .../js/fixedHeader.bootstrap4.min.js | 5 + .../js/fixedHeader.bootstrap5.js | 38 + .../js/fixedHeader.bootstrap5.min.js | 5 + .../FixedHeader-3.2.1/js/fixedHeader.bulma.js | 38 + .../js/fixedHeader.bulma.min.js | 5 + .../js/fixedHeader.dataTables.js | 38 + .../js/fixedHeader.dataTables.min.js | 5 + .../js/fixedHeader.foundation.js | 38 + .../js/fixedHeader.foundation.min.js | 5 + .../js/fixedHeader.jqueryui.js | 38 + .../js/fixedHeader.jqueryui.min.js | 5 + .../js/fixedHeader.semanticui.js | 38 + .../js/fixedHeader.semanticui.min.js | 5 + .../css/responsive.bootstrap.css | 185 + .../css/responsive.bootstrap.min.css | 1 + .../css/responsive.bootstrap4.css | 185 + .../css/responsive.bootstrap4.min.css | 1 + .../css/responsive.bootstrap5.css | 185 + .../css/responsive.bootstrap5.min.css | 1 + .../Responsive-2.2.9/css/responsive.bulma.css | 191 + .../css/responsive.bulma.min.css | 1 + .../css/responsive.dataTables.css | 182 + .../css/responsive.dataTables.min.css | 1 + .../css/responsive.foundation.css | 185 + .../css/responsive.foundation.min.css | 1 + .../css/responsive.jqueryui.css | 182 + .../css/responsive.jqueryui.min.css | 1 + .../css/responsive.semanticui.css | 185 + .../css/responsive.semanticui.min.css | 1 + .../js/dataTables.responsive.js | 1474 + .../js/dataTables.responsive.min.js | 48 + .../js/responsive.bootstrap.js | 85 + .../js/responsive.bootstrap.min.js | 12 + .../js/responsive.bootstrap4.js | 85 + .../js/responsive.bootstrap4.min.js | 12 + .../js/responsive.bootstrap5.js | 93 + .../js/responsive.bootstrap5.min.js | 12 + .../Responsive-2.2.9/js/responsive.bulma.js | 87 + .../js/responsive.bulma.min.js | 12 + .../js/responsive.dataTables.js | 38 + .../js/responsive.dataTables.min.js | 5 + .../js/responsive.foundation.js | 71 + .../js/responsive.foundation.min.js | 7 + .../js/responsive.jqueryui.js | 63 + .../js/responsive.jqueryui.min.js | 6 + .../js/responsive.semanticui.js | 80 + .../js/responsive.semanticui.min.js | 12 + .../css/searchBuilder.bootstrap.css | 142 + .../css/searchBuilder.bootstrap.min.css | 1 + .../css/searchBuilder.bootstrap4.css | 152 + .../css/searchBuilder.bootstrap4.min.css | 1 + .../css/searchBuilder.bootstrap5.css | 158 + .../css/searchBuilder.bootstrap5.min.css | 1 + .../css/searchBuilder.bulma.css | 153 + .../css/searchBuilder.bulma.min.css | 1 + .../css/searchBuilder.dataTables.css | 191 + .../css/searchBuilder.dataTables.min.css | 1 + .../css/searchBuilder.foundation.css | 157 + .../css/searchBuilder.foundation.min.css | 1 + .../css/searchBuilder.jqueryui.css | 141 + .../css/searchBuilder.jqueryui.min.css | 1 + .../css/searchBuilder.semanticui.css | 187 + .../css/searchBuilder.semanticui.min.css | 1 + .../js/dataTables.searchBuilder.js | 3797 +++ .../js/dataTables.searchBuilder.min.js | 146 + .../js/searchBuilder.bootstrap.js | 52 + .../js/searchBuilder.bootstrap.min.js | 6 + .../js/searchBuilder.bootstrap4.js | 49 + .../js/searchBuilder.bootstrap4.min.js | 2 + .../js/searchBuilder.bootstrap5.js | 54 + .../js/searchBuilder.bootstrap5.min.js | 6 + .../js/searchBuilder.bulma.js | 50 + .../js/searchBuilder.bulma.min.js | 6 + .../js/searchBuilder.dataTables.js | 36 + .../js/searchBuilder.dataTables.min.js | 5 + .../js/searchBuilder.foundation.js | 52 + .../js/searchBuilder.foundation.min.js | 6 + .../js/searchBuilder.jqueryui.js | 52 + .../js/searchBuilder.jqueryui.min.js | 7 + .../js/searchBuilder.semanticui.js | 64 + .../js/searchBuilder.semanticui.min.js | 7 + app/static/DataTables2022/datatables.css | 930 + app/static/DataTables2022/datatables.js | 22407 ++++++++++++++++ app/static/DataTables2022/datatables.min.css | 27 + app/static/DataTables2022/datatables.min.js | 538 + 181 files changed, 56437 insertions(+) create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap.min.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap4.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap4.min.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap5.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap5.min.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bulma.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bulma.min.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.dataTables.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.dataTables.min.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.foundation.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.foundation.min.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.jqueryui.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.jqueryui.min.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.semanticui.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/dataTables.semanticui.min.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/jquery.dataTables.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/css/jquery.dataTables.min.css create mode 100644 app/static/DataTables2022/DataTables-1.11.4/images/sort_asc.png create mode 100644 app/static/DataTables2022/DataTables-1.11.4/images/sort_asc_disabled.png create mode 100644 app/static/DataTables2022/DataTables-1.11.4/images/sort_both.png create mode 100644 app/static/DataTables2022/DataTables-1.11.4/images/sort_desc.png create mode 100644 app/static/DataTables2022/DataTables-1.11.4/images/sort_desc_disabled.png create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.bootstrap.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.bootstrap.min.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.bootstrap4.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.bootstrap4.min.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.bootstrap5.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.bootstrap5.min.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.bulma.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.bulma.min.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.dataTables.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.dataTables.min.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.foundation.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.foundation.min.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.jqueryui.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.jqueryui.min.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.semanticui.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/dataTables.semanticui.min.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/jquery.dataTables.js create mode 100644 app/static/DataTables2022/DataTables-1.11.4/js/jquery.dataTables.min.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.bootstrap.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.bootstrap.min.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.bootstrap4.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.bootstrap4.min.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.bootstrap5.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.bootstrap5.min.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.bulma.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.bulma.min.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.dataTables.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.dataTables.min.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.foundation.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.foundation.min.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.jqueryui.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.jqueryui.min.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.semanticui.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/css/fixedColumns.semanticui.min.css create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/dataTables.fixedColumns.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/dataTables.fixedColumns.min.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.bootstrap.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.bootstrap.min.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.bootstrap4.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.bootstrap4.min.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.bootstrap5.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.bootstrap5.min.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.bulma.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.bulma.min.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.dataTables.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.dataTables.min.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.foundation.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.foundation.min.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.jqueryui.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.jqueryui.min.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.semanticui.js create mode 100644 app/static/DataTables2022/FixedColumns-4.0.1/js/fixedColumns.semanticui.min.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.bootstrap.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.bootstrap.min.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.bootstrap4.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.bootstrap4.min.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.bootstrap5.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.bootstrap5.min.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.bulma.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.bulma.min.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.dataTables.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.dataTables.min.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.foundation.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.foundation.min.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.jqueryui.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.jqueryui.min.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.semanticui.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/css/fixedHeader.semanticui.min.css create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/dataTables.fixedHeader.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/dataTables.fixedHeader.min.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.bootstrap.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.bootstrap.min.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.bootstrap4.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.bootstrap4.min.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.bootstrap5.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.bootstrap5.min.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.bulma.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.bulma.min.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.dataTables.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.dataTables.min.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.foundation.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.foundation.min.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.jqueryui.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.jqueryui.min.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.semanticui.js create mode 100644 app/static/DataTables2022/FixedHeader-3.2.1/js/fixedHeader.semanticui.min.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.bootstrap.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.bootstrap.min.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.bootstrap4.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.bootstrap4.min.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.bootstrap5.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.bootstrap5.min.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.bulma.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.bulma.min.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.dataTables.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.dataTables.min.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.foundation.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.foundation.min.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.jqueryui.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.jqueryui.min.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.semanticui.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/css/responsive.semanticui.min.css create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/dataTables.responsive.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/dataTables.responsive.min.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.bootstrap.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.bootstrap.min.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.bootstrap4.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.bootstrap4.min.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.bootstrap5.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.bootstrap5.min.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.bulma.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.bulma.min.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.dataTables.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.dataTables.min.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.foundation.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.foundation.min.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.jqueryui.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.jqueryui.min.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.semanticui.js create mode 100644 app/static/DataTables2022/Responsive-2.2.9/js/responsive.semanticui.min.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.bootstrap.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.bootstrap.min.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.bootstrap4.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.bootstrap4.min.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.bootstrap5.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.bootstrap5.min.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.bulma.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.bulma.min.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.dataTables.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.dataTables.min.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.foundation.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.foundation.min.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.jqueryui.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.jqueryui.min.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.semanticui.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/css/searchBuilder.semanticui.min.css create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/dataTables.searchBuilder.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/dataTables.searchBuilder.min.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.bootstrap.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.bootstrap.min.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.bootstrap4.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.bootstrap4.min.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.bootstrap5.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.bootstrap5.min.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.bulma.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.bulma.min.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.dataTables.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.dataTables.min.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.foundation.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.foundation.min.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.jqueryui.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.jqueryui.min.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.semanticui.js create mode 100644 app/static/DataTables2022/SearchBuilder-1.3.1/js/searchBuilder.semanticui.min.js create mode 100644 app/static/DataTables2022/datatables.css create mode 100644 app/static/DataTables2022/datatables.js create mode 100644 app/static/DataTables2022/datatables.min.css create mode 100644 app/static/DataTables2022/datatables.min.js diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap.css new file mode 100644 index 00000000..78e464e6 --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap.css @@ -0,0 +1,289 @@ +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} +table.dataTable td.dt-control { + text-align: center; + cursor: pointer; +} +table.dataTable td.dt-control:before { + height: 1em; + width: 1em; + margin-top: -9px; + display: inline-block; + color: white; + border: 0.15em solid white; + border-radius: 1em; + box-shadow: 0 0 0.2em #444; + box-sizing: content-box; + text-align: center; + text-indent: 0 !important; + font-family: "Courier New", Courier, monospace; + line-height: 1em; + content: "+"; + background-color: #31b131; +} +table.dataTable tr.dt-hasChild td.dt-control:before { + content: "-"; + background-color: #d33333; +} + +table.dataTable { + clear: both; + margin-top: 6px !important; + margin-bottom: 6px !important; + max-width: none !important; + border-collapse: separate !important; +} +table.dataTable td, +table.dataTable th { + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +table.dataTable td.dataTables_empty, +table.dataTable th.dataTables_empty { + text-align: center; +} +table.dataTable.nowrap th, +table.dataTable.nowrap td { + white-space: nowrap; +} + +div.dataTables_wrapper div.dataTables_length label { + font-weight: normal; + text-align: left; + white-space: nowrap; +} +div.dataTables_wrapper div.dataTables_length select { + width: 75px; + display: inline-block; +} +div.dataTables_wrapper div.dataTables_filter { + text-align: right; +} +div.dataTables_wrapper div.dataTables_filter label { + font-weight: normal; + white-space: nowrap; + text-align: left; +} +div.dataTables_wrapper div.dataTables_filter input { + margin-left: 0.5em; + display: inline-block; + width: auto; +} +div.dataTables_wrapper div.dataTables_info { + padding-top: 8px; + white-space: nowrap; +} +div.dataTables_wrapper div.dataTables_paginate { + margin: 0; + white-space: nowrap; + text-align: right; +} +div.dataTables_wrapper div.dataTables_paginate ul.pagination { + margin: 2px 0; + white-space: nowrap; +} +div.dataTables_wrapper div.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 200px; + margin-left: -100px; + margin-top: -26px; + text-align: center; + padding: 1em 0; +} + +table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting, +table.dataTable thead > tr > td.sorting_asc, +table.dataTable thead > tr > td.sorting_desc, +table.dataTable thead > tr > td.sorting { + padding-right: 30px; +} +table.dataTable thead > tr > th:active, +table.dataTable thead > tr > td:active { + outline: none; +} +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting_asc_disabled, +table.dataTable thead .sorting_desc_disabled { + cursor: pointer; + position: relative; +} +table.dataTable thead .sorting:after, +table.dataTable thead .sorting_asc:after, +table.dataTable thead .sorting_desc:after, +table.dataTable thead .sorting_asc_disabled:after, +table.dataTable thead .sorting_desc_disabled:after { + position: absolute; + bottom: 8px; + right: 8px; + display: block; + font-family: "Glyphicons Halflings", sans-serif; + opacity: 0.5; +} +table.dataTable thead .sorting:after { + opacity: 0.2; + content: "\e150"; + /* sort */ +} +table.dataTable thead .sorting_asc:after { + opacity: 0.5; + content: "\e155"; + /* sort-by-attributes */ +} +table.dataTable thead .sorting_desc:after { + opacity: 0.5; + content: "\e156"; + /* sort-by-attributes-alt */ +} +table.dataTable thead .sorting_asc_disabled:after, +table.dataTable thead .sorting_desc_disabled:after { + color: #eee; +} + +div.dataTables_scrollHead table.dataTable { + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody > table { + border-top: none; + margin-top: 0 !important; + margin-bottom: 0 !important; +} +div.dataTables_scrollBody > table > thead .sorting:after, +div.dataTables_scrollBody > table > thead .sorting_asc:after, +div.dataTables_scrollBody > table > thead .sorting_desc:after { + display: none; +} +div.dataTables_scrollBody > table > tbody > tr:first-child > th, +div.dataTables_scrollBody > table > tbody > tr:first-child > td { + border-top: none; +} + +div.dataTables_scrollFoot > .dataTables_scrollFootInner { + box-sizing: content-box; +} +div.dataTables_scrollFoot > .dataTables_scrollFootInner > table { + margin-top: 0 !important; + border-top: none; +} + +@media screen and (max-width: 767px) { + div.dataTables_wrapper div.dataTables_length, +div.dataTables_wrapper div.dataTables_filter, +div.dataTables_wrapper div.dataTables_info, +div.dataTables_wrapper div.dataTables_paginate { + text-align: center; + } +} +table.dataTable.table-condensed > thead > tr > th { + padding-right: 20px; +} +table.dataTable.table-condensed .sorting:after, +table.dataTable.table-condensed .sorting_asc:after, +table.dataTable.table-condensed .sorting_desc:after { + top: 6px; + right: 6px; +} + +table.table-bordered.dataTable { + border-right-width: 0; +} +table.table-bordered.dataTable th, +table.table-bordered.dataTable td { + border-left-width: 0; +} +table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child, +table.table-bordered.dataTable td:last-child, +table.table-bordered.dataTable td:last-child { + border-right-width: 1px; +} +table.table-bordered.dataTable tbody th, +table.table-bordered.dataTable tbody td { + border-bottom-width: 0; +} + +div.dataTables_scrollHead table.table-bordered { + border-bottom-width: 0; +} + +div.table-responsive > div.dataTables_wrapper > div.row { + margin: 0; +} +div.table-responsive > div.dataTables_wrapper > div.row > div[class^=col-]:first-child { + padding-left: 0; +} +div.table-responsive > div.dataTables_wrapper > div.row > div[class^=col-]:last-child { + padding-right: 0; +} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap.min.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap.min.css new file mode 100644 index 00000000..23bc7dc9 --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap.min.css @@ -0,0 +1 @@ +table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:"-";background-color:#d33333}table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:75px;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:8px;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:8px;right:8px;display:block;font-family:"Glyphicons Halflings",sans-serif;opacity:.5}table.dataTable thead .sorting:after{opacity:.2;content:""}table.dataTable thead .sorting_asc:after{opacity:.5;content:""}table.dataTable thead .sorting_desc:after{opacity:.5;content:""}table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{color:#eee}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_desc:after{display:none}div.dataTables_scrollBody>table>tbody>tr:first-child>th,div.dataTables_scrollBody>table>tbody>tr:first-child>td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-condensed>thead>tr>th{padding-right:20px}table.dataTable.table-condensed .sorting:after,table.dataTable.table-condensed .sorting_asc:after,table.dataTable.table-condensed .sorting_desc:after{top:6px;right:6px}table.table-bordered.dataTable{border-right-width:0}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:1px}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap4.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap4.css new file mode 100644 index 00000000..64ee499e --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap4.css @@ -0,0 +1,307 @@ +@charset "UTF-8"; +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} +table.dataTable td.dt-control { + text-align: center; + cursor: pointer; +} +table.dataTable td.dt-control:before { + height: 1em; + width: 1em; + margin-top: -9px; + display: inline-block; + color: white; + border: 0.15em solid white; + border-radius: 1em; + box-shadow: 0 0 0.2em #444; + box-sizing: content-box; + text-align: center; + text-indent: 0 !important; + font-family: "Courier New", Courier, monospace; + line-height: 1em; + content: "+"; + background-color: #31b131; +} +table.dataTable tr.dt-hasChild td.dt-control:before { + content: "-"; + background-color: #d33333; +} + +table.dataTable { + clear: both; + margin-top: 6px !important; + margin-bottom: 6px !important; + max-width: none !important; + border-collapse: separate !important; + border-spacing: 0; +} +table.dataTable td, +table.dataTable th { + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +table.dataTable td.dataTables_empty, +table.dataTable th.dataTables_empty { + text-align: center; +} +table.dataTable.nowrap th, +table.dataTable.nowrap td { + white-space: nowrap; +} + +div.dataTables_wrapper div.dataTables_length label { + font-weight: normal; + text-align: left; + white-space: nowrap; +} +div.dataTables_wrapper div.dataTables_length select { + width: auto; + display: inline-block; +} +div.dataTables_wrapper div.dataTables_filter { + text-align: right; +} +div.dataTables_wrapper div.dataTables_filter label { + font-weight: normal; + white-space: nowrap; + text-align: left; +} +div.dataTables_wrapper div.dataTables_filter input { + margin-left: 0.5em; + display: inline-block; + width: auto; +} +div.dataTables_wrapper div.dataTables_info { + padding-top: 0.85em; +} +div.dataTables_wrapper div.dataTables_paginate { + margin: 0; + white-space: nowrap; + text-align: right; +} +div.dataTables_wrapper div.dataTables_paginate ul.pagination { + margin: 2px 0; + white-space: nowrap; + justify-content: flex-end; +} +div.dataTables_wrapper div.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 200px; + margin-left: -100px; + margin-top: -26px; + text-align: center; + padding: 1em 0; +} + +table.dataTable > thead > tr > th:active, +table.dataTable > thead > tr > td:active { + outline: none; +} +table.dataTable > thead > tr > th:not(.sorting_disabled), +table.dataTable > thead > tr > td:not(.sorting_disabled) { + padding-right: 30px; +} +table.dataTable > thead .sorting, +table.dataTable > thead .sorting_asc, +table.dataTable > thead .sorting_desc, +table.dataTable > thead .sorting_asc_disabled, +table.dataTable > thead .sorting_desc_disabled { + cursor: pointer; + position: relative; +} +table.dataTable > thead .sorting:before, table.dataTable > thead .sorting:after, +table.dataTable > thead .sorting_asc:before, +table.dataTable > thead .sorting_asc:after, +table.dataTable > thead .sorting_desc:before, +table.dataTable > thead .sorting_desc:after, +table.dataTable > thead .sorting_asc_disabled:before, +table.dataTable > thead .sorting_asc_disabled:after, +table.dataTable > thead .sorting_desc_disabled:before, +table.dataTable > thead .sorting_desc_disabled:after { + position: absolute; + bottom: 0.9em; + display: block; + opacity: 0.3; +} +table.dataTable > thead .sorting:before, +table.dataTable > thead .sorting_asc:before, +table.dataTable > thead .sorting_desc:before, +table.dataTable > thead .sorting_asc_disabled:before, +table.dataTable > thead .sorting_desc_disabled:before { + right: 1em; + content: "↑"; +} +table.dataTable > thead .sorting:after, +table.dataTable > thead .sorting_asc:after, +table.dataTable > thead .sorting_desc:after, +table.dataTable > thead .sorting_asc_disabled:after, +table.dataTable > thead .sorting_desc_disabled:after { + right: 0.5em; + content: "↓"; +} +table.dataTable > thead .sorting_asc:before, +table.dataTable > thead .sorting_desc:after { + opacity: 1; +} +table.dataTable > thead .sorting_asc_disabled:before, +table.dataTable > thead .sorting_desc_disabled:after { + opacity: 0; +} + +div.dataTables_scrollHead table.dataTable { + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody > table { + border-top: none; + margin-top: 0 !important; + margin-bottom: 0 !important; +} +div.dataTables_scrollBody > table > thead .sorting:before, +div.dataTables_scrollBody > table > thead .sorting_asc:before, +div.dataTables_scrollBody > table > thead .sorting_desc:before, +div.dataTables_scrollBody > table > thead .sorting:after, +div.dataTables_scrollBody > table > thead .sorting_asc:after, +div.dataTables_scrollBody > table > thead .sorting_desc:after { + display: none; +} +div.dataTables_scrollBody > table > tbody tr:first-child th, +div.dataTables_scrollBody > table > tbody tr:first-child td { + border-top: none; +} + +div.dataTables_scrollFoot > .dataTables_scrollFootInner { + box-sizing: content-box; +} +div.dataTables_scrollFoot > .dataTables_scrollFootInner > table { + margin-top: 0 !important; + border-top: none; +} + +@media screen and (max-width: 767px) { + div.dataTables_wrapper div.dataTables_length, +div.dataTables_wrapper div.dataTables_filter, +div.dataTables_wrapper div.dataTables_info, +div.dataTables_wrapper div.dataTables_paginate { + text-align: center; + } + div.dataTables_wrapper div.dataTables_paginate ul.pagination { + justify-content: center !important; + } +} +table.dataTable.table-sm > thead > tr > th:not(.sorting_disabled) { + padding-right: 20px; +} +table.dataTable.table-sm .sorting:before, +table.dataTable.table-sm .sorting_asc:before, +table.dataTable.table-sm .sorting_desc:before { + top: 5px; + right: 0.85em; +} +table.dataTable.table-sm .sorting:after, +table.dataTable.table-sm .sorting_asc:after, +table.dataTable.table-sm .sorting_desc:after { + top: 5px; +} + +table.table-bordered.dataTable { + border-right-width: 0; +} +table.table-bordered.dataTable th, +table.table-bordered.dataTable td { + border-left-width: 0; +} +table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child, +table.table-bordered.dataTable td:last-child, +table.table-bordered.dataTable td:last-child { + border-right-width: 1px; +} +table.table-bordered.dataTable tbody th, +table.table-bordered.dataTable tbody td { + border-bottom-width: 0; +} + +div.dataTables_scrollHead table.table-bordered { + border-bottom-width: 0; +} + +div.table-responsive > div.dataTables_wrapper > div.row { + margin: 0; +} +div.table-responsive > div.dataTables_wrapper > div.row > div[class^=col-]:first-child { + padding-left: 0; +} +div.table-responsive > div.dataTables_wrapper > div.row > div[class^=col-]:last-child { + padding-right: 0; +} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap4.min.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap4.min.css new file mode 100644 index 00000000..bda7658d --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap4.min.css @@ -0,0 +1 @@ +table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:"-";background-color:#d33333}table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important;border-spacing:0}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:.85em}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap;justify-content:flex-end}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>thead>tr>th:not(.sorting_disabled),table.dataTable>thead>tr>td:not(.sorting_disabled){padding-right:30px}table.dataTable>thead .sorting,table.dataTable>thead .sorting_asc,table.dataTable>thead .sorting_desc,table.dataTable>thead .sorting_asc_disabled,table.dataTable>thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable>thead .sorting:before,table.dataTable>thead .sorting:after,table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_asc:after,table.dataTable>thead .sorting_desc:before,table.dataTable>thead .sorting_desc:after,table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_asc_disabled:after,table.dataTable>thead .sorting_desc_disabled:before,table.dataTable>thead .sorting_desc_disabled:after{position:absolute;bottom:.9em;display:block;opacity:.3}table.dataTable>thead .sorting:before,table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_desc:before,table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_desc_disabled:before{right:1em;content:"↑"}table.dataTable>thead .sorting:after,table.dataTable>thead .sorting_asc:after,table.dataTable>thead .sorting_desc:after,table.dataTable>thead .sorting_asc_disabled:after,table.dataTable>thead .sorting_desc_disabled:after{right:.5em;content:"↓"}table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_desc:after{opacity:1}table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_desc_disabled:after{opacity:0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody>table>thead .sorting:before,div.dataTables_scrollBody>table>thead .sorting_asc:before,div.dataTables_scrollBody>table>thead .sorting_desc:before,div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_desc:after{display:none}div.dataTables_scrollBody>table>tbody tr:first-child th,div.dataTables_scrollBody>table>tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:center !important}}table.dataTable.table-sm>thead>tr>th:not(.sorting_disabled){padding-right:20px}table.dataTable.table-sm .sorting:before,table.dataTable.table-sm .sorting_asc:before,table.dataTable.table-sm .sorting_desc:before{top:5px;right:.85em}table.dataTable.table-sm .sorting:after,table.dataTable.table-sm .sorting_asc:after,table.dataTable.table-sm .sorting_desc:after{top:5px}table.table-bordered.dataTable{border-right-width:0}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:1px}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap5.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap5.css new file mode 100644 index 00000000..7bb880fe --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap5.css @@ -0,0 +1,328 @@ +@charset "UTF-8"; +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} +table.dataTable td.dt-control { + text-align: center; + cursor: pointer; +} +table.dataTable td.dt-control:before { + height: 1em; + width: 1em; + margin-top: -9px; + display: inline-block; + color: white; + border: 0.15em solid white; + border-radius: 1em; + box-shadow: 0 0 0.2em #444; + box-sizing: content-box; + text-align: center; + text-indent: 0 !important; + font-family: "Courier New", Courier, monospace; + line-height: 1em; + content: "+"; + background-color: #31b131; +} +table.dataTable tr.dt-hasChild td.dt-control:before { + content: "-"; + background-color: #d33333; +} + +/*! Bootstrap 5 integration for DataTables + * + * ©2020 SpryMedia Ltd, all rights reserved. + * License: MIT datatables.net/license/mit + */ +table.dataTable { + clear: both; + margin-top: 6px !important; + margin-bottom: 6px !important; + max-width: none !important; + border-collapse: separate !important; + border-spacing: 0; +} +table.dataTable td, +table.dataTable th { + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +table.dataTable td.dataTables_empty, +table.dataTable th.dataTables_empty { + text-align: center; +} +table.dataTable.nowrap th, +table.dataTable.nowrap td { + white-space: nowrap; +} + +div.dataTables_wrapper div.dataTables_length label { + font-weight: normal; + text-align: left; + white-space: nowrap; +} +div.dataTables_wrapper div.dataTables_length select { + width: auto; + display: inline-block; +} +div.dataTables_wrapper div.dataTables_filter { + text-align: right; +} +div.dataTables_wrapper div.dataTables_filter label { + font-weight: normal; + white-space: nowrap; + text-align: left; +} +div.dataTables_wrapper div.dataTables_filter input { + margin-left: 0.5em; + display: inline-block; + width: auto; +} +div.dataTables_wrapper div.dataTables_info { + padding-top: 0.85em; +} +div.dataTables_wrapper div.dataTables_paginate { + margin: 0; + white-space: nowrap; + text-align: right; +} +div.dataTables_wrapper div.dataTables_paginate ul.pagination { + margin: 2px 0; + white-space: nowrap; + justify-content: flex-end; +} +div.dataTables_wrapper div.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 200px; + margin-left: -100px; + margin-top: -26px; + text-align: center; + padding: 1em 0; +} + +table.dataTable > thead > tr > th:active, +table.dataTable > thead > tr > td:active { + outline: none; +} +table.dataTable > thead > tr > th:not(.sorting_disabled), +table.dataTable > thead > tr > td:not(.sorting_disabled) { + padding-right: 30px; +} +table.dataTable > thead .sorting, +table.dataTable > thead .sorting_asc, +table.dataTable > thead .sorting_desc, +table.dataTable > thead .sorting_asc_disabled, +table.dataTable > thead .sorting_desc_disabled { + cursor: pointer; + position: relative; +} +table.dataTable > thead .sorting:before, table.dataTable > thead .sorting:after, +table.dataTable > thead .sorting_asc:before, +table.dataTable > thead .sorting_asc:after, +table.dataTable > thead .sorting_desc:before, +table.dataTable > thead .sorting_desc:after, +table.dataTable > thead .sorting_asc_disabled:before, +table.dataTable > thead .sorting_asc_disabled:after, +table.dataTable > thead .sorting_desc_disabled:before, +table.dataTable > thead .sorting_desc_disabled:after { + position: absolute; + bottom: 0.5em; + display: block; + opacity: 0.3; +} +table.dataTable > thead .sorting:before, +table.dataTable > thead .sorting_asc:before, +table.dataTable > thead .sorting_desc:before, +table.dataTable > thead .sorting_asc_disabled:before, +table.dataTable > thead .sorting_desc_disabled:before { + right: 1em; + content: "↑"; +} +table.dataTable > thead .sorting:after, +table.dataTable > thead .sorting_asc:after, +table.dataTable > thead .sorting_desc:after, +table.dataTable > thead .sorting_asc_disabled:after, +table.dataTable > thead .sorting_desc_disabled:after { + right: 0.5em; + content: "↓"; +} +table.dataTable > thead .sorting_asc:before, +table.dataTable > thead .sorting_desc:after { + opacity: 1; +} +table.dataTable > thead .sorting_asc_disabled:before, +table.dataTable > thead .sorting_desc_disabled:after { + opacity: 0; +} + +div.dataTables_scrollHead table.dataTable { + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody > table { + border-top: none; + margin-top: 0 !important; + margin-bottom: 0 !important; +} +div.dataTables_scrollBody > table > thead .sorting:before, +div.dataTables_scrollBody > table > thead .sorting_asc:before, +div.dataTables_scrollBody > table > thead .sorting_desc:before, +div.dataTables_scrollBody > table > thead .sorting:after, +div.dataTables_scrollBody > table > thead .sorting_asc:after, +div.dataTables_scrollBody > table > thead .sorting_desc:after { + display: none; +} +div.dataTables_scrollBody > table > tbody tr:first-child th, +div.dataTables_scrollBody > table > tbody tr:first-child td { + border-top: none; +} + +div.dataTables_scrollFoot > .dataTables_scrollFootInner { + box-sizing: content-box; +} +div.dataTables_scrollFoot > .dataTables_scrollFootInner > table { + margin-top: 0 !important; + border-top: none; +} + +@media screen and (max-width: 767px) { + div.dataTables_wrapper div.dataTables_length, +div.dataTables_wrapper div.dataTables_filter, +div.dataTables_wrapper div.dataTables_info, +div.dataTables_wrapper div.dataTables_paginate { + text-align: center; + } + div.dataTables_wrapper div.dataTables_paginate ul.pagination { + justify-content: center !important; + } +} +table.dataTable.table-sm > thead > tr > th:not(.sorting_disabled) { + padding-right: 20px; +} +table.dataTable.table-sm .sorting:before, +table.dataTable.table-sm .sorting_asc:before, +table.dataTable.table-sm .sorting_desc:before { + top: 5px; + right: 0.85em; +} +table.dataTable.table-sm .sorting:after, +table.dataTable.table-sm .sorting_asc:after, +table.dataTable.table-sm .sorting_desc:after { + top: 5px; +} + +table.table-bordered.dataTable { + border-right-width: 0; +} +table.table-bordered.dataTable thead tr:first-child th, +table.table-bordered.dataTable thead tr:first-child td { + border-top-width: 1px; +} +table.table-bordered.dataTable th, +table.table-bordered.dataTable td { + border-left-width: 0; +} +table.table-bordered.dataTable th:first-child, table.table-bordered.dataTable th:first-child, +table.table-bordered.dataTable td:first-child, +table.table-bordered.dataTable td:first-child { + border-left-width: 1px; +} +table.table-bordered.dataTable th:last-child, table.table-bordered.dataTable th:last-child, +table.table-bordered.dataTable td:last-child, +table.table-bordered.dataTable td:last-child { + border-right-width: 1px; +} +table.table-bordered.dataTable th, +table.table-bordered.dataTable td { + border-bottom-width: 1px; +} + +div.dataTables_scrollHead table.table-bordered { + border-bottom-width: 0; +} + +div.table-responsive > div.dataTables_wrapper > div.row { + margin: 0; +} +div.table-responsive > div.dataTables_wrapper > div.row > div[class^=col-]:first-child { + padding-left: 0; +} +div.table-responsive > div.dataTables_wrapper > div.row > div[class^=col-]:last-child { + padding-right: 0; +} + +table.dataTable.table-striped > tbody > tr:nth-of-type(2n+1) { + --bs-table-accent-bg: transparent; +} +table.dataTable.table-striped > tbody > tr.odd { + --bs-table-accent-bg: var(--bs-table-striped-bg); +} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap5.min.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap5.min.css new file mode 100644 index 00000000..d4ed9703 --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bootstrap5.min.css @@ -0,0 +1,5 @@ +table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:"-";background-color:#d33333}/*! Bootstrap 5 integration for DataTables + * + * ©2020 SpryMedia Ltd, all rights reserved. + * License: MIT datatables.net/license/mit + */table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important;border-spacing:0}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:.85em}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap;justify-content:flex-end}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>thead>tr>th:not(.sorting_disabled),table.dataTable>thead>tr>td:not(.sorting_disabled){padding-right:30px}table.dataTable>thead .sorting,table.dataTable>thead .sorting_asc,table.dataTable>thead .sorting_desc,table.dataTable>thead .sorting_asc_disabled,table.dataTable>thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable>thead .sorting:before,table.dataTable>thead .sorting:after,table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_asc:after,table.dataTable>thead .sorting_desc:before,table.dataTable>thead .sorting_desc:after,table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_asc_disabled:after,table.dataTable>thead .sorting_desc_disabled:before,table.dataTable>thead .sorting_desc_disabled:after{position:absolute;bottom:.5em;display:block;opacity:.3}table.dataTable>thead .sorting:before,table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_desc:before,table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_desc_disabled:before{right:1em;content:"↑"}table.dataTable>thead .sorting:after,table.dataTable>thead .sorting_asc:after,table.dataTable>thead .sorting_desc:after,table.dataTable>thead .sorting_asc_disabled:after,table.dataTable>thead .sorting_desc_disabled:after{right:.5em;content:"↓"}table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_desc:after{opacity:1}table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_desc_disabled:after{opacity:0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody>table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody>table>thead .sorting:before,div.dataTables_scrollBody>table>thead .sorting_asc:before,div.dataTables_scrollBody>table>thead .sorting_desc:before,div.dataTables_scrollBody>table>thead .sorting:after,div.dataTables_scrollBody>table>thead .sorting_asc:after,div.dataTables_scrollBody>table>thead .sorting_desc:after{display:none}div.dataTables_scrollBody>table>tbody tr:first-child th,div.dataTables_scrollBody>table>tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}div.dataTables_wrapper div.dataTables_paginate ul.pagination{justify-content:center !important}}table.dataTable.table-sm>thead>tr>th:not(.sorting_disabled){padding-right:20px}table.dataTable.table-sm .sorting:before,table.dataTable.table-sm .sorting_asc:before,table.dataTable.table-sm .sorting_desc:before{top:5px;right:.85em}table.dataTable.table-sm .sorting:after,table.dataTable.table-sm .sorting_asc:after,table.dataTable.table-sm .sorting_desc:after{top:5px}table.table-bordered.dataTable{border-right-width:0}table.table-bordered.dataTable thead tr:first-child th,table.table-bordered.dataTable thead tr:first-child td{border-top-width:1px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:first-child,table.table-bordered.dataTable th:first-child,table.table-bordered.dataTable td:first-child,table.table-bordered.dataTable td:first-child{border-left-width:1px}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:1px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-bottom-width:1px}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^=col-]:last-child{padding-right:0}table.dataTable.table-striped>tbody>tr:nth-of-type(2n+1){--bs-table-accent-bg: transparent}table.dataTable.table-striped>tbody>tr.odd{--bs-table-accent-bg: var(--bs-table-striped-bg)} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bulma.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bulma.css new file mode 100644 index 00000000..5bd8a614 --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bulma.css @@ -0,0 +1,252 @@ +@charset "UTF-8"; +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} +table.dataTable td.dt-control { + text-align: center; + cursor: pointer; +} +table.dataTable td.dt-control:before { + height: 1em; + width: 1em; + margin-top: -9px; + display: inline-block; + color: white; + border: 0.15em solid white; + border-radius: 1em; + box-shadow: 0 0 0.2em #444; + box-sizing: content-box; + text-align: center; + text-indent: 0 !important; + font-family: "Courier New", Courier, monospace; + line-height: 1em; + content: "+"; + background-color: #31b131; +} +table.dataTable tr.dt-hasChild td.dt-control:before { + content: "-"; + background-color: #d33333; +} + +/*! DataTables Bulma integration + * ©2020 SpryMedia Ltd - datatables.net/license + */ +table.dataTable { + clear: both; + margin-top: 6px !important; + margin-bottom: 6px !important; + max-width: none !important; + border-collapse: separate !important; + border-spacing: 0; +} +table.dataTable td, +table.dataTable th { + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +table.dataTable td.dataTables_empty, +table.dataTable th.dataTables_empty { + text-align: center; +} +table.dataTable.nowrap th, +table.dataTable.nowrap td { + white-space: nowrap; +} + +div.dataTables_wrapper div.dataTables_length label { + font-weight: normal; + text-align: left; + white-space: nowrap; +} +div.dataTables_wrapper div.dataTables_length div { + vertical-align: middle; +} +div.dataTables_wrapper div.dataTables_length select { + width: auto; + display: inline-block; + vertical-align: middle; +} +div.dataTables_wrapper div.dataTables_filter { + text-align: right; +} +div.dataTables_wrapper div.dataTables_filter label { + font-weight: normal; + white-space: nowrap; + text-align: left; +} +div.dataTables_wrapper div.dataTables_filter input { + margin-left: 0.5em; + width: auto; + vertical-align: middle; +} +div.dataTables_wrapper div.dataTables_info { + padding-top: 0.5em; +} +div.dataTables_wrapper div.dataTables_paginate ul { + justify-content: flex-end; + list-style: none; + margin: 0; +} +div.dataTables_wrapper div.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 200px; + margin-left: -100px; + margin-top: -26px; + text-align: center; + padding: 1em 0; +} + +table.dataTable > thead > tr > th:active, +table.dataTable > thead > tr > td:active { + outline: none; +} +table.dataTable > thead > tr > th:not(.sorting_disabled), +table.dataTable > thead > tr > td:not(.sorting_disabled) { + padding-right: 30px; +} +table.dataTable > thead .sorting, +table.dataTable > thead .sorting_asc, +table.dataTable > thead .sorting_desc, +table.dataTable > thead .sorting_asc_disabled, +table.dataTable > thead .sorting_desc_disabled { + cursor: pointer; + position: relative; +} +table.dataTable > thead .sorting:before, table.dataTable > thead .sorting:after, +table.dataTable > thead .sorting_asc:before, +table.dataTable > thead .sorting_asc:after, +table.dataTable > thead .sorting_desc:before, +table.dataTable > thead .sorting_desc:after, +table.dataTable > thead .sorting_asc_disabled:before, +table.dataTable > thead .sorting_asc_disabled:after, +table.dataTable > thead .sorting_desc_disabled:before, +table.dataTable > thead .sorting_desc_disabled:after { + position: absolute; + bottom: 0.7em; + display: block; + opacity: 0.3; +} +table.dataTable > thead .sorting:before, +table.dataTable > thead .sorting_asc:before, +table.dataTable > thead .sorting_desc:before, +table.dataTable > thead .sorting_asc_disabled:before, +table.dataTable > thead .sorting_desc_disabled:before { + right: 1em; + content: "↑"; +} +table.dataTable > thead .sorting:after, +table.dataTable > thead .sorting_asc:after, +table.dataTable > thead .sorting_desc:after, +table.dataTable > thead .sorting_asc_disabled:after, +table.dataTable > thead .sorting_desc_disabled:after { + right: 0.5em; + content: "↓"; +} +table.dataTable > thead .sorting_asc:before, +table.dataTable > thead .sorting_desc:after { + opacity: 1; +} +table.dataTable > thead .sorting_asc_disabled:before, +table.dataTable > thead .sorting_desc_disabled:after { + opacity: 0; +} + +div.dataTables_scrollHead table.dataTable { + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody table { + border-top: none; + margin-top: 0 !important; + margin-bottom: 0 !important; +} +div.dataTables_scrollBody table thead .sorting:before, +div.dataTables_scrollBody table thead .sorting_asc:before, +div.dataTables_scrollBody table thead .sorting_desc:before, +div.dataTables_scrollBody table thead .sorting:after, +div.dataTables_scrollBody table thead .sorting_asc:after, +div.dataTables_scrollBody table thead .sorting_desc:after { + display: none; +} +div.dataTables_scrollBody table tbody tr:first-child th, +div.dataTables_scrollBody table tbody tr:first-child td { + border-top: none; +} + +div.dataTables_scrollFoot > .dataTables_scrollFootInner { + box-sizing: content-box; +} +div.dataTables_scrollFoot > .dataTables_scrollFootInner > table { + margin-top: 0 !important; + border-top: none; +} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bulma.min.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bulma.min.css new file mode 100644 index 00000000..1d3a727d --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.bulma.min.css @@ -0,0 +1,3 @@ +table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:"-";background-color:#d33333}/*! DataTables Bulma integration + * ©2020 SpryMedia Ltd - datatables.net/license + */table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important;border-spacing:0}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length div{vertical-align:middle}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block;vertical-align:middle}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5em;width:auto;vertical-align:middle}div.dataTables_wrapper div.dataTables_info{padding-top:.5em}div.dataTables_wrapper div.dataTables_paginate ul{justify-content:flex-end;list-style:none;margin:0}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>thead>tr>th:not(.sorting_disabled),table.dataTable>thead>tr>td:not(.sorting_disabled){padding-right:30px}table.dataTable>thead .sorting,table.dataTable>thead .sorting_asc,table.dataTable>thead .sorting_desc,table.dataTable>thead .sorting_asc_disabled,table.dataTable>thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable>thead .sorting:before,table.dataTable>thead .sorting:after,table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_asc:after,table.dataTable>thead .sorting_desc:before,table.dataTable>thead .sorting_desc:after,table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_asc_disabled:after,table.dataTable>thead .sorting_desc_disabled:before,table.dataTable>thead .sorting_desc_disabled:after{position:absolute;bottom:.7em;display:block;opacity:.3}table.dataTable>thead .sorting:before,table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_desc:before,table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_desc_disabled:before{right:1em;content:"↑"}table.dataTable>thead .sorting:after,table.dataTable>thead .sorting_asc:after,table.dataTable>thead .sorting_desc:after,table.dataTable>thead .sorting_asc_disabled:after,table.dataTable>thead .sorting_desc_disabled:after{right:.5em;content:"↓"}table.dataTable>thead .sorting_asc:before,table.dataTable>thead .sorting_desc:after{opacity:1}table.dataTable>thead .sorting_asc_disabled:before,table.dataTable>thead .sorting_desc_disabled:after{opacity:0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:before,div.dataTables_scrollBody table thead .sorting_asc:before,div.dataTables_scrollBody table thead .sorting_desc:before,div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.dataTables.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.dataTables.css new file mode 100644 index 00000000..32d60fe6 --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.dataTables.css @@ -0,0 +1,555 @@ +@charset "UTF-8"; +td.dt-control { + background: url("https://www.datatables.net/examples/resources/details_open.png") no-repeat center center; + cursor: pointer; +} + +tr.dt-hasChild td.dt-control { + background: url("https://www.datatables.net/examples/resources/details_close.png") no-repeat center center; +} + +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} + +/* + * Table styles + */ +table.dataTable { + width: 100%; + margin: 0 auto; + clear: both; + border-collapse: separate; + border-spacing: 0; + /* + * Header and footer styles + */ + /* + * Body styles + */ +} +table.dataTable thead th, +table.dataTable tfoot th { + font-weight: bold; +} +table.dataTable thead th, +table.dataTable thead td { + padding: 10px 18px; + border-bottom: 1px solid rgba(0, 0, 0, 0.3); +} +table.dataTable thead th:active, +table.dataTable thead td:active { + outline: none; +} +table.dataTable tfoot th, +table.dataTable tfoot td { + padding: 10px 18px 6px 18px; + border-top: 1px solid rgba(0, 0, 0, 0.3); +} +table.dataTable tbody tr { + background-color: transparent; +} +table.dataTable tbody tr.selected { + background-color: #B0BED9; +} +table.dataTable tbody th, +table.dataTable tbody td { + padding: 8px 10px; +} +table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { + border-top: 1px solid rgba(0, 0, 0, 0.15); +} +table.dataTable.row-border tbody tr:first-child th, +table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, +table.dataTable.display tbody tr:first-child td { + border-top: none; +} +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid rgba(0, 0, 0, 0.15); + border-right: 1px solid rgba(0, 0, 0, 0.15); +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid rgba(0, 0, 0, 0.15); +} +table.dataTable.cell-border tbody tr:first-child th, +table.dataTable.cell-border tbody tr:first-child td { + border-top: none; +} +table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { + background-color: rgba(0, 0, 0, 0.0235); +} +table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { + background-color: #acbad4; +} +table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover { + background-color: rgba(0, 0, 0, 0.036); +} +table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected { + background-color: #aab7d1; +} +table.dataTable.order-column tbody tr > .sorting_1, +table.dataTable.order-column tbody tr > .sorting_2, +table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, +table.dataTable.display tbody tr > .sorting_2, +table.dataTable.display tbody tr > .sorting_3 { + background-color: rgba(0, 0, 0, 0.02); +} +table.dataTable.order-column tbody tr.selected > .sorting_1, +table.dataTable.order-column tbody tr.selected > .sorting_2, +table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, +table.dataTable.display tbody tr.selected > .sorting_2, +table.dataTable.display tbody tr.selected > .sorting_3 { + background-color: #acbad5; +} +table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { + background-color: rgba(0, 0, 0, 0.054); +} +table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { + background-color: rgba(0, 0, 0, 0.047); +} +table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { + background-color: rgba(0, 0, 0, 0.039); +} +table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { + background-color: #a6b4cd; +} +table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { + background-color: #a8b5cf; +} +table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { + background-color: #a9b7d1; +} +table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { + background-color: rgba(0, 0, 0, 0.02); +} +table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { + background-color: rgba(0, 0, 0, 0.012); +} +table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { + background-color: rgba(0, 0, 0, 0.004); +} +table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { + background-color: #acbad5; +} +table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { + background-color: #aebcd6; +} +table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { + background-color: #afbdd8; +} +table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 { + background-color: rgba(0, 0, 0, 0.082); +} +table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 { + background-color: rgba(0, 0, 0, 0.075); +} +table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 { + background-color: rgba(0, 0, 0, 0.063); +} +table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 { + background-color: #a2aec7; +} +table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 { + background-color: #a3b0c9; +} +table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 { + background-color: #a5b2cb; +} +table.dataTable.no-footer { + border-bottom: 1px solid rgba(0, 0, 0, 0.3); +} +table.dataTable.nowrap th, table.dataTable.nowrap td { + white-space: nowrap; +} +table.dataTable.compact thead th, +table.dataTable.compact thead td { + padding: 4px 17px; +} +table.dataTable.compact tfoot th, +table.dataTable.compact tfoot td { + padding: 4px; +} +table.dataTable.compact tbody th, +table.dataTable.compact tbody td { + padding: 4px; +} + +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} + +table.dataTable thead > tr > th.dt-orderable-asc, table.dataTable thead > tr > th.dt-orderable-desc, +table.dataTable thead > tr > td.dt-orderable-asc, +table.dataTable thead > tr > td.dt-orderable-desc { + padding-right: 30px; +} +table.dataTable thead > tr > th:active, +table.dataTable thead > tr > td:active { + outline: none; +} +table.dataTable thead > tr > th.dt-orderable-asc, table.dataTable thead > tr > th.dt-orderable-desc, +table.dataTable thead > tr > td.dt-orderable-asc, +table.dataTable thead > tr > td.dt-orderable-desc { + cursor: pointer; + position: relative; +} +table.dataTable thead > tr > th.dt-orderable-asc:before, table.dataTable thead > tr > th.dt-orderable-asc:after, table.dataTable thead > tr > th.dt-orderable-desc:before, table.dataTable thead > tr > th.dt-orderable-desc:after, +table.dataTable thead > tr > td.dt-orderable-asc:before, +table.dataTable thead > tr > td.dt-orderable-asc:after, +table.dataTable thead > tr > td.dt-orderable-desc:before, +table.dataTable thead > tr > td.dt-orderable-desc:after { + position: absolute; + display: block; + opacity: 0.125; + right: 1em; + line-height: 9px; + font-size: 0.9em; +} +table.dataTable thead > tr > th.dt-orderable-asc:before, table.dataTable thead > tr > th.dt-orderable-desc:before, +table.dataTable thead > tr > td.dt-orderable-asc:before, +table.dataTable thead > tr > td.dt-orderable-desc:before { + bottom: 50%; + content: "▴"; +} +table.dataTable thead > tr > th.dt-orderable-asc:after, table.dataTable thead > tr > th.dt-orderable-desc:after, +table.dataTable thead > tr > td.dt-orderable-asc:after, +table.dataTable thead > tr > td.dt-orderable-desc:after { + top: 50%; + content: "▾"; +} +table.dataTable thead > tr > th.dt-ordering-asc:before, table.dataTable thead > tr > th.dt-ordering-desc:after, +table.dataTable thead > tr > td.dt-ordering-asc:before, +table.dataTable thead > tr > td.dt-ordering-desc:after { + opacity: 0.6; +} + +table.dataTable, +table.dataTable th, +table.dataTable td { + box-sizing: border-box; +} + +/* + * Control feature layout + */ +div.dataTables_wrapper { + position: relative; + clear: both; +} +div.dataTables_wrapper div.dataTables_layout_row { + display: table; + clear: both; + width: 100%; +} +div.dataTables_wrapper div.dataTables_layout_cell { + display: table-cell; + vertical-align: middle; + padding: 5px 0; +} +div.dataTables_wrapper div.dataTables_layout_cell.dt-full { + text-align: center; +} +div.dataTables_wrapper div.dataTables_layout_cell.dt-left { + text-align: left; +} +div.dataTables_wrapper div.dataTables_layout_cell.dt-right { + text-align: right; +} +div.dataTables_wrapper .dataTables_filter input { + border: 1px solid #aaa; + border-radius: 3px; + padding: 5px; + background-color: transparent; + margin-left: 3px; +} +div.dataTables_wrapper .dt-input { + border: 1px solid #aaa; + border-radius: 3px; + padding: 5px; + background-color: transparent; +} +div.dataTables_wrapper select.dt-input { + padding: 4px; +} +div.dataTables_wrapper .dataTables_paginate .paginate_button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em 1em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + color: #333 !important; + border: 1px solid transparent; + border-radius: 2px; +} +div.dataTables_wrapper .dataTables_paginate .paginate_button.current, div.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { + color: #333 !important; + border: 1px solid rgba(0, 0, 0, 0.3); + background-color: rgba(230, 230, 230, 0.1); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(230, 230, 230, 0.1)), color-stop(100%, rgba(0, 0, 0, 0.1))); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%); + /* IE10+ */ + background: -o-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%); + /* W3C */ +} +div.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, div.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, div.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { + cursor: default; + color: rgba(0, 0, 0, 0.5) !important; + border: 1px solid transparent; + background: transparent; + box-shadow: none; +} +div.dataTables_wrapper .dataTables_paginate .paginate_button:hover { + color: white !important; + border: 1px solid #111; + background-color: #585858; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #585858 0%, #111 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #585858 0%, #111 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #585858 0%, #111 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #585858 0%, #111 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #585858 0%, #111 100%); + /* W3C */ +} +div.dataTables_wrapper .dataTables_paginate .paginate_button:active { + outline: none; + background-color: #2b2b2b; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%); + /* W3C */ + box-shadow: inset 0 0 3px #111; +} +div.dataTables_wrapper .dataTables_paginate .ellipsis { + padding: 0 1em; +} +div.dataTables_wrapper .dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 40px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + text-align: center; + font-size: 1.2em; + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(25%, rgba(0, 0, 0, 0.9)), color-stop(75%, rgba(0, 0, 0, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); + background: -webkit-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.9) 25%, rgba(0, 0, 0, 0.9) 75%, rgba(0, 0, 0, 0) 100%); + background: -moz-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.9) 25%, rgba(0, 0, 0, 0.9) 75%, rgba(0, 0, 0, 0) 100%); + background: -ms-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.9) 25%, rgba(0, 0, 0, 0.9) 75%, rgba(0, 0, 0, 0) 100%); + background: -o-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.9) 25%, rgba(0, 0, 0, 0.9) 75%, rgba(0, 0, 0, 0) 100%); + background: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.9) 25%, rgba(0, 0, 0, 0.9) 75%, rgba(0, 0, 0, 0) 100%); +} +div.dataTables_wrapper .dataTables_length, +div.dataTables_wrapper .dataTables_filter, +div.dataTables_wrapper .dataTables_info, +div.dataTables_wrapper .dataTables_processing, +div.dataTables_wrapper .dataTables_paginate { + color: #333; +} +div.dataTables_wrapper .dataTables_scroll { + clear: both; +} +div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} +div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th, div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td, div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th, div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td { + vertical-align: middle; +} +div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th > div.dataTables_sizing, +div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td > div.dataTables_sizing, div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th > div.dataTables_sizing, +div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td > div.dataTables_sizing { + height: 0; + overflow: hidden; + margin: 0 !important; + padding: 0 !important; +} +div.dataTables_wrapper.no-footer .dataTables_scrollBody { + border-bottom: 1px solid rgba(0, 0, 0, 0.3); +} +div.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable, +div.dataTables_wrapper.no-footer div.dataTables_scrollBody > table { + border-bottom: none; +} +div.dataTables_wrapper:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +@media screen and (max-width: 767px) { + div.dataTables_wrapper div.dataTables_layout_row { + display: block; + } + div.dataTables_wrapper div.dataTables_layout_cell { + display: block; + } + div.dataTables_wrapper div.dataTables_layout_cell.dt-full, div.dataTables_wrapper div.dataTables_layout_cell.dt-left, div.dataTables_wrapper div.dataTables_layout_cell.dt-right { + text-align: center; + } +} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.dataTables.min.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.dataTables.min.css new file mode 100644 index 00000000..4d9126da --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.dataTables.min.css @@ -0,0 +1 @@ +td.dt-control{background:url("https://www.datatables.net/examples/resources/details_open.png") no-repeat center center;cursor:pointer}tr.dt-hasChild td.dt-control{background:url("https://www.datatables.net/examples/resources/details_close.png") no-repeat center center}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid rgba(0, 0, 0, 0.3)}table.dataTable tbody tr{background-color:transparent}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid rgba(0, 0, 0, 0.15);border-right:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:rgba(0, 0, 0, 0.0235)}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:rgba(0, 0, 0, 0.036)}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:rgba(0, 0, 0, 0.02)}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:rgba(0, 0, 0, 0.054)}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:rgba(0, 0, 0, 0.047)}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:rgba(0, 0, 0, 0.039)}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:rgba(0, 0, 0, 0.02)}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:rgba(0, 0, 0, 0.012)}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:rgba(0, 0, 0, 0.004)}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:rgba(0, 0, 0, 0.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:rgba(0, 0, 0, 0.075)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:rgba(0, 0, 0, 0.063)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc{cursor:pointer;position:relative}table.dataTable thead>tr>th.dt-orderable-asc:before,table.dataTable thead>tr>th.dt-orderable-asc:after,table.dataTable thead>tr>th.dt-orderable-desc:before,table.dataTable thead>tr>th.dt-orderable-desc:after,table.dataTable thead>tr>td.dt-orderable-asc:before,table.dataTable thead>tr>td.dt-orderable-asc:after,table.dataTable thead>tr>td.dt-orderable-desc:before,table.dataTable thead>tr>td.dt-orderable-desc:after{position:absolute;display:block;opacity:.125;right:1em;line-height:9px;font-size:.9em}table.dataTable thead>tr>th.dt-orderable-asc:before,table.dataTable thead>tr>th.dt-orderable-desc:before,table.dataTable thead>tr>td.dt-orderable-asc:before,table.dataTable thead>tr>td.dt-orderable-desc:before{bottom:50%;content:"▴"}table.dataTable thead>tr>th.dt-orderable-asc:after,table.dataTable thead>tr>th.dt-orderable-desc:after,table.dataTable thead>tr>td.dt-orderable-asc:after,table.dataTable thead>tr>td.dt-orderable-desc:after{top:50%;content:"▾"}table.dataTable thead>tr>th.dt-ordering-asc:before,table.dataTable thead>tr>th.dt-ordering-desc:after,table.dataTable thead>tr>td.dt-ordering-asc:before,table.dataTable thead>tr>td.dt-ordering-desc:after{opacity:.6}table.dataTable,table.dataTable th,table.dataTable td{box-sizing:border-box}div.dataTables_wrapper{position:relative;clear:both}div.dataTables_wrapper div.dataTables_layout_row{display:table;clear:both;width:100%}div.dataTables_wrapper div.dataTables_layout_cell{display:table-cell;vertical-align:middle;padding:5px 0}div.dataTables_wrapper div.dataTables_layout_cell.dt-full{text-align:center}div.dataTables_wrapper div.dataTables_layout_cell.dt-left{text-align:left}div.dataTables_wrapper div.dataTables_layout_cell.dt-right{text-align:right}div.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;margin-left:3px}div.dataTables_wrapper .dt-input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent}div.dataTables_wrapper select.dt-input{padding:4px}div.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}div.dataTables_wrapper .dataTables_paginate .paginate_button.current,div.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid rgba(0, 0, 0, 0.3);background-color:rgba(230, 230, 230, 0.1);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(230, 230, 230, 0.1)), color-stop(100%, rgba(0, 0, 0, 0.1)));background:-webkit-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-moz-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-ms-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-o-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:linear-gradient(to bottom, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%)}div.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,div.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,div.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:rgba(0, 0, 0, 0.5) !important;border:1px solid transparent;background:transparent;box-shadow:none}div.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}div.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}div.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}div.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(25%, rgba(0, 0, 0, 0.9)), color-stop(75%, rgba(0, 0, 0, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));background:-webkit-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.9) 25%, rgba(0, 0, 0, 0.9) 75%, rgba(0, 0, 0, 0) 100%);background:-moz-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.9) 25%, rgba(0, 0, 0, 0.9) 75%, rgba(0, 0, 0, 0) 100%);background:-ms-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.9) 25%, rgba(0, 0, 0, 0.9) 75%, rgba(0, 0, 0, 0) 100%);background:-o-linear-gradient(left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.9) 25%, rgba(0, 0, 0, 0.9) 75%, rgba(0, 0, 0, 0) 100%);background:linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.9) 25%, rgba(0, 0, 0, 0.9) 75%, rgba(0, 0, 0, 0) 100%)}div.dataTables_wrapper .dataTables_length,div.dataTables_wrapper .dataTables_filter,div.dataTables_wrapper .dataTables_info,div.dataTables_wrapper .dataTables_processing,div.dataTables_wrapper .dataTables_paginate{color:#333}div.dataTables_wrapper .dataTables_scroll{clear:both}div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,div.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}div.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid rgba(0, 0, 0, 0.3)}div.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,div.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}div.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_layout_row{display:block}div.dataTables_wrapper div.dataTables_layout_cell{display:block}div.dataTables_wrapper div.dataTables_layout_cell.dt-full,div.dataTables_wrapper div.dataTables_layout_cell.dt-left,div.dataTables_wrapper div.dataTables_layout_cell.dt-right{text-align:center}} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.foundation.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.foundation.css new file mode 100644 index 00000000..73f939c8 --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.foundation.css @@ -0,0 +1,215 @@ +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} +table.dataTable td.dt-control { + text-align: center; + cursor: pointer; +} +table.dataTable td.dt-control:before { + height: 1em; + width: 1em; + margin-top: -9px; + display: inline-block; + color: white; + border: 0.15em solid white; + border-radius: 1em; + box-shadow: 0 0 0.2em #444; + box-sizing: content-box; + text-align: center; + text-indent: 0 !important; + font-family: "Courier New", Courier, monospace; + line-height: 1em; + content: "+"; + background-color: #31b131; +} +table.dataTable tr.dt-hasChild td.dt-control:before { + content: "-"; + background-color: #d33333; +} + +table.dataTable { + clear: both; + margin: 0.5em 0 !important; + max-width: none !important; + width: 100%; +} +table.dataTable td, +table.dataTable th { + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +table.dataTable td.dataTables_empty, +table.dataTable th.dataTables_empty { + text-align: center; +} +table.dataTable.nowrap th, table.dataTable.nowrap td { + white-space: nowrap; +} + +div.dataTables_wrapper { + position: relative; +} +div.dataTables_wrapper div.dataTables_length label { + float: left; + text-align: left; + margin-bottom: 0; +} +div.dataTables_wrapper div.dataTables_length select { + width: 75px; + margin-bottom: 0; +} +div.dataTables_wrapper div.dataTables_filter label { + float: right; + margin-bottom: 0; +} +div.dataTables_wrapper div.dataTables_filter input { + display: inline-block !important; + width: auto !important; + margin-bottom: 0; + margin-left: 0.5em; +} +div.dataTables_wrapper div.dataTables_info { + padding-top: 2px; +} +div.dataTables_wrapper div.dataTables_paginate { + float: right; + margin: 0; +} +div.dataTables_wrapper div.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 200px; + margin-left: -100px; + margin-top: -26px; + text-align: center; + padding: 1rem 0; +} + +table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting, +table.dataTable thead > tr > td.sorting_asc, +table.dataTable thead > tr > td.sorting_desc, +table.dataTable thead > tr > td.sorting { + padding-right: 1.5rem; +} +table.dataTable thead > tr > th:active, +table.dataTable thead > tr > td:active { + outline: none; +} +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting_asc_disabled, +table.dataTable thead .sorting_desc_disabled { + cursor: pointer; +} +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting_asc_disabled, +table.dataTable thead .sorting_desc_disabled { + background-repeat: no-repeat; + background-position: center right; +} +table.dataTable thead .sorting { + background-image: url("../images/sort_both.png"); +} +table.dataTable thead .sorting_asc { + background-image: url("../images/sort_asc.png") !important; +} +table.dataTable thead .sorting_desc { + background-image: url("../images/sort_desc.png") !important; +} +table.dataTable thead .sorting_asc_disabled { + background-image: url("../images/sort_asc_disabled.png"); +} +table.dataTable thead .sorting_desc_disabled { + background-image: url("../images/sort_desc_disabled.png"); +} + +div.dataTables_scrollHead table { + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody table { + border-top: none; + margin-top: 0 !important; + margin-bottom: 0 !important; +} +div.dataTables_scrollBody table tbody tr:first-child th, +div.dataTables_scrollBody table tbody tr:first-child td { + border-top: none; +} + +div.dataTables_scrollFoot table { + margin-top: 0 !important; + border-top: none; +} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.foundation.min.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.foundation.min.css new file mode 100644 index 00000000..5ebb21a7 --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.foundation.min.css @@ -0,0 +1 @@ +table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:"-";background-color:#d33333}table.dataTable{clear:both;margin:.5em 0 !important;max-width:none !important;width:100%}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper{position:relative}div.dataTables_wrapper div.dataTables_length label{float:left;text-align:left;margin-bottom:0}div.dataTables_wrapper div.dataTables_length select{width:75px;margin-bottom:0}div.dataTables_wrapper div.dataTables_filter label{float:right;margin-bottom:0}div.dataTables_wrapper div.dataTables_filter input{display:inline-block !important;width:auto !important;margin-bottom:0;margin-left:.5em}div.dataTables_wrapper div.dataTables_info{padding-top:2px}div.dataTables_wrapper div.dataTables_paginate{float:right;margin:0}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1rem 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:1.5rem}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png") !important}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png") !important}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}div.dataTables_scrollHead table{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot table{margin-top:0 !important;border-top:none} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.jqueryui.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.jqueryui.css new file mode 100644 index 00000000..d0811b48 --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.jqueryui.css @@ -0,0 +1,612 @@ +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} +table.dataTable td.dt-control { + text-align: center; + cursor: pointer; +} +table.dataTable td.dt-control:before { + height: 1em; + width: 1em; + margin-top: -9px; + display: inline-block; + color: white; + border: 0.15em solid white; + border-radius: 1em; + box-shadow: 0 0 0.2em #444; + box-sizing: content-box; + text-align: center; + text-indent: 0 !important; + font-family: "Courier New", Courier, monospace; + line-height: 1em; + content: "+"; + background-color: #31b131; +} +table.dataTable tr.dt-hasChild td.dt-control:before { + content: "-"; + background-color: #d33333; +} + +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} +table.dataTable td.dt-control { + text-align: center; + cursor: pointer; +} +table.dataTable td.dt-control:before { + height: 1em; + width: 1em; + margin-top: -9px; + display: inline-block; + color: white; + border: 0.15em solid white; + border-radius: 1em; + box-shadow: 0 0 0.2em #444; + box-sizing: content-box; + text-align: center; + text-indent: 0 !important; + font-family: "Courier New", Courier, monospace; + line-height: 1em; + content: "+"; + background-color: #31b131; +} +table.dataTable tr.dt-hasChild td.dt-control:before { + content: "-"; + background-color: #d33333; +} + +/* + * Table styles + */ +table.dataTable { + width: 100%; + margin: 0 auto; + clear: both; + border-collapse: separate; + border-spacing: 0; + /* + * Header and footer styles + */ + /* + * Body styles + */ +} +table.dataTable thead th, +table.dataTable tfoot th { + font-weight: bold; +} +table.dataTable thead th, +table.dataTable thead td { + padding: 10px 18px; +} +table.dataTable thead th:active, +table.dataTable thead td:active { + outline: none; +} +table.dataTable tfoot th, +table.dataTable tfoot td { + padding: 10px 18px 6px 18px; +} +table.dataTable tbody tr { + background-color: #ffffff; +} +table.dataTable tbody tr.selected { + background-color: #B0BED9; +} +table.dataTable tbody th, +table.dataTable tbody td { + padding: 8px 10px; +} +table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { + border-top: 1px solid #ddd; +} +table.dataTable.row-border tbody tr:first-child th, +table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, +table.dataTable.display tbody tr:first-child td { + border-top: none; +} +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid #ddd; + border-right: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr:first-child th, +table.dataTable.cell-border tbody tr:first-child td { + border-top: none; +} +table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { + background-color: #f9f9f9; +} +table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { + background-color: #acbad4; +} +table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover { + background-color: #f6f6f6; +} +table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected { + background-color: #aab7d1; +} +table.dataTable.order-column tbody tr > .sorting_1, +table.dataTable.order-column tbody tr > .sorting_2, +table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, +table.dataTable.display tbody tr > .sorting_2, +table.dataTable.display tbody tr > .sorting_3 { + background-color: #fafafa; +} +table.dataTable.order-column tbody tr.selected > .sorting_1, +table.dataTable.order-column tbody tr.selected > .sorting_2, +table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, +table.dataTable.display tbody tr.selected > .sorting_2, +table.dataTable.display tbody tr.selected > .sorting_3 { + background-color: #acbad5; +} +table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { + background-color: #f1f1f1; +} +table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { + background-color: #f3f3f3; +} +table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { + background-color: whitesmoke; +} +table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { + background-color: #a6b4cd; +} +table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { + background-color: #a8b5cf; +} +table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { + background-color: #a9b7d1; +} +table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { + background-color: #fafafa; +} +table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { + background-color: #fcfcfc; +} +table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { + background-color: #fefefe; +} +table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { + background-color: #acbad5; +} +table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { + background-color: #aebcd6; +} +table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { + background-color: #afbdd8; +} +table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 { + background-color: #eaeaea; +} +table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 { + background-color: #ececec; +} +table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 { + background-color: #efefef; +} +table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 { + background-color: #a2aec7; +} +table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 { + background-color: #a3b0c9; +} +table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 { + background-color: #a5b2cb; +} +table.dataTable.no-footer { + border-bottom: 1px solid #111; +} +table.dataTable.nowrap th, table.dataTable.nowrap td { + white-space: nowrap; +} +table.dataTable.compact thead th, +table.dataTable.compact thead td { + padding: 4px 17px; +} +table.dataTable.compact tfoot th, +table.dataTable.compact tfoot td { + padding: 4px; +} +table.dataTable.compact tbody th, +table.dataTable.compact tbody td { + padding: 4px; +} + +table.dataTable th, +table.dataTable td { + box-sizing: content-box; +} + +/* + * Control feature layout + */ +.dataTables_wrapper { + position: relative; + clear: both; +} +.dataTables_wrapper .dataTables_length { + float: left; +} +.dataTables_wrapper .dataTables_length select { + border: 1px solid #aaa; + border-radius: 3px; + padding: 5px; + background-color: transparent; + padding: 4px; +} +.dataTables_wrapper .dataTables_filter { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_filter input { + border: 1px solid #aaa; + border-radius: 3px; + padding: 5px; + background-color: transparent; + margin-left: 3px; +} +.dataTables_wrapper .dataTables_info { + clear: both; + float: left; + padding-top: 0.755em; +} +.dataTables_wrapper .dataTables_paginate { + float: right; + text-align: right; + padding-top: 0.25em; +} +.dataTables_wrapper .dataTables_paginate .paginate_button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em 1em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + color: #333 !important; + border: 1px solid transparent; + border-radius: 2px; +} +.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { + color: #333 !important; + border: 1px solid #979797; + background-color: white; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%); + /* IE10+ */ + background: -o-linear-gradient(top, white 0%, #dcdcdc 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, white 0%, #dcdcdc 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { + cursor: default; + color: #666 !important; + border: 1px solid transparent; + background: transparent; + box-shadow: none; +} +.dataTables_wrapper .dataTables_paginate .paginate_button:hover { + color: white !important; + border: 1px solid #111; + background-color: #585858; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #585858 0%, #111 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #585858 0%, #111 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #585858 0%, #111 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #585858 0%, #111 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #585858 0%, #111 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_paginate .paginate_button:active { + outline: none; + background-color: #2b2b2b; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%); + /* W3C */ + box-shadow: inset 0 0 3px #111; +} +.dataTables_wrapper .dataTables_paginate .ellipsis { + padding: 0 1em; +} +.dataTables_wrapper .dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 40px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + text-align: center; + font-size: 1.2em; + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); + background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); +} +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: #333; +} +.dataTables_wrapper .dataTables_scroll { + clear: both; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td { + vertical-align: middle; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th > div.dataTables_sizing, +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td > div.dataTables_sizing, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th > div.dataTables_sizing, +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td > div.dataTables_sizing { + height: 0; + overflow: hidden; + margin: 0 !important; + padding: 0 !important; +} +.dataTables_wrapper.no-footer .dataTables_scrollBody { + border-bottom: 1px solid #111; +} +.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable, +.dataTables_wrapper.no-footer div.dataTables_scrollBody > table { + border-bottom: none; +} +.dataTables_wrapper:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +@media screen and (max-width: 767px) { + .dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_paginate { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_paginate { + margin-top: 0.5em; + } +} +@media screen and (max-width: 640px) { + .dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_filter { + margin-top: 0.5em; + } +} +table.dataTable thead th div.DataTables_sort_wrapper { + position: relative; +} +table.dataTable thead th div.DataTables_sort_wrapper span { + position: absolute; + top: 50%; + margin-top: -8px; + right: -18px; +} +table.dataTable thead th.ui-state-default, +table.dataTable tfoot th.ui-state-default { + border-left-width: 0; +} +table.dataTable thead th.ui-state-default:first-child, +table.dataTable tfoot th.ui-state-default:first-child { + border-left-width: 1px; +} + +/* + * Control feature layout + */ +.dataTables_wrapper .dataTables_paginate .fg-button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + border: 1px solid transparent; +} +.dataTables_wrapper .dataTables_paginate .fg-button:active { + outline: none; +} +.dataTables_wrapper .dataTables_paginate .fg-button:first-child { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.dataTables_wrapper .dataTables_paginate .fg-button:last-child { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.dataTables_wrapper .ui-widget-header { + font-weight: normal; +} +.dataTables_wrapper .ui-toolbar { + padding: 8px; +} +.dataTables_wrapper.no-footer .dataTables_scrollBody { + border-bottom: none; +} +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: inherit; +} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.jqueryui.min.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.jqueryui.min.css new file mode 100644 index 00000000..0c85f050 --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.jqueryui.min.css @@ -0,0 +1 @@ +table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:"-";background-color:#d33333}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:"-";background-color:#d33333}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_length select{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;padding:4px}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;margin-left:3px}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, white 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, white 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, white 0%, #dcdcdc 100%);background:-o-linear-gradient(top, white 0%, #dcdcdc 100%);background:linear-gradient(to bottom, white 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));background:-webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:-moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:-ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:-o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}}table.dataTable thead th div.DataTables_sort_wrapper{position:relative}table.dataTable thead th div.DataTables_sort_wrapper span{position:absolute;top:50%;margin-top:-8px;right:-18px}table.dataTable thead th.ui-state-default,table.dataTable tfoot th.ui-state-default{border-left-width:0}table.dataTable thead th.ui-state-default:first-child,table.dataTable tfoot th.ui-state-default:first-child{border-left-width:1px}.dataTables_wrapper .dataTables_paginate .fg-button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .fg-button:active{outline:none}.dataTables_wrapper .dataTables_paginate .fg-button:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.dataTables_wrapper .dataTables_paginate .fg-button:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.dataTables_wrapper .ui-widget-header{font-weight:normal}.dataTables_wrapper .ui-toolbar{padding:8px}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:none}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:inherit} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.semanticui.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.semanticui.css new file mode 100644 index 00000000..46869568 --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.semanticui.css @@ -0,0 +1,199 @@ +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} +table.dataTable td.dt-control { + text-align: center; + cursor: pointer; +} +table.dataTable td.dt-control:before { + height: 1em; + width: 1em; + margin-top: -9px; + display: inline-block; + color: white; + border: 0.15em solid white; + border-radius: 1em; + box-shadow: 0 0 0.2em #444; + box-sizing: content-box; + text-align: center; + text-indent: 0 !important; + font-family: "Courier New", Courier, monospace; + line-height: 1em; + content: "+"; + background-color: #31b131; +} +table.dataTable tr.dt-hasChild td.dt-control:before { + content: "-"; + background-color: #d33333; +} + +/* + * Styling for DataTables with Semantic UI + */ +table.dataTable.table { + margin: 0; +} +table.dataTable.table thead th, +table.dataTable.table thead td { + position: relative; +} +table.dataTable.table thead th.sorting, table.dataTable.table thead th.sorting_asc, table.dataTable.table thead th.sorting_desc, +table.dataTable.table thead td.sorting, +table.dataTable.table thead td.sorting_asc, +table.dataTable.table thead td.sorting_desc { + padding-right: 20px; +} +table.dataTable.table thead th.sorting:after, table.dataTable.table thead th.sorting_asc:after, table.dataTable.table thead th.sorting_desc:after, +table.dataTable.table thead td.sorting:after, +table.dataTable.table thead td.sorting_asc:after, +table.dataTable.table thead td.sorting_desc:after { + position: absolute; + top: 12px; + right: 8px; + display: block; + font-family: Icons; +} +table.dataTable.table thead th.sorting:after, +table.dataTable.table thead td.sorting:after { + content: "\f0dc"; + color: #ddd; + font-size: 0.8em; +} +table.dataTable.table thead th.sorting_asc:after, +table.dataTable.table thead td.sorting_asc:after { + content: "\f0de"; +} +table.dataTable.table thead th.sorting_desc:after, +table.dataTable.table thead td.sorting_desc:after { + content: "\f0dd"; +} +table.dataTable.table td, +table.dataTable.table th { + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +table.dataTable.table td.dataTables_empty, +table.dataTable.table th.dataTables_empty { + text-align: center; +} +table.dataTable.table.nowrap th, +table.dataTable.table.nowrap td { + white-space: nowrap; +} + +div.dataTables_wrapper div.dataTables_length select { + vertical-align: middle; + min-height: 2.7142em; +} +div.dataTables_wrapper div.dataTables_length .ui.selection.dropdown { + min-width: 0; +} +div.dataTables_wrapper div.dataTables_filter span.input { + margin-left: 0.5em; +} +div.dataTables_wrapper div.dataTables_info { + padding-top: 13px; + white-space: nowrap; +} +div.dataTables_wrapper div.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 200px; + margin-left: -100px; + text-align: center; +} +div.dataTables_wrapper div.row.dt-table { + padding: 0; +} +div.dataTables_wrapper div.dataTables_scrollHead table.dataTable { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + border-bottom: none; +} +div.dataTables_wrapper div.dataTables_scrollBody thead .sorting:after, +div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_asc:after, +div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_desc:after { + display: none; +} +div.dataTables_wrapper div.dataTables_scrollBody table.dataTable { + border-radius: 0; + border-top: none; + border-bottom-width: 0; +} +div.dataTables_wrapper div.dataTables_scrollBody table.dataTable.no-footer { + border-bottom-width: 1px; +} +div.dataTables_wrapper div.dataTables_scrollFoot table.dataTable { + border-top-right-radius: 0; + border-top-left-radius: 0; + border-top: none; +} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.semanticui.min.css b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.semanticui.min.css new file mode 100644 index 00000000..1459fa20 --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/dataTables.semanticui.min.css @@ -0,0 +1 @@ +table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:"-";background-color:#d33333}table.dataTable.table{margin:0}table.dataTable.table thead th,table.dataTable.table thead td{position:relative}table.dataTable.table thead th.sorting,table.dataTable.table thead th.sorting_asc,table.dataTable.table thead th.sorting_desc,table.dataTable.table thead td.sorting,table.dataTable.table thead td.sorting_asc,table.dataTable.table thead td.sorting_desc{padding-right:20px}table.dataTable.table thead th.sorting:after,table.dataTable.table thead th.sorting_asc:after,table.dataTable.table thead th.sorting_desc:after,table.dataTable.table thead td.sorting:after,table.dataTable.table thead td.sorting_asc:after,table.dataTable.table thead td.sorting_desc:after{position:absolute;top:12px;right:8px;display:block;font-family:Icons}table.dataTable.table thead th.sorting:after,table.dataTable.table thead td.sorting:after{content:"";color:#ddd;font-size:.8em}table.dataTable.table thead th.sorting_asc:after,table.dataTable.table thead td.sorting_asc:after{content:""}table.dataTable.table thead th.sorting_desc:after,table.dataTable.table thead td.sorting_desc:after{content:""}table.dataTable.table td,table.dataTable.table th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable.table td.dataTables_empty,table.dataTable.table th.dataTables_empty{text-align:center}table.dataTable.table.nowrap th,table.dataTable.table.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{vertical-align:middle;min-height:2.7142em}div.dataTables_wrapper div.dataTables_length .ui.selection.dropdown{min-width:0}div.dataTables_wrapper div.dataTables_filter span.input{margin-left:.5em}div.dataTables_wrapper div.dataTables_info{padding-top:13px;white-space:nowrap}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;text-align:center}div.dataTables_wrapper div.row.dt-table{padding:0}div.dataTables_wrapper div.dataTables_scrollHead table.dataTable{border-bottom-right-radius:0;border-bottom-left-radius:0;border-bottom:none}div.dataTables_wrapper div.dataTables_scrollBody thead .sorting:after,div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_asc:after,div.dataTables_wrapper div.dataTables_scrollBody thead .sorting_desc:after{display:none}div.dataTables_wrapper div.dataTables_scrollBody table.dataTable{border-radius:0;border-top:none;border-bottom-width:0}div.dataTables_wrapper div.dataTables_scrollBody table.dataTable.no-footer{border-bottom-width:1px}div.dataTables_wrapper div.dataTables_scrollFoot table.dataTable{border-top-right-radius:0;border-top-left-radius:0;border-top:none} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/jquery.dataTables.css b/app/static/DataTables2022/DataTables-1.11.4/css/jquery.dataTables.css new file mode 100644 index 00000000..46559651 --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/jquery.dataTables.css @@ -0,0 +1,482 @@ +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} +table.dataTable td.dt-control { + text-align: center; + cursor: pointer; +} +table.dataTable td.dt-control:before { + height: 1em; + width: 1em; + margin-top: -9px; + display: inline-block; + color: white; + border: 0.15em solid white; + border-radius: 1em; + box-shadow: 0 0 0.2em #444; + box-sizing: content-box; + text-align: center; + text-indent: 0 !important; + font-family: "Courier New", Courier, monospace; + line-height: 1em; + content: "+"; + background-color: #31b131; +} +table.dataTable tr.dt-hasChild td.dt-control:before { + content: "-"; + background-color: #d33333; +} + +/* + * Table styles + */ +table.dataTable { + width: 100%; + margin: 0 auto; + clear: both; + border-collapse: separate; + border-spacing: 0; + /* + * Header and footer styles + */ + /* + * Body styles + */ +} +table.dataTable thead th, +table.dataTable tfoot th { + font-weight: bold; +} +table.dataTable thead th, +table.dataTable thead td { + padding: 10px 18px; + border-bottom: 1px solid #111; +} +table.dataTable thead th:active, +table.dataTable thead td:active { + outline: none; +} +table.dataTable tfoot th, +table.dataTable tfoot td { + padding: 10px 18px 6px 18px; + border-top: 1px solid #111; +} +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting_asc_disabled, +table.dataTable thead .sorting_desc_disabled { + cursor: pointer; + *cursor: hand; + background-repeat: no-repeat; + background-position: center right; +} +table.dataTable thead .sorting { + background-image: url("../images/sort_both.png"); +} +table.dataTable thead .sorting_asc { + background-image: url("../images/sort_asc.png") !important; +} +table.dataTable thead .sorting_desc { + background-image: url("../images/sort_desc.png") !important; +} +table.dataTable thead .sorting_asc_disabled { + background-image: url("../images/sort_asc_disabled.png"); +} +table.dataTable thead .sorting_desc_disabled { + background-image: url("../images/sort_desc_disabled.png"); +} +table.dataTable tbody tr { + background-color: #ffffff; +} +table.dataTable tbody tr.selected { + background-color: #B0BED9; +} +table.dataTable tbody th, +table.dataTable tbody td { + padding: 8px 10px; +} +table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { + border-top: 1px solid #ddd; +} +table.dataTable.row-border tbody tr:first-child th, +table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, +table.dataTable.display tbody tr:first-child td { + border-top: none; +} +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid #ddd; + border-right: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr:first-child th, +table.dataTable.cell-border tbody tr:first-child td { + border-top: none; +} +table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { + background-color: #f9f9f9; +} +table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { + background-color: #acbad4; +} +table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover { + background-color: #f6f6f6; +} +table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected { + background-color: #aab7d1; +} +table.dataTable.order-column tbody tr > .sorting_1, +table.dataTable.order-column tbody tr > .sorting_2, +table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, +table.dataTable.display tbody tr > .sorting_2, +table.dataTable.display tbody tr > .sorting_3 { + background-color: #fafafa; +} +table.dataTable.order-column tbody tr.selected > .sorting_1, +table.dataTable.order-column tbody tr.selected > .sorting_2, +table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, +table.dataTable.display tbody tr.selected > .sorting_2, +table.dataTable.display tbody tr.selected > .sorting_3 { + background-color: #acbad5; +} +table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { + background-color: #f1f1f1; +} +table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { + background-color: #f3f3f3; +} +table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { + background-color: whitesmoke; +} +table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { + background-color: #a6b4cd; +} +table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { + background-color: #a8b5cf; +} +table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { + background-color: #a9b7d1; +} +table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { + background-color: #fafafa; +} +table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { + background-color: #fcfcfc; +} +table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { + background-color: #fefefe; +} +table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { + background-color: #acbad5; +} +table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { + background-color: #aebcd6; +} +table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { + background-color: #afbdd8; +} +table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 { + background-color: #eaeaea; +} +table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 { + background-color: #ececec; +} +table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 { + background-color: #efefef; +} +table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 { + background-color: #a2aec7; +} +table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 { + background-color: #a3b0c9; +} +table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 { + background-color: #a5b2cb; +} +table.dataTable.no-footer { + border-bottom: 1px solid #111; +} +table.dataTable.nowrap th, table.dataTable.nowrap td { + white-space: nowrap; +} +table.dataTable.compact thead th, +table.dataTable.compact thead td { + padding: 4px 17px; +} +table.dataTable.compact tfoot th, +table.dataTable.compact tfoot td { + padding: 4px; +} +table.dataTable.compact tbody th, +table.dataTable.compact tbody td { + padding: 4px; +} + +table.dataTable th, +table.dataTable td { + box-sizing: content-box; +} + +/* + * Control feature layout + */ +.dataTables_wrapper { + position: relative; + clear: both; +} +.dataTables_wrapper .dataTables_length { + float: left; +} +.dataTables_wrapper .dataTables_length select { + border: 1px solid #aaa; + border-radius: 3px; + padding: 5px; + background-color: transparent; + padding: 4px; +} +.dataTables_wrapper .dataTables_filter { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_filter input { + border: 1px solid #aaa; + border-radius: 3px; + padding: 5px; + background-color: transparent; + margin-left: 3px; +} +.dataTables_wrapper .dataTables_info { + clear: both; + float: left; + padding-top: 0.755em; +} +.dataTables_wrapper .dataTables_paginate { + float: right; + text-align: right; + padding-top: 0.25em; +} +.dataTables_wrapper .dataTables_paginate .paginate_button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em 1em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + color: #333 !important; + border: 1px solid transparent; + border-radius: 2px; +} +.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { + color: #333 !important; + border: 1px solid #979797; + background-color: white; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%); + /* IE10+ */ + background: -o-linear-gradient(top, white 0%, #dcdcdc 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, white 0%, #dcdcdc 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { + cursor: default; + color: #666 !important; + border: 1px solid transparent; + background: transparent; + box-shadow: none; +} +.dataTables_wrapper .dataTables_paginate .paginate_button:hover { + color: white !important; + border: 1px solid #111; + background-color: #585858; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #585858 0%, #111 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #585858 0%, #111 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #585858 0%, #111 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #585858 0%, #111 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #585858 0%, #111 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_paginate .paginate_button:active { + outline: none; + background-color: #2b2b2b; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%); + /* W3C */ + box-shadow: inset 0 0 3px #111; +} +.dataTables_wrapper .dataTables_paginate .ellipsis { + padding: 0 1em; +} +.dataTables_wrapper .dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 40px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + text-align: center; + font-size: 1.2em; + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); + background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); +} +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: #333; +} +.dataTables_wrapper .dataTables_scroll { + clear: both; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td { + vertical-align: middle; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > th > div.dataTables_sizing, +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > thead > tr > td > div.dataTables_sizing, .dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > th > div.dataTables_sizing, +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody > table > tbody > tr > td > div.dataTables_sizing { + height: 0; + overflow: hidden; + margin: 0 !important; + padding: 0 !important; +} +.dataTables_wrapper.no-footer .dataTables_scrollBody { + border-bottom: 1px solid #111; +} +.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable, +.dataTables_wrapper.no-footer div.dataTables_scrollBody > table { + border-bottom: none; +} +.dataTables_wrapper:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +@media screen and (max-width: 767px) { + .dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_paginate { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_paginate { + margin-top: 0.5em; + } +} +@media screen and (max-width: 640px) { + .dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_filter { + margin-top: 0.5em; + } +} diff --git a/app/static/DataTables2022/DataTables-1.11.4/css/jquery.dataTables.min.css b/app/static/DataTables2022/DataTables-1.11.4/css/jquery.dataTables.min.css new file mode 100644 index 00000000..99ed6b40 --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/css/jquery.dataTables.min.css @@ -0,0 +1 @@ +table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:"-";background-color:#d33333}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand;background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png") !important}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png") !important}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_length select{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;padding:4px}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;margin-left:3px}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, white 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, white 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, white 0%, #dcdcdc 100%);background:-o-linear-gradient(top, white 0%, #dcdcdc 100%);background:linear-gradient(to bottom, white 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));background:-webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:-moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:-ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:-o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);background:linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}} diff --git a/app/static/DataTables2022/DataTables-1.11.4/images/sort_asc.png b/app/static/DataTables2022/DataTables-1.11.4/images/sort_asc.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ba61a8055fcb18273f2468d335572204667b1f GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3I*bWaz@5R22v2@;zYta_*?F5u6Q zWR@in#&u+WgT?Hi<}D3B3}GOXuX|8Oj3tosHiJ3*4TN zC7>_x-r1O=t(?KoTC+`+>7&2GzdqLHBg&F)2Q?&EGZ+}|Rpsc~9`m>jw35No)z4*} HQ$iB}HK{Sd literal 0 HcmV?d00001 diff --git a/app/static/DataTables2022/DataTables-1.11.4/images/sort_asc_disabled.png b/app/static/DataTables2022/DataTables-1.11.4/images/sort_asc_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..c9fdd8a1502fda301682e907afde86bc450da10f GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S0wixl{&NRXk)AG&AsXkC6C_xhx$boC`TY4@ zxy7GKb-~?6->j|Q{b@g3TV7E(Grjn^aLC2o)_ptHrtUEoT$S@q)~)7U@V;W{6)!%@ u>N?4t-1qslpJw9!O?PJ&w0Cbycxyy87-Q;~nRxO8@-UU*I^KVWyN+&SiMHu5xDOu|HNvwzODfTdXjhVyNu1 z#7^XbGKZ7LW3XeONb$RKLeE*WhqbYpIXPIqK@r4)v+qN8um%99%MPpS9d#7Ed7SL@Bp00i_>zopr0H-Zb Aj{pDw literal 0 HcmV?d00001 diff --git a/app/static/DataTables2022/DataTables-1.11.4/images/sort_desc.png b/app/static/DataTables2022/DataTables-1.11.4/images/sort_desc.png new file mode 100644 index 0000000000000000000000000000000000000000..0e156deb5f61d18f9e2ec5da4f6a8c94a5b4fb41 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3I*R8JSj5R22v2@yo z(czD9$NuDl3Ljm9c#_#4$vXUz=f1~&WY3aa=h!;z7fOEN>ySP9QA=6C-^Dmb&tuM= z4Z&=WZU;2WF>e%GI&mWJk^K!jrbro{W;-I>FeCfLGJl3}+Z^2)3Kw?+EoAU?^>bP0 Hl+XkKC^ZT&|Jn0dmaqO^XNm-CGtk!Ur<_=Jws3;%W$<+Mb6Mw<&;$T1GdZXL literal 0 HcmV?d00001 diff --git a/app/static/DataTables2022/DataTables-1.11.4/js/dataTables.bootstrap.js b/app/static/DataTables2022/DataTables-1.11.4/js/dataTables.bootstrap.js new file mode 100644 index 00000000..4fe69bc4 --- /dev/null +++ b/app/static/DataTables2022/DataTables-1.11.4/js/dataTables.bootstrap.js @@ -0,0 +1,182 @@ +/*! DataTables Bootstrap 3 integration + * ©2011-2015 SpryMedia Ltd - datatables.net/license + */ + +/** + * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and + * DataTables 1.10 or newer. + * + * This file sets the defaults and adds options to DataTables to style its + * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap + * for further information. + */ +(function( factory ){ + if ( typeof define === 'function' && define.amd ) { + // AMD + define( ['jquery', 'datatables.net'], function ( $ ) { + return factory( $, window, document ); + } ); + } + else if ( typeof exports === 'object' ) { + // CommonJS + module.exports = function (root, $) { + if ( ! root ) { + root = window; + } + + if ( ! $ || ! $.fn.dataTable ) { + // Require DataTables, which attaches to jQuery, including + // jQuery if needed and have a $ property so we can access the + // jQuery object that is used + $ = require('datatables.net')(root, $).$; + } + + return factory( $, root, root.document ); + }; + } + else { + // Browser + factory( jQuery, window, document ); + } +}(function( $, window, document, undefined ) { +'use strict'; +var DataTable = $.fn.dataTable; + + +/* Set the defaults for DataTables initialisation */ +$.extend( true, DataTable.defaults, { + dom: + "<'row'<'col-sm-6'l><'col-sm-6'f>>" + + "<'row'<'col-sm-12'tr>>" + + "<'row'<'col-sm-5'i><'col-sm-7'p>>", + renderer: 'bootstrap' +} ); + + +/* Default class modification */ +$.extend( DataTable.ext.classes, { + sWrapper: "dataTables_wrapper form-inline dt-bootstrap", + sFilterInput: "form-control input-sm", + sLengthSelect: "form-control input-sm", + sProcessing: "dataTables_processing panel panel-default" +} ); + + +/* Bootstrap paging button renderer */ +DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) { + var api = new DataTable.Api( settings ); + var classes = settings.oClasses; + var lang = settings.oLanguage.oPaginate; + var aria = settings.oLanguage.oAria.paginate || {}; + var btnDisplay, btnClass, counter=0; + + var attach = function( container, buttons ) { + var i, ien, node, button; + var clickHandler = function ( e ) { + e.preventDefault(); + if ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) { + api.page( e.data.action ).draw( 'page' ); + } + }; + + for ( i=0, ien=buttons.length ; i 0 ? + '' : ' disabled'); + break; + + case 'previous': + btnDisplay = lang.sPrevious; + btnClass = button + (page > 0 ? + '' : ' disabled'); + break; + + case 'next': + btnDisplay = lang.sNext; + btnClass = button + (page < pages-1 ? + '' : ' disabled'); + break; + + case 'last': + btnDisplay = lang.sLast; + btnClass = button + (page < pages-1 ? + '' : ' disabled'); + break; + + default: + btnDisplay = button + 1; + btnClass = page === button ? + 'active' : ''; + break; + } + + if ( btnDisplay ) { + node = $('
  • ', { + 'class': classes.sPageButton+' '+btnClass, + 'id': idx === 0 && typeof button === 'string' ? + settings.sTableId +'_'+ button : + null + } ) + .append( $('', { + 'href': '#', + 'aria-controls': settings.sTableId, + 'aria-label': aria[ button ], + 'data-dt-idx': counter, + 'tabindex': settings.iTabIndex + } ) + .html( btnDisplay ) + ) + .appendTo( container ); + + settings.oApi._fnBindAction( + node, {action: button}, clickHandler + ); + + counter++; + } + } + } + }; + + // IE9 throws an 'unknown error' if document.activeElement is used + // inside an iframe or frame. + var activeEl; + + try { + // Because this approach is destroying and recreating the paging + // elements, focus is lost on the select button which is bad for + // accessibility. So we want to restore focus once the draw has + // completed + activeEl = $(host).find(document.activeElement).data('dt-idx'); + } + catch (e) {} + + attach( + $(host).empty().html('
  • + """ ) iue += 1 diff --git a/app/static/css/scodoc.css b/app/static/css/scodoc.css index ecd8b0ab..9079cfa7 100644 --- a/app/static/css/scodoc.css +++ b/app/static/css/scodoc.css @@ -1699,7 +1699,7 @@ ul.notes_ue_list { margin-top: 4px; margin-right: 1em; margin-left: 1em; - padding-top: 1em; + /* padding-top: 1em; */ padding-bottom: 1em; font-weight: bold; } @@ -1761,6 +1761,27 @@ ul.notes_module_list { font-style: normal; } +div.ue_list_div { + border: 3px solid rgb(35, 0, 160); + padding-left: 5px; + padding-top: 5px; + margin-bottom: 5px; + margin-right: 5px; +} + +div.ue_list_tit_sem { + font-size: 120%; + font-weight: bold; + color: orangered; + display: list-item; /* This has to be "list-item" */ + list-style-type: disc; /* See https://developer.mozilla.org/en-US/docs/Web/CSS/list-style-type */ + list-style-position: inside; +} + +input.sco_tag_checkbox { + margin-bottom: 10px; +} + .notes_ue_list a.stdlink { color: #001084; text-decoration: underline; From 663daa564b02c2f6e809717776e43e4b035ceb95 Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Mon, 21 Feb 2022 20:22:27 +0100 Subject: [PATCH 07/17] not found module gestion entreprises --- app/__init__.py | 3 +- app/entreprises/routes.py | 83 ++++++++++++++++++++++++++++----------- app/scodoc/sco_excel.py | 46 ++++++++++++++++++++++ 3 files changed, 108 insertions(+), 24 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index 76f9471b..cedb4564 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -190,6 +190,7 @@ def create_app(config_class=DevConfig): app.register_error_handler(ScoGenError, handle_sco_value_error) app.register_error_handler(ScoValueError, handle_sco_value_error) + app.register_error_handler(404, handle_sco_value_error) app.register_error_handler(AccessDenied, handle_access_denied) app.register_error_handler(500, internal_server_error) @@ -201,7 +202,7 @@ def create_app(config_class=DevConfig): app.register_blueprint(auth_bp, url_prefix="/auth") from app.entreprises import bp as entreprises_bp - + app.register_blueprint(entreprises_bp, url_prefix="/ScoDoc/entreprises") from app.views import scodoc_bp diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index 43cef4a3..eaef9275 100644 --- a/app/entreprises/routes.py +++ b/app/entreprises/routes.py @@ -123,7 +123,9 @@ def fiche_entreprise(id): La fiche entreprise comporte les informations de l'entreprise, les contacts de l'entreprise et les offres de l'entreprise. """ - entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404() + entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( + description=f"fiche entreprise {id} inconnu" + ) offres_with_files = [] depts = are.get_depts() for offre in entreprise.offres: @@ -163,7 +165,9 @@ def logs_entreprise(id): Permet d'afficher les logs (toutes les entreprises) """ page = request.args.get("page", 1, type=int) - entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404() + entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( + description=f"logs fiche entreprise {id} inconnu" + ) logs = ( EntrepriseLog.query.order_by(EntrepriseLog.date.desc()) .filter_by(object=id) @@ -183,7 +187,9 @@ def fiche_entreprise_validation(id): """ Permet d'afficher la fiche entreprise d'une entreprise a valider """ - entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404() + entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404( + description=f"fiche entreprise (validation) {id} inconnu" + ) contacts = entreprise.contacts return render_template( "entreprises/fiche_entreprise_validation.html", @@ -235,7 +241,9 @@ def offres_expirees(id): """ Permet d'afficher la liste des offres expirés d'une entreprise """ - entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404() + entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( + description=f"fiche entreprise {id} inconnu" + ) offres_expirees_with_files = [] depts = are.get_depts() for offre in entreprise.offres: @@ -309,7 +317,9 @@ def edit_entreprise(id): """ Permet de modifier une entreprise de la base avec un formulaire """ - entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404() + entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( + description=f"entreprise {id} inconnu" + ) form = EntrepriseModificationForm() if form.validate_on_submit(): nom_entreprise = f"{form.nom.data.strip()}" @@ -376,7 +386,9 @@ def delete_entreprise(id): """ Permet de supprimer une entreprise de la base avec un formulaire de confirmation """ - entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404() + entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( + description=f"entreprise {id} inconnu" + ) form = SuppressionConfirmationForm() if form.validate_on_submit(): db.session.delete(entreprise) @@ -411,7 +423,9 @@ def validate_entreprise(id): Permet de valider une entreprise """ form = ValidationConfirmationForm() - entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404() + entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404( + description=f"entreprise (validation) {id} inconnu" + ) if form.validate_on_submit(): entreprise.visible = True nom_entreprise = f"{entreprise.nom}" @@ -436,7 +450,9 @@ def delete_validation_entreprise(id): """ Permet de supprimer une entreprise en attente de validation avec une formulaire de validation """ - entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404() + entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404( + description=f"entreprise (validation) {id} inconnu" + ) form = SuppressionConfirmationForm() if form.validate_on_submit(): db.session.delete(entreprise) @@ -456,7 +472,9 @@ def add_offre(id): """ Permet d'ajouter une offre a une entreprise """ - entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404() + entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( + description=f"entreprise {id} inconnu" + ) form = OffreCreationForm() if form.validate_on_submit(): offre = EntrepriseOffre( @@ -499,7 +517,9 @@ def edit_offre(id): """ Permet de modifier une offre """ - offre = EntrepriseOffre.query.filter_by(id=id).first_or_404() + offre = EntrepriseOffre.query.filter_by(id=id).first_or_404( + description=f"offre {id} inconnu" + ) offre_depts = EntrepriseOffreDepartement.query.filter_by(offre_id=offre.id).all() form = OffreModificationForm() offre_depts_list = [(offre_dept.dept_id) for offre_dept in offre_depts] @@ -554,7 +574,9 @@ def delete_offre(id): """ Permet de supprimer une offre """ - offre = EntrepriseOffre.query.filter_by(id=id).first_or_404() + offre = EntrepriseOffre.query.filter_by(id=id).first_or_404( + description=f"offre {id} inconnu" + ) entreprise_id = offre.entreprise.id form = SuppressionConfirmationForm() if form.validate_on_submit(): @@ -588,7 +610,7 @@ def delete_offre(id): def delete_offre_recue(id): offre_recue = EntrepriseEnvoiOffre.query.filter_by( id=id, receiver_id=current_user.id - ).first_or_404() + ).first_or_404(description=f"offre recu {id} inconnu") db.session.delete(offre_recue) db.session.commit() return redirect(url_for("entreprises.offres_recues")) @@ -600,7 +622,9 @@ def add_contact(id): """ Permet d'ajouter un contact a une entreprise """ - entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404() + entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( + description=f"entreprise {id} inconnu" + ) form = ContactCreationForm(hidden_entreprise_id=entreprise.id) if form.validate_on_submit(): contact = EntrepriseContact( @@ -635,7 +659,9 @@ def edit_contact(id): """ Permet de modifier un contact """ - contact = EntrepriseContact.query.filter_by(id=id).first_or_404() + contact = EntrepriseContact.query.filter_by(id=id).first_or_404( + description=f"contact {id} inconnu" + ) form = ContactModificationForm( hidden_entreprise_id=contact.entreprise_id, hidden_contact_id=contact.id, @@ -678,7 +704,9 @@ def delete_contact(id): """ Permet de supprimer un contact """ - contact = EntrepriseContact.query.filter_by(id=id).first_or_404() + contact = EntrepriseContact.query.filter_by(id=id).first_or_404( + description=f"contact {id} inconnu" + ) form = SuppressionConfirmationForm() if form.validate_on_submit(): contact_count = EntrepriseContact.query.filter_by( @@ -717,7 +745,9 @@ def add_historique(id): """ Permet d'ajouter un étudiant ayant réalisé un stage ou une alternance sur la fiche entreprise de l'entreprise """ - entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404() + entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( + description=f"entreprise {id} inconnu" + ) form = HistoriqueCreationForm() if form.validate_on_submit(): etudiant_nomcomplet = form.etudiant.data.upper().strip() @@ -760,7 +790,9 @@ def envoyer_offre(id): """ Permet d'envoyer une offre à un utilisateur """ - offre = EntrepriseOffre.query.filter_by(id=id).first_or_404() + offre = EntrepriseOffre.query.filter_by(id=id).first_or_404( + description=f"offre {id} inconnu" + ) form = EnvoiOffreForm() if form.validate_on_submit(): responsable_data = form.responsable.data.upper().strip() @@ -794,7 +826,7 @@ def json_etudiants(): """ Permet de récuperer un JSON avec tous les étudiants """ - if request.args.get("term") == None: + if request.args.get("term") is None: abort(400) term = request.args.get("term").strip() etudiants = Identite.query.filter(Identite.nom.ilike(f"%{term}%")).all() @@ -820,7 +852,7 @@ def json_responsables(): """ Permet de récuperer un JSON avec tous les étudiants """ - if request.args.get("term") == None: + if request.args.get("term") is None: abort(400) term = request.args.get("term").strip() responsables = User.query.filter( @@ -873,8 +905,9 @@ def get_import_entreprises_file_sample(): "pays", ] titles = keys[:] + # lines = [["" for x in range(6)] for y in range(100)] title = "ImportEntreprises" - xlsx = sco_excel.excel_simple_table(titles=titles, sheet_name="Entreprises") + xlsx = sco_excel.excel_simple_table_test(titles=titles, sheet_name="Entreprises") filename = title return scu.send_file(xlsx, filename, scu.XLSX_SUFFIX, scu.XLSX_MIMETYPE) @@ -1126,7 +1159,7 @@ def get_offre_file(entreprise_id, offre_id, filedir, filename): as_attachment=True, ) else: - abort(404) + abort(404, description=f"fichier {filename} inconnu") @bp.route("/add_offre_file/", methods=["GET", "POST"]) @@ -1135,7 +1168,9 @@ def add_offre_file(offre_id): """ Permet d'ajouter un fichier à une offre """ - offre = EntrepriseOffre.query.filter_by(id=offre_id).first_or_404() + offre = EntrepriseOffre.query.filter_by(id=offre_id).first_or_404( + description=f"offre {offre_id} inconnu" + ) form = AjoutFichierForm() if form.validate_on_submit(): date = f"{datetime.now().strftime('%Y-%m-%d-%H-%M-%S')}" @@ -1165,7 +1200,9 @@ def delete_offre_file(offre_id, filedir): """ Permet de supprimer un fichier d'une offre """ - offre = EntrepriseOffre.query.filter_by(id=offre_id).first_or_404() + offre = EntrepriseOffre.query.filter_by(id=offre_id).first_or_404( + description=f"offre {offre_id} inconnu" + ) form = SuppressionConfirmationForm() if form.validate_on_submit(): path = os.path.join( diff --git a/app/scodoc/sco_excel.py b/app/scodoc/sco_excel.py index 97824780..cdeb4087 100644 --- a/app/scodoc/sco_excel.py +++ b/app/scodoc/sco_excel.py @@ -428,6 +428,52 @@ def excel_simple_table( return ws.generate() +def excel_simple_table_test( + titles=None, lines=None, sheet_name=b"feuille", titles_styles=None, comments=None +): + """Export simple type 'CSV': 1ere ligne en gras, le reste tel quel""" + ws = ScoExcelSheet(sheet_name) + + if titles is None: + titles = [] + if lines is None: + lines = [[]] + if titles_styles is None: + style = excel_make_style(bold=True) + titles_styles = [style] * len(titles) + if comments is None: + comments = [None] * len(titles) + # ligne de titres + ws.append_row( + [ + ws.make_cell(it, style, comment) + for (it, style, comment) in zip(titles, titles_styles, comments) + ] + ) + default_style = excel_make_style() + text_style = excel_make_style(number_format=FORMAT_GENERAL) + int_style = excel_make_style() + float_style = excel_make_style(number_format=FORMAT_NUMBER_00) + for line in lines: + cells = [] + for it in line: + cell_style = default_style + if type(it) == float: + cell_style = float_style + elif type(it) == int: + cell_style = int_style + else: + cell_style = text_style + cells.append(ws.make_cell(it, cell_style)) + ws.append_row(cells) + + # sheet = ws.wb.active + # for cell in sheet["A2":"A100"]: + # cell.number_format = FORMAT_GENERAL + + return ws.generate() + + def excel_feuille_saisie(e, titreannee, description, lines): """Genere feuille excel pour saisie des notes. E: evaluation (dict) From 722ec09eb58380d3593f060b3a0316da684497cc Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Tue, 22 Feb 2022 21:52:32 +0100 Subject: [PATCH 08/17] preferences, modif export --- app/entreprises/app_relations_entreprises.py | 4 +- app/entreprises/forms.py | 10 ++ app/entreprises/models.py | 12 ++- app/entreprises/routes.py | 91 ++++++++++++++----- app/scodoc/sco_excel.py | 46 ---------- .../entreprises/import_contacts.html | 2 +- .../entreprises/import_entreprises.html | 2 +- app/templates/entreprises/nav.html | 1 + app/templates/entreprises/preferences.html | 15 +++ ...e2915_tables_module_gestion_relations_.py} | 51 +++++++---- 10 files changed, 141 insertions(+), 93 deletions(-) create mode 100644 app/templates/entreprises/preferences.html rename migrations/versions/{593451ab68b3_tables_module_gestion_relations_.py => 717a8dfe2915_tables_module_gestion_relations_.py} (91%) diff --git a/app/entreprises/app_relations_entreprises.py b/app/entreprises/app_relations_entreprises.py index 6f060616..a08b0417 100644 --- a/app/entreprises/app_relations_entreprises.py +++ b/app/entreprises/app_relations_entreprises.py @@ -117,13 +117,13 @@ def verif_contact_data(contact_data): return False # entreprise_id existant - entreprise = Entreprise.query.filter_by(id=contact_data[6]).first() + entreprise = Entreprise.query.filter_by(siret=contact_data[6]).first() if entreprise is None: return False # contact possède le meme nom et prénom dans la meme entreprise contact = EntrepriseContact.query.filter_by( - nom=contact_data[0], prenom=contact_data[1], entreprise_id=contact_data[6] + nom=contact_data[0], prenom=contact_data[1], entreprise_id=entreprise.id ).first() if contact is not None: return False diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index ca74da26..4f2cfd84 100644 --- a/app/entreprises/forms.py +++ b/app/entreprises/forms.py @@ -39,6 +39,7 @@ from wtforms import ( HiddenField, SelectMultipleField, DateField, + BooleanField, ) from wtforms.validators import ValidationError, DataRequired, Email, Optional from wtforms.widgets import ListWidget, CheckboxInput @@ -356,3 +357,12 @@ class ImportForm(FlaskForm): ], ) submit = SubmitField("Importer", render_kw=SUBMIT_MARGE) + + +class PreferencesForm(FlaskForm): + mail_entreprise = StringField( + "Mail notifications", + validators=[Optional(), Email(message="Adresse e-mail invalide")], + ) + check_siret = BooleanField("Vérification SIRET") + submit = SubmitField("Valider", render_kw=SUBMIT_MARGE) diff --git a/app/entreprises/models.py b/app/entreprises/models.py index 9a99f4bc..ce0acc98 100644 --- a/app/entreprises/models.py +++ b/app/entreprises/models.py @@ -27,7 +27,7 @@ class Entreprise(db.Model): def to_dict(self): return { "siret": self.siret, - "nom": self.nom, + "nom_entreprise": self.nom, "adresse": self.adresse, "code_postal": self.codepostal, "ville": self.ville, @@ -49,6 +49,7 @@ class EntrepriseContact(db.Model): service = db.Column(db.Text) def to_dict(self): + entreprise = Entreprise.query.filter_by(id=self.entreprise_id).first() return { "nom": self.nom, "prenom": self.prenom, @@ -56,7 +57,7 @@ class EntrepriseContact(db.Model): "mail": self.mail, "poste": self.poste, "service": self.service, - "entreprise_id": self.entreprise_id, + "entreprise_siret": entreprise.siret, } @@ -138,3 +139,10 @@ class EntrepriseOffreDepartement(db.Model): db.Integer, db.ForeignKey("are_entreprise_offre.id", ondelete="cascade") ) dept_id = db.Column(db.Integer, db.ForeignKey("departement.id", ondelete="cascade")) + + +class EntreprisePreferences(db.Model): + __tablename__ = "are_preferences" + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.Text) + value = db.Column(db.Text) diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index eaef9275..c3bfcfec 100644 --- a/app/entreprises/routes.py +++ b/app/entreprises/routes.py @@ -24,6 +24,7 @@ from app.entreprises.forms import ( AjoutFichierForm, ValidationConfirmationForm, ImportForm, + PreferencesForm, ) from app.entreprises import bp from app.entreprises.models import ( @@ -34,6 +35,7 @@ from app.entreprises.models import ( EntrepriseEtudiant, EntrepriseEnvoiOffre, EntrepriseOffreDepartement, + EntreprisePreferences, ) from app.entreprises import app_relations_entreprises as are from app.models import Identite @@ -124,7 +126,7 @@ def fiche_entreprise(id): les offres de l'entreprise. """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"fiche entreprise {id} inconnu" + description=f"fiche entreprise {id} inconnue" ) offres_with_files = [] depts = are.get_depts() @@ -188,7 +190,7 @@ def fiche_entreprise_validation(id): Permet d'afficher la fiche entreprise d'une entreprise a valider """ entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404( - description=f"fiche entreprise (validation) {id} inconnu" + description=f"fiche entreprise (validation) {id} inconnue" ) contacts = entreprise.contacts return render_template( @@ -242,7 +244,7 @@ def offres_expirees(id): Permet d'afficher la liste des offres expirés d'une entreprise """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"fiche entreprise {id} inconnu" + description=f"fiche entreprise {id} inconnue" ) offres_expirees_with_files = [] depts = are.get_depts() @@ -318,7 +320,7 @@ def edit_entreprise(id): Permet de modifier une entreprise de la base avec un formulaire """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"entreprise {id} inconnu" + description=f"entreprise {id} inconnue" ) form = EntrepriseModificationForm() if form.validate_on_submit(): @@ -387,7 +389,7 @@ def delete_entreprise(id): Permet de supprimer une entreprise de la base avec un formulaire de confirmation """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"entreprise {id} inconnu" + description=f"entreprise {id} inconnue" ) form = SuppressionConfirmationForm() if form.validate_on_submit(): @@ -424,7 +426,7 @@ def validate_entreprise(id): """ form = ValidationConfirmationForm() entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404( - description=f"entreprise (validation) {id} inconnu" + description=f"entreprise (validation) {id} inconnue" ) if form.validate_on_submit(): entreprise.visible = True @@ -451,7 +453,7 @@ def delete_validation_entreprise(id): Permet de supprimer une entreprise en attente de validation avec une formulaire de validation """ entreprise = Entreprise.query.filter_by(id=id, visible=False).first_or_404( - description=f"entreprise (validation) {id} inconnu" + description=f"entreprise (validation) {id} inconnue" ) form = SuppressionConfirmationForm() if form.validate_on_submit(): @@ -473,7 +475,7 @@ def add_offre(id): Permet d'ajouter une offre a une entreprise """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"entreprise {id} inconnu" + description=f"entreprise {id} inconnue" ) form = OffreCreationForm() if form.validate_on_submit(): @@ -518,7 +520,7 @@ def edit_offre(id): Permet de modifier une offre """ offre = EntrepriseOffre.query.filter_by(id=id).first_or_404( - description=f"offre {id} inconnu" + description=f"offre {id} inconnue" ) offre_depts = EntrepriseOffreDepartement.query.filter_by(offre_id=offre.id).all() form = OffreModificationForm() @@ -575,7 +577,7 @@ def delete_offre(id): Permet de supprimer une offre """ offre = EntrepriseOffre.query.filter_by(id=id).first_or_404( - description=f"offre {id} inconnu" + description=f"offre {id} inconnue" ) entreprise_id = offre.entreprise.id form = SuppressionConfirmationForm() @@ -610,7 +612,7 @@ def delete_offre(id): def delete_offre_recue(id): offre_recue = EntrepriseEnvoiOffre.query.filter_by( id=id, receiver_id=current_user.id - ).first_or_404(description=f"offre recu {id} inconnu") + ).first_or_404(description=f"offre recu {id} inconnue") db.session.delete(offre_recue) db.session.commit() return redirect(url_for("entreprises.offres_recues")) @@ -623,7 +625,7 @@ def add_contact(id): Permet d'ajouter un contact a une entreprise """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"entreprise {id} inconnu" + description=f"entreprise {id} inconnue" ) form = ContactCreationForm(hidden_entreprise_id=entreprise.id) if form.validate_on_submit(): @@ -746,7 +748,7 @@ def add_historique(id): Permet d'ajouter un étudiant ayant réalisé un stage ou une alternance sur la fiche entreprise de l'entreprise """ entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( - description=f"entreprise {id} inconnu" + description=f"entreprise {id} inconnue" ) form = HistoriqueCreationForm() if form.validate_on_submit(): @@ -791,7 +793,7 @@ def envoyer_offre(id): Permet d'envoyer une offre à un utilisateur """ offre = EntrepriseOffre.query.filter_by(id=id).first_or_404( - description=f"offre {id} inconnu" + description=f"offre {id} inconnue" ) form = EnvoiOffreForm() if form.validate_on_submit(): @@ -876,7 +878,7 @@ def export_entreprises(): """ entreprises = Entreprise.query.filter_by(visible=True).all() if entreprises: - keys = ["siret", "nom", "adresse", "ville", "code_postal", "pays"] + keys = ["siret", "nom_entreprise", "adresse", "ville", "code_postal", "pays"] titles = keys[:] L = [ [entreprise.to_dict().get(k, "") for k in keys] @@ -901,13 +903,12 @@ def get_import_entreprises_file_sample(): "nom_entreprise", "adresse", "ville", - "codepostal", + "code_postal", "pays", ] titles = keys[:] - # lines = [["" for x in range(6)] for y in range(100)] title = "ImportEntreprises" - xlsx = sco_excel.excel_simple_table_test(titles=titles, sheet_name="Entreprises") + xlsx = sco_excel.excel_simple_table(titles=titles, sheet_name="Entreprises") filename = title return scu.send_file(xlsx, filename, scu.XLSX_SUFFIX, scu.XLSX_MIMETYPE) @@ -930,7 +931,7 @@ def import_entreprises(): entreprises_import = [] siret_list = [] ligne = 0 - titles = ["siret", "nom", "adresse", "ville", "code_postal", "pays"] + titles = ["siret", "nom_entreprise", "adresse", "ville", "code_postal", "pays"] if data[1][0] != titles: flash("Veuillez utilisez la feuille excel à remplir") return render_template( @@ -1010,7 +1011,7 @@ def export_contacts(): "mail", "poste", "service", - "entreprise_id", + "entreprise_siret", ] titles = keys[:] L = [[contact.to_dict().get(k, "") for k in keys] for contact in contacts] @@ -1035,7 +1036,7 @@ def get_import_contacts_file_sample(): "mail", "poste", "service", - "entreprise_id", + "entreprise_siret", ] titles = keys[:] title = "ImportContacts" @@ -1069,7 +1070,7 @@ def import_contacts(): "mail", "poste", "service", - "entreprise_id", + "entreprise_siret", ] if data[1][0] != titles: flash("Veuillez utilisez la feuille excel à remplir") @@ -1169,7 +1170,7 @@ def add_offre_file(offre_id): Permet d'ajouter un fichier à une offre """ offre = EntrepriseOffre.query.filter_by(id=offre_id).first_or_404( - description=f"offre {offre_id} inconnu" + description=f"offre {offre_id} inconnue" ) form = AjoutFichierForm() if form.validate_on_submit(): @@ -1201,7 +1202,7 @@ def delete_offre_file(offre_id, filedir): Permet de supprimer un fichier d'une offre """ offre = EntrepriseOffre.query.filter_by(id=offre_id).first_or_404( - description=f"offre {offre_id} inconnu" + description=f"offre {offre_id} inconnue" ) form = SuppressionConfirmationForm() if form.validate_on_submit(): @@ -1223,3 +1224,45 @@ def delete_offre_file(offre_id, filedir): title="Suppression fichier d'une offre", form=form, ) + + +@bp.route("/preferences", methods=["GET", "POST"]) +@permission_required(Permission.RelationsEntreprisesValidate) +def preferences(): + form = PreferencesForm() + if form.validate_on_submit(): + exists = EntreprisePreferences.query.filter_by(name="check_siret").first() + if not exists: + prefs = EntreprisePreferences( + name="check_siret", value=int(form.check_siret.data) + ) + db.session.add(prefs) + else: + exists.value = int(form.check_siret.data) + db.session.commit() + exists = EntreprisePreferences.query.filter_by( + name="mail_notifications_entreprise" + ).first() + if not exists and form.mail_entreprise.data: + prefs = EntreprisePreferences( + name="mail_notifications_entreprise", + value=form.mail_entreprise.data.strip(), + ) + db.session.add(prefs) + else: + exists.value = form.mail_entreprise.data + db.session.commit() + db.session.commit() + return redirect(url_for("entreprises.index")) + elif request.method == "GET": + mail = EntreprisePreferences.query.filter_by( + name="mail_notifications_entreprise" + ).first() + check_siret = EntreprisePreferences.query.filter_by(name="check_siret").first() + form.mail_entreprise.data = mail.value + form.check_siret.data = int(check_siret.value) + return render_template( + "entreprises/preferences.html", + title="Préférences", + form=form, + ) diff --git a/app/scodoc/sco_excel.py b/app/scodoc/sco_excel.py index cdeb4087..97824780 100644 --- a/app/scodoc/sco_excel.py +++ b/app/scodoc/sco_excel.py @@ -428,52 +428,6 @@ def excel_simple_table( return ws.generate() -def excel_simple_table_test( - titles=None, lines=None, sheet_name=b"feuille", titles_styles=None, comments=None -): - """Export simple type 'CSV': 1ere ligne en gras, le reste tel quel""" - ws = ScoExcelSheet(sheet_name) - - if titles is None: - titles = [] - if lines is None: - lines = [[]] - if titles_styles is None: - style = excel_make_style(bold=True) - titles_styles = [style] * len(titles) - if comments is None: - comments = [None] * len(titles) - # ligne de titres - ws.append_row( - [ - ws.make_cell(it, style, comment) - for (it, style, comment) in zip(titles, titles_styles, comments) - ] - ) - default_style = excel_make_style() - text_style = excel_make_style(number_format=FORMAT_GENERAL) - int_style = excel_make_style() - float_style = excel_make_style(number_format=FORMAT_NUMBER_00) - for line in lines: - cells = [] - for it in line: - cell_style = default_style - if type(it) == float: - cell_style = float_style - elif type(it) == int: - cell_style = int_style - else: - cell_style = text_style - cells.append(ws.make_cell(it, cell_style)) - ws.append_row(cells) - - # sheet = ws.wb.active - # for cell in sheet["A2":"A100"]: - # cell.number_format = FORMAT_GENERAL - - return ws.generate() - - def excel_feuille_saisie(e, titreannee, description, lines): """Genere feuille excel pour saisie des notes. E: evaluation (dict) diff --git a/app/templates/entreprises/import_contacts.html b/app/templates/entreprises/import_contacts.html index a1812293..204a5e97 100644 --- a/app/templates/entreprises/import_contacts.html +++ b/app/templates/entreprises/import_contacts.html @@ -28,7 +28,7 @@ mailtextmail du contact postetextposte du contact servicetextservice dans lequel travaille le contact - entreprise_idintegerl'id de l'entreprise + entreprise_siretintegerSIRET de l'entreprise {% endif %} diff --git a/app/templates/entreprises/import_entreprises.html b/app/templates/entreprises/import_entreprises.html index 21aeb6a0..2539aeb6 100644 --- a/app/templates/entreprises/import_entreprises.html +++ b/app/templates/entreprises/import_entreprises.html @@ -23,7 +23,7 @@ - + diff --git a/app/templates/entreprises/nav.html b/app/templates/entreprises/nav.html index f4673bfc..e2421165 100644 --- a/app/templates/entreprises/nav.html +++ b/app/templates/entreprises/nav.html @@ -6,6 +6,7 @@
  • Offres reçues
  • {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesValidate, None) %}
  • Entreprises à valider
  • +
  • Préférences
  • {% endif %} \ No newline at end of file diff --git a/app/templates/entreprises/preferences.html b/app/templates/entreprises/preferences.html new file mode 100644 index 00000000..62514372 --- /dev/null +++ b/app/templates/entreprises/preferences.html @@ -0,0 +1,15 @@ +{# -*- mode: jinja-html -*- #} +{% extends 'base.html' %} +{% import 'bootstrap/wtf.html' as wtf %} + +{% block app_content %} + {% include 'entreprises/nav.html' %} + +

    Préférences module gestion entreprises

    +
    +
    +
    + {{ wtf.quick_form(form, novalidate=True) }} +
    +
    +{% endblock %} \ No newline at end of file diff --git a/migrations/versions/593451ab68b3_tables_module_gestion_relations_.py b/migrations/versions/717a8dfe2915_tables_module_gestion_relations_.py similarity index 91% rename from migrations/versions/593451ab68b3_tables_module_gestion_relations_.py rename to migrations/versions/717a8dfe2915_tables_module_gestion_relations_.py index e72dff94..eb32d4c1 100644 --- a/migrations/versions/593451ab68b3_tables_module_gestion_relations_.py +++ b/migrations/versions/717a8dfe2915_tables_module_gestion_relations_.py @@ -1,8 +1,8 @@ """tables module gestion relations entreprises -Revision ID: 593451ab68b3 -Revises: c95d5a3bf0de -Create Date: 2022-02-04 17:06:02.519231 +Revision ID: 717a8dfe2915 +Revises: b9aadc10227f +Create Date: 2022-02-22 20:18:57.171246 """ from alembic import op @@ -10,8 +10,8 @@ import sqlalchemy as sa from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. -revision = "593451ab68b3" -down_revision = "c95d5a3bf0de" +revision = "717a8dfe2915" +down_revision = "b9aadc10227f" branch_labels = None depends_on = None @@ -44,6 +44,13 @@ def upgrade(): sa.Column("visible", sa.Boolean(), nullable=True), sa.PrimaryKeyConstraint("id"), ) + op.create_table( + "are_preferences", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("name", sa.Text(), nullable=True), + sa.Column("value", sa.Text(), nullable=True), + sa.PrimaryKeyConstraint("id"), + ) op.create_table( "are_entreprise_contact", sa.Column("id", sa.Integer(), nullable=False), @@ -148,14 +155,31 @@ def upgrade(): op.drop_table("entreprise_correspondant") op.drop_index("ix_entreprises_dept_id", table_name="entreprises") op.drop_table("entreprises") + op.drop_index("ix_apc_competence_id_orebut", table_name="apc_competence") + op.create_index( + op.f("ix_apc_competence_id_orebut"), + "apc_competence", + ["id_orebut"], + unique=False, + ) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f("ix_apc_competence_id_orebut"), table_name="apc_competence") + op.create_index( + "ix_apc_competence_id_orebut", "apc_competence", ["id_orebut"], unique=False + ) op.create_table( "entreprises", - sa.Column("id", sa.INTEGER(), autoincrement=True, nullable=False), + sa.Column( + "id", + sa.INTEGER(), + server_default=sa.text("nextval('entreprises_id_seq'::regclass)"), + autoincrement=True, + nullable=False, + ), sa.Column("nom", sa.TEXT(), autoincrement=False, nullable=True), sa.Column("adresse", sa.TEXT(), autoincrement=False, nullable=True), sa.Column("ville", sa.TEXT(), autoincrement=False, nullable=True), @@ -180,18 +204,12 @@ def downgrade(): ["dept_id"], ["departement.id"], name="entreprises_dept_id_fkey" ), sa.PrimaryKeyConstraint("id", name="entreprises_pkey"), + postgresql_ignore_search_path=False, ) + op.create_index("ix_entreprises_dept_id", "entreprises", ["dept_id"], unique=False) op.create_table( "entreprise_correspondant", - sa.Column( - "id", - sa.INTEGER(), - server_default=sa.text( - "nextval('entreprise_correspondant_id_seq'::regclass)" - ), - autoincrement=True, - nullable=False, - ), + sa.Column("id", sa.INTEGER(), autoincrement=True, nullable=False), sa.Column("entreprise_id", sa.INTEGER(), autoincrement=False, nullable=True), sa.Column("nom", sa.TEXT(), autoincrement=False, nullable=True), sa.Column("prenom", sa.TEXT(), autoincrement=False, nullable=True), @@ -210,7 +228,6 @@ def downgrade(): name="entreprise_correspondant_entreprise_id_fkey", ), sa.PrimaryKeyConstraint("id", name="entreprise_correspondant_pkey"), - postgresql_ignore_search_path=False, ) op.create_table( "entreprise_contact", @@ -241,13 +258,13 @@ def downgrade(): ), sa.PrimaryKeyConstraint("id", name="entreprise_contact_pkey"), ) - op.create_index("ix_entreprises_dept_id", "entreprises", ["dept_id"], unique=False) op.drop_table("are_entreprise_offre_departement") op.drop_table("are_entreprise_envoi_offre_etudiant") op.drop_table("are_entreprise_envoi_offre") op.drop_table("are_entreprise_offre") op.drop_table("are_entreprise_etudiant") op.drop_table("are_entreprise_contact") + op.drop_table("are_preferences") op.drop_table("are_entreprises") op.drop_table("are_entreprise_log") # ### end Alembic commands ### From c86d780585bedf58a10a9ddbcba49320a8f37e92 Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Wed, 23 Feb 2022 19:12:26 +0100 Subject: [PATCH 09/17] =?UTF-8?q?page=20preferences=20fonctionnelle=20(mai?= =?UTF-8?q?l=20a=20v=C3=A9rifier)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/entreprises/app_relations_entreprises.py | 34 +++++++++++++++ app/entreprises/forms.py | 37 ++++++++-------- app/entreprises/models.py | 44 ++++++++++++++++++++ app/entreprises/routes.py | 36 ++++------------ 4 files changed, 105 insertions(+), 46 deletions(-) diff --git a/app/entreprises/app_relations_entreprises.py b/app/entreprises/app_relations_entreprises.py index a08b0417..421f0882 100644 --- a/app/entreprises/app_relations_entreprises.py +++ b/app/entreprises/app_relations_entreprises.py @@ -37,8 +37,11 @@ from app.entreprises.models import ( EntrepriseContact, EntrepriseOffre, EntrepriseOffreDepartement, + EntreprisePreferences, ) +from app import email +from app.scodoc import sco_preferences from app.models import Departement from app.scodoc.sco_permissions import Permission @@ -101,6 +104,37 @@ def get_offre_files_and_depts(offre: EntrepriseOffre, depts: list): return None +def send_email_notifications_entreprise( + subject, entreprise: Entreprise, contact: EntrepriseContact +): + txt = [ + "Une entreprise est en attente de validation", + "Entreprise:", + f"\tnom: {entreprise.nom}", + f"\tsiret: {entreprise.siret}", + f"\tadresse: {entreprise.adresse}", + f"\tcode postal: {entreprise.codepostal}", + f"\tville: {entreprise.ville}", + f"\tpays: {entreprise.pays}", + "", + "Contact:", + f"nom: {contact.nom}", + f"prenom: {contact.prenom}", + f"telephone: {contact.telephone}", + f"mail: {contact.mail}", + f"poste: {contact.poste}", + f"service: {contact.service}", + ] + txt = "\n".join(txt) + email.send_email( + subject, + sco_preferences.get_preference("email_from_addr"), + [EntreprisePreferences.get_email_notifications], + txt, + ) + return txt + + def verif_contact_data(contact_data): """ Verifie les données d'une ligne Excel (contact) diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index 4f2cfd84..5b1b175f 100644 --- a/app/entreprises/forms.py +++ b/app/entreprises/forms.py @@ -44,7 +44,7 @@ from wtforms import ( from wtforms.validators import ValidationError, DataRequired, Email, Optional from wtforms.widgets import ListWidget, CheckboxInput -from app.entreprises.models import Entreprise, EntrepriseContact +from app.entreprises.models import Entreprise, EntrepriseContact, EntreprisePreferences from app.models import Identite, Departement from app.auth.models import User @@ -100,23 +100,24 @@ class EntrepriseCreationForm(FlaskForm): return validate def validate_siret(self, siret): - siret = siret.data.strip() - if re.match("^\d{14}$", siret) is None: - raise ValidationError("Format incorrect") - try: - req = requests.get( - f"https://entreprise.data.gouv.fr/api/sirene/v1/siret/{siret}" - ) - except requests.ConnectionError: - print("no internet") - if req.status_code != 200: - raise ValidationError("SIRET inexistant") - entreprise = Entreprise.query.filter_by(siret=siret).first() - if entreprise is not None: - lien = f'ici' - raise ValidationError( - Markup(f"Entreprise déjà présent, lien vers la fiche : {lien}") - ) + if EntreprisePreferences.get_check_siret(): + siret = siret.data.strip() + if re.match("^\d{14}$", siret) is None: + raise ValidationError("Format incorrect") + try: + req = requests.get( + f"https://entreprise.data.gouv.fr/api/sirene/v1/siret/{siret}" + ) + except requests.ConnectionError: + print("no internet") + if req.status_code != 200: + raise ValidationError("SIRET inexistant") + entreprise = Entreprise.query.filter_by(siret=siret).first() + if entreprise is not None: + lien = f'ici' + raise ValidationError( + Markup(f"Entreprise déjà présent, lien vers la fiche : {lien}") + ) class EntrepriseModificationForm(FlaskForm): diff --git a/app/entreprises/models.py b/app/entreprises/models.py index ce0acc98..923b2445 100644 --- a/app/entreprises/models.py +++ b/app/entreprises/models.py @@ -146,3 +146,47 @@ class EntreprisePreferences(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.Text) value = db.Column(db.Text) + + @classmethod + def get_email_notifications(cls): + mail = EntreprisePreferences.query.filter_by( + name="mail_notifications_entreprise" + ).first() + if mail is None: + return "" + else: + return mail.value + + @classmethod + def set_email_notifications(cls, mail: str): + if mail != cls.get_email_notifications(): + m = EntreprisePreferences.query.filter_by( + name="mail_notifications_entreprise" + ).first() + if m is None: + prefs = EntreprisePreferences( + name="mail_notifications_entreprise", + value=mail, + ) + db.session.add(prefs) + else: + m.value = mail + db.session.commit() + + @classmethod + def get_check_siret(cls): + check_siret = EntreprisePreferences.query.filter_by(name="check_siret").first() + if check_siret is None: + return 1 + else: + return int(check_siret.value) + + @classmethod + def set_check_siret(cls, check_siret: int): + cs = EntreprisePreferences.query.filter_by(name="check_siret").first() + if cs is None: + prefs = EntreprisePreferences(name="check_siret", value=check_siret) + db.session.add(prefs) + else: + cs.value = check_siret + db.session.commit() diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index c3bfcfec..30181334 100644 --- a/app/entreprises/routes.py +++ b/app/entreprises/routes.py @@ -304,6 +304,10 @@ def add_entreprise(): else: entreprise.visible = False db.session.commit() + if EntreprisePreferences.get_email_notifications(): + are.send_email_notifications_entreprise( + "entreprise en attente de validation", entreprise, contact + ) flash("L'entreprise a été ajouté à la liste pour la validation.") return redirect(url_for("entreprises.index")) return render_template( @@ -1231,36 +1235,12 @@ def delete_offre_file(offre_id, filedir): def preferences(): form = PreferencesForm() if form.validate_on_submit(): - exists = EntreprisePreferences.query.filter_by(name="check_siret").first() - if not exists: - prefs = EntreprisePreferences( - name="check_siret", value=int(form.check_siret.data) - ) - db.session.add(prefs) - else: - exists.value = int(form.check_siret.data) - db.session.commit() - exists = EntreprisePreferences.query.filter_by( - name="mail_notifications_entreprise" - ).first() - if not exists and form.mail_entreprise.data: - prefs = EntreprisePreferences( - name="mail_notifications_entreprise", - value=form.mail_entreprise.data.strip(), - ) - db.session.add(prefs) - else: - exists.value = form.mail_entreprise.data - db.session.commit() - db.session.commit() + EntreprisePreferences.set_email_notifications(form.mail_entreprise.data.strip()) + EntreprisePreferences.set_check_siret(int(form.check_siret.data)) return redirect(url_for("entreprises.index")) elif request.method == "GET": - mail = EntreprisePreferences.query.filter_by( - name="mail_notifications_entreprise" - ).first() - check_siret = EntreprisePreferences.query.filter_by(name="check_siret").first() - form.mail_entreprise.data = mail.value - form.check_siret.data = int(check_siret.value) + form.mail_entreprise.data = EntreprisePreferences.get_email_notifications() + form.check_siret.data = int(EntreprisePreferences.get_check_siret()) return render_template( "entreprises/preferences.html", title="Préférences", From 5e77ca53a5d2879b92fbb1609fe9d01c207c9c9d Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Fri, 25 Feb 2022 09:45:14 +0100 Subject: [PATCH 10/17] corrections --- app/entreprises/app_relations_entreprises.py | 33 ++++++++++--------- app/entreprises/forms.py | 8 +++-- app/templates/entreprises/contacts.html | 2 +- app/templates/entreprises/entreprises.html | 2 +- .../entreprises/entreprises_validation.html | 2 +- .../form_modification_entreprise.html | 2 +- app/templates/entreprises/offres_recues.html | 2 +- 7 files changed, 28 insertions(+), 23 deletions(-) diff --git a/app/entreprises/app_relations_entreprises.py b/app/entreprises/app_relations_entreprises.py index 421f0882..af06f6e1 100644 --- a/app/entreprises/app_relations_entreprises.py +++ b/app/entreprises/app_relations_entreprises.py @@ -172,21 +172,22 @@ def verif_entreprise_data(entreprise_data): """ Verifie les données d'une ligne Excel (entreprise) """ - for data in entreprise_data: # champs obligatoires + for data in entreprise_data[1:]: # champs obligatoires if data == "": return False - siret = entreprise_data[0].strip() # vérification sur le siret - if re.match("^\d{14}$", siret) is None: - return False - try: - req = requests.get( - f"https://entreprise.data.gouv.fr/api/sirene/v1/siret/{siret}" - ) - except requests.ConnectionError: - print("no internet") - if req.status_code != 200: - return False - entreprise = Entreprise.query.filter_by(siret=siret).first() - if entreprise is not None: - return False - return True + if EntreprisePreferences.get_check_siret(): + siret = entreprise_data[0].strip() # vérification sur le siret + if re.match("^\d{14}$", siret) is None: + return False + try: + req = requests.get( + f"https://entreprise.data.gouv.fr/api/sirene/v1/siret/{siret}" + ) + except requests.ConnectionError: + print("no internet") + if req.status_code != 200: + return False + entreprise = Entreprise.query.filter_by(siret=siret).first() + if entreprise is not None: + return False + return True diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index 5b1b175f..e5e334c3 100644 --- a/app/entreprises/forms.py +++ b/app/entreprises/forms.py @@ -145,7 +145,9 @@ class OffreCreationForm(FlaskForm): choices=[("Stage"), ("Alternance")], validators=[DataRequired(message=CHAMP_REQUIS)], ) - missions = _build_string_field("Missions") + missions = TextAreaField( + "Missions", validators=[DataRequired(message=CHAMP_REQUIS)] + ) duree = _build_string_field("Durée") depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int) expiration_date = DateField( @@ -171,7 +173,9 @@ class OffreModificationForm(FlaskForm): choices=[("Stage"), ("Alternance")], validators=[DataRequired(message=CHAMP_REQUIS)], ) - missions = _build_string_field("Missions") + missions = TextAreaField( + "Missions", validators=[DataRequired(message=CHAMP_REQUIS)] + ) duree = _build_string_field("Durée") depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int) expiration_date = DateField( diff --git a/app/templates/entreprises/contacts.html b/app/templates/entreprises/contacts.html index 7830f83a..0437c2bc 100644 --- a/app/templates/entreprises/contacts.html +++ b/app/templates/entreprises/contacts.html @@ -31,7 +31,7 @@ {% endif %} -
    +

    Liste des contacts

    AttributTypeDescription
    sirettextsiret de l'entreprise
    nomtextnom de l'entreprise
    nom_entreprisetextnom de l'entreprise
    adressetextadresse de l'entreprise
    villetextville de l'entreprise
    code_postaltextcode postal de l'entreprise
    diff --git a/app/templates/entreprises/entreprises.html b/app/templates/entreprises/entreprises.html index 8e2768c6..b48668e0 100644 --- a/app/templates/entreprises/entreprises.html +++ b/app/templates/entreprises/entreprises.html @@ -34,7 +34,7 @@ {% endif %} -
    +

    Liste des entreprises

    diff --git a/app/templates/entreprises/entreprises_validation.html b/app/templates/entreprises/entreprises_validation.html index a7fbf0c9..d37e2494 100644 --- a/app/templates/entreprises/entreprises_validation.html +++ b/app/templates/entreprises/entreprises_validation.html @@ -22,7 +22,7 @@ {% endif %} -
    +

    Liste des entreprises à valider

    diff --git a/app/templates/entreprises/form_modification_entreprise.html b/app/templates/entreprises/form_modification_entreprise.html index c77cc12f..47ce42e6 100644 --- a/app/templates/entreprises/form_modification_entreprise.html +++ b/app/templates/entreprises/form_modification_entreprise.html @@ -15,7 +15,7 @@
    - Informations de l'API Sirene + Informations de la base SIRENE
    diff --git a/app/templates/entreprises/offres_recues.html b/app/templates/entreprises/offres_recues.html index 2d3c9698..a8814739 100644 --- a/app/templates/entreprises/offres_recues.html +++ b/app/templates/entreprises/offres_recues.html @@ -23,7 +23,7 @@ {% endfor %}
    - supprimer + supprimer
    {% endfor %} From 117764d3da9f1206fdf2f70cfed2ee36db94af94 Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Fri, 25 Feb 2022 09:47:42 +0100 Subject: [PATCH 11/17] corrections --- app/entreprises/app_relations_entreprises.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/entreprises/app_relations_entreprises.py b/app/entreprises/app_relations_entreprises.py index af06f6e1..1a748005 100644 --- a/app/entreprises/app_relations_entreprises.py +++ b/app/entreprises/app_relations_entreprises.py @@ -172,9 +172,14 @@ def verif_entreprise_data(entreprise_data): """ Verifie les données d'une ligne Excel (entreprise) """ - for data in entreprise_data[1:]: # champs obligatoires - if data == "": - return False + if EntreprisePreferences.get_check_siret(): + for data in entreprise_data: # champs obligatoires + if data == "": + return False + else: + for data in entreprise_data[1:]: # champs obligatoires + if data == "": + return False if EntreprisePreferences.get_check_siret(): siret = entreprise_data[0].strip() # vérification sur le siret if re.match("^\d{14}$", siret) is None: From 46eb1185d61e064ebc16da07674fbd93eaee9aa3 Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Fri, 25 Feb 2022 10:40:51 +0100 Subject: [PATCH 12/17] fix --- app/entreprises/app_relations_entreprises.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/entreprises/app_relations_entreprises.py b/app/entreprises/app_relations_entreprises.py index 1a748005..68ff9986 100644 --- a/app/entreprises/app_relations_entreprises.py +++ b/app/entreprises/app_relations_entreprises.py @@ -195,4 +195,4 @@ def verif_entreprise_data(entreprise_data): entreprise = Entreprise.query.filter_by(siret=siret).first() if entreprise is not None: return False - return True + return True From 842f73d692e6a38adffdfa900dd9cc8803326d94 Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Mon, 28 Feb 2022 18:57:05 +0100 Subject: [PATCH 13/17] ajustement formulaires --- app/entreprises/forms.py | 96 ++++++++++--------- app/entreprises/routes.py | 20 ++-- .../entreprises/ajout_entreprise.html | 3 +- .../entreprises/ajout_historique.html | 3 + .../entreprises/envoi_offre_form.html | 3 + app/templates/entreprises/form.html | 3 + .../form_modification_entreprise.html | 3 + .../entreprises/import_contacts.html | 3 + .../entreprises/import_entreprises.html | 3 + 9 files changed, 84 insertions(+), 53 deletions(-) diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index e5e334c3..bb76a3c4 100644 --- a/app/entreprises/forms.py +++ b/app/entreprises/forms.py @@ -65,20 +65,20 @@ def _build_string_field(label, required=True, render_kw=None): class EntrepriseCreationForm(FlaskForm): siret = _build_string_field( - "SIRET", + "SIRET (*)", render_kw={"placeholder": "Numéro composé de 14 chiffres", "maxlength": "14"}, ) - nom_entreprise = _build_string_field("Nom de l'entreprise") - adresse = _build_string_field("Adresse de l'entreprise") - codepostal = _build_string_field("Code postal de l'entreprise") - ville = _build_string_field("Ville de l'entreprise") - pays = _build_string_field("Pays de l'entreprise") + nom_entreprise = _build_string_field("Nom de l'entreprise (*)") + adresse = _build_string_field("Adresse de l'entreprise (*)") + codepostal = _build_string_field("Code postal de l'entreprise (*)") + ville = _build_string_field("Ville de l'entreprise (*)") + pays = _build_string_field("Pays de l'entreprise", required=False) - nom_contact = _build_string_field("Nom du contact") - prenom_contact = _build_string_field("Prénom du contact") - telephone = _build_string_field("Téléphone du contact", required=False) + nom_contact = _build_string_field("Nom du contact (*)") + prenom_contact = _build_string_field("Prénom du contact (*)") + telephone = _build_string_field("Téléphone du contact (*)", required=False) mail = StringField( - "Mail du contact", + "Mail du contact (*)", validators=[Optional(), Email(message="Adresse e-mail invalide")], ) poste = _build_string_field("Poste du contact", required=False) @@ -121,14 +121,22 @@ class EntrepriseCreationForm(FlaskForm): class EntrepriseModificationForm(FlaskForm): - siret = StringField("SIRET", render_kw={"disabled": ""}) - nom = _build_string_field("Nom de l'entreprise") - adresse = _build_string_field("Adresse") - codepostal = _build_string_field("Code postal") - ville = _build_string_field("Ville") - pays = _build_string_field("Pays") + hidden_entreprise_siret = HiddenField() + siret = StringField("SIRET (*)") + nom = _build_string_field("Nom de l'entreprise (*)") + adresse = _build_string_field("Adresse (*)") + codepostal = _build_string_field("Code postal (*)") + ville = _build_string_field("Ville (*)") + pays = _build_string_field("Pays", required=False) submit = SubmitField("Modifier", render_kw=SUBMIT_MARGE) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.siret.render_kw = { + "disabled": "", + "value": self.hidden_entreprise_siret.data, + } + class MultiCheckboxField(SelectMultipleField): widget = ListWidget(prefix_label=False) @@ -136,22 +144,22 @@ class MultiCheckboxField(SelectMultipleField): class OffreCreationForm(FlaskForm): - intitule = _build_string_field("Intitulé") + intitule = _build_string_field("Intitulé (*)") description = TextAreaField( - "Description", validators=[DataRequired(message=CHAMP_REQUIS)] + "Description (*)", validators=[DataRequired(message=CHAMP_REQUIS)] ) type_offre = SelectField( - "Type de l'offre", + "Type de l'offre (*)", choices=[("Stage"), ("Alternance")], validators=[DataRequired(message=CHAMP_REQUIS)], ) missions = TextAreaField( - "Missions", validators=[DataRequired(message=CHAMP_REQUIS)] + "Missions (*)", validators=[DataRequired(message=CHAMP_REQUIS)] ) - duree = _build_string_field("Durée") + duree = _build_string_field("Durée (*)") depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int) expiration_date = DateField( - "Date expiration", validators=[DataRequired(message=CHAMP_REQUIS)] + "Date expiration (*)", validators=[DataRequired(message=CHAMP_REQUIS)] ) submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE) @@ -164,22 +172,22 @@ class OffreCreationForm(FlaskForm): class OffreModificationForm(FlaskForm): - intitule = _build_string_field("Intitulé") + intitule = _build_string_field("Intitulé (*)") description = TextAreaField( - "Description", validators=[DataRequired(message=CHAMP_REQUIS)] + "Description (*)", validators=[DataRequired(message=CHAMP_REQUIS)] ) type_offre = SelectField( - "Type de l'offre", + "Type de l'offre (*)", choices=[("Stage"), ("Alternance")], validators=[DataRequired(message=CHAMP_REQUIS)], ) missions = TextAreaField( - "Missions", validators=[DataRequired(message=CHAMP_REQUIS)] + "Missions (*)", validators=[DataRequired(message=CHAMP_REQUIS)] ) - duree = _build_string_field("Durée") + duree = _build_string_field("Durée (*)") depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int) expiration_date = DateField( - "Date expiration", validators=[DataRequired(message=CHAMP_REQUIS)] + "Date expiration (*)", validators=[DataRequired(message=CHAMP_REQUIS)] ) submit = SubmitField("Modifier", render_kw=SUBMIT_MARGE) @@ -193,11 +201,11 @@ class OffreModificationForm(FlaskForm): class ContactCreationForm(FlaskForm): hidden_entreprise_id = HiddenField() - nom = _build_string_field("Nom") - prenom = _build_string_field("Prénom") - telephone = _build_string_field("Téléphone", required=False) + nom = _build_string_field("Nom (*)") + prenom = _build_string_field("Prénom (*)") + telephone = _build_string_field("Téléphone (*)", required=False) mail = StringField( - "Mail", + "Mail (*)", validators=[Optional(), Email(message="Adresse e-mail invalide")], ) poste = _build_string_field("Poste", required=False) @@ -232,11 +240,11 @@ class ContactCreationForm(FlaskForm): class ContactModificationForm(FlaskForm): hidden_contact_id = HiddenField() hidden_entreprise_id = HiddenField() - nom = _build_string_field("Nom") - prenom = _build_string_field("Prénom") - telephone = _build_string_field("Téléphone", required=False) + nom = _build_string_field("Nom (*)") + prenom = _build_string_field("Prénom (*)") + telephone = _build_string_field("Téléphone (*)", required=False) mail = StringField( - "Mail", + "Mail (*)", validators=[Optional(), Email(message="Adresse e-mail invalide")], ) poste = _build_string_field("Poste", required=False) @@ -271,18 +279,20 @@ class ContactModificationForm(FlaskForm): class HistoriqueCreationForm(FlaskForm): etudiant = _build_string_field( - "Étudiant", + "Étudiant (*)", render_kw={"placeholder": "Tapez le nom de l'étudiant"}, ) type_offre = SelectField( - "Type de l'offre", + "Type de l'offre (*)", choices=[("Stage"), ("Alternance")], validators=[DataRequired(message=CHAMP_REQUIS)], ) date_debut = DateField( - "Date début", validators=[DataRequired(message=CHAMP_REQUIS)] + "Date début (*)", validators=[DataRequired(message=CHAMP_REQUIS)] + ) + date_fin = DateField( + "Date fin (*)", validators=[DataRequired(message=CHAMP_REQUIS)] ) - date_fin = DateField("Date fin", validators=[DataRequired(message=CHAMP_REQUIS)]) submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE) def validate(self): @@ -315,7 +325,7 @@ class HistoriqueCreationForm(FlaskForm): class EnvoiOffreForm(FlaskForm): responsable = _build_string_field( - "Responsable de formation", + "Responsable de formation (*)", render_kw={"placeholder": "Tapez le nom du responsable de formation"}, ) submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE) @@ -336,7 +346,7 @@ class EnvoiOffreForm(FlaskForm): class AjoutFichierForm(FlaskForm): fichier = FileField( - "Fichier", + "Fichier (*)", validators=[ FileRequired(message=CHAMP_REQUIS), FileAllowed(["pdf", "docx"], "Fichier .pdf ou .docx uniquement"), @@ -355,7 +365,7 @@ class ValidationConfirmationForm(FlaskForm): class ImportForm(FlaskForm): fichier = FileField( - "Fichier", + "Fichier (*)", validators=[ FileRequired(message=CHAMP_REQUIS), FileAllowed(["xlsx"], "Fichier .xlsx uniquement"), diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index 30181334..be7f629f 100644 --- a/app/entreprises/routes.py +++ b/app/entreprises/routes.py @@ -275,7 +275,7 @@ def add_entreprise(): adresse=form.adresse.data.strip(), codepostal=form.codepostal.data.strip(), ville=form.ville.data.strip(), - pays=form.pays.data.strip(), + pays=form.pays.data.strip() if form.pays.data.strip() else "FRANCE", ) db.session.add(entreprise) db.session.commit() @@ -326,14 +326,14 @@ def edit_entreprise(id): entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( description=f"entreprise {id} inconnue" ) - form = EntrepriseModificationForm() + form = EntrepriseModificationForm(hidden_entreprise_siret=entreprise.siret) if form.validate_on_submit(): nom_entreprise = f"{form.nom.data.strip()}" if entreprise.nom != form.nom.data.strip(): log = EntrepriseLog( authenticated_user=current_user.user_name, object=entreprise.id, - text=f"{nom_entreprise} - Modification du nom (ancien nom : {entreprise.nom})", + text=f"{nom_entreprise} - Modification du nom (ancien nom: {entreprise.nom})", ) entreprise.nom = form.nom.data.strip() db.session.add(log) @@ -341,7 +341,7 @@ def edit_entreprise(id): log = EntrepriseLog( authenticated_user=current_user.user_name, object=entreprise.id, - text=f"{nom_entreprise} - Modification de l'adresse (ancienne adresse : {entreprise.adresse})", + text=f"{nom_entreprise} - Modification de l'adresse (ancienne adresse: {entreprise.adresse})", ) entreprise.adresse = form.adresse.data.strip() db.session.add(log) @@ -349,7 +349,7 @@ def edit_entreprise(id): log = EntrepriseLog( authenticated_user=current_user.user_name, object=entreprise.id, - text=f"{nom_entreprise} - Modification du code postal (ancien code postal : {entreprise.codepostal})", + text=f"{nom_entreprise} - Modification du code postal (ancien code postal: {entreprise.codepostal})", ) entreprise.codepostal = form.codepostal.data.strip() db.session.add(log) @@ -357,17 +357,19 @@ def edit_entreprise(id): log = EntrepriseLog( authenticated_user=current_user.user_name, object=entreprise.id, - text=f"{nom_entreprise} - Modification de la ville (ancienne ville : {entreprise.ville})", + text=f"{nom_entreprise} - Modification de la ville (ancienne ville: {entreprise.ville})", ) entreprise.ville = form.ville.data.strip() db.session.add(log) - if entreprise.pays != form.pays.data.strip(): + if entreprise.pays != form.pays.data.strip() or not form.pays.data.strip(): log = EntrepriseLog( authenticated_user=current_user.user_name, object=entreprise.id, - text=f"{nom_entreprise} - Modification du pays (ancien pays : {entreprise.pays})", + text=f"{nom_entreprise} - Modification du pays (ancien pays: {entreprise.pays})", + ) + entreprise.pays = ( + form.pays.data.strip() if form.pays.data.strip() else "FRANCE" ) - entreprise.pays = form.pays.data.strip() db.session.add(log) db.session.commit() flash("L'entreprise a été modifié.") diff --git a/app/templates/entreprises/ajout_entreprise.html b/app/templates/entreprises/ajout_entreprise.html index fe597c55..0eead428 100644 --- a/app/templates/entreprises/ajout_entreprise.html +++ b/app/templates/entreprises/ajout_entreprise.html @@ -8,7 +8,8 @@

    - Les champs s'auto complète selon le SIRET + Les champs s'auto complète selon le SIRET
    + (*) champs requis

    {{ wtf.quick_form(form, novalidate=True) }}
    diff --git a/app/templates/entreprises/ajout_historique.html b/app/templates/entreprises/ajout_historique.html index db659229..678d3a72 100644 --- a/app/templates/entreprises/ajout_historique.html +++ b/app/templates/entreprises/ajout_historique.html @@ -13,6 +13,9 @@
    +

    + (*) champs requis +

    {{ wtf.quick_form(form, novalidate=True) }}
    diff --git a/app/templates/entreprises/envoi_offre_form.html b/app/templates/entreprises/envoi_offre_form.html index bfab89e4..94708672 100644 --- a/app/templates/entreprises/envoi_offre_form.html +++ b/app/templates/entreprises/envoi_offre_form.html @@ -13,6 +13,9 @@
    +

    + (*) champs requis +

    {{ wtf.quick_form(form, novalidate=True) }}
    diff --git a/app/templates/entreprises/form.html b/app/templates/entreprises/form.html index d987f1eb..071f84fd 100644 --- a/app/templates/entreprises/form.html +++ b/app/templates/entreprises/form.html @@ -11,6 +11,9 @@
    +

    + (*) champs requis +

    {{ wtf.quick_form(form, novalidate=True) }}
    diff --git a/app/templates/entreprises/form_modification_entreprise.html b/app/templates/entreprises/form_modification_entreprise.html index 47ce42e6..27483d5b 100644 --- a/app/templates/entreprises/form_modification_entreprise.html +++ b/app/templates/entreprises/form_modification_entreprise.html @@ -11,6 +11,9 @@
    +

    + (*) champs requis +

    {{ wtf.quick_form(form, novalidate=True) }}
    diff --git a/app/templates/entreprises/import_contacts.html b/app/templates/entreprises/import_contacts.html index 204a5e97..292a0e9f 100644 --- a/app/templates/entreprises/import_contacts.html +++ b/app/templates/entreprises/import_contacts.html @@ -15,6 +15,9 @@
    +

    + (*) champs requis +

    {{ wtf.quick_form(form, novalidate=True) }}
    diff --git a/app/templates/entreprises/import_entreprises.html b/app/templates/entreprises/import_entreprises.html index 2539aeb6..0b633660 100644 --- a/app/templates/entreprises/import_entreprises.html +++ b/app/templates/entreprises/import_entreprises.html @@ -15,6 +15,9 @@
    +

    + (*) champs requis +

    {{ wtf.quick_form(form, novalidate=True) }}
    From 626dc0157a5ebcad92d6bca3e68a7bbe5374930a Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Tue, 1 Mar 2022 18:45:04 +0100 Subject: [PATCH 14/17] =?UTF-8?q?rendre=20expir=C3=A9e=20une=20offre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/entreprises/forms.py | 8 +- app/entreprises/models.py | 29 +++---- app/entreprises/routes.py | 23 ++++- app/templates/entreprises/_offre.html | 8 +- ...b81be_tables_module_gestion_relations_.py} | 84 ++++++++----------- 5 files changed, 76 insertions(+), 76 deletions(-) rename migrations/versions/{717a8dfe2915_tables_module_gestion_relations_.py => af05f03b81be_tables_module_gestion_relations_.py} (87%) diff --git a/app/entreprises/forms.py b/app/entreprises/forms.py index bb76a3c4..0540c080 100644 --- a/app/entreprises/forms.py +++ b/app/entreprises/forms.py @@ -158,9 +158,7 @@ class OffreCreationForm(FlaskForm): ) duree = _build_string_field("Durée (*)") depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int) - expiration_date = DateField( - "Date expiration (*)", validators=[DataRequired(message=CHAMP_REQUIS)] - ) + expiration_date = DateField("Date expiration", validators=[Optional()]) submit = SubmitField("Envoyer", render_kw=SUBMIT_MARGE) def __init__(self, *args, **kwargs): @@ -186,9 +184,7 @@ class OffreModificationForm(FlaskForm): ) duree = _build_string_field("Durée (*)") depts = MultiCheckboxField("Départements", validators=[Optional()], coerce=int) - expiration_date = DateField( - "Date expiration (*)", validators=[DataRequired(message=CHAMP_REQUIS)] - ) + expiration_date = DateField("Date expiration", validators=[Optional()]) submit = SubmitField("Modifier", render_kw=SUBMIT_MARGE) def __init__(self, *args, **kwargs): diff --git a/app/entreprises/models.py b/app/entreprises/models.py index 923b2445..dd0b4ba4 100644 --- a/app/entreprises/models.py +++ b/app/entreprises/models.py @@ -9,7 +9,7 @@ class Entreprise(db.Model): adresse = db.Column(db.Text) codepostal = db.Column(db.Text) ville = db.Column(db.Text) - pays = db.Column(db.Text) + pays = db.Column(db.Text, default="FRANCE") visible = db.Column(db.Boolean, default=False) contacts = db.relationship( "EntrepriseContact", @@ -36,7 +36,7 @@ class Entreprise(db.Model): class EntrepriseContact(db.Model): - __tablename__ = "are_entreprise_contact" + __tablename__ = "are_contacts" id = db.Column(db.Integer, primary_key=True) entreprise_id = db.Column( db.Integer, db.ForeignKey("are_entreprises.id", ondelete="cascade") @@ -62,7 +62,7 @@ class EntrepriseContact(db.Model): class EntrepriseOffre(db.Model): - __tablename__ = "are_entreprise_offre" + __tablename__ = "are_offres" id = db.Column(db.Integer, primary_key=True) entreprise_id = db.Column( db.Integer, db.ForeignKey("are_entreprises.id", ondelete="cascade") @@ -74,6 +74,7 @@ class EntrepriseOffre(db.Model): missions = db.Column(db.Text) duree = db.Column(db.Text) expiration_date = db.Column(db.Date) + expired = db.Column(db.Boolean, default=False) def to_dict(self): return { @@ -86,7 +87,7 @@ class EntrepriseOffre(db.Model): class EntrepriseLog(db.Model): - __tablename__ = "are_entreprise_log" + __tablename__ = "are_logs" id = db.Column(db.Integer, primary_key=True) date = db.Column(db.DateTime(timezone=True), server_default=db.func.now()) authenticated_user = db.Column(db.Text) @@ -95,7 +96,7 @@ class EntrepriseLog(db.Model): class EntrepriseEtudiant(db.Model): - __tablename__ = "are_entreprise_etudiant" + __tablename__ = "are_etudiants" id = db.Column(db.Integer, primary_key=True) entreprise_id = db.Column( db.Integer, db.ForeignKey("are_entreprises.id", ondelete="cascade") @@ -109,35 +110,29 @@ class EntrepriseEtudiant(db.Model): class EntrepriseEnvoiOffre(db.Model): - __tablename__ = "are_entreprise_envoi_offre" + __tablename__ = "are_envoi_offre" id = db.Column(db.Integer, primary_key=True) sender_id = db.Column(db.Integer, db.ForeignKey("user.id", ondelete="cascade")) receiver_id = db.Column(db.Integer, db.ForeignKey("user.id", ondelete="cascade")) - offre_id = db.Column( - db.Integer, db.ForeignKey("are_entreprise_offre.id", ondelete="cascade") - ) + offre_id = db.Column(db.Integer, db.ForeignKey("are_offres.id", ondelete="cascade")) date_envoi = db.Column(db.DateTime(timezone=True), server_default=db.func.now()) class EntrepriseEnvoiOffreEtudiant(db.Model): - __tablename__ = "are_entreprise_envoi_offre_etudiant" + __tablename__ = "are_envoi_offre_etudiant" id = db.Column(db.Integer, primary_key=True) sender_id = db.Column(db.Integer, db.ForeignKey("user.id", ondelete="cascade")) receiver_id = db.Column( db.Integer, db.ForeignKey("identite.id", ondelete="cascade") ) - offre_id = db.Column( - db.Integer, db.ForeignKey("are_entreprise_offre.id", ondelete="cascade") - ) + offre_id = db.Column(db.Integer, db.ForeignKey("are_offres.id", ondelete="cascade")) date_envoi = db.Column(db.DateTime(timezone=True), server_default=db.func.now()) class EntrepriseOffreDepartement(db.Model): - __tablename__ = "are_entreprise_offre_departement" + __tablename__ = "are_offre_departement" id = db.Column(db.Integer, primary_key=True) - offre_id = db.Column( - db.Integer, db.ForeignKey("are_entreprise_offre.id", ondelete="cascade") - ) + offre_id = db.Column(db.Integer, db.ForeignKey("are_offres.id", ondelete="cascade")) dept_id = db.Column(db.Integer, db.ForeignKey("departement.id", ondelete="cascade")) diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index be7f629f..a72b2eb8 100644 --- a/app/entreprises/routes.py +++ b/app/entreprises/routes.py @@ -131,7 +131,13 @@ def fiche_entreprise(id): offres_with_files = [] depts = are.get_depts() for offre in entreprise.offres: - if date.today() < offre.expiration_date: + if not offre.expired and ( + offre.expiration_date is None + or ( + offre.expiration_date is not None + and date.today() < offre.expiration_date + ) + ): offre_with_files = are.get_offre_files_and_depts(offre, depts) if offre_with_files is not None: offres_with_files.append(offre_with_files) @@ -249,7 +255,9 @@ def offres_expirees(id): offres_expirees_with_files = [] depts = are.get_depts() for offre in entreprise.offres: - if date.today() > offre.expiration_date: + if offre.expired or ( + offre.expiration_date is not None and date.today() > offre.expiration_date + ): offre_expiree_with_files = are.get_offre_files_and_depts(offre, depts) if offre_expiree_with_files is not None: offres_expirees_with_files.append(offre_expiree_with_files) @@ -624,6 +632,17 @@ def delete_offre_recue(id): return redirect(url_for("entreprises.offres_recues")) +@bp.route("/expired/", methods=["GET", "POST"]) +@permission_required(Permission.RelationsEntreprisesChange) +def expired(id): + offre = EntrepriseOffre.query.filter_by(id=id).first_or_404( + description=f"offre {id} inconnue" + ) + offre.expired = not offre.expired + db.session.commit() + return redirect(url_for("entreprises.fiche_entreprise", id=offre.entreprise_id)) + + @bp.route("/add_contact/", methods=["GET", "POST"]) @permission_required(Permission.RelationsEntreprisesChange) def add_contact(id): diff --git a/app/templates/entreprises/_offre.html b/app/templates/entreprises/_offre.html index 0176ddd2..cff6f03a 100644 --- a/app/templates/entreprises/_offre.html +++ b/app/templates/entreprises/_offre.html @@ -29,6 +29,12 @@ {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesSend, None) %} Envoyer l'offre {% endif %} + {% if current_user.has_permission(current_user.Permission.RelationsEntreprisesChange, None) %} + {% if not offre[0].expired %} + Rendre expirée + {% else %} + Rendre non expirée + {% endif %} + {% endif %}
    -
    \ No newline at end of file diff --git a/migrations/versions/717a8dfe2915_tables_module_gestion_relations_.py b/migrations/versions/af05f03b81be_tables_module_gestion_relations_.py similarity index 87% rename from migrations/versions/717a8dfe2915_tables_module_gestion_relations_.py rename to migrations/versions/af05f03b81be_tables_module_gestion_relations_.py index eb32d4c1..7f23ca9f 100644 --- a/migrations/versions/717a8dfe2915_tables_module_gestion_relations_.py +++ b/migrations/versions/af05f03b81be_tables_module_gestion_relations_.py @@ -1,8 +1,8 @@ """tables module gestion relations entreprises -Revision ID: 717a8dfe2915 +Revision ID: af05f03b81be Revises: b9aadc10227f -Create Date: 2022-02-22 20:18:57.171246 +Create Date: 2022-03-01 17:12:32.927643 """ from alembic import op @@ -10,7 +10,7 @@ import sqlalchemy as sa from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. -revision = "717a8dfe2915" +revision = "af05f03b81be" down_revision = "b9aadc10227f" branch_labels = None depends_on = None @@ -18,20 +18,6 @@ depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.create_table( - "are_entreprise_log", - sa.Column("id", sa.Integer(), nullable=False), - sa.Column( - "date", - sa.DateTime(timezone=True), - server_default=sa.text("now()"), - nullable=True, - ), - sa.Column("authenticated_user", sa.Text(), nullable=True), - sa.Column("object", sa.Integer(), nullable=True), - sa.Column("text", sa.Text(), nullable=True), - sa.PrimaryKeyConstraint("id"), - ) op.create_table( "are_entreprises", sa.Column("id", sa.Integer(), nullable=False), @@ -44,6 +30,20 @@ def upgrade(): sa.Column("visible", sa.Boolean(), nullable=True), sa.PrimaryKeyConstraint("id"), ) + op.create_table( + "are_logs", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column( + "date", + sa.DateTime(timezone=True), + server_default=sa.text("now()"), + nullable=True, + ), + sa.Column("authenticated_user", sa.Text(), nullable=True), + sa.Column("object", sa.Integer(), nullable=True), + sa.Column("text", sa.Text(), nullable=True), + sa.PrimaryKeyConstraint("id"), + ) op.create_table( "are_preferences", sa.Column("id", sa.Integer(), nullable=False), @@ -52,7 +52,7 @@ def upgrade(): sa.PrimaryKeyConstraint("id"), ) op.create_table( - "are_entreprise_contact", + "are_contacts", sa.Column("id", sa.Integer(), nullable=False), sa.Column("entreprise_id", sa.Integer(), nullable=True), sa.Column("nom", sa.Text(), nullable=True), @@ -67,7 +67,7 @@ def upgrade(): sa.PrimaryKeyConstraint("id"), ) op.create_table( - "are_entreprise_etudiant", + "are_etudiants", sa.Column("id", sa.Integer(), nullable=False), sa.Column("entreprise_id", sa.Integer(), nullable=True), sa.Column("etudid", sa.Integer(), nullable=True), @@ -82,7 +82,7 @@ def upgrade(): sa.PrimaryKeyConstraint("id"), ) op.create_table( - "are_entreprise_offre", + "are_offres", sa.Column("id", sa.Integer(), nullable=False), sa.Column("entreprise_id", sa.Integer(), nullable=True), sa.Column( @@ -97,13 +97,14 @@ def upgrade(): sa.Column("missions", sa.Text(), nullable=True), sa.Column("duree", sa.Text(), nullable=True), sa.Column("expiration_date", sa.Date(), nullable=True), + sa.Column("expired", sa.Boolean(), nullable=True), sa.ForeignKeyConstraint( ["entreprise_id"], ["are_entreprises.id"], ondelete="cascade" ), sa.PrimaryKeyConstraint("id"), ) op.create_table( - "are_entreprise_envoi_offre", + "are_envoi_offre", sa.Column("id", sa.Integer(), nullable=False), sa.Column("sender_id", sa.Integer(), nullable=True), sa.Column("receiver_id", sa.Integer(), nullable=True), @@ -114,15 +115,13 @@ def upgrade(): server_default=sa.text("now()"), nullable=True, ), - sa.ForeignKeyConstraint( - ["offre_id"], ["are_entreprise_offre.id"], ondelete="cascade" - ), + sa.ForeignKeyConstraint(["offre_id"], ["are_offres.id"], ondelete="cascade"), sa.ForeignKeyConstraint(["receiver_id"], ["user.id"], ondelete="cascade"), sa.ForeignKeyConstraint(["sender_id"], ["user.id"], ondelete="cascade"), sa.PrimaryKeyConstraint("id"), ) op.create_table( - "are_entreprise_envoi_offre_etudiant", + "are_envoi_offre_etudiant", sa.Column("id", sa.Integer(), nullable=False), sa.Column("sender_id", sa.Integer(), nullable=True), sa.Column("receiver_id", sa.Integer(), nullable=True), @@ -133,44 +132,29 @@ def upgrade(): server_default=sa.text("now()"), nullable=True, ), - sa.ForeignKeyConstraint( - ["offre_id"], ["are_entreprise_offre.id"], ondelete="cascade" - ), + sa.ForeignKeyConstraint(["offre_id"], ["are_offres.id"], ondelete="cascade"), sa.ForeignKeyConstraint(["receiver_id"], ["identite.id"], ondelete="cascade"), sa.ForeignKeyConstraint(["sender_id"], ["user.id"], ondelete="cascade"), sa.PrimaryKeyConstraint("id"), ) op.create_table( - "are_entreprise_offre_departement", + "are_offre_departement", sa.Column("id", sa.Integer(), nullable=False), sa.Column("offre_id", sa.Integer(), nullable=True), sa.Column("dept_id", sa.Integer(), nullable=True), sa.ForeignKeyConstraint(["dept_id"], ["departement.id"], ondelete="cascade"), - sa.ForeignKeyConstraint( - ["offre_id"], ["are_entreprise_offre.id"], ondelete="cascade" - ), + sa.ForeignKeyConstraint(["offre_id"], ["are_offres.id"], ondelete="cascade"), sa.PrimaryKeyConstraint("id"), ) op.drop_table("entreprise_contact") op.drop_table("entreprise_correspondant") op.drop_index("ix_entreprises_dept_id", table_name="entreprises") op.drop_table("entreprises") - op.drop_index("ix_apc_competence_id_orebut", table_name="apc_competence") - op.create_index( - op.f("ix_apc_competence_id_orebut"), - "apc_competence", - ["id_orebut"], - unique=False, - ) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### - op.drop_index(op.f("ix_apc_competence_id_orebut"), table_name="apc_competence") - op.create_index( - "ix_apc_competence_id_orebut", "apc_competence", ["id_orebut"], unique=False - ) op.create_table( "entreprises", sa.Column( @@ -258,13 +242,13 @@ def downgrade(): ), sa.PrimaryKeyConstraint("id", name="entreprise_contact_pkey"), ) - op.drop_table("are_entreprise_offre_departement") - op.drop_table("are_entreprise_envoi_offre_etudiant") - op.drop_table("are_entreprise_envoi_offre") - op.drop_table("are_entreprise_offre") - op.drop_table("are_entreprise_etudiant") - op.drop_table("are_entreprise_contact") + op.drop_table("are_offre_departement") + op.drop_table("are_envoi_offre_etudiant") + op.drop_table("are_envoi_offre") + op.drop_table("are_offres") + op.drop_table("are_etudiants") + op.drop_table("are_contacts") op.drop_table("are_preferences") + op.drop_table("are_logs") op.drop_table("are_entreprises") - op.drop_table("are_entreprise_log") # ### end Alembic commands ### From 37fa253950d5767c6e6579e9e38e5724d2278a7a Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Wed, 2 Mar 2022 15:27:35 +0100 Subject: [PATCH 15/17] ajout message info, doc --- app/entreprises/routes.py | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/app/entreprises/routes.py b/app/entreprises/routes.py index a72b2eb8..d1633e71 100644 --- a/app/entreprises/routes.py +++ b/app/entreprises/routes.py @@ -53,7 +53,7 @@ from werkzeug.utils import secure_filename @permission_required(Permission.RelationsEntreprisesView) def index(): """ - Permet d'afficher une page avec la liste des entreprises et une liste des dernières opérations + Permet d'afficher une page avec la liste des entreprises (visible) et une liste des dernières opérations """ entreprises = Entreprise.query.filter_by(visible=True) logs = EntrepriseLog.query.order_by(EntrepriseLog.date.desc()).limit(LOGS_LEN).all() @@ -86,7 +86,7 @@ def logs(): @permission_required(Permission.RelationsEntreprisesValidate) def validation(): """ - Permet d'afficher une page avec la liste des entreprises a valider + Permet d'afficher une page avec la liste des entreprises a valider (non visible) """ entreprises = Entreprise.query.filter_by(visible=False).all() return render_template( @@ -100,7 +100,7 @@ def validation(): @permission_required(Permission.RelationsEntreprisesView) def contacts(): """ - Permet d'afficher une page la liste des contacts et une liste des dernières opérations + Permet d'afficher une page avec la liste des contacts des entreprises visibles et une liste des dernières opérations """ contacts = ( db.session.query(EntrepriseContact, Entreprise) @@ -170,7 +170,7 @@ def fiche_entreprise(id): @permission_required(Permission.RelationsEntreprisesView) def logs_entreprise(id): """ - Permet d'afficher les logs (toutes les entreprises) + Permet d'afficher les logs d'une entreprise """ page = request.args.get("page", 1, type=int) entreprise = Entreprise.query.filter_by(id=id, visible=True).first_or_404( @@ -211,7 +211,7 @@ def fiche_entreprise_validation(id): @permission_required(Permission.RelationsEntreprisesView) def offres_recues(): """ - Permet d'afficher la page où l'on recoit les offres + Permet d'afficher la page où l'on peut voir les offres reçues """ offres_recues = ( db.session.query(EntrepriseEnvoiOffre, EntrepriseOffre) @@ -624,6 +624,9 @@ def delete_offre(id): @bp.route("/delete_offre_recue/", methods=["GET", "POST"]) @permission_required(Permission.RelationsEntreprisesView) def delete_offre_recue(id): + """ + Permet de supprimer une offre reçue + """ offre_recue = EntrepriseEnvoiOffre.query.filter_by( id=id, receiver_id=current_user.id ).first_or_404(description=f"offre recu {id} inconnue") @@ -635,11 +638,18 @@ def delete_offre_recue(id): @bp.route("/expired/", methods=["GET", "POST"]) @permission_required(Permission.RelationsEntreprisesChange) def expired(id): + """ + Permet de rendre expirée et non expirée une offre + """ offre = EntrepriseOffre.query.filter_by(id=id).first_or_404( description=f"offre {id} inconnue" ) offre.expired = not offre.expired db.session.commit() + if offre.expired: + flash("L'offre a été rendu expirée") + else: + flash("L'offre a été rendu non expirée") return redirect(url_for("entreprises.fiche_entreprise", id=offre.entreprise_id)) @@ -815,7 +825,7 @@ def add_historique(id): @permission_required(Permission.RelationsEntreprisesSend) def envoyer_offre(id): """ - Permet d'envoyer une offre à un utilisateur + Permet d'envoyer une offre à un utilisateur ScoDoc """ offre = EntrepriseOffre.query.filter_by(id=id).first_or_404( description=f"offre {id} inconnue" @@ -877,7 +887,7 @@ def json_etudiants(): @permission_required(Permission.RelationsEntreprisesChange) def json_responsables(): """ - Permet de récuperer un JSON avec tous les étudiants + Permet de récuperer un JSON avec tous les utilisateurs ScoDoc """ if request.args.get("term") is None: abort(400) @@ -921,7 +931,7 @@ def export_entreprises(): @permission_required(Permission.RelationsEntreprisesExport) def get_import_entreprises_file_sample(): """ - Permet de récupérer un fichier pour pouvoir importer des entreprises + Permet de récupérer un fichier exemple vide pour pouvoir importer des entreprises """ keys = [ "siret", @@ -1052,7 +1062,7 @@ def export_contacts(): @permission_required(Permission.RelationsEntreprisesExport) def get_import_contacts_file_sample(): """ - Permet de récupérer un fichier pour pouvoir importer des contacts + Permet de récupérer un fichier exemple vide pour pouvoir importer des contacts """ keys = [ "nom", @@ -1254,6 +1264,9 @@ def delete_offre_file(offre_id, filedir): @bp.route("/preferences", methods=["GET", "POST"]) @permission_required(Permission.RelationsEntreprisesValidate) def preferences(): + """ + Permet d'afficher la page des préférences du module gestion des relations entreprises + """ form = PreferencesForm() if form.validate_on_submit(): EntreprisePreferences.set_email_notifications(form.mail_entreprise.data.strip()) From 94eedcc6e8bf4bb3c9961a0bb2a6d9eb90e3941b Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Wed, 2 Mar 2022 17:56:58 +0100 Subject: [PATCH 16/17] Export des annotations --- app/scodoc/sco_groups.py | 22 ++++++++++++++++++++++ app/scodoc/sco_groups_view.py | 2 ++ app/views/scolar.py | 3 +++ 3 files changed, 27 insertions(+) diff --git a/app/scodoc/sco_groups.py b/app/scodoc/sco_groups.py index 6a1ee467..f8653fe3 100644 --- a/app/scodoc/sco_groups.py +++ b/app/scodoc/sco_groups.py @@ -60,6 +60,7 @@ from app.scodoc import sco_cache from app.scodoc import sco_etud from app.scodoc import sco_permissions_check from app.scodoc import sco_xml +from app.scodoc import sco_excel from app.scodoc.sco_exceptions import ScoException, AccessDenied, ScoValueError from app.scodoc.sco_permissions import Permission from app.scodoc.TrivialFormulator import TrivialFormulator @@ -1609,6 +1610,27 @@ def make_query_groups(group_ids): return "" +def exportAnnotation(group_ids): + cnx = ndb.GetDBConnexion() + cursor = cnx.cursor() + cursor.execute( + """SELECT i.nom, i.prenom, ea.date, ea.comment + FROM group_membership gm, identite i, etud_annotations ea + WHERE gm.group_id=%(group_ids)s + AND gm.etudid=i.id + AND i.id=ea.etudid + """, + {"group_ids": group_ids}, + ) + titles = ["nom", "prenom", "date", "annotation"] + title = "annotations" + xlsx = sco_excel.excel_simple_table( + titles=titles, lines=cursor.fetchall(), sheet_name=title + ) + filename = title + return scu.send_file(xlsx, filename, scu.XLSX_SUFFIX, scu.XLSX_MIMETYPE) + + class GroupIdInferer(object): """Sert à retrouver l'id d'un groupe dans un semestre donné à partir de son nom. diff --git a/app/scodoc/sco_groups_view.py b/app/scodoc/sco_groups_view.py index 5b89ab44..cd51a20b 100644 --- a/app/scodoc/sco_groups_view.py +++ b/app/scodoc/sco_groups_view.py @@ -826,6 +826,8 @@ def tab_absences_html(groups_infos, etat=None): % groups_infos.groups_query_args, """
  • Liste d'appel avec photos
  • """ % groups_infos.groups_query_args, + """
  • Feuille annotations
  • """ + % groups_infos.groups_query_args, "", ] ) diff --git a/app/views/scolar.py b/app/views/scolar.py index 060fd4c3..66a9576e 100644 --- a/app/views/scolar.py +++ b/app/views/scolar.py @@ -2193,3 +2193,6 @@ def stat_bac(formsemestre_id): sco_publish( "/sco_dump_and_send_db", sco_dump_db.sco_dump_and_send_db, Permission.ScoView ) + +# --- Export annotations +sco_publish("/exportAnnotations", sco_groups.exportAnnotation, Permission.ScoView) From 5c11e4d9282dd562140bc355905a6a043191c046 Mon Sep 17 00:00:00 2001 From: Arthur ZHU Date: Thu, 3 Mar 2022 09:47:19 +0100 Subject: [PATCH 17/17] conflits --- app/scodoc/sco_groups.py | 22 ---------------------- app/scodoc/sco_groups_view.py | 2 -- app/views/scolar.py | 3 --- 3 files changed, 27 deletions(-) diff --git a/app/scodoc/sco_groups.py b/app/scodoc/sco_groups.py index f8653fe3..6a1ee467 100644 --- a/app/scodoc/sco_groups.py +++ b/app/scodoc/sco_groups.py @@ -60,7 +60,6 @@ from app.scodoc import sco_cache from app.scodoc import sco_etud from app.scodoc import sco_permissions_check from app.scodoc import sco_xml -from app.scodoc import sco_excel from app.scodoc.sco_exceptions import ScoException, AccessDenied, ScoValueError from app.scodoc.sco_permissions import Permission from app.scodoc.TrivialFormulator import TrivialFormulator @@ -1610,27 +1609,6 @@ def make_query_groups(group_ids): return "" -def exportAnnotation(group_ids): - cnx = ndb.GetDBConnexion() - cursor = cnx.cursor() - cursor.execute( - """SELECT i.nom, i.prenom, ea.date, ea.comment - FROM group_membership gm, identite i, etud_annotations ea - WHERE gm.group_id=%(group_ids)s - AND gm.etudid=i.id - AND i.id=ea.etudid - """, - {"group_ids": group_ids}, - ) - titles = ["nom", "prenom", "date", "annotation"] - title = "annotations" - xlsx = sco_excel.excel_simple_table( - titles=titles, lines=cursor.fetchall(), sheet_name=title - ) - filename = title - return scu.send_file(xlsx, filename, scu.XLSX_SUFFIX, scu.XLSX_MIMETYPE) - - class GroupIdInferer(object): """Sert à retrouver l'id d'un groupe dans un semestre donné à partir de son nom. diff --git a/app/scodoc/sco_groups_view.py b/app/scodoc/sco_groups_view.py index cd51a20b..5b89ab44 100644 --- a/app/scodoc/sco_groups_view.py +++ b/app/scodoc/sco_groups_view.py @@ -826,8 +826,6 @@ def tab_absences_html(groups_infos, etat=None): % groups_infos.groups_query_args, """
  • Liste d'appel avec photos
  • """ % groups_infos.groups_query_args, - """
  • Feuille annotations
  • """ - % groups_infos.groups_query_args, "", ] ) diff --git a/app/views/scolar.py b/app/views/scolar.py index 66a9576e..060fd4c3 100644 --- a/app/views/scolar.py +++ b/app/views/scolar.py @@ -2193,6 +2193,3 @@ def stat_bac(formsemestre_id): sco_publish( "/sco_dump_and_send_db", sco_dump_db.sco_dump_and_send_db, Permission.ScoView ) - -# --- Export annotations -sco_publish("/exportAnnotations", sco_groups.exportAnnotation, Permission.ScoView)