This commit is contained in:
2026-06-13 10:22:58 -04:00
parent 8c060e6a37
commit 899c624620
2 changed files with 82 additions and 17 deletions

View File

@@ -1,5 +1,5 @@
{ {
"_note": "Sanitized scenario library for scn01. Each entry is an operator/participant-sanitized account, tagged with a single open-vocabulary category. Edited by operator/expert participants over time. Used to populate the browse carousel on /scn01/{association_slug}.", "_note": "Sanitized scenario library for scn01. Each entry is an operator/participant-sanitized account, tagged with a single open-vocabulary category. Sanitization keeps the causal mechanism intact and removes blame, accusation, identity, and retaliation framing. Edited by operator/expert participants over time. Used to populate the browse carousel on /scn01/{association_slug}.",
"scenarios": [ "scenarios": [
{ {
"id": "scn-001", "id": "scn-001",
@@ -8,23 +8,73 @@
}, },
{ {
"id": "scn-002", "id": "scn-002",
"category": "Noise Complaint", "category": "Porch Pirates",
"text": "The same residents across several units have been playing loud music late at night, seemingly on purpose. Complaints have not resulted in any visible action." "text": "A package was left at the wrong door by the delivery driver and was opened by the resident who received it before the mistake was noticed."
}, },
{ {
"id": "scn-003", "id": "scn-003",
"category": "Noise Complaint",
"text": "The same residents across several units have been playing loud music late at night, seemingly on purpose, after repeated requests to stop."
},
{
"id": "scn-004",
"category": "Noise Complaint",
"text": "Construction or repair work in a unit starts well before the hours the rules allow, on a recurring basis."
},
{
"id": "scn-005",
"category": "Towing", "category": "Towing",
"text": "A guest's car was towed overnight from a space marked for guest parking. No warning was posted and no notice was given before the tow." "text": "A guest's car was towed overnight from a space marked for guest parking. No warning was posted and no notice was given before the tow."
}, },
{ {
"id": "scn-004", "id": "scn-006",
"category": "Towing",
"text": "A resident's car, parked in their assigned space, was towed while they were away for an extended period, with no record of why."
},
{
"id": "scn-007",
"category": "Excessive Maintenance Charges", "category": "Excessive Maintenance Charges",
"text": "The lawn is being mowed three times a week, which feels excessive. The frequency was not discussed with homeowners and the cost implications are unclear." "text": "The lawn is being mowed three times a week, which feels excessive. The frequency was not discussed with homeowners and the cost implications are unclear."
}, },
{ {
"id": "scn-005", "id": "scn-008",
"category": "Excessive Maintenance Charges",
"text": "Landscaping crews have cut back bushes so severely that several did not survive, and the cost of replacing them was billed separately."
},
{
"id": "scn-009",
"category": "Surprise Charges", "category": "Surprise Charges",
"text": "A one-time charge appeared on the account for removing a tree that had been dead for years. There was no advance notice that this charge was coming or why it was billed now." "text": "A one-time charge appeared on the account for removing a tree that had been dead for years. There was no advance notice that this charge was coming or why it was billed now."
},
{
"id": "scn-010",
"category": "Surprise Charges",
"text": "A special assessment appeared on a statement with no explanation of what it covers or when it was approved."
},
{
"id": "scn-011",
"category": "Broken Window",
"text": "A window was broken by a soccer ball from the neighboring apartments' field. The ball was kept temporarily as leverage to get the window fixed, then returned after the situation escalated."
},
{
"id": "scn-012",
"category": "Broken Window",
"text": "A common-area window has been broken more than once, always overnight, with no one identified as responsible either time."
},
{
"id": "scn-013",
"category": "Broken Window",
"text": "A window was broken during an incident between two homeowners, witnessed by a third resident who is not willing to provide further detail."
},
{
"id": "scn-014",
"category": "Broken Window",
"text": "Children in the community have been putting gravel inside snowballs and throwing them at windows \u2014 no window has broken yet, but the pattern makes it likely one will."
},
{
"id": "scn-015",
"category": "Suspected Squatters",
"text": "A unit that's supposed to be vacant shows signs of occupancy \u2014 lights at odd hours, unfamiliar cars \u2014 with no record of who is staying there or for how long."
} }
] ]
} }

View File

@@ -72,17 +72,21 @@ function scn01_render_landing($association_slug, $access) {
. json_encode(['scenarios' => $scenarios], JSON_UNESCAPED_SLASHES) . json_encode(['scenarios' => $scenarios], JSON_UNESCAPED_SLASHES)
. '</script>'; . '</script>';
// Pinned strip — populated client-side if ($access === 'public') {
$out .= '<div id="scn01-pinned" class="scn01-pinned" aria-label="Pinned scenarios"></div>'; // Public — show carousel + pinned strip read-only (no form)
$out .= '<div class="scn01-narrative">';
$out .= '<label for="scn01_narrative"><strong>Describe your situation</strong></label>';
$out .= '<textarea id="scn01_narrative" class="form-control" rows="6" placeholder="In your own words, describe what happened." disabled></textarea>';
$out .= '</div>';
// Carousel — populated client-side $out .= '<div class="scn01-carousel mt-3">';
$out .= '<div class="scn01-carousel">';
$out .= '<button type="button" id="scn01-prev" class="btn btn-sm btn-outline-secondary" aria-label="Previous scenario">&larr;</button>'; $out .= '<button type="button" id="scn01-prev" class="btn btn-sm btn-outline-secondary" aria-label="Previous scenario">&larr;</button>';
$out .= '<div id="scn01-card" class="scn01-card"></div>'; $out .= '<div id="scn01-card" class="scn01-card"></div>';
$out .= '<button type="button" id="scn01-next" class="btn btn-sm btn-outline-secondary" aria-label="Next scenario">&rarr;</button>'; $out .= '<button type="button" id="scn01-next" class="btn btn-sm btn-outline-secondary" aria-label="Next scenario">&rarr;</button>';
$out .= '</div>'; $out .= '</div>';
if ($access === 'public') { $out .= '<div id="scn01-pinned" class="scn01-pinned" aria-label="Pinned scenarios"></div>';
$out .= '<div class="alert alert-info mt-3">'; $out .= '<div class="alert alert-info mt-3">';
$out .= 'Scenarios are public. '; $out .= 'Scenarios are public. ';
$out .= '<a href="https://directory.diagnostics.kane-il.us/channel/theron">Complete the SASE process</a> '; $out .= '<a href="https://directory.diagnostics.kane-il.us/channel/theron">Complete the SASE process</a> ';
@@ -94,15 +98,26 @@ function scn01_render_landing($association_slug, $access) {
$form_url = z_root() . '/scn01/' . scn01_h($association_slug); $form_url = z_root() . '/scn01/' . scn01_h($association_slug);
$out .= '<form method="post" action="' . $form_url . '" id="scn01-form" class="scn01-form mt-3" novalidate>'; $out .= '<form method="post" action="' . $form_url . '" id="scn01-form" class="scn01-form" novalidate>';
$out .= scn01_csrf_token(); $out .= scn01_csrf_token();
$out .= '<div id="scn01-pinned-fields"></div>';
// Narrative textarea — above the carousel
$out .= '<div class="scn01-narrative">'; $out .= '<div class="scn01-narrative">';
$out .= '<label for="scn01_narrative"><strong>Describe your situation</strong></label>'; $out .= '<label for="scn01_narrative"><strong>Describe your situation</strong></label>';
$out .= '<textarea id="scn01_narrative" name="narrative" class="form-control" rows="6" placeholder="In your own words, describe what happened."></textarea>'; $out .= '<textarea id="scn01_narrative" name="narrative" class="form-control" rows="6" placeholder="In your own words, describe what happened."></textarea>';
$out .= '</div>'; $out .= '</div>';
// Carousel
$out .= '<div class="scn01-carousel mt-3">';
$out .= '<button type="button" id="scn01-prev" class="btn btn-sm btn-outline-secondary" aria-label="Previous scenario">&larr;</button>';
$out .= '<div id="scn01-card" class="scn01-card"></div>';
$out .= '<button type="button" id="scn01-next" class="btn btn-sm btn-outline-secondary" aria-label="Next scenario">&rarr;</button>';
$out .= '</div>';
// Pinned strip — stacked below the carousel
$out .= '<div id="scn01-pinned" class="scn01-pinned" aria-label="Pinned scenarios"></div>';
$out .= '<div id="scn01-pinned-fields"></div>';
$out .= '<div class="alert alert-warning mt-2 small">'; $out .= '<div class="alert alert-warning mt-2 small">';
$out .= 'Once submitted, this record cannot be edited. If you want to add more later, you will need to submit a new record.'; $out .= 'Once submitted, this record cannot be edited. If you want to add more later, you will need to submit a new record.';
$out .= '</div>'; $out .= '</div>';