Submissions: labeled actions + real appeal-driven unblock

Make each admin action self-explanatory and give content appeals a real
effect instead of a dead-end "Dismiss".

- submissionsSection.js: per-type action sets, each button paired with a
  one-line description. Applications show Approve (adds to whitelist) / Deny;
  appeals that name a real event show "Approve & unblock" (removes the video
  from the event block list) / "Keep blocked"; other types show "Mark handled".
- submissionService.js: parse an appeal's `e` tag into targetEventId (trusted
  only when it's a well-formed 64-char hex id).
- iframe-content-appeals-form.html: add a required "Blocked video link or
  event ID" field; regex-validate + normalize a share link / nevent / note /
  hex to the hex event id, tag it as `e`, and include it in the body. Block
  submission when no valid reference is provided.
- CSS: stacked action + hint styling; iframe-form .form-hint.
- tests: cover targetEventId parsing (valid, malformed, absent).

Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
thePR0M3TH3ANandClaude Opus 4.8 committed 2026-07-07 09:52:04 -04:00
1 parent ef4191538c
commit 2803f6b56f
5 files changed
+263 -21

No files matched your search

+24 -1
View File
@@ -3231,7 +3231,24 @@
.submission-card__actions {
display: flex;
gap: var(--space-2xs);
flex-wrap: wrap;
gap: var(--space-sm);
align-items: flex-start;
}
/* Each action pairs its button with a one-line description so a moderator
knows exactly what the control does before clicking. */
.submission-card__action {
display: flex;
flex-direction: column;
gap: var(--space-3xs);
min-inline-size: 0;
}
.submission-card__action-hint {
font-size: var(--font-size-2xs);
color: var(--color-text-muted);
max-inline-size: 22ch;
}
/* #43: always-visible active-identity pill. Rendered after the header in
@@ -4531,6 +4548,12 @@
margin-top: var(--space-xs);
}
body.iframe-form .form-hint {
margin-top: var(--space-xs);
font-size: var(--font-size-2xs);
color: var(--color-text-muted);
}
body.iframe-form .checkbox-group,
body.iframe-form .radio-group {
display: flex;