mirror of
https://github.com/twentyhq/twenty
synced 2026-04-21 13:37:22 +00:00
This PR introduces refactors and tradeoffs in the API around the events of field input. # Refactored usePersistField The hook `usePersistField` has been refactored to be used anywhere in the app, not just inside a FieldContext. This was meant to solve a bug at the beginning but now it is just used once in `RecordDetailRelationSection` outside of the context, still this is better to have this hook like that for future use cases. We also introduce `usePersistFieldFromFieldInputContext`, for an easier API inside a FieldContext. # Introduced a new `FieldInputEventContext` To remove the drill-down of events, we introduce `FieldInputEventContext`, this allows to set only once the handlers / events. In practice it allows to have an easier time maintaining the events for the many different field inputs, because it matches the pattern we already use of taking everything from a context (`FieldContext`). # Removed drill-down from FieldInput The heavy drill-down in FieldInput has been completely removed, since everything can be derived from `FieldContext` and `FieldInputEventContext`. Also there was some readonly and other specific props, but they were all drilled down from FieldContext, so it was easier to just use FieldContext where needed. # Refactored events of `MultiItemFieldInputProps` The component `MultiItemFieldInputProps` has a contrived API, here we just remove the complex part that was persisting from inside. We now only give a classic API with `onChange` and `onEscape` the rest is left to higher levels, where it should be, because this generic component shouldn't be aware of persisting things. # Extracted the parsing logic of persisted values For each input field component, we now have a clear util that was before bound to the persist call, # Tradeoff with persist times The tradeoff before was that persistField was called anywhere, before exiting the component sometimes, now it is only called by the higher levels like table or show page, which handles this abstraction. This could be challenged, however I think that having a lot of different events, and not just `handleSubmit` and `handleCancel`, convey enough meaning for the higher levels to decide what to do in each case. A `skipPersist` argument was added in events in the rare edge cases where we want to voluntarily skip persisting even with a submit or escape, but that could be challenged because we could also say that we should use cancel for that and stick to that convention. # Handling of the bug in `ActivityRichTextEditor` Initially this refactor was prioritized for solving this bug, which was very annoying for the users. But while fixing it with the new persistField hook I just understood that the problem is not just for record title cells but for anything that is open when we click on a rich text editor. The issue is described here : https://github.com/twentyhq/core-team-issues/issues/1317 So right now I just let it as is. # Stories The stories were checking that a request was sent in some cases where persist was called before a component exiting, now that persist is only called by higher-levels I just removed those tests from the stories, because that should be the responsibility of higher levels. Also a helper `getFieldInputEventContextProviderWithJestMocks` was created that exposes a context and jest mock functions for testing this new API in stories. # Miscellaneous Deactivated tui with nx by default, because it can be annoying.
374 lines
No EOL
9.1 KiB
JSON
374 lines
No EOL
9.1 KiB
JSON
{
|
|
"workspaceLayout": {
|
|
"appsDir": "packages",
|
|
"libsDir": "packages"
|
|
},
|
|
"namedInputs": {
|
|
"default": [
|
|
"{projectRoot}/**/*"
|
|
],
|
|
"excludeStories": [
|
|
"default",
|
|
"!{projectRoot}/.storybook/*",
|
|
"!{projectRoot}/**/tsconfig.storybook.json",
|
|
"!{projectRoot}/**/*.stories.(ts|tsx)",
|
|
"!{projectRoot}/**/__stories__/*"
|
|
],
|
|
"excludeTests": [
|
|
"default",
|
|
"!{projectRoot}/**/jest.config.(js|ts)",
|
|
"!{projectRoot}/**/tsconfig.spec.json",
|
|
"!{projectRoot}/**/*.test.(ts|tsx)",
|
|
"!{projectRoot}/**/*.spec.(ts|tsx)",
|
|
"!{projectRoot}/**/*.integration-spec.ts",
|
|
"!{projectRoot}/**/__tests__/*"
|
|
],
|
|
"production": [
|
|
"default",
|
|
"excludeStories",
|
|
"excludeTests",
|
|
"!{projectRoot}/**/__mocks__/*",
|
|
"!{projectRoot}/**/testing/*"
|
|
]
|
|
},
|
|
"targetDefaults": {
|
|
"build": {
|
|
"cache": true,
|
|
"inputs": [
|
|
"^production",
|
|
"production"
|
|
],
|
|
"dependsOn": [
|
|
"^build"
|
|
]
|
|
},
|
|
"start": {
|
|
"cache": true,
|
|
"dependsOn": [
|
|
"^build"
|
|
]
|
|
},
|
|
"lint": {
|
|
"executor": "@nx/eslint:lint",
|
|
"cache": true,
|
|
"outputs": [
|
|
"{options.outputFile}"
|
|
],
|
|
"options": {
|
|
"eslintConfig": "{projectRoot}/eslint.config.js",
|
|
"cache": true,
|
|
"cacheLocation": "{workspaceRoot}/.cache/eslint"
|
|
},
|
|
"configurations": {
|
|
"ci": {
|
|
"cacheStrategy": "content"
|
|
},
|
|
"fix": {
|
|
"fix": true
|
|
}
|
|
},
|
|
"dependsOn": [
|
|
"^build"
|
|
]
|
|
},
|
|
"fmt": {
|
|
"executor": "nx:run-commands",
|
|
"cache": true,
|
|
"options": {
|
|
"cwd": "{projectRoot}",
|
|
"command": "prettier {args.files} --check --cache {args.cache} --cache-location {args.cacheLocation} --write {args.write} --cache-strategy {args.cacheStrategy}",
|
|
"cache": true,
|
|
"cacheLocation": "../../.cache/prettier/{projectRoot}",
|
|
"cacheStrategy": "metadata",
|
|
"write": false
|
|
},
|
|
"configurations": {
|
|
"ci": {
|
|
"cacheStrategy": "content"
|
|
},
|
|
"fix": {
|
|
"write": true
|
|
}
|
|
},
|
|
"dependsOn": [
|
|
"^build"
|
|
]
|
|
},
|
|
"typecheck": {
|
|
"executor": "nx:run-commands",
|
|
"cache": true,
|
|
"options": {
|
|
"cwd": "{projectRoot}",
|
|
"command": "tsc -b tsconfig.json --incremental"
|
|
},
|
|
"configurations": {
|
|
"watch": {
|
|
"watch": true
|
|
}
|
|
},
|
|
"dependsOn": [
|
|
"^build"
|
|
]
|
|
},
|
|
"test": {
|
|
"executor": "@nx/jest:jest",
|
|
"cache": true,
|
|
"dependsOn": [
|
|
"^build"
|
|
],
|
|
"inputs": [
|
|
"^default",
|
|
"excludeStories",
|
|
"{workspaceRoot}/jest.preset.js"
|
|
],
|
|
"outputs": [
|
|
"{projectRoot}/coverage"
|
|
],
|
|
"options": {
|
|
"jestConfig": "{projectRoot}/jest.config.ts",
|
|
"coverage": true,
|
|
"coverageReporters": [
|
|
"text-summary"
|
|
],
|
|
"cacheDirectory": "../../.cache/jest/{projectRoot}"
|
|
},
|
|
"configurations": {
|
|
"ci": {
|
|
"ci": true,
|
|
"maxWorkers": 3
|
|
},
|
|
"coverage": {
|
|
"coverageReporters": [
|
|
"lcov",
|
|
"text"
|
|
]
|
|
},
|
|
"watch": {
|
|
"watch": true
|
|
}
|
|
}
|
|
},
|
|
"test:e2e": {
|
|
"cache": true,
|
|
"dependsOn": [
|
|
"^build"
|
|
]
|
|
},
|
|
"storybook:build": {
|
|
"executor": "nx:run-commands",
|
|
"cache": true,
|
|
"inputs": [
|
|
"^default",
|
|
"excludeTests"
|
|
],
|
|
"outputs": [
|
|
"{projectRoot}/{options.output-dir}"
|
|
],
|
|
"options": {
|
|
"cwd": "{projectRoot}",
|
|
"command": "VITE_DISABLE_TYPESCRIPT_CHECKER=true VITE_DISABLE_ESLINT_CHECKER=true storybook build --test",
|
|
"output-dir": "storybook-static",
|
|
"config-dir": ".storybook"
|
|
},
|
|
"dependsOn": [
|
|
"^build"
|
|
]
|
|
},
|
|
"storybook:serve:dev": {
|
|
"executor": "nx:run-commands",
|
|
"cache": true,
|
|
"dependsOn": [
|
|
"^build"
|
|
],
|
|
"options": {
|
|
"cwd": "{projectRoot}",
|
|
"command": "storybook dev",
|
|
"config-dir": ".storybook"
|
|
}
|
|
},
|
|
"storybook:serve:static": {
|
|
"executor": "nx:run-commands",
|
|
"dependsOn": [
|
|
"storybook:build"
|
|
],
|
|
"options": {
|
|
"cwd": "{projectRoot}",
|
|
"command": "npx http-server {args.staticDir} -a={args.host} --port={args.port} --silent={args.silent}",
|
|
"staticDir": "storybook-static",
|
|
"host": "localhost",
|
|
"port": 6006,
|
|
"silent": true
|
|
}
|
|
},
|
|
"storybook:test": {
|
|
"executor": "nx:run-commands",
|
|
"cache": true,
|
|
"inputs": [
|
|
"^default",
|
|
"excludeTests"
|
|
],
|
|
"outputs": [
|
|
"{projectRoot}/coverage/storybook"
|
|
],
|
|
"options": {
|
|
"cwd": "{projectRoot}",
|
|
"commands": [
|
|
"test-storybook --url http://localhost:{args.port} --maxWorkers=3 --coverage --coverageDirectory={args.coverageDir} --shard={args.shard}",
|
|
"nx storybook:coverage {projectName} --coverageDir={args.coverageDir} --checkCoverage={args.checkCoverage}"
|
|
],
|
|
"shard": "1/1",
|
|
"parallel": false,
|
|
"coverageDir": "coverage/storybook",
|
|
"port": 6006,
|
|
"checkCoverage": true
|
|
}
|
|
},
|
|
"storybook:test:no-coverage": {
|
|
"executor": "nx:run-commands",
|
|
"inputs": [
|
|
"^default",
|
|
"excludeTests"
|
|
],
|
|
"options": {
|
|
"cwd": "{projectRoot}",
|
|
"commands": [
|
|
"test-storybook --url http://localhost:{args.port} --maxWorkers=2"
|
|
],
|
|
"port": 6006
|
|
}
|
|
},
|
|
"storybook:coverage": {
|
|
"executor": "nx:run-commands",
|
|
"cache": true,
|
|
"inputs": [
|
|
"^default",
|
|
"excludeTests",
|
|
"{projectRoot}/coverage/storybook/coverage-storybook.json"
|
|
],
|
|
"outputs": [
|
|
"{projectRoot}/coverage/storybook",
|
|
"!{projectRoot}/coverage/storybook/coverage-storybook.json"
|
|
],
|
|
"options": {
|
|
"command": "npx nyc report --reporter={args.reporter} --reporter=text-summary -t {args.coverageDir} --report-dir {args.coverageDir} --check-coverage={args.checkCoverage} --cwd={projectRoot}",
|
|
"coverageDir": "coverage/storybook",
|
|
"reporter": "lcov",
|
|
"checkCoverage": true
|
|
},
|
|
"configurations": {
|
|
"text": {
|
|
"reporter": "text"
|
|
}
|
|
}
|
|
},
|
|
"storybook:serve-and-test:static": {
|
|
"executor": "nx:run-commands",
|
|
"options": {
|
|
"commands": [
|
|
"npx concurrently --kill-others --success=first -n SB,TEST 'nx storybook:serve:static {projectName} --port={args.port}' 'npx wait-on tcp:{args.port} && nx storybook:test {projectName} --shard={args.shard} --checkCoverage={args.checkCoverage} --port={args.port} --configuration={args.scope}'"
|
|
],
|
|
"shard": "1/1",
|
|
"checkCoverage": true,
|
|
"port": 6006
|
|
}
|
|
},
|
|
"chromatic": {
|
|
"executor": "nx:run-commands",
|
|
"options": {
|
|
"cwd": "{projectRoot}",
|
|
"commands": [
|
|
{
|
|
"command": "nx storybook:build {projectName}",
|
|
"forwardAllArgs": false
|
|
},
|
|
"cross-var chromatic --project-token=$CHROMATIC_PROJECT_TOKEN --storybook-build-dir=storybook-static {args.ci}"
|
|
],
|
|
"parallel": false
|
|
},
|
|
"configurations": {
|
|
"ci": {
|
|
"ci": "--exit-zero-on-changes"
|
|
}
|
|
}
|
|
},
|
|
"@nx/jest:jest": {
|
|
"cache": true,
|
|
"inputs": [
|
|
"^default",
|
|
"excludeStories",
|
|
"{workspaceRoot}/jest.preset.js"
|
|
],
|
|
"options": {
|
|
"passWithNoTests": true
|
|
},
|
|
"configurations": {
|
|
"ci": {
|
|
"ci": true,
|
|
"codeCoverage": true
|
|
}
|
|
}
|
|
},
|
|
"@nx/eslint:lint": {
|
|
"cache": true,
|
|
"inputs": [
|
|
"default",
|
|
"{workspaceRoot}/eslint.config.js",
|
|
"{workspaceRoot}/tools/eslint-rules/**/*"
|
|
]
|
|
},
|
|
"@nx/vite:test": {
|
|
"cache": true,
|
|
"inputs": [
|
|
"default",
|
|
"^default"
|
|
]
|
|
},
|
|
"@nx/vite:build": {
|
|
"cache": true,
|
|
"dependsOn": [
|
|
"^build"
|
|
],
|
|
"inputs": [
|
|
"default",
|
|
"^default"
|
|
]
|
|
}
|
|
},
|
|
"installation": {
|
|
"version": "21.3.11"
|
|
},
|
|
"generators": {
|
|
"@nx/react": {
|
|
"application": {
|
|
"style": "@emotion/styled",
|
|
"linter": "eslint",
|
|
"bundler": "vite",
|
|
"compiler": "swc",
|
|
"unitTestRunner": "jest",
|
|
"projectNameAndRootFormat": "derived"
|
|
},
|
|
"library": {
|
|
"style": "@emotion/styled",
|
|
"linter": "eslint",
|
|
"bundler": "vite",
|
|
"compiler": "swc",
|
|
"unitTestRunner": "jest",
|
|
"projectNameAndRootFormat": "derived"
|
|
},
|
|
"component": {
|
|
"style": "@emotion/styled"
|
|
}
|
|
}
|
|
},
|
|
"tasksRunnerOptions": {
|
|
"default": {
|
|
"options": {
|
|
"cacheableOperations": [
|
|
"storybook:build"
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"useInferencePlugins": false,
|
|
"defaultBase": "main"
|
|
} |