diff --git a/backend/src/database/repositories/organizationRepository.ts b/backend/src/database/repositories/organizationRepository.ts index e63216d4f4..3e55c9fbb4 100644 --- a/backend/src/database/repositories/organizationRepository.ts +++ b/backend/src/database/repositories/organizationRepository.ts @@ -104,12 +104,12 @@ class OrganizationRepository { ['revenueRangeMax', `(o."revenueRange"->>'max')::integer`], // aggregated fields - ['activityCount', 'osa."activityCount"'], - ['memberCount', 'osa."memberCount"'], - ['activeOn', 'osa."activeOn"'], + ['activityCount', 'coalesce(osa."activityCount", 0)::integer'], + ['memberCount', 'coalesce(osa."memberCount", 0)::integer'], + ['activeOn', 'coalesce(osa."activeOn", \'{}\'::text[])'], ['joinedAt', 'osa."joinedAt"'], ['lastActive', 'osa."lastActive"'], - ['avgContributorEngagement', 'osa."avgContributorEngagement"'], + ['avgContributorEngagement', 'coalesce(osa."avgContributorEngagement", 0)::integer'], // org fields for display ['logo', 'o."logo"'], @@ -1682,7 +1682,7 @@ class OrganizationRepository { FROM organizations o ${ withAggregates - ? ` JOIN "organizationSegmentsAgg" osa ON osa."organizationId" = o.id AND ${ + ? ` LEFT JOIN "organizationSegmentsAgg" osa ON osa."organizationId" = o.id AND ${ segmentId ? `osa."segmentId" = $(segmentId)` : `osa."segmentId" IS NULL` }` : '' @@ -1693,9 +1693,7 @@ class OrganizationRepository { AND (${filterString}) ` - const results = await Promise.all([ - qx.select( - ` + const query = ` ${createQuery( (function prepareFields(fields) { return fields @@ -1704,26 +1702,25 @@ class OrganizationRepository { if (!mappedField) { throw new Error400(options.language, `Invalid field: ${f}`) } - - return mappedField + return `${mappedField} as "${f}"` }) .filter((f) => { if (withAggregates) { return true } - return !f.startsWith('osa.') + return !f.includes('osa.') }) .join(',\n') })(fields), )} - ORDER BY ${order} + ORDER BY ${order} NULLS LAST LIMIT $(limit) OFFSET $(offset) - `, - params, - ), - qx.selectOne(createQuery('COUNT(*)'), params), - ]) + ` + + const countQuery = createQuery('COUNT(*)') + + const results = await Promise.all([qx.select(query, params), qx.selectOne(countQuery, params)]) const rows = results[0] const count = parseInt(results[1].count, 10) diff --git a/frontend/src/modules/member/config/saved-views/main.ts b/frontend/src/modules/member/config/saved-views/main.ts index 93f2443c44..abe064f526 100644 --- a/frontend/src/modules/member/config/saved-views/main.ts +++ b/frontend/src/modules/member/config/saved-views/main.ts @@ -4,7 +4,6 @@ import allMembers from './views/all-members'; import unaffiliated from './views/unaffiliated'; import toReview from './views/to-review'; -import bot from './settings/bot/config'; import teamMember from './settings/teamMember/config'; import organization from './settings/organization/config'; @@ -12,7 +11,6 @@ export const memberSavedViews: SavedViewsConfig = { defaultView: allMembers, settings: { teamMember, - bot, organization, }, defaultFilters: { diff --git a/frontend/src/modules/member/config/saved-views/settings/bot/MemberBotSetting.vue b/frontend/src/modules/member/config/saved-views/settings/bot/MemberBotSetting.vue deleted file mode 100644 index 95f17a14f1..0000000000 --- a/frontend/src/modules/member/config/saved-views/settings/bot/MemberBotSetting.vue +++ /dev/null @@ -1,56 +0,0 @@ - - - - - diff --git a/frontend/src/modules/member/config/saved-views/settings/bot/config.ts b/frontend/src/modules/member/config/saved-views/settings/bot/config.ts deleted file mode 100644 index 955c728568..0000000000 --- a/frontend/src/modules/member/config/saved-views/settings/bot/config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { SavedViewsSetting } from '@/shared/modules/saved-views/types/SavedViewsConfig'; -import { IncludeEnum } from '@/modules/member/config/saved-views/settings/common/types/IncludeEnum'; -import { includeFilterRenderer } from '@/modules/member/config/saved-views/settings/common/includeFilterRenderer'; -import MemberBotSetting from './MemberBotSetting.vue'; - -const bot: SavedViewsSetting = { - inSettings: true, - settingsComponent: MemberBotSetting, - defaultValue: IncludeEnum.EXCLUDE, - queryUrlParser(value: string): IncludeEnum { - return value as IncludeEnum; - }, - apiFilterRenderer(value: IncludeEnum): any[] { - return includeFilterRenderer('isBot', value); - }, -}; - -export default bot; diff --git a/frontend/src/modules/member/config/saved-views/views/all-members.ts b/frontend/src/modules/member/config/saved-views/views/all-members.ts index 3fd9830ee8..1ba5fbae16 100644 --- a/frontend/src/modules/member/config/saved-views/views/all-members.ts +++ b/frontend/src/modules/member/config/saved-views/views/all-members.ts @@ -13,8 +13,7 @@ const allMembers: SavedView = { order: 'descending', }, settings: { - bot: 'exclude', - teamMember: 'exclude', + teamMember: 'include', organization: 'exclude', }, }, diff --git a/frontend/src/modules/member/config/saved-views/views/to-review.ts b/frontend/src/modules/member/config/saved-views/views/to-review.ts index 10b8b09b75..702bab4319 100644 --- a/frontend/src/modules/member/config/saved-views/views/to-review.ts +++ b/frontend/src/modules/member/config/saved-views/views/to-review.ts @@ -13,8 +13,7 @@ const toReview: SavedView = { order: 'descending', }, settings: { - bot: 'exclude', - teamMember: 'exclude', + teamMember: 'include', organization: 'exclude', }, reviewed: { diff --git a/frontend/src/modules/member/config/saved-views/views/unaffiliated.ts b/frontend/src/modules/member/config/saved-views/views/unaffiliated.ts index 81b2342ec5..ed828e0885 100644 --- a/frontend/src/modules/member/config/saved-views/views/unaffiliated.ts +++ b/frontend/src/modules/member/config/saved-views/views/unaffiliated.ts @@ -13,8 +13,7 @@ const unaffiliated: SavedView = { order: 'descending', }, settings: { - bot: 'exclude', - teamMember: 'exclude', + teamMember: 'include', organization: 'exclude', }, unaffiliated: { diff --git a/frontend/src/modules/organization/config/saved-views/main.ts b/frontend/src/modules/organization/config/saved-views/main.ts index 7dfbdc4267..377e3d7a84 100644 --- a/frontend/src/modules/organization/config/saved-views/main.ts +++ b/frontend/src/modules/organization/config/saved-views/main.ts @@ -3,13 +3,11 @@ import { organizationDefaultFilterRenderer } from '@/shared/modules/filters/conf import allOrganizations from './views/all-organizations'; import teamOrganization from './settings/teamOrganization/config'; -import hasActivities from './settings/hasActivities/config'; export const organizationSavedViews: SavedViewsConfig = { defaultView: allOrganizations, settings: { teamOrganization, - hasActivities, }, defaultFilters: { render: organizationDefaultFilterRenderer, @@ -42,7 +40,6 @@ export const commonOrganizationSavedViews: SavedViewsConfig = { }, }, settings: { - hasActivities, }, defaultFilters: { render: organizationDefaultFilterRenderer, diff --git a/frontend/src/modules/organization/config/saved-views/settings/hasActivities/config.ts b/frontend/src/modules/organization/config/saved-views/settings/hasActivities/config.ts deleted file mode 100644 index 847f5f6a3c..0000000000 --- a/frontend/src/modules/organization/config/saved-views/settings/hasActivities/config.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { SavedViewsSetting } from '@/shared/modules/saved-views/types/SavedViewsConfig'; - -const hasActivities: SavedViewsSetting = { - inSettings: false, - defaultValue: true, - queryUrlParser(value: string): boolean { - return value === 'true'; - }, - apiFilterRenderer(): any[] { - return [ - { activityCount: { gt: 0 } }, - ]; - }, -}; - -export default hasActivities; diff --git a/frontend/src/modules/organization/config/saved-views/views/all-organizations.ts b/frontend/src/modules/organization/config/saved-views/views/all-organizations.ts index f13c209201..c50a70f89f 100644 --- a/frontend/src/modules/organization/config/saved-views/views/all-organizations.ts +++ b/frontend/src/modules/organization/config/saved-views/views/all-organizations.ts @@ -13,8 +13,7 @@ const allOrganizations: SavedView = { order: 'descending', }, settings: { - teamOrganization: 'exclude', - hasActivities: 'true', + teamOrganization: 'include', }, }, }; diff --git a/frontend/src/shared/modules/filters/config/defaultFilterRenderer/member.defaultFilter.renderer.ts b/frontend/src/shared/modules/filters/config/defaultFilterRenderer/member.defaultFilter.renderer.ts index 40420d9b34..7865eb3121 100644 --- a/frontend/src/shared/modules/filters/config/defaultFilterRenderer/member.defaultFilter.renderer.ts +++ b/frontend/src/shared/modules/filters/config/defaultFilterRenderer/member.defaultFilter.renderer.ts @@ -1,22 +1,17 @@ import { IncludeEnum } from '@/modules/member/config/saved-views/settings/common/types/IncludeEnum'; import { DefaultFiltersSettings } from '@/shared/modules/saved-views/types/SavedViewsConfig'; -export const memberDefaultFilterRenderer = ({ teamMember, bot }: DefaultFiltersSettings) => { - if (teamMember === IncludeEnum.EXCLUDE && bot === IncludeEnum.EXCLUDE) { - return 'Excl. team members and bots'; +export const memberDefaultFilterRenderer = ({ teamMember }: DefaultFiltersSettings) => { + if (teamMember === IncludeEnum.EXCLUDE) { + return 'Excl. team members'; } - if (teamMember === IncludeEnum.EXCLUDE && bot === IncludeEnum.INCLUDE) { - return 'Incl. bots and excl. team members'; - } - - if (teamMember === IncludeEnum.INCLUDE && bot === IncludeEnum.EXCLUDE) { - return 'Incl. team members and excl. bots'; + if (teamMember === IncludeEnum.INCLUDE) { + return 'Incl. team members'; } if (teamMember === IncludeEnum.FILTER) { return 'Team members only'; } - - return 'Incl. team members and bots'; + return ''; }; diff --git a/services/libs/data-access-layer/src/members/base.ts b/services/libs/data-access-layer/src/members/base.ts index 82cef693e7..cbadddaa65 100644 --- a/services/libs/data-access-layer/src/members/base.ts +++ b/services/libs/data-access-layer/src/members/base.ts @@ -82,13 +82,13 @@ const QUERY_FILTER_COLUMN_MAP: Map