feat(usage): add consented beta capabilities and gallery photo totals
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { useState } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import catalog from './usageFeatures.v2.json';
|
||||
import catalog from './usageFeatures.v3.json';
|
||||
|
||||
/** Local, static disclosure: opening it never contacts the collector. */
|
||||
export function UsageCatalog() {
|
||||
@@ -12,6 +12,13 @@ export function UsageCatalog() {
|
||||
<details className="rounded border border-theme p-3">
|
||||
<summary className="cursor-pointer font-semibold">{t('productUsage.catalogTitle')}</summary>
|
||||
<p className="my-3 text-sm">{t('productUsage.catalogExplanation')}</p>
|
||||
<section className="my-3 space-y-2 text-sm">
|
||||
<h4 className="font-semibold">{t('productUsage.inventoryTitle')}</h4>
|
||||
<p>{t('productUsage.inventoryExplanation')}</p>
|
||||
{Object.keys(catalog.inventory).map((key) => <p key={key}>
|
||||
<strong>{t(`productUsage.inventory.${key}.name`)}</strong>: {t(`productUsage.inventory.${key}.description`)}
|
||||
</p>)}
|
||||
</section>
|
||||
<label className="block text-sm">
|
||||
{t('productUsage.catalogSearch')}
|
||||
<input type="search" value={search} onChange={(e) => setSearch(e.target.value)}
|
||||
|
||||
@@ -72,7 +72,7 @@ afterEach(cleanup);
|
||||
it('shows every v2 signal locally before participation, without collector calls', async () => {
|
||||
mount();
|
||||
await screen.findByText('productUsage.catalogTitle');
|
||||
expect(screen.getAllByRole('heading', { level: 4, hidden: true })).toHaveLength(73);
|
||||
expect(screen.getAllByRole('heading', { level: 4, hidden: true })).toHaveLength(87);
|
||||
expect(service.enable).not.toHaveBeenCalled();
|
||||
expect(service.preview).not.toHaveBeenCalled();
|
||||
expect(service.upgradeConsent).not.toHaveBeenCalled();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"productUsage": {
|
||||
"fields": "usage.v2-Berichte enthalten einen Installationsfingerabdruck, PicPeak-Version, UTC-Berichtstag und Erstellungszeit, Schema-/Signaturmetadaten, feste Galerie-Layouts und 73 fest definierte Funktionssignale: 56 Konfiguriert/Genutzt-Paare und 17 reine Konfigurationswerte. Der vollständige Katalog unten erklärt jedes Feld. Keine Aktionsanzahlen und keine Besucherbeobachtung.",
|
||||
"catalogTitle": "Vollständiger Katalog: alle 73 Funktionssignale (usage.v2)",
|
||||
"catalogExplanation": "Konfiguriert beschreibt technische Verfügbarkeit oder Konfiguration, nicht Beliebtheit. Integrierte Funktionen sind immer verfügbar. Genutzt ist ein einziges installationsweites Ja/Nein seit Zustimmung zum aktuellen Schema (v1: seit Teilnahme; v2: seit Teilnahme oder ausdrücklicher Erweiterung). Angenommene Aufträge gelten als gestartet, nicht zwingend abgeschlossen. Reine Konfigurationssignale haben kein Genutzt-Feld. Die Marker speichern weder Person noch Ereignis-ID, Aktionszeit oder Häufigkeit.",
|
||||
"fields": "usage.v3-Berichte enthalten einen Installationsfingerabdruck, PicPeak-Version, UTC-Berichtsdatum und Erstellungszeit, Schema-/Signaturmetadaten, feste Galerie-Layouts, 86 Funktionssignale (63 Konfiguriert/Genutzt-Paare und 23 reine Konfigurationswerte) sowie zwei Gesamtzahlen der Installation: gespeicherte Galerien und Fotoeinträge ohne Videos. Entwürfe, archivierte Galerien und deren erhaltene Fotoeinträge zählen mit. Der Katalog unten erklärt jedes Feld. Keine Aktionsanzahlen oder Besucherbeobachtung.",
|
||||
"catalogTitle": "Vollständiger Katalog: 86 Funktionssignale und 2 Bestandszahlen (usage.v3)",
|
||||
"catalogExplanation": "Konfiguriert beschreibt die aktuelle technische Verfügbarkeit oder Einrichtung. Integriert bedeutet verfügbar, nicht genutzt. Genutzt ist ein installationsweites Ja/Nein seit Zustimmung zum Berichtsschema; angenommene Aufträge gelten als gestartet, nicht zwingend abgeschlossen. Reine Konfigurationssignale enthalten kein Genutzt-Feld. Der Bestand enthält nur aktuelle Gesamtzahlen der Galerie-/Fotoeinträge, ohne Aufschlüsselung nach Galerien. Nutzungsmarker speichern keine Personen, Objektkennungen, Aktionszeiten oder Häufigkeiten.",
|
||||
"catalogSearch": "Funktionsname oder Schlüssel suchen",
|
||||
"catalogEmpty": "Keine passenden Funktionen.",
|
||||
"configuredLabel": "Konfiguriert",
|
||||
"usedLabel": "Genutzt",
|
||||
"configurationOnly": "Nur Konfiguration — tatsächliche Nutzung wird nicht erfasst.",
|
||||
"versionDisclosure": "Diese Zustimmung gilt für usage.v2 / usage-consent.v2. Bestehende v1-Teilnehmer teilen weiterhin nur die bisherigen 19 Funktionen, bis sie der Erweiterung ausdrücklich zustimmen. Vertrauliche Identität und Rohberichtshistorie bleiben erhalten; der lokale Beobachtungszeitraum der Nutzungsmarker beginnt mit der Collector-Bestätigung neu. Pro UTC-Tag wird höchstens ein Bericht angenommen; der erste v2-Bericht kann daher am nächsten aktiven Tag erfolgen. Vor Bestätigung werden keine neuen lokalen Marker erfasst.",
|
||||
"versionDisclosure": "Diese Zustimmung gilt für usage.v3 / usage-consent.v3. Bestehende v1- und v2-Teilnahmen behalten ihre bisherigen 19 bzw. 73 Fähigkeiten ohne Bestandszahlen bis zur ausdrücklichen Erweiterung. Identität und Rohhistorie bleiben erhalten; lokale Nutzungsmarker beginnen erst nach Bestätigung durch den Collector neu. Höchstens ein Bericht pro UTC-Tag wird angenommen, der erste v3-Bericht kann daher am nächsten aktiven Tag folgen. Neue Marker und Bestandszahlen werden vor Bestätigung nicht erfasst.",
|
||||
"currentSchema": "Aktuelles Berichtsschema: {{schema}}",
|
||||
"reviewUpgrade": "Erweiterten Umfang von usage.v2 prüfen",
|
||||
"upgrade": "usage.v2 ausdrücklich zustimmen",
|
||||
"upgradeExplanation": "Ihre bestehende usage.v1-Teilnahme bleibt unverändert. Prüfen Sie den vollständigen erweiterten Katalog, bevor Sie über das Upgrade entscheiden. Eine Ablehnung beendet Ihre bisherige Teilnahme nicht.",
|
||||
"upgradePending": "Die signierte Erweiterung der Zustimmung wartet auf Bestätigung. Es wird nur der bisherige v1-Umfang erfasst. Versuchen Sie es erneut, sobald der Collector erreichbar ist, oder deaktivieren Sie die Teilnahme zum Stoppen und Löschen.",
|
||||
"reviewUpgrade": "Erweiterten Umfang von usage.v3 prüfen",
|
||||
"upgrade": "usage.v3 ausdrücklich zustimmen",
|
||||
"upgradeExplanation": "Deine bestehende Teilnahme behält ihren bisherigen Umfang. Prüfe den erweiterten Katalog und die beiden Bestandszahlen, bevor du dich entscheidest. Ablehnen beendet die Teilnahme nicht.",
|
||||
"upgradePending": "Die signierte Erweiterung wartet auf Bestätigung. Es wird nur der bisher bestätigte Umfang erfasst. Wiederhole den Versuch, wenn der Collector erreichbar ist, oder deaktiviere die Teilnahme zum Stoppen und Löschen.",
|
||||
"catalog": {
|
||||
"crm": {
|
||||
"name": "Kundenverwaltung",
|
||||
@@ -71,7 +71,7 @@
|
||||
"used": "Eine dokumentierte erfolgreiche authentifizierte Admin-Funktionsoperation wurde seit Zustimmung zu diesem Schema beobachtet. Keine Person, Operationshistorie, Parameter oder Anzahlen."
|
||||
},
|
||||
"face_recognition": {
|
||||
"name": "Gesichtserkennung",
|
||||
"name": "ML-Gesichtserkennung",
|
||||
"configured": "Der Funktionsschalter faces ist effektiv aktiviert; nur ein Wahrheitswert.",
|
||||
"used": "Eine dokumentierte erfolgreiche authentifizierte Admin-Funktionsoperation wurde seit Zustimmung zu diesem Schema beobachtet. Keine Person, Operationshistorie, Parameter oder Anzahlen."
|
||||
},
|
||||
@@ -362,6 +362,65 @@
|
||||
"gallery_expiration": {
|
||||
"name": "Galerieablauf konfiguriert",
|
||||
"configured": "Mindestens eine Galerie hat einen Ablauf konfiguriert; keine Daten, Galeriekennungen oder Anzahlen."
|
||||
},
|
||||
"photo_xmp_export": {
|
||||
"name": "XMP-Export",
|
||||
"configured": "Integrierte Funktion ist verfügbar; dies ist kein Nutzungsnachweis.",
|
||||
"used": "Ein Admin hat erfolgreich einen XMP-Export erstellt; keine Sidecars, Dateinamen, Bewertungen, Auswahlen oder Anzahlen."
|
||||
},
|
||||
"photo_replacement": {
|
||||
"name": "Fotoersetzung",
|
||||
"configured": "Integrierte Funktion ist verfügbar; dies ist kein Nutzungsnachweis.",
|
||||
"used": "Ein Admin-Upload hat tatsächlich erfolgreich ein Foto ersetzt; keine Dateinamen, Abgleichwerte, Kennungen oder Anzahlen."
|
||||
},
|
||||
"photo_admin_marks": {
|
||||
"name": "Fotografenmarkierungen",
|
||||
"configured": "Integrierte Funktion ist verfügbar; dies ist kein Nutzungsnachweis.",
|
||||
"used": "Ein Admin hat eine eigene Fotomarkierung erfolgreich gespeichert; keine Bewertung, Farbe, Foto- oder Admin-Identität."
|
||||
},
|
||||
"gallery_folders": {
|
||||
"name": "Galerieordner eingerichtet",
|
||||
"configured": "Eine anwendbare globale oder Galerie-Kategorie ist als Ordner eingerichtet; keine Namen, Inhalte, Anzahlen oder Besucheraktivität."
|
||||
},
|
||||
"transfer_upload_links": {
|
||||
"name": "PicTransfer-Uploadlinks aktiviert",
|
||||
"configured": "PicTransfer ist aktiviert und ein nicht gelöschter Transfer erlaubt noch gültige Uploads; keine Links, Tokens, Daten, Empfänger oder Uploads."
|
||||
},
|
||||
"workflow_automation_enabled": {
|
||||
"name": "Workflow-Automation aktiviert",
|
||||
"configured": "Das Workflow-Modul und mindestens ein Workflow sind aktiviert; keine Namen, Graphen, Auslöser, Entscheidungen oder Durchläufe."
|
||||
},
|
||||
"s3_auto_import": {
|
||||
"name": "Automatischer S3-Import aktiviert",
|
||||
"configured": "S3-Medienspeicher ist eingerichtet und STORAGE_AUTO_IMPORT aktiviert; keine Buckets, Präfixe, Zugangsdaten, Abfragen oder importierten Objekte."
|
||||
},
|
||||
"crm_invoice_import": {
|
||||
"name": "Rechnungsimport",
|
||||
"configured": "Die erforderlichen Produktfunktionen sind effektiv aktiviert; nur ein Wahrheitswert.",
|
||||
"used": "Ein Admin hat eine bestehende Rechnung erfolgreich importiert; keine PDF, Rechnungsnummer, Beträge, Währung, Kunden oder Zahlungsstände."
|
||||
},
|
||||
"crm_combined_billing": {
|
||||
"name": "Kombinierte Abrechnung",
|
||||
"configured": "Die erforderlichen Produktfunktionen sind effektiv aktiviert; nur ein Wahrheitswert.",
|
||||
"used": "Ein Admin hat erfolgreich eine kombinierte Abrechnung erstellt; keine Stunden, Ausgaben, Kunden, Dokumente oder Finanzwerte."
|
||||
},
|
||||
"crm_monthly_billing_manual": {
|
||||
"name": "Manuelle Monatsabrechnung",
|
||||
"configured": "Die erforderlichen Produktfunktionen sind effektiv aktiviert; nur ein Wahrheitswert.",
|
||||
"used": "Ein Admin hat einen Monatsentwurf erfolgreich zum Versand freigegeben; die tatsächliche E-Mail-Zustellung wird nicht gemessen. Keine Scheduler-Aktivität, Kunden, Intervalle oder Rechnungswerte."
|
||||
},
|
||||
"crm_document_conversion": {
|
||||
"name": "Dokumentumwandlung",
|
||||
"configured": "Die erforderlichen Produktfunktionen sind effektiv aktiviert; nur ein Wahrheitswert.",
|
||||
"used": "Ein Admin hat ein Angebot oder einen Vertrag erfolgreich in ein Dokument oder eine Galerie umgewandelt; keine Inhalte, Verknüpfungen, Annahmestände oder automatischen Workflows."
|
||||
},
|
||||
"gallery_capture_date_sort": {
|
||||
"name": "Sortierung nach Aufnahmezeit eingerichtet",
|
||||
"configured": "Eine Galerie sortiert standardmäßig nach Aufnahmezeit; keine Aufnahmedaten, EXIF oder Sortieraktionen von Besuchern."
|
||||
},
|
||||
"download_original_filenames": {
|
||||
"name": "Originaldateinamen für Downloads aktiviert",
|
||||
"configured": "Der Schalter für Originaldateinamen beim Download ist aktiviert; keine Dateinamen oder Downloads werden gelesen oder gesendet."
|
||||
}
|
||||
},
|
||||
"auditTitle": "Export- und Löschquittungen",
|
||||
@@ -384,11 +443,11 @@
|
||||
"sectionVisibility": "Wo er sichtbar ist",
|
||||
"sectionDeletion": "Beenden und löschen",
|
||||
"sectionFeedback": "Feedback ist getrennt",
|
||||
"excluded": "Automatische Berichte enthalten keine Galeriebesucher, Klickverläufe, Foto- oder Galerieanzahlen, Namen, E-Mail-Adressen, Domains, Dateinamen oder Zugangsdaten.",
|
||||
"excluded": "Automatische Berichte enthalten keine Besucheraktivität, Klickverläufe, Aufschlüsselungen nach Galerien oder Fotos, Namen, E-Mails, Domains, Dateinamen, Bildinhalte, biometrischen Ergebnisse, Finanzwerte oder Konfigurationsgeheimnisse.",
|
||||
"transport": "Ihr PicPeak-Backend verwahrt den Signaturschlüssel und sendet einmal pro UTC-Tag bei Admin-Nutzung signierte Nutzungsberichte an {{collector}}. Sie können Berichte vorab ansehen und jeden eindeutig angenommenen Bericht genau wie beim ersten Empfang herunterladen; Übertragungswiederholungen werden zusammengeführt. Abgelehnte Versuche und getrennt gesendetes Feedback gehören nicht zu diesem Berichtsexport.",
|
||||
"sectionOneWay": "Nur senden — kein Rückkanal",
|
||||
"oneWay": "PicPeak sendet ausschließlich. Es ruft beim Collector nichts ab, holt sich keine Anweisungen und stellt ihm keinen Endpunkt bereit, den er aufrufen könnte — auf diesem Weg gibt es weder einen geplanten Job noch eine eingehende Route. Aus einer Antwort wird nur die Bestätigung für das eben gesendete Paket gelesen, und jedes ihrer Felder wird gegen dieses Paket geprüft, bevor sie angenommen wird; alles andere wird verworfen. Ein von Ihnen angeforderter Datenexport wird Ihnen als Datei übergeben und niemals ausgewertet oder ausgeführt. Über diesen Kanal können also weder Code noch Konfiguration oder Inhalte in Ihre Installation gelangen — auch nicht von einem übernommenen Collector.",
|
||||
"visibility": "Nur teilnehmende Installationen können den Funktionsdatensatz und aggregierte Ergebnisse einsehen, auch Gruppen mit nur einer Installation. Schema und Quellcode sind öffentlich; geprüfte Funktionswünsche und Empfehlungen werden nur mit Erlaubnis ihrer Verfasser veröffentlicht. Ihr Fingerabdruck ist pseudonym, nicht anonym. Bewahren Sie Ihren Abfrage-Hash vertraulich auf: Er ermöglicht lesenden Zugriff auf Ihre eigenen Berichte und den Teilnehmerdatensatz.",
|
||||
"visibility": "Teilnehmende Installationen können den gemeinsamen Datensatz der neuesten Funktionskombinationen und Bestandszahlen einschließlich Einzelgruppen sowie aggregierte Zeitverläufe einsehen. Maintainer können alle aufbewahrten Originalberichte und privates Feedback einsehen und exportieren. Dies erlaubt keine Veröffentlichung privaten Feedbacks. Schema und Quellcode sind öffentlich. Dein Fingerabdruck und die Daten sind pseudonym, nicht anonym. Halte deinen Lookup-Hash geheim: Er gewährt Lesezugriff auf deine Berichte und den Teilnehmerdatensatz.",
|
||||
"deletion": "Deaktivieren stoppt die Erfassung sofort und fordert die Löschung der Berichte, Aggregatbeiträge, Rückmeldungen, Veröffentlichungen, Stimmen und Sitzungen an. Bei einem Ausfall bleiben nur die zur Löschung nötigen Zugangsdaten erhalten; die Oberfläche zeigt die ausstehende Löschung. Nach Bestätigung werden Hash und Schlüssel lokal gelöscht; eine erneute Teilnahme erzeugt eine neue Identität. Der Collector behält einen Einweg-Sperrwert und kurzlebige Missbrauchszähler ohne Installationsbezug. PicPeak speichert eine herunterladbare lokale Löschquittung ohne den alten Hash, Schlüssel oder Inhalte.",
|
||||
"feedbackDisclosure": "Feedback wird getrennt von automatischen Berichten und nur beim Absenden übertragen. Jeder Beitrag ist anonym, sofern Sie keinen Namen angeben, und nur für Betreuer sichtbar, sofern Sie die Veröffentlichung nicht ausdrücklich erlauben. Öffentliche Beiträge werden geprüft. Die Verwendung einer Empfehlung für Marketing benötigt eine zusätzliche Erlaubnis.",
|
||||
"consentCheck": "Ich habe diese Hinweise gelesen und stimme der Teilnahme ausdrücklich zu.",
|
||||
@@ -447,7 +506,19 @@
|
||||
"abandonExplanationUnregistered": "Diese Teilnahme wurde vom Collector nie angenommen, dort ist also nichts gespeichert und es gibt nichts zu löschen. Sie können sie hier verwerfen und jederzeit neu beginnen.",
|
||||
"abandonConfirm": "Installationsidentität, Schlüsselmaterial und alle lokalen Marker werden gelöscht. Der Collector wird nicht benachrichtigt und behält die bisher gesendeten Berichte — die Quittung hält das als unbestätigt fest. Danach ist eine neue Teilnahme wieder möglich.",
|
||||
"abandonConfirmUnregistered": "Installationsidentität, Schlüsselmaterial und alle lokalen Marker werden gelöscht. Der Collector hat diese Teilnahme nie angenommen, es wird also nirgendwo sonst etwas entfernt. Danach ist eine neue Teilnahme wieder möglich.",
|
||||
"auditPreviousParticipation": "Löschbestätigungen beziehen sich auf eine frühere Teilnahme, nicht auf die aktuelle."
|
||||
"auditPreviousParticipation": "Löschbestätigungen beziehen sich auf eine frühere Teilnahme, nicht auf die aktuelle.",
|
||||
"inventoryTitle": "Zwei Bestandszahlen",
|
||||
"inventoryExplanation": "Die Gesamtzahlen beschreiben aktuell gespeicherte Datenbankeinträge, keine Upload-Aktivität oder eindeutigen Dateien. Vorschaubilder und Videos zählen nicht zur Fotoanzahl. Nur diese beiden Zahlen verlassen die Installation.",
|
||||
"inventory": {
|
||||
"galleries": {
|
||||
"name": "Gespeicherte Galerien",
|
||||
"description": "Aktuelle Anzahl gespeicherter Galerien einschließlich Entwürfen, inaktiven und archivierten Galerien. Gelöschte Galerien zählen nicht. Eine Gesamtzahl der Installation, ohne Aufschlüsselung oder Kennungen."
|
||||
},
|
||||
"photos": {
|
||||
"name": "Gespeicherte Fotoeinträge",
|
||||
"description": "Aktuelle Anzahl der Fotoeinträge ohne Videos, einschließlich RAW, Gast-Uploads und Einträgen archivierter Galerien. Eine Gesamtzahl der Installation; keine eindeutigen Dateien, Vorschaubilder, Verarbeitungserfolge oder Fotoinhalte. Gelöschte Einträge zählen nicht."
|
||||
}
|
||||
}
|
||||
},
|
||||
"userManagement": {
|
||||
"title": "Benutzerverwaltung",
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"productUsage": {
|
||||
"fields": "usage.v2 reports contain an installation fingerprint, PicPeak version, UTC report date and generation time, schema/signing metadata, controlled gallery layouts, and 73 fixed capability signals: 56 configured/used pairs and 17 configuration-only booleans. The complete catalog below defines every field. There are no action counts or visitor observations.",
|
||||
"catalogTitle": "Full catalog: all 73 capability signals (usage.v2)",
|
||||
"catalogExplanation": "Configured describes current technical availability or configuration, not popularity. Built-in capabilities are always available. Used is a single installation-wide yes/no bit since consent to the current schema (v1: since joining; v2: since joining or explicit upgrade). Accepted jobs count as initiated, not necessarily finished. Configuration-only capabilities have no used field. No actor, event identifier, action time or frequency is stored in these markers.",
|
||||
"fields": "usage.v3 reports contain an installation fingerprint, PicPeak version, UTC report date and generation time, schema/signing metadata, controlled gallery layouts, 86 fixed capability signals (63 configured/used pairs and 23 configuration-only booleans), and two installation totals: stored galleries and photo records excluding videos. Drafts and archived galleries and their retained photo records are included. The catalog below defines every field. There are no action counts or visitor observations.",
|
||||
"catalogTitle": "Full catalog: 86 capability signals and 2 inventory totals (usage.v3)",
|
||||
"catalogExplanation": "Configured describes current technical availability or configuration. Built-in means available, not used. Used is one installation-wide yes/no bit since consent to the reporting schema; accepted jobs mean initiated, not necessarily completed. Configuration-only capabilities omit used. Inventory contains only current gallery/photo record totals, with no per-gallery breakdown. No actor, entity identifier, action time or frequency is stored in usage markers.",
|
||||
"catalogSearch": "Search capability name or key",
|
||||
"catalogEmpty": "No matching capabilities.",
|
||||
"configuredLabel": "Configured",
|
||||
"usedLabel": "Used",
|
||||
"configurationOnly": "Configuration only — actual use is not collected.",
|
||||
"versionDisclosure": "This consent covers usage.v2 / usage-consent.v2. Existing v1 participants continue sharing only the previous 19 capabilities unless they explicitly upgrade. The same private identity and raw history remain; the local usage-marker observation period restarts when the collector confirms the upgrade. At most one report per UTC day is accepted, so the first v2 report can be on the next active day. New local markers are not recorded before confirmation.",
|
||||
"versionDisclosure": "This consent covers usage.v3 / usage-consent.v3. Existing v1 and v2 participants retain their previous 19 or 73 capabilities without inventory totals until they explicitly upgrade. Identity and raw history remain; local usage markers restart only after the collector confirms the upgrade. At most one report per UTC day is accepted, so the first v3 report may be on the next active day. New markers and totals are not collected before confirmation.",
|
||||
"currentSchema": "Current reporting schema: {{schema}}",
|
||||
"reviewUpgrade": "Review expanded usage.v2 scope",
|
||||
"upgrade": "Explicitly agree to usage.v2",
|
||||
"upgradeExplanation": "Your existing usage.v1 participation is unchanged. Review the complete expanded catalog before deciding whether to upgrade. Declining does not end your current participation.",
|
||||
"upgradePending": "The signed consent upgrade is pending confirmation. Only the existing v1 scope is collected. Retry when the collector is available, or disable participation to stop and delete.",
|
||||
"reviewUpgrade": "Review expanded usage.v3 scope",
|
||||
"upgrade": "Explicitly agree to usage.v3",
|
||||
"upgradeExplanation": "Your existing participation keeps its current scope. Review the expanded catalog and the two inventory totals before deciding whether to upgrade. Declining does not end participation.",
|
||||
"upgradePending": "The signed consent upgrade is pending confirmation. Only the previously accepted scope is collected. Retry when the collector is available, or disable participation to stop and delete.",
|
||||
"catalog": {
|
||||
"crm": {
|
||||
"name": "Client management",
|
||||
@@ -71,7 +71,7 @@
|
||||
"used": "A documented successful authenticated admin capability operation was observed since consent to this schema. No actor, operation history, parameters or counts."
|
||||
},
|
||||
"face_recognition": {
|
||||
"name": "Face recognition",
|
||||
"name": "ML face recognition",
|
||||
"configured": "The faces capability switch is effectively enabled; only a boolean.",
|
||||
"used": "A documented successful authenticated admin capability operation was observed since consent to this schema. No actor, operation history, parameters or counts."
|
||||
},
|
||||
@@ -362,6 +362,65 @@
|
||||
"gallery_expiration": {
|
||||
"name": "Gallery expiration configured",
|
||||
"configured": "At least one gallery has an expiry configured; no dates, gallery IDs or counts."
|
||||
},
|
||||
"photo_xmp_export": {
|
||||
"name": "XMP export",
|
||||
"configured": "Built-in capability is available; this is not evidence of use.",
|
||||
"used": "An admin successfully generated an XMP export; no sidecars, filenames, ratings, selections or counts."
|
||||
},
|
||||
"photo_replacement": {
|
||||
"name": "Photo replacement",
|
||||
"configured": "Built-in capability is available; this is not evidence of use.",
|
||||
"used": "An admin upload actually replaced a photo successfully; no filenames, matching values, IDs or counts."
|
||||
},
|
||||
"photo_admin_marks": {
|
||||
"name": "Photographer marks",
|
||||
"configured": "Built-in capability is available; this is not evidence of use.",
|
||||
"used": "An admin successfully saved their own photo mark; no rating, color, photo or admin identity."
|
||||
},
|
||||
"gallery_folders": {
|
||||
"name": "Gallery folders configured",
|
||||
"configured": "An applicable global or gallery category is configured as a folder; no names, contents, counts or visitor activity."
|
||||
},
|
||||
"transfer_upload_links": {
|
||||
"name": "PicTransfer upload links enabled",
|
||||
"configured": "PicTransfer is enabled and a non-deleted transfer allows unexpired uploads; no links, tokens, dates, recipients or uploads."
|
||||
},
|
||||
"workflow_automation_enabled": {
|
||||
"name": "Workflow automation enabled",
|
||||
"configured": "The workflows module and at least one workflow are enabled; no names, graphs, triggers, decisions or runs."
|
||||
},
|
||||
"s3_auto_import": {
|
||||
"name": "S3 automatic import enabled",
|
||||
"configured": "S3 media storage is configured and STORAGE_AUTO_IMPORT is enabled; no bucket, prefix, credentials, polling or imported objects."
|
||||
},
|
||||
"crm_invoice_import": {
|
||||
"name": "Invoice import",
|
||||
"configured": "The required product capabilities are effectively enabled; only a boolean.",
|
||||
"used": "An admin successfully imported an existing invoice; no PDF, invoice number, amount, currency, customer or payment status."
|
||||
},
|
||||
"crm_combined_billing": {
|
||||
"name": "Combined billing",
|
||||
"configured": "The required product capabilities are effectively enabled; only a boolean.",
|
||||
"used": "An admin successfully created a combined bill; no hours, expenses, customer, documents or financial values."
|
||||
},
|
||||
"crm_monthly_billing_manual": {
|
||||
"name": "Manual monthly billing",
|
||||
"configured": "The required product capabilities are effectively enabled; only a boolean.",
|
||||
"used": "An admin successfully released a monthly draft for delivery; actual email delivery is not measured. No scheduler activity, customer, cadence or invoice values."
|
||||
},
|
||||
"crm_document_conversion": {
|
||||
"name": "Document conversion",
|
||||
"configured": "The required product capabilities are effectively enabled; only a boolean.",
|
||||
"used": "An admin successfully converted a quote or contract into a document or gallery; no content, links, acceptance states or automatic workflows."
|
||||
},
|
||||
"gallery_capture_date_sort": {
|
||||
"name": "Capture-date sorting configured",
|
||||
"configured": "A gallery defaults to sorting by capture date; no capture dates, EXIF or visitor sorting actions."
|
||||
},
|
||||
"download_original_filenames": {
|
||||
"name": "Original download filenames enabled",
|
||||
"configured": "The original-download-filenames switch is enabled; no filenames or downloads are read or sent."
|
||||
}
|
||||
},
|
||||
"auditTitle": "Export and deletion receipts",
|
||||
@@ -384,11 +443,11 @@
|
||||
"sectionVisibility": "Where it is visible",
|
||||
"sectionDeletion": "Leaving and deleting",
|
||||
"sectionFeedback": "Feedback is separate",
|
||||
"excluded": "No gallery visitors, clickstreams, photo or gallery counts, names, emails, domains, filenames, or configuration secrets are included in automatic usage reports.",
|
||||
"excluded": "No visitor activity, clickstreams, per-gallery or per-photo breakdowns, names, emails, domains, filenames, image contents, biometric results, financial values or configuration secrets are included in automatic reports.",
|
||||
"transport": "Your PicPeak backend keeps the signing key and sends signed usage reports to {{collector}} once per UTC day during admin use. Preview reports and download each unique accepted report exactly as first received; transport retries are deduplicated. Rejected attempts and separately submitted feedback are not part of this report export.",
|
||||
"sectionOneWay": "Sending only — no return channel",
|
||||
"oneWay": "PicPeak only sends. It never fetches anything from the collector, never asks it for instructions, and exposes no endpoint the collector could call — there is no scheduled job and no inbound route on this path. From a reply it reads only the acknowledgement for the packet it just sent, and checks every field of that acknowledgement against the packet before accepting it; anything else is discarded. A data export you request yourself is handed to you as a file and is never interpreted or executed. So this channel cannot deliver code, configuration or content into your installation — not even from a collector that has been taken over.",
|
||||
"visibility": "Only participating installations can inspect the feature dataset and aggregate results, including groups of one. The schema and source are public; approved feature requests and testimonials are public only with their authors’ permission. Your fingerprint is pseudonymous, not anonymous. Keep your lookup hash private: it grants read-only access to your own reports and the participant dataset.",
|
||||
"visibility": "Participating installations can inspect the shared dataset of latest feature combinations and inventory totals, including groups of one, and shared aggregate history. Maintainers can inspect and export all retained original reports and private feedback. This does not authorize publication of private feedback. The schema and source are public. Your fingerprint and data are pseudonymous, not anonymous. Keep your lookup hash private: it grants read-only access to your own reports and the participant dataset.",
|
||||
"deletion": "Disabling immediately stops collection and requests deletion of reports, aggregate contributions, feedback, published items, votes and sessions. During an outage, only credentials needed to finish deletion remain and the UI shows deletion pending. After confirmation, the local hash and key are erased; rejoining creates a new identity. The collector retains a one-way revocation digest and short-lived identity-free abuse counters. PicPeak keeps a downloadable local deletion receipt without the old hash, key or payloads.",
|
||||
"feedbackDisclosure": "Feedback is separate from automatic reports and is sent only when you submit it. Each item is anonymous unless you include a name, and private to maintainers unless you explicitly permit publication. Public items require maintainer review. Marketing use of a testimonial requires separate permission.",
|
||||
"consentCheck": "I have read this disclosure and explicitly agree to participate.",
|
||||
@@ -447,7 +506,19 @@
|
||||
"abandonExplanationUnregistered": "This participation was never accepted by the collector, so nothing is stored there and there is nothing to delete. You can discard it here and start again at any time.",
|
||||
"abandonConfirm": "This deletes the installation identity, the key material and every local marker. The collector is not notified and keeps the reports already sent — the receipt records that as unconfirmed. You can join again afterwards.",
|
||||
"abandonConfirmUnregistered": "This deletes the local installation identity, the key material and every local marker. The collector never accepted this participation, so nothing is removed anywhere else. You can join again afterwards.",
|
||||
"auditPreviousParticipation": "Deletion confirmations refer to an earlier participation, not the current one."
|
||||
"auditPreviousParticipation": "Deletion confirmations refer to an earlier participation, not the current one.",
|
||||
"inventoryTitle": "Two inventory totals",
|
||||
"inventoryExplanation": "Totals describe currently stored database records, not upload activity or unique files. Thumbnails and videos are excluded from the photo total. Only these two numbers leave the installation.",
|
||||
"inventory": {
|
||||
"galleries": {
|
||||
"name": "Stored galleries",
|
||||
"description": "Current number of gallery records, including drafts, inactive and archived galleries. Deleted galleries are excluded. One total for the installation, no breakdown or identifiers."
|
||||
},
|
||||
"photos": {
|
||||
"name": "Stored photo records",
|
||||
"description": "Current number of non-video photo records, including RAW, guest uploads and records of archived galleries. One total for the installation; not unique files, thumbnails, processing success or photo contents. Deleted records are excluded."
|
||||
}
|
||||
}
|
||||
},
|
||||
"userManagement": {
|
||||
"title": "User Management",
|
||||
|
||||
@@ -49,12 +49,12 @@ export const productUsageService = {
|
||||
async enable(): Promise<UsageStatus> {
|
||||
return (
|
||||
await api.post('/admin/usage/enable', {
|
||||
consent_version: 'usage-consent.v2'
|
||||
consent_version: 'usage-consent.v3'
|
||||
})
|
||||
).data;
|
||||
},
|
||||
async upgradeConsent(): Promise<{ delivered: boolean; queued: boolean; state: UsageStatus }> {
|
||||
return (await api.post('/admin/usage/consent', { consent_version: 'usage-consent.v2' })).data;
|
||||
return (await api.post('/admin/usage/consent', { consent_version: 'usage-consent.v3' })).data;
|
||||
},
|
||||
async disable(): Promise<UsageStatus> {
|
||||
return (await api.post('/admin/usage/disable')).data;
|
||||
|
||||
Reference in New Issue
Block a user