From 77bdb8667453b80ff2e3929f0c2cf55228c7aa4c Mon Sep 17 00:00:00 2001 From: Simon Hohl Date: Fri, 27 Sep 2024 13:27:54 +0200 Subject: [PATCH 01/13] Fix local typo by using upstream change --- docker-compose.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 761c59b04..e902eb271 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,6 +30,7 @@ services: volumes: - ${ARCHAEOCLOUD_PATH}:/media/archaeocloud hostname: "${HOST_NAME}" + user: "${UID}:${GID}" labels: - traefik.enable=true - traefik.http.routers.backend.rule=Host(`${SERVER_ADDRESS}`) && PathPrefix(`/data`) @@ -111,6 +112,25 @@ services: user: "${UID}:${GID}" restart: always + hac_via: + image: ghcr.io/dainst/hac_via:latest + volumes: + - ${HAC_VIA_ARCHIVE_DIR}:/archive + - ${HAC_VIA_PREVIEW_DIR}:/previews + environment: + - PHX_HOST=images.${SERVER_ADDRESS} + - DATABASE_URL=ecto://arachne:${DB_PASSWORD}@arachne4_db/arachne + - SECRET_KEY_BASE=${HAC_VIA_KEY_BASE} + labels: + - traefik.enable=true + - traefik.http.routers.hac_via.rule=Host(`images.${SERVER_ADDRESS}`) + - traefik.http.routers.hac_via.entrypoints=websecure + - traefik.http.routers.hac_via.tls.certresolver=myresolver + - traefik.http.services.hac_via.loadbalancer.server.port=4000 + - com.centurylinklabs.watchtower.enable=true + restart: always + + traefik: image: traefik:v2.5 restart: always From 3cf769a3e65ec66f22f5e5469e241e4d42aaebdb Mon Sep 17 00:00:00 2001 From: Simon Hohl Date: Fri, 27 Sep 2024 13:39:36 +0200 Subject: [PATCH 02/13] Remove hac via service definition for now --- docker-compose.yml | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index e902eb271..cce9866c0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -112,25 +112,6 @@ services: user: "${UID}:${GID}" restart: always - hac_via: - image: ghcr.io/dainst/hac_via:latest - volumes: - - ${HAC_VIA_ARCHIVE_DIR}:/archive - - ${HAC_VIA_PREVIEW_DIR}:/previews - environment: - - PHX_HOST=images.${SERVER_ADDRESS} - - DATABASE_URL=ecto://arachne:${DB_PASSWORD}@arachne4_db/arachne - - SECRET_KEY_BASE=${HAC_VIA_KEY_BASE} - labels: - - traefik.enable=true - - traefik.http.routers.hac_via.rule=Host(`images.${SERVER_ADDRESS}`) - - traefik.http.routers.hac_via.entrypoints=websecure - - traefik.http.routers.hac_via.tls.certresolver=myresolver - - traefik.http.services.hac_via.loadbalancer.server.port=4000 - - com.centurylinklabs.watchtower.enable=true - restart: always - - traefik: image: traefik:v2.5 restart: always From 00c1cae83a78293fb4d218bc04e85527baac6d1a Mon Sep 17 00:00:00 2001 From: Simon Hohl Date: Mon, 14 Oct 2024 11:32:51 +0200 Subject: [PATCH 03/13] Switch to default OSS layers --- .../con10t-widgets/network/con10t-network-map.directive.js | 4 ++-- frontend/app/map/ar-entity-map.directive.js | 4 +++- frontend/app/map/map.service.js | 4 ++-- frontend/con10t/ar/hinkel_map.html | 4 ++-- frontend/con10t/de/ceramegypt.html | 2 +- frontend/con10t/de/hinkel_map.html | 4 ++-- frontend/con10t/en/ceramegypt.html | 2 +- frontend/con10t/en/hinkel_map.html | 4 ++-- 8 files changed, 15 insertions(+), 13 deletions(-) diff --git a/frontend/app/con10t-widgets/network/con10t-network-map.directive.js b/frontend/app/con10t-widgets/network/con10t-network-map.directive.js index 2a0c8e573..8776e83a2 100644 --- a/frontend/app/con10t-widgets/network/con10t-network-map.directive.js +++ b/frontend/app/con10t-widgets/network/con10t-network-map.directive.js @@ -20,8 +20,8 @@ export default function($compile, transl8) { zoomAnimation: false}); L.tileLayer( - 'http://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey=b47a3cf895b94aedad41e5cfb5222b87', - { attribution: 'Maps © Thunderforest, Data © OpenStreetMap contributors' }) + 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + { attribution: 'Maps and Data © OpenStreetMap.' }) .addTo(scope.map); scope.placeLayer = new L.LayerGroup().addTo(scope.map); diff --git a/frontend/app/map/ar-entity-map.directive.js b/frontend/app/map/ar-entity-map.directive.js index fbb3535c7..57b2708af 100644 --- a/frontend/app/map/ar-entity-map.directive.js +++ b/frontend/app/map/ar-entity-map.directive.js @@ -38,7 +38,9 @@ export default function($compile, Query, placesPainter) { }); // / Disable dragging functionality if outside of container bounds - var layer = L.tileLayer('http://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey=b47a3cf895b94aedad41e5cfb5222b87', { + var layer = L.tileLayer( + 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + { attribution: 'Maps and Data © OpenStreetMap.' }, { maxZoom: 18, minZoom: 2 }); diff --git a/frontend/app/map/map.service.js b/frontend/app/map/map.service.js index 8fb721a7a..d4544b899 100644 --- a/frontend/app/map/map.service.js +++ b/frontend/app/map/map.service.js @@ -20,10 +20,10 @@ export default function(searchService) { 'osm': { 'name': 'OpenStreetMap', 'type': 'xyz', - 'url': 'https://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey=b47a3cf895b94aedad41e5cfb5222b87', + 'url': 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', 'layerOptions': { 'subdomains': ['a', 'b', 'c'], - 'attribution': '© OpenCycleMap, © OpenStreetMap contributors', + 'attribution': 'Maps and Data © OpenStreetMap.', 'continuousWorld': false, 'maxZoom': 18 } diff --git a/frontend/con10t/ar/hinkel_map.html b/frontend/con10t/ar/hinkel_map.html index a96e87bab..d4fd2de90 100644 --- a/frontend/con10t/ar/hinkel_map.html +++ b/frontend/con10t/ar/hinkel_map.html @@ -64,10 +64,10 @@ osm: { 'name': 'OpenStreetMap', 'type': 'xyz', - 'url': 'http://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey=b47a3cf895b94aedad41e5cfb5222b87', + 'url': 'https://tile.openstreetmap.org/{z}/{x}/{y}.png/{z}/{x}/{y}.png', 'yayerOptions': { 'subdomains': ['a', 'b', 'c'], - 'attribution': '© OpenCycleMap, © OpenStreetMap contributors', + 'attribution': 'Maps and Data © OpenStreetMap.'', 'continuousWorld': false, 'maxZoom': 18 } diff --git a/frontend/con10t/de/ceramegypt.html b/frontend/con10t/de/ceramegypt.html index 714a69303..1649a1a64 100644 --- a/frontend/con10t/de/ceramegypt.html +++ b/frontend/con10t/de/ceramegypt.html @@ -43,7 +43,7 @@

Map view

osm: { name: 'OpenStreetMap', type: 'xyz', - url: 'https://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png', + url: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png/{z}/{x}/{y}.png', layerOptions: { subdomains: ['a', 'b', 'c'], attribution: 'OpenStreetMap contributors', diff --git a/frontend/con10t/de/hinkel_map.html b/frontend/con10t/de/hinkel_map.html index 0dfe0e7b0..1438524b3 100644 --- a/frontend/con10t/de/hinkel_map.html +++ b/frontend/con10t/de/hinkel_map.html @@ -64,10 +64,10 @@ osm: { 'name': 'OpenStreetMap', 'type': 'xyz', - 'url': 'http://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey=b47a3cf895b94aedad41e5cfb5222b87', + 'url': 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', 'layerOptions': { 'subdomains': ['a', 'b', 'c'], - 'attribution': '© OpenCycleMap, © OpenStreetMap contributors', + 'attribution': ''Maps and Data © OpenStreetMap.'', 'continuousWorld': false, 'maxZoom': 18 } diff --git a/frontend/con10t/en/ceramegypt.html b/frontend/con10t/en/ceramegypt.html index 65c58c59b..e5efcdacb 100644 --- a/frontend/con10t/en/ceramegypt.html +++ b/frontend/con10t/en/ceramegypt.html @@ -43,7 +43,7 @@

Map view

osm: { name: 'OpenStreetMap', type: 'xyz', - url: 'https://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png', + url: 'http://{s}.https://tile.openstreetmap.org/{z}/{x}/{y}.png/{z}/{x}/{y}.png', layerOptions: { subdomains: ['a', 'b', 'c'], attribution: 'OpenStreetMap contributors', diff --git a/frontend/con10t/en/hinkel_map.html b/frontend/con10t/en/hinkel_map.html index 5ee1602ee..cefdf5f31 100644 --- a/frontend/con10t/en/hinkel_map.html +++ b/frontend/con10t/en/hinkel_map.html @@ -64,10 +64,10 @@ osm: { 'name': 'OpenStreetMap', 'type': 'xyz', - 'url': 'http://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey=b47a3cf895b94aedad41e5cfb5222b87', + 'url': 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', 'yayerOptions': { 'subdomains': ['a', 'b', 'c'], - 'attribution': '© OpenCycleMap, © OpenStreetMap contributors', + 'attribution': 'Maps and Data © OpenStreetMap.', 'continuousWorld': false, 'maxZoom': 18 } From 3049830b8936814d1f063fe969355b07316cbef9 Mon Sep 17 00:00:00 2001 From: Simon Hohl Date: Mon, 14 Oct 2024 11:53:27 +0200 Subject: [PATCH 04/13] Fix projects' OSS links --- frontend/con10t/ar/hinkel_map.html | 23 ++--- frontend/con10t/de/ceramegypt.html | 131 ++++++++++++++++++----------- frontend/con10t/en/ceramegypt.html | 131 ++++++++++++++++++----------- 3 files changed, 168 insertions(+), 117 deletions(-) diff --git a/frontend/con10t/ar/hinkel_map.html b/frontend/con10t/ar/hinkel_map.html index d4fd2de90..9139655b6 100644 --- a/frontend/con10t/ar/hinkel_map.html +++ b/frontend/con10t/ar/hinkel_map.html @@ -64,7 +64,7 @@ osm: { 'name': 'OpenStreetMap', 'type': 'xyz', - 'url': 'https://tile.openstreetmap.org/{z}/{x}/{y}.png/{z}/{x}/{y}.png', + 'url': 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', 'yayerOptions': { 'subdomains': ['a', 'b', 'c'], 'attribution': 'Maps and Data © OpenStreetMap.'', @@ -102,23 +102,12 @@

-
+
-
+
-
+
\ No newline at end of file diff --git a/frontend/con10t/de/ceramegypt.html b/frontend/con10t/de/ceramegypt.html index 1649a1a64..622dbfd0b 100644 --- a/frontend/con10t/de/ceramegypt.html +++ b/frontend/con10t/de/ceramegypt.html @@ -1,15 +1,13 @@ - +
-
-
-

CeramEgypt – Pottery production and consumption in Ptolemaic-Roman Egypt

-
-
+
+
+

CeramEgypt – Pottery production and consumption in Ptolemaic-Roman Egypt

+
+
@@ -25,9 +23,9 @@

Search within the project data

Search Main Abstracts - + -

Map view

+

Map view

-
+ {gazetteerId: 2408804, name: 'Akademia'},">

@@ -100,44 +88,78 @@

Map view

-
+
-
+
-

Concept

+

Concept

- + Ceramics from Schedia -

Pottery from archaeological excavations and surveys is fundamental in understanding the chronology of archaeological sites and the functional aspects of their contexts. Furthermore, it can serve as an important material basis for the investigation of aspects of cultural (e. g. daily life, questions of identity) and economic history (e. g. production, trade).

-

The aspect of pottery as a trade commodity constitutes the center of interest of the multi-disciplinary CeramEgypt project. For this, French and German researchers from the Centre d’Études Alexandrines and the Archeological Institute of Cologne– sponsored by the ANR and the DFG – came together to investigate possible scenarios of local, regional and super-regional commercial activities in Hellenistic and Imperial Roman Egypt by re-investigating pottery as the richest and most extensive archaeological material available. In their inquiries, CeramEgypt will be supported by various Egyptian researchers and international projects in Egypt.

+

Pottery from archaeological excavations and surveys is fundamental in understanding the chronology of + archaeological sites and the functional aspects of their contexts. Furthermore, it can serve as an + important material basis for the investigation of aspects of cultural (e. g. daily life, questions of + identity) and economic history (e. g. production, trade).

+

The aspect of pottery as a trade commodity constitutes the center of interest of the multi-disciplinary + CeramEgypt project. For this, French and German researchers from the Centre d’Études Alexandrines and + the Archeological Institute of Cologne– sponsored by the ANR and the DFG – came together to investigate + possible scenarios of local, regional and super-regional commercial activities in Hellenistic and + Imperial Roman Egypt by re-investigating pottery as the richest and most extensive archaeological + material available. In their inquiries, CeramEgypt will be supported by various Egyptian researchers and + international projects in Egypt.

Methodology and aims

- - Exemplary data collected by CeramEgypt:
sherd and fabric picture, microphotograph
(plain polarized light) and technical drawing. + + Exemplary data collected by CeramEgypt:
sherd and fabric picture, microphotograph
(plain + polarized light) and technical drawing.

Collecting information on Egyptian-produced pottery

-

CeramEgypt is accumulating information regarding the pottery from various sites in Egypt. Highest priority is given to verified places of pottery production. The collected information comprise of technical drawings, a detailed and systematic fabric description and photographic documentation (ceramic objects and – if possible – their fabrics). Representative individuals of recognized fabric groups will be analyzed with at least the project's portable XRF and, if possible, also by thin section analysis (see below).

+

CeramEgypt is accumulating information regarding the pottery from various sites in Egypt. Highest + priority is given to verified places of pottery production. The collected information comprise of + technical drawings, a detailed and systematic fabric description and photographic documentation (ceramic + objects and – if possible – their fabrics). Representative individuals of recognized fabric groups will + be analyzed with at least the project's portable XRF and, if possible, also by thin section analysis + (see below).

Database

-

The projects database is the focal point of the CeramEgypt project, as it collects, channels and presents the multi-levelled results. For this, Arachne as an established and free-to-use database for the presentation of archaeological objects has been choosen as a platform. In addition, CeramEgypt was able to build up on the results of its preceding project, CeramAlex (2011-2014), whose database will be slightly adjusted. The objective is to create an interface that not only works as a research tool for people interested in Egyptian pottery from Greek and Roman times, but also as a “catalog” to present the various information gathered over the course of the project.

+

The projects database is the focal point of the CeramEgypt project, as it collects, channels and presents + the multi-levelled results. For this, Arachne as an established and free-to-use database for the + presentation of archaeological objects has been choosen as a platform. In addition, CeramEgypt was able + to build up on the results of its preceding project, CeramAlex (2011-2014), whose database will be + slightly adjusted. The objective is to create an interface that not only works as a research tool for + people interested in Egyptian pottery from Greek and Roman times, but also as a “catalog” to present the + various information gathered over the course of the project.

- + Physical principles of portable ED-XRF measurements

Chemical and petrographic analysis

-

Of crucial importance to the project is the incorporation of natural scientific methods. This will enable us to better separate production sites and their eventual sub-fabrics (e. g. fine wares, cooking wares, transport containers). Such separations used to be problematic, especially on a macroscopic level, for the alluvial clays of the Nile valley and the delta.

+

Of crucial importance to the project is the incorporation of natural scientific methods. This will enable + us to better separate production sites and their eventual sub-fabrics (e. g. fine wares, cooking wares, + transport containers). Such separations used to be problematic, especially on a macroscopic level, for + the alluvial clays of the Nile valley and the delta.


-

This task is on the one hand supported by the collected fabric descriptions and pictures. On the other hand, the project is provided with two portable X-ray fluorescence analyzer (Thermo Scientific's NITON XL3t) that can systematically be employed at the visited sites. This allows fordestruction free and quick on-site chemical analyzes of the studied objects. Results can also be immediately processed, therefore enabling the team to adjust the analytical program as they go along. To better distinguish the ceramic production groups, this “chemical fingerprinting” will be combined with selected thin-section analyzes, as often as this is possible.

+

This task is on the one hand supported by the collected fabric descriptions and pictures. On the other + hand, the project is provided with two portable X-ray fluorescence analyzer (Thermo Scientific's NITON + XL3t) that can systematically be employed at the visited sites. This allows fordestruction free and + quick on-site chemical analyzes of the studied objects. Results can also be immediately processed, + therefore enabling the team to adjust the analytical program as they go along. To better distinguish the + ceramic production groups, this “chemical fingerprinting” will be combined with selected thin-section + analyzes, as often as this is possible.

- + Biplot (Yttrium vs. Rubidium) of locally produced wares from four sites within the Nile Delta. @@ -161,18 +183,27 @@

External Cooperation Partners

  • Archer Martin (Schedia)
  • Marie-Dominique Nenna (CEAlex)
  • Marianne Bergmann (Schedia)
  • -
  • Eva Lange (Bubastis / Tell Basta)
  • -
  • Ulrich Hartung (Buto / Tell el-Fara´in)
  • -
  • Nadia Licitra (Karnak)
  • +
  • Eva Lange (Bubastis / Tell Basta)
  • +
  • Ulrich Hartung (Buto / Tell el-Fara´in)
  • +
  • Nadia Licitra (Karnak)
  • Christophe Thiers (Karnak)
  • Romain David (Karnak)
  • -
  • Cornelius von Pilgrim (Syene / Aswan)
  • -
  • Sabine Ladstätter (Syene / Aswan)
  • -
  • Lisa Peloschek (Syene / Aswan)
  • +
  • Cornelius von Pilgrim (Syene / + Aswan)
  • +
  • Sabine Ladstätter (Syene / + Aswan)
  • +
  • Lisa Peloschek (Syene / Aswan) +
  • Robert Littman (Tell Timai)
  • Jay Silverstein (Tell Timai)
  • -
  • Claudio Gallazzi (Tebtynis)
  • -
  • Rosario Pintaudi (Antinopolis)
  • +
  • Claudio Gallazzi (Tebtynis)
  • +
  • Rosario Pintaudi (Antinopolis)
  • Contact

    @@ -186,5 +217,5 @@

    Contact

    -
    -
    +
    +
    \ No newline at end of file diff --git a/frontend/con10t/en/ceramegypt.html b/frontend/con10t/en/ceramegypt.html index e5efcdacb..7a3138f4b 100644 --- a/frontend/con10t/en/ceramegypt.html +++ b/frontend/con10t/en/ceramegypt.html @@ -1,15 +1,13 @@ - +
    -
    -
    -

    CeramEgypt – Pottery production and consumption in Ptolemaic-Roman Egypt

    -
    -
    +
    +
    +

    CeramEgypt – Pottery production and consumption in Ptolemaic-Roman Egypt

    +
    +
    @@ -25,9 +23,9 @@

    Search within the project data

    Search Main Abstracts - + -

    Map view

    +

    Map view

    -
    + {gazetteerId: 2408804, name: 'Akademia'},">

    @@ -100,44 +88,78 @@

    Map view

    -
    +
    -
    +
    -

    Concept

    +

    Concept

    - + Ceramics from Schedia -

    Pottery from archaeological excavations and surveys is fundamental in understanding the chronology of archaeological sites and the functional aspects of their contexts. Furthermore, it can serve as an important material basis for the investigation of aspects of cultural (e. g. daily life, questions of identity) and economic history (e. g. production, trade).

    -

    The aspect of pottery as a trade commodity constitutes the center of interest of the multi-disciplinary CeramEgypt project. For this, French and German researchers from the Centre d’Études Alexandrines and the Archeological Institute of Cologne– sponsored by the ANR and the DFG – came together to investigate possible scenarios of local, regional and super-regional commercial activities in Hellenistic and Imperial Roman Egypt by re-investigating pottery as the richest and most extensive archaeological material available. In their inquiries, CeramEgypt will be supported by various Egyptian researchers and international projects in Egypt.

    +

    Pottery from archaeological excavations and surveys is fundamental in understanding the chronology of + archaeological sites and the functional aspects of their contexts. Furthermore, it can serve as an + important material basis for the investigation of aspects of cultural (e. g. daily life, questions of + identity) and economic history (e. g. production, trade).

    +

    The aspect of pottery as a trade commodity constitutes the center of interest of the multi-disciplinary + CeramEgypt project. For this, French and German researchers from the Centre d’Études Alexandrines and + the Archeological Institute of Cologne– sponsored by the ANR and the DFG – came together to investigate + possible scenarios of local, regional and super-regional commercial activities in Hellenistic and + Imperial Roman Egypt by re-investigating pottery as the richest and most extensive archaeological + material available. In their inquiries, CeramEgypt will be supported by various Egyptian researchers and + international projects in Egypt.

    Methodology and aims

    - - Exemplary data collected by CeramEgypt:
    sherd and fabric picture, microphotograph
    (plain polarized light) and technical drawing. + + Exemplary data collected by CeramEgypt:
    sherd and fabric picture, microphotograph
    (plain + polarized light) and technical drawing.

    Collecting information on Egyptian-produced pottery

    -

    CeramEgypt is accumulating information regarding the pottery from various sites in Egypt. Highest priority is given to verified places of pottery production. The collected information comprise of technical drawings, a detailed and systematic fabric description and photographic documentation (ceramic objects and – if possible – their fabrics). Representative individuals of recognized fabric groups will be analyzed with at least the project's portable XRF and, if possible, also by thin section analysis (see below).

    +

    CeramEgypt is accumulating information regarding the pottery from various sites in Egypt. Highest + priority is given to verified places of pottery production. The collected information comprise of + technical drawings, a detailed and systematic fabric description and photographic documentation (ceramic + objects and – if possible – their fabrics). Representative individuals of recognized fabric groups will + be analyzed with at least the project's portable XRF and, if possible, also by thin section analysis + (see below).

    Database

    -

    The projects database is the focal point of the CeramEgypt project, as it collects, channels and presents the multi-levelled results. For this, Arachne as an established and free-to-use database for the presentation of archaeological objects has been choosen as a platform. In addition, CeramEgypt was able to build up on the results of its preceding project, CeramAlex (2011-2014), whose database will be slightly adjusted. The objective is to create an interface that not only works as a research tool for people interested in Egyptian pottery from Greek and Roman times, but also as a “catalog” to present the various information gathered over the course of the project.

    +

    The projects database is the focal point of the CeramEgypt project, as it collects, channels and presents + the multi-levelled results. For this, Arachne as an established and free-to-use database for the + presentation of archaeological objects has been choosen as a platform. In addition, CeramEgypt was able + to build up on the results of its preceding project, CeramAlex (2011-2014), whose database will be + slightly adjusted. The objective is to create an interface that not only works as a research tool for + people interested in Egyptian pottery from Greek and Roman times, but also as a “catalog” to present the + various information gathered over the course of the project.

    - + Physical principles of portable ED-XRF measurements

    Chemical and petrographic analysis

    -

    Of crucial importance to the project is the incorporation of natural scientific methods. This will enable us to better separate production sites and their eventual sub-fabrics (e. g. fine wares, cooking wares, transport containers). Such separations used to be problematic, especially on a macroscopic level, for the alluvial clays of the Nile valley and the delta.

    +

    Of crucial importance to the project is the incorporation of natural scientific methods. This will enable + us to better separate production sites and their eventual sub-fabrics (e. g. fine wares, cooking wares, + transport containers). Such separations used to be problematic, especially on a macroscopic level, for + the alluvial clays of the Nile valley and the delta.


    -

    This task is on the one hand supported by the collected fabric descriptions and pictures. On the other hand, the project is provided with two portable X-ray fluorescence analyzer (Thermo Scientific's NITON XL3t) that can systematically be employed at the visited sites. This allows fordestruction free and quick on-site chemical analyzes of the studied objects. Results can also be immediately processed, therefore enabling the team to adjust the analytical program as they go along. To better distinguish the ceramic production groups, this “chemical fingerprinting” will be combined with selected thin-section analyzes, as often as this is possible.

    +

    This task is on the one hand supported by the collected fabric descriptions and pictures. On the other + hand, the project is provided with two portable X-ray fluorescence analyzer (Thermo Scientific's NITON + XL3t) that can systematically be employed at the visited sites. This allows fordestruction free and + quick on-site chemical analyzes of the studied objects. Results can also be immediately processed, + therefore enabling the team to adjust the analytical program as they go along. To better distinguish the + ceramic production groups, this “chemical fingerprinting” will be combined with selected thin-section + analyzes, as often as this is possible.

    - + Biplot (Yttrium vs. Rubidium) of locally produced wares from four sites within the Nile Delta. @@ -161,18 +183,27 @@

    External Cooperation Partners

  • Archer Martin (Schedia)
  • Marie-Dominique Nenna (CEAlex)
  • Marianne Bergmann (Schedia)
  • -
  • Eva Lange (Bubastis / Tell Basta)
  • -
  • Ulrich Hartung (Buto / Tell el-Fara´in)
  • -
  • Nadia Licitra (Karnak)
  • +
  • Eva Lange (Bubastis / Tell Basta)
  • +
  • Ulrich Hartung (Buto / Tell el-Fara´in)
  • +
  • Nadia Licitra (Karnak)
  • Christophe Thiers (Karnak)
  • Romain David (Karnak)
  • -
  • Cornelius von Pilgrim (Syene / Aswan)
  • -
  • Sabine Ladstätter (Syene / Aswan)
  • -
  • Lisa Peloschek (Syene / Aswan)
  • +
  • Cornelius von Pilgrim (Syene / + Aswan)
  • +
  • Sabine Ladstätter (Syene / + Aswan)
  • +
  • Lisa Peloschek (Syene / Aswan) +
  • Robert Littman (Tell Timai)
  • Jay Silverstein (Tell Timai)
  • -
  • Claudio Gallazzi (Tebtynis)
  • -
  • Rosario Pintaudi (Antinopolis)
  • +
  • Claudio Gallazzi (Tebtynis)
  • +
  • Rosario Pintaudi (Antinopolis)
  • Contact

    @@ -186,5 +217,5 @@

    Contact

    -
    -
    +
    +
    \ No newline at end of file From 8fedca73dadde13f94f776bb0e9631bd8fd77d08 Mon Sep 17 00:00:00 2001 From: Simon Hohl Date: Thu, 24 Oct 2024 11:51:55 +0200 Subject: [PATCH 05/13] Fix network visualization buttons After the icons were not bundled in the built because their names were only referenced in JS, not in the HTML. --- .../con10t-paginated-item-list.directive.js | 24 +-- .../network/con10t-paginated-item-list.html | 9 +- frontend/package-lock.json | 198 +++++++++++++----- 3 files changed, 162 insertions(+), 69 deletions(-) diff --git a/frontend/app/con10t-widgets/network/con10t-paginated-item-list.directive.js b/frontend/app/con10t-widgets/network/con10t-paginated-item-list.directive.js index 95059834f..63fea0e41 100644 --- a/frontend/app/con10t-widgets/network/con10t-paginated-item-list.directive.js +++ b/frontend/app/con10t-widgets/network/con10t-paginated-item-list.directive.js @@ -50,44 +50,40 @@ export default function() { } }; - scope.updateDisplayedList = function(){ + scope.updateDisplayedList = function () { - if(typeof scope.itemList === 'undefined'){ + if (typeof scope.itemList === 'undefined') { return; } scope.displayedList = angular.copy(scope.itemList); - if(scope.orderType === 0) { - scope.orderGlyph = 'glyphicon-sort-by-alphabet'; + if (scope.orderType === 0) { scope.displayedList.sort(function (a, b) { return a.label.toLowerCase() > b.label.toLowerCase() ? 1 : -1; }); - } else if(scope.orderType === 1){ - scope.orderGlyph = 'glyphicon-sort-by-alphabet-alt'; + } else if (scope.orderType === 1) { scope.displayedList.sort(function (a, b) { return a.label.toLowerCase() > b.label.toLowerCase() ? -1 : 1; }); - } else if(scope.orderType === 2){ - scope.orderGlyph = 'glyphicon-sort-by-order-alt'; - scope.displayedList.sort(function(a, b){ - if(a.count > b.count){ + } else if (scope.orderType === 2) { + scope.displayedList.sort(function (a, b) { + if (a.count > b.count) { return -1; } else if (a.count < b.count) { return 1; } else { - return a.label.toLowerCase() < b.label.toLowerCase() ? -1 : 1; + return a.label.toLowerCase() < b.label.toLowerCase() ? -1 : 1; } }); } else { - scope.orderGlyph = 'glyphicon-sort-by-order'; scope.displayedList.sort(function (a, b) { - if(a.count > b.count){ + if (a.count > b.count) { return 1; } else if (a.count < b.count) { return -1; } else { - return a.label.toLowerCase() < b.label.toLowerCase() ? -1 : 1; + return a.label.toLowerCase() < b.label.toLowerCase() ? -1 : 1; } }); } diff --git a/frontend/app/con10t-widgets/network/con10t-paginated-item-list.html b/frontend/app/con10t-widgets/network/con10t-paginated-item-list.html index e8cda8643..4fcf08dfc 100644 --- a/frontend/app/con10t-widgets/network/con10t-paginated-item-list.html +++ b/frontend/app/con10t-widgets/network/con10t-paginated-item-list.html @@ -3,8 +3,13 @@

    {{heading}}

    - + +
    diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ac39decd2..5ee2dfdb1 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "arachnefrontend", - "version": "0.14.1", + "version": "1.0.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "arachnefrontend", - "version": "0.14.1", + "version": "1.0.3", "license": "Apache-2.0", "dependencies": { "@uirouter/angularjs": "1.0.30", @@ -25,7 +25,7 @@ "drmonty-leaflet-awesome-markers": "2.0.2", "font-awesome": "4.7.0", "idai-3dviewer": "1.0.7", - "idai-components": "3.2.3", + "idai-components": "3.2.5", "idai-cookie-notice": "~0.0.3", "leaflet": "1.3.1", "leaflet-fullscreen": "1.0.2", @@ -35,7 +35,6 @@ "ng-showdown": "1.1.0", "oclazyload": "^1.1.0", "overlapping-marker-spiderfier-leaflet": "^0.2.7", - "request": "^2.87.0", "showdown": "^1.9.1", "svg-pan-zoom": "3.5.3", "three": "^0.103.0" @@ -82,6 +81,7 @@ "proxy-middleware": "~0.15.0", "puppeteer": "^1.20.0", "purgecss-webpack-plugin": "^4.1.3", + "request": "^2.87.0", "resolve-url-loader": "^4.0.0", "rimraf": "~2.6.2", "sass": "^1.43.5", @@ -696,6 +696,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1120,12 +1121,14 @@ "node_modules/asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true }, "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, "engines": { "node": ">=0.8" } @@ -1211,7 +1214,8 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "node_modules/atob": { "version": "2.1.1", @@ -1229,6 +1233,7 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, "engines": { "node": "*" } @@ -1394,6 +1399,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, "optional": true, "dependencies": { "tweetnacl": "^0.14.3" @@ -2257,7 +2263,8 @@ "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, "node_modules/chalk": { "version": "1.1.3", @@ -3638,6 +3645,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -4020,7 +4028,8 @@ "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "node_modules/cors": { "version": "2.8.5", @@ -4533,6 +4542,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, "dependencies": { "assert-plus": "^1.0.0" }, @@ -4877,6 +4887,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -5164,6 +5175,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, "optional": true, "dependencies": { "jsbn": "~0.1.0" @@ -5954,7 +5966,8 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "node_modules/extend-shallow": { "version": "3.0.2", @@ -6090,6 +6103,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, "engines": [ "node >=0.6.0" ] @@ -6111,7 +6125,8 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-glob": { "version": "3.2.11", @@ -6202,7 +6217,8 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "1.1.4", @@ -6461,6 +6477,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, "engines": { "node": "*" } @@ -6469,6 +6486,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "1.0.6", @@ -6698,6 +6716,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, "dependencies": { "assert-plus": "^1.0.0" } @@ -7739,6 +7758,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, "engines": { "node": ">=4" } @@ -7748,6 +7768,7 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "deprecated": "this library is no longer supported", + "dev": true, "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -8294,6 +8315,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -8373,9 +8395,9 @@ } }, "node_modules/idai-components": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/idai-components/-/idai-components-3.2.3.tgz", - "integrity": "sha512-xBaGazuoCw1I0wp1HIRSsd29QFEe/mluznmjsJ4y2pKdpW+nzrU6Jid4n1QORn+AvGu/mDl5sCklVMDKgTU6dw==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/idai-components/-/idai-components-3.2.5.tgz", + "integrity": "sha512-UNyd1cOEmwf3EpSwFdCGsvKCy0+oWo92ncChfkn1alo39wLAtkcyAKouqhFgWhqdY1t1+mUmH1HrN+RSI0EZJA==", "dependencies": { "angular": "^1.6.7", "angular-animate": "^1.6.7", @@ -8893,7 +8915,8 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, "node_modules/is-unc-path": { "version": "1.0.0", @@ -8996,7 +9019,8 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true }, "node_modules/istextorbinary": { "version": "1.0.2", @@ -9098,6 +9122,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, "optional": true }, "node_modules/jsesc": { @@ -9127,12 +9152,14 @@ "node_modules/json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -9143,7 +9170,8 @@ "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, "node_modules/json5": { "version": "2.2.0", @@ -9173,6 +9201,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, "engines": [ "node >=0.6.0" ], @@ -10705,6 +10734,7 @@ "version": "1.49.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -10713,6 +10743,7 @@ "version": "2.1.32", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dev": true, "dependencies": { "mime-db": "1.49.0" }, @@ -11936,7 +11967,8 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true }, "node_modules/picocolors": { "version": "1.0.0", @@ -12409,7 +12441,8 @@ "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true }, "node_modules/pump": { "version": "2.0.1", @@ -12436,6 +12469,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, "engines": { "node": ">=6" } @@ -12544,6 +12578,7 @@ "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, "engines": { "node": ">=0.6" } @@ -13005,6 +13040,7 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -13034,12 +13070,14 @@ "node_modules/request/node_modules/aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true }, "node_modules/request/node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, "engines": { "node": "*" } @@ -13315,7 +13353,8 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/safe-regex": { "version": "1.1.0", @@ -14604,6 +14643,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "dev": true, "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -15389,6 +15429,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -15431,6 +15472,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -15442,6 +15484,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, "optional": true }, "node_modules/type": { @@ -15702,6 +15745,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -15775,6 +15819,7 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, "bin": { "uuid": "bin/uuid" } @@ -15823,6 +15868,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, "engines": [ "node >=0.6.0" ], @@ -17599,6 +17645,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -17936,12 +17983,14 @@ "asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true }, "assign-symbols": { "version": "1.0.0", @@ -18011,7 +18060,8 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "atob": { "version": "2.1.1", @@ -18022,7 +18072,8 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true }, "axios": { "version": "0.21.1", @@ -18157,6 +18208,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, "optional": true, "requires": { "tweetnacl": "^0.14.3" @@ -18867,7 +18919,8 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, "chalk": { "version": "1.1.3", @@ -19949,6 +20002,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -20244,7 +20298,8 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "cors": { "version": "2.8.5", @@ -20679,6 +20734,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -20940,7 +20996,8 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true }, "delegates": { "version": "1.0.0", @@ -21207,6 +21264,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, "optional": true, "requires": { "jsbn": "~0.1.0" @@ -21896,7 +21954,8 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "extend-shallow": { "version": "3.0.2", @@ -22005,7 +22064,8 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true }, "fancy-log": { "version": "1.3.2", @@ -22021,7 +22081,8 @@ "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "fast-glob": { "version": "3.2.11", @@ -22093,7 +22154,8 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "fast-levenshtein": { "version": "1.1.4", @@ -22292,12 +22354,14 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true }, "form-data": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "1.0.6", @@ -22482,6 +22546,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -23402,12 +23467,14 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true }, "har-validator": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -23834,6 +23901,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -23897,9 +23965,9 @@ } }, "idai-components": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/idai-components/-/idai-components-3.2.3.tgz", - "integrity": "sha512-xBaGazuoCw1I0wp1HIRSsd29QFEe/mluznmjsJ4y2pKdpW+nzrU6Jid4n1QORn+AvGu/mDl5sCklVMDKgTU6dw==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/idai-components/-/idai-components-3.2.5.tgz", + "integrity": "sha512-UNyd1cOEmwf3EpSwFdCGsvKCy0+oWo92ncChfkn1alo39wLAtkcyAKouqhFgWhqdY1t1+mUmH1HrN+RSI0EZJA==", "requires": { "angular": "^1.6.7", "angular-animate": "^1.6.7", @@ -24287,7 +24355,8 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, "is-unc-path": { "version": "1.0.0", @@ -24366,7 +24435,8 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true }, "istextorbinary": { "version": "1.0.2", @@ -24452,6 +24522,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, "optional": true }, "jsesc": { @@ -24475,12 +24546,14 @@ "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -24491,7 +24564,8 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, "json5": { "version": "2.2.0", @@ -24515,6 +24589,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -25761,12 +25836,14 @@ "mime-db": { "version": "1.49.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "dev": true }, "mime-types": { "version": "2.1.32", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dev": true, "requires": { "mime-db": "1.49.0" } @@ -26721,7 +26798,8 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true }, "picocolors": { "version": "1.0.0", @@ -27093,7 +27171,8 @@ "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true }, "pump": { "version": "2.0.1", @@ -27119,7 +27198,8 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "puppeteer": { "version": "1.20.0", @@ -27209,7 +27289,8 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true }, "querystring": { "version": "0.2.0", @@ -27556,6 +27637,7 @@ "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -27582,12 +27664,14 @@ "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true } } }, @@ -27782,7 +27866,8 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safe-regex": { "version": "1.1.0", @@ -28826,6 +28911,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -29434,6 +29520,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -29470,6 +29557,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -29478,6 +29566,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, "optional": true }, "type": { @@ -29682,6 +29771,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -29748,7 +29838,8 @@ "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true }, "v8flags": { "version": "3.2.0", @@ -29785,6 +29876,7 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", From d4170b059140b861d536403de48933851e4fd767 Mon Sep 17 00:00:00 2001 From: Simon Hohl Date: Mon, 6 Jan 2025 17:03:26 +0100 Subject: [PATCH 06/13] Provide link from Arachne frontend to HacVia archive --- frontend/app/_transl8.de.js | 1 + frontend/app/_transl8.en.js | 1 + frontend/app/app.js | 9 ++++--- .../app/image/ar-imageslider.directive.js | 24 +++++++++++++++++-- frontend/app/image/ar-imageslider.html | 12 ++++++---- 5 files changed, 38 insertions(+), 9 deletions(-) diff --git a/frontend/app/_transl8.de.js b/frontend/app/_transl8.de.js index 4be480aa6..5de673054 100644 --- a/frontend/app/_transl8.de.js +++ b/frontend/app/_transl8.de.js @@ -437,6 +437,7 @@ export default { "facet_bennenungallg": "Benennung allgemein", "ui.passwordchange.illegal": "Das alte und das neue Passwort dürfen nicht die selben sein!", "edit_button": "Bearbeitung", + "image_archive_button": "Archiv", "catalog_no_catalog_info": "Ein Katalog in Arachne ist geordnetes Verzeichnis von archäologischen Objekten.", "catalog_no_catalog_help": "Mit einem Klick auf \"Neuen Katalog anlegen\", kann man einen eigenen persönlichen Katalog erstellen. Weitere Hilfe zum Bearbeiten von Einträgen findet man wenn man den Katalog öffnet.", "catalog_no_catalog_hint_note": "Kataloge sind standardmäßig privat, sodass sie nicht öffentlich sichtar sind. Außerdem müssen weitere Bearbeiter gesondert freigeschaltet werden.", diff --git a/frontend/app/_transl8.en.js b/frontend/app/_transl8.en.js index bcac7f2b1..9124230e7 100644 --- a/frontend/app/_transl8.en.js +++ b/frontend/app/_transl8.en.js @@ -439,6 +439,7 @@ export default { "facet_bennenungallg": "General designation", "ui.passwordchange.illegal": "The old and new password can't be the same!", "edit_button": "Edit", + "image_archive_button": "Archive", "undefined": "undefined", "catalog_no_catalog_info": "A catalog in Arachne is an ordered list of archaeological objects.", "general_hint": "Note:", diff --git a/frontend/app/app.js b/frontend/app/app.js index 49b8bf740..85a826dff 100644 --- a/frontend/app/app.js +++ b/frontend/app/app.js @@ -60,7 +60,7 @@ const lazyLoadService = ($ocLazyLoad) => (importPromise) => }); angular.module('arachne', [ - 'angulartics', + 'angulartics', 'angulartics.piwik', 'ui.bootstrap', 'ui.bootstrap.tpls', @@ -148,8 +148,8 @@ angular.module('arachne', [ 'editUser.**': { url: '/editUser', lazyLoad: lazyLoad(import('./users/users.module.js'))}, 'contact.**': { url: '/contact', lazyLoad: lazyLoad(import('./users/users.module.js'))}, 'pwdreset.**': { url: '/pwdreset', lazyLoad: lazyLoad(import('./users/users.module.js'))}, - 'pwdchange.**': { url: '/pwdchange', lazyLoad: lazyLoad(import('./users/users.module.js'))}, - 'userActivation.**': { url: '/user/activation/:token', lazyLoad: lazyLoad(import('./users/users.module.js'))}, + 'pwdchange.**': { url: '/pwdchange', lazyLoad: lazyLoad(import('./users/users.module.js'))}, + 'userActivation.**': { url: '/user/activation/:token', lazyLoad: lazyLoad(import('./users/users.module.js'))}, 'login.**': { url: '/login?redirectTo',lazyLoad: lazyLoad(import('./users/users.module.js'))}, 'dataimport': { url: '/admin/dataimport', template: require('./admin/dataimport.html')}, 'dataexport': { url: '/admin/dataexport', template: require('./admin/dataexport.html')}, @@ -191,6 +191,9 @@ angular.module('arachne', [ .constant('arachneSettings', { arachneUrl: 'https://arachne.dainst.org', dataserviceUri: "//" + document.location.host + "/data", + hacViaUrl: function () { + return document.location.host == "arachne.dainst.org" ? "//images.arachne.dainst.org" : "//images.arachne.test.dainst.org" + }(), limit: 50, facetLimit: 20, openFacets : ["facet_kategorie", "facet_image", "facet_bestandsname", "facet_subkategoriebestand"], // order is important for sorting of default facets diff --git a/frontend/app/image/ar-imageslider.directive.js b/frontend/app/image/ar-imageslider.directive.js index ab52c7038..d7bcd7ccb 100644 --- a/frontend/app/image/ar-imageslider.directive.js +++ b/frontend/app/image/ar-imageslider.directive.js @@ -1,11 +1,31 @@ import './ar-imageslider.scss'; -export default function() { +const hacViaEntityCategories = [ + "bauwerk", + "bauwerksteil", + "gruppen", + "gruppenrekonstruktion", + "inschrift", + "objekt", + "realien", + "relief", + "reproduktion", + "rezeption", + "sammlungen", + "typus" +] + +export default function (arachneSettings, authService) { return { - scope: {entity: '=', currentQuery: '='}, + scope: { entity: '=', currentQuery: '=' }, template: require('./ar-imageslider.html'), link: function (scope, element, attrs) { + if (hacViaEntityCategories.includes(scope.entity.categoryKey)) { + scope.hacViaUrl = arachneSettings.hacViaUrl + "/archive/files/" + scope.entity.entityId; + } + + scope.user = authService.getUser(); var thumbRow = angular.element(angular.element(element.children()[0]).children()[0]).children()[2]; var sliderRow = angular.element(element.children()[0]).children()[0]; diff --git a/frontend/app/image/ar-imageslider.html b/frontend/app/image/ar-imageslider.html index 68360888c..1c14d4b46 100644 --- a/frontend/app/image/ar-imageslider.html +++ b/frontend/app/image/ar-imageslider.html @@ -1,11 +1,15 @@ -

    - +

    + {{'entity_images'|transl8}} ({{entity.imageSize}}) + {{'entity_image'|transl8}}> + + + {{"image_archive_button"|transl8}} +

    -

    {{'entity_image'|transl8}}

    -
    Date: Mon, 13 Jan 2025 12:51:54 +0100 Subject: [PATCH 07/13] Pin runner image to ubuntu 20 for now --- .github/workflows/frontend-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/frontend-test.yml b/.github/workflows/frontend-test.yml index 8bedf9bc6..eaccc31b4 100644 --- a/.github/workflows/frontend-test.yml +++ b/.github/workflows/frontend-test.yml @@ -20,7 +20,7 @@ env: jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - name: Checkout repository From fbbfac915a6d84f44d402eb7021467ea829a62df Mon Sep 17 00:00:00 2001 From: Simon Hohl Date: Mon, 13 Jan 2025 13:00:25 +0100 Subject: [PATCH 08/13] Align frontend-build with frontend-test action --- .github/workflows/frontend-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/frontend-build.yml b/.github/workflows/frontend-build.yml index de2deb409..74622fb3e 100644 --- a/.github/workflows/frontend-build.yml +++ b/.github/workflows/frontend-build.yml @@ -22,7 +22,7 @@ env: jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - name: Checkout repository From c0ba2e3ff2f387b19bae6dcf9a7c47105bd85a12 Mon Sep 17 00:00:00 2001 From: Simon Hohl Date: Mon, 13 Jan 2025 13:07:53 +0100 Subject: [PATCH 09/13] Export missing module configuration --- frontend/app/image/image.module.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/app/image/image.module.js b/frontend/app/image/image.module.js index 0cdfc288f..cfa8d381d 100644 --- a/frontend/app/image/image.module.js +++ b/frontend/app/image/image.module.js @@ -8,8 +8,8 @@ import zoomifyimg from './zoomifyimg.directive.js'; export default angular.module('arachne.image', []) .directive('arImagegridCell', arImagegridCell) .directive('arImagegrid', ['$http', '$window', 'searchScope', arImagegrid]) - .directive('arImageslider', arImageslider) + .directive('arImageslider', ['arachneSettings', 'authService', arImageslider]) .directive('arImg', ['arachneSettings', '$http', arImg]) .filter('cellsFromImages', ['arachneSettings', cellsFromImages]) .directive('zoomifyimg', ['arachneSettings', '$http', zoomifyimg]) -; + ; From c06c7816e312ac8c118d5e43809679aaa0565340 Mon Sep 17 00:00:00 2001 From: Simon Hohl Date: Mon, 13 Jan 2025 13:27:34 +0100 Subject: [PATCH 10/13] Remove console logs --- .../ar-catalog-occurrences.directive.js | 28 +++--- frontend/app/catalog/catalog.controller.js | 30 +++--- .../con10t-widgets/con10t-search.directive.js | 24 +++-- .../network/con10t-network-map.directive.js | 91 ++++++++--------- .../con10t-time-line-chart.directive.js | 98 +++++++++---------- frontend/app/image/ar-img.directive.js | 12 +-- frontend/app/svg/svg.controller.js | 21 ++-- frontend/app/users/edit-user.controller.js | 8 +- .../app/users/pwd-activation.controller.js | 5 +- 9 files changed, 154 insertions(+), 163 deletions(-) diff --git a/frontend/app/catalog/ar-catalog-occurrences.directive.js b/frontend/app/catalog/ar-catalog-occurrences.directive.js index c7d4bdf43..4e6af2666 100644 --- a/frontend/app/catalog/ar-catalog-occurrences.directive.js +++ b/frontend/app/catalog/ar-catalog-occurrences.directive.js @@ -1,12 +1,10 @@ export default function (arachneSettings, $http, $uibModal, Catalog, CatalogEntry) { - console.log('construct catalog-occurrences.directive.js'); return { scope: { entity: '=' }, template: require('./ar-catalog-occurrences.html'), link: function (scope, element, attrs) { - console.log('link catalog-occurrences.directive.js'); scope.catalogEntries = []; scope.catalogEntrySets = []; @@ -37,7 +35,7 @@ export default function (arachneSettings, $http, $uibModal, Catalog, CatalogEntr editEntryModal.close = function (newEntry) { CatalogEntry.save([newEntry], function (data) { if (data.error_message) { - console.log(data.error_message); + console.error(data.error_message); } else { scope.loadOccurences(); } @@ -61,37 +59,37 @@ export default function (arachneSettings, $http, $uibModal, Catalog, CatalogEntr scope.arrangeEntries(); }).catch(function (result) { - console.log("Error Arachne dataservice not reachable"); + console.error("Error Arachne dataservice not reachable"); }); } }; - scope.arrangeEntries = function() { + scope.arrangeEntries = function () { var i, j, n, len = scope.catalogEntries.length, curi, curj, curk, duplicateAlreadyAdded, newCatalog; - for(i = 0; i < len; i++) { + for (i = 0; i < len; i++) { curi = scope.catalogEntries[i]; scope.loadParentLabel(curi.entry); - if(curi.duplicate) + if (curi.duplicate) continue; duplicateAlreadyAdded = false; - for(j = i; j < len; j++) { + for (j = i; j < len; j++) { curj = scope.catalogEntries[j]; - if(curi.entry.catalogId === curj.entry.catalogId) { - if(!duplicateAlreadyAdded) { + if (curi.entry.catalogId === curj.entry.catalogId) { + if (!duplicateAlreadyAdded) { scope.catalogEntrySets.push(scope.getNewCatalogEntrySet(curi)); duplicateAlreadyAdded = true; } else { - for(n = 0; n < scope.catalogEntrySets.length; n++) { + for (n = 0; n < scope.catalogEntrySets.length; n++) { curk = scope.catalogEntrySets[n]; - if(curk.catalogId === curj.entry.catalogId) + if (curk.catalogId === curj.entry.catalogId) scope.catalogEntrySets[n].entries.push(curj.entry); } } curi.duplicate = curj.duplicate = true; } } - if(!curi.duplicate) { + if (!curi.duplicate) { scope.catalogEntrySets.push(scope.getNewCatalogEntrySet(curi)); } } @@ -99,8 +97,8 @@ export default function (arachneSettings, $http, $uibModal, Catalog, CatalogEntr // used to load the parent label in order to distinguish entries when multiple // entries for the same entity are present in the same catalog - scope.loadParentLabel = function(entry) { - CatalogEntry.get({id:entry.parentId, limit:1, full:false}, function(result) { + scope.loadParentLabel = function (entry) { + CatalogEntry.get({ id: entry.parentId, limit: 1, full: false }, function (result) { entry.parentLabel = result.label; }); }; diff --git a/frontend/app/catalog/catalog.controller.js b/frontend/app/catalog/catalog.controller.js index 5c5ec0a54..a6ed97c05 100644 --- a/frontend/app/catalog/catalog.controller.js +++ b/frontend/app/catalog/catalog.controller.js @@ -93,7 +93,6 @@ export default function ($rootScope, $scope, $state, $stateParams, $uibModal, $w })); } else { //Array contains entries with labels and entities attached to them - console.log("HA", newEntry); var toAddItem = {}; if (newEntry[i].entity) { toAddItem.arachneEntityId = newEntry[i].entity.entityId; @@ -196,7 +195,6 @@ export default function ($rootScope, $scope, $state, $stateParams, $uibModal, $w entry.totalChildren += 1; initialize(result[i]); if (scope && scope.collapsed) { - console.log("!!!!!"); $scope.toggleNode(scope, entry); } } @@ -481,7 +479,7 @@ export default function ($rootScope, $scope, $state, $stateParams, $uibModal, $w }; - function initialize (entry) { + function initialize(entry) { $scope.entryMap[entry.id] = entry; // needed to enable dragging to entries without children @@ -489,12 +487,12 @@ export default function ($rootScope, $scope, $state, $stateParams, $uibModal, $w if (!entry.children) entry.children = []; } - function getIndexParent (entry) { + function getIndexParent(entry) { var parent = $scope.entryMap[entry.parentId]; return parent.children.indexOf(entry); } - function retrieveCatalog (id, callback) { + function retrieveCatalog(id, callback) { Catalog.get({ id: id, limit: $scope.childrenLimit }, function (result) { initialize(result.root); if (result.root.children.length === 0 && result.root.totalChildren > 0) { @@ -515,7 +513,7 @@ export default function ($rootScope, $scope, $state, $stateParams, $uibModal, $w }); } - function showEntry (entry, treeScope) { + function showEntry(entry, treeScope) { // Toggle collapsed parent when selecting a thumbnail image in catalog preview if (!treeScope && $scope.currentTreeScope) { @@ -548,7 +546,7 @@ export default function ($rootScope, $scope, $state, $stateParams, $uibModal, $w showThumbnails($scope.currentEntry, offset); }; - function showThumbnails (entry, offset) { + function showThumbnails(entry, offset) { $scope.currentEntry = entry; $scope.cellsNotDisplayed = 0; @@ -598,7 +596,7 @@ export default function ($rootScope, $scope, $state, $stateParams, $uibModal, $w $scope.showThumbnails = entry.totalChildren > 0; } - function checkIfEditable () { + function checkIfEditable() { if (!$scope.user) { $scope.editable = false; } else { @@ -615,7 +613,7 @@ export default function ($rootScope, $scope, $state, $stateParams, $uibModal, $w } } - function loadEntry (entryId, callback) { + function loadEntry(entryId, callback) { CatalogEntry.get({ id: entryId }, function (result) { @@ -626,14 +624,14 @@ export default function ($rootScope, $scope, $state, $stateParams, $uibModal, $w }); } - function toggleParentHierarchy (entryId) { + function toggleParentHierarchy(entryId) { getAncestorList(entryId, [], function (list) { list.reverse(); toggleEntriesInList(list); }); } - function getAncestorList (entryId, ancestorList, callback) { + function getAncestorList(entryId, ancestorList, callback) { if ($scope.entryMap[entryId] === undefined) { loadEntry(entryId, function (entry) { ancestorList.push(entry); @@ -649,7 +647,7 @@ export default function ($rootScope, $scope, $state, $stateParams, $uibModal, $w } // ^- if cached but no parentId present, we reached the root node and return the list } - function toggleEntriesInList (list) { + function toggleEntriesInList(list) { var current = list[0]; if (current !== undefined) { @@ -662,7 +660,7 @@ export default function ($rootScope, $scope, $state, $stateParams, $uibModal, $w } } - function waitForElem (id, callback) { + function waitForElem(id, callback) { var elem = document.getElementById(id); $timeout(function () { if (elem) callback(elem); @@ -672,11 +670,11 @@ export default function ($rootScope, $scope, $state, $stateParams, $uibModal, $w function toggleMoreEntries(entry) { var parentEntry = $scope.entryMap[entry.parentId]; - var foundEntry = parentEntry.children.find(function(e) { return e.id == entry.id }); + var foundEntry = parentEntry.children.find(function (e) { return e.id == entry.id }); if (!foundEntry) { - waitForElem("entry-more-" + entry.parentId, function(elem) { + waitForElem("entry-more-" + entry.parentId, function (elem) { elem.parentNode.scrollIntoView(); - $scope.loadChildren(parentEntry).then(function() { + $scope.loadChildren(parentEntry).then(function () { toggleMoreEntries(entry); }); }); diff --git a/frontend/app/con10t-widgets/con10t-search.directive.js b/frontend/app/con10t-widgets/con10t-search.directive.js index 2433e3c49..f2cc88828 100644 --- a/frontend/app/con10t-widgets/con10t-search.directive.js +++ b/frontend/app/con10t-widgets/con10t-search.directive.js @@ -1,4 +1,4 @@ -export default function($location, $filter) { +export default function ($location, $filter) { return { restrict: 'E', template: require('./con10t-search.html'), @@ -9,21 +9,19 @@ export default function($location, $filter) { scopeName: '@', searchPage: '@' }, - link: function(scope, element, attrs) { + link: function (scope, element, attrs) { scope.placeholder = attrs.searchPlaceholder; - scope.slashRegex = /\//g; + scope.slashRegex = /\//g; - if(!scope.placeholder) + if (!scope.placeholder) scope.placeholder = $filter('transl8')('ui_projectsearchplaceholder'); - scope.search = function() { + scope.search = function () { // http://localhost:8082/project/syrher?lang=en%2Fsearch%3Fq%3D* /search?q=* var url = ''; - console.log($location.url().split("?")[0]) if (typeof scope.scopeName === "undefined") { - console.log($location.url().split("?")[0]) url += $location.url().split("?")[0] + '/'; } else { url += 'project/' + scope.scopeName + '/'; @@ -33,10 +31,10 @@ export default function($location, $filter) { url += "?q="; - if(scope.catalogId != undefined && scope.catalogId != "") - url += "catalogPaths:"+$filter('escapeSlashes')(scope.catalogId)+"+"; + if (scope.catalogId != undefined && scope.catalogId != "") + url += "catalogPaths:" + $filter('escapeSlashes')(scope.catalogId) + "+"; - if(scope.q != null && scope.q != "") + if (scope.q != null && scope.q != "") url += scope.q; else url += "*"; @@ -44,13 +42,13 @@ export default function($location, $filter) { if (scope.appendQuery) url += " AND " + scope.appendQuery; - if(scope.fq != undefined && scope.fq != "") { + if (scope.fq != undefined && scope.fq != "") { // split at every NOT escaped comma by replacing the comma with ETB, then split at every ETB var fqs = scope.fq.replace(/([^\\]),/g, '$1\u0017').split('\u0017'); - fqs.forEach(function(fq) { + fqs.forEach(function (fq) { var split = fq.split(':'); // remove backslash in front of escaped commas (de-escape) - url += '&fq='+split[0]+':"'+split[1].replace(/\\,/g, ',')+'"'; + url += '&fq=' + split[0] + ':"' + split[1].replace(/\\,/g, ',') + '"'; }); } $location.url(url); diff --git a/frontend/app/con10t-widgets/network/con10t-network-map.directive.js b/frontend/app/con10t-widgets/network/con10t-network-map.directive.js index 8776e83a2..5108b2379 100644 --- a/frontend/app/con10t-widgets/network/con10t-network-map.directive.js +++ b/frontend/app/con10t-widgets/network/con10t-network-map.directive.js @@ -1,4 +1,4 @@ -export default function($compile, transl8) { +export default function ($compile, transl8) { return { restrict: 'E', template: require('./con10t-network-map.html'), @@ -16,8 +16,10 @@ export default function($compile, transl8) { var mapElement = element[0].querySelector('.map-container'); mapElement.setAttribute('style', 'height:' + scope.mapHeight); - scope.map = L.map( mapElement, {center: [scope.lat, scope.lng], zoom: scope.zoom, - zoomAnimation: false}); + scope.map = L.map(mapElement, { + center: [scope.lat, scope.lng], zoom: scope.zoom, + zoomAnimation: false + }); L.tileLayer( 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', @@ -28,20 +30,20 @@ export default function($compile, transl8) { scope.connectionsLayer = new L.LayerGroup().addTo(scope.map); scope.previouslySelectedPlaceId = null; - scope.$watch('selectedPlaceId', function(newValue, oldValue) { + scope.$watch('selectedPlaceId', function (newValue, oldValue) { scope.evaluateState(); }); - scope.$watch('places', function(newValue, oldValue) { + scope.$watch('places', function (newValue, oldValue) { scope.evaluateState(); }); - transl8.onLoaded().then(function() { + transl8.onLoaded().then(function () { var DeselectControl = L.Control.extend({ options: { position: 'topright' }, - onAdd: function(map) { + onAdd: function (map) { var container = document.createElement("div"); container.classList.add('leaflet-bar', 'leaflet-control', 'leaflet-control-custom'); @@ -62,9 +64,9 @@ export default function($compile, transl8) { scope.map.addControl(new DeselectControl()); }); - scope.evaluateState = function() { + scope.evaluateState = function () { - if(typeof scope.places === 'undefined' || scope.connections === 'undefined') + if (typeof scope.places === 'undefined' || scope.connections === 'undefined') return; scope.evaluateVisiblePlaces(); @@ -73,16 +75,16 @@ export default function($compile, transl8) { scope.renderPlaces(); scope.renderConnections(); - if(!scope.$root.$$phase && !scope.$$phase) { + if (!scope.$root.$$phase && !scope.$$phase) { scope.$apply(); } }; - scope.evaluateVisiblePlaces = function() { + scope.evaluateVisiblePlaces = function () { scope.visiblePlaces = []; var weights = {}; - for(var i = 0; i < scope.connections.length; i++){ + for (var i = 0; i < scope.connections.length; i++) { var connection = scope.connections[i]; if (connection[0] in weights) { @@ -92,7 +94,7 @@ export default function($compile, transl8) { } } - for(var i = 0; i < scope.places.length; i++) { + for (var i = 0; i < scope.places.length; i++) { scope.visiblePlaces.push({ 'data': scope.places[i], 'weight': weights[scope.places[i]['id']] @@ -100,14 +102,14 @@ export default function($compile, transl8) { } }; - scope.evaluateVisibleConnections = function() { + scope.evaluateVisibleConnections = function () { scope.visibleConnections = []; - for(var i = 0; i < scope.connections.length; i++){ + for (var i = 0; i < scope.connections.length; i++) { var connection = scope.connections[i]; var connectionId = scope.constructConnectionKey(connection[0], connection[1]); - if(connectionId in scope.visibleConnections){ + if (connectionId in scope.visibleConnections) { scope.visibleConnections[connectionId] += 1 } else { scope.visibleConnections[connectionId] = 1 @@ -115,19 +117,18 @@ export default function($compile, transl8) { } }; - scope.renderPlaces = function() { - if(typeof scope.places === 'undefined') { - console.log('No places to render...'); + scope.renderPlaces = function () { + if (typeof scope.places === 'undefined') { return; } scope.map.removeLayer(scope.placeLayer); scope.placeLayer = new L.LayerGroup(); - for(var i = 0; i < scope.visiblePlaces.length; i++){ + for (var i = 0; i < scope.visiblePlaces.length; i++) { var weight = scope.visiblePlaces[i]['weight']; var place = scope.visiblePlaces[i]['data']; - if(place['lat'] === 'null' + if (place['lat'] === 'null' || place['lng'] === 'null' || typeof weight === 'undefined' ) continue; @@ -135,12 +136,12 @@ export default function($compile, transl8) { var coordinates = new L.LatLng(place['lat'], place['lng']); var params = { title: place['name'], - radius: (Math.log(weight) + 1)* 10000, + radius: (Math.log(weight) + 1) * 10000, id: place['id'], className: 'crosshair-cursor-enabled' }; - if(place['id'] === scope.selectedPlaceId){ + if (place['id'] === scope.selectedPlaceId) { params['color'] = 'red'; params['fillColor'] = '#f03' } @@ -153,8 +154,8 @@ export default function($compile, transl8) { scope.setSelectedPlaceId(event.sourceTarget.options.id); }); - if(place['id'] === scope.selectedPlaceId) { - scope.currentPopup = new L.Popup({ closeOnClick: false, minWidth : 250 }) + if (place['id'] === scope.selectedPlaceId) { + scope.currentPopup = new L.Popup({ closeOnClick: false, minWidth: 250 }) .setLatLng([place['lat'], place['lng']]); } } @@ -167,7 +168,7 @@ export default function($compile, transl8) { scope.activeOutgoingConnections = []; scope.activeIncomingConnections = []; - for (var idx in scope.visibleConnections){ + for (var idx in scope.visibleConnections) { var originId, destinationId; var split = scope.deconstructConnectionKey(idx); @@ -178,7 +179,7 @@ export default function($compile, transl8) { var destination = scope.getPlaceById(destinationId); if (originId === scope.selectedPlaceId) { - if( + if ( origin['lat'] !== 'null' && origin['lng'] !== 'null' && destination['lat'] !== 'null' @@ -195,7 +196,7 @@ export default function($compile, transl8) { } if (destinationId === scope.selectedPlaceId) { - if( + if ( origin['lat'] !== 'null' && origin['lng'] !== 'null' && destination['lat'] !== 'null' @@ -256,21 +257,21 @@ export default function($compile, transl8) { L.polyline(latlngs, options).addTo(scope.connectionsLayer); } - if(scope.currentPopup + if (scope.currentPopup && scope.selectedPlaceId != null && (scope.activeIncomingConnections.length > 0 || scope.activeOutgoingConnections.length > 0)) { var popContent = $compile - ( - '' + - '' - ) - (scope); + ( + '' + + '' + ) + (scope); scope.currentPopup .setContent(popContent[0]) @@ -280,30 +281,30 @@ export default function($compile, transl8) { }; - scope.setSelectedPlaceId = function(id) { + scope.setSelectedPlaceId = function (id) { scope.previouslySelectedPlaceId = scope.selectedPlaceId; scope.selectedPlaceId = id; // Reclicking a selected place should re-open the popup. Because the value stays the same for // scope.selectedPlaceId the watches are not triggered in this case. Because of that, we trigger // evaluate state for this special case and return. - if(scope.previouslySelectedPlaceId === scope.selectedPlaceId){ + if (scope.previouslySelectedPlaceId === scope.selectedPlaceId) { scope.evaluateState(); return; } - if(!scope.$root.$$phase && !scope.$$phase) { + if (!scope.$root.$$phase && !scope.$$phase) { scope.$apply(); } }; - scope.getPlaceById = function(id) { - return scope.places.filter(function(place){ + scope.getPlaceById = function (id) { + return scope.places.filter(function (place) { return place['id'] === id; })[0] }; - scope.constructConnectionKey = function(originId, destinationId) { + scope.constructConnectionKey = function (originId, destinationId) { return originId + ':::' + destinationId; }; diff --git a/frontend/app/con10t-widgets/network/con10t-time-line-chart.directive.js b/frontend/app/con10t-widgets/network/con10t-time-line-chart.directive.js index a5becfc64..98ff8c93a 100644 --- a/frontend/app/con10t-widgets/network/con10t-time-line-chart.directive.js +++ b/frontend/app/con10t-widgets/network/con10t-time-line-chart.directive.js @@ -21,7 +21,7 @@ import * as d3 from 'd3'; * If set as "true", minDate/maxDate are updated while dragging on the chart area. Otherwise, they are updated on * drag end (= when the mouse button is finally released). */ -export default function() { +export default function () { return { restrict: 'E', template: require('./con10t-time-line-chart.html'), @@ -38,12 +38,11 @@ export default function() { // Output (minDate/maxDate) is provided in days resolution, no matter the binned dates' resolution is, // so we need to generate the day-dates between overall minimum and maximum date of the bins. - scope.generateDetailedTimeSpan = function() { + scope.generateDetailedTimeSpan = function () { scope.detailedDates = []; scope.detailedDates.push(scope.overallMinDate); - var addDays = function(inputDate, n) - { + var addDays = function (inputDate, n) { return new Date( inputDate.getFullYear(), inputDate.getMonth(), @@ -54,7 +53,7 @@ export default function() { }; var currentDate = scope.overallMinDate; - while(currentDate < scope.overallMaxDate){ + while (currentDate < scope.overallMaxDate) { var newDate = addDays(currentDate, 1); scope.detailedDates.push(newDate); currentDate = newDate; @@ -63,7 +62,7 @@ export default function() { scope.detailedDates.push(scope.overallMaxDate); }; - scope.initializeD3 = function(){ + scope.initializeD3 = function () { d3.select("#timeline-container").selectAll("*").remove(); var svgElement = document.querySelector('#timeline-container'); @@ -73,22 +72,22 @@ export default function() { var outerWidth = 480; var outerHeight = 200; - if(element.length === 1){ - if(element[0].offsetWidth !== 0){ + if (element.length === 1) { + if (element[0].offsetWidth !== 0) { outerWidth = element[0].offsetWidth } - if(element[0].offsetHeight !== 0){ + if (element[0].offsetHeight !== 0) { outerHeight = element[0].offsetHeight - (element[0].offsetHeight * 0.2); } } - var margin = {top: 20, right: 50, bottom: 30, left: 50}, + var margin = { top: 20, right: 50, bottom: 30, left: 50 }, width = outerWidth - margin.left - margin.right, height = outerHeight - margin.top - margin.bottom; - var bisectDate = d3.bisector(function(d) { return d.date; }).left; + var bisectDate = d3.bisector(function (d) { return d.date; }).left; - var bisectDetailedDate = d3.bisector(function(d) { return d; }).left; + var bisectDetailedDate = d3.bisector(function (d) { return d; }).left; var x = scope.xValues = d3 .scaleTime() @@ -115,8 +114,8 @@ export default function() { var line = d3 .line() - .x(function(d) { return x(d.date); }) - .y(function(d) { return y(d.count); }); + .x(function (d) { return x(d.date); }) + .y(function (d) { return y(d.count); }); scope.svg = d3 .select("#timeline-container") @@ -125,10 +124,10 @@ export default function() { .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); - if(scope.zoomed){ + if (scope.zoomed) { y.domain([0, scope.zoomMaxValue + 5]) } else { - y.domain([0, scope.noZoomMaxValue + 5]); + y.domain([0, scope.noZoomMaxValue + 5]); } scope.svg.append("g") @@ -183,11 +182,11 @@ export default function() { .attr("class", "overlay") .attr("width", width) .attr("height", height) - .on("mouseover", function() { + .on("mouseover", function () { focus.style("display", null); clickPreview.style("display", null); }) - .on("mouseout", function() { + .on("mouseout", function () { focus.style("display", "none"); clickPreview.style("display", "none"); }) @@ -198,7 +197,7 @@ export default function() { d2 = scope.binnedData[i], d = xPos - d1.date > d2.date - xPos ? d2 : d1; focus.attr("transform", "translate(" + x(d.date) + "," + y(d.count) + ")"); - focus.select("text").text(d.date.getFullYear() + ' (' + d.count +')'); + focus.select("text").text(d.date.getFullYear() + ' (' + d.count + ')'); var x1 = x(d1.date); var x2 = x(d2.date); @@ -212,8 +211,8 @@ export default function() { var mousePosition = d3.mouse(this); var xPos = mousePosition[0]; - if(xPos < 0) xPos = 0; - if(xPos > width) xPos = width; + if (xPos < 0) xPos = 0; + if (xPos > width) xPos = width; scope.dragStartPosition = xPos; @@ -227,39 +226,39 @@ export default function() { var mousePosition = d3.mouse(this); var xPos = mousePosition[0]; - if(xPos < 0) xPos = 0; - if(xPos > width) xPos = width; + if (xPos < 0) xPos = 0; + if (xPos > width) xPos = width; scope.dragEndDate = getDetailedDateForPosition(xPos); scope.drawSelection(scope.dragStartPosition, xPos); - if(scope.dragStartPosition < xPos) { + if (scope.dragStartPosition < xPos) { clickPreview.attr('x', scope.dragStartPosition); clickPreview.attr('width', xPos - scope.dragStartPosition) - } else if(scope.dragStartPosition > xPos) { + } else if (scope.dragStartPosition > xPos) { clickPreview.attr('x', xPos); clickPreview.attr('width', scope.dragStartPosition - xPos) } - if(scope.reportOnDrag === 'true'){ + if (scope.reportOnDrag === 'true') { scope.evaluateState(); } } function dragEnd() { - if(scope.reportOnDrag !== 'true'){ + if (scope.reportOnDrag !== 'true') { var mousePosition = d3.mouse(this); var xPos = mousePosition[0]; - if(xPos < 0) xPos = 0; - if(xPos > width) xPos = width; + if (xPos < 0) xPos = 0; + if (xPos > width) xPos = width; scope.dragEndPosition = xPos; - if(scope.dragStartPosition === scope.dragEndPosition){ + if (scope.dragStartPosition === scope.dragEndPosition) { scope.dragStartDate = new Date( getDateForPosition(xPos) ); - scope.dragEndDate = new Date( + scope.dragEndDate = new Date( (getDateForPosition(xPos).getFullYear() + 1).toString() ); } else { @@ -270,7 +269,7 @@ export default function() { } } - function getDateForPosition(xPos){ + function getDateForPosition(xPos) { // Get the x-axis data index where the current xPos value would be inserted... var i = bisectDate(scope.binnedData, x.invert(xPos), 1); // ... then check which of the neighbouring values is closer and return the closer one's date. @@ -296,14 +295,14 @@ export default function() { scope.evaluateState = function () { - if(scope.dragStartDate != null && scope.dragEndDate != null){ + if (scope.dragStartDate != null && scope.dragEndDate != null) { scope.minDate = null; scope.maxDate = null; - if(scope.dragStartDate < scope.dragEndDate){ + if (scope.dragStartDate < scope.dragEndDate) { scope.minDate = scope.dragStartDate; scope.maxDate = scope.dragEndDate; - } else if(scope.dragStartDate > scope.dragEndDate){ + } else if (scope.dragStartDate > scope.dragEndDate) { scope.minDate = scope.dragEndDate; scope.maxDate = scope.dragStartDate; } else { @@ -314,17 +313,17 @@ export default function() { scope.zoomActive = (scope.noZoomMaxValue != scope.zoomMaxValue); - if(!scope.$root.$$phase && !scope.$$phase) { + if (!scope.$root.$$phase && !scope.$$phase) { scope.$apply(); } }; - scope.drawSelection = function(x1, x2){ - if(x1 < x2) { + scope.drawSelection = function (x1, x2) { + if (x1 < x2) { scope.selectionBox.attr("opacity", .5); scope.selectionBox.attr('x', x1); scope.selectionBox.attr('width', x2 - x1) - } else if(x1 > x2) { + } else if (x1 > x2) { scope.selectionBox.attr("opacity", .5); scope.selectionBox.attr('x', x2); scope.selectionBox.attr('width', x1 - x2) @@ -333,16 +332,15 @@ export default function() { } }; - scope.reset = function() { + scope.reset = function () { scope.dragStartDate = scope.overallMinDate; scope.dragEndDate = scope.overallMaxDate; scope.evaluateState(); }; - scope.recreate = function() { + scope.recreate = function () { - if(scope.binnedData.length === 0){ - console.log("No time data."); + if (scope.binnedData.length === 0) { return; } @@ -358,8 +356,8 @@ export default function() { scope.dragEndPosition = scope.getPositionForDate(scope.dragEndDate); scope.zoomMaxValue = Number.MIN_VALUE; - for(var i = 0; i < scope.binnedData.length; i++){ - if(scope.binnedData[i].count > scope.zoomMaxValue){ + for (var i = 0; i < scope.binnedData.length; i++) { + if (scope.binnedData[i].count > scope.zoomMaxValue) { scope.zoomMaxValue = scope.binnedData[i].count; } } @@ -368,13 +366,13 @@ export default function() { scope.drawSelection(scope.dragStartPosition, scope.dragEndPosition); }; - scope.getPositionForDate = function(date){ + scope.getPositionForDate = function (date) { return scope.xDetailed(date) }; - scope.toggleZoom = function(){ + scope.toggleZoom = function () { - if(!scope.zoomActive) return; + if (!scope.zoomActive) return; scope.zoomed = !scope.zoomed; scope.initializeD3(); @@ -386,8 +384,8 @@ export default function() { scope.zoomed = false; scope.zoomMaxValue = Number.MIN_VALUE; - scope.$watch('binnedData', function(newValue, oldValue) { - if(typeof newValue === 'undefined'){ + scope.$watch('binnedData', function (newValue, oldValue) { + if (typeof newValue === 'undefined') { return; } scope.recreate(); diff --git a/frontend/app/image/ar-img.directive.js b/frontend/app/image/ar-img.directive.js index aaf3f0c7d..3781f2802 100644 --- a/frontend/app/image/ar-img.directive.js +++ b/frontend/app/image/ar-img.directive.js @@ -1,4 +1,4 @@ -export default function(arachneSettings, $http) { +export default function (arachneSettings, $http) { return { scope: { @@ -10,7 +10,7 @@ export default function(arachneSettings, $http) { link: function (scope, element, attrs) { scope.loadImg = function () { - + var img = element[0]; if (scope.imgId) { var img = element[0]; @@ -22,18 +22,18 @@ export default function(arachneSettings, $http) { } else { imgUri += scope.imgId; } - $http.get(imgUri, {responseType: 'arraybuffer'}) + $http.get(imgUri, { responseType: 'arraybuffer' }) .then(function (result) { var data = result.data; - var blob = new Blob([data], {type: 'image/jpeg'}); + var blob = new Blob([data], { type: 'image/jpeg' }); img.src = window.URL.createObjectURL(blob); }).catch(function (result) { img.src = 'img/placeholder/placeholderError.png'; if (scope.imgWidth) img.width = scope.imgWidth; if (scope.imgHeight) img.height = scope.imgHeight; } - ); + ); } else { img.src = 'img/placeholder/placeholderNoImage.png'; if (scope.imgWidth) img.width = scope.imgWidth; @@ -44,7 +44,7 @@ export default function(arachneSettings, $http) { if (element[0].tagName == 'IMG') { scope.loadImg(); } else { - console.log("Warning: ar-img directive used on a non img element!"); + console.error("Warning: ar-img directive used on a non img element!"); } scope.$watch('imgId', function () { diff --git a/frontend/app/svg/svg.controller.js b/frontend/app/svg/svg.controller.js index 2e8a16bb5..b07364c19 100644 --- a/frontend/app/svg/svg.controller.js +++ b/frontend/app/svg/svg.controller.js @@ -12,13 +12,13 @@ export default function ($scope, $http, $location, arachneSettings) { $scope.requestedId = null; $scope.panZoomObject = null; - $scope.init = function (){ + $scope.init = function () { $scope.requestedId = $location.search().id; - var metadataRequestURL = arachneSettings.dataserviceUri + '/model/' + $scope.requestedId + '?meta=true'; + var metadataRequestURL = arachneSettings.dataserviceUri + '/model/' + $scope.requestedId + '?meta=true'; $http.get(metadataRequestURL) - .then(function(response) { - if(!$scope.validFormat(response.data.format)){ + .then(function (response) { + if (!$scope.validFormat(response.data.format)) { $scope.setErrorMessage( 'Error: "' + response.data.format + '" is no valid vector graphics format for this viewer.' ); @@ -32,17 +32,17 @@ export default function ($scope, $http, $location, arachneSettings) { ); console.error(response.status + ", " + response.statusText); }); - }; + }; - $scope.displayMetadata = function(metadata) { + $scope.displayMetadata = function (metadata) { $scope.titleDisplay.innerHTML = metadata['title']; $scope.licenseDisplay.innerHTML = metadata['license']; $scope.modellerDisplay.innerHTML = metadata['modeller']; }; - $scope.validFormat = function(format) { - switch(format) { + $scope.validFormat = function (format) { + switch (format) { case 'svg': return true; default: @@ -50,7 +50,7 @@ export default function ($scope, $http, $location, arachneSettings) { } }; - $scope.loadSVGData = function(url) { + $scope.loadSVGData = function (url) { $http.get(url) .then( function (response) { @@ -70,7 +70,6 @@ export default function ($scope, $http, $location, arachneSettings) { fit: true, contain: true }); - console.log($scope.panZoomObject); }, function (error) { $scope.setErrorMessage( 'Error loading the requested SVG metadata.' @@ -91,7 +90,7 @@ export default function ($scope, $http, $location, arachneSettings) { $scope.panZoomObject.reset(); }; - $scope.setErrorMessage = function(msg) { + $scope.setErrorMessage = function (msg) { $scope.statusElement.innerHTML = msg; $scope.statusElement.classList.remove('alert-success'); $scope.statusElement.classList.add('alert-danger'); diff --git a/frontend/app/users/edit-user.controller.js b/frontend/app/users/edit-user.controller.js index 7e1d1b313..8e2b8dffc 100644 --- a/frontend/app/users/edit-user.controller.js +++ b/frontend/app/users/edit-user.controller.js @@ -5,7 +5,7 @@ * user the logged in users personal information. * submit function which sends the user data to the backend in order to update personal information. */ -export default function($scope, $http, arachneSettings, authService, messages, $timeout, transl8) { +export default function ($scope, $http, arachneSettings, authService, messages, $timeout, transl8) { $scope.formChange = false; @@ -32,7 +32,7 @@ export default function($scope, $http, arachneSettings, authService, messages, $ }); var HEADERS = { - "headers": {"Content-Type": "application/json"} + "headers": { "Content-Type": "application/json" } }; /** @@ -77,8 +77,8 @@ export default function($scope, $http, arachneSettings, authService, messages, $ $scope.user = data; $scope.user.emailValidation = $scope.user.email; }).catch(function (data) { - console.log("no user info found for user " + authService.getUser().username); - }); + console.error("no user info found for user " + authService.getUser().username); + }); } else { $timeout(function () { putMsg('ui_not_logged_in', 'warning') diff --git a/frontend/app/users/pwd-activation.controller.js b/frontend/app/users/pwd-activation.controller.js index df34b3196..9f4567309 100644 --- a/frontend/app/users/pwd-activation.controller.js +++ b/frontend/app/users/pwd-activation.controller.js @@ -3,7 +3,7 @@ * * @author: Daniel M. de Oliveira */ -export default function($scope, $stateParams, $filter, $location, PwdActivation, messages) { +export default function ($scope, $stateParams, $filter, $location, PwdActivation, messages) { /** * Copy the user so that the shown passwords @@ -31,12 +31,11 @@ export default function($scope, $stateParams, $filter, $location, PwdActivation, }; var handleActivationError = function (data) { - console.log(data); messages.add('ui.register.passwordsDontMatch', 'danger'); }; $scope.submit = function () { - PwdActivation.save({token: $stateParams.token}, + PwdActivation.save({ token: $stateParams.token }, copyUser($scope.user), handleActivationSuccess, handleActivationError From c0bf870d1e5e44fd9f6e0b7c90f46a068324b7dc Mon Sep 17 00:00:00 2001 From: Simon Hohl Date: Tue, 14 Jan 2025 09:52:01 +0100 Subject: [PATCH 11/13] Simplify password reset Instead of requiring username, email, first- and lastname, users only need to provide their email address. --- .../controller/UserManagementController.java | 34 ++++-------- frontend/app/users/pwd-reset.html | 53 +++++++------------ frontend/app/users/pwd-reset.resource.js | 6 +-- 3 files changed, 33 insertions(+), 60 deletions(-) diff --git a/backend/src/main/java/de/uni_koeln/arachne/controller/UserManagementController.java b/backend/src/main/java/de/uni_koeln/arachne/controller/UserManagementController.java index 76e3d069b..c6a328b15 100644 --- a/backend/src/main/java/de/uni_koeln/arachne/controller/UserManagementController.java +++ b/backend/src/main/java/de/uni_koeln/arachne/controller/UserManagementController.java @@ -427,29 +427,17 @@ public Map reset(@RequestBody Map userCredentials, if (userRightsService.isSignedInUser()) return result; - final String userName = getFormData(userCredentials, "username", true, "ui.passwordreset."); final String eMailAddress = getFormData(userCredentials, "email", true, "ui.passwordreset."); - final String firstName = getFormData(userCredentials, "firstname", true, "ui.passwordreset."); - final String lastName = getFormData(userCredentials, "lastname", true, "ui.passwordreset."); - User userByName = userDao.findByName(userName); - if (userByName == null) { - LOGGER.info("User not found: {}", userName); - return result; - } - if (!userByName.getEmail().equals(eMailAddress)) { - LOGGER.info("Wrong eMail provided for user '{}': {}", userName, eMailAddress); - return result; - } - if (!userByName.getFirstname().equals(firstName) || - !userByName.getLastname().equals(lastName)) { - LOGGER.info("Wrong first or last name provided for user '{}': {}, {}", userName, firstName, lastName); + User userByEmail = userDao.findByEMailAddress(eMailAddress); + if (userByEmail == null) { + LOGGER.info("User not found: {}", eMailAddress); return result; } resetPasswordRequestDao.deleteExpiredRequests(); // get rid of all expired requests // if there is already a request pending do not allow to add a new one - if (resetPasswordRequestDao.getByUserId(userByName.getId()) != null) { + if (resetPasswordRequestDao.getByUserId(userByEmail.getId()) != null) { result.put("message", "ui.passwordreset.already_present"); LOGGER.info("A non-expired password request is already present in the database for user: {}", userName); return result; @@ -465,7 +453,7 @@ public Map reset(@RequestBody Map userCredentials, ResetPasswordRequest request = new ResetPasswordRequest(); request.setToken(token); - request.setUserId(userByName.getId()); + request.setUserId(userByEmail.getId()); request.setExpirationDate(expirationDate); resetPasswordRequestDao.save(request); @@ -473,14 +461,14 @@ public Map reset(@RequestBody Map userCredentials, final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); final String nowString = dateFormat.format(now); final String expirationDateString = dateFormat.format(expirationDate); - final String linkString = "http://" + serverAddress + "/user/activation/" + token; + final String linkString = "https://" + serverAddress + "/user/activation/" + token; - final String messageBody = "Sie haben ihr Passwort bei Arachne am " + nowString + " zurückgesetzt." - + newLine + "Bitte folgen sie diesem Link um den Prozess abzuschließen: " + linkString - + newLine + "Dieser Link ist bis zum " + expirationDateString + " gültig."; + final String messageBody = "A password reset was requested for iDAI.objects/Arachne on " + nowString + "." + + newLine + "You can use the following link to reset your password: " + linkString + + newLine + "The link is valid until " + expirationDateString + "."; - if (!isTestUser(userByName) && !mailService.sendMail(userByName.getEmail(), "Passwort zurückgesetzt bei Arachne", messageBody)) { - LOGGER.error("Unable to send password activation eMail to user: " + userByName.getEmail()); + if (!isTestUser(userByEmail) && !mailService.sendMail(userByEmail.getEmail(), "Passwort zurückgesetzt bei Arachne", messageBody)) { + LOGGER.error("Unable to send password activation eMail to user: " + userByEmail.getEmail()); resetPasswordRequestDao.delete(request); result.put("success", "false"); response.setStatus(400); diff --git a/frontend/app/users/pwd-reset.html b/frontend/app/users/pwd-reset.html index 99d4c7fbe..b2aa0746b 100644 --- a/frontend/app/users/pwd-reset.html +++ b/frontend/app/users/pwd-reset.html @@ -1,47 +1,32 @@
    -
    \ No newline at end of file diff --git a/frontend/app/users/pwd-reset.resource.js b/frontend/app/users/pwd-reset.resource.js index 6e1f3f587..c26b38f8b 100644 --- a/frontend/app/users/pwd-reset.resource.js +++ b/frontend/app/users/pwd-reset.resource.js @@ -1,10 +1,10 @@ -export default function($resource, arachneSettings) { +export default function ($resource, arachneSettings) { return $resource(arachneSettings.dataserviceUri + '/user/reset', {}, { - save : { + save: { isArray: false, method: 'POST', - headers: {'Content-Type': 'application/json'} + headers: { 'Content-Type': 'application/json' } } }); }; From 08356fe713f1b368ac8c189d2ca8c3eac351653f Mon Sep 17 00:00:00 2001 From: Simon Hohl Date: Tue, 14 Jan 2025 09:54:57 +0100 Subject: [PATCH 12/13] Remove homepage, zip, street, country and phone number from user details --- frontend/app/users/edit-user.html | 294 +----------------------------- frontend/app/users/register.html | 56 +----- 2 files changed, 15 insertions(+), 335 deletions(-) diff --git a/frontend/app/users/edit-user.html b/frontend/app/users/edit-user.html index 154b4b975..7f01b64c0 100644 --- a/frontend/app/users/edit-user.html +++ b/frontend/app/users/edit-user.html @@ -7,14 +7,13 @@

    {{'ui.update.manage'|transl8}}

    -
    +
    + ng-model="user.username" readonly>
    @@ -22,11 +21,11 @@

    {{'ui.update.manage'|transl8}}

    + ng-model="user.firstname">
    + ng-model="user.lastname">
    @@ -40,7 +39,7 @@

    {{'ui.update.manage'|transl8}}

    + ng-model="user.emailValidation">
    @@ -51,286 +50,6 @@

    {{'ui.update.manage'|transl8}}

    -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    - -
    - -
    -
    - -
    - -
    - -
    -
    -
    @@ -344,7 +63,8 @@

    {{'ui.update.manage'|transl8}}

    -
    diff --git a/frontend/app/users/register.html b/frontend/app/users/register.html index 1ddc15e9d..6239a48f1 100644 --- a/frontend/app/users/register.html +++ b/frontend/app/users/register.html @@ -17,19 +17,19 @@

    {{'register_register'|transl8}}

    + ng-model="user.username">
    - +
    + ng-model="user.passwordValidation">
    @@ -37,11 +37,11 @@

    {{'register_register'|transl8}}

    + ng-model="user.firstname">
    + ng-model="user.lastname">
    @@ -55,7 +55,7 @@

    {{'register_register'|transl8}}

    + ng-model="user.emailValidation">
    @@ -66,46 +66,6 @@

    {{'register_register'|transl8}}

    -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    - -
    - -
    -
    - -
    - -
    - -
    -
    -
    @@ -141,4 +101,4 @@

    {{'register_register'|transl8}}

    -
    +
    \ No newline at end of file From a5e60032216a32b305306115917224cc2cbc64a5 Mon Sep 17 00:00:00 2001 From: Simon Hohl Date: Tue, 14 Jan 2025 15:53:50 +0100 Subject: [PATCH 13/13] Remove reference to deleted variable --- .../uni_koeln/arachne/controller/UserManagementController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/de/uni_koeln/arachne/controller/UserManagementController.java b/backend/src/main/java/de/uni_koeln/arachne/controller/UserManagementController.java index c6a328b15..a9480f674 100644 --- a/backend/src/main/java/de/uni_koeln/arachne/controller/UserManagementController.java +++ b/backend/src/main/java/de/uni_koeln/arachne/controller/UserManagementController.java @@ -439,7 +439,7 @@ public Map reset(@RequestBody Map userCredentials, // if there is already a request pending do not allow to add a new one if (resetPasswordRequestDao.getByUserId(userByEmail.getId()) != null) { result.put("message", "ui.passwordreset.already_present"); - LOGGER.info("A non-expired password request is already present in the database for user: {}", userName); + LOGGER.info("A non-expired password request is already present in the database for user: {}", eMailAddress); return result; }