Merge master (v13 production line) into hotfix-1.16.12 - #274
Merged
Conversation
…tribute key and value prior in the workflow
* 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
ROCK-8193: Publish Groups Page Update
…re not linked directly to the registration instance
…and trimmed workflow group attribute key
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>
New ServerHealth Block
…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
…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>
Contributor
There was a problem hiding this comment.
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.SmsCapturetransport 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>
Contributor
Author
|
Added
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. |
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
20351cc9Merge master into hotfix-1.16.12 — the merge itself, 7 conflicts resolved7a13cbe2Fix v16 compile errors — minimal changes to make merged code build174e772bUpdate merged code off obsolete v13 APIs — RockJob + SystemPhoneNumber conversionsConflict resolutions (commit 1)
org.secc.Attributes.csprojRockWeb\BinDLL refsorg.secc.GroupTrackerDemo/*PDFFormMerge.csorg.secc.SmsCapture.csprojorg.secc.Workflow.csproj/packages.configAlso: orphaned Equip/Widgities READMEs removed; FFmpeg/ImageMontage stayed deleted (removed on both branches independently).
v16 porting (commits 2–3)
ResetGroupLocationSchedules.cs— master's early-exit referenced the Quartzcontextparam that hotfix's RockJob conversion removed; now usesRockJob.ResultIJob→RockJob(ROCK-7971/8669 pattern): DisableCommunicationsForInactivePeople, RestoreCommunicationsForReactivatedPeople, ReEncryptAttributeValues, CampPlacementImportBackgroundJobSystemPhoneNumberAPIs (FromNumber/SMSFromDefinedValue→FromSystemPhoneNumber/SmsFromSystemPhoneNumber)RunIdwas 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 callsCampPlacementImportRunner.Run()directly).Verification
org.secc.Testxunit suite passes🤖 Generated with Claude Code