@go-labs-sg/rsvp 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -752,8 +752,9 @@ High-impact payment and retention commands remain protected by their matching fi
752
752
 
753
753
  ## Registration master list export
754
754
 
755
- `export request` queues the single **Registration master list** Excel workbook
756
- (one **Master List** sheet; question columns follow the event's form). The
755
+ `export request` queues the **Registration master list** Excel workbook
756
+ (**Master List** by default; optional registration/attendance tabs follow event
757
+ settings and permissions; question columns follow the event's form). The
757
758
  payload is `organizationId`, `eventId` and an audit `reason`; the old `dataset`,
758
759
  `format` and `filters` fields are ignored. See the RSVP app README for columns.
759
760
 
@@ -775,8 +776,40 @@ population. Non-operational statuses remain excluded, and permissions, payment
775
776
  gates, duplicate protection, and undo behavior are unchanged. The web panel's
776
777
  realtime connection and manual refresh controls do not add a CLI subscription.
777
778
 
779
+ Set `registrationMasterList.includeAttendanceSheets: true` with an approved
780
+ `event setup step update` (`section: "REGISTRATION_RULES"`) to add response-based
781
+ **Attending**, **Not attending** (explicit declines only), and **All** tabs,
782
+ plus the retained **Registered**, **Not Registered**, **Attended** and
783
+ **Not Attended** views. It defaults off. All matches every Master List person,
784
+ including guests and nonrespondents; attending/declined subsets use canonical
785
+ completed responses and never treat nonresponse as a decline.
786
+ Registered includes attending, legacy submitted and declined completed responses;
787
+ actual check-in tabs include only attending/legacy-submitted people and require
788
+ `check-in.view`. An undone check-in returns a person to Not Attended. Preserve
789
+ the other current master-list settings when editing this object.
790
+
778
791
  Deploy matching API and export-worker versions together; an old worker would build the retired
779
- registration-records report for master-list jobs.
792
+ registration-records report for master-list jobs. See the
793
+ [follow-up contract](../../../apps/rsvp/reporting-follow-up.md) for exact tab
794
+ populations, worker-order/rollback gates and the separate later post-draw merge.
795
+
796
+ ## Seat-change email presentation
797
+
798
+ In an approved `event setup step update` for `REGISTRATION_RULES`,
799
+ `seatChangeNotification.includeTablemates` controls saved same-table display
800
+ names (default off), and `seatChangeNotification.includeFloorPlanImage` controls
801
+ the inline highlighted floor-plan image (default on). Both accept explicit
802
+ `true` or `false` independently. Preserve the current notification subject/body,
803
+ enabled/automatic state, other registration rules and expected configuration
804
+ version when editing. Omitting either property preserves its stored value.
805
+
806
+ Explicit event presentation values apply to manual and automatic seat-change
807
+ notices, overriding saved-form presentation only; omissions inherit the form.
808
+ These switches do not enable notices, change seats or send/resend email. With
809
+ the image off, text assignments remain and the worker skips map/image work.
810
+ Deploy compatible workers before relying on the switches; old workers do not
811
+ honor the image off-switch. Tablemate-name disclosure still needs privacy
812
+ approval. The web exposes both switches in Registration rules.
780
813
 
781
814
  ## Seating updates
782
815
 
package/dist/index.js CHANGED
@@ -7957,6 +7957,8 @@ var defaultEventSeatChangeNotification = {
7957
7957
  var eventSeatChangeNotificationSchema = object({
7958
7958
  body: string2().trim().max(1e4).default(""),
7959
7959
  automatic: boolean2().optional(),
7960
+ includeTablemates: boolean2().optional(),
7961
+ includeFloorPlanImage: boolean2().optional(),
7960
7962
  enabled: boolean2().default(false),
7961
7963
  subject: string2().trim().max(240).default("")
7962
7964
  }).superRefine((notification, ctx) => {
@@ -10145,7 +10147,8 @@ var outputKeysSchema = array(string2().min(1).max(160).regex(/^[A-Za-z][A-Za-z0-
10145
10147
  var eventRegistrationMasterListSchema = object({
10146
10148
  omittedOutputKeys: outputKeysSchema.default([]),
10147
10149
  finalOutputKeys: outputKeysSchema.default([]),
10148
- showEligibilityCutoffInHeading: boolean2().default(false)
10150
+ showEligibilityCutoffInHeading: boolean2().default(false),
10151
+ includeAttendanceSheets: boolean2().default(false)
10149
10152
  }).strict().refine((config) => !config.finalOutputKeys.some((key) => config.omittedOutputKeys.includes(key)), { message: "Omitted output keys cannot also be final output keys" });
10150
10153
 
10151
10154
  // ../validators/src/event.ts
@@ -12359,7 +12362,7 @@ var commands = {
12359
12362
  effects: ["sensitive-data", "state-change"],
12360
12363
  operation: (api, input) => api.export.requestExport.mutate(input),
12361
12364
  payloadOnly: true,
12362
- summary: "Request the registration master list XLSX (--payload JSON: eventId, organizationId, reason)."
12365
+ summary: "Request the event-configured master list XLSX with optional attendance tabs (--payload JSON: eventId, organizationId, reason)."
12363
12366
  },
12364
12367
  "export list": {
12365
12368
  effects: ["sensitive-data"],
@@ -12564,7 +12567,7 @@ Object.assign(commands, {
12564
12567
  "event mine list": payloadCommand((api, input) => api.event.listMyEvents.query(input), "List the caller's events (--payload JSON)."),
12565
12568
  "event reminder list": payloadCommand((api, input) => api.event.listReminderSegments.query(input), "List reminder segments (--payload JSON).", ["sensitive-data"]),
12566
12569
  "event rsvp submit": payloadCommand((api, input) => api.event.submitRsvp.mutate(input), "Submit the caller's registration (--payload JSON).", ["sensitive-data", "state-change"]),
12567
- "event setup step update": payloadCommand((api, input) => api.event.updateSetupStep.mutate(input), "Update one revision-checked event setup step (--payload JSON). REGISTRATION_RULES accepts registrationEmail presentation (including senderName and a senderLocalPart+senderDomain address on a verified Resend sending domain), registrationMasterList output-key ordering/omissions and seatChangeNotification automatic policy; omitted settings are preserved.", ["state-change"]),
12570
+ "event setup step update": payloadCommand((api, input) => api.event.updateSetupStep.mutate(input), "Update one revision-checked event setup step (--payload JSON). REGISTRATION_RULES accepts registrationEmail presentation (including senderName and a senderLocalPart+senderDomain address on a verified Resend sending domain), registrationMasterList output-key ordering/omissions and includeAttendanceSheets, and seatChangeNotification automatic/includeTablemates/includeFloorPlanImage policy (tablemate names default off; floor-plan image defaults on); omitted settings are preserved.", ["state-change"]),
12568
12571
  "event page update": payloadCommand((api, input) => api.event.updateSetupStep.mutate({
12569
12572
  ...input,
12570
12573
  section: "DETAILS_PAGE"
@@ -145,6 +145,33 @@ to events without automatic notices; the flag grants approval but does not
145
145
  itself enable sending. Non-seating profile/menu updates and saving or discarding
146
146
  a draft do not acquire an email effect.
147
147
 
148
+ ## Follow-up reporting and tablemates (#1657)
149
+
150
+ The optional workbook tabs (`registrationMasterList.includeAttendanceSheets`)
151
+ and tablemate display names (`seatChangeNotification.includeTablemates`) are
152
+ off by default. The existing example fragment intentionally does not activate
153
+ them. Preserve the full current configuration and obtain event privacy approval
154
+ before opting in. Clients omitting `includeTablemates` retain the stored value;
155
+ explicit `false` disables it. See the
156
+ [generic follow-up contract](../../../../../apps/rsvp/reporting-follow-up.md)
157
+ for exact tab populations and delivery privacy boundaries. The web also exposes
158
+ independent **Include tablemate names** and **Include floor-plan image** switches.
159
+ The latter is `seatChangeNotification.includeFloorPlanImage` (default on; false
160
+ omits map loading, image generation and attachment while retaining text seats).
161
+ Explicit current-event presentation values apply to manual and automatic notices
162
+ without changing notice enablement or copy. Deploy all email workers before
163
+ relying on the image off-switch. Post-draw results
164
+ will later merge the RSVP export with the Event Tech lucky-draw export; this
165
+ change does not infer winners from eligibility or create result placeholders.
166
+
167
+ **Worker-order warning:** upgrade/fence all email workers before enabling
168
+ automatic policy for historical forms. An old worker can skip a new notice
169
+ using old saved-form settings and mark it complete. Deploy matching export
170
+ workers before requesting optional tabs as well. For rollback, pause/fence
171
+ producers and workers, disable the new policies with a compatible API after
172
+ approval, and reconcile queued/in-flight messages before old workers consume
173
+ them. Never automatically resend skipped/completed jobs.
174
+
148
175
  Production deployment, event configuration writes, live submissions/reseating,
149
176
  export jobs, resends and any real provider send require explicit approval and
150
177
  readback. Local HTML/XLSX and synthetic browser checks are not live acceptance.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@go-labs-sg/rsvp",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "RSVP CLI for authorized event operations.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",