Skip to content

Merge master (v13 production line) into hotfix-1.16.12 - #274

Merged
stphnlee merged 191 commits into
hotfix-1.16.12from
merge/master-into-16.12
Jul 21, 2026
Merged

Merge master (v13 production line) into hotfix-1.16.12#274
stphnlee merged 191 commits into
hotfix-1.16.12from
merge/master-into-16.12

Conversation

@stphnlee

Copy link
Copy Markdown
Contributor

Summary

Brings all master commits since the last sync (merge-base 904a15ac, Feb 2026 — 184 commits, ~160 files) into the 1.16.12 upgrade branch, then ports the incoming v13-era code to Rock 1.16.12.

Three commits, reviewable independently:

  1. 20351cc9 Merge master into hotfix-1.16.12 — the merge itself, 7 conflicts resolved
  2. 7a13cbe2 Fix v16 compile errors — minimal changes to make merged code build
  3. 174e772b Update merged code off obsolete v13 APIs — RockJob + SystemPhoneNumber conversions

Conflict resolutions (commit 1)

File Resolution
org.secc.Attributes.csproj Kept hotfix DLL-reference style; master's new MultiFileUpload/MultiFileFieldType compile items kept; master's v13 ProjectReferences converted to RockWeb\Bin DLL refs
org.secc.GroupTrackerDemo/* Master deleted the plugin — deletion accepted, removed from Rock.sln
PDFFormMerge.cs Kept hotfix's iText9 testable-helper structure; ported master's ROCK-8373 null checks/error messages into the helpers
org.secc.SmsCapture.csproj New plugin from master, taken wholesale then ported (commit 2)
org.secc.Workflow.csproj / packages.config Kept hotfix package set (IdentityModel 5.5.0, Newtonsoft 13); master's 3 new workflow-action compile items kept

Also: orphaned Equip/Widgities READMEs removed; FFmpeg/ImageMontage stayed deleted (removed on both branches independently).

v16 porting (commits 2–3)

  • Semantic merge conflict: ResetGroupLocationSchedules.cs — master's early-exit referenced the Quartz context param that hotfix's RockJob conversion removed; now uses RockJob.Result
  • 4 new jobs converted Quartz IJobRockJob (ROCK-7971/8669 pattern): DisableCommunicationsForInactivePeople, RestoreCommunicationsForReactivatedPeople, ReEncryptAttributeValues, CampPlacementImportBackgroundJob
  • SmsCapture transport converted to SystemPhoneNumber APIs (FromNumber/SMSFromDefinedValueFromSystemPhoneNumber/SmsFromSystemPhoneNumber)

⚠️ Behavioral changes for human review

  1. CampPlacementImportBackgroundJob: RunId was Quartz trigger data (MergedJobDataMap); it is now a job attribute — anyone running this job manually must set the Run Id attribute first. The CampPlacementImport block itself is unaffected (it calls CampPlacementImportRunner.Run() directly).
  2. SmsCapture transport now requires the From number to exist as a System Phone Number (v15+ model) rather than a Defined Value.
  3. Rock.sln (secc/Rock fork, not this repo): GroupTrackerDemo project removed, org.secc.SmsCapture added — needs a separate commit in the Rock fork.

Verification

  • All 21 affected plugin projects build clean against Rock 1.16.12 binaries (zero errors)
  • Zero CS0612/CS0618 obsolete warnings remain in the ~73 merged code files
  • org.secc.Test xunit suite passes

🤖 Generated with Claude Code

stphnlee and others added 30 commits February 24, 2026 14:07
* ROCK-8322 Fixing issue with auto-input from iOS

* ROCK-8322 Reduced timeout and add enter on submit for phone number

* ROCK-8322 Updated enter submission to format phone number

* ROCK-8322 Add aria announcement for screenreaders on auto submit
…, disable schedule fields when CustomSchedule is set

- Add StartDate (from Group.Schedule.EffectiveStartDate) and CustomSchedule (from Group.Schedule.FriendlyScheduleText) to the field copy-over when a new PublishGroup is created
- Disable Day of Week and Time of Day dropdowns on the form when CustomSchedule has a value, since ScheduleText prioritizes CustomSchedule
…ame is empty

Falls back to Location.ToString() (full street address) when the
location has no name set, fixing empty MeetingLocation on PublishGroups.
…al; added trim to groupnameprefix; updated logic for finding other matching placement groups to include groups attached to the template
Placement Group Sync Workflow Action
- Schedule fields (Time of Day, Custom Schedule, Starts On) now always
  pull from Group.Schedule and are disabled on the PublishGroup form
- Day of Week also pulls from Group when weekly, but stays editable
  when the Group has a custom schedule (for filtering on group list page)
- CustomSchedule only populated at creation when WeeklyDayOfWeek is null
- Updated help text on Day of Week and Custom Schedule info icons
…re not linked directly to the registration instance
Add logic for leader registrations
Add bulk distribute, manage medications modal, and add medication sub-modal to the MedicationDispense block.
[DRAFT] ROCK-8328: Medication Manager Updates
…ck is running before returning that the server is healthy
…Health.ascx.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…Health.ascx.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…Health.ascx.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…n publish groups

- Add FormatScheduleDates() to convert RDATE schedules into readable date lists
  (e.g., "Tuesdays at 6:30 PM: Aug 5, Aug 19, Sep 2...")
- Replace FriendlyScheduleText and iCalendarContent references with FormatScheduleDates
- Apply .SanitizeHtml() on save to strip any remaining HTML from CustomSchedule
- Add | StripHtml in GroupFinder Lava templates as defense-in-depth
- Fix NullReferenceException in OnInit when publishGroup is null
…n publish groups

- Add FormatScheduleDates() to convert RDATE schedules into readable date lists
  (e.g., "Tuesdays at 6:30 PM: Aug 5, Aug 19, Sep 2...")
- Replace FriendlyScheduleText and iCalendarContent references with FormatScheduleDates
- Apply .SanitizeHtml() on save to strip any remaining HTML from CustomSchedule
- Add | StripHtml in GroupFinder Lava templates as defense-in-depth
- Fix NullReferenceException in OnInit when publishGroup is null
…rom volunteer application

Remove the validation that blocks volunteer applications when a reference is a
Southeast Christian Church staff member. The Staff checkbox is kept on the form
for data collection but no longer prevents submission. Also removes the Current
Employer section (CurrentEmployer, PositionHeld, WorkPhone) from the PDF merge
and removes WorkPhone validation from personal information.
Show first 3 dates + last date for schedules with 5+ specific dates
to prevent overly long Custom Schedule text (e.g., "Tuesdays at 6:30 PM: Aug 5, Aug 19, Sep 2, ... Dec 2")
…nitization

ROCK-8362: Sanitize CustomSchedule
…s.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
ROCK-8422 Optimized job to reduce webfarm messages
jwakefield-secc and others added 19 commits July 9, 2026 17:00
…m form

Stakeholder-approved change to the signup birthday rule:
- A matched person's existing on-file birthday is now PRESERVED (never
  overwritten from the signup form); the age check evaluates it as-is.
- Only fill BirthDate from the form (bpBirthdate) when the person has none
  on file — brand-new person, or matched person whose BirthDate is null —
  as a fallback so the age check has a value.
- Guard changed from 'SelectedDate != person.BirthDate' to
  '!person.BirthDate.HasValue'; the pre-evaluation SaveChanges persists a
  newly-filled fallback birthday so PersonMeetsGroupRequirements reads it.

Shared-block behavior change: applies to ALL signups through this block
(Meal Packers, etc.), not just specialty. Accepted tradeoff (stakeholder):
the gate trusts the on-file birthday even if it is wrong.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This block is shared across ~30+ signup instances, so an unconditional
gate would wrongly hard-block opportunities that only intend to pass their
Group Requirements through onto the connection request.

- New [TextField] block setting 'Signup-Blocking Requirement Types'
  (key SignupBlockingRequirementTypes, order 15), declared in the same
  style as the existing UrlKeys/FormKeys settings.
- Parse the setting (split on comma, Trim, drop blanks). Empty => skip the
  gate entirely, so every other instance is unaffected by default and its
  requirements still pass through onto the connection request.
- Gate now blocks only when GroupRequirementType.Name is in the configured
  allowlist (case-insensitive) AND RequirementCheckType != Manual AND
  (NotMet OR Error). Dropped the MustMeetRequirementToAddMember filter — the
  explicit name allowlist is the intent control now; kept the non-Manual
  guard so a mistakenly-listed Manual type can't blanket-block new signups.

Specialty instance must set the value to 'Over 18 Years Old, Over 14 Years
Old' (config/recipe, not code). Name-match means renaming a requirement type
requires updating the setting — same tradeoff as UrlKeys/FormKeys.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ze it

UX tweaks to the signup requirement gate (message location + wording only;
gate logic, birthday rule, setting, and commit-before-evaluate unchanged):

- .ascx: add <asp:Literal ID="lRequirementBlockMessage"> inside pnlSignup,
  just above the actions div, so the error shows directly above the Connect
  buttons instead of at the top of the block.
- Render the block message on lRequirementBlockMessage instead of
  lResponseMessage (top literal stays reserved for the normal connect
  response flow).
- Personalize: "[NickName] isn't eligible for the [Role] role — [reason]."
  Name = person.NickName (fallback FirstName); role resolved via
  GroupTypeRoleService (fallback "this role"); reason = requirement type's
  Negative Label (fallback Name). Multiple failing requirements lead with
  "... isn't eligible for the [Role] role:" then a <br/>-joined list.
- Fail-closed evaluation-error message stays generic and renders in the same
  spot: "We couldn't verify [Name]'s eligibility for this role...".

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The Fix B guest-count stitch loop used an inline out-variable declaration
(`out int guestCount`), a C# 7 feature. RockWeb compiles plugin .ascx.cs
code-behind at runtime under C# 6, which rejects it (CS8059: "Feature 'out
variable declaration' is not available in C# 6"), so the block failed to
load. Declare guestCount before the loop and pass `out guestCount`.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Fix A built activeGroupIds/activeLocationIds/activeScheduleIds as HashSet<int>
and used .Contains() inside the EF6 IQueryable. EF6 translates List<T>.Contains
to SQL IN but does NOT reliably translate HashSet<T>.Contains (throws
NotSupportedException at query execution — a runtime page-load failure, not a
compile error). Materialize the three to List<int> before the query (dedup is
still done by the HashSet build). Consistent with the List used for employeeIds
in Fix C. The activeTriples HashSet is unaffected — it's used after ToList()
(in-memory LINQ), not translated to SQL.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copilot follow-up: the eligibility-block message builds an alert-danger HTML
string with data-derived values interpolated in. HTML-encode each so a name,
role name, or requirement label containing &, ', or < can't break the markup:
- registrant name (person.NickName / FirstName) — covers both the not-met
  message and the fail-closed catch message,
- the resolved role name,
- each requirement label (NegativeLabel / Name) in the blocking-messages list.

Uses Rock's null-safe .EncodeHtml() string extension (in scope via using
Rock;, already used elsewhere in this file); no using System.Web added.
Literal markup in the format strings (div wrapper, <br />) is left un-encoded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…op, note nothing submitted

Fix A (DOB re-entry trap): a birthday filled from the form this request was
committed by the pre-loop SaveChanges, so on a blocked submit a typo'd birth
year stuck (!person.BirthDate.HasValue was false on resubmit). Track whether
we filled BirthDate from the form this request (new-person SetBirthDate path;
matched-person fallback fill) and, on any blocking exit (not-met and the
fail-closed catch), revert it to null so a corrected resubmit re-reads the
form value. Revert runs on a SEPARATE RockContext (RevertFormBirthDate) so it
commits only the birthday clear — never the ConnectionRequests added earlier
in a multi-role loop on the main context, keeping a blocked submit
all-or-nothing. An existing on-file birthday is never reverted.

Fix B: clear lRequirementBlockMessage (Text/Visible) at the very top of
btnConnect_Click so a stale block message can't linger via ViewState on
'Connect and Add Another'. Done at the handler top, not in the gate (the gate
is skipped entirely when the setting is blank).

Fix C: append 'No signup was submitted.' to the single-, multi-requirement,
and fail-closed messages so it's clear the whole submit was cancelled.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ROCK-8790: Gate Specialty Roles Evaluate Group Requirements at Signup
…ate (#264)

Rock core's AttendanceService.AddOrUpdate returns the existing tracked
attendance when one exists for the same person + occurrence. The extra
attendanceService.Add() flipped that entity to Added, so EF inserted a
duplicate row and dropped the update closing the old attendance, leaving
two active attendances (double check-in).

- SaveAttendance.cs: remove the redundant Add (AddOrUpdate already adds
  new records); existing records now update in place.
- DataHelper.cs (RoomScanner): comment only. The identical-looking Add in
  CloneAttendance is intentional clone-by-readd and must not be removed.
* ROCK-8801 Rework MCRValidForKiosk to validate against persisted attendance data

QuickCheckin crashed with a NullReferenceException in MCRValidForKiosk when a
mobile-reserved room was closed (its GroupLocationSchedule detached) between the
reservation and the family's arrival at the kiosk. The occurrence could no longer
be resolved from OccurrenceCache, so occurrence.GroupTypeId threw and took down the
whole kiosk page.

Validate the reservation directly from the persisted Attendance -> Occurrence ->
Group records instead of OccurrenceCache. This matches the completion path
(btnCompleteMCRActual_Click), which already works off the attendance records and
never touches the cache, so a closed room no longer blocks or crashes check-in and
the family completes their original reservation without losing their spot.

* ROCK-8801 Add missing System.Data.Entity using for AsNoTracking

* ROCK-8801 Address review feedback on MCRValidForKiosk

- Collapse validation to a single SQL-side Any() query and skip the
  DB round-trip entirely when the kiosk has no group types configured
- Trim the rationale comment to the essentials
- Document mobile-reservation validation behavior and the room-closure
  edge case in the FamilyCheckin README

* Fix README Last updated formatting to match repo convention

* Update formatting

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
ROCK-8706 follow-up: remove the three LoadHosts hot operators (guest counts, occurrence N+1, employee scan)
)

* ROCK-8856 Event Pass: add Include Family Registrations option

When enabled, the block expands the pass to include registrants from
other registrations in the same registration instance made by members
of the registrar's family, deduped by person. Defaults to off so
existing event passes are unchanged. Supports camps where each child
is registered individually but families expect one swipeable pass.

* ROCK-8856 Event Pass: hide carousel arrows when only one pass

* ROCK-8856 Event Pass: key registration grouping to the logged-in viewer

Replaces the registrar-family expansion with a viewer-keyed model:
anonymous visitors see exactly what the Registration/Registrant guid
names, and a logged-in viewer also sees registrants from other
registrations in the same registration instance made by the viewer or
their family. This removes the access-widening where one registrant
guid could unlock other people's pass QR codes (person-level check-in
credentials), plus:

- waitlist filter applies before anchoring, so a waitlist-only link
  stays "Pass Not Found" instead of rendering family passes
- registrants without a person alias are excluded (previously crashed
  the page in the per-registrant loop / DataBind)
- null-registrar registrations no longer throw during anchor
  materialization (Registration.PersonAliasId is nullable)
- a ?Registrant= deep link orders that registrant first, so the
  carousel opens on the requested pass
- one pass per person via order-preserving DistinctBy
- per-registrant PersonSearchKey N+1 replaced with one batched query
  with a deterministic lowest-Id winner
- block setting renamed to "Include Registrar's Registrations"
  (IncludeRegistrarRegistrations); environments that deployed the
  earlier branch build should delete the orphaned
  IncludeFamilyRegistrations attribute and re-enable the new setting

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ROCK-8856 Event Pass: collapse registrar expansion into one parameterized query

Review cleanup on PR #267:
- Single registrant query replaces the anchor/family/main round trips;
  eligibility filters (person alias, waitlist) now exist in one place.
- Family membership and anchor checks compose as EXISTS/subqueries instead
  of literal IN lists, so every request reuses one cached SQL plan.
- Anchor rows outrank expansion rows in the sort, so DistinctBy keeps the
  linked registration's row when a person appears on multiple registrations.
- Fix malformed location icon markup in the pass template.

Verified with an offline parity harness against the pre-cleanup pipeline:
9 link/viewer/waitlist cases return identical person sets, plus dup-survivor
assertions for both link types.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ROCK-8856 Event Pass: avoid C# 7 out-var; RockWeb compiles blocks as C# 6

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Expose the pledge term and second-year giving total to the MOVE giving
statement Lava so the 1-year vs 2-year commitment conditional resolves
correctly. These are mapped from the [_org_secc_Commitment_GetTotalsByPersonId]
stored proc result columns of the same name.
Record the MoveSummary merge object and its fields (including the new
PledgeDuration and SecondYearAmountGiven) and the 1-year vs 2-year
commitment statement behavior, per repo README-sync guideline. Adds a
Last updated line.
Add PledgeDuration and SecondYearAmountGiven to MoveCommitmentSummary
Brings 184 master (v13 production line) commits since merge-base 904a15a
into the 1.16.12 upgrade line.

Conflict resolutions:
- org.secc.Attributes.csproj: kept hotfix DLL-reference style; master's new
  compile items (MultiFileUpload, MultiFileFieldType) auto-merged; dropped
  master's v13-style ProjectReferences (no direct DotLiquid/Lava usage)
- org.secc.GroupTrackerDemo: accepted master's deletion of the plugin
- PDFFormMerge.cs: kept hotfix iText9 testable-helper structure, ported
  master's ROCK-8373 null checks and error messages into the helpers
- org.secc.SmsCapture.csproj: took master's version (new plugin; needs
  v16 port in follow-up commits)
- org.secc.Workflow.csproj/packages.config: kept hotfix package set
  (IdentityModel 5.5.0, Newtonsoft 13); master's new workflow action
  compile items auto-merged

Also removed orphaned READMEs for plugins deleted on hotfix (Equip,
Widgities).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- ResetGroupLocationSchedules: master's early-exit referenced the removed
  Quartz context param; use RockJob.Result instead (semantic merge conflict
  between master's ROCK-8706-era change and hotfix's RockJob conversion)
- org.secc.Attributes: MultiFileFieldType needs DotLiquid and
  Rock.Lava.Shared; added as RockWeb\Bin DLL references per hotfix
  convention
- org.secc.SmsCapture: ported new plugin to 1.16.12 - converted Rock
  project references to RockWeb\Bin DLL references, added Rock.Enums
  (enums moved assemblies in v15), upgraded Newtonsoft 11 -> 13

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Jobs (Quartz IJob -> Rock.Jobs.RockJob, per ROCK-7971/ROCK-8669 pattern):
- DisableCommunicationsForInactivePeople
- RestoreCommunicationsForReactivatedPeople
- ReEncryptAttributeValues (also context.UpdateLastStatusMessage -> RockJob's)
- CampPlacementImportBackgroundJob (RunId now a job attribute instead of
  Quartz JobDataMap trigger data - set the Run Id attribute before running)

SmsCapture transport (DefinedValue SMS numbers -> SystemPhoneNumber, v15+):
- RockSMSMessage.FromNumber -> FromSystemPhoneNumber
- CreateSMSCommunicationArgs.FromPhone -> FromSystemPhoneNumber
- Communication.SMSFromDefinedValue -> SmsFromSystemPhoneNumber
- MergeFields.AddOrIgnore -> TryAdd

All merged files now build with zero CS0612/CS0618 warnings.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 18, 2026 13:17

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Syncs the master (Rock v13 production line) changes into the hotfix-1.16.12 upgrade branch and ports the merged code to Rock 1.16.12 APIs across many SECC plugins (jobs, workflows, REST endpoints, themes, and supporting utilities).

Changes:

  • Adds/ports multiple workflow actions, jobs, and supporting models/services to align with Rock 1.16.12 (e.g., RockJob conversions, System Phone Number APIs, connection-request actions).
  • Introduces new DEV-only org.secc.SmsCapture transport plugin plus inbox UI for capturing outbound SMS into a table.
  • Hardens several web blocks/endpoints with authorization and HTML-encoding fixes; updates theme Lava/SCSS and multiple plugin READMEs.

Reviewed changes

Copilot reviewed 152 out of 153 changed files in this pull request and generated no comments.

Show a summary per file
File Description
Plugins/org.secc.Workflow/org.secc.Workflow.csproj Includes newly added workflow action source files in the build.
Plugins/org.secc.Workflow/Connections/SetConnectionRequestGroup.cs Adds workflow action to set connection request assigned group/role/status.
Plugins/org.secc.Workflow/Connections/SetConnectionAttributeValue.cs Adds workflow action to set assigned group member attribute values on a connection request.
Plugins/org.secc.Themes/Themes/SECC2024/Styles/_lib/_events.scss Adds scoped CSS rule to cap event promo image height.
Plugins/org.secc.Themes/Themes/SECC2024/Assets/Lava/Sermons/SermonPodcast.lava Updates podcast editor/owner email values.
Plugins/org.secc.Themes/Themes/SECC2024/Assets/Lava/Groups/GroupFinder.lava Sanitizes custom schedule display by stripping HTML.
Plugins/org.secc.Themes/Themes/SECC2019Portal/Assets/Lava/Site/PrimaryHeaderNav.lava Updates search trigger markup/styling and adds aria-label.
Plugins/org.secc.Themes/Themes/SECC2019/Assets/Lava/Groups/GroupFinder.lava Sanitizes custom schedule display by stripping HTML.
Plugins/org.secc.SystemsMonitor/org_secc/SystemsMonitor/ServerHealth.ascx.cs Adds server health block code-behind with maintenance-flag check and HTTP status signaling.
Plugins/org.secc.SystemsMonitor/org_secc/SystemsMonitor/ServerHealth.ascx Adds server health block markup.
Plugins/org.secc.SmsCapture/README.md Documents the DEV-only SMS Capture transport and manual wiring steps.
Plugins/org.secc.SmsCapture/Properties/AssemblyInfo.cs Adds assembly metadata for the new SmsCapture plugin.
Plugins/org.secc.SmsCapture/packages.config Adds NuGet package references for SmsCapture.
Plugins/org.secc.SmsCapture/org.secc.SmsCapture.csproj Defines the SmsCapture project, references, compile items, and post-build deployment copies.
Plugins/org.secc.SmsCapture/org_secc/SmsCapture/SmsCaptureInbox.ascx Adds the SMS Capture Inbox block UI markup.
Plugins/org.secc.SmsCapture/Model/CapturedSmsService.cs Adds service class for CapturedSms entity.
Plugins/org.secc.SmsCapture/Model/CapturedSms.cs Adds CapturedSms entity + EF configuration.
Plugins/org.secc.SmsCapture/Migrations/Configuration.cs Adds EF migration configuration (disabled automatic migrations).
Plugins/org.secc.SmsCapture/Migrations/001_Init.cs Adds Rock plugin migration to create capture table/indexes/FKs.
Plugins/org.secc.SmsCapture/Data/SmsCaptureDataService.cs Adds base service wrapper for SmsCapture entity services.
Plugins/org.secc.SmsCapture/Data/SmsCaptureContext.cs Adds DbContext for SmsCapture entity set and model configuration.
Plugins/org.secc.SmsCapture/app.config Adds EF config/binding redirect for the SmsCapture project.
Plugins/org.secc.SignNowWorkflow/README.md Adds/updates documentation for SignNow workflow actions plugin.
Plugins/org.secc.Search/README.md Adds/updates documentation for search components and related blocks.
Plugins/org.secc.Sass/README.md Adds/updates documentation for the SASS compilation plugin.
Plugins/org.secc.SafetyAndSecurity/Workflows/VolunteerApplicationValidation.cs Removes staff/work-phone validation branches in volunteer application validation.
Plugins/org.secc.SafetyAndSecurity/Workflows/VolunteerApplicationMerge.cs Removes employer/position/work-phone merge fields.
Plugins/org.secc.SafetyAndSecurity/Workflows/ReferenceValidation.cs Removes staff/minor relationship validation logic.
Plugins/org.secc.RoomScanner/Utilities/DataHelper.cs Documents intentional EF Add behavior for cloning attendance rows.
Plugins/org.secc.Rest/Models/GroupAppGroupMember.cs Adds IsMinor field to group member DTO.
Plugins/org.secc.Rest/Controllers/GroupAppGroupMembersController.Partial.cs Adds minor detection and parent-CC policy; tightens member/group scoping.
Plugins/org.secc.Rest/Controllers/GroupAppAttendanceController.Partial.cs Tightens group-member scoping and attendance matching/creation logic; fixes PrimaryAlias null risk.
Plugins/org.secc.Reporting/org.secc.Reporting.csproj Includes new reporting migration source file.
Plugins/org.secc.Reporting/org_secc/Reporting/NextGen/MedicationInformation.ascx.cs Filters inactive medication matrix items before rendering Lava/grid.
Plugins/org.secc.Reporting/org_secc/Reporting/DecisionAnalytics.ascx.cs Fixes parent email binding to use ParentEmail.
Plugins/org.secc.Reporting/org_secc/Reporting/DecisionAnalytics.ascx Adds profile-link icon column to the results grid.
Plugins/org.secc.Reporting/Model/DecisionReportItem.cs Adjusts minor phone display fallback logic.
Plugins/org.secc.RecurringCommunications/README.md Adds/updates documentation for recurring communications plugin.
Plugins/org.secc.QRManager/README.md Adds/updates documentation for QR Manager plugin.
Plugins/org.secc.Purchasing/org_secc/Purchasing/RequisitionDetail.ascx.cs Adds object-level authorization checks and HTML-encoding in purchasing requisition detail.
Plugins/org.secc.Purchasing/org_secc/Purchasing/PODetail.ascx.cs Adds HTML-encoding/attribute-encoding and safer vendor URL handling; decodes when persisting.
Plugins/org.secc.PersonMatch/README.md Adds/updates documentation for PersonMatch library plugin.
Plugins/org.secc.PDF/Workflows/PDFFormMerge.cs Adds stronger null/empty checks and more defensive PDF merge behavior.
Plugins/org.secc.PastoralCare/README.md Adds/updates documentation for PastoralCare plugin.
Plugins/org.secc.Migrations/README.md Adds/updates documentation for migrations assembly.
Plugins/org.secc.Microframe/README.md Adds/updates documentation for Microframe plugin.
Plugins/org.secc.MetricsDigest/README.md Adds/updates documentation for MetricsDigest job plugin.
Plugins/org.secc.LessInclude/README.md Adds/updates documentation for LessInclude plugin.
Plugins/org.secc.Jobs/org.secc.Jobs.csproj Includes newly added job/migration/model sources in jobs project.
Plugins/org.secc.Jobs/Migrations/002_CampPlacementImportRun.cs Adds migration creating camp placement import run tracking table with FK/index.
Plugins/org.secc.Jobs/GroupLeaderMedicationNotifications.cs Excludes inactive medications from leader notification counts.
Plugins/org.secc.Jobs/Event/CampPlacementImportModels.cs Adds models for camp placement import request and polling record.
Plugins/org.secc.Jobs/Event/CampPlacementImportBackgroundJob.cs Adds RockJob wrapper for running camp placement import by RunId attribute.
Plugins/org.secc.Imaging/Rest/ImagingController.Partial.cs Secures imaging endpoints with authentication/authorization attributes.
Plugins/org.secc.GroupTrackerDemo/Properties/AssemblyInfo.cs Removes GroupTrackerDemo assembly info (plugin deleted).
Plugins/org.secc.GroupTrackerDemo/packages.config Removes GroupTrackerDemo NuGet config (plugin deleted).
Plugins/org.secc.GroupTrackerDemo/Models/GroupWithOccurrence.cs Removes GroupTrackerDemo model (plugin deleted).
Plugins/org.secc.GroupTrackerDemo/Models/GroupSummary.cs Removes GroupTrackerDemo model (plugin deleted).
Plugins/org.secc.GroupTrackerDemo/Models/GroupMemberWithAttendance.cs Removes GroupTrackerDemo model (plugin deleted).
Plugins/org.secc.GroupManager/org_secc/GroupManager/PublishGroupRequest.ascx.cs Uses group schedule as source of truth; improves schedule formatting and sanitization.
Plugins/org.secc.GroupManager/org_secc/GroupManager/PublishGroupRequest.ascx Updates help text and makes Custom Schedule explicitly read-only/pulled from group schedule.
Plugins/org.secc.GroupManager/org_secc/GroupManager/PersonalGroupInformationPanel.ascx.cs HTML-encodes member note output to prevent injection.
Plugins/org.secc.GroupManager/org_secc/GroupManager/LWYARoster.ascx.cs Simplifies from-email configuration to a fixed block attribute; updates send logic.
Plugins/org.secc.GroupManager/org_secc/GroupManager/LWYARoster.ascx Replaces From dropdown with read-only literal display.
Plugins/org.secc.GroupManager/org_secc/GroupManager/GroupDetailLava.ascx.cs Adds object-level authorization gate before rendering group via Lava.
Plugins/org.secc.GroupManager/Model/PublishGroup.cs Sanitizes ScheduleText and adds schedule date formatting helper.
Plugins/org.secc.Finance/Utility/Statement.cs Adds new fields to MoveCommitmentSummary drop.
Plugins/org.secc.Finance/org_secc/Finance/ContributionStatementList.ascx.cs Makes PDF export more robust (validation, safer merging, temp file handling, response streaming).
Plugins/org.secc.FamilyOnMission/README.md Adds/updates documentation for FamilyOnMission block.
Plugins/org.secc.FamilyCheckin/Workflows/SaveAttendance.cs Documents why AttendanceService.Add must not be called after AddOrUpdate.
Plugins/org.secc.FamilyCheckin/Workflows/CreateMedicationLabels.cs Filters inactive medications so kiosks don’t print labels for inactive meds.
Plugins/org.secc.FamilyCheckin/org_secc/FamilyCheckin/QuickCheckin.ascx.cs Validates MCR against persisted attendance instead of cache-only occurrence resolution.
Plugins/org.secc.FamilyCheckin/Jobs/ResetGroupLocationSchedules.cs Adds early-exit and targeted cache invalidation instead of clearing all check-in caches.
Plugins/org.secc.Event/org_secc/Event/EventPass.ascx Fixes icon markup quoting and conditionally renders carousel controls.
Plugins/org.secc.EMS/README.md Adds/updates documentation for EMS integration plugin.
Plugins/org.secc.DevLib/README.md Adds/updates documentation for DevLib helper assembly.
Plugins/org.secc.CustomIcons/README.md Adds/updates documentation for CustomIcons assets plugin.
Plugins/org.secc.ConnectionsDigest/README.md Adds/updates documentation for ConnectionsDigest job plugin.
Plugins/org.secc.ConnectionCards/README.md Adds/updates documentation for ConnectionCards plugin.
Plugins/org.secc.Connection/org_secc/Connection/VolunteerSignupWizard.ascx.cs Filters defined values to active; adds null-handling and config cleanup behavior.
Plugins/org.secc.Connection/org_secc/Connection/VolunteerSignupFormConnections.ascx Adds placeholders/literals for waiver text and form attributes/messages.
Plugins/org.secc.Communication/org_secc/Communication/MessagingPhoneNumberDetail.ascx.cs HTML-encodes owner display fields to prevent injection.
Plugins/org.secc.Communication/org_secc/Communication/ManageCommunicationLists.ascx.cs Switches to impersonation-token person resolution to prevent GUID-tail impersonation.
Plugins/org.secc.Cms/org_secc/Cms/PublicProfileEdit.ascx.cs HTML-encodes names and adds server-side ownership gating to prevent tampered postbacks.
Plugins/org.secc.Cms/org_secc/Cms/LinkListEditUsers.ascx.cs Re-derives/authorizes editor group per postback to prevent hfSecurityGroupId tampering.
Plugins/org.secc.CheckinMonitor/org_secc/CheckinMonitor/SuperCheckin.ascx.cs HTML-encodes displayed names and fixes security-role PIN guard fallthrough.
Plugins/org.secc.CheckinMonitor/org_secc/CheckinMonitor/CheckinMonitor.ascx.cs HTML-encodes name in move modal text to prevent injection.
Plugins/org.secc.ChangeManager/org_secc/ChangeManager/CMPublicProfileRemovePerson.ascx.cs HTML-encodes person name fields.
Plugins/org.secc.ChangeManager/org_secc/ChangeManager/ChangeRequestDetail.ascx.cs HTML-encodes displayed values unless they are trusted Rock-formatted HTML.
Plugins/org.secc.ChangeManager/org_secc/ChangeManager/ChangeEntry.ascx.cs HTML-encodes displayed person name.
Plugins/org.secc.Authentication/SMSAuthentication.cs Adds rolling-window cap on SMS OTP requests and supporting in-memory issuance tracking.
Plugins/org.secc.Authentication/org_secc/Authentication/SMSLogin.ascx.cs Improves OTP code input UX (autocomplete/inputmode/pattern/maxlength).
Plugins/org.secc.Authentication/org_secc/Authentication/SMSLogin.ascx Adds JS enhancements (Enter-to-submit, auto-submit on 6 digits) and aria-live status text.
Plugins/org.secc.Attributes/org.secc.Attributes.csproj Adds dependencies and compile items for multi-file upload/field type support.
Plugins/org.secc.AI/README.md Adds documentation noting the project is an empty scaffold.
Plugins/org.secc.Administration/README.md Adds/updates documentation for Administration blocks.
Content/Lava/SEMobileApp/Sermons/SermonIdV2.lava Adds YouTube share URL logic with optional start-time parameter.
.github/copilot-instructions.md Adds PR review guidance about keeping plugin READMEs in sync with behavior changes.
Comments suppressed due to low confidence (1)

Plugins/org.secc.Migrations/README.md:105

  • The README has leftover XML-like closing tags (</content>, </invoke>) at the end, which don’t belong in Markdown and will render as stray text.

- ContributionStatementList.ascx.cs: iText7's 3-arg PdfMerger constructor
  was removed in iText 8+; use PdfMergerProperties with SetMergeTags(false)
  / SetMergeOutlines(false) to preserve the tag/outline-merge opt-out that
  avoids 'Tag structure flushing failed' on some source PDFs (ROCK-8442
  code merged from master)
- RequisitionDetail.ascx.cs: remove dead 'using Rock.MyWell' - namespace
  no longer ships in the 1.16.12 RockWeb bin (pre-existing on both
  branches; surfaced by precompiling)

Blocks are compiled by ASP.NET at page load, not by the plugin csprojs,
so these were invisible to the MSBuild verification pass. Verified by a
full aspnet_compiler precompile of RockWeb: zero errors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@stphnlee

Copy link
Copy Markdown
Contributor Author

Added 070ea9b2 — two runtime-block fixes found by precompiling RockWeb with aspnet_compiler:

  • ContributionStatementList.ascx.cs:144 — iText7's 3-arg PdfMerger ctor (removed in iText 8+) → PdfMergerProperties().SetMergeTags(false).SetMergeOutlines(false)
  • RequisitionDetail.ascx.cs — dead using Rock.MyWell; (namespace doesn't ship in 1.16.12); pre-existing on both branches, not merge-introduced

Blocks (.ascx.cs) compile at page load, not via csproj, so the original MSBuild sweep couldn't see them. Full RockWeb precompile now passes with zero errors — all SECC runtime blocks verified against 1.16.12.

stphnlee and others added 5 commits July 20, 2026 15:39
Add new keyword; sole caller in RegistrationEntry unaffected.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Workflow copy was added in accfe77 to satisfy a stale csproj Compile
entry; the canonical job lives in org.secc.Finance/Jobs. Having the same
class in two assemblies makes the job type ambiguous in Rock. Also restore
[DisallowConcurrentExecution] on the Finance copy, which was dropped during
the IJob -> RockJob conversion.
SmsFromSystemPhoneNumberId was being assigned PhoneNumberValueId, which is
a DefinedValue Id from the legacy COMMUNICATION_SMS_FROM type. SystemPhoneNumber
rows created by Rock's v15 migration keep the DefinedValue Guid but get new
identity Ids, so the direct assignment violates the FK (or resolves to the
wrong number), and the job marks the communication as run before the failed
enqueue - so recurring SMS silently stop sending.
The testability refactor moved binary file type resolution into
SaveAndAssignPdf, which only runs on the workflow-attribute path. The
block-triggered path (entity is PDFWorkflowObject) returned an untyped
BinaryFile that PDFFormExample/PDFLavaExample then persisted - no storage
provider stamp, no file type security. Resolve the type once in Execute
before branching, preserving the original qualifier -> DEFAULT resolution
order.
Rock.Jobs.RockJob is itself decorated with [DisallowConcurrentExecution],
and Quartz checks the attribute with inherit: true, so every RockJob
subclass is already non-concurrent. Strip the leftover attribute and
now-unused 'using Quartz;' from the 11 jobs that still carried it so the
codebase tells one consistent story. PhoneNumberCleanup (Rock13) still
implements IJob directly and keeps its attribute.
@stphnlee
stphnlee merged commit 1e60bdb into hotfix-1.16.12 Jul 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants