Skip to content

Commit 65bcad6

Browse files
committed
feat: added ai workflow list component to create or update default reviewer form
1 parent c213504 commit 65bcad6

File tree

5 files changed

+84
-88
lines changed

5 files changed

+84
-88
lines changed

src/apps/admin/src/lib/components/DefaultReviewersAddForm/DefaultReviewersAddForm.tsx

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,7 @@
1-
import {
2-
useCallback,
3-
useEffect,
4-
useMemo,
5-
useState,
6-
} from 'react'
71
import type { FC } from 'react'
8-
import { useNavigate, useParams } from 'react-router-dom'
9-
import type { NavigateFunction } from 'react-router-dom'
10-
import { Controller, useForm } from 'react-hook-form'
11-
import type {
12-
ControllerRenderProps,
13-
UseFormReturn,
14-
} from 'react-hook-form'
2+
import { useCallback, useEffect, useMemo, useState } from 'react'
3+
import { NavigateFunction, useNavigate, useParams } from 'react-router-dom'
4+
import { Controller, ControllerRenderProps, useForm, UseFormReturn } from 'react-hook-form'
155
import _ from 'lodash'
166
import classNames from 'classnames'
177

@@ -25,13 +15,14 @@ import {
2515
LinkButton,
2616
} from '~/libs/ui'
2717

28-
import { FormAddWrapper } from '../common/FormAddWrapper'
29-
import { FormAddDefaultReviewer } from '../../models'
30-
import { formAddDefaultReviewerSchema } from '../../utils'
3118
import {
3219
useManageAddDefaultReviewer,
3320
useManageAddDefaultReviewerProps,
3421
} from '../../hooks'
22+
import { FormAddWrapper } from '../common/FormAddWrapper'
23+
import { FormAddDefaultReviewer } from '../../models'
24+
import { formAddDefaultReviewerSchema } from '../../utils'
25+
import { getAiWorkflows } from '../../services/ai-workflows.service'
3526

3627
import styles from './DefaultReviewersAddForm.module.scss'
3728

@@ -127,6 +118,7 @@ export const DefaultReviewersAddForm: FC<Props> = (props: Props) => {
127118
formState: { errors, isDirty },
128119
}: UseFormReturn<FormAddDefaultReviewer> = useForm({
129120
defaultValues: {
121+
aiWorkflowId: '',
130122
baseCoefficient: 0,
131123
fixedAmount: 0,
132124
incrementalCoefficient: 0,
@@ -165,11 +157,22 @@ export const DefaultReviewersAddForm: FC<Props> = (props: Props) => {
165157
[doAddDefaultReviewer, doUpdateDefaultReviewer, isEdit, navigate],
166158
)
167159

160+
const [aiWorkflows, setAiWorkflows] = useState<{ label: string; value: string }[]>([])
161+
162+
useEffect(() => {
163+
getAiWorkflows()
164+
.then((workflows: { id: string; name: string }[]) => {
165+
const options = workflows.map((wf: { id: string; name: string }) => ({ label: wf.name, value: wf.id }))
166+
setAiWorkflows(options)
167+
})
168+
}, [])
169+
168170
const isMemberReview = watch('isMemberReview')
169171

170172
useEffect(() => {
171173
if (defaultReviewerInfo) {
172174
reset({
175+
aiWorkflowId: defaultReviewerInfo.aiWorkflowId ?? '',
173176
baseCoefficient: defaultReviewerInfo.baseCoefficient ?? 0,
174177
fixedAmount: defaultReviewerInfo.fixedAmount ?? 0,
175178
incrementalCoefficient: defaultReviewerInfo.incrementalCoefficient ?? 0,
@@ -460,17 +463,18 @@ export const DefaultReviewersAddForm: FC<Props> = (props: Props) => {
460463
)
461464
}}
462465
/>
466+
463467
<div className={styles.inputField}>
464468
<Controller
465-
name='isAIReviewer'
469+
name='shouldOpenOpportunity'
466470
control={control}
467471
render={function render(controlProps: {
468-
field: ControllerRenderProps<FormAddDefaultReviewer, 'isAIReviewer'>
469-
}) {
472+
field: ControllerRenderProps<FormAddDefaultReviewer, 'shouldOpenOpportunity'>
473+
}) {
470474
return (
471475
<InputCheckbox
472-
name='isAIReviewer'
473-
label='Is AI Reviewer'
476+
name='shouldOpenOpportunity'
477+
label='Should Open Opportunity'
474478
onChange={function onChange(event: Event) {
475479
const target = event.target as HTMLInputElement | null
476480
controlProps.field.onChange(target?.checked ?? false)
@@ -482,28 +486,31 @@ export const DefaultReviewersAddForm: FC<Props> = (props: Props) => {
482486
}}
483487
/>
484488
</div>
485-
<div className={styles.inputField}>
489+
{!isMemberReview && (
486490
<Controller
487-
name='shouldOpenOpportunity'
491+
name='aiWorkflowId'
488492
control={control}
489493
render={function render(controlProps: {
490-
field: ControllerRenderProps<FormAddDefaultReviewer, 'shouldOpenOpportunity'>
494+
field: ControllerRenderProps<FormAddDefaultReviewer, 'aiWorkflowId'>
491495
}) {
492496
return (
493-
<InputCheckbox
494-
name='shouldOpenOpportunity'
495-
label='Should Open Opportunity'
496-
onChange={function onChange(event: Event) {
497-
const target = event.target as HTMLInputElement | null
498-
controlProps.field.onChange(target?.checked ?? false)
499-
}}
500-
checked={controlProps.field.value}
497+
<InputSelectReact
498+
name='aiWorkflowId'
499+
label='AI Workflow'
500+
placeholder='Select AI Workflow'
501+
options={aiWorkflows}
502+
value={controlProps.field.value}
503+
onChange={controlProps.field.onChange}
504+
onBlur={controlProps.field.onBlur}
505+
classNameWrapper={styles.inputField}
501506
disabled={isLoading}
507+
dirty
508+
error={_.get(errors, 'aiWorkflowId.message')}
502509
/>
503510
)
504511
}}
505512
/>
506-
</div>
513+
)}
507514
</FormAddWrapper>
508515
<ConfirmModal
509516
title='Delete Confirmation'

src/apps/admin/src/lib/models/DefaultChallengeReviewer.model.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export interface DefaultChallengeReviewer {
1313
incrementalCoefficient?: number;
1414
opportunityType?: string;
1515
isAIReviewer: boolean;
16+
aiWorkflowId?: string;
1617
shouldOpenOpportunity: boolean;
1718
createdAt: string;
1819
createdBy: string;
@@ -42,4 +43,5 @@ export interface FormAddDefaultReviewer {
4243
opportunityType?: string;
4344
isAIReviewer: boolean;
4445
shouldOpenOpportunity: boolean;
46+
aiWorkflowId?: string;
4547
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { EnvironmentConfig } from '~/config'
2+
import { xhrGetAsync } from '~/libs/core'
3+
4+
export interface AiWorkflow {
5+
id: string;
6+
name: string;
7+
}
8+
9+
export async function getAiWorkflows(): Promise<AiWorkflow[]> {
10+
const response = await xhrGetAsync<AiWorkflow[]>(`${EnvironmentConfig.API.V6}/workflows`)
11+
return response
12+
}

src/apps/admin/src/lib/utils/validation-schemas.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ export const formSearchDefaultReviewersSchema: Yup.ObjectSchema<FormSearchDefaul
2020

2121
export const formAddDefaultReviewerSchema: Yup.ObjectSchema<FormAddDefaultReviewer>
2222
= Yup.object({
23+
aiWorkflowId: Yup.string()
24+
.optional(),
2325
baseCoefficient: Yup.number()
2426
.optional()
2527
.min(0, 'Must be non-negative'),

yarn.lock

Lines changed: 28 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -5741,17 +5741,18 @@ axios@*, axios@^1.12.0, axios@^1.7.4:
57415741
form-data "^4.0.4"
57425742
proxy-from-env "^1.1.0"
57435743

5744-
axios@^0.25.0:
5745-
version "0.25.0"
5746-
resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a"
5747-
integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==
5744+
axios@^0.27.2:
5745+
version "0.27.2"
5746+
resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972"
5747+
integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==
57485748
dependencies:
5749-
follow-redirects "^1.14.7"
5749+
follow-redirects "^1.14.9"
5750+
form-data "^4.0.0"
57505751

5751-
axobject-query@^2.2.0:
5752-
version "2.2.0"
5753-
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be"
5754-
integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==
5752+
axobject-query@^4.1.0:
5753+
version "4.1.0"
5754+
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee"
5755+
integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==
57555756

57565757
babel-core@^7.0.0-bridge.0:
57575758
version "7.0.0-bridge.0"
@@ -8291,7 +8292,7 @@ es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
82918292
dependencies:
82928293
es-errors "^1.3.0"
82938294

8294-
es-set-tostringtag@^2.1.0:
8295+
es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0:
82958296
version "2.1.0"
82968297
resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d"
82978298
integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
@@ -8301,16 +8302,6 @@ es-set-tostringtag@^2.1.0:
83018302
has-tostringtag "^1.0.2"
83028303
hasown "^2.0.2"
83038304

8304-
es-shim-unscopables@^1.0.0:
8305-
version "1.0.0"
8306-
resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241"
8307-
integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==
8308-
dependencies:
8309-
es-errors "^1.3.0"
8310-
get-intrinsic "^1.2.6"
8311-
has-tostringtag "^1.0.2"
8312-
hasown "^2.0.2"
8313-
83148305
es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0:
83158306
version "1.1.0"
83168307
resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5"
@@ -9464,15 +9455,27 @@ flux-standard-action@^2.0.3:
94649455
lodash.isplainobject "^4.0.6"
94659456
lodash.isstring "^4.0.1"
94669457

9467-
follow-redirects@^1.0.0, follow-redirects@^1.14.7, follow-redirects@^1.15.6:
9458+
follow-redirects@^1.0.0, follow-redirects@^1.15.6:
94689459
version "1.15.9"
94699460
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1"
94709461
integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==
94719462

9463+
follow-redirects@^1.14.9, follow-redirects@^1.15.2:
9464+
version "1.15.11"
9465+
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340"
9466+
integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==
9467+
94729468
for-each@^0.3.3:
94739469
version "0.3.3"
94749470
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
94759471
integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
9472+
dependencies:
9473+
is-callable "^1.1.3"
9474+
9475+
for-each@^0.3.5:
9476+
version "0.3.5"
9477+
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47"
9478+
integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==
94769479
dependencies:
94779480
is-callable "^1.2.7"
94789481

@@ -10009,27 +10012,13 @@ has-symbols@^1.0.1, has-symbols@^1.0.3, has-symbols@^1.1.0:
1000910012
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
1001010013
integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
1001110014

10012-
has-tostringtag@^1.0.0:
10013-
version "1.0.0"
10014-
resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
10015-
integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
10016-
dependencies:
10017-
has-symbols "^1.0.2"
10018-
1001910015
has-tostringtag@^1.0.2:
1002010016
version "1.0.2"
1002110017
resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
1002210018
integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
1002310019
dependencies:
1002410020
has-symbols "^1.0.3"
1002510021

10026-
has@^1.0.3:
10027-
version "1.0.3"
10028-
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
10029-
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
10030-
dependencies:
10031-
has-symbols "^1.0.3"
10032-
1003310022
hasha@^5.0.0:
1003410023
version "5.2.2"
1003510024
resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1"
@@ -17584,7 +17573,7 @@ stringify-object@^3.3.0:
1758417573
is-obj "^1.0.1"
1758517574
is-regexp "^1.0.0"
1758617575

17587-
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
17576+
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
1758817577
version "6.0.1"
1758917578
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
1759017579
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@@ -17598,13 +17587,6 @@ strip-ansi@^3.0.0:
1759817587
dependencies:
1759917588
ansi-regex "^2.0.0"
1760017589

17601-
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
17602-
version "6.0.1"
17603-
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
17604-
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
17605-
dependencies:
17606-
ansi-regex "^5.0.1"
17607-
1760817590
strip-ansi@^7.0.1:
1760917591
version "7.1.2"
1761017592
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba"
@@ -17974,9 +17956,9 @@ tar@^6.2.1:
1797417956
mkdirp "^1.0.3"
1797517957
yallist "^4.0.0"
1797617958

17977-
tc-auth-lib@topcoder-platform/tc-auth-lib#1.0.27:
17959+
tc-auth-lib@topcoder-platform/tc-auth-lib#master:
1797817960
version "1.0.2"
17979-
resolved "https://codeload.github.com/topcoder-platform/tc-auth-lib/tar.gz/dc5b3a29ac3b8e2a0f386fce411c6533c2f33f05"
17961+
resolved "https://codeload.github.com/topcoder-platform/tc-auth-lib/tar.gz/1c9be61eb32583beeb74f596fe58bb3ada97462d"
1798017962
dependencies:
1798117963
lodash "^4.17.19"
1798217964

@@ -19641,7 +19623,7 @@ workbox-window@6.6.1:
1964119623
"@types/trusted-types" "^2.0.2"
1964219624
workbox-core "6.6.1"
1964319625

19644-
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
19626+
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
1964519627
version "7.0.0"
1964619628
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
1964719629
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
@@ -19659,15 +19641,6 @@ wrap-ansi@^6.2.0:
1965919641
string-width "^4.1.0"
1966019642
strip-ansi "^6.0.0"
1966119643

19662-
wrap-ansi@^7.0.0:
19663-
version "7.0.0"
19664-
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
19665-
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
19666-
dependencies:
19667-
ansi-styles "^4.0.0"
19668-
string-width "^4.1.0"
19669-
strip-ansi "^6.0.0"
19670-
1967119644
wrap-ansi@^8.0.1, wrap-ansi@^8.1.0:
1967219645
version "8.1.0"
1967319646
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"

0 commit comments

Comments
 (0)