diff --git a/.eslintrc.react.cjs b/.eslintrc.react.cjs index 22000fa33..d91b0d185 100644 --- a/.eslintrc.react.cjs +++ b/.eslintrc.react.cjs @@ -1,3 +1,5 @@ +var path = require('path'); + module.exports = { extends: [ 'plugin:@nx/react', @@ -72,7 +74,9 @@ module.exports = { rules: { 'storybook/no-uninstalled-addons': [ 'error', - { packageJsonLocation: '../../package.json' }, + { + packageJsonLocation: path.resolve(__dirname, './package.json'), + }, ], }, }, diff --git a/.github/workflows/ci-front.yaml b/.github/workflows/ci-front.yaml index ade7d60a0..d295f182b 100644 --- a/.github/workflows/ci-front.yaml +++ b/.github/workflows/ci-front.yaml @@ -74,13 +74,11 @@ jobs: restore-keys: root-node_modules- - name: Install Playwright run: cd packages/twenty-front && npx playwright install - - name: Build Storybook - run: yarn nx storybook:pages:build twenty-front --quiet - name: Run storybook tests run: | - cd packages/twenty-front && npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \ - "npx http-server storybook-static --silent --port 6006" \ - "yarn storybook:pages:coverage" + npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \ + "STORYBOOK_SCOPE=pages npx nx run twenty-front:storybook:static" \ + "npx wait-on tcp:6006 && STORYBOOK_SCOPE=pages npx nx run twenty-front:storybook:test" front-modules-sb-test: needs: front-yarn-install runs-on: ci-4-cores @@ -114,13 +112,11 @@ jobs: restore-keys: root-node_modules- - name: Install Playwright run: cd packages/twenty-front && npx playwright install - - name: Build Storybook - run: yarn nx storybook:modules:build twenty-front --quiet - name: Run storybook tests run: | - cd packages/twenty-front && npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \ - "npx http-server storybook-static --silent --port 6006" \ - "yarn storybook:modules:coverage" + npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \ + "STORYBOOK_SCOPE=modules npx nx run twenty-front:storybook:static" \ + "npx wait-on tcp:6006 && STORYBOOK_SCOPE=modules npx nx run twenty-front:storybook:test" front-lint-tsc: needs: front-yarn-install runs-on: ubuntu-latest @@ -149,13 +145,13 @@ jobs: key: root-node_modules-${{hashFiles('yarn.lock')}} restore-keys: root-node_modules- - name: UI / Run linter - run: yarn nx lint twenty-ui + run: npx nx lint twenty-ui - name: UI / Run Typescript Check - run: yarn nx typecheck twenty-ui + run: npx nx run twenty-ui:typecheck:ci - name: Front / Run linter - run: yarn nx lint:ci twenty-front + run: npx nx run twenty-front:lint:ci - name: Front / Run Typescript Check - run: yarn nx tsc:ci twenty-front + run: npx nx run twenty-front:typecheck:ci front-jest: needs: front-yarn-install runs-on: ubuntu-latest @@ -184,4 +180,4 @@ jobs: key: root-node_modules-${{hashFiles('yarn.lock')}} restore-keys: root-node_modules- - name: Front / Run jest - run: yarn nx coverage twenty-front + run: npx nx test twenty-front --configuration=ci diff --git a/.gitignore b/.gitignore index 249673d15..68f77baf0 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ coverage dist storybook-static *.tsbuildinfo +.eslintcache diff --git a/nx.json b/nx.json index 95354af93..047ed0ca1 100644 --- a/nx.json +++ b/nx.json @@ -70,7 +70,6 @@ "generators": { "@nx/react": { "application": { - "babel": true, "style": "@emotion/styled", "linter": "eslint", "bundler": "vite", diff --git a/package.json b/package.json index 7d468a915..c09b8d2f5 100644 --- a/package.json +++ b/package.json @@ -270,6 +270,7 @@ "danger": "^11.3.0", "dotenv-cli": "^7.2.1", "drizzle-kit": "^0.20.14", + "esbuild": "^0.20.2", "eslint": "^8.53.0", "eslint-config-next": "14.0.4", "eslint-config-prettier": "^9.1.0", @@ -329,7 +330,7 @@ }, "version": "0.2.1", "scripts": { - "start": "cross-env FORCE_COLOR=true concurrently -n \"twenty-server,twenty-front\" -c \"bgBlue.bold,bgGreen.bold\" \"yarn nx start twenty-server\" \"yarn nx start twenty-front\"" + "start:prod": "cross-env FORCE_COLOR=true concurrently -n \"twenty-server,twenty-front\" -c \"bgBlue.bold,bgGreen.bold\" \"yarn nx start twenty-server\" \"yarn nx start twenty-front\"" }, "workspaces": { "packages": [ diff --git a/packages/twenty-docs/docs/start/local-setup/yarn-setup.mdx b/packages/twenty-docs/docs/start/local-setup/yarn-setup.mdx index 507edb476..7a5903863 100644 --- a/packages/twenty-docs/docs/start/local-setup/yarn-setup.mdx +++ b/packages/twenty-docs/docs/start/local-setup/yarn-setup.mdx @@ -191,6 +191,12 @@ yarn nx start twenty-server yarn nx start twenty-front ``` +Alternatively, you can start both applications at once: +```bash +yarn nx start +# or +yarn nx start twenty +``` + Twenty's server will be up and running at [http://localhost:3000/graphql](http://localhost:3000/graphql). Twenty's frontend will be running at [http://localhost:3001](http://localhost:3001). Just login using the seeded demo account: `tim@apple.dev` (password: `Applecar2025`) to start using Twenty. - diff --git a/packages/twenty-front/.prettierignore b/packages/twenty-front/.prettierignore new file mode 100644 index 000000000..119b3bd00 --- /dev/null +++ b/packages/twenty-front/.prettierignore @@ -0,0 +1,2 @@ +src/generated +src/generated-metadata \ No newline at end of file diff --git a/packages/twenty-front/jest.config.ts b/packages/twenty-front/jest.config.ts index 22f9353df..63c026a8c 100644 --- a/packages/twenty-front/jest.config.ts +++ b/packages/twenty-front/jest.config.ts @@ -1,6 +1,7 @@ import { JestConfigWithTsJest, pathsToModuleNameMapper } from 'ts-jest'; -import { compilerOptions } from './tsconfig.json'; +// eslint-disable-next-line @typescript-eslint/no-var-requires +const tsConfig = require('./tsconfig.json'); const jestConfig: JestConfigWithTsJest = { // to enable logs, comment out the following line @@ -17,7 +18,7 @@ const jestConfig: JestConfigWithTsJest = { '\\.(jpg|jpeg|png|gif|webp|svg|svg\\?react)$': '/__mocks__/imageMock.js', '\\.css$': '/__mocks__/styleMock.js', - ...pathsToModuleNameMapper(compilerOptions.paths), + ...pathsToModuleNameMapper(tsConfig.compilerOptions.paths), }, moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], extensionsToTreatAsEsm: ['.ts', '.tsx'], diff --git a/packages/twenty-front/package.json b/packages/twenty-front/package.json index 3b0195a0c..e72e0ed7a 100644 --- a/packages/twenty-front/package.json +++ b/packages/twenty-front/package.json @@ -4,43 +4,11 @@ "private": true, "type": "module", "scripts": { - "nx": "NX_DEFAULT_PROJECT=twenty-front node ../../node_modules/nx/bin/nx.js", - "start": "npx vite --host", - "start:clean": "yarn start --force", - "build": "yarn tsc && npx vite build && yarn build:inject-runtime-env", - "build:sourcemaps": "VITE_BUILD_SOURCEMAP=true NODE_OPTIONS=--max-old-space-size=3000 yarn build", - "build:inject-runtime-env": "sh ./scripts/inject-runtime-env.sh", - "tsc": "npx tsc --project tsconfig.app.json", - "tsc:ci": "yarn tsc --project tsconfig.json", - "tsc:watch": "yarn tsc --watch", - "tsc:spec": "yarn tsc --project tsconfig.spec.json", - "preview": "vite preview", - "lint": "npx eslint . --report-unused-disable-directives --max-warnings 0 --config .eslintrc.cjs", - "lint:ci": "yarn lint --config .eslintrc-ci.cjs", - "fmt:fix": "prettier --cache --write \"src/**/*.ts\" \"src/**/*.tsx\"", - "fmt": "prettier --check \"src/**/*.ts\" \"src/**/*.tsx\"", - "test": "npx jest", - "test-watch": "jest --watch", - "tsup": "tsup", - "coverage": "jest --coverage", - "storybook:modules:dev": "STORYBOOK_SCOPE=modules yarn storybook:dev", - "storybook:dev": "npx storybook dev -p 6006 --no-open", - "storybook:pages:dev": "STORYBOOK_SCOPE=pages yarn storybook:dev", - "storybook:docs:dev": "STORYBOOK_SCOPE=ui-docs yarn storybook:dev", - "storybook:build": "npx storybook build", - "storybook:modules:build": "STORYBOOK_SCOPE=modules npx nx storybook:build", - "storybook:pages:build": "STORYBOOK_SCOPE=pages npx nx storybook:build", - "storybook:docs:build": "STORYBOOK_SCOPE=ui-docs npx nx storybook:build", - "storybook:test": "test-storybook", - "storybook:test-slow": "test-storybook --maxWorkers=3", - "storybook:test-single-worker": "test-storybook --maxWorkers=1", - "storybook:coverage": "yarn storybook:test-slow --coverage ; npx nyc report --reporter=lcov -t coverage/storybook --report-dir coverage/storybook --check-coverage", - "storybook:modules:coverage": "STORYBOOK_SCOPE=modules yarn storybook:coverage", - "storybook:pages:coverage": "STORYBOOK_SCOPE=pages yarn storybook:coverage", - "graphql:data:generate": "dotenv cross-var graphql-codegen -- --config codegen.cjs", - "graphql:metadata:generate": "dotenv cross-var graphql-codegen -- --config codegen-metadata.cjs", - "chromatic": "cross-var npx chromatic --project-token=$CHROMATIC_PROJECT_TOKEN --build-script-name=storybook:build", - "chromatic:ci": "cross-var npx chromatic --project-token=$CHROMATIC_PROJECT_TOKEN --build-script-name=storybook:build --exit-zero-on-changes" + "build": "npx nx exec -- vite build && sh ./scripts/inject-runtime-env.sh", + "build:sourcemaps": "VITE_BUILD_SOURCEMAP=true NODE_OPTIONS=--max-old-space-size=3000 npx nx build", + "start:prod": "NODE_ENV=production npx nx exec -- vite --host", + "storybook:build": "npx nx exec -- storybook build", + "tsup": "npx nx exec -- tsup" }, "engines": { "node": "^18.17.1", diff --git a/packages/twenty-front/project.json b/packages/twenty-front/project.json new file mode 100644 index 000000000..b0423cfe9 --- /dev/null +++ b/packages/twenty-front/project.json @@ -0,0 +1,159 @@ +{ + "name": "twenty-front", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "targets": { + "build": { + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "{projectRoot}/build" + } + }, + "start": { + "executor": "@nx/vite:dev-server", + "options": { + "buildTarget": "twenty-front:build", + "hmr": true + } + }, + "preview": { + "executor": "@nx/vite:preview-server", + "options": { + "buildTarget": "twenty-front:build", + "port": 3001, + "open": true + } + }, + "typecheck": { + "executor": "nx:run-commands", + "options": { + "cwd": "{projectRoot}", + "command": "tsc -b tsconfig.json", + "incremental": true + }, + "configurations": { + "ci": { "incremental": false }, + "watch": { "watch": true } + } + }, + "lint": { + "executor": "@nx/eslint:lint", + "outputs": ["{options.outputFile}"], + "options": { + "eslintConfig": "{projectRoot}/.eslintrc.cjs", + "ignorePath": "{workspaceRoot}/.gitignore", + "lintFilePatterns": [ + "{projectRoot}/src/**/*.{ts,tsx,json}", + "{projectRoot}/package.json" + ], + "maxWarnings": 0, + "reportUnusedDisableDirectives": "error", + "cache": true + }, + "configurations": { + "ci": { + "eslintConfig": "{projectRoot}/.eslintrc-ci.cjs", + "cache": false + }, + "fix": { + "fix": true + } + } + }, + "fmt": { + "executor": "nx:run-commands", + "inputs": ["{projectRoot}/src/**/*"], + "cache": true, + "options": { + "cwd": "{projectRoot}", + "command": "prettier src --check" + }, + "configurations": { + "fix": { "args": ["--write"] } + } + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{projectRoot}/coverage"], + "options": { + "jestConfig": "{projectRoot}/jest.config.ts", + "coverage": true, + "coverageReporters": ["text-summary"] + }, + "configurations": { + "ci": { + "ci": true, + "maxWorkers": 3 + }, + "coverage": { + "coverageReporters": ["lcov", "text"] + }, + "watch": { "watch": true } + } + }, + "storybook:dev": { + "executor": "@nx/storybook:storybook", + "options": { + "port": 6006, + "configDir": "{projectRoot}/.storybook" + } + }, + "storybook:static": { + "executor": "@nx/web:file-server", + "options": { + "buildTarget": "twenty-front:storybook:build", + "staticFilePath": "{projectRoot}/storybook-static", + "port": 6006, + "watch": false + } + }, + "storybook:test": { + "executor": "nx:run-commands", + "options": { + "cwd": "{projectRoot}", + "commands": [ + "test-storybook --url http://localhost:6006 --maxWorkers=3 --coverage", + "nyc report --reporter=lcov --reporter=text-summary -t coverage/storybook --report-dir coverage/storybook --check-coverage" + ], + "parallel": false + }, + "configurations": { + "docs": { + "commands": ["STORYBOOK_SCOPE=ui-docs nx storybook:test"] + }, + "modules": { + "commands": ["STORYBOOK_SCOPE=modules nx storybook:test"] + }, + "pages": { "commands": ["STORYBOOK_SCOPE=pages nx storybook:test"] } + } + }, + "graphql:generate": { + "executor": "nx:run-commands", + "defaultConfiguration": "data", + "options": { + "cwd": "{projectRoot}", + "command": "dotenv cross-var graphql-codegen -- --config={args.config}" + }, + "configurations": { + "data": { + "args": ["--config=codegen.cjs"] + }, + "metadata": { + "args": ["--config=codegen-metadata.cjs"] + } + } + }, + "chromatic": { + "executor": "nx:run-commands", + "options": { + "cwd": "{projectRoot}", + "command": "cross-var chromatic --project-token=$CHROMATIC_PROJECT_TOKEN --build-script-name=storybook:build" + }, + "configurations": { + "ci": { + "args": ["--exit-zero-on-changes"] + } + } + } + } +} diff --git a/packages/twenty-front/src/modules/activities/emails/utils/__tests__/getDisplayNameFromParticipant.test.ts b/packages/twenty-front/src/modules/activities/emails/utils/__tests__/getDisplayNameFromParticipant.test.ts index e7647d869..486da5ead 100644 --- a/packages/twenty-front/src/modules/activities/emails/utils/__tests__/getDisplayNameFromParticipant.test.ts +++ b/packages/twenty-front/src/modules/activities/emails/utils/__tests__/getDisplayNameFromParticipant.test.ts @@ -8,6 +8,7 @@ describe('getDisplayNameFromParticipant', () => { handle: '', role: 'from', person: { + __typename: 'Person', id: '1', createdAt: '', updatedAt: '', @@ -32,6 +33,7 @@ describe('getDisplayNameFromParticipant', () => { companyId: '', }, workspaceMember: { + __typename: 'WorkspaceMember', id: '1', name: { firstName: 'Jane', diff --git a/packages/twenty-front/src/modules/activities/events/utils/__tests__/groupEventsByMonth.test.ts b/packages/twenty-front/src/modules/activities/events/utils/__tests__/groupEventsByMonth.test.ts index 917ece6f6..419e40a58 100644 --- a/packages/twenty-front/src/modules/activities/events/utils/__tests__/groupEventsByMonth.test.ts +++ b/packages/twenty-front/src/modules/activities/events/utils/__tests__/groupEventsByMonth.test.ts @@ -4,7 +4,7 @@ import { groupEventsByMonth } from '../groupEventsByMonth'; describe('groupEventsByMonth', () => { it('should group activities by month', () => { - const grouped = groupEventsByMonth(mockedEvents as unknown as Event[]); + const grouped = groupEventsByMonth(mockedEvents); expect(grouped).toHaveLength(2); expect(grouped[0].items).toHaveLength(1); diff --git a/packages/twenty-front/src/modules/activities/hooks/__tests__/useCreateActivityInCache.test.tsx b/packages/twenty-front/src/modules/activities/hooks/__tests__/useCreateActivityInCache.test.tsx index a23ee3b4e..dc8677e34 100644 --- a/packages/twenty-front/src/modules/activities/hooks/__tests__/useCreateActivityInCache.test.tsx +++ b/packages/twenty-front/src/modules/activities/hooks/__tests__/useCreateActivityInCache.test.tsx @@ -83,12 +83,10 @@ describe('useCreateActivityInCache', () => { act(() => { const res = result.current.createActivityInCache({ type: 'Note', - targetableObjects: [ - { - targetObjectNameSingular: 'person', - id: '1234', - }, - ], + targetObject: { + targetObjectNameSingular: 'person', + id: '1234', + }, }); expect(res.createdActivityInCache).toHaveProperty('id'); diff --git a/packages/twenty-front/src/modules/auth/hooks/__test__/useOnboardingStatus.test.ts b/packages/twenty-front/src/modules/auth/hooks/__test__/useOnboardingStatus.test.ts index c57337c91..625ff0a1d 100644 --- a/packages/twenty-front/src/modules/auth/hooks/__test__/useOnboardingStatus.test.ts +++ b/packages/twenty-front/src/modules/auth/hooks/__test__/useOnboardingStatus.test.ts @@ -4,7 +4,10 @@ import { RecoilRoot, useSetRecoilState } from 'recoil'; import { useOnboardingStatus } from '@/auth/hooks/useOnboardingStatus'; import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState'; -import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState'; +import { + CurrentWorkspace, + currentWorkspaceState, +} from '@/auth/states/currentWorkspaceState'; import { isVerifyPendingState } from '@/auth/states/isVerifyPendingState'; import { tokenPairState } from '@/auth/states/tokenPairState'; import { billingState } from '@/client-config/states/billingState'; @@ -84,7 +87,7 @@ describe('useOnboardingStatus', () => { setCurrentWorkspace({ ...currentWorkspace, subscriptionStatus: 'incomplete', - }); + } as CurrentWorkspace); setCurrentWorkspaceMember(currentWorkspaceMember); }); @@ -106,7 +109,7 @@ describe('useOnboardingStatus', () => { setCurrentWorkspace({ ...currentWorkspace, subscriptionStatus: 'canceled', - }); + } as CurrentWorkspace); setCurrentWorkspaceMember({ ...currentWorkspaceMember, name: { @@ -130,7 +133,7 @@ describe('useOnboardingStatus', () => { ...currentWorkspace, activationStatus: 'inactive', subscriptionStatus: 'active', - }); + } as CurrentWorkspace); }); expect(result.current.onboardingStatus).toBe( @@ -153,7 +156,7 @@ describe('useOnboardingStatus', () => { setCurrentWorkspace({ ...currentWorkspace, subscriptionStatus: 'active', - }); + } as CurrentWorkspace); setCurrentWorkspaceMember(currentWorkspaceMember); }); @@ -175,7 +178,7 @@ describe('useOnboardingStatus', () => { setCurrentWorkspace({ ...currentWorkspace, subscriptionStatus: 'active', - }); + } as CurrentWorkspace); setCurrentWorkspaceMember({ ...currentWorkspaceMember, name: { @@ -203,7 +206,7 @@ describe('useOnboardingStatus', () => { setCurrentWorkspace({ ...currentWorkspace, subscriptionStatus: 'past_due', - }); + } as CurrentWorkspace); setCurrentWorkspaceMember({ ...currentWorkspaceMember, name: { @@ -231,7 +234,7 @@ describe('useOnboardingStatus', () => { setCurrentWorkspace({ ...currentWorkspace, subscriptionStatus: 'unpaid', - }); + } as CurrentWorkspace); setCurrentWorkspaceMember({ ...currentWorkspaceMember, name: { diff --git a/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts b/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts index 4e0a90b7e..f1d6de304 100644 --- a/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts +++ b/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts @@ -84,77 +84,77 @@ export const mocks = [ query: gql` mutation CreateOneFavorite($input: FavoriteCreateInput!) { createFavorite(data: $input) { - __typename - id - companyId - createdAt - personId - person { - __typename - xLink { - label - url + __typename + id + companyId + createdAt + personId + person { + __typename + xLink { + label + url + } + id + createdAt + city + email + jobTitle + name { + firstName + lastName + } + phone + linkedinLink { + label + url + } + updatedAt + avatarUrl + companyId + } + position + workspaceMemberId + workspaceMember { + __typename + colorScheme + name { + firstName + lastName + } + locale + userId + avatarUrl + createdAt + updatedAt + id + } + company { + __typename + xLink { + label + url + } + linkedinLink { + label + url + } + domainName + annualRecurringRevenue { + amountMicros + currencyCode + } + createdAt + address + updatedAt + name + accountOwnerId + employees + id + idealCustomerProfile + } + updatedAt } - id - createdAt - city - email - jobTitle - name { - firstName - lastName - } - phone - linkedinLink { - label - url - } - updatedAt - avatarUrl - companyId - } - position - workspaceMemberId - workspaceMember { - __typename - colorScheme - name { - firstName - lastName - } - locale - userId - avatarUrl - createdAt - updatedAt - id - } - company { - __typename - xLink { - label - url - } - linkedinLink { - label - url - } - domainName - annualRecurringRevenue { - amountMicros - currencyCode - } - createdAt - address - updatedAt - name - accountOwnerId - employees - id - idealCustomerProfile - } - updatedAt - } } `, variables: { @@ -201,77 +201,77 @@ export const mocks = [ $input: FavoriteUpdateInput! ) { updateFavorite(id: $idToUpdate, data: $input) { - __typename - id - companyId - createdAt - personId - person { - __typename - xLink { - label - url + __typename + id + companyId + createdAt + personId + person { + __typename + xLink { + label + url + } + id + createdAt + city + email + jobTitle + name { + firstName + lastName + } + phone + linkedinLink { + label + url + } + updatedAt + avatarUrl + companyId + } + position + workspaceMemberId + workspaceMember { + __typename + colorScheme + name { + firstName + lastName + } + locale + userId + avatarUrl + createdAt + updatedAt + id + } + company { + __typename + xLink { + label + url + } + linkedinLink { + label + url + } + domainName + annualRecurringRevenue { + amountMicros + currencyCode + } + createdAt + address + updatedAt + name + accountOwnerId + employees + id + idealCustomerProfile + } + updatedAt } - id - createdAt - city - email - jobTitle - name { - firstName - lastName - } - phone - linkedinLink { - label - url - } - updatedAt - avatarUrl - companyId - } - position - workspaceMemberId - workspaceMember { - __typename - colorScheme - name { - firstName - lastName - } - locale - userId - avatarUrl - createdAt - updatedAt - id - } - company { - __typename - xLink { - label - url - } - linkedinLink { - label - url - } - domainName - annualRecurringRevenue { - amountMicros - currencyCode - } - createdAt - address - updatedAt - name - accountOwnerId - employees - id - idealCustomerProfile - } - updatedAt - } } `, variables: { diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/useCreateOneObjectMetadataItem.ts b/packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/useCreateOneObjectMetadataItem.ts index 61df6cf56..5546f979d 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/useCreateOneObjectMetadataItem.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__mocks__/useCreateOneObjectMetadataItem.ts @@ -22,28 +22,38 @@ export const query = gql` `; export const findManyViewsQuery = gql` - query FindManyViews($filter: ViewFilterInput, $orderBy: ViewOrderByInput, $lastCursor: String, $limit: Float) { - views(filter: $filter, orderBy: $orderBy, first: $limit, after: $lastCursor) { - edges { - node { - __typename - id - objectMetadataId - type - createdAt - name - updatedAt - } - cursor + query FindManyViews( + $filter: ViewFilterInput + $orderBy: ViewOrderByInput + $lastCursor: String + $limit: Float + ) { + views( + filter: $filter + orderBy: $orderBy + first: $limit + after: $lastCursor + ) { + edges { + node { + __typename + id + objectMetadataId + type + createdAt + name + updatedAt } - pageInfo { - hasNextPage - startCursor - endCursor - } - totalCount + cursor } + pageInfo { + hasNextPage + startCursor + endCursor + } + totalCount } + } `; export const variables = { diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useCreateOneRelationMetadataItem.test.tsx b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useCreateOneRelationMetadataItem.test.tsx index 2d9b7f3e3..6465d628a 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useCreateOneRelationMetadataItem.test.tsx +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useCreateOneRelationMetadataItem.test.tsx @@ -4,7 +4,7 @@ import { act, renderHook } from '@testing-library/react'; import { RecoilRoot } from 'recoil'; import { useCreateOneRelationMetadataItem } from '@/object-metadata/hooks/useCreateOneRelationMetadataItem'; -import { RelationMetadataType } from '~/generated/graphql'; +import { FieldMetadataType, RelationMetadataType } from '~/generated/graphql'; import { query, @@ -45,6 +45,7 @@ describe('useCreateOneRelationMetadataItem', () => { relationType: RelationMetadataType.OneToOne, field: { label: 'label', + type: FieldMetadataType.Relation, }, objectMetadataId: 'objectMetadataId', connect: { diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFieldMetadataItem.test.tsx b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFieldMetadataItem.test.tsx index d35e7bb60..f74c788ff 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFieldMetadataItem.test.tsx +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFieldMetadataItem.test.tsx @@ -159,6 +159,7 @@ describe('useFieldMetadataItem', () => { const res = await result.current.editMetadataField({ id: fieldMetadataItem.id, label: 'New label', + type: FieldMetadataType.Text, }); expect(res.data).toEqual({ diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateManyRecords.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateManyRecords.ts index 87cab48ba..d0a867d70 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateManyRecords.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateManyRecords.ts @@ -6,27 +6,27 @@ export const query = gql` mutation CreatePeople($data: [PersonCreateInput!]!) { createPeople(data: $data) { __typename - xLink { - label - url - } - id - createdAt - city - email - jobTitle - name { - firstName - lastName - } - phone - linkedinLink { - label - url - } - updatedAt - avatarUrl - companyId + xLink { + label + url + } + id + createdAt + city + email + jobTitle + name { + firstName + lastName + } + phone + linkedinLink { + label + url + } + updatedAt + avatarUrl + companyId } } `; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateOneRecord.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateOneRecord.ts index 764a78610..a4db064fa 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateOneRecord.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useCreateOneRecord.ts @@ -4,27 +4,27 @@ export const query = gql` mutation CreateOnePerson($input: PersonCreateInput!) { createPerson(data: $input) { __typename - xLink { - label - url - } - id - createdAt - city - email - jobTitle - name { - firstName - lastName - } - phone - linkedinLink { - label - url - } - updatedAt - avatarUrl - companyId + xLink { + label + url + } + id + createdAt + city + email + jobTitle + name { + firstName + lastName + } + phone + linkedinLink { + label + url + } + updatedAt + avatarUrl + companyId } } `; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useExecuteQuickActionOnOneRecord.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useExecuteQuickActionOnOneRecord.ts index 7f096be5f..e4b1d6755 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useExecuteQuickActionOnOneRecord.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useExecuteQuickActionOnOneRecord.ts @@ -6,27 +6,27 @@ export const query = gql` mutation ExecuteQuickActionOnOnePerson($idToExecuteQuickActionOn: UUID!) { executeQuickActionOnPerson(id: $idToExecuteQuickActionOn) { __typename - xLink { - label - url - } - id - createdAt - city - email - jobTitle - name { - firstName - lastName - } - phone - linkedinLink { - label - url - } - updatedAt - avatarUrl - companyId + xLink { + label + url + } + id + createdAt + city + email + jobTitle + name { + firstName + lastName + } + phone + linkedinLink { + label + url + } + updatedAt + avatarUrl + companyId } } `; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindOneRecord.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindOneRecord.ts index d0907398b..6e3e02cad 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindOneRecord.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindOneRecord.ts @@ -6,27 +6,27 @@ export const query = gql` query FindOnePerson($objectRecordId: UUID!) { person(filter: { id: { eq: $objectRecordId } }) { __typename - xLink { - label - url - } - id - createdAt - city - email - jobTitle - name { - firstName - lastName - } - phone - linkedinLink { - label - url - } - updatedAt - avatarUrl - companyId + xLink { + label + url + } + id + createdAt + city + email + jobTitle + name { + firstName + lastName + } + phone + linkedinLink { + label + url + } + updatedAt + avatarUrl + companyId } } `; diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useUpdateOneRecord.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useUpdateOneRecord.ts index 6b86c1a9f..e8a185f7f 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useUpdateOneRecord.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useUpdateOneRecord.ts @@ -4,27 +4,27 @@ export const query = gql` mutation UpdateOnePerson($idToUpdate: UUID!, $input: PersonUpdateInput!) { updatePerson(id: $idToUpdate, data: $input) { __typename - xLink { - label - url - } - id - createdAt - city - email - jobTitle - name { - firstName - lastName - } - phone - linkedinLink { - label - url - } - updatedAt - avatarUrl - companyId + xLink { + label + url + } + id + createdAt + city + email + jobTitle + name { + firstName + lastName + } + phone + linkedinLink { + label + url + } + updatedAt + avatarUrl + companyId } } `; diff --git a/packages/twenty-front/src/modules/object-record/record-field/types/FieldDefinition.ts b/packages/twenty-front/src/modules/object-record/record-field/types/FieldDefinition.ts index 9316293d8..0b5499658 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/types/FieldDefinition.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/types/FieldDefinition.ts @@ -23,5 +23,5 @@ export type FieldDefinition = { type: FieldMetadataType; metadata: T; infoTooltipContent?: string; - defaultValue: any; + defaultValue?: any; }; diff --git a/packages/twenty-front/src/modules/object-record/record-field/utils/__tests__/isFieldValueEmpty.test.ts b/packages/twenty-front/src/modules/object-record/record-field/utils/__tests__/isFieldValueEmpty.test.ts index f70cdf855..47fe78332 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/utils/__tests__/isFieldValueEmpty.test.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/utils/__tests__/isFieldValueEmpty.test.ts @@ -8,6 +8,7 @@ import { } from '@/object-record/record-field/__mocks__/fieldDefinitions'; import { FieldDefinition } from '@/object-record/record-field/types/FieldDefinition'; import { FieldCurrencyMetadata } from '@/object-record/record-field/types/FieldMetadata'; +import { FieldMetadataType } from '~/generated/graphql'; import { isFieldValueEmpty } from '../isFieldValueEmpty'; @@ -64,7 +65,7 @@ describe('isFieldValueEmpty', () => { fieldMetadataId, label: 'Annual Income', iconName: 'cashCow', - type: 'CURRENCY', + type: FieldMetadataType.Currency, metadata: { fieldName: 'annualIncome', placeHolder: '100000', diff --git a/packages/twenty-front/src/modules/object-record/record-table/contexts/RecordTableRowContext.ts b/packages/twenty-front/src/modules/object-record/record-table/contexts/RecordTableRowContext.ts index b57932023..4322e26f7 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/contexts/RecordTableRowContext.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/contexts/RecordTableRowContext.ts @@ -1,6 +1,6 @@ import { createContext } from 'react'; -type RecordTableRowContextProps = { +export type RecordTableRowContextProps = { pathToShowPage: string; recordId: string; rowIndex: number; diff --git a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/__mocks__/cell.ts b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/__mocks__/cell.ts index 1f8ddd25b..e4d84e248 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/__mocks__/cell.ts +++ b/packages/twenty-front/src/modules/object-record/record-table/record-table-cell/hooks/__mocks__/cell.ts @@ -1,12 +1,14 @@ import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; +import { RecordTableRowContextProps } from '@/object-record/record-table/contexts/RecordTableRowContext'; import { ColumnDefinition } from '@/object-record/record-table/types/ColumnDefinition'; import { FieldMetadataType } from '~/generated-metadata/graphql'; -export const recordTableRow = { +export const recordTableRow: RecordTableRowContextProps = { rowIndex: 2, isSelected: false, recordId: 'recordId', pathToShowPage: '/', + isReadOnly: false, }; export const recordTableCell: { diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useLimitPerMetadataItem.test.tsx b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useLimitPerMetadataItem.test.tsx index bc30a5a0c..95cdddcda 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useLimitPerMetadataItem.test.tsx +++ b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useLimitPerMetadataItem.test.tsx @@ -20,6 +20,7 @@ describe('useLimitPerMetadataItem', () => { isActive: true, isCustom: true, isSystem: true, + isRemote: false, labelPlural: 'labelPlural', labelSingular: 'labelSingular', namePlural: 'namePlural', diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectSearch.test.tsx b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectSearch.test.tsx index fa85d8629..6e37e73e5 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectSearch.test.tsx +++ b/packages/twenty-front/src/modules/object-record/relation-picker/hooks/__tests__/useMultiObjectSearch.test.tsx @@ -118,6 +118,7 @@ describe('useMultiObjectSearch', () => { isActive: true, isCustom: true, isSystem: false, + isRemote: false, labelPlural: 'labelPlural', labelSingular: 'labelSingular', namePlural: 'namePlural', @@ -152,6 +153,7 @@ describe('useMultiObjectSearch', () => { isActive: true, isCustom: true, isSystem: false, + isRemote: false, labelPlural: 'labelPlural', labelSingular: 'labelSingular', namePlural: 'namePlural', diff --git a/packages/twenty-front/src/modules/search/hooks/__tests__/useFilteredSearchEntityQuery.test.tsx b/packages/twenty-front/src/modules/search/hooks/__tests__/useFilteredSearchEntityQuery.test.tsx index 57a93cdec..51c781600 100644 --- a/packages/twenty-front/src/modules/search/hooks/__tests__/useFilteredSearchEntityQuery.test.tsx +++ b/packages/twenty-front/src/modules/search/hooks/__tests__/useFilteredSearchEntityQuery.test.tsx @@ -72,6 +72,7 @@ describe('useFilteredSearchEntityQuery', () => { setCurrentWorkspaceMember({ id: '32219445-f587-4c40-b2b1-6d3205ed96da', name: { firstName: 'John', lastName: 'Connor' }, + locale: 'en', }); const mockObjectMetadataItems = getObjectMetadataItemsMock(); diff --git a/packages/twenty-front/src/modules/ui/input/button/components/__stories__/Button.docs.mdx b/packages/twenty-front/src/modules/ui/input/button/components/__stories__/Button.docs.mdx index 7fd6a3eba..45f2ef33f 100644 --- a/packages/twenty-front/src/modules/ui/input/button/components/__stories__/Button.docs.mdx +++ b/packages/twenty-front/src/modules/ui/input/button/components/__stories__/Button.docs.mdx @@ -21,8 +21,7 @@ Buttons are often used for form submissions and to toggle elements into view. ## Usage ```js - import { Button } from '@/ui/button/components/Button'; -