mirror of
https://github.com/twentyhq/twenty.git
synced 2024-10-05 05:17:40 +03:00
feat: onboarding & profile edition (#507)
* feat: wip onboarding * fix: generate graphql front * wip: onboarding * feat: login/register and edit profile * fix: unused import * fix: test * Use DEBUG_MODE instead of STAGE and mute typescript depth exceed errors * Fix seeds * Fix onboarding when coming from google * Fix * Fix lint * Fix ci * Fix tests --------- Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
parent
0b7a023f3d
commit
1144bd13ed
4
.github/workflows/ci-front.yaml
vendored
4
.github/workflows/ci-front.yaml
vendored
@ -36,12 +36,12 @@ jobs:
|
|||||||
- name: Front / Run linter
|
- name: Front / Run linter
|
||||||
run: cd front && yarn lint
|
run: cd front && yarn lint
|
||||||
- name: Front / Build Storybook
|
- name: Front / Build Storybook
|
||||||
run: cd front && yarn build-storybook --quiet
|
run: cd front && yarn storybook:build --quiet
|
||||||
- name: Front / Run storybook tests
|
- name: Front / Run storybook tests
|
||||||
run: |
|
run: |
|
||||||
cd front && npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \
|
cd front && npx concurrently -k -s first -n "SB,TEST" -c "magenta,blue" \
|
||||||
"npx http-server storybook-static --silent --port 6006" \
|
"npx http-server storybook-static --silent --port 6006" \
|
||||||
"yarn coverage-storybook"
|
"yarn storybook:coverage"
|
||||||
- name: Front / Run jest tests
|
- name: Front / Run jest tests
|
||||||
run: |
|
run: |
|
||||||
cd front && yarn test
|
cd front && yarn test
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
"js-cookie": "^3.0.5",
|
"js-cookie": "^3.0.5",
|
||||||
"jwt-decode": "^3.1.2",
|
"jwt-decode": "^3.1.2",
|
||||||
"libphonenumber-js": "^1.10.26",
|
"libphonenumber-js": "^1.10.26",
|
||||||
|
"lodash.debounce": "^4.0.8",
|
||||||
"luxon": "^3.3.0",
|
"luxon": "^3.3.0",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
"react-datepicker": "^4.11.0",
|
"react-datepicker": "^4.11.0",
|
||||||
@ -46,10 +47,12 @@
|
|||||||
"test": "craco test",
|
"test": "craco test",
|
||||||
"coverage": "craco test --coverage .",
|
"coverage": "craco test --coverage .",
|
||||||
"lint": "eslint src --max-warnings=0",
|
"lint": "eslint src --max-warnings=0",
|
||||||
"storybook": "storybook dev -p 6006 -s ../public",
|
"storybook:dev": "storybook dev -p 6006 -s ../public",
|
||||||
"test-storybook": "test-storybook",
|
"storybook:test": "test-storybook",
|
||||||
"build-storybook": "storybook build -s public",
|
"storybook:build": "storybook build -s public",
|
||||||
"coverage-storybook": "test-storybook --coverage && npx nyc report --reporter=lcov -t coverage/storybook --report-dir coverage/storybook --check-coverage",
|
"storybook:coverage": "test-storybook --coverage && npx nyc report --reporter=lcov -t coverage/storybook --report-dir coverage/storybook --check-coverage",
|
||||||
|
"build-storybook": "yarn storybook:build",
|
||||||
|
"coverage-storybook": "yarn storybook:coverage",
|
||||||
"graphql:generate": "dotenv cross-var graphql-codegen --config codegen.js",
|
"graphql:generate": "dotenv cross-var graphql-codegen --config codegen.js",
|
||||||
"chromatic": "dotenv cross-var npx chromatic --project-token=$CHROMATIC_PROJECT_TOKEN"
|
"chromatic": "dotenv cross-var npx chromatic --project-token=$CHROMATIC_PROJECT_TOKEN"
|
||||||
},
|
},
|
||||||
@ -115,6 +118,7 @@
|
|||||||
"@testing-library/user-event": "^13.5.0",
|
"@testing-library/user-event": "^13.5.0",
|
||||||
"@types/jest": "^27.5.2",
|
"@types/jest": "^27.5.2",
|
||||||
"@types/js-cookie": "^3.0.3",
|
"@types/js-cookie": "^3.0.3",
|
||||||
|
"@types/lodash.debounce": "^4.0.7",
|
||||||
"@types/luxon": "^3.3.0",
|
"@types/luxon": "^3.3.0",
|
||||||
"@types/react-datepicker": "^4.11.2",
|
"@types/react-datepicker": "^4.11.2",
|
||||||
"@types/scroll-into-view": "^1.16.0",
|
"@types/scroll-into-view": "^1.16.0",
|
||||||
|
@ -2,8 +2,8 @@ import { Navigate, Route, Routes, useLocation } from 'react-router-dom';
|
|||||||
import { AnimatePresence, LayoutGroup } from 'framer-motion';
|
import { AnimatePresence, LayoutGroup } from 'framer-motion';
|
||||||
|
|
||||||
import { useTrackPageView } from '@/analytics/hooks/useTrackPageView';
|
import { useTrackPageView } from '@/analytics/hooks/useTrackPageView';
|
||||||
import { RequireAuth } from '@/auth/components/RequireAuth';
|
import { RequireOnboarded } from '@/auth/components/RequireOnboarded';
|
||||||
import { RequireNotAuth } from '@/auth/components/RequireNotAuth';
|
import { RequireOnboarding } from '@/auth/components/RequireOnboarding';
|
||||||
import { AuthModal } from '@/auth/components/ui/Modal';
|
import { AuthModal } from '@/auth/components/ui/Modal';
|
||||||
import { useGoToHotkeys } from '@/hotkeys/hooks/useGoToHotkeys';
|
import { useGoToHotkeys } from '@/hotkeys/hooks/useGoToHotkeys';
|
||||||
import { AuthLayout } from '@/ui/layout/AuthLayout';
|
import { AuthLayout } from '@/ui/layout/AuthLayout';
|
||||||
@ -52,10 +52,20 @@ export function App() {
|
|||||||
return (
|
return (
|
||||||
<DefaultLayout>
|
<DefaultLayout>
|
||||||
<Routes>
|
<Routes>
|
||||||
|
<Route
|
||||||
|
path="auth/*"
|
||||||
|
element={
|
||||||
|
<RequireOnboarding>
|
||||||
|
<AuthLayout>
|
||||||
|
<AuthRoutes />
|
||||||
|
</AuthLayout>
|
||||||
|
</RequireOnboarding>
|
||||||
|
}
|
||||||
|
/>
|
||||||
<Route
|
<Route
|
||||||
path="*"
|
path="*"
|
||||||
element={
|
element={
|
||||||
<RequireAuth>
|
<RequireOnboarded>
|
||||||
<Routes>
|
<Routes>
|
||||||
<Route path="" element={<Navigate to="/people" replace />} />
|
<Route path="" element={<Navigate to="/people" replace />} />
|
||||||
<Route path="people" element={<People />} />
|
<Route path="people" element={<People />} />
|
||||||
@ -70,17 +80,7 @@ export function App() {
|
|||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
</Routes>
|
</Routes>
|
||||||
</RequireAuth>
|
</RequireOnboarded>
|
||||||
}
|
|
||||||
/>
|
|
||||||
<Route
|
|
||||||
path="auth/*"
|
|
||||||
element={
|
|
||||||
<RequireNotAuth>
|
|
||||||
<AuthLayout>
|
|
||||||
<AuthRoutes />
|
|
||||||
</AuthLayout>
|
|
||||||
</RequireNotAuth>
|
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
</Routes>
|
</Routes>
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,9 +1,16 @@
|
|||||||
import { useEffect, useMemo, useRef } from 'react';
|
import { useEffect, useMemo, useRef } from 'react';
|
||||||
import { InMemoryCache, NormalizedCacheObject } from '@apollo/client';
|
import {
|
||||||
|
ApolloLink,
|
||||||
|
InMemoryCache,
|
||||||
|
NormalizedCacheObject,
|
||||||
|
} from '@apollo/client';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState } from 'recoil';
|
||||||
|
|
||||||
|
import { isMockModeState } from '@/auth/states/isMockModeState';
|
||||||
import { tokenPairState } from '@/auth/states/tokenPairState';
|
import { tokenPairState } from '@/auth/states/tokenPairState';
|
||||||
import { CommentThreadTarget } from '~/generated/graphql';
|
import { CommentThreadTarget } from '~/generated/graphql';
|
||||||
|
import { mockedCompaniesData } from '~/testing/mock-data/companies';
|
||||||
|
import { mockedUsersData } from '~/testing/mock-data/users';
|
||||||
|
|
||||||
import { ApolloFactory } from '../services/apollo.factory';
|
import { ApolloFactory } from '../services/apollo.factory';
|
||||||
|
|
||||||
@ -11,8 +18,22 @@ export function useApolloFactory() {
|
|||||||
const apolloRef = useRef<ApolloFactory<NormalizedCacheObject> | null>(null);
|
const apolloRef = useRef<ApolloFactory<NormalizedCacheObject> | null>(null);
|
||||||
|
|
||||||
const [tokenPair, setTokenPair] = useRecoilState(tokenPairState);
|
const [tokenPair, setTokenPair] = useRecoilState(tokenPairState);
|
||||||
|
const [isMockMode] = useRecoilState(isMockModeState);
|
||||||
|
|
||||||
const apolloClient = useMemo(() => {
|
const apolloClient = useMemo(() => {
|
||||||
|
const mockLink = new ApolloLink((operation, forward) => {
|
||||||
|
return forward(operation).map((response) => {
|
||||||
|
if (operation.operationName === 'GetCompanies') {
|
||||||
|
return { data: { companies: mockedCompaniesData } };
|
||||||
|
}
|
||||||
|
if (operation.operationName === 'GetCurrentUser') {
|
||||||
|
return { data: { currentUser: mockedUsersData[0] } };
|
||||||
|
}
|
||||||
|
|
||||||
|
return response;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
apolloRef.current = new ApolloFactory({
|
apolloRef.current = new ApolloFactory({
|
||||||
uri: `${process.env.REACT_APP_API_URL}`,
|
uri: `${process.env.REACT_APP_API_URL}`,
|
||||||
cache: new InMemoryCache({
|
cache: new InMemoryCache({
|
||||||
@ -42,10 +63,11 @@ export function useApolloFactory() {
|
|||||||
onUnauthenticatedError() {
|
onUnauthenticatedError() {
|
||||||
setTokenPair(null);
|
setTokenPair(null);
|
||||||
},
|
},
|
||||||
|
extraLinks: isMockMode ? [mockLink] : [],
|
||||||
});
|
});
|
||||||
|
|
||||||
return apolloRef.current.getClient();
|
return apolloRef.current.getClient();
|
||||||
}, [setTokenPair]);
|
}, [isMockMode, setTokenPair]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (apolloRef.current) {
|
if (apolloRef.current) {
|
||||||
|
@ -1,44 +0,0 @@
|
|||||||
import { useMemo } from 'react';
|
|
||||||
import {
|
|
||||||
ApolloClient,
|
|
||||||
ApolloLink,
|
|
||||||
createHttpLink,
|
|
||||||
from,
|
|
||||||
InMemoryCache,
|
|
||||||
} from '@apollo/client';
|
|
||||||
|
|
||||||
import { mockedCompaniesData } from '~/testing/mock-data/companies';
|
|
||||||
import { mockedUsersData } from '~/testing/mock-data/users';
|
|
||||||
|
|
||||||
export default function useApolloMocked() {
|
|
||||||
const mockedClient = useMemo(() => {
|
|
||||||
const apiLink = createHttpLink({
|
|
||||||
uri: `${process.env.REACT_APP_API_URL}`,
|
|
||||||
});
|
|
||||||
|
|
||||||
const mockLink = new ApolloLink((operation, forward) => {
|
|
||||||
return forward(operation).map((response) => {
|
|
||||||
if (operation.operationName === 'GetCompanies') {
|
|
||||||
return { data: { companies: mockedCompaniesData } };
|
|
||||||
}
|
|
||||||
if (operation.operationName === 'GetCurrentUser') {
|
|
||||||
return { data: { users: [mockedUsersData[0]] } };
|
|
||||||
}
|
|
||||||
|
|
||||||
return response;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
return new ApolloClient({
|
|
||||||
link: from([mockLink, apiLink]),
|
|
||||||
cache: new InMemoryCache(),
|
|
||||||
defaultOptions: {
|
|
||||||
query: {
|
|
||||||
fetchPolicy: 'cache-first',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return mockedClient;
|
|
||||||
}
|
|
@ -11,31 +11,24 @@ import { GraphQLErrors } from '@apollo/client/errors';
|
|||||||
import { setContext } from '@apollo/client/link/context';
|
import { setContext } from '@apollo/client/link/context';
|
||||||
import { onError } from '@apollo/client/link/error';
|
import { onError } from '@apollo/client/link/error';
|
||||||
import { RetryLink } from '@apollo/client/link/retry';
|
import { RetryLink } from '@apollo/client/link/retry';
|
||||||
import { Observable } from '@apollo/client/utilities';
|
|
||||||
|
|
||||||
import { renewToken } from '@/auth/services/AuthService';
|
import { renewToken } from '@/auth/services/AuthService';
|
||||||
import { AuthTokenPair } from '~/generated/graphql';
|
import { AuthTokenPair } from '~/generated/graphql';
|
||||||
|
|
||||||
import { loggerLink } from '../../utils/apollo-logger';
|
import { loggerLink } from '../../utils/apollo-logger';
|
||||||
import { assertNotNull } from '../../utils/assert';
|
import { assertNotNull } from '../../utils/assert';
|
||||||
import { promiseToObservable } from '../../utils/promise-to-observable';
|
|
||||||
import { ApolloManager } from '../interfaces/apolloManager.interface';
|
import { ApolloManager } from '../interfaces/apolloManager.interface';
|
||||||
|
|
||||||
const logger = loggerLink(() => 'Twenty');
|
const logger = loggerLink(() => 'Twenty');
|
||||||
|
|
||||||
let isRefreshing = false;
|
let isRefreshing = false;
|
||||||
let pendingRequests: (() => void)[] = [];
|
|
||||||
|
|
||||||
const resolvePendingRequests = () => {
|
|
||||||
pendingRequests.map((callback) => callback());
|
|
||||||
pendingRequests = [];
|
|
||||||
};
|
|
||||||
|
|
||||||
export interface Options<TCacheShape> extends ApolloClientOptions<TCacheShape> {
|
export interface Options<TCacheShape> extends ApolloClientOptions<TCacheShape> {
|
||||||
onError?: (err: GraphQLErrors | undefined) => void;
|
onError?: (err: GraphQLErrors | undefined) => void;
|
||||||
onNetworkError?: (err: Error | ServerParseError | ServerError) => void;
|
onNetworkError?: (err: Error | ServerParseError | ServerError) => void;
|
||||||
onTokenPairChange?: (tokenPair: AuthTokenPair) => void;
|
onTokenPairChange?: (tokenPair: AuthTokenPair) => void;
|
||||||
onUnauthenticatedError?: () => void;
|
onUnauthenticatedError?: () => void;
|
||||||
|
extraLinks?: ApolloLink[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ApolloFactory<TCacheShape> implements ApolloManager<TCacheShape> {
|
export class ApolloFactory<TCacheShape> implements ApolloManager<TCacheShape> {
|
||||||
@ -49,6 +42,7 @@ export class ApolloFactory<TCacheShape> implements ApolloManager<TCacheShape> {
|
|||||||
onNetworkError,
|
onNetworkError,
|
||||||
onTokenPairChange,
|
onTokenPairChange,
|
||||||
onUnauthenticatedError,
|
onUnauthenticatedError,
|
||||||
|
extraLinks,
|
||||||
...options
|
...options
|
||||||
} = opts;
|
} = opts;
|
||||||
|
|
||||||
@ -86,38 +80,22 @@ export class ApolloFactory<TCacheShape> implements ApolloManager<TCacheShape> {
|
|||||||
for (const graphQLError of graphQLErrors) {
|
for (const graphQLError of graphQLErrors) {
|
||||||
switch (graphQLError?.extensions?.code) {
|
switch (graphQLError?.extensions?.code) {
|
||||||
case 'UNAUTHENTICATED': {
|
case 'UNAUTHENTICATED': {
|
||||||
// error code is set to UNAUTHENTICATED
|
|
||||||
// when AuthenticationError thrown in resolver
|
|
||||||
let forward$: Observable<boolean>;
|
|
||||||
|
|
||||||
if (!isRefreshing) {
|
if (!isRefreshing) {
|
||||||
isRefreshing = true;
|
isRefreshing = true;
|
||||||
forward$ = promiseToObservable(
|
renewToken(uri, this.tokenPair)
|
||||||
renewToken(uri, this.tokenPair)
|
.then((tokens) => {
|
||||||
.then((tokens) => {
|
onTokenPairChange?.(tokens);
|
||||||
onTokenPairChange?.(tokens);
|
return true;
|
||||||
resolvePendingRequests();
|
})
|
||||||
return true;
|
.catch(() => {
|
||||||
})
|
onUnauthenticatedError?.();
|
||||||
.catch(() => {
|
return false;
|
||||||
pendingRequests = [];
|
})
|
||||||
onUnauthenticatedError?.();
|
.finally(() => {
|
||||||
return false;
|
isRefreshing = false;
|
||||||
})
|
});
|
||||||
.finally(() => {
|
|
||||||
isRefreshing = false;
|
|
||||||
}),
|
|
||||||
).filter((value) => Boolean(value));
|
|
||||||
} else {
|
|
||||||
// Will only emit once the Promise is resolved
|
|
||||||
forward$ = promiseToObservable(
|
|
||||||
new Promise<boolean>((resolve) => {
|
|
||||||
pendingRequests.push(() => resolve(true));
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
return forward(operation);
|
||||||
return forward$.flatMap(() => forward(operation));
|
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
if (process.env.NODE_ENV === 'development') {
|
if (process.env.NODE_ENV === 'development') {
|
||||||
@ -148,6 +126,7 @@ export class ApolloFactory<TCacheShape> implements ApolloManager<TCacheShape> {
|
|||||||
[
|
[
|
||||||
errorLink,
|
errorLink,
|
||||||
authLink,
|
authLink,
|
||||||
|
...(extraLinks ? extraLinks : []),
|
||||||
// Only show logger in dev mode
|
// Only show logger in dev mode
|
||||||
process.env.NODE_ENV !== 'production' ? logger : null,
|
process.env.NODE_ENV !== 'production' ? logger : null,
|
||||||
retryLink,
|
retryLink,
|
||||||
|
@ -1,56 +0,0 @@
|
|||||||
import { useEffect } from 'react';
|
|
||||||
import { useNavigate } from 'react-router-dom';
|
|
||||||
import { keyframes } from '@emotion/react';
|
|
||||||
import styled from '@emotion/styled';
|
|
||||||
|
|
||||||
import { useIsLogged } from '../hooks/useIsLogged';
|
|
||||||
|
|
||||||
const EmptyContainer = styled.div`
|
|
||||||
align-items: center;
|
|
||||||
display: flex;
|
|
||||||
height: 100%;
|
|
||||||
justify-content: center;
|
|
||||||
width: 100%;
|
|
||||||
`;
|
|
||||||
|
|
||||||
const fadeIn = keyframes`
|
|
||||||
from {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
to {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
const FadeInStyle = styled.div`
|
|
||||||
animation: ${fadeIn} 1s forwards;
|
|
||||||
opacity: 0;
|
|
||||||
`;
|
|
||||||
|
|
||||||
export function RequireAuth({
|
|
||||||
children,
|
|
||||||
}: {
|
|
||||||
children: JSX.Element;
|
|
||||||
}): JSX.Element {
|
|
||||||
const navigate = useNavigate();
|
|
||||||
|
|
||||||
const isLogged = useIsLogged();
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (!isLogged) {
|
|
||||||
navigate('/auth');
|
|
||||||
}
|
|
||||||
}, [isLogged, navigate]);
|
|
||||||
|
|
||||||
if (!isLogged) {
|
|
||||||
return (
|
|
||||||
<EmptyContainer>
|
|
||||||
<FadeInStyle>
|
|
||||||
Please hold on a moment, we're directing you to our login page...
|
|
||||||
</FadeInStyle>
|
|
||||||
</EmptyContainer>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return children;
|
|
||||||
}
|
|
83
front/src/modules/auth/components/RequireOnboarded.tsx
Normal file
83
front/src/modules/auth/components/RequireOnboarded.tsx
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
import { useEffect } from 'react';
|
||||||
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
import { keyframes } from '@emotion/react';
|
||||||
|
import styled from '@emotion/styled';
|
||||||
|
import { useRecoilState } from 'recoil';
|
||||||
|
|
||||||
|
import { captureHotkeyTypeInFocusState } from '@/hotkeys/states/captureHotkeyTypeInFocusState';
|
||||||
|
|
||||||
|
import { useOnboardingStatus } from '../hooks/useOnboardingStatus';
|
||||||
|
import { OnboardingStatus } from '../utils/getOnboardingStatus';
|
||||||
|
|
||||||
|
const EmptyContainer = styled.div`
|
||||||
|
align-items: center;
|
||||||
|
display: flex;
|
||||||
|
height: 100%;
|
||||||
|
justify-content: center;
|
||||||
|
width: 100%;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const fadeIn = keyframes`
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
const FadeInStyle = styled.div`
|
||||||
|
animation: ${fadeIn} 1s forwards;
|
||||||
|
opacity: 0;
|
||||||
|
`;
|
||||||
|
|
||||||
|
export function RequireOnboarded({
|
||||||
|
children,
|
||||||
|
}: {
|
||||||
|
children: JSX.Element;
|
||||||
|
}): JSX.Element {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
const [, setCaptureHotkeyTypeInFocus] = useRecoilState(
|
||||||
|
captureHotkeyTypeInFocusState,
|
||||||
|
);
|
||||||
|
const onboardingStatus = useOnboardingStatus();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (onboardingStatus === OnboardingStatus.OngoingUserCreation) {
|
||||||
|
navigate('/auth');
|
||||||
|
} else if (onboardingStatus === OnboardingStatus.OngoingWorkspaceCreation) {
|
||||||
|
navigate('/auth/create/workspace');
|
||||||
|
} else if (onboardingStatus === OnboardingStatus.OngoingProfileCreation) {
|
||||||
|
navigate('/auth/create/profile');
|
||||||
|
}
|
||||||
|
}, [onboardingStatus, navigate]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (onboardingStatus === OnboardingStatus.Completed) {
|
||||||
|
setCaptureHotkeyTypeInFocus(false);
|
||||||
|
}
|
||||||
|
}, [setCaptureHotkeyTypeInFocus, onboardingStatus]);
|
||||||
|
|
||||||
|
if (onboardingStatus !== OnboardingStatus.Completed) {
|
||||||
|
return (
|
||||||
|
<EmptyContainer>
|
||||||
|
<FadeInStyle>
|
||||||
|
{onboardingStatus === OnboardingStatus.OngoingUserCreation && (
|
||||||
|
<div>
|
||||||
|
Please hold on a moment, we're directing you to our login page...
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{onboardingStatus !== OnboardingStatus.OngoingUserCreation && (
|
||||||
|
<div>
|
||||||
|
Please hold on a moment, we're directing you to our onboarding
|
||||||
|
flow...
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</FadeInStyle>
|
||||||
|
</EmptyContainer>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return children;
|
||||||
|
}
|
@ -3,7 +3,8 @@ import { useNavigate } from 'react-router-dom';
|
|||||||
import { keyframes } from '@emotion/react';
|
import { keyframes } from '@emotion/react';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
|
||||||
import { useIsLogged } from '../hooks/useIsLogged';
|
import { useOnboardingStatus } from '../hooks/useOnboardingStatus';
|
||||||
|
import { OnboardingStatus } from '../utils/getOnboardingStatus';
|
||||||
|
|
||||||
const EmptyContainer = styled.div`
|
const EmptyContainer = styled.div`
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@ -27,22 +28,22 @@ const FadeInStyle = styled.div`
|
|||||||
opacity: 0;
|
opacity: 0;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export function RequireNotAuth({
|
export function RequireOnboarding({
|
||||||
children,
|
children,
|
||||||
}: {
|
}: {
|
||||||
children: JSX.Element;
|
children: JSX.Element;
|
||||||
}): JSX.Element {
|
}): JSX.Element {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
const isLogged = useIsLogged();
|
const onboardingStatus = useOnboardingStatus();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isLogged) {
|
if (onboardingStatus === OnboardingStatus.Completed) {
|
||||||
navigate('/');
|
navigate('/');
|
||||||
}
|
}
|
||||||
}, [isLogged, navigate]);
|
}, [navigate, onboardingStatus]);
|
||||||
|
|
||||||
if (isLogged) {
|
if (onboardingStatus === OnboardingStatus.Completed) {
|
||||||
return (
|
return (
|
||||||
<EmptyContainer>
|
<EmptyContainer>
|
||||||
<FadeInStyle>
|
<FadeInStyle>
|
@ -1,13 +0,0 @@
|
|||||||
import jwt from 'jwt-decode';
|
|
||||||
|
|
||||||
import { AuthTokenPair, useGetCurrentUserQuery } from '~/generated/graphql';
|
|
||||||
|
|
||||||
export function useFetchCurrentUser(tokenPair: AuthTokenPair | null) {
|
|
||||||
const userId = tokenPair?.accessToken.token
|
|
||||||
? jwt<{ sub: string }>(tokenPair.accessToken.token).sub
|
|
||||||
: null;
|
|
||||||
const { data } = useGetCurrentUserQuery({
|
|
||||||
variables: { uuid: userId },
|
|
||||||
});
|
|
||||||
return data?.users?.[0];
|
|
||||||
}
|
|
20
front/src/modules/auth/hooks/useOnboardingStatus.ts
Normal file
20
front/src/modules/auth/hooks/useOnboardingStatus.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { useMemo } from 'react';
|
||||||
|
import { useRecoilState } from 'recoil';
|
||||||
|
|
||||||
|
import { useIsLogged } from '../hooks/useIsLogged';
|
||||||
|
import { currentUserState } from '../states/currentUserState';
|
||||||
|
import {
|
||||||
|
getOnboardingStatus,
|
||||||
|
OnboardingStatus,
|
||||||
|
} from '../utils/getOnboardingStatus';
|
||||||
|
|
||||||
|
export function useOnboardingStatus(): OnboardingStatus {
|
||||||
|
const [currentUser] = useRecoilState(currentUserState);
|
||||||
|
const isLoggedIn = useIsLogged();
|
||||||
|
const onboardingStatus = useMemo(
|
||||||
|
() => getOnboardingStatus(isLoggedIn, currentUser),
|
||||||
|
[currentUser, isLoggedIn],
|
||||||
|
);
|
||||||
|
|
||||||
|
return onboardingStatus;
|
||||||
|
}
|
@ -1,14 +1,8 @@
|
|||||||
import { atom } from 'recoil';
|
import { atom } from 'recoil';
|
||||||
|
|
||||||
import { User, Workspace, WorkspaceMember } from '~/generated/graphql';
|
import { GetCurrentUserQuery } from '~/generated/graphql';
|
||||||
|
|
||||||
type CurrentUser = Pick<User, 'id' | 'email' | 'displayName'> & {
|
export type CurrentUser = GetCurrentUserQuery['currentUser'];
|
||||||
workspaceMember?:
|
|
||||||
| (Pick<WorkspaceMember, 'id'> & {
|
|
||||||
workspace: Pick<Workspace, 'id' | 'displayName' | 'logo'>;
|
|
||||||
})
|
|
||||||
| null;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const currentUserState = atom<CurrentUser | null>({
|
export const currentUserState = atom<CurrentUser | null>({
|
||||||
key: 'currentUserState',
|
key: 'currentUserState',
|
||||||
|
25
front/src/modules/auth/utils/getOnboardingStatus.ts
Normal file
25
front/src/modules/auth/utils/getOnboardingStatus.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import { CurrentUser } from '../states/currentUserState';
|
||||||
|
|
||||||
|
export enum OnboardingStatus {
|
||||||
|
OngoingUserCreation = 'ongoing_user_creation',
|
||||||
|
OngoingWorkspaceCreation = 'ongoing_workspace_creation',
|
||||||
|
OngoingProfileCreation = 'ongoing_profile_creation',
|
||||||
|
Completed = 'completed',
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getOnboardingStatus(
|
||||||
|
isLoggedIn: boolean,
|
||||||
|
currentUser: CurrentUser | null,
|
||||||
|
) {
|
||||||
|
if (!isLoggedIn || !currentUser) {
|
||||||
|
return OnboardingStatus.OngoingUserCreation;
|
||||||
|
}
|
||||||
|
if (!currentUser.workspaceMember?.workspace.displayName) {
|
||||||
|
return OnboardingStatus.OngoingWorkspaceCreation;
|
||||||
|
}
|
||||||
|
if (!currentUser.firstName || !currentUser.lastName) {
|
||||||
|
return OnboardingStatus.OngoingProfileCreation;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OnboardingStatus.Completed;
|
||||||
|
}
|
@ -26,8 +26,6 @@ export function BoardActionBarButtonDeletePipelineProgress() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log('boardItems', boardItems);
|
|
||||||
|
|
||||||
setBoardItems(
|
setBoardItems(
|
||||||
Object.fromEntries(
|
Object.fromEntries(
|
||||||
Object.entries(boardItems).filter(
|
Object.entries(boardItems).filter(
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { debounce } from 'lodash';
|
import debounce from 'lodash.debounce';
|
||||||
|
|
||||||
import { EntityForSelect } from '@/relation-picker/types/EntityForSelect';
|
import { EntityForSelect } from '@/relation-picker/types/EntityForSelect';
|
||||||
import { DropdownMenu } from '@/ui/components/menu/DropdownMenu';
|
import { DropdownMenu } from '@/ui/components/menu/DropdownMenu';
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { debounce } from 'lodash';
|
import debounce from 'lodash.debounce';
|
||||||
|
|
||||||
import { useRecoilScopedState } from '@/recoil-scope/hooks/useRecoilScopedState';
|
import { useRecoilScopedState } from '@/recoil-scope/hooks/useRecoilScopedState';
|
||||||
|
|
||||||
|
@ -12,7 +12,11 @@ import {
|
|||||||
|
|
||||||
type SelectStringKeys<T> = NonNullable<
|
type SelectStringKeys<T> = NonNullable<
|
||||||
{
|
{
|
||||||
[K in keyof T]: T[K] extends string ? K : never;
|
[K in keyof T]: K extends '__typename'
|
||||||
|
? never
|
||||||
|
: T[K] extends string | undefined | null
|
||||||
|
? K
|
||||||
|
: never;
|
||||||
}[keyof T]
|
}[keyof T]
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
@ -1,13 +1,15 @@
|
|||||||
import { gql } from '@apollo/client';
|
import { gql } from '@apollo/client';
|
||||||
|
export * from './update';
|
||||||
|
|
||||||
export const GET_CURRENT_USER = gql`
|
export const GET_CURRENT_USER = gql`
|
||||||
query GetCurrentUser($uuid: String) {
|
query GetCurrentUser {
|
||||||
users: findManyUser(where: { id: { equals: $uuid } }) {
|
currentUser {
|
||||||
id
|
id
|
||||||
email
|
email
|
||||||
displayName
|
displayName
|
||||||
firstName
|
firstName
|
||||||
lastName
|
lastName
|
||||||
|
avatarUrl
|
||||||
workspaceMember {
|
workspaceMember {
|
||||||
id
|
id
|
||||||
workspace {
|
workspace {
|
||||||
|
14
front/src/modules/users/services/update.ts
Normal file
14
front/src/modules/users/services/update.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import { gql } from '@apollo/client';
|
||||||
|
|
||||||
|
export const UPDATE_USER = gql`
|
||||||
|
mutation UpdateUser($data: UserUpdateInput!, $where: UserWhereUniqueInput!) {
|
||||||
|
updateUser(data: $data, where: $where) {
|
||||||
|
id
|
||||||
|
email
|
||||||
|
displayName
|
||||||
|
firstName
|
||||||
|
lastName
|
||||||
|
avatarUrl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
1
front/src/modules/workspace/services/index.ts
Normal file
1
front/src/modules/workspace/services/index.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export * from './update';
|
12
front/src/modules/workspace/services/update.ts
Normal file
12
front/src/modules/workspace/services/update.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import { gql } from '@apollo/client';
|
||||||
|
|
||||||
|
export const UPDATE_WORKSPACE = gql`
|
||||||
|
mutation UpdateWorkspace($data: WorkspaceUpdateInput!) {
|
||||||
|
updateWorkspace(data: $data) {
|
||||||
|
id
|
||||||
|
domainName
|
||||||
|
displayName
|
||||||
|
logo
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;
|
@ -1,14 +1,22 @@
|
|||||||
import { useCallback } from 'react';
|
import { useCallback, useEffect, useState } from 'react';
|
||||||
import { useHotkeys } from 'react-hotkeys-hook';
|
import { useHotkeys } from 'react-hotkeys-hook';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
import { getOperationName } from '@apollo/client/utilities';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
import { useRecoilState } from 'recoil';
|
||||||
|
|
||||||
import { SubTitle } from '@/auth/components/ui/SubTitle';
|
import { SubTitle } from '@/auth/components/ui/SubTitle';
|
||||||
import { Title } from '@/auth/components/ui/Title';
|
import { Title } from '@/auth/components/ui/Title';
|
||||||
|
import { useOnboardingStatus } from '@/auth/hooks/useOnboardingStatus';
|
||||||
|
import { currentUserState } from '@/auth/states/currentUserState';
|
||||||
|
import { OnboardingStatus } from '@/auth/utils/getOnboardingStatus';
|
||||||
|
import { captureHotkeyTypeInFocusState } from '@/hotkeys/states/captureHotkeyTypeInFocusState';
|
||||||
import { MainButton } from '@/ui/components/buttons/MainButton';
|
import { MainButton } from '@/ui/components/buttons/MainButton';
|
||||||
import { ImageInput } from '@/ui/components/inputs/ImageInput';
|
import { ImageInput } from '@/ui/components/inputs/ImageInput';
|
||||||
import { TextInput } from '@/ui/components/inputs/TextInput';
|
import { TextInput } from '@/ui/components/inputs/TextInput';
|
||||||
import { SubSectionTitle } from '@/ui/components/section-titles/SubSectionTitle';
|
import { SubSectionTitle } from '@/ui/components/section-titles/SubSectionTitle';
|
||||||
|
import { GET_CURRENT_USER } from '@/users/services';
|
||||||
|
import { useUpdateUserMutation } from '~/generated/graphql';
|
||||||
|
|
||||||
const StyledContentContainer = styled.div`
|
const StyledContentContainer = styled.div`
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@ -37,10 +45,58 @@ const StyledComboInputContainer = styled.div`
|
|||||||
|
|
||||||
export function CreateProfile() {
|
export function CreateProfile() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
const onboardingStatus = useOnboardingStatus();
|
||||||
|
|
||||||
|
const [currentUser] = useRecoilState(currentUserState);
|
||||||
|
const [, setCaptureHotkeyTypeInFocus] = useRecoilState(
|
||||||
|
captureHotkeyTypeInFocusState,
|
||||||
|
);
|
||||||
|
|
||||||
|
const [updateUser] = useUpdateUserMutation();
|
||||||
|
|
||||||
|
const [firstName, setFirstName] = useState('');
|
||||||
|
const [lastName, setLastName] = useState('');
|
||||||
|
|
||||||
const handleCreate = useCallback(async () => {
|
const handleCreate = useCallback(async () => {
|
||||||
navigate('/');
|
try {
|
||||||
}, [navigate]);
|
if (!currentUser?.id) {
|
||||||
|
throw new Error('User is not logged in');
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data, errors } = await updateUser({
|
||||||
|
variables: {
|
||||||
|
where: {
|
||||||
|
id: currentUser?.id,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
firstName: {
|
||||||
|
set: firstName,
|
||||||
|
},
|
||||||
|
lastName: {
|
||||||
|
set: lastName,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
refetchQueries: [getOperationName(GET_CURRENT_USER) ?? ''],
|
||||||
|
});
|
||||||
|
|
||||||
|
if (errors || !data?.updateUser) {
|
||||||
|
throw errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
setCaptureHotkeyTypeInFocus(false);
|
||||||
|
navigate('/');
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
}, [
|
||||||
|
currentUser?.id,
|
||||||
|
firstName,
|
||||||
|
lastName,
|
||||||
|
navigate,
|
||||||
|
setCaptureHotkeyTypeInFocus,
|
||||||
|
updateUser,
|
||||||
|
]);
|
||||||
|
|
||||||
useHotkeys(
|
useHotkeys(
|
||||||
'enter',
|
'enter',
|
||||||
@ -54,10 +110,20 @@ export function CreateProfile() {
|
|||||||
[handleCreate],
|
[handleCreate],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (onboardingStatus !== OnboardingStatus.OngoingProfileCreation) {
|
||||||
|
navigate('/');
|
||||||
|
}
|
||||||
|
}, [onboardingStatus, navigate]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setCaptureHotkeyTypeInFocus(true);
|
||||||
|
}, [setCaptureHotkeyTypeInFocus]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Title>Create profile</Title>
|
<Title>Create profile</Title>
|
||||||
<SubTitle>How you'll be identify on the app.</SubTitle>
|
<SubTitle>How you'll be identified on the app.</SubTitle>
|
||||||
<StyledContentContainer>
|
<StyledContentContainer>
|
||||||
<StyledSectionContainer>
|
<StyledSectionContainer>
|
||||||
<SubSectionTitle title="Picture" />
|
<SubSectionTitle title="Picture" />
|
||||||
@ -71,21 +137,28 @@ export function CreateProfile() {
|
|||||||
<StyledComboInputContainer>
|
<StyledComboInputContainer>
|
||||||
<TextInput
|
<TextInput
|
||||||
label="First Name"
|
label="First Name"
|
||||||
value=""
|
value={firstName}
|
||||||
placeholder="Tim"
|
placeholder="Tim"
|
||||||
|
onChange={setFirstName}
|
||||||
fullWidth
|
fullWidth
|
||||||
/>
|
/>
|
||||||
<TextInput
|
<TextInput
|
||||||
label="Last Name"
|
label="Last Name"
|
||||||
value=""
|
value={lastName}
|
||||||
placeholder="Cook"
|
placeholder="Cook"
|
||||||
|
onChange={setLastName}
|
||||||
fullWidth
|
fullWidth
|
||||||
/>
|
/>
|
||||||
</StyledComboInputContainer>
|
</StyledComboInputContainer>
|
||||||
</StyledSectionContainer>
|
</StyledSectionContainer>
|
||||||
</StyledContentContainer>
|
</StyledContentContainer>
|
||||||
<StyledButtonContainer>
|
<StyledButtonContainer>
|
||||||
<MainButton title="Continue" onClick={handleCreate} fullWidth />
|
<MainButton
|
||||||
|
title="Continue"
|
||||||
|
onClick={handleCreate}
|
||||||
|
disabled={!firstName || !lastName}
|
||||||
|
fullWidth
|
||||||
|
/>
|
||||||
</StyledButtonContainer>
|
</StyledButtonContainer>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
@ -1,14 +1,19 @@
|
|||||||
import { useCallback } from 'react';
|
import { useCallback, useEffect, useState } from 'react';
|
||||||
import { useHotkeys } from 'react-hotkeys-hook';
|
import { useHotkeys } from 'react-hotkeys-hook';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
import { getOperationName } from '@apollo/client/utilities';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
|
||||||
import { SubTitle } from '@/auth/components/ui/SubTitle';
|
import { SubTitle } from '@/auth/components/ui/SubTitle';
|
||||||
import { Title } from '@/auth/components/ui/Title';
|
import { Title } from '@/auth/components/ui/Title';
|
||||||
|
import { useOnboardingStatus } from '@/auth/hooks/useOnboardingStatus';
|
||||||
|
import { OnboardingStatus } from '@/auth/utils/getOnboardingStatus';
|
||||||
import { MainButton } from '@/ui/components/buttons/MainButton';
|
import { MainButton } from '@/ui/components/buttons/MainButton';
|
||||||
import { ImageInput } from '@/ui/components/inputs/ImageInput';
|
import { ImageInput } from '@/ui/components/inputs/ImageInput';
|
||||||
import { TextInput } from '@/ui/components/inputs/TextInput';
|
import { TextInput } from '@/ui/components/inputs/TextInput';
|
||||||
import { SubSectionTitle } from '@/ui/components/section-titles/SubSectionTitle';
|
import { SubSectionTitle } from '@/ui/components/section-titles/SubSectionTitle';
|
||||||
|
import { GET_CURRENT_USER } from '@/users/services';
|
||||||
|
import { useUpdateWorkspaceMutation } from '~/generated/graphql';
|
||||||
|
|
||||||
const StyledContentContainer = styled.div`
|
const StyledContentContainer = styled.div`
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@ -29,10 +34,38 @@ const StyledButtonContainer = styled.div`
|
|||||||
|
|
||||||
export function CreateWorkspace() {
|
export function CreateWorkspace() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
const onboardingStatus = useOnboardingStatus();
|
||||||
|
|
||||||
|
const [workspaceName, setWorkspaceName] = useState('');
|
||||||
|
|
||||||
|
const [updateWorkspace] = useUpdateWorkspaceMutation();
|
||||||
|
|
||||||
const handleCreate = useCallback(async () => {
|
const handleCreate = useCallback(async () => {
|
||||||
navigate('/auth/create/profile');
|
try {
|
||||||
}, [navigate]);
|
if (!workspaceName) {
|
||||||
|
throw new Error('Workspace name is required');
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data, errors } = await updateWorkspace({
|
||||||
|
variables: {
|
||||||
|
data: {
|
||||||
|
displayName: {
|
||||||
|
set: workspaceName,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
refetchQueries: [getOperationName(GET_CURRENT_USER) ?? ''],
|
||||||
|
});
|
||||||
|
|
||||||
|
if (errors || !data?.updateWorkspace) {
|
||||||
|
throw errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
navigate('/auth/create/profile');
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
}, [navigate, updateWorkspace, workspaceName]);
|
||||||
|
|
||||||
useHotkeys(
|
useHotkeys(
|
||||||
'enter',
|
'enter',
|
||||||
@ -46,6 +79,12 @@ export function CreateWorkspace() {
|
|||||||
[handleCreate],
|
[handleCreate],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (onboardingStatus !== OnboardingStatus.OngoingWorkspaceCreation) {
|
||||||
|
navigate('/auth/create/profile');
|
||||||
|
}
|
||||||
|
}, [onboardingStatus, navigate]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Title>Create your workspace</Title>
|
<Title>Create your workspace</Title>
|
||||||
@ -63,11 +102,21 @@ export function CreateWorkspace() {
|
|||||||
title="Workspace name"
|
title="Workspace name"
|
||||||
description="The name of your organization"
|
description="The name of your organization"
|
||||||
/>
|
/>
|
||||||
<TextInput value="" placeholder="Apple" fullWidth />
|
<TextInput
|
||||||
|
value={workspaceName}
|
||||||
|
placeholder="Apple"
|
||||||
|
onChange={setWorkspaceName}
|
||||||
|
fullWidth
|
||||||
|
/>
|
||||||
</StyledSectionContainer>
|
</StyledSectionContainer>
|
||||||
</StyledContentContainer>
|
</StyledContentContainer>
|
||||||
<StyledButtonContainer>
|
<StyledButtonContainer>
|
||||||
<MainButton title="Continue" onClick={handleCreate} fullWidth />
|
<MainButton
|
||||||
|
title="Continue"
|
||||||
|
onClick={handleCreate}
|
||||||
|
disabled={!workspaceName}
|
||||||
|
fullWidth
|
||||||
|
/>
|
||||||
</StyledButtonContainer>
|
</StyledButtonContainer>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { useCallback, useState } from 'react';
|
import { useCallback, useState } from 'react';
|
||||||
import { useHotkeys } from 'react-hotkeys-hook';
|
import { useHotkeys } from 'react-hotkeys-hook';
|
||||||
|
import { useNavigate } from 'react-router-dom';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
import { motion } from 'framer-motion';
|
import { motion } from 'framer-motion';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState } from 'recoil';
|
||||||
@ -10,7 +11,6 @@ import { Title } from '@/auth/components/ui/Title';
|
|||||||
import { useAuth } from '@/auth/hooks/useAuth';
|
import { useAuth } from '@/auth/hooks/useAuth';
|
||||||
import { authFlowUserEmailState } from '@/auth/states/authFlowUserEmailState';
|
import { authFlowUserEmailState } from '@/auth/states/authFlowUserEmailState';
|
||||||
import { isMockModeState } from '@/auth/states/isMockModeState';
|
import { isMockModeState } from '@/auth/states/isMockModeState';
|
||||||
import { captureHotkeyTypeInFocusState } from '@/hotkeys/states/captureHotkeyTypeInFocusState';
|
|
||||||
import { MainButton } from '@/ui/components/buttons/MainButton';
|
import { MainButton } from '@/ui/components/buttons/MainButton';
|
||||||
import { TextInput } from '@/ui/components/inputs/TextInput';
|
import { TextInput } from '@/ui/components/inputs/TextInput';
|
||||||
import { SubSectionTitle } from '@/ui/components/section-titles/SubSectionTitle';
|
import { SubSectionTitle } from '@/ui/components/section-titles/SubSectionTitle';
|
||||||
@ -47,17 +47,15 @@ const StyledErrorContainer = styled.div`
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
export function PasswordLogin() {
|
export function PasswordLogin() {
|
||||||
const [, setMockMode] = useRecoilState(isMockModeState);
|
const navigate = useNavigate();
|
||||||
const [, setCaptureHotkeyTypeInFocus] = useRecoilState(
|
|
||||||
captureHotkeyTypeInFocusState,
|
|
||||||
);
|
|
||||||
|
|
||||||
const prefillPassword =
|
const prefillPassword =
|
||||||
process.env.NODE_ENV === 'development' ? 'applecar2025' : '';
|
process.env.NODE_ENV === 'development' ? 'Applecar2025' : '';
|
||||||
|
|
||||||
const [authFlowUserEmail, setAuthFlowUserEmail] = useRecoilState(
|
const [authFlowUserEmail, setAuthFlowUserEmail] = useRecoilState(
|
||||||
authFlowUserEmailState,
|
authFlowUserEmailState,
|
||||||
);
|
);
|
||||||
|
const [, setMockMode] = useRecoilState(isMockModeState);
|
||||||
const [internalPassword, setInternalPassword] = useState(prefillPassword);
|
const [internalPassword, setInternalPassword] = useState(prefillPassword);
|
||||||
const [formError, setFormError] = useState('');
|
const [formError, setFormError] = useState('');
|
||||||
|
|
||||||
@ -65,21 +63,15 @@ export function PasswordLogin() {
|
|||||||
|
|
||||||
const handleLogin = useCallback(async () => {
|
const handleLogin = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
await login(authFlowUserEmail, internalPassword);
|
|
||||||
setMockMode(false);
|
setMockMode(false);
|
||||||
setCaptureHotkeyTypeInFocus(false);
|
|
||||||
// TODO: Navigate to the workspace selection page when it's ready
|
await login(authFlowUserEmail, internalPassword);
|
||||||
// navigate('/auth/create/workspace');
|
|
||||||
|
navigate('/auth/create/workspace');
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
setFormError(err.message);
|
setFormError(err.message);
|
||||||
}
|
}
|
||||||
}, [
|
}, [login, authFlowUserEmail, internalPassword, setMockMode, navigate]);
|
||||||
authFlowUserEmail,
|
|
||||||
internalPassword,
|
|
||||||
login,
|
|
||||||
setMockMode,
|
|
||||||
setCaptureHotkeyTypeInFocus,
|
|
||||||
]);
|
|
||||||
|
|
||||||
useHotkeys(
|
useHotkeys(
|
||||||
'enter',
|
'enter',
|
||||||
|
@ -23,7 +23,7 @@ export const FilterByName: Story = {
|
|||||||
play: async ({ canvasElement }) => {
|
play: async ({ canvasElement }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
|
|
||||||
const filterButton = canvas.getByText('Filter');
|
const filterButton = await canvas.findByText('Filter');
|
||||||
await userEvent.click(filterButton);
|
await userEvent.click(filterButton);
|
||||||
|
|
||||||
const nameFilterButton = canvas
|
const nameFilterButton = canvas
|
||||||
@ -60,7 +60,7 @@ export const FilterByAccountOwner: Story = {
|
|||||||
play: async ({ canvasElement }) => {
|
play: async ({ canvasElement }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
|
|
||||||
const filterButton = canvas.getByText('Filter');
|
const filterButton = await canvas.findByText('Filter');
|
||||||
await userEvent.click(filterButton);
|
await userEvent.click(filterButton);
|
||||||
|
|
||||||
const accountOwnerFilterButton = (
|
const accountOwnerFilterButton = (
|
||||||
@ -83,7 +83,6 @@ export const FilterByAccountOwner: Story = {
|
|||||||
const charlesChip = canvas
|
const charlesChip = canvas
|
||||||
.getAllByTestId('dropdown-menu-item')
|
.getAllByTestId('dropdown-menu-item')
|
||||||
.find((item) => {
|
.find((item) => {
|
||||||
console.log({ item });
|
|
||||||
return item.textContent?.includes('Charles Test');
|
return item.textContent?.includes('Charles Test');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ export const SortByName: Story = {
|
|||||||
play: async ({ canvasElement }) => {
|
play: async ({ canvasElement }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
|
|
||||||
const sortButton = canvas.getByText('Sort');
|
const sortButton = await canvas.findByText('Sort');
|
||||||
await userEvent.click(sortButton);
|
await userEvent.click(sortButton);
|
||||||
|
|
||||||
const nameSortButton = canvas.getByText('Name', { selector: 'li' });
|
const nameSortButton = canvas.getByText('Name', { selector: 'li' });
|
||||||
|
@ -23,7 +23,7 @@ export const Email: Story = {
|
|||||||
play: async ({ canvasElement }) => {
|
play: async ({ canvasElement }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
|
|
||||||
const filterButton = canvas.getByText('Filter');
|
const filterButton = await canvas.findByText('Filter');
|
||||||
await userEvent.click(filterButton);
|
await userEvent.click(filterButton);
|
||||||
|
|
||||||
const emailFilterButton = canvas
|
const emailFilterButton = canvas
|
||||||
@ -59,7 +59,7 @@ export const CompanyName: Story = {
|
|||||||
play: async ({ canvasElement }) => {
|
play: async ({ canvasElement }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
|
|
||||||
const filterButton = canvas.getByText('Filter');
|
const filterButton = await canvas.findByText('Filter');
|
||||||
await userEvent.click(filterButton);
|
await userEvent.click(filterButton);
|
||||||
|
|
||||||
const companyFilterButton = canvas
|
const companyFilterButton = canvas
|
||||||
|
@ -22,7 +22,7 @@ export const Email: Story = {
|
|||||||
play: async ({ canvasElement }) => {
|
play: async ({ canvasElement }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
|
|
||||||
const sortButton = canvas.getByText('Sort');
|
const sortButton = await canvas.findByText('Sort');
|
||||||
await userEvent.click(sortButton);
|
await userEvent.click(sortButton);
|
||||||
|
|
||||||
const emailSortButton = canvas.getByText('Email', { selector: 'li' });
|
const emailSortButton = canvas.getByText('Email', { selector: 'li' });
|
||||||
@ -48,7 +48,7 @@ export const Cancel: Story = {
|
|||||||
play: async ({ canvasElement }) => {
|
play: async ({ canvasElement }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
|
|
||||||
const sortButton = canvas.getByText('Sort');
|
const sortButton = await canvas.findByText('Sort');
|
||||||
await userEvent.click(sortButton);
|
await userEvent.click(sortButton);
|
||||||
|
|
||||||
const emailSortButton = canvas.getByText('Email', { selector: 'li' });
|
const emailSortButton = canvas.getByText('Email', { selector: 'li' });
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
import { getOperationName } from '@apollo/client/utilities';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
import debounce from 'lodash.debounce';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { currentUserState } from '@/auth/states/currentUserState';
|
import { currentUserState } from '@/auth/states/currentUserState';
|
||||||
@ -7,6 +10,8 @@ import { TextInput } from '@/ui/components/inputs/TextInput';
|
|||||||
import { MainSectionTitle } from '@/ui/components/section-titles/MainSectionTitle';
|
import { MainSectionTitle } from '@/ui/components/section-titles/MainSectionTitle';
|
||||||
import { SubSectionTitle } from '@/ui/components/section-titles/SubSectionTitle';
|
import { SubSectionTitle } from '@/ui/components/section-titles/SubSectionTitle';
|
||||||
import { NoTopBarContainer } from '@/ui/layout/containers/NoTopBarContainer';
|
import { NoTopBarContainer } from '@/ui/layout/containers/NoTopBarContainer';
|
||||||
|
import { GET_CURRENT_USER } from '@/users/services';
|
||||||
|
import { useUpdateUserMutation } from '~/generated/graphql';
|
||||||
|
|
||||||
const StyledContainer = styled.div`
|
const StyledContainer = styled.div`
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -34,6 +39,57 @@ const StyledComboInputContainer = styled.div`
|
|||||||
|
|
||||||
export function SettingsProfile() {
|
export function SettingsProfile() {
|
||||||
const currentUser = useRecoilValue(currentUserState);
|
const currentUser = useRecoilValue(currentUserState);
|
||||||
|
|
||||||
|
const [firstName, setFirstName] = useState(currentUser?.firstName ?? '');
|
||||||
|
const [lastName, setLastName] = useState(currentUser?.lastName ?? '');
|
||||||
|
|
||||||
|
const [updateUser] = useUpdateUserMutation();
|
||||||
|
|
||||||
|
// TODO: Enhance this with react-hook-form (https://www.react-hook-form.com)
|
||||||
|
const debouncedUpdate = debounce(async () => {
|
||||||
|
try {
|
||||||
|
if (!currentUser?.id) {
|
||||||
|
throw new Error('User is not logged in');
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data, errors } = await updateUser({
|
||||||
|
variables: {
|
||||||
|
where: {
|
||||||
|
id: currentUser?.id,
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
firstName: {
|
||||||
|
set: firstName,
|
||||||
|
},
|
||||||
|
lastName: {
|
||||||
|
set: lastName,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
refetchQueries: [getOperationName(GET_CURRENT_USER) ?? ''],
|
||||||
|
});
|
||||||
|
|
||||||
|
if (errors || !data?.updateUser) {
|
||||||
|
throw errors;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
}, 500);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (
|
||||||
|
currentUser?.firstName !== firstName ||
|
||||||
|
currentUser?.lastName !== lastName
|
||||||
|
) {
|
||||||
|
debouncedUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
debouncedUpdate.cancel();
|
||||||
|
};
|
||||||
|
}, [firstName, lastName, currentUser, debouncedUpdate]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<NoTopBarContainer>
|
<NoTopBarContainer>
|
||||||
<StyledContainer>
|
<StyledContainer>
|
||||||
@ -50,13 +106,15 @@ export function SettingsProfile() {
|
|||||||
<StyledComboInputContainer>
|
<StyledComboInputContainer>
|
||||||
<TextInput
|
<TextInput
|
||||||
label="First Name"
|
label="First Name"
|
||||||
value={currentUser?.displayName}
|
value={firstName}
|
||||||
|
onChange={setFirstName}
|
||||||
placeholder="Tim"
|
placeholder="Tim"
|
||||||
fullWidth
|
fullWidth
|
||||||
/>
|
/>
|
||||||
<TextInput
|
<TextInput
|
||||||
label="Last Name"
|
label="Last Name"
|
||||||
value=""
|
value={lastName}
|
||||||
|
onChange={setLastName}
|
||||||
placeholder="Cook"
|
placeholder="Cook"
|
||||||
fullWidth
|
fullWidth
|
||||||
/>
|
/>
|
||||||
|
@ -1,19 +1,11 @@
|
|||||||
import { ApolloProvider as ApolloProviderBase } from '@apollo/client';
|
import { ApolloProvider as ApolloProviderBase } from '@apollo/client';
|
||||||
import { useRecoilState } from 'recoil';
|
|
||||||
|
|
||||||
import { useApolloFactory } from '@/apollo/hooks/useApolloFactory';
|
import { useApolloFactory } from '@/apollo/hooks/useApolloFactory';
|
||||||
import useApolloMocked from '@/apollo/hooks/useApolloMocked';
|
|
||||||
import { isMockModeState } from '@/auth/states/isMockModeState';
|
|
||||||
|
|
||||||
export function ApolloProvider({ children }: React.PropsWithChildren) {
|
export function ApolloProvider({ children }: React.PropsWithChildren) {
|
||||||
const apolloClient = useApolloFactory();
|
const apolloClient = useApolloFactory();
|
||||||
const mockedClient = useApolloMocked();
|
|
||||||
|
|
||||||
const [isMockMode] = useRecoilState(isMockModeState);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ApolloProviderBase client={isMockMode ? mockedClient : apolloClient}>
|
<ApolloProviderBase client={apolloClient}>{children}</ApolloProviderBase>
|
||||||
{children}
|
|
||||||
</ApolloProviderBase>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,20 +1,18 @@
|
|||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState } from 'recoil';
|
||||||
|
|
||||||
import { useFetchCurrentUser } from '@/auth/hooks/useFetchCurrentUser';
|
|
||||||
import { currentUserState } from '@/auth/states/currentUserState';
|
import { currentUserState } from '@/auth/states/currentUserState';
|
||||||
import { tokenPairState } from '@/auth/states/tokenPairState';
|
import { useGetCurrentUserQuery } from '~/generated/graphql';
|
||||||
|
|
||||||
export function UserProvider({ children }: React.PropsWithChildren) {
|
export function UserProvider({ children }: React.PropsWithChildren) {
|
||||||
const [, setCurrentUser] = useRecoilState(currentUserState);
|
const [, setCurrentUser] = useRecoilState(currentUserState);
|
||||||
const [tokenPair] = useRecoilState(tokenPairState);
|
const { data, loading } = useGetCurrentUserQuery();
|
||||||
const user = useFetchCurrentUser(tokenPair);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (user) {
|
if (data?.currentUser) {
|
||||||
setCurrentUser(user);
|
setCurrentUser(data?.currentUser);
|
||||||
}
|
}
|
||||||
}, [setCurrentUser, user]);
|
}, [setCurrentUser, data]);
|
||||||
|
|
||||||
return <>{children}</>;
|
return loading ? <></> : <>{children}</>;
|
||||||
}
|
}
|
||||||
|
@ -75,7 +75,7 @@ export const graphqlMocks = [
|
|||||||
graphql.query(getOperationName(GET_CURRENT_USER) ?? '', (req, res, ctx) => {
|
graphql.query(getOperationName(GET_CURRENT_USER) ?? '', (req, res, ctx) => {
|
||||||
return res(
|
return res(
|
||||||
ctx.data({
|
ctx.data({
|
||||||
users: [mockedUsersData[0]],
|
currentUser: mockedUsersData[0],
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
|
@ -20,7 +20,7 @@ type MockedUser = Pick<
|
|||||||
|
|
||||||
export const mockedUsersData: Array<MockedUser> = [
|
export const mockedUsersData: Array<MockedUser> = [
|
||||||
{
|
{
|
||||||
id: '374fe3a5-df1e-4119-afe0-2a62a2ba481e',
|
id: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6d',
|
||||||
__typename: 'User',
|
__typename: 'User',
|
||||||
email: 'charles@test.com',
|
email: 'charles@test.com',
|
||||||
displayName: 'Charles Test',
|
displayName: 'Charles Test',
|
||||||
|
@ -4963,7 +4963,14 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
|
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
|
||||||
integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
|
integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
|
||||||
|
|
||||||
"@types/lodash@^4.14.167":
|
"@types/lodash.debounce@^4.0.7":
|
||||||
|
version "4.0.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.7.tgz#0285879defb7cdb156ae633cecd62d5680eded9f"
|
||||||
|
integrity sha512-X1T4wMZ+gT000M2/91SYj0d/7JfeNZ9PeeOldSNoE/lunLeQXKvkmIumI29IaKMotU/ln/McOIvgzZcQ/3TrSA==
|
||||||
|
dependencies:
|
||||||
|
"@types/lodash" "*"
|
||||||
|
|
||||||
|
"@types/lodash@*", "@types/lodash@^4.14.167":
|
||||||
version "4.14.195"
|
version "4.14.195"
|
||||||
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632"
|
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632"
|
||||||
integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==
|
integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
DEBUG_MODE=false
|
||||||
|
AUTH_GOOGLE_ENABLED=false
|
||||||
ACCESS_TOKEN_SECRET=secret_jwt
|
ACCESS_TOKEN_SECRET=secret_jwt
|
||||||
ACCESS_TOKEN_EXPIRES_IN=5m
|
ACCESS_TOKEN_EXPIRES_IN=5m
|
||||||
LOGIN_TOKEN_SECRET=secret_login_token
|
LOGIN_TOKEN_SECRET=secret_login_token
|
||||||
|
@ -22,9 +22,10 @@
|
|||||||
"prisma:generate-client": "npx prisma generate --generator client && yarn prisma:generate-gql-select",
|
"prisma:generate-client": "npx prisma generate --generator client && yarn prisma:generate-gql-select",
|
||||||
"prisma:generate-gql-select": "node scripts/generate-model-select-map.js",
|
"prisma:generate-gql-select": "node scripts/generate-model-select-map.js",
|
||||||
"prisma:generate-nest-graphql": "npx prisma generate --generator nestgraphql",
|
"prisma:generate-nest-graphql": "npx prisma generate --generator nestgraphql",
|
||||||
|
"prisma:generate": "yarn prisma:generate-client && yarn prisma:generate-gql-select && yarn prisma:generate-nest-graphql",
|
||||||
"prisma:migrate": "npx prisma migrate deploy",
|
"prisma:migrate": "npx prisma migrate deploy",
|
||||||
"prisma:seed": "npx prisma db seed",
|
"prisma:seed": "npx prisma db seed",
|
||||||
"prisma:reset": "npx prisma migrate reset"
|
"prisma:reset": "npx prisma migrate reset && yarn prisma:generate"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@apollo/server": "^4.7.3",
|
"@apollo/server": "^4.7.3",
|
||||||
@ -101,6 +102,7 @@
|
|||||||
"prettier": "^2.3.2",
|
"prettier": "^2.3.2",
|
||||||
"prisma": "^4.13.0",
|
"prisma": "^4.13.0",
|
||||||
"prisma-nestjs-graphql": "^18.0.2",
|
"prisma-nestjs-graphql": "^18.0.2",
|
||||||
|
"prisma-query-log": "^3.2.0",
|
||||||
"source-map-support": "^0.5.20",
|
"source-map-support": "^0.5.20",
|
||||||
"supertest": "^6.1.3",
|
"supertest": "^6.1.3",
|
||||||
"ts-jest": "28.0.8",
|
"ts-jest": "28.0.8",
|
||||||
|
@ -12,13 +12,15 @@ export class UserCreateManyInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
firstName!: string;
|
@Validator.IsOptional()
|
||||||
|
firstName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
lastName!: string;
|
@Validator.IsOptional()
|
||||||
|
lastName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:false})
|
||||||
@Validator.IsEmail()
|
@Validator.IsEmail()
|
||||||
|
@ -15,13 +15,15 @@ export class UserCreateWithoutCommentsInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
firstName!: string;
|
@Validator.IsOptional()
|
||||||
|
firstName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
lastName!: string;
|
@Validator.IsOptional()
|
||||||
|
lastName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:false})
|
||||||
@Validator.IsEmail()
|
@Validator.IsEmail()
|
||||||
|
@ -15,13 +15,15 @@ export class UserCreateWithoutCompaniesInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
firstName!: string;
|
@Validator.IsOptional()
|
||||||
|
firstName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
lastName!: string;
|
@Validator.IsOptional()
|
||||||
|
lastName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:false})
|
||||||
@Validator.IsEmail()
|
@Validator.IsEmail()
|
||||||
|
@ -15,13 +15,15 @@ export class UserCreateWithoutRefreshTokensInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
firstName!: string;
|
@Validator.IsOptional()
|
||||||
|
firstName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
lastName!: string;
|
@Validator.IsOptional()
|
||||||
|
lastName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:false})
|
||||||
@Validator.IsEmail()
|
@Validator.IsEmail()
|
||||||
|
@ -15,13 +15,15 @@ export class UserCreateWithoutWorkspaceMemberInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
firstName!: string;
|
@Validator.IsOptional()
|
||||||
|
firstName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
lastName!: string;
|
@Validator.IsOptional()
|
||||||
|
lastName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:false})
|
||||||
@Validator.IsEmail()
|
@Validator.IsEmail()
|
||||||
|
@ -16,13 +16,15 @@ export class UserCreateInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
firstName!: string;
|
@Validator.IsOptional()
|
||||||
|
firstName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
lastName!: string;
|
@Validator.IsOptional()
|
||||||
|
lastName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:false})
|
||||||
@Validator.IsEmail()
|
@Validator.IsEmail()
|
||||||
|
@ -15,13 +15,15 @@ export class UserGroupBy {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id!: string;
|
id!: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
firstName!: string;
|
@Validator.IsOptional()
|
||||||
|
firstName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
lastName!: string;
|
@Validator.IsOptional()
|
||||||
|
lastName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:false})
|
||||||
@Validator.IsEmail()
|
@Validator.IsEmail()
|
||||||
|
@ -13,10 +13,12 @@ export class UserMaxAggregate {
|
|||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@Validator.IsOptional()
|
||||||
firstName?: string;
|
firstName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@Validator.IsOptional()
|
||||||
lastName?: string;
|
lastName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
|
@ -13,10 +13,12 @@ export class UserMinAggregate {
|
|||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@Validator.IsOptional()
|
||||||
firstName?: string;
|
firstName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@Validator.IsOptional()
|
||||||
lastName?: string;
|
lastName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Field } from '@nestjs/graphql';
|
import { Field } from '@nestjs/graphql';
|
||||||
import { InputType } from '@nestjs/graphql';
|
import { InputType } from '@nestjs/graphql';
|
||||||
import { StringWithAggregatesFilter } from '../prisma/string-with-aggregates-filter.input';
|
import { StringWithAggregatesFilter } from '../prisma/string-with-aggregates-filter.input';
|
||||||
import { BoolWithAggregatesFilter } from '../prisma/bool-with-aggregates-filter.input';
|
|
||||||
import { StringNullableWithAggregatesFilter } from '../prisma/string-nullable-with-aggregates-filter.input';
|
import { StringNullableWithAggregatesFilter } from '../prisma/string-nullable-with-aggregates-filter.input';
|
||||||
|
import { BoolWithAggregatesFilter } from '../prisma/bool-with-aggregates-filter.input';
|
||||||
import { DateTimeNullableWithAggregatesFilter } from '../prisma/date-time-nullable-with-aggregates-filter.input';
|
import { DateTimeNullableWithAggregatesFilter } from '../prisma/date-time-nullable-with-aggregates-filter.input';
|
||||||
import { HideField } from '@nestjs/graphql';
|
import { HideField } from '@nestjs/graphql';
|
||||||
import { JsonNullableWithAggregatesFilter } from '../prisma/json-nullable-with-aggregates-filter.input';
|
import { JsonNullableWithAggregatesFilter } from '../prisma/json-nullable-with-aggregates-filter.input';
|
||||||
@ -23,11 +23,11 @@ export class UserScalarWhereWithAggregatesInput {
|
|||||||
@Field(() => StringWithAggregatesFilter, {nullable:true})
|
@Field(() => StringWithAggregatesFilter, {nullable:true})
|
||||||
id?: StringWithAggregatesFilter;
|
id?: StringWithAggregatesFilter;
|
||||||
|
|
||||||
@Field(() => StringWithAggregatesFilter, {nullable:true})
|
@Field(() => StringNullableWithAggregatesFilter, {nullable:true})
|
||||||
firstName?: StringWithAggregatesFilter;
|
firstName?: StringNullableWithAggregatesFilter;
|
||||||
|
|
||||||
@Field(() => StringWithAggregatesFilter, {nullable:true})
|
@Field(() => StringNullableWithAggregatesFilter, {nullable:true})
|
||||||
lastName?: StringWithAggregatesFilter;
|
lastName?: StringNullableWithAggregatesFilter;
|
||||||
|
|
||||||
@Field(() => StringWithAggregatesFilter, {nullable:true})
|
@Field(() => StringWithAggregatesFilter, {nullable:true})
|
||||||
email?: StringWithAggregatesFilter;
|
email?: StringWithAggregatesFilter;
|
||||||
|
@ -15,13 +15,15 @@ export class UserUncheckedCreateWithoutCommentsInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
firstName!: string;
|
@Validator.IsOptional()
|
||||||
|
firstName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
lastName!: string;
|
@Validator.IsOptional()
|
||||||
|
lastName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:false})
|
||||||
@Validator.IsEmail()
|
@Validator.IsEmail()
|
||||||
|
@ -15,13 +15,15 @@ export class UserUncheckedCreateWithoutCompaniesInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
firstName!: string;
|
@Validator.IsOptional()
|
||||||
|
firstName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
lastName!: string;
|
@Validator.IsOptional()
|
||||||
|
lastName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:false})
|
||||||
@Validator.IsEmail()
|
@Validator.IsEmail()
|
||||||
|
@ -15,13 +15,15 @@ export class UserUncheckedCreateWithoutRefreshTokensInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
firstName!: string;
|
@Validator.IsOptional()
|
||||||
|
firstName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
lastName!: string;
|
@Validator.IsOptional()
|
||||||
|
lastName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:false})
|
||||||
@Validator.IsEmail()
|
@Validator.IsEmail()
|
||||||
|
@ -15,13 +15,15 @@ export class UserUncheckedCreateWithoutWorkspaceMemberInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
firstName!: string;
|
@Validator.IsOptional()
|
||||||
|
firstName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
lastName!: string;
|
@Validator.IsOptional()
|
||||||
|
lastName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:false})
|
||||||
@Validator.IsEmail()
|
@Validator.IsEmail()
|
||||||
|
@ -16,13 +16,15 @@ export class UserUncheckedCreateInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
firstName!: string;
|
@Validator.IsOptional()
|
||||||
|
firstName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
lastName!: string;
|
@Validator.IsOptional()
|
||||||
|
lastName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:false})
|
||||||
@Validator.IsEmail()
|
@Validator.IsEmail()
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Field } from '@nestjs/graphql';
|
import { Field } from '@nestjs/graphql';
|
||||||
import { InputType } from '@nestjs/graphql';
|
import { InputType } from '@nestjs/graphql';
|
||||||
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
||||||
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
|
||||||
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
||||||
|
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
||||||
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
||||||
import { HideField } from '@nestjs/graphql';
|
import { HideField } from '@nestjs/graphql';
|
||||||
import { GraphQLJSON } from 'graphql-type-json';
|
import { GraphQLJSON } from 'graphql-type-json';
|
||||||
@ -15,11 +15,11 @@ export class UserUncheckedUpdateManyInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
firstName?: StringFieldUpdateOperationsInput;
|
firstName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
lastName?: StringFieldUpdateOperationsInput;
|
lastName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
email?: StringFieldUpdateOperationsInput;
|
email?: StringFieldUpdateOperationsInput;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Field } from '@nestjs/graphql';
|
import { Field } from '@nestjs/graphql';
|
||||||
import { InputType } from '@nestjs/graphql';
|
import { InputType } from '@nestjs/graphql';
|
||||||
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
||||||
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
|
||||||
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
||||||
|
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
||||||
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
||||||
import { HideField } from '@nestjs/graphql';
|
import { HideField } from '@nestjs/graphql';
|
||||||
import { GraphQLJSON } from 'graphql-type-json';
|
import { GraphQLJSON } from 'graphql-type-json';
|
||||||
@ -18,11 +18,11 @@ export class UserUncheckedUpdateWithoutCommentsInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
firstName?: StringFieldUpdateOperationsInput;
|
firstName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
lastName?: StringFieldUpdateOperationsInput;
|
lastName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
email?: StringFieldUpdateOperationsInput;
|
email?: StringFieldUpdateOperationsInput;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Field } from '@nestjs/graphql';
|
import { Field } from '@nestjs/graphql';
|
||||||
import { InputType } from '@nestjs/graphql';
|
import { InputType } from '@nestjs/graphql';
|
||||||
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
||||||
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
|
||||||
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
||||||
|
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
||||||
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
||||||
import { HideField } from '@nestjs/graphql';
|
import { HideField } from '@nestjs/graphql';
|
||||||
import { GraphQLJSON } from 'graphql-type-json';
|
import { GraphQLJSON } from 'graphql-type-json';
|
||||||
@ -18,11 +18,11 @@ export class UserUncheckedUpdateWithoutCompaniesInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
firstName?: StringFieldUpdateOperationsInput;
|
firstName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
lastName?: StringFieldUpdateOperationsInput;
|
lastName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
email?: StringFieldUpdateOperationsInput;
|
email?: StringFieldUpdateOperationsInput;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Field } from '@nestjs/graphql';
|
import { Field } from '@nestjs/graphql';
|
||||||
import { InputType } from '@nestjs/graphql';
|
import { InputType } from '@nestjs/graphql';
|
||||||
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
||||||
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
|
||||||
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
||||||
|
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
||||||
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
||||||
import { HideField } from '@nestjs/graphql';
|
import { HideField } from '@nestjs/graphql';
|
||||||
import { GraphQLJSON } from 'graphql-type-json';
|
import { GraphQLJSON } from 'graphql-type-json';
|
||||||
@ -18,11 +18,11 @@ export class UserUncheckedUpdateWithoutRefreshTokensInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
firstName?: StringFieldUpdateOperationsInput;
|
firstName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
lastName?: StringFieldUpdateOperationsInput;
|
lastName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
email?: StringFieldUpdateOperationsInput;
|
email?: StringFieldUpdateOperationsInput;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Field } from '@nestjs/graphql';
|
import { Field } from '@nestjs/graphql';
|
||||||
import { InputType } from '@nestjs/graphql';
|
import { InputType } from '@nestjs/graphql';
|
||||||
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
||||||
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
|
||||||
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
||||||
|
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
||||||
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
||||||
import { HideField } from '@nestjs/graphql';
|
import { HideField } from '@nestjs/graphql';
|
||||||
import { GraphQLJSON } from 'graphql-type-json';
|
import { GraphQLJSON } from 'graphql-type-json';
|
||||||
@ -18,11 +18,11 @@ export class UserUncheckedUpdateWithoutWorkspaceMemberInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
firstName?: StringFieldUpdateOperationsInput;
|
firstName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
lastName?: StringFieldUpdateOperationsInput;
|
lastName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
email?: StringFieldUpdateOperationsInput;
|
email?: StringFieldUpdateOperationsInput;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Field } from '@nestjs/graphql';
|
import { Field } from '@nestjs/graphql';
|
||||||
import { InputType } from '@nestjs/graphql';
|
import { InputType } from '@nestjs/graphql';
|
||||||
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
||||||
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
|
||||||
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
||||||
|
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
||||||
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
||||||
import { HideField } from '@nestjs/graphql';
|
import { HideField } from '@nestjs/graphql';
|
||||||
import { GraphQLJSON } from 'graphql-type-json';
|
import { GraphQLJSON } from 'graphql-type-json';
|
||||||
@ -19,11 +19,11 @@ export class UserUncheckedUpdateInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
firstName?: StringFieldUpdateOperationsInput;
|
firstName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
lastName?: StringFieldUpdateOperationsInput;
|
lastName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
email?: StringFieldUpdateOperationsInput;
|
email?: StringFieldUpdateOperationsInput;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Field } from '@nestjs/graphql';
|
import { Field } from '@nestjs/graphql';
|
||||||
import { InputType } from '@nestjs/graphql';
|
import { InputType } from '@nestjs/graphql';
|
||||||
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
||||||
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
|
||||||
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
||||||
|
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
||||||
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
||||||
import { HideField } from '@nestjs/graphql';
|
import { HideField } from '@nestjs/graphql';
|
||||||
import { GraphQLJSON } from 'graphql-type-json';
|
import { GraphQLJSON } from 'graphql-type-json';
|
||||||
@ -15,11 +15,11 @@ export class UserUpdateManyMutationInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
firstName?: StringFieldUpdateOperationsInput;
|
firstName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
lastName?: StringFieldUpdateOperationsInput;
|
lastName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
email?: StringFieldUpdateOperationsInput;
|
email?: StringFieldUpdateOperationsInput;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Field } from '@nestjs/graphql';
|
import { Field } from '@nestjs/graphql';
|
||||||
import { InputType } from '@nestjs/graphql';
|
import { InputType } from '@nestjs/graphql';
|
||||||
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
||||||
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
|
||||||
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
||||||
|
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
||||||
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
||||||
import { HideField } from '@nestjs/graphql';
|
import { HideField } from '@nestjs/graphql';
|
||||||
import { GraphQLJSON } from 'graphql-type-json';
|
import { GraphQLJSON } from 'graphql-type-json';
|
||||||
@ -18,11 +18,11 @@ export class UserUpdateWithoutCommentsInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
firstName?: StringFieldUpdateOperationsInput;
|
firstName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
lastName?: StringFieldUpdateOperationsInput;
|
lastName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
email?: StringFieldUpdateOperationsInput;
|
email?: StringFieldUpdateOperationsInput;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Field } from '@nestjs/graphql';
|
import { Field } from '@nestjs/graphql';
|
||||||
import { InputType } from '@nestjs/graphql';
|
import { InputType } from '@nestjs/graphql';
|
||||||
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
||||||
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
|
||||||
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
||||||
|
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
||||||
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
||||||
import { HideField } from '@nestjs/graphql';
|
import { HideField } from '@nestjs/graphql';
|
||||||
import { GraphQLJSON } from 'graphql-type-json';
|
import { GraphQLJSON } from 'graphql-type-json';
|
||||||
@ -18,11 +18,11 @@ export class UserUpdateWithoutCompaniesInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
firstName?: StringFieldUpdateOperationsInput;
|
firstName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
lastName?: StringFieldUpdateOperationsInput;
|
lastName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
email?: StringFieldUpdateOperationsInput;
|
email?: StringFieldUpdateOperationsInput;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Field } from '@nestjs/graphql';
|
import { Field } from '@nestjs/graphql';
|
||||||
import { InputType } from '@nestjs/graphql';
|
import { InputType } from '@nestjs/graphql';
|
||||||
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
||||||
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
|
||||||
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
||||||
|
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
||||||
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
||||||
import { HideField } from '@nestjs/graphql';
|
import { HideField } from '@nestjs/graphql';
|
||||||
import { GraphQLJSON } from 'graphql-type-json';
|
import { GraphQLJSON } from 'graphql-type-json';
|
||||||
@ -18,11 +18,11 @@ export class UserUpdateWithoutRefreshTokensInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
firstName?: StringFieldUpdateOperationsInput;
|
firstName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
lastName?: StringFieldUpdateOperationsInput;
|
lastName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
email?: StringFieldUpdateOperationsInput;
|
email?: StringFieldUpdateOperationsInput;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Field } from '@nestjs/graphql';
|
import { Field } from '@nestjs/graphql';
|
||||||
import { InputType } from '@nestjs/graphql';
|
import { InputType } from '@nestjs/graphql';
|
||||||
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
||||||
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
|
||||||
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
||||||
|
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
||||||
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
||||||
import { HideField } from '@nestjs/graphql';
|
import { HideField } from '@nestjs/graphql';
|
||||||
import { GraphQLJSON } from 'graphql-type-json';
|
import { GraphQLJSON } from 'graphql-type-json';
|
||||||
@ -18,11 +18,11 @@ export class UserUpdateWithoutWorkspaceMemberInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
firstName?: StringFieldUpdateOperationsInput;
|
firstName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
lastName?: StringFieldUpdateOperationsInput;
|
lastName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
email?: StringFieldUpdateOperationsInput;
|
email?: StringFieldUpdateOperationsInput;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Field } from '@nestjs/graphql';
|
import { Field } from '@nestjs/graphql';
|
||||||
import { InputType } from '@nestjs/graphql';
|
import { InputType } from '@nestjs/graphql';
|
||||||
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
import { StringFieldUpdateOperationsInput } from '../prisma/string-field-update-operations.input';
|
||||||
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
|
||||||
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
import { NullableStringFieldUpdateOperationsInput } from '../prisma/nullable-string-field-update-operations.input';
|
||||||
|
import { BoolFieldUpdateOperationsInput } from '../prisma/bool-field-update-operations.input';
|
||||||
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
import { NullableDateTimeFieldUpdateOperationsInput } from '../prisma/nullable-date-time-field-update-operations.input';
|
||||||
import { HideField } from '@nestjs/graphql';
|
import { HideField } from '@nestjs/graphql';
|
||||||
import { GraphQLJSON } from 'graphql-type-json';
|
import { GraphQLJSON } from 'graphql-type-json';
|
||||||
@ -19,11 +19,11 @@ export class UserUpdateInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
firstName?: StringFieldUpdateOperationsInput;
|
firstName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
lastName?: StringFieldUpdateOperationsInput;
|
lastName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
email?: StringFieldUpdateOperationsInput;
|
email?: StringFieldUpdateOperationsInput;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import { Field } from '@nestjs/graphql';
|
import { Field } from '@nestjs/graphql';
|
||||||
import { InputType } from '@nestjs/graphql';
|
import { InputType } from '@nestjs/graphql';
|
||||||
import { StringFilter } from '../prisma/string-filter.input';
|
import { StringFilter } from '../prisma/string-filter.input';
|
||||||
import { BoolFilter } from '../prisma/bool-filter.input';
|
|
||||||
import { StringNullableFilter } from '../prisma/string-nullable-filter.input';
|
import { StringNullableFilter } from '../prisma/string-nullable-filter.input';
|
||||||
|
import { BoolFilter } from '../prisma/bool-filter.input';
|
||||||
import { DateTimeNullableFilter } from '../prisma/date-time-nullable-filter.input';
|
import { DateTimeNullableFilter } from '../prisma/date-time-nullable-filter.input';
|
||||||
import { HideField } from '@nestjs/graphql';
|
import { HideField } from '@nestjs/graphql';
|
||||||
import { JsonNullableFilter } from '../prisma/json-nullable-filter.input';
|
import { JsonNullableFilter } from '../prisma/json-nullable-filter.input';
|
||||||
@ -27,11 +27,11 @@ export class UserWhereInput {
|
|||||||
@Field(() => StringFilter, {nullable:true})
|
@Field(() => StringFilter, {nullable:true})
|
||||||
id?: StringFilter;
|
id?: StringFilter;
|
||||||
|
|
||||||
@Field(() => StringFilter, {nullable:true})
|
@Field(() => StringNullableFilter, {nullable:true})
|
||||||
firstName?: StringFilter;
|
firstName?: StringNullableFilter;
|
||||||
|
|
||||||
@Field(() => StringFilter, {nullable:true})
|
@Field(() => StringNullableFilter, {nullable:true})
|
||||||
lastName?: StringFilter;
|
lastName?: StringNullableFilter;
|
||||||
|
|
||||||
@Field(() => StringFilter, {nullable:true})
|
@Field(() => StringFilter, {nullable:true})
|
||||||
email?: StringFilter;
|
email?: StringFilter;
|
||||||
|
@ -15,11 +15,11 @@ export class User {
|
|||||||
@Field(() => ID, {nullable:false})
|
@Field(() => ID, {nullable:false})
|
||||||
id!: string;
|
id!: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
firstName!: string;
|
firstName!: string | null;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
lastName!: string;
|
lastName!: string | null;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:false})
|
||||||
email!: string;
|
email!: string;
|
||||||
|
@ -11,13 +11,15 @@ export class WorkspaceCreateManyInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutCommentThreadsInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutCommentsInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutCompaniesInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutPeopleInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutPipelineProgressesInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutPipelineStagesInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutPipelinesInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceCreateWithoutWorkspaceMemberInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -19,13 +19,15 @@ export class WorkspaceCreateInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -14,13 +14,15 @@ export class WorkspaceGroupBy {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id!: string;
|
id!: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -13,10 +13,12 @@ export class WorkspaceMaxAggregate {
|
|||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@Validator.IsOptional()
|
||||||
domainName?: string;
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@Validator.IsOptional()
|
||||||
displayName?: string;
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
|
@ -13,10 +13,12 @@ export class WorkspaceMinAggregate {
|
|||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@Validator.IsOptional()
|
||||||
domainName?: string;
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@Validator.IsOptional()
|
||||||
displayName?: string;
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
|
@ -21,11 +21,11 @@ export class WorkspaceScalarWhereWithAggregatesInput {
|
|||||||
@Field(() => StringWithAggregatesFilter, {nullable:true})
|
@Field(() => StringWithAggregatesFilter, {nullable:true})
|
||||||
id?: StringWithAggregatesFilter;
|
id?: StringWithAggregatesFilter;
|
||||||
|
|
||||||
@Field(() => StringWithAggregatesFilter, {nullable:true})
|
@Field(() => StringNullableWithAggregatesFilter, {nullable:true})
|
||||||
domainName?: StringWithAggregatesFilter;
|
domainName?: StringNullableWithAggregatesFilter;
|
||||||
|
|
||||||
@Field(() => StringWithAggregatesFilter, {nullable:true})
|
@Field(() => StringNullableWithAggregatesFilter, {nullable:true})
|
||||||
displayName?: StringWithAggregatesFilter;
|
displayName?: StringNullableWithAggregatesFilter;
|
||||||
|
|
||||||
@Field(() => StringNullableWithAggregatesFilter, {nullable:true})
|
@Field(() => StringNullableWithAggregatesFilter, {nullable:true})
|
||||||
logo?: StringNullableWithAggregatesFilter;
|
logo?: StringNullableWithAggregatesFilter;
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutCommentThreadsInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutCommentsInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutCompaniesInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutPeopleInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutPipelineProgressesInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutPipelineStagesInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutPipelinesInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -18,13 +18,15 @@ export class WorkspaceUncheckedCreateWithoutWorkspaceMemberInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -19,13 +19,15 @@ export class WorkspaceUncheckedCreateInput {
|
|||||||
@Validator.IsOptional()
|
@Validator.IsOptional()
|
||||||
id?: string;
|
id?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
domainName!: string;
|
@Validator.IsOptional()
|
||||||
|
domainName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:false})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
displayName!: string;
|
@Validator.IsOptional()
|
||||||
|
displayName?: string;
|
||||||
|
|
||||||
@Field(() => String, {nullable:true})
|
@Field(() => String, {nullable:true})
|
||||||
@Validator.IsString()
|
@Validator.IsString()
|
||||||
|
@ -12,11 +12,11 @@ export class WorkspaceUncheckedUpdateManyInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
domainName?: StringFieldUpdateOperationsInput;
|
domainName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
displayName?: StringFieldUpdateOperationsInput;
|
displayName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
logo?: NullableStringFieldUpdateOperationsInput;
|
logo?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutCommentThreadsInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
domainName?: StringFieldUpdateOperationsInput;
|
domainName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
displayName?: StringFieldUpdateOperationsInput;
|
displayName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
logo?: NullableStringFieldUpdateOperationsInput;
|
logo?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutCommentsInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
domainName?: StringFieldUpdateOperationsInput;
|
domainName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
displayName?: StringFieldUpdateOperationsInput;
|
displayName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
logo?: NullableStringFieldUpdateOperationsInput;
|
logo?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutCompaniesInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
domainName?: StringFieldUpdateOperationsInput;
|
domainName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
displayName?: StringFieldUpdateOperationsInput;
|
displayName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
logo?: NullableStringFieldUpdateOperationsInput;
|
logo?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutPeopleInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
domainName?: StringFieldUpdateOperationsInput;
|
domainName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
displayName?: StringFieldUpdateOperationsInput;
|
displayName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
logo?: NullableStringFieldUpdateOperationsInput;
|
logo?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutPipelineProgressesInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
domainName?: StringFieldUpdateOperationsInput;
|
domainName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
displayName?: StringFieldUpdateOperationsInput;
|
displayName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
logo?: NullableStringFieldUpdateOperationsInput;
|
logo?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutPipelineStagesInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
domainName?: StringFieldUpdateOperationsInput;
|
domainName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
displayName?: StringFieldUpdateOperationsInput;
|
displayName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
logo?: NullableStringFieldUpdateOperationsInput;
|
logo?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutPipelinesInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
domainName?: StringFieldUpdateOperationsInput;
|
domainName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
displayName?: StringFieldUpdateOperationsInput;
|
displayName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
logo?: NullableStringFieldUpdateOperationsInput;
|
logo?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
@ -19,11 +19,11 @@ export class WorkspaceUncheckedUpdateWithoutWorkspaceMemberInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
domainName?: StringFieldUpdateOperationsInput;
|
domainName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
displayName?: StringFieldUpdateOperationsInput;
|
displayName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
logo?: NullableStringFieldUpdateOperationsInput;
|
logo?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
@ -20,11 +20,11 @@ export class WorkspaceUncheckedUpdateInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
domainName?: StringFieldUpdateOperationsInput;
|
domainName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
displayName?: StringFieldUpdateOperationsInput;
|
displayName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
logo?: NullableStringFieldUpdateOperationsInput;
|
logo?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
@ -12,11 +12,11 @@ export class WorkspaceUpdateManyMutationInput {
|
|||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
||||||
id?: StringFieldUpdateOperationsInput;
|
id?: StringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
domainName?: StringFieldUpdateOperationsInput;
|
domainName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => StringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
displayName?: StringFieldUpdateOperationsInput;
|
displayName?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
|
||||||
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
@Field(() => NullableStringFieldUpdateOperationsInput, {nullable:true})
|
||||||
logo?: NullableStringFieldUpdateOperationsInput;
|
logo?: NullableStringFieldUpdateOperationsInput;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user