feat(quick-261009-dkv): Teilen mit Personen und Gruppen - Durchstich, Oberflaeche

- Teilen-Dialog (Suche mit Verzoegerung, Ergebnisliste als Combobox, Berechtigung
  je Zeile aendern, entfernen) auf dem Modul-Dialog, Fehler mit Meldung der Nextcloud
- Menueeintrag Teilen (nur bei Buchstabe R), Freigabe-Kennzeichen in Liste und Raster
  (ausgehend als Knopf, eingehend als Markierung)
- Web-Client, reine Hilfen (Berechtigungsauswahl, Passwort erzeugen), Fehlertexte
  und Meldungen de/en; sharingDisabled traegt scope=groups fuer den Gruppentext

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-09 10:52:35 +02:00
parent 207d37b8d6
commit bf893afc61
19 changed files with 1640 additions and 12 deletions
@@ -222,6 +222,7 @@ describe('NextcloudFilesSharesService — create', () => {
expect(codeOf(e)).toBe('sharingDisabled');
expect(statusOf(e)).toBe(409);
expect(bodyOf(e).message).toBe('Teilen mit Gruppen ist in Ihrer Nextcloud ausgeschaltet.');
expect(bodyOf(e).scope).toBe('groups');
expect(calls.some((c) => c.method === 'POST')).toBe(false);
});
@@ -290,7 +290,7 @@ export class NextcloudFilesSharesService {
const policy = await this.loadPolicy(tenantId, userId, session);
if (!policy.enabled) throw ncErrorDefault('sharingDisabled');
if (input.kind === 'group' && !policy.groupsEnabled) {
throw ncErrorDefault('sharingDisabled', undefined, GROUPS_OFF);
throw ncErrorDefault('sharingDisabled', { scope: 'groups' }, GROUPS_OFF);
}
if (!entry.permissions.includes('R')) throw ncErrorDefault('shareRejected');
if (input.access === 'upload' || (input.access === 'edit' && !this.entryWritable(entry))) {