From 7dd9c06b8e15eaabe6cd9b0b6b0cf59ffb8f7d2d Mon Sep 17 00:00:00 2001 From: Julianna Apicella <42875581+juliannaeapicella@users.noreply.github.com> Date: Thu, 20 Jun 2024 09:51:51 -0400 Subject: [PATCH 1/4] feat(hub-common): add createRegistration --- package-lock.json | 48 +++++++++--------------- packages/common/src/events/edit.ts | 30 ++++++++++++++- packages/common/test/events/edit.test.ts | 47 +++++++++++++++++++++-- 3 files changed, 90 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index b2a9ca0bcd6..0c09029d889 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22688,10 +22688,9 @@ }, "node_modules/cz-lerna-changelog/node_modules/npm/node_modules/lodash._baseindexof": { "version": "3.1.0", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/cz-lerna-changelog/node_modules/npm/node_modules/lodash._baseuniq": { "version": "4.6.0", @@ -22706,24 +22705,21 @@ }, "node_modules/cz-lerna-changelog/node_modules/npm/node_modules/lodash._bindcallback": { "version": "3.0.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/cz-lerna-changelog/node_modules/npm/node_modules/lodash._cacheindexof": { "version": "3.0.2", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/cz-lerna-changelog/node_modules/npm/node_modules/lodash._createcache": { "version": "3.1.2", - "dev": true, + "extraneous": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "lodash._getnative": "^3.0.0" } @@ -22737,10 +22733,9 @@ }, "node_modules/cz-lerna-changelog/node_modules/npm/node_modules/lodash._getnative": { "version": "3.9.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/cz-lerna-changelog/node_modules/npm/node_modules/lodash._root": { "version": "3.0.1", @@ -22758,10 +22753,9 @@ }, "node_modules/cz-lerna-changelog/node_modules/npm/node_modules/lodash.restparam": { "version": "3.6.1", - "dev": true, + "extraneous": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/cz-lerna-changelog/node_modules/npm/node_modules/lodash.union": { "version": "4.6.0", @@ -65016,7 +65010,7 @@ }, "packages/common": { "name": "@esri/hub-common", - "version": "14.145.0", + "version": "14.148.1", "license": "Apache-2.0", "dependencies": { "@terraformer/arcgis": "^2.1.2", @@ -83471,8 +83465,7 @@ "lodash._baseindexof": { "version": "3.1.0", "bundled": true, - "dev": true, - "peer": true + "extraneous": true }, "lodash._baseuniq": { "version": "4.6.0", @@ -83487,20 +83480,17 @@ "lodash._bindcallback": { "version": "3.0.1", "bundled": true, - "dev": true, - "peer": true + "extraneous": true }, "lodash._cacheindexof": { "version": "3.0.2", "bundled": true, - "dev": true, - "peer": true + "extraneous": true }, "lodash._createcache": { "version": "3.1.2", "bundled": true, - "dev": true, - "peer": true, + "extraneous": true, "requires": { "lodash._getnative": "^3.0.0" } @@ -83514,8 +83504,7 @@ "lodash._getnative": { "version": "3.9.1", "bundled": true, - "dev": true, - "peer": true + "extraneous": true }, "lodash._root": { "version": "3.0.1", @@ -83532,8 +83521,7 @@ "lodash.restparam": { "version": "3.6.1", "bundled": true, - "dev": true, - "peer": true + "extraneous": true }, "lodash.union": { "version": "4.6.0", diff --git a/packages/common/src/events/edit.ts b/packages/common/src/events/edit.ts index ae359d6f616..2aa6ad55433 100644 --- a/packages/common/src/events/edit.ts +++ b/packages/common/src/events/edit.ts @@ -7,7 +7,19 @@ import { createEvent as createEventApi, updateEvent as updateEventApi, } from "./api/events"; -import { deleteRegistration } from "./api"; +import { + createRegistration, + deleteRegistration, + EventAttendanceType, + IRegistration, + RegistrationRole, +} from "./api"; + +export interface IHubCreateEventRegistration { + eventId: string; + role: RegistrationRole; + type: EventAttendanceType; +} /** * @private @@ -118,6 +130,20 @@ export async function updateHubEvent( return mapper.storeToEntity(model, {}) as IHubEvent; } +/** + * @private + * Create an Event registration + * @param data + * @param requestOptions + * @returns Promise + */ +export async function createHubEventRegistration( + data: IHubCreateEventRegistration, + requestOptions: IHubRequestOptions +): Promise { + return await createRegistration({ data, ...requestOptions }); +} + /** * @private * Remove an Event Attendee @@ -125,7 +151,7 @@ export async function updateHubEvent( * @param requestOptions * @returns Promise */ -export async function deleteHubEventAttendee( +export async function deleteHubEventRegistration( id: number, requestOptions: IHubRequestOptions ): Promise { diff --git a/packages/common/test/events/edit.test.ts b/packages/common/test/events/edit.test.ts index 80ec43e872b..3942ca24d0d 100644 --- a/packages/common/test/events/edit.test.ts +++ b/packages/common/test/events/edit.test.ts @@ -12,7 +12,9 @@ import { } from "../../src/events/api/types"; import { createHubEvent, - deleteHubEventAttendee, + createHubEventRegistration, + deleteHubEventRegistration, + IHubCreateEventRegistration, updateHubEvent, } from "../../src/events/edit"; import { IHubEvent } from "../../src/core/types/IHubEvent"; @@ -342,7 +344,43 @@ describe("HubEvents edit module", () => { }); }); - describe("deleteHubEventAttendee", () => { + describe("createHubEventRegistration", () => { + it("calls createRegistration", async () => { + const authdCtxMgr = await ArcGISContextManager.create({ + authentication: MOCK_AUTH, + currentUser: { + username: "casey", + } as unknown as PortalModule.IUser, + portal: { + name: "DC R&D Center", + id: "BRXFAKE", + urlKey: "fake-org", + } as unknown as PortalModule.IPortal, + portalUrl: "https://myserver.com", + }); + const createRegistrationSpy = spyOn( + registrationModule, + "createRegistration" + ).and.callFake(() => { + return Promise.resolve(); + }); + const data: IHubCreateEventRegistration = { + eventId: "0o1", + role: registrationModule.RegistrationRole.ATTENDEE, + type: registrationModule.EventAttendanceType.IN_PERSON, + }; + await createHubEventRegistration( + data, + authdCtxMgr.context.hubRequestOptions + ); + expect(createRegistrationSpy).toHaveBeenCalledWith({ + data, + ...authdCtxMgr.context.hubRequestOptions, + }); + }); + }); + + describe("deleteHubEventRegistration", () => { it("calls deleteRegistration", async () => { const authdCtxMgr = await ArcGISContextManager.create({ authentication: MOCK_AUTH, @@ -362,7 +400,10 @@ describe("HubEvents edit module", () => { ).and.callFake(() => { return Promise.resolve(); }); - await deleteHubEventAttendee(0o1, authdCtxMgr.context.hubRequestOptions); + await deleteHubEventRegistration( + 0o1, + authdCtxMgr.context.hubRequestOptions + ); expect(deleteRegistrationSpy).toHaveBeenCalledWith({ registrationId: 0o1, ...authdCtxMgr.context.hubRequestOptions, From 51de801b9b7e1e78e912c385a08dd012fdc1a3f7 Mon Sep 17 00:00:00 2001 From: Julianna Apicella <42875581+juliannaeapicella@users.noreply.github.com> Date: Thu, 20 Jun 2024 13:19:20 -0400 Subject: [PATCH 2/4] feat(hub-common): add userid filter --- .../_internal/hubEventsHelpers/processAttendeeFilters.ts | 5 +++++ .../hubEventsHelpers/processAttendeeFilters.test.ts | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/packages/common/src/search/_internal/hubEventsHelpers/processAttendeeFilters.ts b/packages/common/src/search/_internal/hubEventsHelpers/processAttendeeFilters.ts index 03358c13ee7..0680aa5d885 100644 --- a/packages/common/src/search/_internal/hubEventsHelpers/processAttendeeFilters.ts +++ b/packages/common/src/search/_internal/hubEventsHelpers/processAttendeeFilters.ts @@ -17,6 +17,11 @@ export function processAttendeeFilters( const useElseJoin = (value: string, defaults: string[]): string => value?.length ? value : defaults.map((val) => val.toLowerCase()).join(","); + const userId = getOptionalPredicateStringsByKey(query.filters, "userId"); + if (userId?.length) { + processedFilters.userId = userId[0]; + } + const term = getPredicateValuesByKey(query.filters, "term"); if (term.length) { // TODO: remove ts-ignore once GetEventsParams supports filtering by username, firstName, lastName https://devtopia.esri.com/dc/hub/issues/10153 diff --git a/packages/common/test/search/_internal/hubEventsHelpers/processAttendeeFilters.test.ts b/packages/common/test/search/_internal/hubEventsHelpers/processAttendeeFilters.test.ts index fe348fe02bc..989041ed06f 100644 --- a/packages/common/test/search/_internal/hubEventsHelpers/processAttendeeFilters.test.ts +++ b/packages/common/test/search/_internal/hubEventsHelpers/processAttendeeFilters.test.ts @@ -9,6 +9,13 @@ const FILTERS: IFilter[] = [ }, ], }, + { + predicates: [ + { + userId: "user1", + }, + ], + }, { operation: "OR", predicates: [ @@ -75,6 +82,7 @@ describe("processAttendeeFilters", () => { }); expect(results).toEqual({ eventId: "an event id", + userId: "u", // @ts-ignore name: "abc", role: "owner,organizer,attendee", From dafe0dda8cafac9a7b7dd1749bd1c54aeaf5c67d Mon Sep 17 00:00:00 2001 From: Julianna Apicella <42875581+juliannaeapicella@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:04:27 -0400 Subject: [PATCH 3/4] fix(hub-common): search filter bug --- .../search/_internal/hubEventsHelpers/processAttendeeFilters.ts | 2 +- .../_internal/hubEventsHelpers/processAttendeeFilters.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/common/src/search/_internal/hubEventsHelpers/processAttendeeFilters.ts b/packages/common/src/search/_internal/hubEventsHelpers/processAttendeeFilters.ts index 0680aa5d885..cd546c71a46 100644 --- a/packages/common/src/search/_internal/hubEventsHelpers/processAttendeeFilters.ts +++ b/packages/common/src/search/_internal/hubEventsHelpers/processAttendeeFilters.ts @@ -19,7 +19,7 @@ export function processAttendeeFilters( const userId = getOptionalPredicateStringsByKey(query.filters, "userId"); if (userId?.length) { - processedFilters.userId = userId[0]; + processedFilters.userId = userId; } const term = getPredicateValuesByKey(query.filters, "term"); diff --git a/packages/common/test/search/_internal/hubEventsHelpers/processAttendeeFilters.test.ts b/packages/common/test/search/_internal/hubEventsHelpers/processAttendeeFilters.test.ts index 989041ed06f..5eaf93d14c8 100644 --- a/packages/common/test/search/_internal/hubEventsHelpers/processAttendeeFilters.test.ts +++ b/packages/common/test/search/_internal/hubEventsHelpers/processAttendeeFilters.test.ts @@ -82,7 +82,7 @@ describe("processAttendeeFilters", () => { }); expect(results).toEqual({ eventId: "an event id", - userId: "u", + userId: "user1", // @ts-ignore name: "abc", role: "owner,organizer,attendee", From 6cf642bc23cd8c9d1a0d5968a8c2f547dfba1ef4 Mon Sep 17 00:00:00 2001 From: Julianna Apicella <42875581+juliannaeapicella@users.noreply.github.com> Date: Tue, 25 Jun 2024 11:24:33 -0400 Subject: [PATCH 4/4] feat(hub-common): pr feedback --- .../src/events/_internal/PropertyMapper.ts | 18 --------- packages/common/src/events/edit.ts | 4 +- .../src/search/_internal/hubSearchEvents.ts | 1 + .../events/_internal/PropertyMapper.test.ts | 37 ------------------- 4 files changed, 3 insertions(+), 57 deletions(-) diff --git a/packages/common/src/events/_internal/PropertyMapper.ts b/packages/common/src/events/_internal/PropertyMapper.ts index 898ecc3b3e7..6f25ec8be0f 100644 --- a/packages/common/src/events/_internal/PropertyMapper.ts +++ b/packages/common/src/events/_internal/PropertyMapper.ts @@ -95,27 +95,9 @@ export class EventPropertyMapper extends PropertyMapper< obj.slug = getEventSlug(store as IEvent); obj.thumbnailUrl = getEventThumbnail(); - const heroActions: HubActionLink[] = []; - if (store.allowRegistration) { - let tooltip; - if (obj.isCanceled) { - tooltip = "{{tooltip.register.isCancelled:translate}}"; - } else if (obj.isPast) { - tooltip = "{{tooltip.register.eventHasEnded:translate}}"; - } - heroActions.push({ - kind: "well-known", - action: "register", - label: "{{actions.register:translate}}", - disabled: obj.isCanceled || obj.isPast, - tooltip, - }); - } obj.view = { - heroActions, showMap: !!store.location, }; - obj.location = store.location ? { type: store.location.type, diff --git a/packages/common/src/events/edit.ts b/packages/common/src/events/edit.ts index 2aa6ad55433..091ebbfca09 100644 --- a/packages/common/src/events/edit.ts +++ b/packages/common/src/events/edit.ts @@ -137,11 +137,11 @@ export async function updateHubEvent( * @param requestOptions * @returns Promise */ -export async function createHubEventRegistration( +export function createHubEventRegistration( data: IHubCreateEventRegistration, requestOptions: IHubRequestOptions ): Promise { - return await createRegistration({ data, ...requestOptions }); + return createRegistration({ data, ...requestOptions }); } /** diff --git a/packages/common/src/search/_internal/hubSearchEvents.ts b/packages/common/src/search/_internal/hubSearchEvents.ts index b262fb2965a..b1c90f0d3ab 100644 --- a/packages/common/src/search/_internal/hubSearchEvents.ts +++ b/packages/common/src/search/_internal/hubSearchEvents.ts @@ -16,6 +16,7 @@ import { processFilters } from "./hubEventsHelpers/processFilters"; * entityId: string | string[]; * entityType: string | string[]; * id: string | string[]; + * userId: string; * term: string; * categories: string | string[]; * tags: string | string[]; diff --git a/packages/common/test/events/_internal/PropertyMapper.test.ts b/packages/common/test/events/_internal/PropertyMapper.test.ts index c1ed121e547..a773e43e0d9 100644 --- a/packages/common/test/events/_internal/PropertyMapper.test.ts +++ b/packages/common/test/events/_internal/PropertyMapper.test.ts @@ -165,7 +165,6 @@ describe("PropertyMapper", () => { slug: "event-title-31c", thumbnailUrl: getEventThumbnail(), view: { - heroActions: [], showMap: true, }, }); @@ -208,42 +207,6 @@ describe("PropertyMapper", () => { const res = propertyMapper.storeToEntity(eventRecord, {}); expect(res.attendanceType).toEqual(HubEventAttendanceType.Both); }); - - it("disables registration if canceled", () => { - eventRecord.allowRegistration = true; - eventRecord.status = EventStatus.CANCELED; - const res = propertyMapper.storeToEntity(eventRecord, {}); - expect(res.view).toEqual({ - heroActions: [ - { - kind: "well-known", - action: "register", - label: "{{actions.register:translate}}", - disabled: true, - tooltip: "{{tooltip.register.isCancelled:translate}}", - }, - ], - showMap: false, - }); - }); - - it("disables registration if past due", () => { - eventRecord.allowRegistration = true; - eventRecord.endDateTime = new Date("1/1/2000").toISOString(); - const res = propertyMapper.storeToEntity(eventRecord, {}); - expect(res.view).toEqual({ - heroActions: [ - { - kind: "well-known", - action: "register", - label: "{{actions.register:translate}}", - disabled: true, - tooltip: "{{tooltip.register.eventHasEnded:translate}}", - }, - ], - showMap: false, - }); - }); }); describe("entityToStore", () => {