From 5aaca2b7aa1c420af832c9766626cdaa9730e9b0 Mon Sep 17 00:00:00 2001 From: Keith Williams Date: Fri, 25 Apr 2025 21:46:49 -0300 Subject: [PATCH] revert: "feat: add membership creation date to Organization Member List table (CAL-5406) (#20595)" (#20978) This reverts commit d21f7ccbc8e5d82fb2ca0b3644818f24bc59ad20. --- apps/web/playwright/out-of-office.e2e.ts | 4 +- apps/web/public/static/locales/en/common.json | 3 -- apps/web/test/lib/generateCsv.test.ts | 2 - .../components/filters/ActiveFilters.tsx | 1 - .../components/filters/DateRangeFilter.tsx | 29 ++--------- packages/features/data-table/lib/server.ts | 14 ------ packages/features/data-table/lib/types.ts | 3 +- .../UserTable/PlatformManagedUsersTable.tsx | 6 +-- .../components/UserTable/UserListTable.tsx | 47 +----------------- .../migration.sql | 2 - packages/prisma/schema.prisma | 2 - packages/prisma/seed-insights.ts | 4 -- .../organizations/listMembers.handler.ts | 49 +------------------ 13 files changed, 14 insertions(+), 152 deletions(-) delete mode 100644 packages/prisma/migrations/20250407204810_add_membership_creation_date/migration.sql diff --git a/apps/web/playwright/out-of-office.e2e.ts b/apps/web/playwright/out-of-office.e2e.ts index 3290994ec7..2dc6ee8be5 100644 --- a/apps/web/playwright/out-of-office.e2e.ts +++ b/apps/web/playwright/out-of-office.e2e.ts @@ -660,7 +660,9 @@ test.describe("Out of office", () => { await page.locator('[data-testid="add-filter-button"]').click(); await page.locator('[data-testid="add-filter-item-dateRange"]').click(); await expect( - page.locator('[data-testid="filter-popover-trigger-dateRange"]', { hasText: "Last 7 Days" }).first() + page + .locator('[data-testid="filter-popover-trigger-dateRange"] span', { hasText: "Last 7 Days" }) + .nth(0) ).toBeVisible(); }); diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json index b23a9f51b6..1949e5c654 100644 --- a/apps/web/public/static/locales/en/common.json +++ b/apps/web/public/static/locales/en/common.json @@ -3093,9 +3093,6 @@ "enable_delegation_credential_description": "Grant Cal.com automatic access to the calendars of all organization members by enabling delegation credential.", "disable_delegation_credential": "Disable Delegation Credential", "disable_delegation_credential_description": "Once delegation credential is disabled, organization members who haven’t connected their calendars will need to do so manually.", - "last_active": "Last Active", - "member_since": "Member Since", - "last_updated": "Last Updated", "salesforce_on_cancel_write_to_event": "On cancelled booking, write to event record instead of deleting event", "salesforce_on_every_cancellation": "On every cancellation", "report_issue": "Report issue", diff --git a/apps/web/test/lib/generateCsv.test.ts b/apps/web/test/lib/generateCsv.test.ts index 65987d2415..3c0b1309f6 100644 --- a/apps/web/test/lib/generateCsv.test.ts +++ b/apps/web/test/lib/generateCsv.test.ts @@ -68,8 +68,6 @@ describe("generate Csv for Org Users Table", () => { teams: [], attributes: [], lastActiveAt: "", - createdAt: null, - updatedAt: null, }; it("should throw if no headers", () => { diff --git a/packages/features/data-table/components/filters/ActiveFilters.tsx b/packages/features/data-table/components/filters/ActiveFilters.tsx index 23cd495931..cb7781e3c4 100644 --- a/packages/features/data-table/components/filters/ActiveFilters.tsx +++ b/packages/features/data-table/components/filters/ActiveFilters.tsx @@ -30,7 +30,6 @@ export function ActiveFilters({ table }: ActiveFiltersProps) { key={column.id} column={column} options={column.dateRangeOptions} - showColumnName showClearButton /> ); diff --git a/packages/features/data-table/components/filters/DateRangeFilter.tsx b/packages/features/data-table/components/filters/DateRangeFilter.tsx index 2456400bbd..0988e5c5eb 100644 --- a/packages/features/data-table/components/filters/DateRangeFilter.tsx +++ b/packages/features/data-table/components/filters/DateRangeFilter.tsx @@ -5,7 +5,6 @@ import { useState, useEffect, useCallback } from "react"; import dayjs from "@calcom/dayjs"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import classNames from "@calcom/ui/classNames"; -import { Badge } from "@calcom/ui/components/badge"; import { Button, buttonClasses } from "@calcom/ui/components/button"; import { Command, @@ -36,21 +35,14 @@ import { useFilterPopoverOpen } from "./useFilterPopoverOpen"; type DateRangeFilterProps = { column: Extract; options?: DateRangeFilterOptions; - showColumnName?: boolean; showClearButton?: boolean; }; -export const DateRangeFilter = ({ - column, - options, - showColumnName = false, - showClearButton = false, -}: DateRangeFilterProps) => { +export const DateRangeFilter = ({ column, options, showClearButton = false }: DateRangeFilterProps) => { const { open, onOpenChange } = useFilterPopoverOpen(column.id); const filterValue = useFilterValue(column.id, ZDateRangeFilterValue); const { updateFilter, removeFilter } = useDataTable(); const range = options?.range ?? "past"; - const endOfDay = options?.endOfDay ?? false; const forceCustom = range === "custom"; const forcePast = range === "past"; @@ -81,13 +73,13 @@ export const DateRangeFilter = ({ type: ColumnFilterType.DATE_RANGE, data: { startDate: startDate.toDate().toISOString(), - endDate: (endOfDay ? endDate.endOf("day") : endDate).toDate().toISOString(), + endDate: endDate.toDate().toISOString(), preset: preset.value, }, }); } }, - [column.id, endOfDay] + [column.id] ); useEffect(() => { @@ -145,10 +137,6 @@ export const DateRangeFilter = ({ customButtonLabel = `${format(startDate.toDate(), "LLL dd, y")} - ?`; } - const selectedValue = isCustomPreset - ? customButtonLabel - : t(selectedPreset.labelKey, selectedPreset.i18nOptions); - return ( @@ -158,15 +146,8 @@ export const DateRangeFilter = ({ StartIcon="calendar-range" EndIcon="chevron-down" data-testid={`filter-popover-trigger-${column.id}`}> - {showColumnName && ( - <> - {column.title} - - {selectedValue} - - - )} - {!showColumnName && {selectedValue}} + {!isCustomPreset && {t(selectedPreset.labelKey, selectedPreset.i18nOptions)}} + {isCustomPreset && {customButtonLabel}} diff --git a/packages/features/data-table/lib/server.ts b/packages/features/data-table/lib/server.ts index 1547653f5b..1baa98979e 100644 --- a/packages/features/data-table/lib/server.ts +++ b/packages/features/data-table/lib/server.ts @@ -4,7 +4,6 @@ import { isMultiSelectFilterValue, isTextFilterValue, isNumberFilterValue, - isDateRangeFilterValue, } from "./utils"; type MakeWhereClauseProps = { @@ -155,19 +154,6 @@ export function makeWhereClause(props: MakeWhereClauseProps) { default: throw new Error(`Invalid operator for number filter: ${operator}`); } - } else if (isDateRangeFilterValue(filterValue)) { - const { startDate, endDate } = filterValue.data; - if (!startDate || !endDate) { - throw new Error(`Invalid date range filter: ${JSON.stringify({ columnName, startDate, endDate })}`); - } - - return { - [columnName]: { - ...jsonPathObj, - gte: startDate, - lte: endDate, - }, - }; } throw new Error(`Invalid filter type: ${JSON.stringify({ columnName, filterValue })}`); } diff --git a/packages/features/data-table/lib/types.ts b/packages/features/data-table/lib/types.ts index 2d85785b09..f7e1603647 100644 --- a/packages/features/data-table/lib/types.ts +++ b/packages/features/data-table/lib/types.ts @@ -113,8 +113,7 @@ export const ZFilterValue = z.union([ ]); export type DateRangeFilterOptions = { - range?: "past" | "custom"; - endOfDay?: boolean; + range: "past" | "custom"; }; export type TextFilterOptions = { diff --git a/packages/features/users/components/UserTable/PlatformManagedUsersTable.tsx b/packages/features/users/components/UserTable/PlatformManagedUsersTable.tsx index 8743f44f53..4391da1fd6 100644 --- a/packages/features/users/components/UserTable/PlatformManagedUsersTable.tsx +++ b/packages/features/users/components/UserTable/PlatformManagedUsersTable.tsx @@ -131,7 +131,7 @@ function UserListTableContent({ oAuthClientId }: PlatformManagedUsersTableProps) enableHiding: false, size: 200, header: () => { - return t("managed_users"); + return `Managed Users`; }, cell: ({ row }) => { if (isPending) { @@ -166,7 +166,7 @@ function UserListTableContent({ oAuthClientId }: PlatformManagedUsersTableProps) { id: "role", accessorFn: (data) => data.role, - header: t("role"), + header: "Role", size: 100, cell: ({ row, table }) => { if (isPending) { @@ -188,7 +188,7 @@ function UserListTableContent({ oAuthClientId }: PlatformManagedUsersTableProps) { id: "teams", accessorFn: (data) => data.teams.map((team) => team.name), - header: t("teams"), + header: "Teams", size: 140, cell: ({ row, table }) => { if (isPending) { diff --git a/packages/features/users/components/UserTable/UserListTable.tsx b/packages/features/users/components/UserTable/UserListTable.tsx index 694e377f1b..e885b57f30 100644 --- a/packages/features/users/components/UserTable/UserListTable.tsx +++ b/packages/features/users/components/UserTable/UserListTable.tsx @@ -74,8 +74,6 @@ const initalColumnVisibility = { member: true, role: true, teams: true, - createdAt: false, - updatedAt: false, actions: true, }; @@ -368,52 +366,9 @@ function UserListTableContent() { ...generateAttributeColumns(), { id: "lastActiveAt", - accessorKey: "lastActiveAt", - header: t("last_active"), - enableSorting: false, - enableColumnFilter: true, - meta: { - filter: { - type: ColumnFilterType.DATE_RANGE, - dateRangeOptions: { - endOfDay: true, - }, - }, - }, + header: "Last Active", cell: ({ row }) =>
{row.original.lastActiveAt}
, }, - { - id: "createdAt", - accessorKey: "createdAt", - header: t("member_since"), - enableSorting: false, - enableColumnFilter: true, - meta: { - filter: { - type: ColumnFilterType.DATE_RANGE, - dateRangeOptions: { - endOfDay: true, - }, - }, - }, - cell: ({ row }) =>
{row.original.createdAt || ""}
, - }, - { - id: "updatedAt", - accessorKey: "updatedAt", - header: t("last_updated"), - enableSorting: false, - enableColumnFilter: true, - meta: { - filter: { - type: ColumnFilterType.DATE_RANGE, - dateRangeOptions: { - endOfDay: true, - }, - }, - }, - cell: ({ row }) =>
{row.original.updatedAt || ""}
, - }, { id: "actions", enableHiding: false, diff --git a/packages/prisma/migrations/20250407204810_add_membership_creation_date/migration.sql b/packages/prisma/migrations/20250407204810_add_membership_creation_date/migration.sql deleted file mode 100644 index dbc42dcf7d..0000000000 --- a/packages/prisma/migrations/20250407204810_add_membership_creation_date/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE "Membership" ADD COLUMN "createdAt" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP, - ADD COLUMN "updatedAt" TIMESTAMP(3); diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma index 6c646f5f71..22ec5085d8 100644 --- a/packages/prisma/schema.prisma +++ b/packages/prisma/schema.prisma @@ -546,8 +546,6 @@ model Membership { user User @relation(fields: [userId], references: [id], onDelete: Cascade) disableImpersonation Boolean @default(false) AttributeToUser AttributeToUser[] - createdAt DateTime? @default(now()) - updatedAt DateTime? @updatedAt @@unique([userId, teamId]) @@index([teamId]) diff --git a/packages/prisma/seed-insights.ts b/packages/prisma/seed-insights.ts index c145dd8dcc..1b1b6749ef 100644 --- a/packages/prisma/seed-insights.ts +++ b/packages/prisma/seed-insights.ts @@ -188,8 +188,6 @@ async function main() { userId: member.user.id, role: member.role, accepted: true, - createdAt: new Date(), - updatedAt: new Date(), })), }); } @@ -426,8 +424,6 @@ async function createPerformanceData() { userId: memberId.id, role: "MEMBER", accepted: true, - createdAt: new Date(), - updatedAt: new Date(), })), }); diff --git a/packages/trpc/server/routers/viewer/organizations/listMembers.handler.ts b/packages/trpc/server/routers/viewer/organizations/listMembers.handler.ts index b5a6cbcd3b..bd28cf47e8 100644 --- a/packages/trpc/server/routers/viewer/organizations/listMembers.handler.ts +++ b/packages/trpc/server/routers/viewer/organizations/listMembers.handler.ts @@ -83,15 +83,6 @@ export const listMembersHandler = async ({ ctx, input }: GetOptions) => { const teamFilter = filters.find((filter) => filter.id === "teams") as | TypedColumnFilter | undefined; - const lastActiveAtFilter = filters.find((filter) => filter.id === "lastActiveAt") as - | TypedColumnFilter - | undefined; - const createdAtFilter = filters.find((filter) => filter.id === "createdAt") as - | TypedColumnFilter - | undefined; - const updatedAtFilter = filters.find((filter) => filter.id === "updatedAt") as - | TypedColumnFilter - | undefined; const whereClause: Prisma.MembershipWhereInput = { user: { @@ -106,11 +97,6 @@ export const listMembersHandler = async ({ ctx, input }: GetOptions) => { }, }, }), - ...(lastActiveAtFilter && - makeWhereClause({ - columnName: "lastActiveAt", - filterValue: lastActiveAtFilter.value, - })), }, teamId: organizationId, ...(searchTerm && { @@ -126,27 +112,10 @@ export const listMembersHandler = async ({ ctx, input }: GetOptions) => { columnName: "role", filterValue: roleFilter.value, })), - ...(createdAtFilter && - makeWhereClause({ - columnName: "createdAt", - filterValue: createdAtFilter.value, - })), - ...(updatedAtFilter && - makeWhereClause({ - columnName: "updatedAt", - filterValue: updatedAtFilter.value, - })), }; const attributeFilters: Prisma.MembershipWhereInput["AttributeToUser"][] = filters - .filter( - (filter) => - filter.id !== "role" && - filter.id !== "teams" && - filter.id !== "lastActiveAt" && - filter.id !== "createdAt" && - filter.id !== "updatedAt" - ) + .filter((filter) => filter.id !== "role" && filter.id !== "teams") .map((filter) => { if (filter.value.type === ColumnFilterType.MULTI_SELECT && isAllString(filter.value.data)) { const attributeOptionValues: string[] = []; @@ -194,8 +163,6 @@ export const listMembersHandler = async ({ ctx, input }: GetOptions) => { id: true, role: true, accepted: true, - createdAt: true, - updatedAt: true, user: { select: { id: true, @@ -282,20 +249,6 @@ export const listMembersHandler = async ({ ctx, input }: GetOptions) => { .format(membership.user.lastActiveAt) .toLowerCase() : null, - createdAt: membership.createdAt - ? new Intl.DateTimeFormat(ctx.user.locale, { - timeZone: ctx.user.timeZone, - }) - .format(membership.createdAt) - .toLowerCase() - : null, - updatedAt: membership.updatedAt - ? new Intl.DateTimeFormat(ctx.user.locale, { - timeZone: ctx.user.timeZone, - }) - .format(membership.updatedAt) - .toLowerCase() - : null, avatarUrl: user.avatarUrl, teams: user.teams .filter((team) => team.team.id !== organizationId) // In this context we dont want to return the org team