diff --git a/api/chalicelib/core/sessions_metas.py b/api/chalicelib/core/sessions_metas.py index f7e98eb69..40c621a91 100644 --- a/api/chalicelib/core/sessions_metas.py +++ b/api/chalicelib/core/sessions_metas.py @@ -15,6 +15,12 @@ SUPPORTED_TYPES = { schemas.FilterType.user_country: SupportedFilter( get=autocomplete.__generic_autocomplete_metas(typename=schemas.FilterType.user_country), query=autocomplete.__generic_autocomplete_metas(typename=schemas.FilterType.user_country)), + schemas.FilterType.user_city: SupportedFilter( + get=autocomplete.__generic_autocomplete_metas(typename=schemas.FilterType.user_city), + query=autocomplete.__generic_autocomplete_metas(typename=schemas.FilterType.user_city)), + schemas.FilterType.user_state: SupportedFilter( + get=autocomplete.__generic_autocomplete_metas(typename=schemas.FilterType.user_state), + query=autocomplete.__generic_autocomplete_metas(typename=schemas.FilterType.user_state)), schemas.FilterType.user_id: SupportedFilter( get=autocomplete.__generic_autocomplete_metas(typename=schemas.FilterType.user_id), query=autocomplete.__generic_autocomplete_metas(typename=schemas.FilterType.user_id)), diff --git a/frontend/app/mstore/types/session.ts b/frontend/app/mstore/types/session.ts index 3c4212514..e1ce5f55b 100644 --- a/frontend/app/mstore/types/session.ts +++ b/frontend/app/mstore/types/session.ts @@ -26,6 +26,7 @@ export default class Session { userDeviceType: string = "" userCountry: string = "" userCity: string = "" + userState: string = "" eventsCount: number = 0 userNumericHash: number = 0 userDisplayName: string = "" @@ -57,6 +58,7 @@ export default class Session { this.eventsCount = session.eventsCount this.userCountry = session.userCountry this.userCity = session.userCity + this.userState = session.userState this.userNumericHash = hashString(session.userId || session.userAnonymousId || session.userUuid || session.userID || session.userUUID || "") this.userDisplayName = session.userId || session.userAnonymousId || session.userID || 'Anonymous User' }) diff --git a/frontend/app/types/filter/filterType.ts b/frontend/app/types/filter/filterType.ts index 561dcf867..9545770e2 100644 --- a/frontend/app/types/filter/filterType.ts +++ b/frontend/app/types/filter/filterType.ts @@ -34,6 +34,8 @@ export const setQueryParamKeyFromFilterkey = (filterKey: string) => { return 'country'; case FilterKey.USER_CITY: return 'city'; + case FilterKey.USER_STATE: + return 'state'; case FilterKey.REFERRER: return 'ref'; case FilterKey.CUSTOM: @@ -102,6 +104,9 @@ export const getFilterKeyTypeByKey = (key: string) => { case 'city': case 'userCity': return FilterKey.USER_CITY; + case 'state': + case 'userState': + return FilterKey.USER_STATE; case 'ref': case 'referrer': return FilterKey.REFERRER; @@ -203,6 +208,7 @@ export enum FilterKey { REFERRER = 'referrer', USER_COUNTRY = 'userCountry', USER_CITY = 'userCity', + USER_STATE = 'userState', JOURNEY = 'journey', REQUEST = 'request', GRAPHQL = 'graphql', diff --git a/frontend/app/types/filter/newFilter.js b/frontend/app/types/filter/newFilter.js index 872756e56..9aeedf9ff 100644 --- a/frontend/app/types/filter/newFilter.js +++ b/frontend/app/types/filter/newFilter.js @@ -40,6 +40,7 @@ export const filters = [ { key: FilterKey.DURATION, type: FilterType.DURATION, category: FilterCategory.RECORDING_ATTRIBUTES, label: 'Duration', operator: 'is', operatorOptions: filterOptions.getOperatorsByKeys(['is']), icon: 'filters/duration' }, { key: FilterKey.USER_COUNTRY, type: FilterType.MULTIPLE_DROPDOWN, category: FilterCategory.USER, label: 'User Country', operator: 'is', operatorOptions: filterOptions.getOperatorsByKeys(['is', 'isAny', 'isNot']), icon: 'filters/country', options: countryOptions }, { key: FilterKey.USER_CITY, type: FilterType.MULTIPLE, category: FilterCategory.USER, label: 'User City', operator: 'is', operatorOptions: filterOptions.getOperatorsByKeys(['is', 'isAny', 'isNot']), icon: 'filters/country', options: countryOptions }, + { key: FilterKey.USER_STATE, type: FilterType.MULTIPLE, category: FilterCategory.USER, label: 'User State', operator: 'is', operatorOptions: filterOptions.getOperatorsByKeys(['is', 'isAny', 'isNot']), icon: 'filters/country', options: countryOptions }, // { key: FilterKey.CONSOLE, type: FilterType.MULTIPLE, category: FilterCategory.JAVASCRIPT, label: 'Console', operator: 'is', operatorOptions: filterOptions.stringOperators, icon: 'filters/console' }, { key: FilterKey.USERID, type: FilterType.MULTIPLE, category: FilterCategory.USER, label: 'User Id', placeholder: 'E.g. Alex, or alex@domain.com, or EMP123', operator: 'is', operatorOptions: filterOptions.stringOperators.concat([{ label: 'is undefined', value: 'isUndefined'}]), icon: 'filters/userid' }, { key: FilterKey.USERANONYMOUSID, type: FilterType.MULTIPLE, category: FilterCategory.USER, label: 'User AnonymousId', operator: 'is', operatorOptions: filterOptions.stringOperators, icon: 'filters/userid' }, diff --git a/frontend/app/types/session/session.ts b/frontend/app/types/session/session.ts index ad0bfd599..448e93225 100644 --- a/frontend/app/types/session/session.ts +++ b/frontend/app/types/session/session.ts @@ -75,6 +75,7 @@ export interface ISession { userBrowserVersion: string; userCountry: string; userCity: string; + userState: string; userDevice: string; userDeviceType: string; isMobile: boolean; @@ -162,6 +163,7 @@ export default class Session { userBrowserVersion: ISession['userBrowserVersion']; userCountry: ISession['userCountry']; userCity: ISession['userCity']; + userState: ISession['userState']; userDevice: ISession['userDevice']; userDeviceType: ISession['userDeviceType']; isMobile: ISession['isMobile'];