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 @@
-
-
-
- Bots visibility
-
-
-
- Exclude bots
-
-
- Include bots
-
-
-
-
-
-
-
-
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