From 3c97757e4d2f3e7f851009237cb715736b95bbe2 Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Mon, 20 Jan 2025 19:42:33 +0800 Subject: [PATCH] 4.8.19-feature (#3636) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: sync org from wecom, pref: member list pagination (#3549) * feat: sync org * chore: fe * chore: loading * chore: type * pref: team member list change to pagination. Edit a sort of list apis. * feat: member update avatar * chore: user avatar move to tmb * chore: init scripts move user avatar * chore: sourceMember * fix: list api sourceMember * fix: member sync * fix: pagination * chore: adjust code * chore: move changeOwner to pro * chore: init v4819 script * chore: adjust code * chore: UserBox * perf: scroll page code * perf: list data * docs:更新用户答疑 (#3576) * docs: add custom uid docs (#3572) * fix: pagination bug (#3577) * 4.8.19 test (#3584) * faet: dataset search filter * fix: scroll page * fix: collection list api old version (#3591) * fix: collection list api format * fix: type error of addSourceMemeber * fix: scroll fetch (#3592) * fix: yuque dataset file folder can enter (#3593) * perf: load members;perf: yuque load;fix: workflow llm params cannot close (#3594) * chat openapi doc * feat: dataset openapi doc * perf: load members * perf: member load code * perf: yuque load * fix: workflow llm params cannot close * fix: api dataset reference tag preview (#3600) * perf: doc * feat: chat page config * fix: http parse (#3634) * update doc * fix: http parse * fix code run node reset template (#3633) Co-authored-by: Archer <545436317@qq.com> * docs:faq (#3627) * docs:faq * docsFix * perf: sleep plugin * fix: selector --------- Co-authored-by: Finley Ge <32237950+FinleyGe@users.noreply.github.com> Co-authored-by: Jiangween <145003935+Jiangween@users.noreply.github.com> Co-authored-by: heheer --- docSite/assets/imgs/dataset3.png | Bin 0 -> 35894 bytes docSite/assets/imgs/dataset4.png | Bin 0 -> 12005 bytes docSite/assets/imgs/faq1.png | Bin 0 -> 26802 bytes docSite/assets/imgs/faq2.png | Bin 0 -> 57155 bytes docSite/assets/imgs/faq3.png | Bin 0 -> 178703 bytes docSite/assets/imgs/other1.png | Bin 0 -> 22186 bytes docSite/assets/imgs/other2.png | Bin 0 -> 7869 bytes docSite/assets/imgs/other3.png | Bin 0 -> 32074 bytes docSite/assets/imgs/quizApp1.png | Bin 0 -> 22442 bytes docSite/assets/imgs/quizApp2.png | Bin 0 -> 48689 bytes docSite/content/zh-cn/docs/development/faq.md | 47 +++ .../zh-cn/docs/development/openapi/auth.md | 26 +- .../zh-cn/docs/development/openapi/chat.md | 2 +- .../zh-cn/docs/development/openapi/dataset.md | 21 +- .../zh-cn/docs/development/upgrading/4819.md | 22 ++ docSite/content/zh-cn/docs/faq/app.md | 42 ++ docSite/content/zh-cn/docs/faq/dataset.md | 23 +- docSite/content/zh-cn/docs/faq/other.md | 12 +- .../docs/guide/knowledge_base/lark_dataset.md | 3 +- .../docs/guide/workbench/workflow/loop.md | 30 +- .../app-cases/multi_turn_translation_bot.md | 2 +- .../app-cases/translate-subtitle-using-gpt.md | 4 +- .../global/common/system/types/index.d.ts | 3 +- packages/global/core/app/constants.ts | 2 +- packages/global/core/app/type.d.ts | 4 +- packages/global/core/app/version.d.ts | 3 + packages/global/core/dataset/apiDataset.d.ts | 1 + packages/global/core/dataset/type.d.ts | 2 + packages/global/core/dataset/utils.ts | 2 +- packages/global/core/workflow/constants.ts | 1 + .../global/core/workflow/runtime/type.d.ts | 4 + .../workflow/template/system/datasetSearch.ts | 7 + packages/global/core/workflow/type/node.d.ts | 1 + .../global/support/user/team/controller.d.ts | 1 + .../global/support/user/team/org/constant.ts | 8 +- .../global/support/user/team/org/type.d.ts | 3 +- packages/global/support/user/team/type.d.ts | 1 + packages/global/support/user/type.d.ts | 10 +- packages/plugins/register.ts | 6 +- packages/plugins/src/delay/index.ts | 18 + .../src/{sleep => delay}/template.json | 113 ++---- packages/plugins/src/sleep/index.ts | 17 - packages/service/common/api/pagination.ts | 21 + packages/service/common/middle/cors.ts | 2 +- .../service/core/dataset/apiDataset/api.ts | 8 +- .../service/core/dataset/search/controller.ts | 4 +- packages/service/core/dataset/utils.ts | 39 ++ .../core/workflow/dispatch/dataset/search.ts | 55 ++- .../core/workflow/dispatch/plugin/run.ts | 1 + .../core/workflow/dispatch/tools/http468.ts | 16 +- .../service/support/permission/controller.ts | 9 +- .../support/permission/org/orgSchema.ts | 11 +- packages/service/support/user/controller.ts | 2 +- packages/service/support/user/schema.ts | 11 +- .../service/support/user/team/controller.ts | 2 +- .../support/user/team/teamMemberSchema.ts | 6 +- packages/service/support/user/utils.ts | 41 ++ packages/web/common/fetch/type.d.ts | 15 +- .../components/common/Avatar/AvatarGroup.tsx | 2 +- .../web/components/common/MySelect/index.tsx | 84 ++-- .../web/components/common/UserBox/index.tsx | 23 ++ packages/web/hooks/usePagination.tsx | 63 ++- packages/web/hooks/useScrollPagination.tsx | 8 +- packages/web/i18n/en/common.json | 3 +- packages/web/i18n/en/workflow.json | 2 + packages/web/i18n/zh-CN/account_team.json | 5 +- packages/web/i18n/zh-CN/common.json | 3 +- packages/web/i18n/zh-CN/workflow.json | 2 + packages/web/i18n/zh-Hant/common.json | 3 +- packages/web/i18n/zh-Hant/workflow.json | 2 + projects/app/.env.template | 2 + projects/app/package.json | 2 +- .../components/core/app/InputGuideConfig.tsx | 4 +- .../chat/ChatContainer/ChatBox/Provider.tsx | 8 +- .../ChatBox/components/ChatItem.tsx | 3 +- .../ChatBox/components/QuoteModal.tsx | 32 +- .../ChatBox/components/ResponseTags.tsx | 3 - .../core/chat/ChatContainer/ChatBox/index.tsx | 1 - .../chat/components/WholeResponseModal.tsx | 9 +- .../components/core/dataset/RawSourceBox.tsx | 4 +- .../permission/ChangeOwnerModal/index.tsx | 57 ++- .../permission/MemberManager/MemberModal.tsx | 297 +++++++------- projects/app/src/global/core/api/appReq.d.ts | 6 +- .../app/src/global/core/api/datasetReq.d.ts | 6 +- .../account/team}/EditInfoModal.tsx | 0 .../team}/GroupManage/GroupInfoModal.tsx | 4 +- .../team}/GroupManage/GroupManageMember.tsx | 35 +- .../GroupManage/GroupTransferOwnerModal.tsx | 0 .../account/team}/GroupManage/index.tsx | 70 ++-- .../account/team}/InviteModal.tsx | 0 .../account/team}/MemberTable.tsx | 188 +++++---- .../account/team}/OrgManage/IconButton.tsx | 0 .../account/team}/OrgManage/OrgInfoModal.tsx | 0 .../team}/OrgManage/OrgMemberManageModal.tsx | 63 +-- .../account/team}/OrgManage/OrgMoveModal.tsx | 0 .../account/team}/OrgManage/OrgTree.tsx | 0 .../account/team/OrgManage/index.tsx | 369 ++++++++++++++++++ .../account/team}/PermissionManage/index.tsx | 2 +- .../account/team}/SelectMember.tsx | 0 .../account/team}/context.tsx | 30 +- .../account/bill/components/BillTable.tsx | 17 +- .../account/bill/components/InvoiceTable.tsx | 5 +- projects/app/src/pages/account/info/index.tsx | 9 +- projects/app/src/pages/account/inform.tsx | 6 +- projects/app/src/pages/account/promotion.tsx | 5 +- .../team/components/OrgManage/index.tsx | 354 ----------------- projects/app/src/pages/account/team/index.tsx | 144 +++---- .../app/src/pages/account/usage/index.tsx | 20 +- projects/app/src/pages/api/admin/initv4818.ts | 38 +- projects/app/src/pages/api/admin/initv4819.ts | 55 +++ .../pages/api/common/system/getInitData.ts | 3 +- .../app/src/pages/api/core/app/getChatLogs.ts | 24 +- projects/app/src/pages/api/core/app/list.ts | 17 +- .../src/pages/api/core/app/version/list.ts | 47 +-- .../api/core/app/version/publish.test.ts | 1 - .../app/src/pages/api/core/chat/chatTest.ts | 4 + .../src/pages/api/core/chat/getHistories.ts | 6 +- .../api/core/chat/getPaginationRecords.ts | 14 +- .../pages/api/core/chat/inputGuide/list.ts | 4 +- .../pages/api/core/dataset/collection/list.ts | 6 +- .../api/core/dataset/collection/listV2.ts | 192 +++++++++ .../api/core/dataset/collection/scrollList.ts | 4 +- .../src/pages/api/core/dataset/data/list.ts | 18 +- .../pages/api/core/dataset/data/v2/list.ts | 4 +- .../app/src/pages/api/core/dataset/list.ts | 32 +- .../app/src/pages/api/core/workflow/debug.ts | 6 +- .../pages/api/support/user/account/update.ts | 41 +- .../app/src/pages/api/v1/chat/completions.ts | 4 + .../components/Logs/DetailLogsModal.tsx | 9 +- .../app/detail/components/Logs/index.tsx | 23 +- .../components/PublishHistoriesSlider.tsx | 72 ++-- .../detail/components/SimpleApp/ChatTest.tsx | 7 +- .../WorkflowComponents/Flow/ChatTest.tsx | 7 +- .../Flow/NodeTemplatesModal.tsx | 21 +- .../Flow/nodes/NodeCode.tsx | 85 ++-- .../Flow/nodes/render/RenderInput/Label.tsx | 14 +- .../Flow/nodes/render/RenderInput/index.tsx | 109 +++--- .../RenderInput/templates/SelectDataset.tsx | 60 ++- .../render/RenderInput/templates/Textarea.tsx | 8 + .../app/detail/components/useChatTest.tsx | 2 - .../src/pages/app/list/components/List.tsx | 24 +- .../src/pages/chat/components/ChatHeader.tsx | 4 +- .../chat/components/ChatHistorySlider.tsx | 8 +- .../src/pages/chat/components/SliderApps.tsx | 56 +-- .../src/pages/chat/components/ToolMenu.tsx | 21 +- projects/app/src/pages/chat/index.tsx | 16 +- projects/app/src/pages/chat/share.tsx | 10 +- projects/app/src/pages/chat/team.tsx | 14 +- .../components/CollectionCard/Context.tsx | 3 +- .../Import/diffSource/APIDataset.tsx | 4 +- .../src/pages/dataset/list/component/List.tsx | 22 +- projects/app/src/service/core/app/utils.ts | 4 + projects/app/src/types/app.d.ts | 3 + projects/app/src/types/index.d.ts | 9 - projects/app/src/web/core/app/api.ts | 4 +- projects/app/src/web/core/app/api/plugin.ts | 3 +- projects/app/src/web/core/app/api/version.ts | 2 +- .../web/core/chat/context/chatItemContext.tsx | 33 +- .../core/chat/context/chatRecordContext.tsx | 4 +- projects/app/src/web/core/dataset/api.ts | 5 +- .../dataset/components/SelectCollections.tsx | 30 +- projects/app/src/web/core/workflow/utils.ts | 2 +- .../src/web/support/activity/promotion/api.ts | 11 +- projects/app/src/web/support/user/api.ts | 2 + .../app/src/web/support/user/inform/api.ts | 8 +- projects/app/src/web/support/user/team/api.ts | 5 +- .../app/src/web/support/user/useUserStore.ts | 20 +- .../app/src/web/support/wallet/bill/api.ts | 8 +- .../web/support/wallet/bill/invoice/api.ts | 6 +- .../app/src/web/support/wallet/usage/api.ts | 15 +- 170 files changed, 2317 insertions(+), 1615 deletions(-) create mode 100644 docSite/assets/imgs/dataset3.png create mode 100644 docSite/assets/imgs/dataset4.png create mode 100644 docSite/assets/imgs/faq1.png create mode 100644 docSite/assets/imgs/faq2.png create mode 100644 docSite/assets/imgs/faq3.png create mode 100644 docSite/assets/imgs/other1.png create mode 100644 docSite/assets/imgs/other2.png create mode 100644 docSite/assets/imgs/other3.png create mode 100644 docSite/assets/imgs/quizApp1.png create mode 100644 docSite/assets/imgs/quizApp2.png create mode 100644 docSite/content/zh-cn/docs/development/upgrading/4819.md create mode 100644 packages/plugins/src/delay/index.ts rename packages/plugins/src/{sleep => delay}/template.json (73%) delete mode 100644 packages/plugins/src/sleep/index.ts create mode 100644 packages/service/common/api/pagination.ts create mode 100644 packages/service/core/dataset/utils.ts create mode 100644 packages/web/components/common/UserBox/index.tsx rename projects/app/src/{pages/account/team/components => pageComponents/account/team}/EditInfoModal.tsx (100%) rename projects/app/src/{pages/account/team/components => pageComponents/account/team}/GroupManage/GroupInfoModal.tsx (96%) rename projects/app/src/{pages/account/team/components => pageComponents/account/team}/GroupManage/GroupManageMember.tsx (90%) rename projects/app/src/{pages/account/team/components => pageComponents/account/team}/GroupManage/GroupTransferOwnerModal.tsx (100%) rename projects/app/src/{pages/account/team/components => pageComponents/account/team}/GroupManage/index.tsx (89%) rename projects/app/src/{pages/account/team/components => pageComponents/account/team}/InviteModal.tsx (100%) rename projects/app/src/{pages/account/team/components => pageComponents/account/team}/MemberTable.tsx (53%) rename projects/app/src/{pages/account/team/components => pageComponents/account/team}/OrgManage/IconButton.tsx (100%) rename projects/app/src/{pages/account/team/components => pageComponents/account/team}/OrgManage/OrgInfoModal.tsx (100%) rename projects/app/src/{pages/account/team/components => pageComponents/account/team}/OrgManage/OrgMemberManageModal.tsx (78%) rename projects/app/src/{pages/account/team/components => pageComponents/account/team}/OrgManage/OrgMoveModal.tsx (100%) rename projects/app/src/{pages/account/team/components => pageComponents/account/team}/OrgManage/OrgTree.tsx (100%) create mode 100644 projects/app/src/pageComponents/account/team/OrgManage/index.tsx rename projects/app/src/{pages/account/team/components => pageComponents/account/team}/PermissionManage/index.tsx (99%) rename projects/app/src/{pages/account/team/components => pageComponents/account/team}/SelectMember.tsx (100%) rename projects/app/src/{pages/account/team/components => pageComponents/account/team}/context.tsx (86%) delete mode 100644 projects/app/src/pages/account/team/components/OrgManage/index.tsx create mode 100644 projects/app/src/pages/api/admin/initv4819.ts create mode 100644 projects/app/src/pages/api/core/dataset/collection/listV2.ts diff --git a/docSite/assets/imgs/dataset3.png b/docSite/assets/imgs/dataset3.png new file mode 100644 index 0000000000000000000000000000000000000000..c36b92e81db38d3868035b5c33ecaff2c89ca886 GIT binary patch literal 35894 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 Zq|>LmT!RGy4Kx-YxCaO{4viCny9Pqz?(PzJ zeCNJ8b^g6`@2jtFy;pZtjs0h@xp$4Z$DVVoHRt2+$2q_!z;jeoG*p!5XlQ8Y=+7~* z2(hs+F|o+-32+Ii$Z4pl$SEmlK^%;o(Kte(K#{m5Af%FWB zjDm{x932Dm1>hMH5cmukh=PKQ{4_J*=^g+X4+Z}vw=^n&h8Y?in2;wpKKD7jOjQSw z=J+v)*W5J(9fO#Jl#HC=6(bWf3m?CLppdZ0>o>A;@(PMd@3gdaboKNNEG(_8ZEWrA z-P}Dqy}W&VLqCOue~yTRBqV-GN>2HjnwFPeQ24E=xa50vO>JF0yrHq_XJ=P;Pj6rU zz{KR#uj!fJvxt?|we^k7t?ixNlhd>Fi_5F)n_DCR@IUB0UH^m7zwp6(;`0m{8HkMb z7ayc&UQYnxA)~zHM#Y!bKr;gq(D4L6CzOfLt?EFh=hZwWGIt%vAO`WRFr55F=^u># zJwhS>B}V@w^iMvI2mlrk>FI+3@c@#5t6iqNAdLSuRES;&pJ0fSZ-|K&Dy-=?vcw97 ztsBakT~+2JJ6eVT&ik+M8>sFD1+FA);>BEVoHg#@*ma-P!DDw?bt}d0xY#@4*pl56 zymxQH)}hm^x)Jk((e;9_r>;O57`q>-u2aow>LxCR->WxGyKLCRa2&i+|7vt&HVY5} zf^O41iAEKRH4hQWk+6x?S7|S>s!Bt~x8fT-$gaxed-iei3k`lE_ES=1WFbq+?Zh1+ zK|{k0!M)QB*sLnQUY#&TMC(YfdB)^IrK#)i`(PVe_}u=I$QH=U>TyPwdwyRzmK6`a zLA~E6B?w@_&gnxndA~o?4+-LN1qbh$5Us>Wc1a#Xw%vA;7a24zBcha=(kLuw($5~Y zCH5`ETOG2iUNl@dDX!WHRF z2Y#H>Lh}kL@MF8uR2E5(#Rwd{JPq8HE)k(~!|aVXl_7*l9YP@YzRlXqHvFX|=$S$C z&DZ6CB8?{h#7DrhZeq+VxGWFT1e2yv$8!jgtKzcz`s5B4Qyv8HcY+mq(v$gpe#zVO zNPcqS)KB&GNW6hG`N8i_w%X4O;cCG^!ZWDVZdyWLPRe+fSQg`uR_M07b z^P!QHddC_yUx$7xyEREAY!VX97fC%Gs)>mxylIdSx^ zeVwe4TqrfgyyEAOPcPRPs(pIAQF9xPXCVHnJ`R3m_5!zDRTk`D$UmH=g6Js+5($oY4QOkn#4-K2eXp(gDVYA6Q#^#=Q~H5~~wT zRS`PBi^xhaqm=DtwOsGP|aWtXvP9Z`YrGhA(jB#m$aHtdm&Fs95^v zoQx8c^NHU08^i2pFlmw)LiA@@>J@2tg(W_Nfya5vZn|DJJ%ZF|eqSd9r`QfRlL$ae zwgMS8@L??{58@M?$dyr)#7vpR9gAP|M}#^eh@Vx{-b;I4#P3cZefvHv!0N zY3_OiQ1G?mc!%#P8VmUK)SJe#xrQ14UUxs3Xi|ITJ%7DAuzAVO;vlM*Ay=(T>%!d> z$0Z8BnXDlisfREXaOLG^c{}CW6(!L{%IUA0ewQei)-vHd9-4e^enOlGDp;m7>Cwyn zwhNfe3z7ze#>)Z-HU2^x6Ce-r_n;!>f%{tU0k48E{Z6lb2NB8h3Jsm{q~e0+z5Q)S z;}XTS0S(Eu!I5&}GjqYYzQ7QTE49h0%U2o3U(>|$mq{Qk%~9=G^Zlp&=}|`6t26=f zE1}oq7un?337i<-Z|}5S#imp%nID*OF(f5E2F>)Rd2C#T`KzLg$%S93H4MtlzZm#1 z@UaDQjvL)3__+%%Vilgvu}8XW_^o4)zFbOTx9EcZtw^LeuH=OK+#`VS8iGlRo_u=g zY}~3i$bIXo8W5UeTi-@C2IEU-=n@zYLu;nq59sf|cNly?x#qo-R0$+7>5Yo&p0y`+ zjrVf7#`}ZT>PN)PT|gAO8i;4$t=l)hgsGP*ZNO3KCb<#`Ym zjK6g)bCcL3iFg0L$a_$)rgnxAvWVG;FZA;pk@T{A#kakoi`bY&>T!?sVV*U$U(^oz z28^~7JO!apo;65uWVYb0LFQ&vv2tJ_ciOH+Du@NiBHD5pSEqSi-s_L5qzG z@`u;uqm&xOZ)9Tt>Ouhjx(mjz@}jomtavZCmkB;)s|oVr`j8M+pRId7l5ojwveHMu zQbYT7)A<3XdX&zD6F(`@G;6Vrr7rLT77s7#O8nQups40kHSdGb8Oa2Z-*~ z1-Yp#>zaA-%Z5h)`7Og&mSjc%RvJSCdu)`L!n5llT>t=O{|C~;O-0@Vs>1t~7JFZY zsqd0pfiVAtGNY(r*M|*oy+bO9^vXOC79f0VKYk!VX4l<=H44h#Hd;F;()_LL)|Llh zQQvd+G5&6@NlE7_&#aAcL?EHm(whu-%Xx<7~Tm>g_@-9lZ%Bze)k}Kl1 zRiSrk`;u1i*k5Oj>xSx zv#n|!?zPPlR^XVL?jxW*KJbKS2Vs&;oLGRc8{@6jsVrj}ky|A+wV}E$b=Rt&)xkJ* zfj*F@XdVBmuW=&tao>`#)kxeB;0b(&wyf$qETAx9o5ieQB8Z}|XUQclO~_~}!GD|* zv2|P&S#}XYFm$T-IaX-#lUd5?ABR~n-IHFq#^aXDTS_k*^`?j(vEM(R^KdB&3k&T; zPqwHX<4j!cDp%mzKO6KJowd;%4}BQK(eg8$5p=qf@Q&Ql@c6z1ex03~X9qI7CNg^P z@KVWC;~wYpYYo(|o7lJD1cPa1RUkos?RXVczh;=~r{@6@kd2~?IT9uivc4|~(B z^u#WE>mR_4cJVo8oi|9$#R&tSU#{OK8po()_QYw(64C#yG2y>s?*z45flHkY#52Eq zEs8=WhBWG%(D)t?Hr!KanP_-aPf+H0f|(rA&y0K%_60vzN{GrWQI$0^Q=6z?8s%5_ z@Ng4?XV_WFJ-~Mx|9PL;=_#(*9r^6>oxDI2(Y%9*&l*_KxggsaosvXykdTjrpQ)Tz zHf>~08EQD|(ddjRu^CxGrZxl)$>vm3YA;kJxd)A6m!*A^?e7% z%w!-Mq|$)-YxsdBvOOpjt2o_f|06Vx)=|lrsYj= zo#Giu-WnW6nd?@P*I3NybW|&9tfrl?%1jllSCj0HH5UN@IVHRm-&G(`XlPc}PS;Z` zK+YQ$UpEZe3+ckp!OX-a8oUl12w&1@Yi?;`b@1Xd`_>$vWMPtu5+RvvAA4C?Uh0Y% z?w&5R!Y*-#pO&TmBFPsepkQJ=2kxnT;qaW&WzF5={gd~u#AxZpZHTT$Ih`)UlVO_Q z2(HfiqZ9!f+AG2Iv#XQj?LSj8fVFiSt$_x3vvUhg8yjVPU=8iW5;Q-4N%1Df(pdK> zRo(E81TL;s)Oi?uEb_3*-xW;jXwZhIUIygi8RY<7=8@j2krB>2qGzHI^%>ZERT{jB zDJh*-!$qV??(ZCu0oVU*_ya_6(3E03Z-@7G5bkcfO4R0fDz}dNM(Zb=DHw0j41{I2 zY-C-p2&5K4Q*x{ZMIIZv0|`E#a3TrJ>hX+pM(4bCRF=mFJ9gJe%Ipzb2gm zc|ycH=ZBEl%p``A8h(KqrvJu3vV!6=gF{k=mh-L3$N zaDp-Pqsk8457)B+Cxf`(8Sf#2CoWK-6N?n-`dv6Z8%ngaRLc!g;P{U2Cyf>6HTbD& z;1f-rFEhZsO$4Jx!WGlxkZ;T_OhyN`d64)pqL}hlc&c@^(XfN-t9LFuGKaa5J=3&K>z1bR)0K6cV!H-m zCsUjZQS!0w{xXujogm;w{Lf`q^vx2v)y6pueKTiA$Msghl$maGw)*{es$MdHqm*J9 zHqY$}+u?ou2MwIN=HhX>#8E~z$-pp-9HhQcr6;v#5_J~95gwaG9^h9naw5gArL!cz zNyyBuUvSUt85g$vTtzU4G)2DP(j_&E&kESK|B=c-6zSvleW%(`^}}?c;oyhLT8%dY zI}OV(x+5IHS!gSoiU9#$CG)d8!!9rCw9i0U0s$kPFQu>=)=IW2l-Nl4x4(n- zbC64NNDU>>3L|zE=p{9@T*~=Kngi<`FtG+aTO7WN87e#itc(DG7;L<*kk#5!7`grh zo>zIpn#nK!-j{toT%pJ|2pj{G%t*6V`GA`Fw ztpJ&zDkckJ183kG1h|pc8dOfX$MRhEf1S?^bDRhG*RRL&ZJonPz3cc>1O+`4dP7gU z?Z-3zsKneC+hW%0VsG|~4;aQCFcs7{bnjoz2$JBP^l2fbA9?lN_>9_HcFpeM>=4b@ z;|e9rauC6C!mWj0$qb;At$UCO{S_0uzUWX_`M6NksvDck7XI$!5y-prSxdm!sLJZ8 z`Z#O%2#`bsJ`g>n>M(Sa5d>t@pS48RCtnP=gx;8S;4KGoc~rylMzsQv6y&R8nYO0N zTbB~yfn?#lv_s-#SzU60Sxt$16?qGkXKgS#v@Lf~OqkPXQ7p^*WmT)ue2{3OR6-BF zQil(TYy}DRuof2l3V+%>(f%{9ZSprW;k29a?Ue8#S;iw4$|+e*QGUpHUWjuWixW;( z@*N{A}-*u)}{^J+ommv6n?-FU$;G7e{S)llrYV+fH6H-r;;_#{<6(FZja=` zDxA~3*-7dVP(Tq)gwPR9rPmbyS&4R1r21`kUY{YOetWtf?r2Qtv<|+;@FI#R=UM+wY^>~?t~v}2h0~vzw@E{t+3z@T5BlgP5q7J0U0+j_CTS6LBx7qIwee!PS+1#RB*cU%rl@6B}ljdOhtgBQJ z-AIeN78jlTVX1F*k*LGTu&SLr=-vaF>qd`fna{OXI||we z-|^T;CMo(9@vlP+9!{C$c(HI^2uLD;-uI*$AF2ifV(i3!E#%4OVaABR`GhS zQ8D~Yncg`*j5EVaC+*i^W9UD7 zZ6n$;bU5O-#qW&hH-&ps+m+Kf2EnmtFakdd_0t^T2ke}oKxIx~W$p*mC%Ha_$>T4% z4HpzC54i;Pwapry`B3>>mVTs~I3FAqR80`wv1+WDW$j6E+>Hr6{bDY2L7yY0tL$Q7 zXM1=#T`6-2u!eFK2JK{cbTjm1TKKRiyV0$W3WON;+mo~79 zVEUE!Db>_YkjN;*Y=(587NzYPrG9!oe2jq7r&H z7Va(DD@N3+vI@kgD%^n=q&cUrkefz_##_8x*$LiBJ7RYq#3Z(^sj7!tlUiUYeTwzR z@TsnIcx~^LE6`>7(}Dt5cxMtu*;zHRt6F{51tlUa&!zzEl3JpRgm&E9ckk|!I2Daz zw{Xi_zZvEq%EhbxAB?=!neTC2i zc?>yG9vt3Y`@O^3JJzW;&9(4Mg2S?^aLn_*)znuh77W3a0#&dIw1H?xjS=s;XgArP zz3kpI{iXV~2PMpU&Po*d&RqWOE2oX4)3uH+N9hWc4NWQgo*i`9^beQ%zn5`PWkS?U z6w$67jCMR@0xo;yeJZuc7(BI+O%F6Zqwg?6IB|EzN$U$c6!iGOty5(Xc@<{!7SGkF zoGNGKJ@2F3Y9DSePfeZ^Bdv$=PX4L)4m=8mpi&%9#~D>%D3 zGn56j=|{O0OTOG~S1L|JiMGWTXpKR`h+lg9J%0>v4g9UmXvU{C={{=~{nZ`D(Xsxi zxUt@81f7!7$05sSPs_AU;MOtijo|o_GTtBqBu@pFksK%1V5+7rFAV#A?x*lO!P!bj zvn+98kcCU^h4$Cbn|GU&`N;@T+k#}of)KYM9;wyCp;RBuVf>SOsjS$`((1aS>_}Wl zk|;5sC-9?;M^z#Zh9H@phI|kb)AfutVDOZakyEPYY3n7UNzzJDtWJMxhzkOthmyu_ zaL12-fl8yb8pdFO=}2r?035#u{W83An?vMT1HFny*+@jhkDI2V2gZNA;>993vm(uA za~e^=gr*+oeWAht=O0~_@Wf6>#+F2P!9f1`{KH;h(4hpx4K7|O?qH~G%!WYsP;e>?!yVj` zqe&cNqFv9H?k^nzGV1_BxTKG?4r-$?1>T`lb4;_73e)lU?xTG|8wbnY2KVk#Q^8wW zCv6-s{gA-I3ONddPU_J=`T(8yQlh>{y)b7z{p};+x^$)LnyGk2R!XI4dDW9jK>VRF z)v<%Kg8~Obh~hi9A9riQ^mZL&_mPEJ)0lB>?g|??>mb+9Q`9+k5dRK~c#n|IE&{uD zi>a36H+Pgea5?0akNzJ|kc8JS#OY*Q0ie=o9btvt8Z4^rlE~*Dtf?EI{R5v zlbg(&=`+7OCOz)A9B@AQ-;)z`Hu<~uvrzm>P;oH}6k>;_iry3rg_)%l&AQ(y(8F6| z)e?AATQn*LUmmvUZS;zxiJc6a&M)nL?h3i>=}yyo3S5hZN*H7$J{x|~)KawgXi{Kf zcL9N8%U+rh^_NLsYoqgXINq+!G!`H5H7heOdh6(nK*?X~Xx)v>xwTTqxJT zCbIzRrrFv(ibw7Y;=6O#wbn^nj(gkJ3nV=>1O#B)%@7q!+b}{7ox-~J3W6D0!(Q3} z@nYF|iuHA)v%t42-9{=?Ehj4KyTr+tmsdQgq^bD=ZfsFBS5t)R!0CE+&b$^ZbLFtP z=$q+N*&7$2WSHxF$0@$OOml}h3d8iE_?wXw$6O0@nLJ$1Xb-WgVHa;tY^9OzvO3V~ zb%Ebjih`eGD@Ty}b`ntS>T+H={&gObB5BI(-k+9jS)W`9SuqF42Th8&w#{=EzGr#0C{qjM&Z-`uJIo%-^-B%FR&~wI*x>Hd;E`+UC;FbHER(ibRc#zgna|&hi(f zu(5Cc{2=%HY(%>6f@-@OGuheyor^8OXl>Rj_j!D~oXF3PX6tChyQt#4+UHB;2D{A8 z5<{B$5fms3jU9|sSi$Wl^LN_Hb9)|*b&Af~2tV13dA0AVR+O0y(sAf}P!?9QGWyo4 zs-PbhNdqji4wHi$%furis6v12W)01Z7Gt~A2R|m4T6vv~T<&omUM8Cu#>`dq8mS}h z9bi$ops&0e{L@EC*7S6e<&s7io4uK+InKn^P+?9ESf@N*{HnPZvAReCA@no#=R!~j zQB#zh;eo}Sh#u7fPWIi;j_~JyM%Jbh<}=nZ#s@;SbW8WR>}V{{()dXTp2HPsWi>*S z@dLPT#~x@Ww23Beg*%0!F&&4zUMP^NWCcBFhXp!#rdc+9PQ7ecsYwGR9Jk=pWfc^q zBs*f+Y>XDUCSQ?|2z(^>p{sx4Gaj)>HkjO{B8-A6$t%x7H3FH@t!-`+7*Cxx&9d%? ztw$t{@CY)E@~d1!h4M1gY(BubMk?!?4%n14ULwammo#C9bJw=9y-_qFb`lSY2e7rb zQ1Lv!@3!e@zgYZ)iGK7gR0~5O@5o9qAczXh1O*gl^s8}(p$6_36+`|Yq;8e%jt1NY z4I4E7g0U4r(N%i%Uo;h{D>5Uv6HkHAylRiV(z#*$-33173mbK$A$F*|Rb1jVP_Ee6 z<9boBK{xhoQv3KAUxvsBBxK7qDyB-K+BUlAB{BA*T^T@dGT4F}`ASp3GLU7gwk`ZD z@Jk9Noa_v?9(B5yFBt~*6y%v51R9w*p!*aHJ0v6vA+)^#e8}|xAXFr6pAUY<{`Jqd z)4=p2&2bw(aiz4AWyqqt{^+I{l}`H-jjuE zog_k}P;kyLM{FPo0$=&=XZdL*ORAVRLEeDx|!)ssjr~S3bXf zTG~Hq_WQ~5kd+KUv7}rmFOX+=fKTii9jwGG$r1;YydN1sJe?u)fEu7d#RJ#%Vpla?O)UjtyKsX~!YI!n*pmJYh zQZ5%?y!8$=Olq8>@a$%>(I~Uvqx^XpCKamfG8nvaK<$GyA(#qgTKv&SFBI8~x7dVW zYAAEnO~X23NH^RjSFM8XGLtLo%N^%d`}VYauWJ$~{(kA)HYWMciBg}_Bq!=3{xdkUqH2E^0aaD!AigoqqvxGNfO(R(G00}f~39kd@Mc^(jJ*DYXN>29O znRV#2^{JT!O#&;=5kH7de>i4b5lxIMtyrXmN@r@GdQcmm84nzbCGyg-Qo1}xH=a}M zB^xz(GmdrpMZK=DONaO}!SE(QskwmR%OQ$hR@eG!lReX>nMHP@+Aoe3_#`KlWu4A~ z_?RPKU(tq2p!Z3``T3r@@wV?LgHQ5m2`?QkJ3f5hYmn*I6Yi1IO29$dRdqkt82Z`6 z-kMy{MsL{MNSpT3cKmZVJt^7;A=+kwNthL5cpbO*_LVbTmZI@GRE3RcNKwn=aCReB zdZOv}ub01i1Sq&v8w#XtVwN&=*Xt#j1)mCvmHfD(vL|J8so+OHD#vQ_4<}uTely;T zbd{b!YQab)84hR4Td~M$8TUZv7Z=g`#c8RKI@qTJuozf=Ay$=fzU^Q>fp7?TaJuN8 z-nSUh>sk8N{eHS^T(;LV55f%4kR|+o4(bZPR}dE+i3KLWy!g{Upxog1AeRgQsCF)$ z@;OsK0^$qvf(Slb-N#UTZeO>v%|ZUhG`W?d8*&3CBthK3zVZJt`O9NcKQg?o3JYlQ zLS-_bzGKhE|3wX&oI1CU03`$2-KFPY`CG$Pk{YmsW`%2xr~EUZ@z&=Gm~ zZz^d}yV<^I+JJ*KUuICl(FCRC{7kxx!v{rTNcOuwUl`Q&!o%xLCG_y2Y)8Z$}JYG5Wi-TA%R zSq{p-wwDx`z%CxX)JFYkYo7=r{!dhlQB^m-8YxLdhma-)$HL52ZLm(nE~l#sUi7Hg z43Z^Pb*#IhwHwTPPe=jt>T%>&GH47uM1!I4l?}C1v5PZFd~d8?JNM>X9Vq*tY;wl?6SRv*kXcuz??=X)i3v`%r*K0`d;JlLGkn4WfzAr|y zE%@EOK$Ap4a+iPl(*3RgL;Hexp$p*d)mUF!&$4|Fd5JAl!;V a3@#=BP7sE{-`aNhceZr?-#+_s_J0BN?biSR literal 0 HcmV?d00001 diff --git a/docSite/assets/imgs/faq1.png b/docSite/assets/imgs/faq1.png new file mode 100644 index 0000000000000000000000000000000000000000..6a5223c761bcbefe5ec3a5d68803f83f79d43876 GIT binary patch literal 26802 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

+t# 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≠f8re&TMLd%7L`oNz`Ywi4vs*rmQK-g zJ+*Kc<)}7ya51)r$%2%C_I4Laaw3tvr+;>J)8;;iH>-7U4I+E@w7m>C8D*u3R(@1{ z*E%0KGV%}3XffAPRII)&(-GGhVM)n++#8YQhp0SQ7p<|122hq$$s5gFn9BPtqllXH z^Wg(-ZYFNykPN@8mmUsA86#7!H>!wRF${wB(Cg1(LawjG4}H95}$3hPzu)oDFhn1dP@o#JuS+)VqdjFiS6 zXg?#%*MQnN?bG*78D;2=R>ES?FZqZP9Rr;!nNFKnc1=hY^`vKavmdp?Y3ynUIstr4 z3J8EzY4!1hXQ_0`FFQG?TyCt3;00^r`2jp&?@MA zczTBYrm}VKnWYhST6OX|&h4ICtm(r4JC5=nvqIwq9h8OU6!A&L|q;feu zJzXmej>Y1!X(YN;RrIQ7C^Z6%fo7q2s`DmMIX_L2z4oTQz3_QZIt*ji!1CliH5euI z4W1glD7q`HE6JUKObL|7WoK&}VWzW68sESs>5G!VB+f`wqWG_NPEOROoBPhTBGJ}d zLb|AG`stc*hG-1$QOjlS1U68aWv09Y@pd6t&5?Jp9DdKq@-ZPAjmcvk=0Yi*Zc$Sq-cy`hZC`MVsb#q8oLy zhZB#(Fi`iDVy*hau+Wo5xx*<}ifSksSWgI-ZF)`-KiJh@_@;c5HCs{g<=skHj1Aq4 zt*mY7tjeU~R`#0;w`zB}s0_TVIl&yO-z`t5z#@SguqI$*9*CFB{!)qjc52GZd!+64 zcjUmL+nx&eQ=c|PefNf`hv1CukqJh7ZLA8^`IIvR#45{&NTGj@PMh_Z{gu#ka(Kv=6$xhiU0e|-?5$IlV=|)TeU4Hzss<;@!muGm z*s4>@qs^a;^yi0Pym~UcT9&$Ymcr*?7c^yDCi=jHcs-D1PF$9*26wmU%nth_fZ-T4 z>1Lj(cry6C7O9jBf89Ie@d#Nmj&!Wq{>9ZY_rdHq_gJV&%J>?(-saBW9f-ZQX7>*o z%ubuN40(UCv7VZ0X%u@yY)woI9bip9@oxb*0q)BX6WlcpDPS~IKEbb){wzW?^v|N% zXP#SiTIY8wwb-Q89yZ^Ik!MU${KqzZJubj7((3r8fFiKfG?qWL7~*i`G2 literal 0 HcmV?d00001 diff --git a/docSite/assets/imgs/faq2.png b/docSite/assets/imgs/faq2.png new file mode 100644 index 0000000000000000000000000000000000000000..a05e9ebd21d646d2bf6f98cc5b2a719e31ef3731 GIT binary patch literal 57155 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 literal 0 HcmV?d00001 diff --git a/docSite/assets/imgs/faq3.png b/docSite/assets/imgs/faq3.png new file mode 100644 index 0000000000000000000000000000000000000000..c9f7252b5232914aad8cd7e49571cfd248d52262 GIT binary patch literal 178703 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±6eM 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 z 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

0A@`rWLS+RsY;Mt0rRnU`D}Z*tcK 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 PUTK9afxnnh$AA6@1OoI} literal 0 HcmV?d00001 diff --git a/docSite/assets/imgs/other1.png b/docSite/assets/imgs/other1.png new file mode 100644 index 0000000000000000000000000000000000000000..7b4ff777ae72b0ab21b2fb9eeb24a047f9f7e415 GIT binary patch literal 22186 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 Zte|Gm`-dm8lg literal 0 HcmV?d00001 diff --git a/docSite/assets/imgs/other2.png b/docSite/assets/imgs/other2.png new file mode 100644 index 0000000000000000000000000000000000000000..c89b7612af0e9c382d639d474f282fa55ce93c53 GIT binary patch literal 7869 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 YaR4moHBWZoAItFn^Z!i^0v_l73z{Q_L;wH) literal 0 HcmV?d00001 diff --git a/docSite/assets/imgs/other3.png b/docSite/assets/imgs/other3.png new file mode 100644 index 0000000000000000000000000000000000000000..d06180a56f539e8bc8cf1c5e708bab5554e27278 GIT binary patch literal 32074 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

NE7Baxi#y~` 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 literal 0 HcmV?d00001 diff --git a/docSite/assets/imgs/quizApp1.png b/docSite/assets/imgs/quizApp1.png new file mode 100644 index 0000000000000000000000000000000000000000..b8dd79e78962fe8f79630f7a5289b8637d6dbd03 GIT binary patch literal 22442 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 literal 0 HcmV?d00001 diff --git a/docSite/assets/imgs/quizApp2.png b/docSite/assets/imgs/quizApp2.png new file mode 100644 index 0000000000000000000000000000000000000000..4d24f7356dfdfea0e6932d2f551f7a394480bf63 GIT binary patch literal 48689 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 QK`9ZjM8i?Q?;qd(4GRdw$^ZZW literal 0 HcmV?d00001 diff --git a/docSite/content/zh-cn/docs/development/faq.md b/docSite/content/zh-cn/docs/development/faq.md index 91e606503..dd42b9807 100644 --- a/docSite/content/zh-cn/docs/development/faq.md +++ b/docSite/content/zh-cn/docs/development/faq.md @@ -19,6 +19,53 @@ images: [] ## 二、通用问题 +### 通过sealos部署的话,是否没有本地部署的一些限制? +![](/imgs/faq1.png) +这是索引模型的长度限制,通过任何方式部署都一样的,但不同索引模型的配置不一样,可以在后台修改参数。 + +### sealos怎么挂载 小程序配置文件 + +新增配置文件:/app/projects/app/public/xxxx.txt +如图 +![](/imgs/faq2.png) + +### 数据库3306端口被占用了,启动服务失败 +![](/imgs/faq3.png) + +mysql 只有 oneAPI 用到,外面一般不需要调用,所以可以 +- 把 3306:3306 的映射去掉/或者直接改一个映射。 + +```yaml +# 在 docker-compose.yaml 文件内 +# ... + mysql: + image: mysql:8.0.36 + ports: + - 3306:3306 # 这个端口被占用了! + # - 3307:3306 # 直接改一个。。和外面的不冲突 + # *empty* 或者直接删了,反正外面用不到 + oneapi: + container_name: oneapi + image: ghcr.io/songquanpeng/one-api:latest + environment: + - SQL_DSN=root:oneapimmysql@tcp(mysql:3306)/oneapi # 这不用改,容器内外网络是隔离的 +``` +- 另一种做法是可以直接连现有的 mysql, 要改 oneAPI 的环境变量。 +```yaml +# 在 docker-compose.yaml 文件内 +# ... +# mysql: # 要连外面的,这个玩意用不到了 +# image: mysql:8.0.36 +# ports: +# - 3306:3306 # 这个端口被占用了! +oneapi: + container_name: oneapi + image: ghcr.io/songquanpeng/one-api:latest + environment: + - SQL_DSN=root:oneapimmysql@tcp(mysql:3306)/oneapi # 改成外面的链接字符串 +``` + + ### 本地部署的限制 具体内容参考https://fael3z0zfze.feishu.cn/wiki/OFpAw8XzAi36Guk8dfucrCKUnjg。 diff --git a/docSite/content/zh-cn/docs/development/openapi/auth.md b/docSite/content/zh-cn/docs/development/openapi/auth.md index 5bcd72a0e..aa7014e80 100644 --- a/docSite/content/zh-cn/docs/development/openapi/auth.md +++ b/docSite/content/zh-cn/docs/development/openapi/auth.md @@ -55,4 +55,28 @@ curl --location --request POST 'https://api.fastgpt.in/api/v1/chat/completions' } ] }' -``` \ No newline at end of file +``` + +## 自定义用户 ID + +`v4.8.13`后支持传入自定义的用户 ID, 并且存入历史记录中。 + +```sh +curl --location --request POST 'https://api.fastgpt.in/api/v1/chat/completions' \ +--header 'Authorization: Bearer fastgpt-xxxxxx' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "chatId": "111", + "stream": false, + "detail": false, + "messages": [ + { + "content": "导演是谁", + "role": "user" + } + ], + "customUid": "xxxxxx" +}' +``` + +在历史记录中,该条记录的使用者会显示为 `xxxxxx`。 diff --git a/docSite/content/zh-cn/docs/development/openapi/chat.md b/docSite/content/zh-cn/docs/development/openapi/chat.md index 25f2c835d..808eccdee 100644 --- a/docSite/content/zh-cn/docs/development/openapi/chat.md +++ b/docSite/content/zh-cn/docs/development/openapi/chat.md @@ -686,7 +686,7 @@ curl --location --request POST 'http://localhost:3000/api/core/chat/getHistories - appId - 应用 Id - offset - 偏移量,即从第几条数据开始取 - pageSize - 记录数量 -- source - 对话源 +- source - 对话源。source=api,表示获取通过 API 创建的对话(不会获取到页面上的对话记录) {{% /alert %}} {{< /markdownify >}} diff --git a/docSite/content/zh-cn/docs/development/openapi/dataset.md b/docSite/content/zh-cn/docs/development/openapi/dataset.md index 09d400463..efe1d6397 100644 --- a/docSite/content/zh-cn/docs/development/openapi/dataset.md +++ b/docSite/content/zh-cn/docs/development/openapi/dataset.md @@ -733,6 +733,21 @@ data 为集合的 ID。 {{< tab tabName="请求示例" >}} {{< markdownify >}} +**4.8.19+** +```bash +curl --location --request POST 'http://localhost:3000/api/core/dataset/collection/listv2' \ +--header 'Authorization: Bearer {{authorization}}' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "offset":0, + "pageSize": 10, + "datasetId":"6593e137231a2be9c5603ba7", + "parentId": null, + "searchText":"" +}' +``` + +**4.8.19-(不再维护)** ```bash curl --location --request POST 'http://localhost:3000/api/core/dataset/collection/list' \ --header 'Authorization: Bearer {{authorization}}' \ @@ -753,7 +768,7 @@ curl --location --request POST 'http://localhost:3000/api/core/dataset/collectio {{< markdownify >}} {{% alert icon=" " context="success" %}} -- pageNum: 页码(选填) +- offset: 偏移量 - pageSize: 每页数量,最大30(选填) - datasetId: 知识库的ID(必填) - parentId: 父级Id(选填) @@ -773,9 +788,7 @@ curl --location --request POST 'http://localhost:3000/api/core/dataset/collectio "statusText": "", "message": "", "data": { - "pageNum": 1, - "pageSize": 10, - "data": [ + "list": [ { "_id": "6593e137231a2be9c5603ba9", "parentId": null, diff --git a/docSite/content/zh-cn/docs/development/upgrading/4819.md b/docSite/content/zh-cn/docs/development/upgrading/4819.md new file mode 100644 index 000000000..7f3ad25f6 --- /dev/null +++ b/docSite/content/zh-cn/docs/development/upgrading/4819.md @@ -0,0 +1,22 @@ +--- +title: 'V4.8.19(进行中)' +description: 'FastGPT V4.8.19 更新说明' +icon: 'upgrade' +draft: false +toc: true +weight: 806 +--- + + +## 完整更新内容 + +1. 新增 - 工作流知识库检索支持按知识库权限进行过滤。 +2. 新增 - 飞书/语雀知识库查看原文。 +3. 新增 - 流程等待插件,可以等待 n 毫秒后继续执行流程。 +4. 优化 - 成员列表分页加载。 +5. 优化 - 统一分页加载代码。 +6. 优化 - 对话页面加载时,可配置是否为独立页面。 +7. 修复 - 语雀文件库导入时,嵌套文件内容无法展开的问题。 +8. 修复 - 工作流编排中,LLM 参数无法关闭问题。 +9. 修复 - 工作流编排中,代码运行节点还原模板问题。 +10. 修复 - HTTP 接口适配对象字符串解析。 \ No newline at end of file diff --git a/docSite/content/zh-cn/docs/faq/app.md b/docSite/content/zh-cn/docs/faq/app.md index 5797a3f60..a38f5baba 100644 --- a/docSite/content/zh-cn/docs/faq/app.md +++ b/docSite/content/zh-cn/docs/faq/app.md @@ -21,6 +21,19 @@ weight: 908 定时执行会在应用发布后生效,会在后台生效。 +## V4.8.18-FIX2中提到“ 1. 修复 HTTP 节点, {{}} 格式引用变量兼容问题。建议尽快替换 / 模式取变量, {{}} 语法已弃用。”替换{{}}引用格式是仅仅只有在http节点,还是所有节点的都会有影响? + +只有 http 节点用到这个语法。 + +## 工作流类型的应用在运行预览可以正常提问返回,但是发布免登录窗口之后有问题。 + +一般是没正确发布,在工作流右上角点击【保存并发布】。 + +## 如何解决猜你想问使用中文回答显示 + +注意需要更新到V4.8.17及以上,把猜你想问的提示词改成中文。 +![](/imgs/quizApp2.png) + ## AI对话回答要求中的Markdown语法取消 修改知识库默认提示词, 默认用的是标准模板提示词,会要求按 Markdown 输出,可以去除该要求: @@ -38,3 +51,32 @@ A: 通常是由于上下文不一致导致,可以在对话日志中,找到 | | | | | --- | --- | --- | | ![](/imgs/image-85.png) | ![](/imgs/image-86.png) | ![](/imgs/image-87.png) | +在针对知识库的回答要求里有, 要给它配置提示词,不然他就是默认的,默认的里面就有该语法。 + +## 工作流操作:一个工作流,以一个问题分类节点开始,根据不同的分类导入到不同的分支,访问相应的知识库和AI对话,AI对话返回内容后,怎么样不进入问题分类节点,而是将问题到知识库搜索,然后把历史记录一起作为背景再次AI查询。 + +做个判断器,如果是初次开始对话也就是历史记录为0,就走问题分类;不为零直接走知识库和ai。 + +## 实时对话,设置 fastgpt 定时,比如每隔 3000MS 去拿一次 webhook发送过来的消息到AI页面 + +定时执行没有这么高频率的去拿信息的,想要实现在企微里面的实时对话的机器人, +目前通过低代码的工作流构建应该是不行的,只能自己写代码,然后去调用 FastGPT 的 APIKey 回复。企业微信似乎没有提供「自动监听」群聊消息的接口(或是通过 at 机器人这种触发消息推送)。应该只能发消息给应用,接收这个 https://developer.work.weixin.qq.com/document/path/90238 文档中的消息推送实现实时对话。或者是定时去拿群聊消息,通过这个文档所示的接口https://developer.work.weixin.qq.com/document/path/98914,然后用这个接口 https://developer.work.weixin.qq.com/document/path/90248 去推送消息。 + +## 工作流连接数据库 + +工作流提供该连接数据库功能,用这个数据库连接的 plugin 可以实现 text2SQL,但是相对危险,不建议做写入等操作。 + +![](/imgs/quizApp1.png) + +## 关于循环体,协助理解循环体的循环条件和终止条件、循环的方式,循环体内参数调用后、在循环体内属于是局部作用域的参数还是全局作用域的参数 + +可理解为 for 函数,传一个数组,每个数据都执行一次。 + +## 公式无法正常显示 + +添加相关提示词,引导模型按 Markdown 输出公式 + +```bash +Latex inline: \(x^2\) +Latex block: $$e=mc^2$$ +``` diff --git a/docSite/content/zh-cn/docs/faq/dataset.md b/docSite/content/zh-cn/docs/faq/dataset.md index 589b57160..a5b90340a 100644 --- a/docSite/content/zh-cn/docs/faq/dataset.md +++ b/docSite/content/zh-cn/docs/faq/dataset.md @@ -16,6 +16,25 @@ weight: 910 * **文件处理模型**:用于数据处理的【增强处理】和【问答拆分】。在【增强处理】中,生成相关问题和摘要,在【问答拆分】中执行问答对生成。 * **索引模型**:用于向量化,即通过对文本数据进行处理和组织,构建出一个能够快速查询的数据结构。 +## 知识库支持Excel类文件的导入 + +xlsx等都可以上传的,不止支持CSV。 + +## 知识库tokens的计算方式 + +统一按gpt3.5标准。 + +## 误删除重排模型后,重排模型怎么加入到fastgpt + +![](/imgs/dataset3.png) + +config.json文件里面配置后就可以勾选重排模型 + +## 线上平台上创建了应用和知识库,到期之后如果短期内不续费,数据是否会被清理。 + +免费版是三十天不登录后清空知识库,应用不会动。其他付费套餐到期后自动切免费版。 +![](/imgs/dataset4.png) + ## 基于知识库的查询,但是问题相关的答案过多。ai回答到一半就不继续回答。 FastGPT回复长度计算公式: @@ -37,7 +56,7 @@ FastGPT回复长度计算公式: ![](/imgs/dataset2.png) -1. 私有化部署的时候,后台配模型参数,可以在配置最大上文时候,预留一些空间,比如 128000 的模型,可以只配置 120000, 剩余的空间后续会被安排给输出 +另外私有化部署的时候,后台配模型参数,可以在配置最大上文时,预留一些空间,比如 128000 的模型,可以只配置 120000, 剩余的空间后续会被安排给输出 ## 受到模型上下文的限制,有时候达不到聊天记录的轮次,连续对话字数过多就会报上下文不够的错误。 @@ -61,4 +80,4 @@ FastGPT回复长度计算公式: ![](/imgs/dataset2.png) -1. 私有化部署的时候,后台配模型参数,可以在配置最大上文时候,预留一些空间,比如 128000 的模型,可以只配置 120000, 剩余的空间后续会被安排给输出 \ No newline at end of file +另外,私有化部署的时候,后台配模型参数,可以在配置最大上文时,预留一些空间,比如 128000 的模型,可以只配置 120000, 剩余的空间后续会被安排给输出。 \ No newline at end of file diff --git a/docSite/content/zh-cn/docs/faq/other.md b/docSite/content/zh-cn/docs/faq/other.md index b8adf64f2..09de91a1e 100644 --- a/docSite/content/zh-cn/docs/faq/other.md +++ b/docSite/content/zh-cn/docs/faq/other.md @@ -8,4 +8,14 @@ weight: 918 ## oneapi 官网是哪个 -只有开源的 README,没官网,GitHub: https://github.com/songquanpeng/one-api \ No newline at end of file +只有开源的 README,没官网,GitHub: https://github.com/songquanpeng/one-api + +## 想做多用户和多chat key + +![](/imgs/other1.png) +![](/imgs/other2.png) + +多用户问题:只能采取二开或者商业版 + +多chat key问题:1. 私有化部署情况下,oneapi解决。2. Saas或者商业版中,可以为每个团队设置单独的key。 +![](/imgs/other3.png) diff --git a/docSite/content/zh-cn/docs/guide/knowledge_base/lark_dataset.md b/docSite/content/zh-cn/docs/guide/knowledge_base/lark_dataset.md index 8c7a8ab55..8631b0f0d 100644 --- a/docSite/content/zh-cn/docs/guide/knowledge_base/lark_dataset.md +++ b/docSite/content/zh-cn/docs/guide/knowledge_base/lark_dataset.md @@ -22,10 +22,11 @@ FastGPT v4.8.16 版本开始,商业版用户支持飞书知识库导入,用 ## 2. 配置应用权限 -创建应用后,进入应用可以配置相关权限,这里需要增加两个权限: +创建应用后,进入应用可以配置相关权限,这里需要增加**3个权限**: 1. 获取云空间文件夹下的云文档清单 2. 查看新版文档 +3. 查看、评论、编辑和管理云空间中所有文件 ![alt text](/imgs/image-41.png) diff --git a/docSite/content/zh-cn/docs/guide/workbench/workflow/loop.md b/docSite/content/zh-cn/docs/guide/workbench/workflow/loop.md index 7b32a91cd..7468e2f18 100644 --- a/docSite/content/zh-cn/docs/guide/workbench/workflow/loop.md +++ b/docSite/content/zh-cn/docs/guide/workbench/workflow/loop.md @@ -1,6 +1,6 @@ --- -title: "循环执行" -description: "FastGPT 循环运行节点介绍和使用" +title: "批量运行" +description: "FastGPT 批量运行节点介绍和使用" icon: "input" draft: false toc: true @@ -9,15 +9,15 @@ weight: 260 ## 节点概述 -【**循环运行**】节点是 FastGPT V4.8.11 版本新增的一个重要功能模块。它允许工作流对数组类型的输入数据进行迭代处理,每次处理数组中的一个元素,并自动执行后续节点,直到完成整个数组的处理。 +【**批量运行**】节点是 FastGPT V4.8.11 版本新增的一个重要功能模块。它允许工作流对数组类型的输入数据进行迭代处理,每次处理数组中的一个元素,并自动执行后续节点,直到完成整个数组的处理。 这个节点的设计灵感来自编程语言中的循环结构,但以可视化的方式呈现。 -![循环运行节点](/imgs/fastgpt-loop-node.png) +![批量运行节点](/imgs/fastgpt-loop-node.png) > 在程序中,节点可以理解为一个个 Function 或者接口。可以理解为它就是一个**步骤**。将多个节点一个个拼接起来,即可一步步的去实现最终的 AI 输出。 -【**循环运行**】节点本质上也是一个 Function,它的主要职责是自动化地重复执行特定的工作流程。 +【**批量运行**】节点本质上也是一个 Function,它的主要职责是自动化地重复执行特定的工作流程。 ## 核心特性 @@ -41,9 +41,9 @@ weight: 260 ## 应用场景 -【**循环运行**】节点的主要作用是通过自动化的方式扩展工作流的处理能力,使 FastGPT 能够更好地处理批量任务和复杂的数据处理流程。特别是在处理大规模数据或需要多轮迭代的场景下,循环运行节点能显著提升工作流的效率和自动化程度。 +【**批量运行**】节点的主要作用是通过自动化的方式扩展工作流的处理能力,使 FastGPT 能够更好地处理批量任务和复杂的数据处理流程。特别是在处理大规模数据或需要多轮迭代的场景下,批量运行节点能显著提升工作流的效率和自动化程度。 -【**循环运行**】节点特别适合以下场景: +【**批量运行**】节点特别适合以下场景: 1. **批量数据处理** - 批量翻译文本 @@ -64,7 +64,7 @@ weight: 260 ### 输入参数设置 -【**循环运行**】节点需要配置两个核心输入参数: +【**批量运行**】节点需要配置两个核心输入参数: 1. **数组 (必填)**:接收一个数组类型的输入,可以是: - 字符串数组 (`Array`) @@ -95,7 +95,7 @@ weight: 260 ### 批量处理数组 -假设我们有一个包含多个文本的数组,需要对每个文本进行 AI 处理。这是循环运行节点最基础也最常见的应用场景。 +假设我们有一个包含多个文本的数组,需要对每个文本进行 AI 处理。这是批量运行节点最基础也最常见的应用场景。 #### 实现步骤 @@ -114,9 +114,9 @@ weight: 260 return { textArray: texts }; ``` -2. 配置循环运行节点 +2. 配置批量运行节点 - ![配置循环运行节点](/imgs/fastgpt-loop-node-example-2.png) + ![配置批量运行节点](/imgs/fastgpt-loop-node-example-2.png) - 数组输入:选择上一步代码运行节点的输出变量 `textArray`。 - 循环体内添加一个【AI 对话】节点,用于处理每个文本。这里我们输入的 prompt 为:`请将这段文本翻译成英文`。 @@ -128,7 +128,7 @@ weight: 260 ![运行流程](/imgs/fastgpt-loop-node-example-3.png) 1. 【代码运行】节点执行,生成测试数组 -2. 【循环运行】节点接收数组,开始遍历 +2. 【批量运行】节点接收数组,开始遍历 3. 对每个数组元素: - 【AI 对话】节点处理当前元素 - 【指定回复】节点输出翻译后的文本 @@ -144,7 +144,7 @@ weight: 260 - 需要维护上下文的连贯性 - 翻译质量需要多轮优化 -【**循环运行**】节点可以很好地解决这些问题。 +【**批量运行**】节点可以很好地解决这些问题。 #### 实现步骤 @@ -281,9 +281,9 @@ weight: 260 这里我们用到了 [Jina AI 开源的一个强大的正则表达式](https://x.com/JinaAI_/status/1823756993108304135),它能利用所有可能的边界线索和启发式方法来精确切分文本。 -2. 配置循环运行节点 +2. 配置批量运行节点 - ![配置循环运行节点](/imgs/fastgpt-loop-node-example-5.png) + ![配置批量运行节点](/imgs/fastgpt-loop-node-example-5.png) - 数组输入:选择上一步代码运行节点的输出变量 `chunks`。 - 循环体内添加一个【代码运行】节点,对源文本进行格式化。 diff --git a/docSite/content/zh-cn/docs/use-cases/app-cases/multi_turn_translation_bot.md b/docSite/content/zh-cn/docs/use-cases/app-cases/multi_turn_translation_bot.md index a3f51303b..b9b5363d9 100644 --- a/docSite/content/zh-cn/docs/use-cases/app-cases/multi_turn_translation_bot.md +++ b/docSite/content/zh-cn/docs/use-cases/app-cases/multi_turn_translation_bot.md @@ -212,7 +212,7 @@ export default async function (ctx: FunctionContext): Promise{ ![](/imgs/translate13.png) -## 循环执行 +## 批量运行 长文反思翻译比较关键的一个部分,就是对多个文本块进行循环反思翻译 diff --git a/docSite/content/zh-cn/docs/use-cases/app-cases/translate-subtitle-using-gpt.md b/docSite/content/zh-cn/docs/use-cases/app-cases/translate-subtitle-using-gpt.md index fa12d31ce..64703a7be 100644 --- a/docSite/content/zh-cn/docs/use-cases/app-cases/translate-subtitle-using-gpt.md +++ b/docSite/content/zh-cn/docs/use-cases/app-cases/translate-subtitle-using-gpt.md @@ -91,9 +91,9 @@ weight: 604 这个过程不仅提高了效率,还最大限度地减少了人为错误的可能性。 -## 循环执行 +## 批量运行 -为了处理整个长字幕文件,我们需要一个循环执行机制。这是通过一个简单但有效的判断模块实现的: +为了处理整个长字幕文件,我们需要一个批量运行机制。这是通过一个简单但有效的判断模块实现的: 1. 检查当前翻译的文本块是否为最后一个。 2. 如果不是,则将工作流重定向到格式化原文本块节点。 diff --git a/packages/global/common/system/types/index.d.ts b/packages/global/common/system/types/index.d.ts index 90bcb7dfd..64b7bd0a4 100644 --- a/packages/global/common/system/types/index.d.ts +++ b/packages/global/common/system/types/index.d.ts @@ -40,7 +40,7 @@ export type FastGPTConfigFileType = { export type FastGPTFeConfigsType = { show_emptyChat?: boolean; - register_method?: ['email' | 'phone']; + register_method?: ['email' | 'phone' | 'sync']; login_method?: ['email' | 'phone']; // Attention: login method is diffrent with oauth find_password_method?: ['email' | 'phone']; bind_notification_method?: ['email' | 'phone']; @@ -76,7 +76,6 @@ export type FastGPTFeConfigsType = { wecom?: { corpid?: string; agentid?: string; - secret?: string; }; microsoft?: { clientId?: string; diff --git a/packages/global/core/app/constants.ts b/packages/global/core/app/constants.ts index ba9485036..a57a7a797 100644 --- a/packages/global/core/app/constants.ts +++ b/packages/global/core/app/constants.ts @@ -33,7 +33,7 @@ export const defaultWhisperConfig: AppWhisperConfigType = { export const defaultQGConfig: AppQGConfigType = { open: false, model: 'gpt-4o-mini', - customPrompt: PROMPT_QUESTION_GUIDE + customPrompt: '' }; export const defaultChatInputGuideConfig = { diff --git a/packages/global/core/app/type.d.ts b/packages/global/core/app/type.d.ts index 86885c71e..899628936 100644 --- a/packages/global/core/app/type.d.ts +++ b/packages/global/core/app/type.d.ts @@ -12,8 +12,9 @@ import { TeamTagSchema as TeamTagsSchemaType } from '@fastgpt/global/support/use import { StoreEdgeItemType } from '../workflow/type/edge'; import { AppPermission } from '../../support/permission/app/controller'; import { ParentIdType } from '../../common/parentFolder/type'; -import { FlowNodeInputTypeEnum } from 'core/workflow/node/constant'; +import { FlowNodeInputTypeEnum } from '../../core/workflow/node/constant'; import { WorkflowTemplateBasicType } from '@fastgpt/global/core/workflow/type'; +import { SourceMemberType } from '../../support/user/type'; export type AppSchema = { _id: string; @@ -63,6 +64,7 @@ export type AppListItemType = { permission: AppPermission; inheritPermission?: boolean; private?: boolean; + sourceMember: SourceMemberType; }; export type AppDetailType = AppSchema & { diff --git a/packages/global/core/app/version.d.ts b/packages/global/core/app/version.d.ts index 178834ce4..dbf0ae53f 100644 --- a/packages/global/core/app/version.d.ts +++ b/packages/global/core/app/version.d.ts @@ -1,5 +1,7 @@ +import { TeamMemberStatusEnum } from 'support/user/team/constant'; import { StoreEdgeItemType } from '../workflow/type/edge'; import { AppChatConfigType, AppSchema } from './type'; +import { SourceMemberType } from 'support/user/type'; export type AppVersionSchemaType = { _id: string; @@ -20,4 +22,5 @@ export type VersionListItemType = { time: Date; isPublish: boolean | undefined; tmbId: string; + sourceMember: SourceMemberType; }; diff --git a/packages/global/core/dataset/apiDataset.d.ts b/packages/global/core/dataset/apiDataset.d.ts index 1d64a8a59..94c036886 100644 --- a/packages/global/core/dataset/apiDataset.d.ts +++ b/packages/global/core/dataset/apiDataset.d.ts @@ -5,6 +5,7 @@ export type APIFileItem = { type: 'file' | 'folder'; updateTime: Date; createTime: Date; + hasChild?: boolean; }; export type APIFileServer = { diff --git a/packages/global/core/dataset/type.d.ts b/packages/global/core/dataset/type.d.ts index 7a772f78d..70d3211d1 100644 --- a/packages/global/core/dataset/type.d.ts +++ b/packages/global/core/dataset/type.d.ts @@ -11,6 +11,7 @@ import { import { DatasetPermission } from '../../support/permission/dataset/controller'; import { Permission } from '../../support/permission/controller'; import { APIFileServer, FeishuServer, YuqueServer } from './apiDataset'; +import { SourceMemberType } from 'support/user/type'; export type DatasetSchemaType = { _id: string; @@ -165,6 +166,7 @@ export type DatasetListItemType = { vectorModel: VectorModelItemType; inheritPermission: boolean; private?: boolean; + sourceMember?: SourceMemberType; }; export type DatasetItemType = Omit & { diff --git a/packages/global/core/dataset/utils.ts b/packages/global/core/dataset/utils.ts index 5f25b230f..d8e6564ac 100644 --- a/packages/global/core/dataset/utils.ts +++ b/packages/global/core/dataset/utils.ts @@ -34,7 +34,7 @@ export function getSourceNameIcon({ } } catch (error) {} - return 'file/fill/manual'; + return 'file/fill/file'; } /* get dataset data default index */ diff --git a/packages/global/core/workflow/constants.ts b/packages/global/core/workflow/constants.ts index d93c7ada3..175f0c19d 100644 --- a/packages/global/core/workflow/constants.ts +++ b/packages/global/core/workflow/constants.ts @@ -152,6 +152,7 @@ export enum NodeInputKeyEnum { datasetSearchExtensionModel = 'datasetSearchExtensionModel', datasetSearchExtensionBg = 'datasetSearchExtensionBg', collectionFilterMatch = 'collectionFilterMatch', + authTmbId = 'authTmbId', // concat dataset datasetQuoteList = 'system_datasetQuoteList', diff --git a/packages/global/core/workflow/runtime/type.d.ts b/packages/global/core/workflow/runtime/type.d.ts index 7084740b1..995302b65 100644 --- a/packages/global/core/workflow/runtime/type.d.ts +++ b/packages/global/core/workflow/runtime/type.d.ts @@ -41,6 +41,10 @@ export type ChatDispatchProps = { teamId: string; tmbId: string; // App tmbId }; + runningUserInfo: { + teamId: string; + tmbId: string; + }; uid: string; // Who run this workflow chatId?: string; diff --git a/packages/global/core/workflow/template/system/datasetSearch.ts b/packages/global/core/workflow/template/system/datasetSearch.ts index 69e15a679..2d117ada0 100644 --- a/packages/global/core/workflow/template/system/datasetSearch.ts +++ b/packages/global/core/workflow/template/system/datasetSearch.ts @@ -89,6 +89,13 @@ export const DatasetSearchModule: FlowNodeTemplateType = { valueType: WorkflowIOValueTypeEnum.string, value: '' }, + { + key: NodeInputKeyEnum.authTmbId, + renderTypeList: [FlowNodeInputTypeEnum.hidden], + label: '', + valueType: WorkflowIOValueTypeEnum.boolean, + value: false + }, { ...Input_Template_UserChatInput, toolDescription: i18nT('workflow:content_to_search') diff --git a/packages/global/core/workflow/type/node.d.ts b/packages/global/core/workflow/type/node.d.ts index d0bc5b919..691fc96c9 100644 --- a/packages/global/core/workflow/type/node.d.ts +++ b/packages/global/core/workflow/type/node.d.ts @@ -89,6 +89,7 @@ export type NodeTemplateListItemType = { hasTokenFee?: boolean; // 是否配置积分 instructions?: string; // 使用说明 courseUrl?: string; // 教程链接 + sourceMember?: SourceMember; }; export type NodeTemplateListType = { diff --git a/packages/global/support/user/team/controller.d.ts b/packages/global/support/user/team/controller.d.ts index 98a64af30..fb331d0de 100644 --- a/packages/global/support/user/team/controller.d.ts +++ b/packages/global/support/user/team/controller.d.ts @@ -12,6 +12,7 @@ export type CreateTeamProps = { avatar?: string; defaultTeam?: boolean; memberName?: string; + memberAvatar?: string; }; export type UpdateTeamProps = Omit & { name?: string; diff --git a/packages/global/support/user/team/org/constant.ts b/packages/global/support/user/team/org/constant.ts index 370cdad82..c5aea21ab 100644 --- a/packages/global/support/user/team/org/constant.ts +++ b/packages/global/support/user/team/org/constant.ts @@ -5,8 +5,6 @@ export const OrgMemberCollectionName = 'team_org_members'; export const getOrgChildrenPath = (org: OrgSchemaType) => `${org.path}/${org.pathId}`; -// export enum OrgMemberRole { -// owner = 'owner', -// admin = 'admin', -// member = 'member' -// } +export enum SyncOrgSourceEnum { + wecom = 'wecom' +} diff --git a/packages/global/support/user/team/org/type.d.ts b/packages/global/support/user/team/org/type.d.ts index ca4a73292..b742ece48 100644 --- a/packages/global/support/user/team/org/type.d.ts +++ b/packages/global/support/user/team/org/type.d.ts @@ -13,6 +13,7 @@ type OrgSchemaType = { }; type OrgMemberSchemaType = { + _id: string; teamId: string; orgId: string; tmbId: string; @@ -20,6 +21,6 @@ type OrgMemberSchemaType = { type OrgType = Omit & { avatar: string; - members: OrgMemberSchemaType[]; permission: TeamPermission; + members: OrgMemberSchemaType[]; }; diff --git a/packages/global/support/user/team/type.d.ts b/packages/global/support/user/team/type.d.ts index 9c7dc12b4..6f063576f 100644 --- a/packages/global/support/user/team/type.d.ts +++ b/packages/global/support/user/team/type.d.ts @@ -44,6 +44,7 @@ export type TeamMemberSchema = { name: string; role: `${TeamMemberRoleEnum}`; status: `${TeamMemberStatusEnum}`; + avatar: string; defaultTeam: boolean; }; diff --git a/packages/global/support/user/type.d.ts b/packages/global/support/user/type.d.ts index 0f8729266..13f6dd522 100644 --- a/packages/global/support/user/type.d.ts +++ b/packages/global/support/user/type.d.ts @@ -1,12 +1,12 @@ import { TeamPermission } from '../permission/user/controller'; import { UserStatusEnum } from './constant'; +import { TeamMemberStatusEnum } from './team/constant'; import { TeamTmbItemType } from './team/type'; export type UserModelSchema = { _id: string; username: string; password: string; - avatar: string; promotionRate: number; inviterId?: string; openaiKey: string; @@ -22,7 +22,7 @@ export type UserModelSchema = { export type UserType = { _id: string; username: string; - avatar: string; + avatar: string; // it should be team member's avatar after 4.8.18 timezone: string; promotionRate: UserModelSchema['promotionRate']; team: TeamTmbItemType; @@ -30,3 +30,9 @@ export type UserType = { notificationAccount?: string; permission: TeamPermission; }; + +export type SourceMemberType = { + name: string; + avatar: string; + status: `${TeamMemberStatusEnum}`; +}; diff --git a/packages/plugins/register.ts b/packages/plugins/register.ts index 832d39628..3e00f18a5 100644 --- a/packages/plugins/register.ts +++ b/packages/plugins/register.ts @@ -12,7 +12,8 @@ const staticPluginList = [ 'DingTalkWebhook', 'WeWorkWebhook', 'google', - 'bing' + 'bing', + 'delay' ]; // Run in worker thread (Have npm packages) const packagePluginList = [ @@ -28,8 +29,7 @@ const packagePluginList = [ 'databaseConnection', 'Doc2X', 'Doc2X/PDF2text', - 'searchXNG', - 'sleep' + 'searchXNG' ]; export const list = [...staticPluginList, ...packagePluginList]; diff --git a/packages/plugins/src/delay/index.ts b/packages/plugins/src/delay/index.ts new file mode 100644 index 000000000..2e89a837d --- /dev/null +++ b/packages/plugins/src/delay/index.ts @@ -0,0 +1,18 @@ +import { delay } from '@fastgpt/global/common/system/utils'; + +type Props = { + ms: number; +}; +type Response = Promise; + +const main = async ({ ms }: Props): Response => { + if (typeof ms !== 'number' || ms <= 0 || ms > 300000) { + return ms; + } + + await delay(ms); + + return ms; +}; + +export default main; diff --git a/packages/plugins/src/sleep/template.json b/packages/plugins/src/delay/template.json similarity index 73% rename from packages/plugins/src/sleep/template.json rename to packages/plugins/src/delay/template.json index 45579f06c..2678d9480 100644 --- a/packages/plugins/src/sleep/template.json +++ b/packages/plugins/src/delay/template.json @@ -1,11 +1,11 @@ { "author": "collin", "version": "4817", - "name": "流程暂停", + "name": "流程等待", "avatar": "core/workflow/template/sleep", - "intro": "让工作流暂停指定时间后运行", + "intro": "让工作流等待指定时间后运行", "showStatus": true, - "weight": 10, + "weight": 1, "isTool": true, "templateType": "tools", @@ -20,22 +20,19 @@ "flowNodeType": "pluginInput", "showStatus": false, "position": { - "x": 616.4226348688949, - "y": -165.05298493910115 + "x": 627.6352390819724, + "y": -165.05298493910118 }, "version": "481", "inputs": [ { - "renderTypeList": [ - "numberInput", - "reference" - ], + "renderTypeList": ["numberInput", "reference"], "selectedTypeIndex": 0, "valueType": "number", "canEdit": true, - "key": "ms", - "label": "ms", - "description": "需要暂停的时间,毫秒", + "key": "延迟时长", + "label": "延迟时长", + "description": "需要暂停的时间,单位毫秒", "defaultValue": 1000, "list": [ { @@ -47,8 +44,8 @@ "canSelectFile": true, "canSelectImg": true, "required": true, - "toolDescription": "需要暂停的时间,毫秒", - "max": 999999999999, + "toolDescription": "需要暂停的时间,单位毫秒", + "max": 300000, "min": 1 } ], @@ -56,8 +53,8 @@ { "id": "ms", "valueType": "number", - "key": "ms", - "label": "ms", + "key": "延迟时长", + "label": "延迟时长", "type": "hidden" } ] @@ -70,15 +67,13 @@ "flowNodeType": "pluginOutput", "showStatus": false, "position": { - "x": 1925.5772573010433, - "y": -131.55298493910115 + "x": 1921.839722563351, + "y": -160.05298493910115 }, "version": "481", "inputs": [ { - "renderTypeList": [ - "reference" - ], + "renderTypeList": ["reference"], "valueType": "any", "canEdit": true, "key": "result", @@ -86,10 +81,7 @@ "isToolOutput": true, "description": "", "required": true, - "value": [ - "zCJC6zw7c14i", - "httpRawResponse" - ] + "value": ["zCJC6zw7c14i", "httpRawResponse"] } ], "outputs": [] @@ -116,16 +108,14 @@ "flowNodeType": "httpRequest468", "showStatus": true, "position": { - "x": 1152.535395637613, - "y": -433.21496011686054 + "x": 1154.4041630064592, + "y": -455.0529849391012 }, "version": "481", "inputs": [ { "key": "system_addInputParam", - "renderTypeList": [ - "addInputParam" - ], + "renderTypeList": ["addInputParam"], "valueType": "dynamic", "label": "", "required": false, @@ -157,9 +147,7 @@ }, { "key": "system_httpMethod", - "renderTypeList": [ - "custom" - ], + "renderTypeList": ["custom"], "valueType": "string", "label": "", "value": "POST", @@ -171,9 +159,7 @@ }, { "key": "system_httpTimeout", - "renderTypeList": [ - "custom" - ], + "renderTypeList": ["custom"], "valueType": "number", "label": "", "value": 30, @@ -187,24 +173,20 @@ }, { "key": "system_httpReqUrl", - "renderTypeList": [ - "hidden" - ], + "renderTypeList": ["hidden"], "valueType": "string", "label": "", "description": "common:core.module.input.description.Http Request Url", "placeholder": "https://api.ai.com/getInventory", "required": false, - "value": "sleep", + "value": "delay", "valueDesc": "", "debugLabel": "", "toolDescription": "" }, { "key": "system_httpHeader", - "renderTypeList": [ - "custom" - ], + "renderTypeList": ["custom"], "valueType": "any", "value": [], "label": "", @@ -217,9 +199,7 @@ }, { "key": "system_httpParams", - "renderTypeList": [ - "hidden" - ], + "renderTypeList": ["hidden"], "valueType": "any", "value": [], "label": "", @@ -231,9 +211,7 @@ }, { "key": "system_httpJsonBody", - "renderTypeList": [ - "hidden" - ], + "renderTypeList": ["hidden"], "valueType": "any", "value": "{\n\"ms\": {{$pluginInput.ms$}}\n}", "label": "", @@ -245,9 +223,7 @@ }, { "key": "system_httpFormBody", - "renderTypeList": [ - "hidden" - ], + "renderTypeList": ["hidden"], "valueType": "any", "value": [], "label": "", @@ -259,9 +235,7 @@ }, { "key": "system_httpContentType", - "renderTypeList": [ - "hidden" - ], + "renderTypeList": ["hidden"], "valueType": "string", "value": "json", "label": "", @@ -338,32 +312,7 @@ } ], "chatConfig": { - "welcomeText": "", - "variables": [], - "questionGuide": { - "open": false, - "model": "gpt-4o-mini", - "customPrompt": "You are an AI assistant tasked with predicting the user's next question based on the conversation history. Your goal is to generate 3 potential questions that will guide the user to continue the conversation. When generating these questions, adhere to the following rules:\n\n1. Use the same language as the user's last question in the conversation history.\n2. Keep each question under 20 characters in length.\n\nAnalyze the conversation history provided to you and use it as context to generate relevant and engaging follow-up questions. Your predictions should be logical extensions of the current topic or related areas that the user might be interested in exploring further.\n\nRemember to maintain consistency in tone and style with the existing conversation while providing diverse options for the user to choose from. Your goal is to keep the conversation flowing naturally and help the user delve deeper into the subject matter or explore related topics." - }, - "ttsConfig": { - "type": "web" - }, - "whisperConfig": { - "open": false, - "autoSend": false, - "autoTTSResponse": false - }, - "chatInputGuide": { - "open": false, - "textList": [], - "customUrl": "" - }, - "instruction": "", - "autoExecute": { - "open": false, - "defaultPrompt": "" - }, - "_id": "6784ba2c227f92f6c723ead0" + "welcomeText": "" } } -} \ No newline at end of file +} diff --git a/packages/plugins/src/sleep/index.ts b/packages/plugins/src/sleep/index.ts deleted file mode 100644 index 8f5e9de7e..000000000 --- a/packages/plugins/src/sleep/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -type Props = { - ms: number; -}; -type Response = Promise<{ - result: any; -}>; - -const main = async ({ ms }: Props): Response => { - await new Promise((resolve) => { - setTimeout(resolve, ms); - }); - return { - result: ms - }; -}; - -export default main; diff --git a/packages/service/common/api/pagination.ts b/packages/service/common/api/pagination.ts new file mode 100644 index 000000000..052cd41f5 --- /dev/null +++ b/packages/service/common/api/pagination.ts @@ -0,0 +1,21 @@ +import { CommonErrEnum } from '@fastgpt/global/common/error/code/common'; +import { ApiRequestProps } from '../../type/next'; + +export function parsePaginationRequest(req: ApiRequestProps) { + const { + pageSize = 10, + pageNum = 1, + offset = 0 + } = Object.keys(req.body).includes('pageSize') + ? req.body + : Object.keys(req.query).includes('pageSize') + ? req.query + : {}; + if (!pageSize || (pageNum === undefined && offset === undefined)) { + throw new Error(CommonErrEnum.missingParams); + } + return { + pageSize: Number(pageSize), + offset: offset ? Number(offset) : (Number(pageNum) - 1) * Number(pageSize) + }; +} diff --git a/packages/service/common/middle/cors.ts b/packages/service/common/middle/cors.ts index 73b294162..294dbe5a4 100644 --- a/packages/service/common/middle/cors.ts +++ b/packages/service/common/middle/cors.ts @@ -2,7 +2,7 @@ import type { NextApiResponse, NextApiRequest } from 'next'; import NextCors from 'nextjs-cors'; export async function withNextCors(req: NextApiRequest, res: NextApiResponse) { - const methods = ['GET', 'eHEAD', 'PUT', 'PATCH', 'POST', 'DELETE']; + const methods = ['GET', 'HEAD', 'PUT', 'PATCH', 'POST', 'DELETE']; const allowedOrigins = process.env.ALLOWED_ORIGINS?.split(','); const origin = req.headers.origin; diff --git a/packages/service/core/dataset/apiDataset/api.ts b/packages/service/core/dataset/apiDataset/api.ts index 19818b32f..162d685f5 100644 --- a/packages/service/core/dataset/apiDataset/api.ts +++ b/packages/service/core/dataset/apiDataset/api.ts @@ -99,7 +99,13 @@ export const useApiDatasetRequest = ({ apiServer }: { apiServer: APIFileServer } if (files.some((file) => !file.id || !file.name || typeof file.type === 'undefined')) { return Promise.reject('Invalid file data format'); } - return files; + + const formattedFiles = files.map((file) => ({ + ...file, + hasChild: file.type === 'folder' + })); + + return formattedFiles; }; const getFileContent = async ({ teamId, apiFileId }: { teamId: string; apiFileId: string }) => { diff --git a/packages/service/core/dataset/search/controller.ts b/packages/service/core/dataset/search/controller.ts index 0de4c2884..7a3ea9a3f 100644 --- a/packages/service/core/dataset/search/controller.ts +++ b/packages/service/core/dataset/search/controller.ts @@ -284,7 +284,7 @@ export async function searchDatasetData(props: SearchDatasetDataProps) { { _id: { $in: collectionIdList } }, - '_id name fileId rawLink externalFileId externalFileUrl', + '_id name fileId rawLink apiFileId externalFileId externalFileUrl', { ...readFromSecondary } ).lean() ]); @@ -525,7 +525,7 @@ export async function searchDatasetData(props: SearchDatasetDataProps) { { _id: { $in: searchResults.map((item) => item.collectionId) } }, - '_id name fileId rawLink externalFileId externalFileUrl', + '_id name fileId rawLink apiFileId externalFileId externalFileUrl', { ...readFromSecondary } ).lean() ]); diff --git a/packages/service/core/dataset/utils.ts b/packages/service/core/dataset/utils.ts new file mode 100644 index 000000000..4f805ccb1 --- /dev/null +++ b/packages/service/core/dataset/utils.ts @@ -0,0 +1,39 @@ +import { getTmbInfoByTmbId } from '../../support/user/team/controller'; +import { getResourcePermission } from '../../support/permission/controller'; +import { PerResourceTypeEnum } from '@fastgpt/global/support/permission/constant'; +import { DatasetPermission } from '@fastgpt/global/support/permission/dataset/controller'; + +// TODO: 需要优化成批量获取权限 +export const filterDatasetsByTmbId = async ({ + datasetIds, + tmbId +}: { + datasetIds: string[]; + tmbId: string; +}) => { + const { teamId, permission: tmbPer } = await getTmbInfoByTmbId({ tmbId }); + + // First get all permissions + const permissions = await Promise.all( + datasetIds.map(async (datasetId) => { + const per = await getResourcePermission({ + teamId, + tmbId, + resourceId: datasetId, + resourceType: PerResourceTypeEnum.dataset + }); + + if (per === undefined) return false; + + const datasetPer = new DatasetPermission({ + per, + isOwner: tmbPer.isOwner + }); + + return datasetPer.hasReadPer; + }) + ); + + // Then filter datasetIds based on permissions + return datasetIds.filter((_, index) => permissions[index]); +}; diff --git a/packages/service/core/workflow/dispatch/dataset/search.ts b/packages/service/core/workflow/dispatch/dataset/search.ts index 8a40c8e28..92067dacb 100644 --- a/packages/service/core/workflow/dispatch/dataset/search.ts +++ b/packages/service/core/workflow/dispatch/dataset/search.ts @@ -17,6 +17,7 @@ import { ChatNodeUsageType } from '@fastgpt/global/support/wallet/bill/type'; import { checkTeamReRankPermission } from '../../../../support/permission/teamLimit'; import { MongoDataset } from '../../../dataset/schema'; import { i18nT } from '../../../../../web/i18n/utils'; +import { filterDatasetsByTmbId } from '../../../dataset/utils'; type DatasetSearchProps = ModuleDispatchProps<{ [NodeInputKeyEnum.datasetSelectList]: SelectedDatasetType; @@ -29,6 +30,7 @@ type DatasetSearchProps = ModuleDispatchProps<{ [NodeInputKeyEnum.datasetSearchExtensionModel]: string; [NodeInputKeyEnum.datasetSearchExtensionBg]: string; [NodeInputKeyEnum.collectionFilterMatch]: string; + [NodeInputKeyEnum.authTmbId]: boolean; }>; export type DatasetSearchResponse = DispatchNodeResultType<{ [NodeOutputKeyEnum.datasetQuoteQA]: SearchDataResponseItemType[]; @@ -39,6 +41,7 @@ export async function dispatchDatasetSearch( ): Promise { const { runningAppInfo: { teamId }, + runningUserInfo: { tmbId }, histories, node, params: { @@ -52,7 +55,8 @@ export async function dispatchDatasetSearch( datasetSearchUsingExtensionQuery, datasetSearchExtensionModel, datasetSearchExtensionBg, - collectionFilterMatch + collectionFilterMatch, + authTmbId = false } } = props as DatasetSearchProps; @@ -64,18 +68,20 @@ export async function dispatchDatasetSearch( return Promise.reject(i18nT('common:core.chat.error.Select dataset empty')); } + const emptyResult = { + quoteQA: [], + [DispatchNodeResponseKeyEnum.nodeResponse]: { + totalPoints: 0, + query: '', + limit, + searchMode + }, + nodeDispatchUsages: [], + [DispatchNodeResponseKeyEnum.toolResponses]: [] + }; + if (!userChatInput) { - return { - quoteQA: [], - [DispatchNodeResponseKeyEnum.nodeResponse]: { - totalPoints: 0, - query: '', - limit, - searchMode - }, - nodeDispatchUsages: [], - [DispatchNodeResponseKeyEnum.toolResponses]: [] - }; + return emptyResult; } // query extension @@ -83,13 +89,24 @@ export async function dispatchDatasetSearch( ? getLLMModel(datasetSearchExtensionModel) : undefined; - const { concatQueries, rewriteQuery, aiExtensionResult } = await datasetSearchQueryExtension({ - query: userChatInput, - extensionModel, - extensionBg: datasetSearchExtensionBg, - histories: getHistories(6, histories) - }); + const [{ concatQueries, rewriteQuery, aiExtensionResult }, datasetIds] = await Promise.all([ + datasetSearchQueryExtension({ + query: userChatInput, + extensionModel, + extensionBg: datasetSearchExtensionBg, + histories: getHistories(6, histories) + }), + authTmbId + ? filterDatasetsByTmbId({ + datasetIds: datasets.map((item) => item.datasetId), + tmbId + }) + : Promise.resolve(datasets.map((item) => item.datasetId)) + ]); + if (datasetIds.length === 0) { + return emptyResult; + } // console.log(concatQueries, rewriteQuery, aiExtensionResult); // get vector @@ -110,7 +127,7 @@ export async function dispatchDatasetSearch( model: vectorModel.model, similarity, limit, - datasetIds: datasets.map((item) => item.datasetId), + datasetIds, searchMode, usingReRank: usingReRank && (await checkTeamReRankPermission(teamId)), collectionFilterMatch diff --git a/packages/service/core/workflow/dispatch/plugin/run.ts b/packages/service/core/workflow/dispatch/plugin/run.ts index f7eb09af5..a81a6a867 100644 --- a/packages/service/core/workflow/dispatch/plugin/run.ts +++ b/packages/service/core/workflow/dispatch/plugin/run.ts @@ -72,6 +72,7 @@ export const dispatchRunPlugin = async (props: RunPluginProps): Promise({ + .populate<{ tmb: TeamMemberSchema }>({ path: 'tmb', - select: 'name userId role', - populate: { - path: 'user', - select: 'avatar' - } + select: 'name userId avatar' }) .lean(), MongoResourcePermission.find({ diff --git a/packages/service/support/permission/org/orgSchema.ts b/packages/service/support/permission/org/orgSchema.ts index 45030c4a6..94fa531e4 100644 --- a/packages/service/support/permission/org/orgSchema.ts +++ b/packages/service/support/permission/org/orgSchema.ts @@ -47,14 +47,11 @@ export const OrgSchema = new Schema( OrgSchema.virtual('members', { ref: OrgMemberCollectionName, localField: '_id', - foreignField: 'orgId' + foreignField: 'orgId', + match: function (this: OrgSchemaType) { + return { teamId: this.teamId }; + } }); -// OrgSchema.virtual('permission', { -// ref: ResourcePermissionCollectionName, -// localField: '_id', -// foreignField: 'orgId', -// justOne: true -// }); try { OrgSchema.index({ diff --git a/packages/service/support/user/controller.ts b/packages/service/support/user/controller.ts index cf432b214..ab28aac72 100644 --- a/packages/service/support/user/controller.ts +++ b/packages/service/support/user/controller.ts @@ -41,7 +41,7 @@ export async function getUserDetail({ return { _id: user._id, username: user.username, - avatar: user.avatar, + avatar: tmb.avatar, timezone: user.timezone, promotionRate: user.promotionRate, team: tmb, diff --git a/packages/service/support/user/schema.ts b/packages/service/support/user/schema.ts index 10094ee6f..78234fd34 100644 --- a/packages/service/support/user/schema.ts +++ b/packages/service/support/user/schema.ts @@ -3,7 +3,6 @@ const { Schema } = connectionMongo; import { hashStr } from '@fastgpt/global/common/string/tools'; import type { UserModelSchema } from '@fastgpt/global/support/user/type'; import { UserStatusEnum, userStatusMap } from '@fastgpt/global/support/user/constant'; -import { getRandomUserAvatar } from '@fastgpt/global/support/user/utils'; export const userCollectionName = 'users'; @@ -33,11 +32,6 @@ const UserSchema = new Schema({ type: Date, default: () => new Date() }, - avatar: { - type: String, - default: () => getRandomUserAvatar() - }, - promotionRate: { type: Number, default: 15 @@ -62,7 +56,10 @@ const UserSchema = new Schema({ ref: userCollectionName }, fastgpt_sem: Object, - sourceDomain: String + sourceDomain: String, + + /** @deprecated */ + avatar: String }); try { diff --git a/packages/service/support/user/team/controller.ts b/packages/service/support/user/team/controller.ts index 451e02f5b..d48d9bf0b 100644 --- a/packages/service/support/user/team/controller.ts +++ b/packages/service/support/user/team/controller.ts @@ -37,7 +37,7 @@ async function getTeamMember(match: Record): Promise getRandomUserAvatar() + }, name: { type: String, default: 'Member' @@ -39,7 +44,6 @@ const TeamMemberSchema = new Schema({ // Abandoned role: { type: String - // enum: Object.keys(TeamMemberRoleMap) // disable enum validation for old data } }); diff --git a/packages/service/support/user/utils.ts b/packages/service/support/user/utils.ts index fc1fef631..574ab7853 100644 --- a/packages/service/support/user/utils.ts +++ b/packages/service/support/user/utils.ts @@ -1,4 +1,7 @@ +import { SourceMemberType } from '@fastgpt/global/support/user/type'; import { MongoTeam } from './team/teamSchema'; +import { MongoTeamMember } from './team/teamMemberSchema'; +import { ClientSession } from '../../common/mongo'; /* export dataset limit */ export const updateExportDatasetLimit = async (teamId: string) => { @@ -67,3 +70,41 @@ export const checkWebSyncLimit = async ({ return Promise.reject(`每个团队,每 ${limitMinutes} 分钟仅使用一次同步功能。`); } }; + +/** + * This function will add a property named sourceMember to the list passed in. + * @param list The list to add the sourceMember property to. [TmbId] property is required. + * @error If member is not found, this item will be skipped. + * @returns The list with the sourceMember property added. + */ +export async function addSourceMember({ + list, + session +}: { + list: T[]; + session?: ClientSession; +}): Promise> { + if (!Array.isArray(list)) return []; + + const tmbList = await MongoTeamMember.find( + { + _id: { $in: list.map((item) => String(item.tmbId)) } + }, + 'tmbId name avatar status', + { + session + } + ).lean(); + + return list + .map((item) => { + const tmb = tmbList.find((tmb) => String(tmb._id) === String(item.tmbId)); + if (!tmb) return; + + return { + ...item, + sourceMember: { name: tmb.name, avatar: tmb.avatar, status: tmb.status } + }; + }) + .filter(Boolean) as Array; +} diff --git a/packages/web/common/fetch/type.d.ts b/packages/web/common/fetch/type.d.ts index 0153db956..7f2ea1fbf 100644 --- a/packages/web/common/fetch/type.d.ts +++ b/packages/web/common/fetch/type.d.ts @@ -1,8 +1,13 @@ -export type PaginationProps = T & { - offset: number; - pageSize: number; -}; -export type PaginationResponse = { +import { RequireOnlyOne } from '@fastgpt/global/common/type/utils'; + +type PaginationProps = T & { + pageSize: number | string; +} & RequireOnlyOne<{ + offset: number | string; + pageNum: number | string; + }>; + +type PaginationResponse = { total: number; list: T[]; }; diff --git a/packages/web/components/common/Avatar/AvatarGroup.tsx b/packages/web/components/common/Avatar/AvatarGroup.tsx index 2c26b9a9d..199373f05 100644 --- a/packages/web/components/common/Avatar/AvatarGroup.tsx +++ b/packages/web/components/common/Avatar/AvatarGroup.tsx @@ -23,7 +23,7 @@ function AvatarGroup({ {avatars.slice(0, max).map((avatar, index) => ( 0 ? 'absolute' : 'relative'} left={index > 0 ? `${index * 15}px` : 0} diff --git a/packages/web/components/common/MySelect/index.tsx b/packages/web/components/common/MySelect/index.tsx index 7d503d21b..c9eb6230d 100644 --- a/packages/web/components/common/MySelect/index.tsx +++ b/packages/web/components/common/MySelect/index.tsx @@ -21,7 +21,15 @@ import type { ButtonProps, MenuItemProps } from '@chakra-ui/react'; import MyIcon from '../Icon'; import { useRequest2 } from '../../../hooks/useRequest'; import MyDivider from '../MyDivider'; +import { useScrollPagination } from '../../../hooks/useScrollPagination'; +/** 选择组件 Props 类型 + * value: 选中的值 + * placeholder: 占位符 + * list: 列表数据 + * isLoading: 是否加载中 + * ScrollData: 分页滚动数据控制器 [useScrollPagination] 的返回值 + * */ export type SelectProps = ButtonProps & { value?: T; placeholder?: string; @@ -34,6 +42,7 @@ export type SelectProps = ButtonProps & { }[]; isLoading?: boolean; onchange?: (val: T) => any | Promise; + ScrollData?: ReturnType['ScrollData']; }; const MySelect = ( @@ -44,6 +53,7 @@ const MySelect = ( list = [], onchange, isLoading = false, + ScrollData, ...props }: SelectProps, ref: ForwardedRef<{ @@ -87,6 +97,46 @@ const MySelect = ( const isSelecting = loading || isLoading; + const ListRender = useMemo(() => { + return ( + <> + {list.map((item, i) => ( + + { + if (onChange && value !== item.value) { + onChange(item.value); + } + }} + whiteSpace={'pre-wrap'} + fontSize={'sm'} + display={'block'} + > + {item.label} + {item.description && ( + + {item.description} + + )} + + {item.showBorder && } + + ))} + + ); + }, [list, value]); + return ( ( maxH={'40vh'} overflowY={'auto'} > - {list.map((item, i) => ( - - { - if (onChange && value !== item.value) { - onChange(item.value); - } - }} - whiteSpace={'pre-wrap'} - fontSize={'sm'} - display={'block'} - > - {item.label} - {item.description && ( - - {item.description} - - )} - - {item.showBorder && } - - ))} + {ScrollData ? {ListRender} : ListRender} diff --git a/packages/web/components/common/UserBox/index.tsx b/packages/web/components/common/UserBox/index.tsx new file mode 100644 index 000000000..8e659fa1a --- /dev/null +++ b/packages/web/components/common/UserBox/index.tsx @@ -0,0 +1,23 @@ +import { Box, HStack, type StackProps } from '@chakra-ui/react'; +import { SourceMemberType } from '@fastgpt/global/support/user/type'; +import React from 'react'; +import Avatar from '../Avatar'; +import { useTranslation } from 'next-i18next'; +import Tag from '../Tag'; + +export type UserBoxProps = { + sourceMember: SourceMemberType; + avatarSize?: string; +} & StackProps; +function UserBox({ sourceMember, avatarSize = '1.25rem', ...props }: UserBoxProps) { + const { t } = useTranslation(); + return ( + + + {sourceMember.name} + {sourceMember.status === 'leave' && {t('common:user_leaved')}} + + ); +} + +export default React.memo(UserBox); diff --git a/packages/web/hooks/usePagination.tsx b/packages/web/hooks/usePagination.tsx index 477c32672..5e65d11f3 100644 --- a/packages/web/hooks/usePagination.tsx +++ b/packages/web/hooks/usePagination.tsx @@ -4,7 +4,6 @@ import { ArrowBackIcon, ArrowForwardIcon } from '@chakra-ui/icons'; import { useTranslation } from 'next-i18next'; import { useToast } from './useToast'; import { getErrText } from '@fastgpt/global/common/error/utils'; - import { useBoolean, useLockFn, @@ -14,37 +13,33 @@ import { useThrottleEffect } from 'ahooks'; +import { PaginationProps, PaginationResponse } from '../common/fetch/type'; + const thresholdVal = 200; -type PagingData = { - pageNum: number; - pageSize: number; - data: T[]; - total?: number; -}; - -export function usePagination({ - api, - pageSize = 10, - params = {}, - defaultRequest = true, - type = 'button', - onChange, - refreshDeps, - scrollLoadType = 'bottom', - EmptyTip -}: { - api: (data: any) => Promise>; - pageSize?: number; - params?: Record; - defaultRequest?: boolean; - type?: 'button' | 'scroll'; - onChange?: (pageNum: number) => void; - refreshDeps?: any[]; - throttleWait?: number; - scrollLoadType?: 'top' | 'bottom'; - EmptyTip?: React.JSX.Element; -}) { +export function usePagination( + api: (data: PaginationProps) => Promise>, + { + pageSize = 10, + params, + defaultRequest = true, + type = 'button', + onChange, + refreshDeps, + scrollLoadType = 'bottom', + EmptyTip + }: { + pageSize?: number; + params?: DataT; + defaultRequest?: boolean; + type?: 'button' | 'scroll'; + onChange?: (pageNum: number) => void; + refreshDeps?: any[]; + throttleWait?: number; + scrollLoadType?: 'top' | 'bottom'; + EmptyTip?: React.JSX.Element; + } +) { const { toast } = useToast(); const { t } = useTranslation(); @@ -64,7 +59,7 @@ export function usePagination({ setTrue(); try { - const res: PagingData = await api({ + const res = await api({ pageNum: num, pageSize, ...params @@ -93,13 +88,13 @@ export function usePagination({ ); } - setData((prevData) => (num === 1 ? res.data : [...res.data, ...prevData])); + setData((prevData) => (num === 1 ? res.list : [...res.list, ...prevData])); adjustScrollPosition(); } else { - setData((prevData) => (num === 1 ? res.data : [...prevData, ...res.data])); + setData((prevData) => (num === 1 ? res.list : [...prevData, ...res.list])); } } else { - setData(res.data); + setData(res.list); } onChange?.(num); diff --git a/packages/web/hooks/useScrollPagination.tsx b/packages/web/hooks/useScrollPagination.tsx index 83a5ad11b..4ecc77c44 100644 --- a/packages/web/hooks/useScrollPagination.tsx +++ b/packages/web/hooks/useScrollPagination.tsx @@ -16,7 +16,7 @@ import MyBox from '../components/common/MyBox'; import { useTranslation } from 'next-i18next'; type ItemHeight = (index: number, data: T) => number; -const thresholdVal = 200; +const thresholdVal = 100; export type ScrollListType = ({ children, @@ -269,8 +269,10 @@ export function useScrollPagination< ({ children, ScrollContainerRef, + isLoading, ...props }: { + isLoading?: boolean; children: ReactNode; ScrollContainerRef?: RefObject; } & BoxProps) => { @@ -302,7 +304,7 @@ export function useScrollPagination< ); return ( - + {scrollLoadType === 'top' && total > 0 && isLoading && ( {t('common:common.is_requesting')} @@ -325,7 +327,7 @@ export function useScrollPagination< )} {isEmpty && EmptyTip} - + ); } ); diff --git a/packages/web/i18n/en/common.json b/packages/web/i18n/en/common.json index 1feb36b2a..9871c5528 100644 --- a/packages/web/i18n/en/common.json +++ b/packages/web/i18n/en/common.json @@ -39,6 +39,7 @@ "classification": "Classification", "click_to_resume": "Click to Resume", "code_editor": "Code Editor", + "code_error.account_error": "Incorrect account name or password", "code_error.app_error.invalid_app_type": "Invalid Application Type", "code_error.app_error.invalid_owner": "Unauthorized Application Owner", "code_error.app_error.not_exist": "Application Does Not Exist", @@ -95,7 +96,6 @@ "code_error.team_error.website_sync_not_enough": "Unauthorized to Use Website Sync", "code_error.token_error_code.403": "Invalid Login Status, Please Re-login", "code_error.user_error.balance_not_enough": "Insufficient Account Balance", - "code_error.account_error": "Incorrect account name or password", "code_error.user_error.bin_visitor_guest": "You Are Currently a Guest, Unauthorized to Operate", "code_error.user_error.un_auth_user": "User Not Found", "common.Action": "Action", @@ -1273,6 +1273,7 @@ "user.team.role.Visitor": "visitor", "user.team.role.writer": "writable member", "user.type": "Type", + "user_leaved": "Leaved", "verification": "Verification", "workflow.template.communication": "Communication", "xx_search_result": "{{key}} Search Results", diff --git a/packages/web/i18n/en/workflow.json b/packages/web/i18n/en/workflow.json index 2f2912a24..223dda9b5 100644 --- a/packages/web/i18n/en/workflow.json +++ b/packages/web/i18n/en/workflow.json @@ -13,6 +13,8 @@ "append_application_reply_to_history_as_new_context": "Append the application's reply to the history as new context", "application_call": "Application Call", "assigned_reply": "Assigned Reply", + "auth_tmb_id": "Auth member", + "auth_tmb_id_tip": "After it is turned on, when the application is released to the outside world, the knowledge base will be filtered based on whether the user has permission to the knowledge base.\n\nIf it is not enabled, the configured knowledge base will be searched directly without permission filtering.", "can_not_loop": "This node can't loop.", "choose_another_application_to_call": "Select another application to call", "classification_result": "Classification Result", diff --git a/packages/web/i18n/zh-CN/account_team.json b/packages/web/i18n/zh-CN/account_team.json index e562ef7c9..91587efc2 100644 --- a/packages/web/i18n/zh-CN/account_team.json +++ b/packages/web/i18n/zh-CN/account_team.json @@ -35,5 +35,8 @@ "user_team_invite_member": "邀请成员", "user_team_leave_team": "离开团队", "user_team_leave_team_failed": "离开团队失败", - "waiting": "待接受" + "waiting": "待接受", + "sync_immediately": "立即同步", + "sync_member_failed": "同步成员失败", + "sync_member_success": "同步成员成功" } diff --git a/packages/web/i18n/zh-CN/common.json b/packages/web/i18n/zh-CN/common.json index bbbfcb4ed..fa46e013b 100644 --- a/packages/web/i18n/zh-CN/common.json +++ b/packages/web/i18n/zh-CN/common.json @@ -43,6 +43,7 @@ "classification": "分类", "click_to_resume": "点击恢复", "code_editor": "代码编辑", + "code_error.account_error": "账号名或密码错误", "code_error.app_error.invalid_app_type": "错误的应用类型", "code_error.app_error.invalid_owner": "非法的应用所有者", "code_error.app_error.not_exist": "应用不存在", @@ -99,7 +100,6 @@ "code_error.team_error.website_sync_not_enough": "无权使用Web站点同步~", "code_error.token_error_code.403": "登录状态无效,请重新登录", "code_error.user_error.balance_not_enough": "账号余额不足~", - "code_error.account_error": "账号名或密码错误", "code_error.user_error.bin_visitor_guest": "您当前身份为游客,无权操作", "code_error.user_error.un_auth_user": "找不到该用户", "common.Action": "操作", @@ -1268,6 +1268,7 @@ "user.team.role.Visitor": "访客", "user.team.role.writer": "可写成员", "user.type": "类型", + "user_leaved": "已离开", "verification": "验证", "workflow.template.communication": "通信", "xx_search_result": "{{key}} 的搜索结果", diff --git a/packages/web/i18n/zh-CN/workflow.json b/packages/web/i18n/zh-CN/workflow.json index 42a62528d..37c4dcabb 100644 --- a/packages/web/i18n/zh-CN/workflow.json +++ b/packages/web/i18n/zh-CN/workflow.json @@ -13,6 +13,8 @@ "append_application_reply_to_history_as_new_context": "将该应用回复内容拼接到历史记录中,作为新的上下文返回", "application_call": "应用调用", "assigned_reply": "指定回复", + "auth_tmb_id": "使用者鉴权", + "auth_tmb_id_tip": "开启后,对外发布该应用时,还会根据用户是否有该知识库权限进行知识库过滤。\n若未开启,则直接按配置的知识库进行检索,不进行权限过滤。", "can_not_loop": "该节点不支持循环嵌套", "choose_another_application_to_call": "选择一个其他应用进行调用", "classification_result": "分类结果", diff --git a/packages/web/i18n/zh-Hant/common.json b/packages/web/i18n/zh-Hant/common.json index 2d3cfc13a..efa9bbf46 100644 --- a/packages/web/i18n/zh-Hant/common.json +++ b/packages/web/i18n/zh-Hant/common.json @@ -39,6 +39,7 @@ "classification": "分類", "click_to_resume": "點選繼續", "code_editor": "程式碼編輯器", + "code_error.account_error": "帳號名稱或密碼錯誤", "code_error.app_error.invalid_app_type": "無效的應用程式類型", "code_error.app_error.invalid_owner": "非法的應用程式擁有者", "code_error.app_error.not_exist": "應用程式不存在", @@ -95,7 +96,6 @@ "code_error.team_error.website_sync_not_enough": "無權使用網站同步", "code_error.token_error_code.403": "登入狀態無效,請重新登入", "code_error.user_error.balance_not_enough": "帳戶餘額不足", - "code_error.account_error": "帳號名稱或密碼錯誤", "code_error.user_error.bin_visitor_guest": "您目前身份為訪客,無權操作", "code_error.user_error.un_auth_user": "找不到此使用者", "common.Action": "操作", @@ -1273,6 +1273,7 @@ "user.team.role.Visitor": "訪客", "user.team.role.writer": "可寫入成員", "user.type": "類型", + "user_leaved": "已離開", "verification": "驗證", "workflow.template.communication": "通訊", "xx_search_result": "{{key}} 的搜尋結果", diff --git a/packages/web/i18n/zh-Hant/workflow.json b/packages/web/i18n/zh-Hant/workflow.json index 98603c05a..b022ab4ca 100644 --- a/packages/web/i18n/zh-Hant/workflow.json +++ b/packages/web/i18n/zh-Hant/workflow.json @@ -13,6 +13,8 @@ "append_application_reply_to_history_as_new_context": "將應用程式的回覆附加到歷史紀錄中,作為新的脈絡", "application_call": "應用程式呼叫", "assigned_reply": "指定回覆", + "auth_tmb_id": "使用者鑑權", + "auth_tmb_id_tip": "開啟後,對外發布應用程式時,也會根據使用者是否有該知識庫權限進行知識庫過濾。\n\n若未開啟,則直接按配置的知識庫進行檢索,不進行權限過濾。", "can_not_loop": "這個節點不能迴圈。", "choose_another_application_to_call": "選擇另一個應用程式來呼叫", "classification_result": "分類結果", diff --git a/projects/app/.env.template b/projects/app/.env.template index b8f4ca0a8..71ed204df 100644 --- a/projects/app/.env.template +++ b/projects/app/.env.template @@ -57,3 +57,5 @@ WORKFLOW_MAX_LOOP_TIMES=50 # CHAT_LOG_INTERVAL=10000 # # 日志来源ID前缀 # CHAT_LOG_SOURCE_ID_PREFIX=fastgpt- +# 自定义跨域,不配置时,默认都允许跨域(逗号分割) +ALLOWED_ORIGINS= \ No newline at end of file diff --git a/projects/app/package.json b/projects/app/package.json index c735c9f6a..86370fcda 100644 --- a/projects/app/package.json +++ b/projects/app/package.json @@ -1,6 +1,6 @@ { "name": "app", - "version": "4.8.18", + "version": "4.8.19", "private": false, "scripts": { "dev": "next dev", diff --git a/projects/app/src/components/core/app/InputGuideConfig.tsx b/projects/app/src/components/core/app/InputGuideConfig.tsx index 13c3920ba..91a83d24a 100644 --- a/projects/app/src/components/core/app/InputGuideConfig.tsx +++ b/projects/app/src/components/core/app/InputGuideConfig.tsx @@ -54,7 +54,7 @@ const InputGuideConfig = ({ onChange: (e: ChatInputGuideConfigType) => void; }) => { const { t } = useTranslation(); - const { chatT, commonT } = useI18n(); + const { chatT } = useI18n(); const { isOpen, onOpen, onClose } = useDisclosure(); const { isOpen: isOpenLexiconConfig, @@ -220,7 +220,7 @@ const LexiconConfigModal = ({ appId, onClose }: { appId: string; onClose: () => }); const { run: createNewData, loading: isCreating } = useRequest2( - (textList: string[]) => { + async (textList: string[]) => { if (textList.filter(Boolean).length === 0) { return Promise.resolve(); } diff --git a/projects/app/src/components/core/chat/ChatContainer/ChatBox/Provider.tsx b/projects/app/src/components/core/chat/ChatContainer/ChatBox/Provider.tsx index d7b4a470f..3b1ff2f14 100644 --- a/projects/app/src/components/core/chat/ChatContainer/ChatBox/Provider.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/ChatBox/Provider.tsx @@ -29,8 +29,6 @@ export type ChatProviderProps = { outLinkAuthData?: OutLinkChatAuthProps; chatType: 'log' | 'chat' | 'share' | 'team'; - showRawSource: boolean; - showNodeStatus: boolean; }; type useChatStoreType = ChatProviderProps & { @@ -132,8 +130,6 @@ const Provider = ({ chatId, outLinkAuthData = {}, chatType = 'chat', - showRawSource, - showNodeStatus, children, ...props }: ChatProviderProps & { @@ -249,9 +245,7 @@ const Provider = ({ chatId, outLinkAuthData, getHistoryResponseData, - chatType, - showRawSource, - showNodeStatus + chatType }; return {children}; diff --git a/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ChatItem.tsx b/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ChatItem.tsx index 0dd714cd5..a603216d0 100644 --- a/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ChatItem.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ChatItem.tsx @@ -25,6 +25,7 @@ import { isEqual } from 'lodash'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; import { formatTimeToChatItemTime } from '@fastgpt/global/common/string/time'; import dayjs from 'dayjs'; +import { ChatItemContext } from '@/web/core/chat/context/chatItemContext'; const colorMap = { [ChatStatusEnum.loading]: { @@ -139,7 +140,7 @@ const ChatItem = (props: Props) => { const isChatting = useContextSelector(ChatBoxContext, (v) => v.isChatting); const chatType = useContextSelector(ChatBoxContext, (v) => v.chatType); - const showNodeStatus = useContextSelector(ChatBoxContext, (v) => v.showNodeStatus); + const showNodeStatus = useContextSelector(ChatItemContext, (v) => v.showNodeStatus); const isChatLog = chatType === 'log'; const { copyData } = useCopyData(); diff --git a/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/QuoteModal.tsx b/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/QuoteModal.tsx index 091125ad7..a8457d0b0 100644 --- a/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/QuoteModal.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/QuoteModal.tsx @@ -9,19 +9,16 @@ import RawSourceBox from '@/components/core/dataset/RawSourceBox'; import { getWebReqUrl } from '@fastgpt/web/common/system/utils'; import { useContextSelector } from 'use-context-selector'; import { ChatBoxContext } from '../Provider'; +import { ChatItemContext } from '@/web/core/chat/context/chatItemContext'; const QuoteModal = ({ rawSearch = [], onClose, - canEditDataset, - showRawSource, chatItemId, metadata }: { rawSearch: SearchDataResponseItemType[]; onClose: () => void; - canEditDataset: boolean; - showRawSource: boolean; chatItemId: string; metadata?: { collectionId: string; @@ -47,6 +44,11 @@ const QuoteModal = ({ chatItemId, ...(v.outLinkAuthData || {}) })); + const showRawSource = useContextSelector(ChatItemContext, (v) => v.isShowReadRawSource); + const showRouteToDatasetDetail = useContextSelector( + ChatItemContext, + (v) => v.showRouteToDatasetDetail + ); return ( <> @@ -71,12 +73,7 @@ const QuoteModal = ({ } > - + @@ -87,14 +84,10 @@ export default QuoteModal; export const QuoteList = React.memo(function QuoteList({ chatItemId, - rawSearch = [], - canEditDataset, - canViewSource + rawSearch = [] }: { chatItemId?: string; rawSearch: SearchDataResponseItemType[]; - canEditDataset: boolean; - canViewSource: boolean; }) { const theme = useTheme(); @@ -104,6 +97,11 @@ export const QuoteList = React.memo(function QuoteList({ chatId: v.chatId, ...(v.outLinkAuthData || {}) })); + const showRawSource = useContextSelector(ChatItemContext, (v) => v.isShowReadRawSource); + const showRouteToDatasetDetail = useContextSelector( + ChatItemContext, + (v) => v.showRouteToDatasetDetail + ); return ( <> @@ -120,8 +118,8 @@ export const QuoteList = React.memo(function QuoteList({ > diff --git a/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ResponseTags.tsx b/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ResponseTags.tsx index eda19e7e2..7be7111e5 100644 --- a/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ResponseTags.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/ChatBox/components/ResponseTags.tsx @@ -49,7 +49,6 @@ const ResponseTags = ({ const [quoteFolded, setQuoteFolded] = useState(true); const chatType = useContextSelector(ChatBoxContext, (v) => v.chatType); - const showRawSource = useContextSelector(ChatBoxContext, (v) => v.showRawSource); const notSharePage = useMemo(() => chatType !== 'share', [chatType]); const { @@ -251,8 +250,6 @@ const ResponseTags = ({ setQuoteModalData(undefined)} /> )} diff --git a/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx b/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx index 939d152aa..54534b622 100644 --- a/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/ChatBox/index.tsx @@ -18,7 +18,6 @@ import { Box, Checkbox } from '@chakra-ui/react'; import { EventNameEnum, eventBus } from '@/web/common/utils/eventbus'; import { chats2GPTMessages } from '@fastgpt/global/core/chat/adapt'; import { useForm } from 'react-hook-form'; -import { useRouter } from 'next/router'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { useTranslation } from 'next-i18next'; import { diff --git a/projects/app/src/components/core/chat/components/WholeResponseModal.tsx b/projects/app/src/components/core/chat/components/WholeResponseModal.tsx index 8dfc6a320..d6078e193 100644 --- a/projects/app/src/components/core/chat/components/WholeResponseModal.tsx +++ b/projects/app/src/components/core/chat/components/WholeResponseModal.tsx @@ -249,14 +249,7 @@ export const WholeResponseContent = ({ {activeModule.quoteList && activeModule.quoteList.length > 0 && ( - } + rawDom={} /> )} diff --git a/projects/app/src/components/core/dataset/RawSourceBox.tsx b/projects/app/src/components/core/dataset/RawSourceBox.tsx index 7957adfe0..4b860d8dc 100644 --- a/projects/app/src/components/core/dataset/RawSourceBox.tsx +++ b/projects/app/src/components/core/dataset/RawSourceBox.tsx @@ -5,7 +5,6 @@ import { useTranslation } from 'next-i18next'; import { getCollectionSourceAndOpen } from '@/web/core/dataset/hooks/readCollectionSource'; import { getSourceNameIcon } from '@fastgpt/global/core/dataset/utils'; import MyIcon from '@fastgpt/web/components/common/Icon'; -import { useI18n } from '@/web/context/I18n'; import type { readCollectionSourceBody } from '@/pages/api/core/dataset/collection/read'; type Props = BoxProps & @@ -33,7 +32,6 @@ const RawSourceBox = ({ ...props }: Props) => { const { t } = useTranslation(); - const { fileT } = useI18n(); const canPreview = !!sourceId && canView; @@ -51,7 +49,7 @@ const RawSourceBox = ({ return ( void }) { const { t } = useTranslation(); - const { loadAndGetTeamMembers } = useUserStore(); - const [inputValue, setInputValue] = React.useState(''); - const { data: teamMembers = [] } = useRequest2(loadAndGetTeamMembers, { - manual: false + const { data: teamMembers, ScrollData } = useScrollPagination(getTeamMembers, { + pageSize: 15 }); + const memberList = teamMembers.filter((item) => { return item.memberName.includes(inputValue); }); @@ -101,11 +101,6 @@ export function ChangeOwnerModal({ onOpenMemberListMenu(); setSelectedMember(null); }} - // onBlur={() => { - // setTimeout(() => { - // onCloseMemberListMenu(); - // }, 10); - // }} {...(selectedMember && { pl: '10' })} /> @@ -123,26 +118,28 @@ export function ChangeOwnerModal({ maxH={'300px'} overflow={'auto'} > - {memberList.map((item) => ( - { - setInputValue(item.memberName); - setSelectedMember(item); - onCloseMemberListMenu(); - }} - > - - - {item.memberName} - - - ))} + + {memberList.map((item) => ( + { + setInputValue(item.memberName); + setSelectedMember(item); + onCloseMemberListMenu(); + }} + > + + + {item.memberName} + + + ))} + )} diff --git a/projects/app/src/components/support/permission/MemberManager/MemberModal.tsx b/projects/app/src/components/support/permission/MemberManager/MemberModal.tsx index e51049b33..4d77f9ef8 100644 --- a/projects/app/src/components/support/permission/MemberManager/MemberModal.tsx +++ b/projects/app/src/components/support/permission/MemberManager/MemberModal.tsx @@ -33,6 +33,10 @@ import { ParentTreePathItemType } from '@fastgpt/global/common/parentFolder/type import { OrgType } from '@fastgpt/global/support/user/team/org/type'; import { useContextSelector } from 'use-context-selector'; import { CollaboratorContext } from './context'; +import { getTeamMembers } from '@/web/support/user/team/api'; +import { getGroupList } from '@/web/support/user/team/group/api'; +import { getOrgList } from '@/web/support/user/team/org/api'; +import { useScrollPagination } from '@fastgpt/web/hooks/useScrollPagination'; const HoverBoxStyle = { bgColor: 'myGray.50', @@ -47,30 +51,27 @@ function MemberModal({ addPermissionOnly?: boolean; }) { const { t } = useTranslation(); - const { userInfo, loadAndGetTeamMembers, loadAndGetGroups, loadAndGetOrgs } = useUserStore(); - + const { userInfo } = useUserStore(); const collaboratorList = useContextSelector(CollaboratorContext, (v) => v.collaboratorList); - const [searchText, setSearchText] = useState(''); const [filterClass, setFilterClass] = useState<'member' | 'org' | 'group'>(); + const { data: members, ScrollData } = useScrollPagination(getTeamMembers, { + pageSize: 15 + }); - const { data: [members = [], groups = [], orgs = []] = [], loading: loadingMembersAndGroups } = - useRequest2( - async () => { - if (!userInfo?.team?.teamId) return [[], []]; - return Promise.all([ - loadAndGetTeamMembers(true), - loadAndGetGroups(true), - loadAndGetOrgs(true) - ]); - }, - { - manual: false, - refreshDeps: [userInfo?.team?.teamId] - } - ); + const { data: [groups = [], orgs = []] = [], loading: loadingGroupsAndOrgs } = useRequest2( + async () => { + if (!userInfo?.team?.teamId) return [[], []]; + return Promise.all([getGroupList(), getOrgList()]); + }, + { + manual: false, + refreshDeps: [userInfo?.team?.teamId] + } + ); const [parentPath, setParentPath] = useState(''); + const paths = useMemo(() => { const splitPath = parentPath.split('/').filter(Boolean); return splitPath @@ -212,7 +213,7 @@ function MemberModal({ h={'100%'} maxH={'90vh'} isCentered - isLoading={loadingMembersAndGroups} + isLoading={loadingGroupsAndOrgs} > + {/* Entry */} {!searchText && !filterClass && ( <> {entryList.current.map((item) => { @@ -298,142 +300,135 @@ function MemberModal({ )} - - {filterMembers.map((member) => { - const collaborator = collaboratorList?.find((v) => v.tmbId === member.tmbId); - const disabled = addOnly && collaborator !== undefined; - const onChange = () => { - if (disabled) return; - setSelectedMembers((state) => { - if (state.includes(member.tmbId)) { - return state.filter((v) => v !== member.tmbId); - } - return [...state, member.tmbId]; - }); - }; - return ( - - - - - {member.memberName} - - - - ); - })} - {filterOrgs.map((org) => { - const collaborator = collaboratorList?.find((v) => v.orgId === org._id); - const disabled = addOnly && collaborator !== undefined; - const onChange = () => { - if (disabled) return; - setSelectedOrgIdList((state) => { - if (state.includes(org._id)) { - return state.filter((v) => v !== org._id); - } - return [...state, org._id]; - }); - }; - return ( - - - - - {org.name} + {filterClass && ( + + {filterOrgs.map((org) => { + const onChange = () => { + setSelectedOrgIdList((state) => { + if (state.includes(org._id)) { + return state.filter((v) => v !== org._id); + } + return [...state, org._id]; + }); + }; + const collaborator = collaboratorList?.find((v) => v.orgId === org._id); + return ( + + + + + {org.name} + {org.count && ( + <> + + {org.count} + + + )} + + {org.count && ( - - {org.count} - + { + setParentPath(getOrgChildrenPath(org)); + }} + /> )} - - {org.count && ( - { - e.stopPropagation(); - setParentPath(getOrgChildrenPath(org)); - }} + ); + })} + {filterMembers.map((member) => { + const onChange = () => { + setSelectedMembers((state) => { + if (state.includes(member.tmbId)) { + return state.filter((v) => v !== member.tmbId); + } + return [...state, member.tmbId]; + }); + }; + const collaborator = collaboratorList?.find((v) => v.tmbId === member.tmbId); + return ( + + - )} - - ); - })} - {filterGroups.map((group) => { - const collaborator = collaboratorList?.find((v) => v.groupId === group._id); - const disabled = addOnly && collaborator !== undefined; - const onChange = () => { - if (disabled) return; - setSelectedGroupIdList((state) => { - if (state.includes(group._id)) { - return state.filter((v) => v !== group._id); - } - return [...state, group._id]; - }); - }; - return ( - - - - - {group.name === DefaultGroupName ? userInfo?.team.teamName : group.name} - - - - ); - })} - + + + {member.memberName} + + + + ); + })} + {filterGroups.map((group) => { + const onChange = () => { + setSelectedGroupIdList((state) => { + if (state.includes(group._id)) { + return state.filter((v) => v !== group._id); + } + return [...state, group._id]; + }); + }; + const collaborator = collaboratorList?.find((v) => v.groupId === group._id); + return ( + + + + + {group.name === DefaultGroupName ? userInfo?.team.teamName : group.name} + + + + ); + })} + + )} diff --git a/projects/app/src/global/core/api/appReq.d.ts b/projects/app/src/global/core/api/appReq.d.ts index 7668e5355..59a039afc 100644 --- a/projects/app/src/global/core/api/appReq.d.ts +++ b/projects/app/src/global/core/api/appReq.d.ts @@ -1,7 +1,7 @@ -import { RequestPaging } from '@/types'; +import { PaginationProps } from '@fastgpt/web/common/fetch/type'; -export type GetAppChatLogsParams = RequestPaging & { +export type GetAppChatLogsParams = PaginationProps<{ appId: string; dateStart: Date; dateEnd: Date; -}; +}>; diff --git a/projects/app/src/global/core/api/datasetReq.d.ts b/projects/app/src/global/core/api/datasetReq.d.ts index e896df0e2..22c691466 100644 --- a/projects/app/src/global/core/api/datasetReq.d.ts +++ b/projects/app/src/global/core/api/datasetReq.d.ts @@ -3,24 +3,24 @@ import { DatasetCollectionTypeEnum, DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants'; -import type { RequestPaging } from '@/types'; import { TrainingModeEnum } from '@fastgpt/global/core/dataset/constants'; import type { SearchTestItemType } from '@/types/core/dataset'; import { UploadChunkItemType } from '@fastgpt/global/core/dataset/type'; import { DatasetCollectionSchemaType } from '@fastgpt/global/core/dataset/type'; import { PermissionTypeEnum } from '@fastgpt/global/support/permission/constant'; import type { LLMModelItemType } from '@fastgpt/global/core/ai/model.d'; +import { PaginationProps } from '@fastgpt/web/common/fetch/type'; /* ===== dataset ===== */ /* ======= collections =========== */ -export type GetDatasetCollectionsProps = RequestPaging & { +export type GetDatasetCollectionsProps = PaginationProps<{ datasetId: string; parentId?: string; searchText?: string; filterTags?: string[]; simple?: boolean; selectFolder?: boolean; -}; +}>; /* ==== data ===== */ diff --git a/projects/app/src/pages/account/team/components/EditInfoModal.tsx b/projects/app/src/pageComponents/account/team/EditInfoModal.tsx similarity index 100% rename from projects/app/src/pages/account/team/components/EditInfoModal.tsx rename to projects/app/src/pageComponents/account/team/EditInfoModal.tsx diff --git a/projects/app/src/pages/account/team/components/GroupManage/GroupInfoModal.tsx b/projects/app/src/pageComponents/account/team/GroupManage/GroupInfoModal.tsx similarity index 96% rename from projects/app/src/pages/account/team/components/GroupManage/GroupInfoModal.tsx rename to projects/app/src/pageComponents/account/team/GroupManage/GroupInfoModal.tsx index c2fb98e06..9fd81a310 100644 --- a/projects/app/src/pages/account/team/components/GroupManage/GroupInfoModal.tsx +++ b/projects/app/src/pageComponents/account/team/GroupManage/GroupInfoModal.tsx @@ -55,7 +55,7 @@ function GroupInfoModal({ onClose, editGroupId }: { onClose: () => void; editGro } ); - const { run: onCreate, loading: isLoadingCreate } = useRequest2( + const { runAsync: onCreate, loading: isLoadingCreate } = useRequest2( (data: GroupFormType) => { return postCreateGroup({ name: data.name, @@ -67,7 +67,7 @@ function GroupInfoModal({ onClose, editGroupId }: { onClose: () => void; editGro } ); - const { run: onUpdate, loading: isLoadingUpdate } = useRequest2( + const { runAsync: onUpdate, loading: isLoadingUpdate } = useRequest2( async (data: GroupFormType) => { if (!editGroupId) return; return putUpdateGroup({ diff --git a/projects/app/src/pages/account/team/components/GroupManage/GroupManageMember.tsx b/projects/app/src/pageComponents/account/team/GroupManage/GroupManageMember.tsx similarity index 90% rename from projects/app/src/pages/account/team/components/GroupManage/GroupManageMember.tsx rename to projects/app/src/pageComponents/account/team/GroupManage/GroupManageMember.tsx index 74e4be634..95528e7ec 100644 --- a/projects/app/src/pages/account/team/components/GroupManage/GroupManageMember.tsx +++ b/projects/app/src/pageComponents/account/team/GroupManage/GroupManageMember.tsx @@ -32,26 +32,26 @@ export type GroupFormType = { }[]; }; +// 1. Owner can not be deleted, toast +// 2. Owner/Admin can manage members +// 3. Owner can add/remove admins function GroupEditModal({ onClose, editGroupId }: { onClose: () => void; editGroupId?: string }) { - // 1. Owner can not be deleted, toast - // 2. Owner/Admin can manage members - // 3. Owner can add/remove admins const { t } = useTranslation(); const { userInfo } = useUserStore(); const { toast } = useToast(); - const [hoveredMemberId, setHoveredMemberId] = useState(undefined); - const { - members: allMembers, - refetchGroups, - groups, - refetchMembers - } = useContextSelector(TeamContext, (v) => v); + const groups = useContextSelector(TeamContext, (v) => v.groups); + const refetchGroups = useContextSelector(TeamContext, (v) => v.refetchGroups); const group = useMemo(() => { return groups.find((item) => item._id === editGroupId); }, [editGroupId, groups]); + const allMembers = useContextSelector(TeamContext, (v) => v.members); + const refetchMembers = useContextSelector(TeamContext, (v) => v.refetchMembers); + const MemberScrollData = useContextSelector(TeamContext, (v) => v.MemberScrollData); + const [hoveredMemberId, setHoveredMemberId] = useState(); const [members, setMembers] = useState(group?.members || []); + const [searchKey, setSearchKey] = useState(''); const filtered = useMemo(() => { return [ @@ -62,7 +62,7 @@ function GroupEditModal({ onClose, editGroupId }: { onClose: () => void; editGro ]; }, [searchKey, allMembers]); - const { run: onUpdate, loading: isLoadingUpdate } = useRequest2( + const { runAsync: onUpdate, loading: isLoadingUpdate } = useRequest2( async () => { if (!editGroupId || !members.length) return; return putUpdateGroup({ @@ -155,7 +155,7 @@ function GroupEditModal({ onClose, editGroupId }: { onClose: () => void; editGro setSearchKey(e.target.value); }} /> - + {filtered.map((member) => { return ( void; editGro ); })} - + {t('common:chosen') + ': ' + members.length} - + {members.map((member) => { return ( void; editGro ); })} - + - + + diff --git a/projects/app/src/pages/account/team/components/GroupManage/GroupTransferOwnerModal.tsx b/projects/app/src/pageComponents/account/team/GroupManage/GroupTransferOwnerModal.tsx similarity index 100% rename from projects/app/src/pages/account/team/components/GroupManage/GroupTransferOwnerModal.tsx rename to projects/app/src/pageComponents/account/team/GroupManage/GroupTransferOwnerModal.tsx diff --git a/projects/app/src/pages/account/team/components/GroupManage/index.tsx b/projects/app/src/pageComponents/account/team/GroupManage/index.tsx similarity index 89% rename from projects/app/src/pages/account/team/components/GroupManage/index.tsx rename to projects/app/src/pageComponents/account/team/GroupManage/index.tsx index ba25e90b6..bd568d815 100644 --- a/projects/app/src/pages/account/team/components/GroupManage/index.tsx +++ b/projects/app/src/pageComponents/account/team/GroupManage/index.tsx @@ -24,50 +24,43 @@ import { useUserStore } from '@/web/support/user/useUserStore'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { deleteGroup } from '@/web/support/user/team/group/api'; import { DefaultGroupName } from '@fastgpt/global/support/user/team/group/constant'; -import MemberTag from '../../../../../components/support/user/team/Info/MemberTag'; +import MemberTag from '../../../../components/support/user/team/Info/MemberTag'; import MyTooltip from '@fastgpt/web/components/common/MyTooltip'; import dynamic from 'next/dynamic'; import { useState } from 'react'; import IconButton from '../OrgManage/IconButton'; +import { MemberGroupType } from '@fastgpt/global/support/permission/memberGroup/type'; const ChangeOwnerModal = dynamic(() => import('./GroupTransferOwnerModal')); const GroupInfoModal = dynamic(() => import('./GroupInfoModal')); -const ManageGroupMemberModal = dynamic(() => import('./GroupManageMember')); +const GroupManageMember = dynamic(() => import('./GroupManageMember')); function MemberTable({ Tabs }: { Tabs: React.ReactNode }) { const { t } = useTranslation(); const { userInfo } = useUserStore(); - const [editGroupId, setEditGroupId] = useState(); + const { groups, refetchGroups, members, refetchMembers } = useContextSelector( + TeamContext, + (v) => v + ); + + const [editGroup, setEditGroup] = useState(); const { isOpen: isOpenGroupInfo, onOpen: onOpenGroupInfo, onClose: onCloseGroupInfo } = useDisclosure(); - const { - isOpen: isOpenManageGroupMember, - onOpen: onOpenManageGroupMember, - onClose: onCloseManageGroupMember - } = useDisclosure(); - const onEditGroup = (groupId: string) => { - setEditGroupId(groupId); + + const onEditGroupInfo = (e: MemberGroupType) => { + setEditGroup(e); onOpenGroupInfo(); }; - const onManageMember = (groupId: string) => { - setEditGroupId(groupId); - onOpenManageGroupMember(); - }; const { ConfirmModal: ConfirmDeleteGroupModal, openConfirm: openDeleteGroupModal } = useConfirm({ type: 'delete', content: t('account_team:confirm_delete_group') }); - const { groups, refetchGroups, members, refetchMembers } = useContextSelector( - TeamContext, - (v) => v - ); - const { runAsync: delDeleteGroup } = useRequest2(deleteGroup, { onSuccess: () => { refetchGroups(); @@ -75,12 +68,21 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) { } }); + const { + isOpen: isOpenManageGroupMember, + onOpen: onOpenManageGroupMember, + onClose: onCloseManageGroupMember + } = useDisclosure(); + const onManageMember = (e: MemberGroupType) => { + setEditGroup(e); + onOpenManageGroupMember(); + }; + const hasGroupManagePer = (group: (typeof groups)[0]) => userInfo?.team.permission.hasManagePer || ['admin', 'owner'].includes( group.members.find((item) => item.tmbId === userInfo?.team.tmbId)?.role ?? '' ); - const isGroupOwner = (group: (typeof groups)[0]) => userInfo?.team.permission.hasManagePer || group.members.find((item) => item.role === 'owner')?.tmbId === userInfo?.team.tmbId; @@ -90,8 +92,8 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) { onOpen: onOpenChangeOwner, onClose: onCloseChangeOwner } = useDisclosure(); - const onChangeOwner = (groupId: string) => { - setEditGroupId(groupId); + const onChangeOwner = (e: MemberGroupType) => { + setEditGroup(e); onOpenChangeOwner(); }; @@ -173,7 +175,7 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) { v.avatar)} groupId={group._id} /> ) : hasGroupManagePer(group) ? ( - onManageMember(group._id)}> + onManageMember(group)}> members.find((m) => m.tmbId === v.tmbId)?.avatar ?? '' @@ -202,14 +204,14 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) { label: t('account_team:edit_info'), icon: 'edit', onClick: () => { - onEditGroup(group._id); + onEditGroupInfo(group); } }, { label: t('account_team:manage_member'), icon: 'support/team/group', onClick: () => { - onManageMember(group._id); + onManageMember(group); } }, ...(isGroupOwner(group) @@ -218,7 +220,7 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) { label: t('account_team:transfer_ownership'), icon: 'modal/changePer', onClick: () => { - onChangeOwner(group._id); + onChangeOwner(group); }, type: 'primary' as MenuItemType }, @@ -246,25 +248,25 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) { - {isOpenChangeOwner && editGroupId && ( - + {isOpenChangeOwner && editGroup && ( + )} {isOpenGroupInfo && ( { onCloseGroupInfo(); - setEditGroupId(undefined); + setEditGroup(undefined); }} - editGroupId={editGroupId} + editGroupId={editGroup?._id} /> )} - {isOpenManageGroupMember && ( - { onCloseManageGroupMember(); - setEditGroupId(undefined); + setEditGroup(undefined); }} - editGroupId={editGroupId} + editGroupId={editGroup._id} /> )} diff --git a/projects/app/src/pages/account/team/components/InviteModal.tsx b/projects/app/src/pageComponents/account/team/InviteModal.tsx similarity index 100% rename from projects/app/src/pages/account/team/components/InviteModal.tsx rename to projects/app/src/pageComponents/account/team/InviteModal.tsx diff --git a/projects/app/src/pages/account/team/components/MemberTable.tsx b/projects/app/src/pageComponents/account/team/MemberTable.tsx similarity index 53% rename from projects/app/src/pages/account/team/components/MemberTable.tsx rename to projects/app/src/pageComponents/account/team/MemberTable.tsx index 08b9af2bc..05eabd09b 100644 --- a/projects/app/src/pages/account/team/components/MemberTable.tsx +++ b/projects/app/src/pageComponents/account/team/MemberTable.tsx @@ -13,7 +13,6 @@ import { Tr, useDisclosure } from '@chakra-ui/react'; -import { TeamMemberRoleEnum } from '@fastgpt/global/support/user/team/constant'; import { useTranslation } from 'next-i18next'; import { useUserStore } from '@/web/support/user/useUserStore'; import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; @@ -30,6 +29,9 @@ import { useToast } from '@fastgpt/web/hooks/useToast'; import { TeamErrEnum } from '@fastgpt/global/common/error/code/team'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { delLeaveTeam } from '@/web/support/user/team/api'; +import { postSyncMembers } from '@/web/support/user/api'; +import MyLoading from '@fastgpt/web/components/common/MyLoading'; +import { TeamMemberRoleEnum } from '@fastgpt/global/support/user/team/constant'; const InviteModal = dynamic(() => import('./InviteModal')); const TeamTagModal = dynamic(() => import('@/components/support/user/team/TeamTagModal')); @@ -40,8 +42,16 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) { const { userInfo, teamPlanStatus } = useUserStore(); const { feConfigs, setNotSufficientModalType } = useSystemStore(); - const { groups, refetchGroups, myTeams, refetchTeams, members, refetchMembers, onSwitchTeam } = - useContextSelector(TeamContext, (v) => v); + const { + groups, + refetchGroups, + myTeams, + refetchTeams, + members, + refetchMembers, + onSwitchTeam, + MemberScrollData + } = useContextSelector(TeamContext, (v) => v); const { isOpen: isOpenTeamTagsAsync, @@ -54,6 +64,8 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) { type: 'delete' }); + const isSyncMember = feConfigs.register_method?.includes('sync'); + const { runAsync: onLeaveTeam } = useRequest2( async () => { const defaultTeam = myTeams.find((item) => item.defaultTeam) || myTeams[0]; @@ -72,8 +84,17 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) { content: t('account_team:confirm_leave_team') }); + const { runAsync: onSyncMember, loading: isSyncing } = useRequest2(postSyncMembers, { + onSuccess() { + refetchMembers(); + }, + successToast: t('account_team:sync_member_success'), + errorToast: t('account_team:sync_member_failed') + }); + return ( <> + {isSyncing && } {Tabs} @@ -91,7 +112,21 @@ function MemberTable({ Tabs }: { Tabs: React.ReactNode }) { {t('account_team:label_sync')} )} - {userInfo?.team.permission.hasManagePer && ( + {userInfo?.team.permission.hasManagePer && isSyncMember && ( + + )} + {userInfo?.team.permission.hasManagePer && !isSyncMember && ( diff --git a/projects/app/src/pages/account/team/components/OrgManage/OrgMoveModal.tsx b/projects/app/src/pageComponents/account/team/OrgManage/OrgMoveModal.tsx similarity index 100% rename from projects/app/src/pages/account/team/components/OrgManage/OrgMoveModal.tsx rename to projects/app/src/pageComponents/account/team/OrgManage/OrgMoveModal.tsx diff --git a/projects/app/src/pages/account/team/components/OrgManage/OrgTree.tsx b/projects/app/src/pageComponents/account/team/OrgManage/OrgTree.tsx similarity index 100% rename from projects/app/src/pages/account/team/components/OrgManage/OrgTree.tsx rename to projects/app/src/pageComponents/account/team/OrgManage/OrgTree.tsx diff --git a/projects/app/src/pageComponents/account/team/OrgManage/index.tsx b/projects/app/src/pageComponents/account/team/OrgManage/index.tsx new file mode 100644 index 000000000..ddc080ba5 --- /dev/null +++ b/projects/app/src/pageComponents/account/team/OrgManage/index.tsx @@ -0,0 +1,369 @@ +import { useUserStore } from '@/web/support/user/useUserStore'; +import { + Box, + Divider, + Flex, + HStack, + Table, + TableContainer, + Tag, + Tbody, + Td, + Th, + Thead, + Tr, + VStack +} from '@chakra-ui/react'; +import type { OrgType } from '@fastgpt/global/support/user/team/org/type'; +import Avatar from '@fastgpt/web/components/common/Avatar'; +import MyIcon from '@fastgpt/web/components/common/Icon'; +import type { IconNameType } from '@fastgpt/web/components/common/Icon/type'; +import MyMenu from '@fastgpt/web/components/common/MyMenu'; +import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; +import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; +import { useTranslation } from 'next-i18next'; +import { useMemo, useState } from 'react'; +import { useContextSelector } from 'use-context-selector'; +import MemberTag from '@/components/support/user/team/Info/MemberTag'; +import { TeamContext } from '../context'; +import { deleteOrg, deleteOrgMember, getOrgList } from '@/web/support/user/team/org/api'; + +import IconButton from './IconButton'; +import { defaultOrgForm, type OrgFormType } from './OrgInfoModal'; + +import dynamic from 'next/dynamic'; +import MyBox from '@fastgpt/web/components/common/MyBox'; +import Path from '@/components/common/folder/Path'; +import { ParentTreePathItemType } from '@fastgpt/global/common/parentFolder/type'; +import { getOrgChildrenPath } from '@fastgpt/global/support/user/team/org/constant'; +import { useSystemStore } from '@/web/common/system/useSystemStore'; + +const OrgInfoModal = dynamic(() => import('./OrgInfoModal')); +const OrgMemberManageModal = dynamic(() => import('./OrgMemberManageModal')); +const OrgMoveModal = dynamic(() => import('./OrgMoveModal')); + +function ActionButton({ + icon, + text, + onClick +}: { + icon: IconNameType; + text: string; + onClick: () => void; +}) { + return ( + + + {text} + + ); +} + +function OrgTable({ Tabs }: { Tabs: React.ReactNode }) { + const { t } = useTranslation(); + const { userInfo, isTeamAdmin } = useUserStore(); + + const { members, MemberScrollData } = useContextSelector(TeamContext, (v) => v); + const { feConfigs } = useSystemStore(); + + const isSyncMember = feConfigs.register_method?.includes('sync'); + const [parentPath, setParentPath] = useState(''); + const { + data: orgs = [], + loading: isLoadingOrgs, + refresh: refetchOrgs + } = useRequest2(getOrgList, { + manual: false, + refreshDeps: [userInfo?.team?.teamId] + }); + const currentOrgs = useMemo(() => { + if (orgs.length === 0) return []; + // Auto select the first org(root org is team) + if (parentPath === '') { + setParentPath(getOrgChildrenPath(orgs[0])); + return []; + } + + return orgs + .filter((org) => org.path === parentPath) + .map((item) => { + return { + ...item, + // Member + org + count: + item.members.length + orgs.filter((org) => org.path === getOrgChildrenPath(item)).length + }; + }); + }, [orgs, parentPath]); + const currentOrg = useMemo(() => { + const splitPath = parentPath.split('/'); + const currentOrgId = splitPath[splitPath.length - 1]; + if (!currentOrgId) return; + + return orgs.find((org) => org.pathId === currentOrgId); + }, [orgs, parentPath]); + + const paths = useMemo(() => { + const splitPath = parentPath.split('/').filter(Boolean); + return splitPath + .map((id) => { + const org = orgs.find((org) => org.pathId === id)!; + + if (org.path === '') return; + + return { + parentId: getOrgChildrenPath(org), + parentName: org.name + }; + }) + .filter(Boolean) as ParentTreePathItemType[]; + }, [parentPath, orgs]); + + const [editOrg, setEditOrg] = useState(); + const [manageMemberOrg, setManageMemberOrg] = useState(); + const [movingOrg, setMovingOrg] = useState(); + + // Delete org + const { ConfirmModal: ConfirmDeleteOrgModal, openConfirm: openDeleteOrgModal } = useConfirm({ + type: 'delete', + content: t('account_team:confirm_delete_org') + }); + const deleteOrgHandler = (orgId: string) => openDeleteOrgModal(() => deleteOrgReq(orgId))(); + const { runAsync: deleteOrgReq } = useRequest2(deleteOrg, { + onSuccess: () => { + refetchOrgs(); + } + }); + + // Delete member + const { ConfirmModal: ConfirmDeleteMember, openConfirm: openDeleteMemberModal } = useConfirm({ + type: 'delete', + content: t('account_team:confirm_delete_member') + }); + const { runAsync: deleteMemberReq } = useRequest2(deleteOrgMember, { + onSuccess: () => { + refetchOrgs(); + } + }); + + return ( + <> + + {Tabs} + + + + + + + + {/* Table */} + + + + + + {!isSyncMember && ( + + )} + + + + {currentOrgs.map((org) => ( + + + {isTeamAdmin && !isSyncMember && ( + + )} + + ))} + {currentOrg?.members.map((member) => { + const memberInfo = members.find((m) => m.tmbId === member.tmbId); + if (!memberInfo) return null; + + return ( + + + + + ); + })} + +
+ {t('common:Name')} + + {t('common:common.Action')} +
+ setParentPath(getOrgChildrenPath(org))} + > + + {org.count} + + + + } + menuList={[ + { + children: [ + { + icon: 'edit', + label: t('account_team:edit_info'), + onClick: () => setEditOrg(org) + }, + { + icon: 'common/file/move', + label: t('common:Move'), + onClick: () => setMovingOrg(org) + }, + { + icon: 'delete', + label: t('account_team:delete'), + type: 'danger', + onClick: () => deleteOrgHandler(org._id) + } + ] + } + ]} + /> +
+ + + {isTeamAdmin && !isSyncMember && ( + } + menuList={[ + { + children: [ + { + icon: 'delete', + label: t('account_team:delete'), + type: 'danger', + onClick: () => + openDeleteMemberModal(() => + deleteMemberReq(currentOrg._id, member.tmbId) + )() + } + ] + } + ]} + /> + )} +
+
+
+ + {/* Slider */} + {!isSyncMember && ( + + + + + {currentOrg?.name} + + {currentOrg?.path !== '' && ( + setEditOrg(currentOrg)} /> + )} + + {currentOrg?.description || t('common:common.no_intro')} + + + + + {t('common:common.Action')} + + {currentOrg && isTeamAdmin && ( + + { + setEditOrg({ + ...defaultOrgForm, + parentId: currentOrg?._id + }); + }} + /> + setManageMemberOrg(currentOrg)} + /> + {currentOrg?.path !== '' && ( + <> + setMovingOrg(currentOrg)} + /> + deleteOrgHandler(currentOrg._id)} + /> + + )} + + )} + + )} +
+
+ + {!!editOrg && ( + setEditOrg(undefined)} + onSuccess={refetchOrgs} + /> + )} + {!!movingOrg && ( + setMovingOrg(undefined)} + onSuccess={refetchOrgs} + /> + )} + {!!manageMemberOrg && ( + setManageMemberOrg(undefined)} + /> + )} + + + + + ); +} + +export default OrgTable; diff --git a/projects/app/src/pages/account/team/components/PermissionManage/index.tsx b/projects/app/src/pageComponents/account/team/PermissionManage/index.tsx similarity index 99% rename from projects/app/src/pages/account/team/components/PermissionManage/index.tsx rename to projects/app/src/pageComponents/account/team/PermissionManage/index.tsx index 4cf9860d4..b2228a3c3 100644 --- a/projects/app/src/pages/account/team/components/PermissionManage/index.tsx +++ b/projects/app/src/pageComponents/account/team/PermissionManage/index.tsx @@ -24,7 +24,7 @@ import { import { useUserStore } from '@/web/support/user/useUserStore'; import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; import Avatar from '@fastgpt/web/components/common/Avatar'; -import MemberTag from '../../../../../components/support/user/team/Info/MemberTag'; +import MemberTag from '../../../../components/support/user/team/Info/MemberTag'; import { DefaultGroupName } from '@fastgpt/global/support/user/team/group/constant'; import { TeamManagePermissionVal, diff --git a/projects/app/src/pages/account/team/components/SelectMember.tsx b/projects/app/src/pageComponents/account/team/SelectMember.tsx similarity index 100% rename from projects/app/src/pages/account/team/components/SelectMember.tsx rename to projects/app/src/pageComponents/account/team/SelectMember.tsx diff --git a/projects/app/src/pages/account/team/components/context.tsx b/projects/app/src/pageComponents/account/team/context.tsx similarity index 86% rename from projects/app/src/pages/account/team/components/context.tsx rename to projects/app/src/pageComponents/account/team/context.tsx index b76ed99c3..c4fd1ad05 100644 --- a/projects/app/src/pages/account/team/components/context.tsx +++ b/projects/app/src/pageComponents/account/team/context.tsx @@ -2,7 +2,7 @@ import React, { ReactNode, useState } from 'react'; import { createContext } from 'use-context-selector'; import type { EditTeamFormDataType } from './EditInfoModal'; import dynamic from 'next/dynamic'; -import { getTeamList, putSwitchTeam } from '@/web/support/user/team/api'; +import { getTeamList, getTeamMembers, putSwitchTeam } from '@/web/support/user/team/api'; import { TeamMemberStatusEnum } from '@fastgpt/global/support/user/team/constant'; import { useUserStore } from '@/web/support/user/useUserStore'; import type { TeamTmbItemType, TeamMemberItemType } from '@fastgpt/global/support/user/team/type'; @@ -10,7 +10,7 @@ import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { useTranslation } from 'next-i18next'; import { getGroupList } from '@/web/support/user/team/group/api'; import { MemberGroupListType } from '@fastgpt/global/support/permission/memberGroup/type'; -import { OrgType } from '@fastgpt/global/support/user/team/org/type'; +import { useScrollPagination } from '@fastgpt/web/hooks/useScrollPagination'; const EditInfoModal = dynamic(() => import('./EditInfoModal')); @@ -26,6 +26,7 @@ type TeamModalContextType = { refetchTeams: () => void; refetchGroups: () => void; teamSize: number; + MemberScrollData: ReturnType['ScrollData']; }; export const TeamContext = createContext({ @@ -49,13 +50,14 @@ export const TeamContext = createContext({ throw new Error('Function not implemented.'); }, - teamSize: 0 + teamSize: 0, + MemberScrollData: () => <> }); export const TeamModalContextProvider = ({ children }: { children: ReactNode }) => { const { t } = useTranslation(); const [editTeamData, setEditTeamData] = useState(); - const { userInfo, initUserInfo, loadAndGetTeamMembers } = useUserStore(); + const { userInfo, initUserInfo } = useUserStore(); const { data: myTeams = [], @@ -69,18 +71,11 @@ export const TeamModalContextProvider = ({ children }: { children: ReactNode }) // member action const { data: members = [], - runAsync: refetchMembers, - loading: loadingMembers - } = useRequest2( - () => { - if (!userInfo?.team?.teamId) return Promise.resolve([]); - return loadAndGetTeamMembers(true); - }, - { - manual: false, - refreshDeps: [userInfo?.team?.teamId] - } - ); + isLoading: loadingMembers, + refreshList: refetchMembers, + total: memberTotal, + ScrollData: MemberScrollData + } = useScrollPagination(getTeamMembers, {}); const { runAsync: onSwitchTeam, loading: isSwitchingTeam } = useRequest2( async (teamId: string) => { @@ -115,7 +110,8 @@ export const TeamModalContextProvider = ({ children }: { children: ReactNode }) refetchMembers, groups, refetchGroups, - teamSize: members.length + teamSize: memberTotal, + MemberScrollData }; return ( diff --git a/projects/app/src/pages/account/bill/components/BillTable.tsx b/projects/app/src/pages/account/bill/components/BillTable.tsx index 08c744692..228de85cb 100644 --- a/projects/app/src/pages/account/bill/components/BillTable.tsx +++ b/projects/app/src/pages/account/bill/components/BillTable.tsx @@ -1,4 +1,4 @@ -import React, { useState, useCallback, useMemo, useEffect } from 'react'; +import React, { useState, useMemo, useEffect } from 'react'; import { Button, Table, @@ -25,7 +25,6 @@ import { billStatusMap, billTypeMap } from '@fastgpt/global/support/wallet/bill/constants'; -// import { usePagination } from '@/web/common/hooks/usePagination'; import MyBox from '@fastgpt/web/components/common/MyBox'; import { useRequest } from '@fastgpt/web/hooks/useRequest'; import { standardSubLevelMap, subModeMap } from '@fastgpt/global/support/wallet/sub/constants'; @@ -33,25 +32,23 @@ import MySelect from '@fastgpt/web/components/common/MySelect'; import MyModal from '@fastgpt/web/components/common/MyModal'; import { usePagination } from '@fastgpt/web/hooks/usePagination'; import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel'; -import { useI18n } from '@/web/context/I18n'; const BillTable = () => { const { t } = useTranslation(); - const { commonT } = useI18n(); const { toast } = useToast(); - const [billType, setBillType] = useState(''); + const [billType, setBillType] = useState(undefined); const [billDetail, setBillDetail] = useState(); const billTypeList = useMemo( () => [ - { label: t('account_bill:all'), value: '' }, + { label: t('account_bill:all'), value: undefined }, ...Object.entries(billTypeMap).map(([key, value]) => ({ label: t(value.label as any), value: key })) ] as { label: string; - value: BillTypeEnum | ''; + value: BillTypeEnum | undefined; }[], [t] ); @@ -62,8 +59,7 @@ const BillTable = () => { Pagination, getData, total - } = usePagination({ - api: getBills, + } = usePagination(getBills, { pageSize: 20, params: { type: billType @@ -110,7 +106,7 @@ const BillTable = () => { # - + void }) { const { t } = useTranslation(); - const { commonT } = useI18n(); return ( { isLoading, Pagination, total - } = usePagination({ - api: getInvoiceRecords, + } = usePagination(getInvoiceRecords, { pageSize: 20 }); diff --git a/projects/app/src/pages/account/info/index.tsx b/projects/app/src/pages/account/info/index.tsx index 48c71cc31..1adbff216 100644 --- a/projects/app/src/pages/account/info/index.tsx +++ b/projects/app/src/pages/account/info/index.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useMemo, useRef } from 'react'; +import React, { useCallback, useMemo } from 'react'; import { Box, Flex, @@ -160,6 +160,7 @@ const MyInfo = ({ onOpenContact }: { onOpenContact: () => void }) => { color: 'myGray.900' }; + const isSyncMember = feConfigs.register_method?.includes('sync'); return ( {/* user info */} @@ -224,6 +225,7 @@ const MyInfo = ({ onOpenContact }: { onOpenContact: () => void }) => { {t('account_info:member_name')}:  void }) => { const { feConfigs } = useSystemStore(); const { t } = useTranslation(); const { isPc } = useSystem(); - const { userInfo, updateUserInfo } = useUserStore(); - - const { reset } = useForm({ - defaultValues: userInfo as UserType - }); return ( diff --git a/projects/app/src/pages/account/inform.tsx b/projects/app/src/pages/account/inform.tsx index 176abe602..d0612c338 100644 --- a/projects/app/src/pages/account/inform.tsx +++ b/projects/app/src/pages/account/inform.tsx @@ -1,13 +1,12 @@ import React from 'react'; import { Box, Button, Flex, useTheme } from '@chakra-ui/react'; import { getInforms, readInform } from '@/web/support/user/inform/api'; -import type { UserInformSchema } from '@fastgpt/global/support/user/inform/type'; import { formatTimeToChatTime } from '@fastgpt/global/common/string/time'; import { usePagination } from '@fastgpt/web/hooks/usePagination'; import { useLoading } from '@fastgpt/web/hooks/useLoading'; import { useTranslation } from 'next-i18next'; import EmptyTip from '@fastgpt/web/components/common/EmptyTip'; -import AccountContainer, { TabEnum } from './components/AccountContainer'; +import AccountContainer from './components/AccountContainer'; import { serviceSideProps } from '@fastgpt/web/common/system/nextjs'; const InformTable = () => { @@ -23,8 +22,7 @@ const InformTable = () => { Pagination, getData, pageNum - } = usePagination({ - api: getInforms, + } = usePagination(getInforms, { pageSize: 20 }); diff --git a/projects/app/src/pages/account/promotion.tsx b/projects/app/src/pages/account/promotion.tsx index be9ed529d..5da3e0b48 100644 --- a/projects/app/src/pages/account/promotion.tsx +++ b/projects/app/src/pages/account/promotion.tsx @@ -25,7 +25,7 @@ import { usePagination } from '@fastgpt/web/hooks/usePagination'; import { useLoading } from '@fastgpt/web/hooks/useLoading'; import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; import EmptyTip from '@fastgpt/web/components/common/EmptyTip'; -import AccountContainer, { TabEnum } from './components/AccountContainer'; +import AccountContainer from './components/AccountContainer'; import { serviceSideProps } from '@fastgpt/web/common/system/nextjs'; const Promotion = () => { @@ -41,8 +41,7 @@ const Promotion = () => { total, pageSize, Pagination - } = usePagination({ - api: getPromotionRecords, + } = usePagination(getPromotionRecords, { pageSize: 20 }); diff --git a/projects/app/src/pages/account/team/components/OrgManage/index.tsx b/projects/app/src/pages/account/team/components/OrgManage/index.tsx deleted file mode 100644 index 241fc1aee..000000000 --- a/projects/app/src/pages/account/team/components/OrgManage/index.tsx +++ /dev/null @@ -1,354 +0,0 @@ -import { deleteOrg, deleteOrgMember } from '@/web/support/user/team/org/api'; -import { useUserStore } from '@/web/support/user/useUserStore'; -import { - Box, - Divider, - Flex, - HStack, - Table, - TableContainer, - Tag, - Tbody, - Td, - Th, - Thead, - Tr, - VStack -} from '@chakra-ui/react'; -import type { OrgType } from '@fastgpt/global/support/user/team/org/type'; -import Avatar from '@fastgpt/web/components/common/Avatar'; -import MyIcon from '@fastgpt/web/components/common/Icon'; -import type { IconNameType } from '@fastgpt/web/components/common/Icon/type'; -import MyMenu from '@fastgpt/web/components/common/MyMenu'; -import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; -import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; -import { useTranslation } from 'next-i18next'; -import { useMemo, useState } from 'react'; -import { useContextSelector } from 'use-context-selector'; -import MemberTag from '@/components/support/user/team/Info/MemberTag'; -import { TeamContext } from '../context'; -import { getOrgList } from '@/web/support/user/team/org/api'; - -import IconButton from './IconButton'; -import { defaultOrgForm, type OrgFormType } from './OrgInfoModal'; - -import dynamic from 'next/dynamic'; -import MyBox from '@fastgpt/web/components/common/MyBox'; -import Path from '@/components/common/folder/Path'; -import { ParentTreePathItemType } from '@fastgpt/global/common/parentFolder/type'; -import { getOrgChildrenPath } from '@fastgpt/global/support/user/team/org/constant'; - -const OrgInfoModal = dynamic(() => import('./OrgInfoModal')); -const OrgMemberManageModal = dynamic(() => import('./OrgMemberManageModal')); -const OrgMoveModal = dynamic(() => import('./OrgMoveModal')); - -function ActionButton({ - icon, - text, - onClick -}: { - icon: IconNameType; - text: string; - onClick: () => void; -}) { - return ( - - - {text} - - ); -} - -function OrgTable({ Tabs }: { Tabs: React.ReactNode }) { - const { t } = useTranslation(); - const { userInfo, isTeamAdmin } = useUserStore(); - - const { members } = useContextSelector(TeamContext, (v) => v); - - const [parentPath, setParentPath] = useState(''); - const { - data: orgs = [], - loading: isLoadingOrgs, - refresh: refetchOrgs - } = useRequest2(getOrgList, { - manual: false, - refreshDeps: [userInfo?.team?.teamId] - }); - const currentOrgs = useMemo(() => { - if (orgs.length === 0) return []; - // Auto select the first org(root org is team) - if (parentPath === '') { - setParentPath(getOrgChildrenPath(orgs[0])); - return []; - } - - return orgs - .filter((org) => org.path === parentPath) - .map((item) => { - return { - ...item, - // Member + org - count: - item.members.length + orgs.filter((org) => org.path === getOrgChildrenPath(item)).length - }; - }); - }, [orgs, parentPath]); - const currentOrg = useMemo(() => { - const splitPath = parentPath.split('/'); - const currentOrgId = splitPath[splitPath.length - 1]; - if (!currentOrgId) return; - - return orgs.find((org) => org.pathId === currentOrgId); - }, [orgs, parentPath]); - - const paths = useMemo(() => { - const splitPath = parentPath.split('/').filter(Boolean); - return splitPath - .map((id) => { - const org = orgs.find((org) => org.pathId === id)!; - - if (org.path === '') return; - - return { - parentId: getOrgChildrenPath(org), - parentName: org.name - }; - }) - .filter(Boolean) as ParentTreePathItemType[]; - }, [parentPath, orgs]); - - const [editOrg, setEditOrg] = useState(); - const [manageMemberOrg, setManageMemberOrg] = useState(); - const [movingOrg, setMovingOrg] = useState(); - - // Delete org - const { ConfirmModal: ConfirmDeleteOrgModal, openConfirm: openDeleteOrgModal } = useConfirm({ - type: 'delete', - content: t('account_team:confirm_delete_org') - }); - const deleteOrgHandler = (orgId: string) => openDeleteOrgModal(() => deleteOrgReq(orgId))(); - const { runAsync: deleteOrgReq } = useRequest2(deleteOrg, { - onSuccess: () => { - refetchOrgs(); - } - }); - - // Delete member - const { ConfirmModal: ConfirmDeleteMember, openConfirm: openDeleteMemberModal } = useConfirm({ - type: 'delete', - content: t('account_team:confirm_delete_member') - }); - const { runAsync: deleteMemberReq } = useRequest2(deleteOrgMember, { - onSuccess: () => { - refetchOrgs(); - } - }); - - return ( - <> - - {Tabs} - - - - - - - {/* Table */} - - - - - - - - - - {currentOrgs.map((org) => ( - - - - - ))} - {currentOrg?.members.map((member) => { - const memberInfo = members.find((m) => m.tmbId === member.tmbId); - if (!memberInfo) return null; - - return ( - - - - - ); - })} - -
- {t('common:Name')} - - {t('common:common.Action')} -
- setParentPath(getOrgChildrenPath(org))} - > - - {org.count} - - - - {isTeamAdmin && ( - } - menuList={[ - { - children: [ - { - icon: 'edit', - label: t('account_team:edit_info'), - onClick: () => setEditOrg(org) - }, - { - icon: 'common/file/move', - label: t('common:Move'), - onClick: () => setMovingOrg(org) - }, - { - icon: 'delete', - label: t('account_team:delete'), - type: 'danger', - onClick: () => deleteOrgHandler(org._id) - } - ] - } - ]} - /> - )} -
- - - {isTeamAdmin && ( - } - menuList={[ - { - children: [ - { - icon: 'delete', - label: t('account_team:delete'), - type: 'danger', - onClick: () => - openDeleteMemberModal(() => - deleteMemberReq(currentOrg._id, member.tmbId) - )() - } - ] - } - ]} - /> - )} -
-
- {/* Slider */} - - - - - {currentOrg?.name} - - {currentOrg?.path !== '' && ( - setEditOrg(currentOrg)} /> - )} - - {currentOrg?.description || t('common:common.no_intro')} - - - - - {t('common:common.Action')} - - {currentOrg && isTeamAdmin && ( - - { - setEditOrg({ - ...defaultOrgForm, - parentId: currentOrg?._id - }); - }} - /> - setManageMemberOrg(currentOrg)} - /> - {currentOrg?.path !== '' && ( - <> - setMovingOrg(currentOrg)} - /> - deleteOrgHandler(currentOrg._id)} - /> - - )} - - )} - -
- - {!!editOrg && ( - setEditOrg(undefined)} - onSuccess={refetchOrgs} - /> - )} - {!!movingOrg && ( - setMovingOrg(undefined)} - onSuccess={refetchOrgs} - /> - )} - {!!manageMemberOrg && ( - setManageMemberOrg(undefined)} - /> - )} - - - -
- - ); -} - -export default OrgTable; diff --git a/projects/app/src/pages/account/team/index.tsx b/projects/app/src/pages/account/team/index.tsx index f7ec577d6..f8e41ef21 100644 --- a/projects/app/src/pages/account/team/index.tsx +++ b/projects/app/src/pages/account/team/index.tsx @@ -1,6 +1,6 @@ import { serviceSideProps } from '@fastgpt/web/common/system/nextjs'; import AccountContainer from '../components/AccountContainer'; -import { Box, Flex, useDisclosure } from '@chakra-ui/react'; +import { Box, Flex } from '@chakra-ui/react'; import Icon from '@fastgpt/web/components/common/Icon'; import { useTranslation } from 'next-i18next'; import TeamSelector from '../components/TeamSelector'; @@ -11,14 +11,15 @@ import { useRouter } from 'next/router'; import FillRowTabs from '@fastgpt/web/components/common/Tabs/FillRowTabs'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { TeamMemberRoleEnum } from '@fastgpt/global/support/user/team/constant'; -import { TeamContext, TeamModalContextProvider } from './components/context'; +import { TeamContext, TeamModalContextProvider } from '@/pageComponents/account/team/context'; import dynamic from 'next/dynamic'; -import MemberTable from './components/MemberTable'; -const PermissionManage = dynamic(() => import('./components/PermissionManage/index')); -const GroupManage = dynamic(() => import('./components/GroupManage/index')); - -const OrgManage = dynamic(() => import('./components/OrgManage/index')); +const MemberTable = dynamic(() => import('@/pageComponents/account/team/MemberTable')); +const PermissionManage = dynamic( + () => import('@/pageComponents/account/team/PermissionManage/index') +); +const GroupManage = dynamic(() => import('@/pageComponents/account/team/GroupManage/index')); +const OrgManage = dynamic(() => import('@/pageComponents/account/team/OrgManage/index')); export enum TeamTabEnum { member = 'member', @@ -34,7 +35,7 @@ const Team = () => { const { t } = useTranslation(); const { userInfo } = useUserStore(); - const { setEditTeamData, teamSize, isLoading } = useContextSelector(TeamContext, (v) => v); + const { setEditTeamData, isLoading, teamSize } = useContextSelector(TeamContext, (v) => v); const Tabs = useMemo( () => ( @@ -62,72 +63,81 @@ const Team = () => { return ( - {/* header */} - - - - - - {t('account:team')} - - - - - - {userInfo?.team?.role === TeamMemberRoleEnum.owner && ( - - { - if (!userInfo?.team) return; - setEditTeamData({ - id: userInfo.team.teamId, - name: userInfo.team.teamName, - avatar: userInfo.team.avatar - }); - }} - /> + + {/* header */} + + + + + + {t('account:team')} + - )} + + + + {userInfo?.team?.role === TeamMemberRoleEnum.owner && ( + + { + if (!userInfo?.team) return; + setEditTeamData({ + id: userInfo.team.teamId, + name: userInfo.team.teamName, + avatar: userInfo.team.avatar + }); + }} + /> + + )} + + + + {t('account_team:total_team_members', { amount: teamSize })} + + {/* table */} - {t('account_team:total_team_members', { amount: teamSize })} + {teamTab === TeamTabEnum.member && } + {teamTab === TeamTabEnum.org && } + {teamTab === TeamTabEnum.group && } + {teamTab === TeamTabEnum.permission && } - - {/* table */} - - {teamTab === TeamTabEnum.member && } - {teamTab === TeamTabEnum.org && } - {teamTab === TeamTabEnum.group && } - {teamTab === TeamTabEnum.permission && } - ); }; diff --git a/projects/app/src/pages/account/usage/index.tsx b/projects/app/src/pages/account/usage/index.tsx index 649b4448a..8db661730 100644 --- a/projects/app/src/pages/account/usage/index.tsx +++ b/projects/app/src/pages/account/usage/index.tsx @@ -23,15 +23,16 @@ import DateRangePicker, { import { addDays } from 'date-fns'; import dynamic from 'next/dynamic'; import { useTranslation } from 'next-i18next'; -import { useQuery } from '@tanstack/react-query'; import { useUserStore } from '@/web/support/user/useUserStore'; import Avatar from '@fastgpt/web/components/common/Avatar'; import MySelect from '@fastgpt/web/components/common/MySelect'; import { formatNumber } from '@fastgpt/global/common/math/tools'; import EmptyTip from '@fastgpt/web/components/common/EmptyTip'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; -import AccountContainer, { TabEnum } from '../components/AccountContainer'; +import AccountContainer from '../components/AccountContainer'; import { serviceSideProps } from '@fastgpt/web/common/system/nextjs'; +import { useScrollPagination } from '@fastgpt/web/hooks/useScrollPagination'; +import { getTeamMembers } from '@/web/support/user/team/api'; const UsageDetail = dynamic(() => import('./UsageDetail')); @@ -44,7 +45,7 @@ const UsageTable = () => { }); const [usageSource, setUsageSource] = useState(''); const { isPc } = useSystem(); - const { userInfo, loadAndGetTeamMembers } = useUserStore(); + const { userInfo } = useUserStore(); const [usageDetail, setUsageDetail] = useState(); const sourceList = useMemo( @@ -63,10 +64,7 @@ const UsageTable = () => { ); const [selectTmbId, setSelectTmbId] = useState(userInfo?.team?.tmbId); - const { data: members = [] } = useQuery(['getMembers', userInfo?.team?.teamId], () => { - if (!userInfo?.team?.teamId) return []; - return loadAndGetTeamMembers(); - }); + const { data: members, ScrollData } = useScrollPagination(getTeamMembers, {}); const tmbList = useMemo( () => members.map((item) => ({ @@ -86,14 +84,13 @@ const UsageTable = () => { isLoading, Pagination, getData - } = usePagination({ - api: getUserUsages, + } = usePagination(getUserUsages, { pageSize: isPc ? 20 : 10, params: { dateStart: dateRange.from || new Date(), dateEnd: addDays(dateRange.to || new Date(), 1), - source: usageSource, - teamMemberId: selectTmbId + source: usageSource as UsageSourceEnum, + teamMemberId: selectTmbId ?? '' }, defaultRequest: false }); @@ -120,6 +117,7 @@ const UsageTable = () => { { } }; -const batchUpdateFields = async (batchSize = 2000) => { - // Update in batches - await MongoDatasetData.updateMany( - { initFullText: { $exists: true } }, - { - $unset: { - initFullText: 1, - fullTextToken: 1 - } - } - ); -}; +// const batchUpdateFields = async (batchSize = 2000) => { +// // Find documents that still have these fields +// const documents = await MongoDatasetData.find({ initFullText: { $exists: true } }, '_id') +// .limit(batchSize) +// .lean(); + +// if (documents.length === 0) return; + +// // Update in batches +// await MongoDatasetData.updateMany( +// { _id: { $in: documents.map((doc) => doc._id) } }, +// { +// $unset: { +// initFullText: 1 +// // fullTextToken: 1 +// } +// } +// ); + +// success += documents.length; +// console.log('Delete success:', success); +// await batchUpdateFields(batchSize); +// }; diff --git a/projects/app/src/pages/api/admin/initv4819.ts b/projects/app/src/pages/api/admin/initv4819.ts new file mode 100644 index 000000000..626fbdaa0 --- /dev/null +++ b/projects/app/src/pages/api/admin/initv4819.ts @@ -0,0 +1,55 @@ +import { NextAPI } from '@/service/middleware/entry'; +import { mongoSessionRun } from '@fastgpt/service/common/mongo/sessionRun'; +import { authCert } from '@fastgpt/service/support/permission/auth/common'; +import { MongoUser } from '@fastgpt/service/support/user/schema'; +import { MongoTeamMember } from '@fastgpt/service/support/user/team/teamMemberSchema'; +import { NextApiRequest, NextApiResponse } from 'next'; + +/* + 简单版迁移:直接升级到最新镜像,会去除 MongoDatasetData 里的索引。直接执行这个脚本。 + 无缝迁移: + 1. 移动 User 表中的 avatar 字段到 TeamMember 表中。 +*/ +async function handler(req: NextApiRequest, res: NextApiResponse) { + await authCert({ req, authRoot: true }); + await moveUserAvatar(); + return { success: true }; +} + +export default NextAPI(handler); + +const moveUserAvatar = async () => { + try { + const users = await MongoUser.find({}, '_id avatar'); + console.log('Total users:', users.length); + let success = 0; + for await (const user of users) { + // @ts-ignore + if (!user.avatar) continue; + try { + await mongoSessionRun(async (session) => { + await MongoTeamMember.updateOne( + { + userId: user._id + }, + { + $set: { + avatar: (user as any).avatar // 删除 avatar 字段, 因为 Type 改了,所以这里不能直接写 user.avatar + } + }, + { session } + ); + // @ts-ignore + user.avatar = undefined; + await user.save({ session }); + }); + success++; + console.log('Move avatar success:', success); + } catch (error) { + console.error(error); + } + } + } catch (error) { + console.error(error); + } +}; diff --git a/projects/app/src/pages/api/common/system/getInitData.ts b/projects/app/src/pages/api/common/system/getInitData.ts index 33cdb4437..85d6413c1 100644 --- a/projects/app/src/pages/api/common/system/getInitData.ts +++ b/projects/app/src/pages/api/common/system/getInitData.ts @@ -8,7 +8,8 @@ async function handler(req: ApiRequestProps<{}, { bufferId?: string }>, res: Nex // If bufferId is the same as the current bufferId, return directly if (bufferId && global.systemInitBufferId && global.systemInitBufferId === bufferId) { return { - bufferId: global.systemInitBufferId + bufferId: global.systemInitBufferId, + systemVersion: global.systemVersion || '0.0.0' }; } diff --git a/projects/app/src/pages/api/core/app/getChatLogs.ts b/projects/app/src/pages/api/core/app/getChatLogs.ts index e625e0262..566c44a2b 100644 --- a/projects/app/src/pages/api/core/app/getChatLogs.ts +++ b/projects/app/src/pages/api/core/app/getChatLogs.ts @@ -1,6 +1,5 @@ import type { NextApiRequest, NextApiResponse } from 'next'; import { MongoChat } from '@fastgpt/service/core/chat/chatSchema'; -import type { PagingData } from '@/types'; import { AppLogsListItemType } from '@/types/app'; import { Types } from '@fastgpt/service/common/mongo'; import { addDays } from 'date-fns'; @@ -10,19 +9,22 @@ import { ChatItemCollectionName } from '@fastgpt/service/core/chat/chatItemSchem import { NextAPI } from '@/service/middleware/entry'; import { WritePermissionVal } from '@fastgpt/global/support/permission/constant'; import { readFromSecondary } from '@fastgpt/service/common/mongo/utils'; +import { parsePaginationRequest } from '@fastgpt/service/common/api/pagination'; +import { PaginationResponse } from '@fastgpt/web/common/fetch/type'; +import { addSourceMember } from '@fastgpt/service/support/user/utils'; async function handler( req: NextApiRequest, _res: NextApiResponse -): Promise> { +): Promise> { const { - pageNum = 1, - pageSize = 20, appId, dateStart = addDays(new Date(), -7), dateEnd = new Date() } = req.body as GetAppChatLogsParams; + const { pageSize = 20, offset } = parsePaginationRequest(req); + if (!appId) { throw new Error('缺少参数'); } @@ -39,7 +41,7 @@ async function handler( } }; - const [data, total] = await Promise.all([ + const [list, total] = await Promise.all([ MongoChat.aggregate( [ { $match: where }, @@ -51,7 +53,7 @@ async function handler( updateTime: -1 } }, - { $skip: (pageNum - 1) * pageSize }, + { $skip: offset }, { $limit: pageSize }, { $lookup: { @@ -144,10 +146,14 @@ async function handler( MongoChat.countDocuments(where, { ...readFromSecondary }) ]); + const listWithSourceMember = await addSourceMember({ + list: list + }); + + const listWithoutTmbId = list.filter((item) => !item.tmbId); + return { - pageNum, - pageSize, - data, + list: listWithSourceMember.concat(listWithoutTmbId), total }; } diff --git a/projects/app/src/pages/api/core/app/list.ts b/projects/app/src/pages/api/core/app/list.ts index ee2b605e2..da515cd43 100644 --- a/projects/app/src/pages/api/core/app/list.ts +++ b/projects/app/src/pages/api/core/app/list.ts @@ -18,6 +18,7 @@ import { replaceRegChars } from '@fastgpt/global/common/string/tools'; import { concatPer } from '@fastgpt/service/support/permission/controller'; import { getGroupsByTmbId } from '@fastgpt/service/support/permission/memberGroup/controllers'; import { getOrgIdSetWithParentByTmbId } from '@fastgpt/service/support/permission/org/controllers'; +import { addSourceMember } from '@fastgpt/service/support/user/utils'; export type ListAppBody = { parentId?: ParentIdType; @@ -201,19 +202,9 @@ async function handler(req: ApiRequestProps): Promise app.permission.hasReadPer); - return formatApps.map((app) => ({ - _id: app._id, - tmbId: app.tmbId, - avatar: app.avatar, - type: app.type, - name: app.name, - intro: app.intro, - updateTime: app.updateTime, - permission: app.permission, - pluginData: app.pluginData, - inheritPermission: app.inheritPermission ?? true, - private: app.privateApp - })); + return addSourceMember({ + list: formatApps + }); } export default NextAPI(handler); diff --git a/projects/app/src/pages/api/core/app/version/list.ts b/projects/app/src/pages/api/core/app/version/list.ts index b0337c33e..c03971d30 100644 --- a/projects/app/src/pages/api/core/app/version/list.ts +++ b/projects/app/src/pages/api/core/app/version/list.ts @@ -6,6 +6,8 @@ import { ApiRequestProps } from '@fastgpt/service/type/next'; import { authApp } from '@fastgpt/service/support/permission/app/auth'; import { WritePermissionVal } from '@fastgpt/global/support/permission/constant'; import { VersionListItemType } from '@fastgpt/global/core/app/version'; +import { parsePaginationRequest } from '@fastgpt/service/common/api/pagination'; +import { addSourceMember } from '@fastgpt/service/support/user/utils'; export type versionListBody = PaginationProps<{ appId: string; @@ -15,41 +17,40 @@ export type versionListResponse = PaginationResponse; async function handler( req: ApiRequestProps, - res: NextApiResponse + _res: NextApiResponse ): Promise { - const { offset, pageSize, appId } = req.body; + const { appId } = req.body; + const { offset, pageSize } = parsePaginationRequest(req); await authApp({ appId, req, per: WritePermissionVal, authToken: true }); const [result, total] = await Promise.all([ - MongoAppVersion.find( - { + (async () => { + const versions = await MongoAppVersion.find({ appId - }, - '_id appId versionName time isPublish tmbId' - ) - .sort({ - time: -1 }) - .skip(offset) - .limit(pageSize), + .sort({ + time: -1 + }) + .skip(offset) + .limit(pageSize) + .lean(); + + return addSourceMember({ + list: versions + }).then((list) => + list.map((item) => ({ + ...item, + isPublish: !!item.isPublish + })) + ); + })(), MongoAppVersion.countDocuments({ appId }) ]); - const versionList = result.map((item) => { - return { - _id: item._id, - appId: item.appId, - versionName: item.versionName, - time: item.time, - isPublish: item.isPublish, - tmbId: item.tmbId - }; - }); - return { total, - list: versionList + list: result }; } diff --git a/projects/app/src/pages/api/core/app/version/publish.test.ts b/projects/app/src/pages/api/core/app/version/publish.test.ts index a929fdde1..314af0252 100644 --- a/projects/app/src/pages/api/core/app/version/publish.test.ts +++ b/projects/app/src/pages/api/core/app/version/publish.test.ts @@ -12,7 +12,6 @@ describe('发布应用版本测试', () => { nodes: [], edges: [], chatConfig: {}, - type: AppTypeEnum.simple, isPublish: false, versionName: '1' }; diff --git a/projects/app/src/pages/api/core/chat/chatTest.ts b/projects/app/src/pages/api/core/chat/chatTest.ts index 3c0d64ddd..26e9b044d 100644 --- a/projects/app/src/pages/api/core/chat/chatTest.ts +++ b/projects/app/src/pages/api/core/chat/chatTest.ts @@ -164,6 +164,10 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { runningAppInfo: { id: appId, + teamId: app.teamId, + tmbId: app.tmbId + }, + runningUserInfo: { teamId, tmbId }, diff --git a/projects/app/src/pages/api/core/chat/getHistories.ts b/projects/app/src/pages/api/core/chat/getHistories.ts index ea38c84b8..2fafd8082 100644 --- a/projects/app/src/pages/api/core/chat/getHistories.ts +++ b/projects/app/src/pages/api/core/chat/getHistories.ts @@ -7,6 +7,7 @@ import { NextAPI } from '@/service/middleware/entry'; import { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next'; import { PaginationProps, PaginationResponse } from '@fastgpt/web/common/fetch/type'; import { GetHistoriesProps } from '@/global/core/chat/api'; +import { parsePaginationRequest } from '@fastgpt/service/common/api/pagination'; import { addMonths } from 'date-fns'; export type getHistoriesQuery = {}; @@ -17,9 +18,10 @@ export type getHistoriesResponse = {}; async function handler( req: ApiRequestProps, - res: ApiResponseType + _res: ApiResponseType ): Promise> { - const { appId, shareId, outLinkUid, teamId, teamToken, offset, pageSize, source } = req.body; + const { appId, shareId, outLinkUid, teamId, teamToken, source } = req.body; + const { offset, pageSize } = parsePaginationRequest(req); const match = await (async () => { if (shareId && outLinkUid) { diff --git a/projects/app/src/pages/api/core/chat/getPaginationRecords.ts b/projects/app/src/pages/api/core/chat/getPaginationRecords.ts index c779c11ec..82c11b81f 100644 --- a/projects/app/src/pages/api/core/chat/getPaginationRecords.ts +++ b/projects/app/src/pages/api/core/chat/getPaginationRecords.ts @@ -13,6 +13,7 @@ import { filterPublicNodeResponseData } from '@fastgpt/global/core/chat/utils'; import { GetChatTypeEnum } from '@/global/core/chat/constants'; import { PaginationProps, PaginationResponse } from '@fastgpt/web/common/fetch/type'; import { ChatItemType } from '@fastgpt/global/core/chat/type'; +import { parsePaginationRequest } from '@fastgpt/service/common/api/pagination'; export type getPaginationRecordsQuery = {}; @@ -22,16 +23,11 @@ export type getPaginationRecordsResponse = PaginationResponse; async function handler( req: ApiRequestProps, - res: ApiResponseType + _res: ApiResponseType ): Promise { - const { - appId, - chatId, - offset, - pageSize = 10, - loadCustomFeedbacks, - type = GetChatTypeEnum.normal - } = req.body; + const { appId, chatId, loadCustomFeedbacks, type = GetChatTypeEnum.normal } = req.body; + + const { offset, pageSize } = parsePaginationRequest(req); if (!appId || !chatId) { return { diff --git a/projects/app/src/pages/api/core/chat/inputGuide/list.ts b/projects/app/src/pages/api/core/chat/inputGuide/list.ts index b6173add0..5660f822e 100644 --- a/projects/app/src/pages/api/core/chat/inputGuide/list.ts +++ b/projects/app/src/pages/api/core/chat/inputGuide/list.ts @@ -6,6 +6,7 @@ import { ApiRequestProps } from '@fastgpt/service/type/next'; import { ChatInputGuideSchemaType } from '@fastgpt/global/core/chat/inputGuide/type'; import { authApp } from '@fastgpt/service/support/permission/app/auth'; import { ReadPermissionVal } from '@fastgpt/global/support/permission/constant'; +import { parsePaginationRequest } from '@fastgpt/service/common/api/pagination'; export type ChatInputGuideProps = PaginationProps<{ appId: string; @@ -17,7 +18,8 @@ async function handler( req: ApiRequestProps, res: NextApiResponse ): Promise { - const { appId, pageSize, offset, searchKey } = req.body; + const { appId, searchKey } = req.body; + const { offset, pageSize } = parsePaginationRequest(req); await authApp({ req, appId, authToken: true, per: ReadPermissionVal }); diff --git a/projects/app/src/pages/api/core/dataset/collection/list.ts b/projects/app/src/pages/api/core/dataset/collection/list.ts index 7c7410275..117e10268 100644 --- a/projects/app/src/pages/api/core/dataset/collection/list.ts +++ b/projects/app/src/pages/api/core/dataset/collection/list.ts @@ -2,7 +2,6 @@ import type { NextApiRequest } from 'next'; import { DatasetTrainingCollectionName } from '@fastgpt/service/core/dataset/training/schema'; import { Types } from '@fastgpt/service/common/mongo'; import type { DatasetCollectionsListItemType } from '@/global/core/dataset/type.d'; -import type { GetDatasetCollectionsProps } from '@/global/core/api/datasetReq'; import { MongoDatasetCollection } from '@fastgpt/service/core/dataset/collection/schema'; import { DatasetCollectionTypeEnum } from '@fastgpt/global/core/dataset/constants'; import { authDataset } from '@fastgpt/service/support/permission/dataset/auth'; @@ -10,11 +9,10 @@ import { DatasetDataCollectionName } from '@fastgpt/service/core/dataset/data/sc import { startTrainingQueue } from '@/service/core/dataset/training/utils'; import { NextAPI } from '@/service/middleware/entry'; import { ReadPermissionVal } from '@fastgpt/global/support/permission/constant'; -import { PagingData } from '@/types'; import { readFromSecondary } from '@fastgpt/service/common/mongo/utils'; import { collectionTagsToTagLabel } from '@fastgpt/service/core/dataset/collection/utils'; -async function handler(req: NextApiRequest): Promise> { +async function handler(req: NextApiRequest) { let { pageNum = 1, pageSize = 10, @@ -24,7 +22,7 @@ async function handler(req: NextApiRequest): Promise> { + let { + datasetId, + parentId = null, + searchText = '', + selectFolder = false, + filterTags = [], + simple = false + } = req.body as GetDatasetCollectionsProps; + let { pageSize, offset } = parsePaginationRequest(req); + pageSize = Math.min(pageSize, 30); + searchText = searchText?.replace(/'/g, ''); + + // auth dataset and get my role + const { teamId, permission } = await authDataset({ + req, + authToken: true, + authApiKey: true, + datasetId, + per: ReadPermissionVal + }); + + const match = { + teamId: new Types.ObjectId(teamId), + datasetId: new Types.ObjectId(datasetId), + parentId: parentId ? new Types.ObjectId(parentId) : null, + ...(selectFolder ? { type: DatasetCollectionTypeEnum.folder } : {}), + ...(searchText + ? { + name: new RegExp(searchText, 'i') + } + : {}), + ...(filterTags.length ? { tags: { $in: filterTags } } : {}) + }; + + const selectField = { + _id: 1, + parentId: 1, + tmbId: 1, + name: 1, + type: 1, + forbid: 1, + createTime: 1, + updateTime: 1, + trainingType: 1, + fileId: 1, + rawLink: 1, + tags: 1, + externalFileId: 1 + }; + + // not count data amount + if (simple) { + const collections = await MongoDatasetCollection.find(match, undefined, { + ...readFromSecondary + }) + .select(selectField) + .sort({ + updateTime: -1 + }) + .lean(); + + return { + list: await Promise.all( + collections.map(async (item) => ({ + ...item, + tags: await collectionTagsToTagLabel({ + datasetId, + tags: item.tags + }), + dataAmount: 0, + trainingAmount: 0, + permission + })) + ), + total: await MongoDatasetCollection.countDocuments(match) + }; + } + + const [collections, total]: [DatasetCollectionsListItemType[], number] = await Promise.all([ + MongoDatasetCollection.aggregate([ + { + $match: match + }, + { + $sort: { updateTime: -1 } + }, + { + $skip: offset + }, + { + $limit: pageSize + }, + // count training data + { + $lookup: { + from: DatasetTrainingCollectionName, + let: { id: '$_id', team_id: match.teamId, dataset_id: match.datasetId }, + pipeline: [ + { + $match: { + $expr: { + $and: [{ $eq: ['$teamId', '$$team_id'] }, { $eq: ['$collectionId', '$$id'] }] + } + } + }, + { $count: 'count' } + ], + as: 'trainingCount' + } + }, + // count collection total data + { + $lookup: { + from: DatasetDataCollectionName, + let: { id: '$_id', team_id: match.teamId, dataset_id: match.datasetId }, + pipeline: [ + { + $match: { + $expr: { + $and: [ + { $eq: ['$teamId', '$$team_id'] }, + { $eq: ['$datasetId', '$$dataset_id'] }, + { $eq: ['$collectionId', '$$id'] } + ] + } + } + }, + { $count: 'count' } + ], + as: 'dataCount' + } + }, + { + $project: { + ...selectField, + dataAmount: { + $ifNull: [{ $arrayElemAt: ['$dataCount.count', 0] }, 0] + }, + trainingAmount: { + $ifNull: [{ $arrayElemAt: ['$trainingCount.count', 0] }, 0] + } + } + } + ]), + MongoDatasetCollection.countDocuments(match, { + ...readFromSecondary + }) + ]); + + const list = await Promise.all( + collections.map(async (item) => ({ + ...item, + tags: await collectionTagsToTagLabel({ + datasetId, + tags: item.tags + }), + permission + })) + ); + + if (list.find((item) => item.trainingAmount > 0)) { + startTrainingQueue(); + } + + // count collections + return { + list, + total + }; +} + +export default NextAPI(handler); diff --git a/projects/app/src/pages/api/core/dataset/collection/scrollList.ts b/projects/app/src/pages/api/core/dataset/collection/scrollList.ts index cf30cad31..2b2920975 100644 --- a/projects/app/src/pages/api/core/dataset/collection/scrollList.ts +++ b/projects/app/src/pages/api/core/dataset/collection/scrollList.ts @@ -10,6 +10,7 @@ import { CommonErrEnum } from '@fastgpt/global/common/error/code/common'; import { ApiRequestProps } from '@fastgpt/service/type/next'; import { PaginationProps, PaginationResponse } from '@fastgpt/web/common/fetch/type'; import type { DatasetCollectionsListItemType } from '@/global/core/dataset/type.d'; +import { parsePaginationRequest } from '@fastgpt/service/common/api/pagination'; export type GetScrollCollectionsProps = PaginationProps<{ datasetId: string; @@ -25,8 +26,6 @@ async function handler( ): Promise> { let { datasetId, - pageSize = 10, - offset, parentId = null, searchText = '', selectFolder = false, @@ -36,6 +35,7 @@ async function handler( if (!datasetId) { return Promise.reject(CommonErrEnum.missingParams); } + let { offset, pageSize } = parsePaginationRequest(req); searchText = searchText?.replace(/'/g, ''); pageSize = Math.min(pageSize, 30); diff --git a/projects/app/src/pages/api/core/dataset/data/list.ts b/projects/app/src/pages/api/core/dataset/data/list.ts index 4e6990732..a10f7e3ea 100644 --- a/projects/app/src/pages/api/core/dataset/data/list.ts +++ b/projects/app/src/pages/api/core/dataset/data/list.ts @@ -3,19 +3,21 @@ import { MongoDatasetData } from '@fastgpt/service/core/dataset/data/schema'; import { replaceRegChars } from '@fastgpt/global/common/string/tools'; import { NextAPI } from '@/service/middleware/entry'; import { ReadPermissionVal } from '@fastgpt/global/support/permission/constant'; -import { PagingData, RequestPaging } from '@/types'; import { ApiRequestProps } from '@fastgpt/service/type/next'; import { DatasetDataListItemType } from '@/global/core/dataset/type'; +import { parsePaginationRequest } from '@fastgpt/service/common/api/pagination'; +import { PaginationResponse } from '@fastgpt/web/common/fetch/type'; -export type GetDatasetDataListProps = RequestPaging & { +export type GetDatasetDataListProps = { searchText?: string; collectionId: string; }; async function handler( req: ApiRequestProps -): Promise> { - let { pageNum = 1, pageSize = 10, searchText = '', collectionId } = req.body; +): Promise> { + let { searchText = '', collectionId } = req.body; + let { offset, pageSize } = parsePaginationRequest(req); pageSize = Math.min(pageSize, 30); @@ -40,19 +42,17 @@ async function handler( : {}) }; - const [data, total] = await Promise.all([ + const [list, total] = await Promise.all([ MongoDatasetData.find(match, '_id datasetId collectionId q a chunkIndex') .sort({ chunkIndex: 1, updateTime: -1 }) - .skip((pageNum - 1) * pageSize) + .skip(offset) .limit(pageSize) .lean(), MongoDatasetData.countDocuments(match) ]); return { - pageNum, - pageSize, - data, + list, total }; } diff --git a/projects/app/src/pages/api/core/dataset/data/v2/list.ts b/projects/app/src/pages/api/core/dataset/data/v2/list.ts index 113fd70d4..0caa766d9 100644 --- a/projects/app/src/pages/api/core/dataset/data/v2/list.ts +++ b/projects/app/src/pages/api/core/dataset/data/v2/list.ts @@ -6,6 +6,7 @@ import { ReadPermissionVal } from '@fastgpt/global/support/permission/constant'; import { ApiRequestProps } from '@fastgpt/service/type/next'; import { DatasetDataListItemType } from '@/global/core/dataset/type'; import { PaginationProps, PaginationResponse } from '@fastgpt/web/common/fetch/type'; +import { parsePaginationRequest } from '@fastgpt/service/common/api/pagination'; export type GetDatasetDataListProps = PaginationProps & { searchText?: string; @@ -16,7 +17,8 @@ export type GetDatasetDataListRes = PaginationResponse; async function handler( req: ApiRequestProps ): Promise { - let { offset, pageSize = 10, searchText = '', collectionId } = req.body; + let { searchText = '', collectionId } = req.body; + let { offset, pageSize } = parsePaginationRequest(req); pageSize = Math.min(pageSize, 30); diff --git a/projects/app/src/pages/api/core/dataset/list.ts b/projects/app/src/pages/api/core/dataset/list.ts index 2a3e76c62..ad9ffca5a 100644 --- a/projects/app/src/pages/api/core/dataset/list.ts +++ b/projects/app/src/pages/api/core/dataset/list.ts @@ -1,8 +1,6 @@ -import type { DatasetListItemType } from '@fastgpt/global/core/dataset/type.d'; import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants'; import { MongoDataset } from '@fastgpt/service/core/dataset/schema'; import { authUserPer } from '@fastgpt/service/support/permission/user/auth'; -import { getVectorModel } from '@fastgpt/service/core/ai/model'; import { NextAPI } from '@/service/middleware/entry'; import { DatasetPermission } from '@fastgpt/global/support/permission/dataset/controller'; import { @@ -19,6 +17,8 @@ import { replaceRegChars } from '@fastgpt/global/common/string/tools'; import { getGroupsByTmbId } from '@fastgpt/service/support/permission/memberGroup/controllers'; import { concatPer } from '@fastgpt/service/support/permission/controller'; import { getOrgIdSetWithParentByTmbId } from '@fastgpt/service/support/permission/org/controllers'; +import { addSourceMember } from '@fastgpt/service/support/user/utils'; +import { getVectorModel } from '@fastgpt/service/core/ai/model'; export type GetDatasetListBody = { parentId: ParentIdType; @@ -167,28 +167,24 @@ async function handler(req: ApiRequestProps) { })(); return { - ...dataset, + _id: dataset._id, + avatar: dataset.avatar, + name: dataset.name, + intro: dataset.intro, + type: dataset.type, + vectorModel: getVectorModel(dataset.vectorModel), + inheritPermission: dataset.inheritPermission, + tmbId: dataset.tmbId, + updateTime: dataset.updateTime, permission: Per, privateDataset }; }) .filter((app) => app.permission.hasReadPer); - const data = formatDatasets.map((item) => ({ - _id: item._id, - avatar: item.avatar, - name: item.name, - intro: item.intro, - type: item.type, - permission: item.permission, - vectorModel: getVectorModel(item.vectorModel), - inheritPermission: item.inheritPermission, - tmbId: item.tmbId, - updateTime: item.updateTime, - private: item.privateDataset - })); - - return data; + return addSourceMember({ + list: formatDatasets + }); } export default NextAPI(handler); diff --git a/projects/app/src/pages/api/core/workflow/debug.ts b/projects/app/src/pages/api/core/workflow/debug.ts index dfd7c72c5..87d7ce439 100644 --- a/projects/app/src/pages/api/core/workflow/debug.ts +++ b/projects/app/src/pages/api/core/workflow/debug.ts @@ -45,7 +45,11 @@ async function handler( requestOrigin: req.headers.origin, mode: 'debug', runningAppInfo: { - id: appId, + id: app._id, + teamId: app.teamId, + tmbId: app.tmbId + }, + runningUserInfo: { teamId, tmbId }, diff --git a/projects/app/src/pages/api/support/user/account/update.ts b/projects/app/src/pages/api/support/user/account/update.ts index 34bc06570..192649081 100644 --- a/projects/app/src/pages/api/support/user/account/update.ts +++ b/projects/app/src/pages/api/support/user/account/update.ts @@ -1,17 +1,18 @@ import { MongoUser } from '@fastgpt/service/support/user/schema'; import { authCert } from '@fastgpt/service/support/permission/auth/common'; import { UserUpdateParams } from '@/types/user'; -import { MongoTeamMember } from '@fastgpt/service/support/user/team/teamMemberSchema'; /* update user info */ import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next'; import { NextAPI } from '@/service/middleware/entry'; import { mongoSessionRun } from '@fastgpt/service/common/mongo/sessionRun'; -import { getUserDetail } from '@fastgpt/service/support/user/controller'; import { refreshSourceAvatar } from '@fastgpt/service/common/file/image/controller'; +import { MongoTeamMember } from '@fastgpt/service/support/user/team/teamMemberSchema'; + export type UserAccountUpdateQuery = {}; export type UserAccountUpdateBody = UserUpdateParams; export type UserAccountUpdateResponse = {}; + async function handler( req: ApiRequestProps, _res: ApiResponseType @@ -19,21 +20,33 @@ async function handler( const { avatar, timezone } = req.body; const { tmbId } = await authCert({ req, authToken: true }); - const user = await getUserDetail({ tmbId }); + // const user = await getUserDetail({ tmbId }); // 更新对应的记录 await mongoSessionRun(async (session) => { - await MongoUser.updateOne( - { - _id: user._id - }, - { - ...(avatar && { avatar }), - ...(timezone && { timezone }) - } - ).session(session); - - await refreshSourceAvatar(avatar, user.avatar, session); + const tmb = await MongoTeamMember.findById(tmbId).session(session); + if (timezone) { + await MongoUser.updateOne( + { + _id: tmb?.userId + }, + { + timezone + } + ).session(session); + } + // if avatar, update team member avatar + if (avatar) { + await MongoTeamMember.updateOne( + { + _id: tmbId + }, + { + avatar + } + ).session(session); + await refreshSourceAvatar(avatar, tmb?.avatar, session); + } }); return {}; diff --git a/projects/app/src/pages/api/v1/chat/completions.ts b/projects/app/src/pages/api/v1/chat/completions.ts index 23c245df3..52d483418 100644 --- a/projects/app/src/pages/api/v1/chat/completions.ts +++ b/projects/app/src/pages/api/v1/chat/completions.ts @@ -280,6 +280,10 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { teamId: String(app.teamId), tmbId: String(app.tmbId) }, + runningUserInfo: { + teamId, + tmbId + }, uid: String(outLinkUserId || tmbId), chatId, diff --git a/projects/app/src/pages/app/detail/components/Logs/DetailLogsModal.tsx b/projects/app/src/pages/app/detail/components/Logs/DetailLogsModal.tsx index d034f2124..0098e8cec 100644 --- a/projects/app/src/pages/app/detail/components/Logs/DetailLogsModal.tsx +++ b/projects/app/src/pages/app/detail/components/Logs/DetailLogsModal.tsx @@ -164,8 +164,6 @@ const DetailLogsModal = ({ appId, chatId, onClose }: Props) => { showMarkIcon showVoiceIcon={false} chatType="log" - showRawSource - showNodeStatus /> )}
@@ -187,7 +185,12 @@ const Render = (props: Props) => { }, [appId, chatId]); return ( - + diff --git a/projects/app/src/pages/app/detail/components/Logs/index.tsx b/projects/app/src/pages/app/detail/components/Logs/index.tsx index 263a4c710..b104da20b 100644 --- a/projects/app/src/pages/app/detail/components/Logs/index.tsx +++ b/projects/app/src/pages/app/detail/components/Logs/index.tsx @@ -13,7 +13,7 @@ import { ModalBody, HStack } from '@chakra-ui/react'; -import Avatar from '@fastgpt/web/components/common/Avatar'; +import UserBox from '@fastgpt/web/components/common/UserBox'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { useTranslation } from 'next-i18next'; import { getAppChatLogs } from '@/web/core/app/api'; @@ -30,8 +30,6 @@ import { cardStyles } from '../constants'; import dynamic from 'next/dynamic'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; -import { useUserStore } from '@/web/support/user/useUserStore'; -import { useMount } from 'ahooks'; const DetailLogsModal = dynamic(() => import('./DetailLogsModal')); @@ -40,17 +38,11 @@ const Logs = () => { const { isPc } = useSystem(); const appId = useContextSelector(AppContext, (v) => v.appId); - const { teamMembers, loadAndGetTeamMembers } = useUserStore(); - - useMount(() => { - loadAndGetTeamMembers(); - }); const [dateRange, setDateRange] = useState({ from: addDays(new Date(), -7), to: new Date() }); - const { isOpen: isOpenMarkDesc, onOpen: onOpenMarkDesc, @@ -63,8 +55,7 @@ const Logs = () => { Pagination, getData, pageNum - } = usePagination({ - api: getAppChatLogs, + } = usePagination(getAppChatLogs, { pageSize: 20, params: { appId, @@ -139,15 +130,7 @@ const Logs = () => { {!!item.outLinkUid ? ( item.outLinkUid ) : ( - - v.tmbId === item.tmbId)?.avatar} - w="1.25rem" - /> - - {teamMembers?.find((v) => v.tmbId === item.tmbId)?.memberName} - - + )}
diff --git a/projects/app/src/pages/app/detail/components/PublishHistoriesSlider.tsx b/projects/app/src/pages/app/detail/components/PublishHistoriesSlider.tsx index 50b327d32..e367e1963 100644 --- a/projects/app/src/pages/app/detail/components/PublishHistoriesSlider.tsx +++ b/projects/app/src/pages/app/detail/components/PublishHistoriesSlider.tsx @@ -4,7 +4,7 @@ import { getWorkflowVersionList, updateAppVersion } from '@/web/core/app/api/version'; -import { useVirtualScrollPagination } from '@fastgpt/web/hooks/useScrollPagination'; +import { useScrollPagination } from '@fastgpt/web/hooks/useScrollPagination'; import CustomRightDrawer from '@fastgpt/web/components/common/MyDrawer/CustomRightDrawer'; import { useTranslation } from 'next-i18next'; import { Box, BoxProps, Button, Flex, Input } from '@chakra-ui/react'; @@ -18,9 +18,7 @@ import Tag from '@fastgpt/web/components/common/Tag'; import MyIcon from '@fastgpt/web/components/common/Icon'; import MyPopover from '@fastgpt/web/components/common/MyPopover'; import MyBox from '@fastgpt/web/components/common/MyBox'; -import { useUserStore } from '@/web/support/user/useUserStore'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; -import { useSystemStore } from '@/web/common/system/useSystemStore'; import { useToast } from '@fastgpt/web/hooks/useToast'; import type { AppVersionSchemaType, VersionListItemType } from '@fastgpt/global/core/app/version'; import type { SimpleAppSnapshotType } from './SimpleApp/useSnapshots'; @@ -183,23 +181,18 @@ const TeamCloud = ({ }) => { const { t } = useTranslation(); const { appDetail } = useContextSelector(AppContext, (v) => v); - const { loadAndGetTeamMembers } = useUserStore(); - const { feConfigs } = useSystemStore(); - const { scrollDataList, ScrollList, isLoading, fetchData, setData } = useVirtualScrollPagination( - getWorkflowVersionList, - { - itemHeight: 40, - overscan: 20, - - pageSize: 30, - defaultParams: { - appId: appDetail._id - } - } - ); - const { data: members = [] } = useRequest2(loadAndGetTeamMembers, { - manual: !feConfigs.isPlus + const { + ScrollData, + data: scrollDataList, + setData, + isLoading + } = useScrollPagination(getWorkflowVersionList, { + pageSize: 30, + params: { + appId: appDetail._id + }, + refreshDeps: [appDetail._id] }); const [editIndex, setEditIndex] = useState(undefined); const [hoveredIndex, setHoveredIndex] = useState(undefined); @@ -237,15 +230,13 @@ const TeamCloud = ({ ); return ( - - {scrollDataList.map((data, index) => { - const item = data.data; - const firstPublishedIndex = scrollDataList.findIndex((data) => data.data.isPublish); - const tmb = members.find((member) => member.tmbId === item.tmbId); + + {scrollDataList.map((item, index) => { + const firstPublishedIndex = scrollDataList.findIndex((data) => data.isPublish); return ( - +
} > - {({ onClose }) => ( - + {() => ( + - + - - {tmb?.memberName} - - + + {item.sourceMember.name} + {item.sourceMember.status === 'leave' && ( + {t('common:user_leaved')} + )} + + {formatTime2YMDHMS(item.time)} @@ -349,6 +353,6 @@ const TeamCloud = ({ ); })} - + ); }; diff --git a/projects/app/src/pages/app/detail/components/SimpleApp/ChatTest.tsx b/projects/app/src/pages/app/detail/components/SimpleApp/ChatTest.tsx index ac63c0e26..0ef02db7e 100644 --- a/projects/app/src/pages/app/detail/components/SimpleApp/ChatTest.tsx +++ b/projects/app/src/pages/app/detail/components/SimpleApp/ChatTest.tsx @@ -91,7 +91,12 @@ const Render = ({ appForm }: Props) => { ); return ( - + diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/ChatTest.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/ChatTest.tsx index 87e27c03c..4834f0970 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/ChatTest.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/ChatTest.tsx @@ -158,7 +158,12 @@ const Render = (Props: Props) => { ); return ( - + diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/NodeTemplatesModal.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/NodeTemplatesModal.tsx index 7a07ada84..b48d715da 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/NodeTemplatesModal.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/NodeTemplatesModal.tsx @@ -50,7 +50,6 @@ import { useWorkflowUtils } from './hooks/useUtils'; import { moduleTemplatesFlat } from '@fastgpt/global/core/workflow/template/constants'; import { cloneDeep } from 'lodash'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; -import { useUserStore } from '@/web/support/user/useUserStore'; import { LoopStartNode } from '@fastgpt/global/core/workflow/template/system/loop/loopStart'; import { LoopEndNode } from '@fastgpt/global/core/workflow/template/system/loop/loopEnd'; import { NodeInputKeyEnum, NodeOutputKeyEnum } from '@fastgpt/global/core/workflow/constants'; @@ -89,8 +88,6 @@ enum TemplateTypeEnum { const sliderWidth = 460; const NodeTemplatesModal = ({ isOpen, onClose }: ModuleTemplateListProps) => { - const { loadAndGetTeamMembers } = useUserStore(); - const [parentId, setParentId] = useState(''); const [searchKey, setSearchKey] = useState(''); const { feConfigs } = useSystemStore(); @@ -99,10 +96,6 @@ const NodeTemplatesModal = ({ isOpen, onClose }: ModuleTemplateListProps) => { const nodeList = useContextSelector(WorkflowContext, (v) => v.nodeList); const appId = useContextSelector(WorkflowContext, (v) => v.appId); - const { data: members = [] } = useRequest2(loadAndGetTeamMembers, { - manual: !feConfigs.isPlus - }); - const [templateType, setTemplateType] = useState(TemplateTypeEnum.basic); const { data: basicNodes } = useRequest2( @@ -162,19 +155,10 @@ const NodeTemplatesModal = ({ isOpen, onClose }: ModuleTemplateListProps) => { searchVal?: string; }) => { if (type === TemplateTypeEnum.teamPlugin) { - const teamApps = await getTeamPlugTemplates({ + return getTeamPlugTemplates({ parentId, searchKey: searchVal }).then((res) => res.filter((app) => app.id !== appId)); - - return teamApps.map((app) => { - const member = members.find((member) => member.tmbId === app.tmbId); - return { - ...app, - author: member?.memberName, - authorAvatar: member?.avatar - }; - }); } if (type === TemplateTypeEnum.systemPlugin) { return getSystemPlugTemplates({ @@ -188,7 +172,7 @@ const NodeTemplatesModal = ({ isOpen, onClose }: ModuleTemplateListProps) => { setParentId(parentId); setTemplateType(type); }, - refreshDeps: [members, searchKey, templateType] + refreshDeps: [searchKey, templateType] } ); @@ -420,7 +404,6 @@ const RenderList = React.memo(function RenderList({ templates, type, onClose, - parentId, setParentId }: RenderListProps) { const { t } = useTranslation(); diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeCode.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeCode.tsx index 3a58f3665..3c048ff4d 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeCode.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/NodeCode.tsx @@ -14,22 +14,18 @@ import RenderToolInput from './render/RenderToolInput'; import RenderOutput from './render/RenderOutput'; import CodeEditor from '@fastgpt/web/components/common/Textarea/CodeEditor'; import { Box, Flex } from '@chakra-ui/react'; -import { useI18n } from '@/web/context/I18n'; import { useConfirm } from '@fastgpt/web/hooks/useConfirm'; -import { getLatestNodeTemplate } from '@/web/core/workflow/utils'; -import { CodeNode } from '@fastgpt/global/core/workflow/template/system/sandbox'; +import { JS_TEMPLATE } from '@fastgpt/global/core/workflow/template/system/sandbox/constants'; const NodeCode = ({ data, selected }: NodeProps) => { const { t } = useTranslation(); - const { workflowT } = useI18n(); const { nodeId, inputs, outputs } = data; - const { splitToolInputs, onChangeNode, onResetNode } = useContextSelector( - WorkflowContext, - (ctx) => ctx - ); + + const splitToolInputs = useContextSelector(WorkflowContext, (ctx) => ctx.splitToolInputs); + const onChangeNode = useContextSelector(WorkflowContext, (ctx) => ctx.onChangeNode); const { ConfirmModal, openConfirm } = useConfirm({ - content: workflowT('code.Reset template confirm') + content: t('workflow:code.Reset template confirm') }); const CustomComponent = useMemo(() => { @@ -38,19 +34,24 @@ const NodeCode = ({ data, selected }: NodeProps) => { return ( - {'Javascript ' + workflowT('Code')} + {'Javascript ' + t('workflow:Code')} { - onResetNode({ - id: nodeId, - node: getLatestNodeTemplate(data, CodeNode) + onChangeNode({ + nodeId, + type: 'updateInput', + key: item.key, + value: { + ...item, + value: JS_TEMPLATE + } }); })} > - {workflowT('code.Reset template')} + {t('workflow:code.Reset template')} ) => { ); } }; - }, [data, nodeId, onChangeNode, onResetNode, openConfirm, workflowT]); + }, [nodeId, onChangeNode, openConfirm, t]); - const Render = useMemo(() => { - const { isTool, commonInputs } = splitToolInputs(inputs, nodeId); + const { isTool, commonInputs } = splitToolInputs(inputs, nodeId); - return ( - - {isTool && ( - <> - - - - - )} - - - - - - - - - - - ); - }, [ConfirmModal, CustomComponent, data, inputs, nodeId, outputs, selected, splitToolInputs, t]); - - return Render; + return ( + + {isTool && ( + <> + + + + + )} + + + + + + + + + + + ); }; export default React.memo(NodeCode); diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/Label.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/Label.tsx index d8fb9eb49..b372f2655 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/Label.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/Label.tsx @@ -1,5 +1,5 @@ import { FlowNodeInputItemType } from '@fastgpt/global/core/workflow/type/io.d'; -import React, { useCallback, useMemo } from 'react'; +import React, { useCallback } from 'react'; import { useTranslation } from 'next-i18next'; import { Box, Flex } from '@chakra-ui/react'; @@ -10,14 +10,14 @@ import { useContextSelector } from 'use-context-selector'; import { WorkflowContext } from '@/pages/app/detail/components/WorkflowComponents/context'; import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel'; -import VariableTip from '@/components/common/Textarea/MyTextarea/VariableTip'; type Props = { nodeId: string; input: FlowNodeInputItemType; + RightComponent?: React.JSX.Element; }; -const InputLabel = ({ nodeId, input }: Props) => { +const InputLabel = ({ nodeId, input, RightComponent }: Props) => { const { t } = useTranslation(); const onChangeNode = useContextSelector(WorkflowContext, (v) => v.onChangeNode); @@ -68,11 +68,11 @@ const InputLabel = ({ nodeId, input }: Props) => { )} - {/* Variable picker tip */} - {input.renderTypeList[input.selectedTypeIndex ?? 0] === FlowNodeInputTypeEnum.textarea && ( + {/* Right Component */} + {RightComponent && ( <> - - + + {RightComponent} )} diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/index.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/index.tsx index f798ff805..d4c4e9017 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/index.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/index.tsx @@ -8,71 +8,72 @@ import InputLabel from './Label'; import type { RenderInputProps } from './type'; import { useSystemStore } from '@/web/common/system/useSystemStore'; -const RenderList: { - types: FlowNodeInputTypeEnum[]; - Component: React.ComponentType; -}[] = [ - { - types: [FlowNodeInputTypeEnum.reference], +const RenderList: Record< + FlowNodeInputTypeEnum, + | { + Component: React.ComponentType; + LableRightComponent?: React.ComponentType; + } + | undefined +> = { + [FlowNodeInputTypeEnum.reference]: { Component: dynamic(() => import('./templates/Reference')) }, - { - types: [FlowNodeInputTypeEnum.fileSelect], + [FlowNodeInputTypeEnum.fileSelect]: { Component: dynamic(() => import('./templates/Reference')) }, - { - types: [FlowNodeInputTypeEnum.select], + [FlowNodeInputTypeEnum.select]: { Component: dynamic(() => import('./templates/Select')) }, - { - types: [FlowNodeInputTypeEnum.numberInput], + [FlowNodeInputTypeEnum.numberInput]: { Component: dynamic(() => import('./templates/NumberInput')) }, - { - types: [FlowNodeInputTypeEnum.switch], + [FlowNodeInputTypeEnum.switch]: { Component: dynamic(() => import('./templates/Switch')) }, - { - types: [FlowNodeInputTypeEnum.selectApp], + [FlowNodeInputTypeEnum.selectApp]: { Component: dynamic(() => import('./templates/SelectApp')) }, - { - types: [FlowNodeInputTypeEnum.selectLLMModel], + [FlowNodeInputTypeEnum.selectLLMModel]: { Component: dynamic(() => import('./templates/SelectLLMModel')) }, - { - types: [FlowNodeInputTypeEnum.settingLLMModel], + [FlowNodeInputTypeEnum.settingLLMModel]: { Component: dynamic(() => import('./templates/SettingLLMModel')) }, - { - types: [FlowNodeInputTypeEnum.selectDataset], - Component: dynamic(() => import('./templates/SelectDataset')) + [FlowNodeInputTypeEnum.selectDataset]: { + Component: dynamic(() => + import('./templates/SelectDataset').then((mod) => mod.SelectDatasetRender) + ), + LableRightComponent: dynamic(() => + import('./templates/SelectDataset').then((mod) => mod.SwitchAuthTmb) + ) }, - { - types: [FlowNodeInputTypeEnum.selectDatasetParamsModal], + [FlowNodeInputTypeEnum.selectDatasetParamsModal]: { Component: dynamic(() => import('./templates/SelectDatasetParams')) }, - { - types: [FlowNodeInputTypeEnum.addInputParam], + [FlowNodeInputTypeEnum.addInputParam]: { Component: dynamic(() => import('./templates/DynamicInputs/index')) }, - { - types: [FlowNodeInputTypeEnum.JSONEditor], + [FlowNodeInputTypeEnum.JSONEditor]: { Component: dynamic(() => import('./templates/JsonEditor')) }, - { - types: [FlowNodeInputTypeEnum.settingDatasetQuotePrompt], + [FlowNodeInputTypeEnum.settingDatasetQuotePrompt]: { Component: dynamic(() => import('./templates/SettingQuotePrompt')) }, - { - types: [FlowNodeInputTypeEnum.input], + [FlowNodeInputTypeEnum.input]: { Component: dynamic(() => import('./templates/TextInput')) }, - { - types: [FlowNodeInputTypeEnum.textarea], - Component: dynamic(() => import('./templates/Textarea')) - } -]; + [FlowNodeInputTypeEnum.textarea]: { + Component: dynamic(() => import('./templates/Textarea')), + LableRightComponent: dynamic(() => + import('./templates/Textarea').then((mod) => mod.TextareaRightComponent) + ) + }, + + [FlowNodeInputTypeEnum.customVariable]: undefined, + [FlowNodeInputTypeEnum.hidden]: undefined, + [FlowNodeInputTypeEnum.custom]: undefined +}; const hideLabelTypeList = [FlowNodeInputTypeEnum.addInputParam]; @@ -101,7 +102,7 @@ const RenderInput = ({ flowInputList, nodeId, CustomComponent, mb = 5 }: Props) return true; }); - }, [feConfigs?.isPlus, flowInputList]); + }, [filterProInputs]); return ( <> @@ -110,23 +111,41 @@ const RenderInput = ({ flowInputList, nodeId, CustomComponent, mb = 5 }: Props) const RenderComponent = (() => { if (renderType === FlowNodeInputTypeEnum.custom && CustomComponent?.[input.key]) { - return <>{CustomComponent?.[input.key]({ ...input })}; + return { + Component: <>{CustomComponent?.[input.key]({ ...input })} + }; } - const Component = RenderList.find((item) => item.types.includes(renderType))?.Component; + const RenderItem = RenderList[renderType]; - if (!Component) return null; - return ; + if (!RenderItem) return null; + + return { + Component: ( + + ), + LableRightComponent: RenderItem.LableRightComponent ? ( + + ) : undefined + }; })(); return ( {!!input.label && !hideLabelTypeList.includes(renderType) && ( - + )} {!!RenderComponent && ( - {RenderComponent} + {RenderComponent.Component} )} diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/SelectDataset.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/SelectDataset.tsx index 162208986..b4bdb70e8 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/SelectDataset.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/SelectDataset.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useMemo, useState } from 'react'; import type { RenderInputProps } from '../type'; -import { Box, Button, Flex, Grid, useDisclosure, useTheme } from '@chakra-ui/react'; +import { Box, Button, Flex, Grid, Switch, useDisclosure, useTheme } from '@chakra-ui/react'; import { useDatasetStore } from '@/web/core/dataset/store/dataset'; import { SelectedDatasetType } from '@fastgpt/global/core/workflow/api'; import Avatar from '@fastgpt/web/components/common/Avatar'; @@ -12,12 +12,17 @@ import dynamic from 'next/dynamic'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { useContextSelector } from 'use-context-selector'; import { WorkflowContext } from '@/pages/app/detail/components/WorkflowComponents/context'; +import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; +import { NodeInputKeyEnum } from '@fastgpt/global/core/workflow/constants'; const DatasetSelectModal = dynamic(() => import('@/components/core/app/DatasetSelectModal')); -const SelectDatasetRender = ({ inputs = [], item, nodeId }: RenderInputProps) => { +export const SelectDatasetRender = React.memo(function SelectDatasetRender({ + inputs = [], + item, + nodeId +}: RenderInputProps) { const { t } = useTranslation(); - const theme = useTheme(); const onChangeNode = useContextSelector(WorkflowContext, (v) => v.onChangeNode); const [data, setData] = useState({ @@ -80,8 +85,9 @@ const SelectDatasetRender = ({ inputs = [], item, nodeId }: RenderInputProps) => key={item._id} alignItems={'center'} h={10} - border={theme.borders.base} - borderColor={'myGray.200'} + boxShadow={'sm'} + bg={'white'} + border={'base'} px={2} borderRadius={'md'} > @@ -128,11 +134,47 @@ const SelectDatasetRender = ({ inputs = [], item, nodeId }: RenderInputProps) => onOpenDatasetSelect, selectedDatasets, selectedDatasetsValue, - t, - theme.borders.base + t ]); return Render; -}; +}); -export default React.memo(SelectDatasetRender); +export const SwitchAuthTmb = React.memo(function SwitchAuthTmb({ + inputs = [], + item, + nodeId +}: RenderInputProps) { + const { t } = useTranslation(); + const onChangeNode = useContextSelector(WorkflowContext, (v) => v.onChangeNode); + + const authTmbIdInput = useMemo( + () => inputs.find((v) => v.key === NodeInputKeyEnum.authTmbId), + [inputs] + ); + + return authTmbIdInput ? ( + + {t('workflow:auth_tmb_id')} + + { + onChangeNode({ + nodeId, + key: NodeInputKeyEnum.authTmbId, + type: 'updateInput', + value: { + ...authTmbIdInput, + value: e.target.checked + } + }); + }} + /> + + ) : null; +}); + +export default SelectDatasetRender; diff --git a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/Textarea.tsx b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/Textarea.tsx index ef5d355ca..d190e6fb2 100644 --- a/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/Textarea.tsx +++ b/projects/app/src/pages/app/detail/components/WorkflowComponents/Flow/nodes/render/RenderInput/templates/Textarea.tsx @@ -9,6 +9,7 @@ import { AppContext } from '@/pages/app/detail/components/context'; import { getEditorVariables } from '../../../../../utils'; import { WorkflowNodeEdgeContext } from '../../../../../context/workflowInitContext'; import { useSystemStore } from '@/web/common/system/useSystemStore'; +import VariableTip from '@/components/common/Textarea/MyTextarea/VariableTip'; const TextareaRender = ({ item, nodeId }: RenderInputProps) => { const { t } = useTranslation(); @@ -84,3 +85,10 @@ const TextareaRender = ({ item, nodeId }: RenderInputProps) => { }; export default React.memo(TextareaRender); + +export const TextareaRightComponent = React.memo(function TextareaRightComponent({ + item, + nodeId +}: RenderInputProps) { + return ; +}); diff --git a/projects/app/src/pages/app/detail/components/useChatTest.tsx b/projects/app/src/pages/app/detail/components/useChatTest.tsx index 7a204c309..22a54dfeb 100644 --- a/projects/app/src/pages/app/detail/components/useChatTest.tsx +++ b/projects/app/src/pages/app/detail/components/useChatTest.tsx @@ -141,8 +141,6 @@ export const useChatTest = ({ chatId={chatId} showMarkIcon chatType="chat" - showRawSource - showNodeStatus onStartChat={startChat} /> ) diff --git a/projects/app/src/pages/app/list/components/List.tsx b/projects/app/src/pages/app/list/components/List.tsx index ff3144164..66af89fbe 100644 --- a/projects/app/src/pages/app/list/components/List.tsx +++ b/projects/app/src/pages/app/list/components/List.tsx @@ -34,8 +34,8 @@ import { postCopyApp } from '@/web/core/app/api/app'; import { formatTimeToChatTime } from '@fastgpt/global/common/string/time'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; import { useChatStore } from '@/web/core/chat/context/useChatStore'; -import { useUserStore } from '@/web/support/user/useUserStore'; import { RequireOnlyOne } from '@fastgpt/global/common/type/utils'; +import UserBox from '@fastgpt/web/components/common/UserBox'; const HttpEditModal = dynamic(() => import('./HttpPluginEditModal')); const ListItem = () => { @@ -44,8 +44,6 @@ const ListItem = () => { const { parentId = null } = router.query; const { isPc } = useSystem(); - const { loadAndGetTeamMembers } = useUserStore(); - const { openConfirm: openMoveConfirm, ConfirmModal: MoveConfirmModal } = useConfirm({ type: 'common', title: t('common:move.confirm'), @@ -115,10 +113,6 @@ const ListItem = () => { successToast: t('app:create_copy_success') }); - const { data: members = [] } = useRequest2(loadAndGetTeamMembers, { - manual: false - }); - const { runAsync: onResumeInheritPermission } = useRequest2( () => { return resumeInheritPer(editPerApp!._id); @@ -145,7 +139,6 @@ const ListItem = () => { alignItems={'stretch'} > {myApps.map((app, index) => { - const owner = members.find((v) => v.tmbId === app.tmbId); return ( { color={'myGray.500'} > - {owner && ( - - - - {owner.memberName} - - - )} - + void; totalRecordsCount: number; }) => { const { t } = useTranslation(); @@ -71,7 +69,7 @@ const ChatHeader = ({ )} {/* control */} - {!isPlugin && } + {!isPlugin && } ); }; diff --git a/projects/app/src/pages/chat/components/ChatHistorySlider.tsx b/projects/app/src/pages/chat/components/ChatHistorySlider.tsx index 8b0259168..96fa84926 100644 --- a/projects/app/src/pages/chat/components/ChatHistorySlider.tsx +++ b/projects/app/src/pages/chat/components/ChatHistorySlider.tsx @@ -28,7 +28,6 @@ type HistoryItemType = { const ChatHistorySlider = ({ confirmClearText }: { confirmClearText: string }) => { const theme = useTheme(); const router = useRouter(); - const isUserChatPage = router.pathname === '/chat'; const { t } = useTranslation(); @@ -46,6 +45,7 @@ const ChatHistorySlider = ({ confirmClearText }: { confirmClearText: string }) = const appName = useContextSelector(ChatItemContext, (v) => v.chatBoxData?.app.name); const appAvatar = useContextSelector(ChatItemContext, (v) => v.chatBoxData?.app.avatar); + const showRouteToAppDetail = useContextSelector(ChatItemContext, (v) => v.showRouteToAppDetail); const concatHistory = useMemo(() => { const formatHistories: HistoryItemType[] = histories.map((item) => { @@ -77,8 +77,8 @@ const ChatHistorySlider = ({ confirmClearText }: { confirmClearText: string }) = }); const canRouteToDetail = useMemo( - () => appId && userInfo?.team.permission.hasWritePer, - [appId, userInfo?.team.permission.hasWritePer] + () => appId && userInfo?.team.permission.hasWritePer && showRouteToAppDetail, + [appId, userInfo?.team.permission.hasWritePer, showRouteToAppDetail] ); return ( @@ -287,7 +287,7 @@ const ChatHistorySlider = ({ confirmClearText }: { confirmClearText: string }) = {/* exec */} - {!isPc && isUserChatPage && ( + {!isPc && !!canRouteToDetail && ( import('@/components/common/folder/SelectOneResource')); @@ -22,6 +24,8 @@ const SliderApps = ({ apps, activeAppId }: { apps: AppListItemType[]; activeAppI const router = useRouter(); const isTeamChat = router.pathname === '/chat/team'; + const showRouteToAppDetail = useContextSelector(ChatItemContext, (v) => v.showRouteToAppDetail); + const getAppList = useCallback(async ({ parentId }: GetResourceFolderListProps) => { return getMyApps({ parentId, @@ -50,34 +54,36 @@ const SliderApps = ({ apps, activeAppId }: { apps: AppListItemType[]; activeAppI return ( - - {!isTeamChat && ( - router.push('/app/list')} - > - } - bg={'white'} - boxShadow={'1px 1px 9px rgba(0,0,0,0.15)'} - size={'smSquare'} - borderRadius={'50%'} - aria-label={''} - /> - {t('common:core.chat.Exit Chat')} - - )} - + {showRouteToAppDetail && ( + <> + + router.push('/app/list')} + > + } + bg={'white'} + boxShadow={'1px 1px 9px rgba(0,0,0,0.15)'} + size={'smSquare'} + borderRadius={'50%'} + aria-label={''} + /> + {t('common:core.chat.Exit Chat')} + + + + + )} {!isTeamChat && ( <> - void; -}) => { +const ToolMenu = ({ history }: { history: ChatItemType[] }) => { + const router = useRouter(); const { t } = useTranslation(); const { onExportChat } = useChatBox(); const onChangeChatId = useContextSelector(ChatContext, (v) => v.onChangeChatId); + const chatData = useContextSelector(ChatItemContext, (v) => v.chatBoxData); + const showRouteToAppDetail = useContextSelector(ChatItemContext, (v) => v.showRouteToAppDetail); - return history.length > 0 ? ( + return ( router.push(`/app/detail?appId=${chatData.appId}`) } ] } @@ -76,8 +75,6 @@ const ToolMenu = ({ : []) ]} /> - ) : ( - ); }; diff --git a/projects/app/src/pages/chat/index.tsx b/projects/app/src/pages/chat/index.tsx index e80019041..e574d0ff0 100644 --- a/projects/app/src/pages/chat/index.tsx +++ b/projects/app/src/pages/chat/index.tsx @@ -44,6 +44,7 @@ const Chat = ({ myApps }: { myApps: AppListItemType[] }) => { const theme = useTheme(); const { t } = useTranslation(); const { isPc } = useSystem(); + const { userInfo } = useUserStore(); const { setLastChatAppId, chatId, appId, outLinkAuthData } = useChatStore(); @@ -186,7 +187,6 @@ const Chat = ({ myApps }: { myApps: AppListItemType[] }) => { apps={myApps} history={chatRecords} showHistory - onRouteToAppDetail={() => router.push(`/app/detail?appId=${appId}`)} /> {/* chat box */} @@ -208,8 +208,6 @@ const Chat = ({ myApps }: { myApps: AppListItemType[] }) => { feedbackType={'user'} onStartChat={onStartChat} chatType={'chat'} - showRawSource - showNodeStatus isReady={!loading} /> )} @@ -221,8 +219,8 @@ const Chat = ({ myApps }: { myApps: AppListItemType[] }) => { ); }; -const Render = (props: { appId: string }) => { - const { appId } = props; +const Render = (props: { appId: string; isStandalone?: string }) => { + const { appId, isStandalone } = props; const { t } = useTranslation(); const { toast } = useToast(); const router = useRouter(); @@ -276,7 +274,12 @@ const Render = (props: { appId: string }) => { return source === ChatSourceEnum.online ? ( - + @@ -289,6 +292,7 @@ export async function getServerSideProps(context: any) { return { props: { appId: context?.query?.appId || '', + isStandalone: context?.query?.isStandalone || '', ...(await serviceSideProps(context, ['file', 'app', 'chat', 'workflow'])) } }; diff --git a/projects/app/src/pages/chat/share.tsx b/projects/app/src/pages/chat/share.tsx index 74f898be4..2dd85c879 100644 --- a/projects/app/src/pages/chat/share.tsx +++ b/projects/app/src/pages/chat/share.tsx @@ -55,7 +55,6 @@ type Props = { const OutLink = (props: Props) => { const { t } = useTranslation(); const router = useRouter(); - const { showRawSource, showNodeStatus } = props; const { shareId = '', showHistory = '1', @@ -287,8 +286,6 @@ const OutLink = (props: Props) => { feedbackType={'user'} onStartChat={startChat} chatType="share" - showRawSource={showRawSource} - showNodeStatus={showNodeStatus} /> )} @@ -340,7 +337,12 @@ const Render = (props: Props) => { return source === ChatSourceEnum.share ? ( - + diff --git a/projects/app/src/pages/chat/team.tsx b/projects/app/src/pages/chat/team.tsx index 5bb080de1..db0c5af31 100644 --- a/projects/app/src/pages/chat/team.tsx +++ b/projects/app/src/pages/chat/team.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect, useMemo, useState } from 'react'; +import React, { useCallback, useEffect, useMemo } from 'react'; import NextHead from '@/components/common/NextHead'; import { getTeamChatInfo } from '@/web/core/chat/api'; import { useRouter } from 'next/router'; @@ -20,8 +20,7 @@ import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import ChatContextProvider, { ChatContext } from '@/web/core/chat/context/chatContext'; import { AppListItemType } from '@fastgpt/global/core/app/type'; import { useContextSelector } from 'use-context-selector'; -import { InitChatResponse } from '@/global/core/chat/api'; -import { defaultChatData, GetChatTypeEnum } from '@/global/core/chat/constants'; +import { GetChatTypeEnum } from '@/global/core/chat/constants'; import { AppTypeEnum } from '@fastgpt/global/core/app/constants'; import { getNanoid } from '@fastgpt/global/common/string/tools'; @@ -226,8 +225,6 @@ const Chat = ({ myApps }: { myApps: AppListItemType[] }) => { feedbackType={'user'} onStartChat={startChat} chatType="team" - showRawSource - showNodeStatus /> )}
@@ -299,7 +296,12 @@ const Render = (props: Props) => { return source === ChatSourceEnum.team ? ( - + diff --git a/projects/app/src/pages/dataset/detail/components/CollectionCard/Context.tsx b/projects/app/src/pages/dataset/detail/components/CollectionCard/Context.tsx index 3ac4ea160..f43bf12bb 100644 --- a/projects/app/src/pages/dataset/detail/components/CollectionCard/Context.tsx +++ b/projects/app/src/pages/dataset/detail/components/CollectionCard/Context.tsx @@ -111,8 +111,7 @@ const CollectionPageContextProvider = ({ children }: { children: ReactNode }) => isLoading: isGetting, pageNum, pageSize - } = usePagination({ - api: getDatasetCollections, + } = usePagination(getDatasetCollections, { pageSize: 20, params: { datasetId, diff --git a/projects/app/src/pages/dataset/detail/components/Import/diffSource/APIDataset.tsx b/projects/app/src/pages/dataset/detail/components/Import/diffSource/APIDataset.tsx index e261a959a..e0cdff95c 100644 --- a/projects/app/src/pages/dataset/detail/components/Import/diffSource/APIDataset.tsx +++ b/projects/app/src/pages/dataset/detail/components/Import/diffSource/APIDataset.tsx @@ -49,7 +49,6 @@ const CustomAPIFileInput = () => { parentId: '', parentName: '' }); - const [parentUuid, setParentUuid] = useState(''); const [paths, setPaths] = useState([]); const [searchKey, setSearchKey] = useState(''); @@ -128,7 +127,7 @@ const CustomAPIFileInput = () => { const handleItemClick = useCallback( (item: APIFileItem) => { - if (item.type === 'folder') { + if (item.hasChild) { setPaths((state) => [...state, { parentId: item.id, parentName: item.name }]); return setParent({ parentId: item.id, @@ -251,6 +250,7 @@ const CustomAPIFileInput = () => { {item.name} + {item.hasChild && } ); })} diff --git a/projects/app/src/pages/dataset/list/component/List.tsx b/projects/app/src/pages/dataset/list/component/List.tsx index 709990a99..db711e176 100644 --- a/projects/app/src/pages/dataset/list/component/List.tsx +++ b/projects/app/src/pages/dataset/list/component/List.tsx @@ -28,10 +28,10 @@ import EmptyTip from '@fastgpt/web/components/common/EmptyTip'; import { useFolderDrag } from '@/components/common/folder/useFolderDrag'; import MyBox from '@fastgpt/web/components/common/MyBox'; import { useTranslation } from 'next-i18next'; -import { useUserStore } from '@/web/support/user/useUserStore'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; import SideTag from './SideTag'; import { getModelProvider } from '@fastgpt/global/core/ai/provider'; +import UserBox from '@fastgpt/web/components/common/UserBox'; const EditResourceModal = dynamic(() => import('@/components/common/Modal/EditResourceModal')); @@ -39,7 +39,6 @@ function List() { const { setLoading } = useSystemStore(); const { isPc } = useSystem(); const { t } = useTranslation(); - const { loadAndGetTeamMembers } = useUserStore(); const { loadMyDatasets, setMoveDatasetId, @@ -81,10 +80,6 @@ function List() { } }); - const { data: members = [] } = useRequest2(loadAndGetTeamMembers, { - manual: false - }); - const editPerDataset = useMemo( () => (editPerDatasetIndex !== undefined ? myDatasets[editPerDatasetIndex] : undefined), [editPerDatasetIndex, myDatasets] @@ -156,7 +151,6 @@ function List() { alignItems={'stretch'} > {formatDatasets.map((dataset, index) => { - const owner = members.find((v) => v.tmbId === dataset.tmbId); const vectorModelAvatar = getModelProvider(dataset.vectorModel.provider)?.avatar; return ( @@ -265,14 +259,12 @@ function List() { color={'myGray.500'} > - {owner && ( - - - - {owner.memberName} - - - )} + { teamId: String(app.teamId), tmbId: String(app.tmbId) }, + runningUserInfo: { + teamId: String(app.teamId), + tmbId: String(app.tmbId) + }, uid: String(app.tmbId), runtimeNodes: storeNodes2RuntimeNodes(nodes, getWorkflowEntryNodeIds(nodes)), runtimeEdges: initWorkflowEdgeStatus(edges), diff --git a/projects/app/src/types/app.d.ts b/projects/app/src/types/app.d.ts index fffc4e194..cbc9dafee 100644 --- a/projects/app/src/types/app.d.ts +++ b/projects/app/src/types/app.d.ts @@ -13,6 +13,8 @@ import type { FlowNodeTemplateType } from '@fastgpt/global/core/workflow/type/no import type { ChatSchema } from '@fastgpt/global/core/chat/type'; import type { AppSchema } from '@fastgpt/global/core/app/type'; import { ChatModelType } from '@/constants/model'; +import { TeamMemberStatusEnum } from '@fastgpt/global/support/user/team/constant'; +import { SourceMember } from '@fastgpt/global/support/user/type'; export interface ShareAppItem { _id: string; @@ -45,4 +47,5 @@ export type AppLogsListItemType = { markCount: number; outLinkUid?: string; tmbId: string; + sourceMember: SourceMember; }; diff --git a/projects/app/src/types/index.d.ts b/projects/app/src/types/index.d.ts index 228ee1df8..84dfaf634 100644 --- a/projects/app/src/types/index.d.ts +++ b/projects/app/src/types/index.d.ts @@ -10,15 +10,6 @@ import { import { TrackEventName } from '@/web/common/system/constants'; import { SubPlanType } from '@fastgpt/global/support/wallet/sub/type'; -export type PagingData = { - pageNum: number; - pageSize: number; - data: T[]; - total?: number; -}; - -export type RequestPaging = { pageNum: number; pageSize: number; [key]: any }; - declare global { var qaQueueLen: number; var vectorQueueLen: number; diff --git a/projects/app/src/web/core/app/api.ts b/projects/app/src/web/core/app/api.ts index 26675705b..d1908a48e 100644 --- a/projects/app/src/web/core/app/api.ts +++ b/projects/app/src/web/core/app/api.ts @@ -5,7 +5,7 @@ import { AppUpdateParams, AppChangeOwnerBody } from '@/global/core/app/api'; import type { CreateAppBody } from '@/pages/api/core/app/create'; import type { ListAppBody } from '@/pages/api/core/app/list'; import { AppLogsListItemType } from '@/types/app'; -import { PagingData } from '@/types'; +import { PaginationResponse } from '@fastgpt/web/common/fetch/type'; /** * 获取应用列表 @@ -39,7 +39,7 @@ export const putAppById = (id: string, data: AppUpdateParams) => // =================== chat logs export const getAppChatLogs = (data: GetAppChatLogsParams) => - POST>(`/core/app/getChatLogs`, data); + POST>(`/core/app/getChatLogs`, data); export const resumeInheritPer = (appId: string) => GET(`/core/app/resumeInheritPermission`, { appId }); diff --git a/projects/app/src/web/core/app/api/plugin.ts b/projects/app/src/web/core/app/api/plugin.ts index ed13b625e..a2353e666 100644 --- a/projects/app/src/web/core/app/api/plugin.ts +++ b/projects/app/src/web/core/app/api/plugin.ts @@ -35,7 +35,8 @@ export const getTeamPlugTemplates = (data?: ListAppBody) => intro: app.intro, showStatus: false, version: app.pluginData?.nodeVersion || defaultNodeVersion, - isTool: true + isTool: true, + sourceMember: app.sourceMember })) ); diff --git a/projects/app/src/web/core/app/api/version.ts b/projects/app/src/web/core/app/api/version.ts index 967d55bfe..daa0adb68 100644 --- a/projects/app/src/web/core/app/api/version.ts +++ b/projects/app/src/web/core/app/api/version.ts @@ -1,5 +1,5 @@ import { PostPublishAppProps } from '@/global/core/app/api'; -import { GET, POST, DELETE, PUT } from '@/web/common/api/request'; +import { GET, POST } from '@/web/common/api/request'; import type { AppVersionSchemaType } from '@fastgpt/global/core/app/version'; import { PaginationProps } from '@fastgpt/web/common/fetch/type'; import type { diff --git a/projects/app/src/web/core/chat/context/chatItemContext.tsx b/projects/app/src/web/core/chat/context/chatItemContext.tsx index 991e2e90f..633fae4d2 100644 --- a/projects/app/src/web/core/chat/context/chatItemContext.tsx +++ b/projects/app/src/web/core/chat/context/chatItemContext.tsx @@ -9,6 +9,12 @@ import { AppTypeEnum } from '@fastgpt/global/core/app/constants'; import { AppChatConfigType, VariableItemType } from '@fastgpt/global/core/app/type'; import { FlowNodeInputItemType } from '@fastgpt/global/core/workflow/type/io'; +type ContextProps = { + showRouteToAppDetail: boolean; + showRouteToDatasetDetail: boolean; + isShowReadRawSource: boolean; + showNodeStatus: boolean; +}; type ChatBoxDataType = { appId: string; title?: string; @@ -37,7 +43,7 @@ type ChatItemContextType = { chatBoxData: ChatBoxDataType; setChatBoxData: React.Dispatch>; isPlugin: boolean; -}; +} & ContextProps; export const ChatItemContext = createContext({ ChatBoxRef: null, @@ -61,7 +67,15 @@ export const ChatItemContext = createContext({ /* Chat 对象的上下文 */ -const ChatItemContextProvider = ({ children }: { children: ReactNode }) => { +const ChatItemContextProvider = ({ + children, + showRouteToAppDetail, + showRouteToDatasetDetail, + isShowReadRawSource, + showNodeStatus +}: { + children: ReactNode; +} & ContextProps) => { const ChatBoxRef = useRef(null); const variablesForm = useForm(); @@ -113,16 +127,23 @@ const ChatItemContextProvider = ({ children }: { children: ReactNode }) => { pluginRunTab, setPluginRunTab, resetVariables, - clearChatRecords + clearChatRecords, + showRouteToAppDetail, + showRouteToDatasetDetail, + isShowReadRawSource, + showNodeStatus }; }, [ chatBoxData, - setChatBoxData, - clearChatRecords, isPlugin, + variablesForm, pluginRunTab, resetVariables, - variablesForm + clearChatRecords, + showRouteToAppDetail, + showRouteToDatasetDetail, + isShowReadRawSource, + showNodeStatus ]); return {children}; diff --git a/projects/app/src/web/core/chat/context/chatRecordContext.tsx b/projects/app/src/web/core/chat/context/chatRecordContext.tsx index 16adcd193..a01c1712d 100644 --- a/projects/app/src/web/core/chat/context/chatRecordContext.tsx +++ b/projects/app/src/web/core/chat/context/chatRecordContext.tsx @@ -2,7 +2,7 @@ import { getPaginationRecordsBody } from '@/pages/api/core/chat/getPaginationRec import { ChatSiteItemType } from '@fastgpt/global/core/chat/type'; import { PaginationResponse } from '@fastgpt/web/common/fetch/type'; import { useScrollPagination } from '@fastgpt/web/hooks/useScrollPagination'; -import React, { ReactNode, useEffect, useMemo, useState } from 'react'; +import React, { ReactNode, useMemo, useState } from 'react'; import { createContext, useContextSelector } from 'use-context-selector'; import { ChatItemContext } from './chatItemContext'; import { getChatRecords } from '../api'; @@ -68,7 +68,7 @@ const ChatRecordContextProvider = ({ const res = await getChatRecords(data); // First load scroll to bottom - if (data.offset === 0) { + if (Number(data.offset) === 0) { function scrollToBottom() { requestAnimationFrame( ChatBoxRef?.current ? () => ChatBoxRef?.current?.scrollToBottom?.() : scrollToBottom diff --git a/projects/app/src/web/core/dataset/api.ts b/projects/app/src/web/core/dataset/api.ts index 5a17b7fce..ac40e1a02 100644 --- a/projects/app/src/web/core/dataset/api.ts +++ b/projects/app/src/web/core/dataset/api.ts @@ -37,7 +37,6 @@ import type { DatasetCollectionItemType } from '@fastgpt/global/core/dataset/typ import { DatasetCollectionSyncResultEnum } from '@fastgpt/global/core/dataset/constants'; import type { DatasetDataItemType } from '@fastgpt/global/core/dataset/type'; import type { DatasetCollectionsListItemType } from '@/global/core/dataset/type.d'; -import { PagingData } from '@/types'; import type { getDatasetTrainingQueueResponse } from '@/pages/api/core/dataset/training/getDatasetTrainingQueue'; import type { rebuildEmbeddingBody } from '@/pages/api/core/dataset/training/rebuildEmbedding'; import type { @@ -66,8 +65,6 @@ import type { listExistIdQuery, listExistIdResponse } from '@/pages/api/core/dataset/apiDataset/listExistId'; -import { FeishuServer, YuqueServer } from '@fastgpt/global/core/dataset/apiDataset'; -import { RequireOnlyOne } from '@fastgpt/global/common/type/utils'; /* ======================== dataset ======================= */ export const getDatasets = (data: GetDatasetListBody) => @@ -110,7 +107,7 @@ export const postSearchText = (data: SearchTestProps) => /* ============================= collections ==================================== */ export const getDatasetCollections = (data: GetDatasetCollectionsProps) => - POST>(`/core/dataset/collection/list`, data); + POST>(`/core/dataset/collection/listV2`, data); export const getDatasetCollectionPathById = (parentId: string) => GET(`/core/dataset/collection/paths`, { parentId }); export const getDatasetCollectionById = (id: string) => diff --git a/projects/app/src/web/core/dataset/components/SelectCollections.tsx b/projects/app/src/web/core/dataset/components/SelectCollections.tsx index 7b09e0e7a..5ca8b139e 100644 --- a/projects/app/src/web/core/dataset/components/SelectCollections.tsx +++ b/projects/app/src/web/core/dataset/components/SelectCollections.tsx @@ -1,7 +1,7 @@ import MyIcon from '@fastgpt/web/components/common/Icon'; import MyModal from '@fastgpt/web/components/common/MyModal'; import ParentPaths from '@/components/common/ParentPaths'; -import { useRequest } from '@fastgpt/web/hooks/useRequest'; +import { useRequest, useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { getDatasetCollectionPathById, getDatasetCollections } from '@/web/core/dataset/api'; import { Box, Flex, ModalFooter, Button, useTheme, Grid, Card, ModalBody } from '@chakra-ui/react'; import { DatasetCollectionTypeEnum } from '@fastgpt/global/core/dataset/constants'; @@ -48,20 +48,24 @@ const SelectCollections = ({ useQuery(['loadDatasetDetail', datasetId], () => loadDatasetDetail(datasetId)); - const { data, isLoading } = useQuery(['getDatasetCollections', parentId], () => - getDatasetCollections({ - datasetId, - parentId, - selectFolder: type === 'folder', - simple: true, - pageNum: 1, - pageSize: 50 - }) + const { data, loading: isLoading } = useRequest2( + () => + getDatasetCollections({ + datasetId, + parentId, + selectFolder: type === 'folder', + simple: true, + pageNum: 1, + pageSize: 50 + }), + { + manual: false, + refreshDeps: [datasetId, parentId, type] + } ); - const formatCollections = useMemo( () => - data?.data.map((collection) => { + data?.list.map((collection) => { const icon = getCollectionIcon(collection.type, collection.name); return { @@ -111,7 +115,7 @@ const SelectCollections = ({ title={ ({ + paths={paths.map((path) => ({ parentId: path.parentId, parentName: path.parentName }))} diff --git a/projects/app/src/web/core/workflow/utils.ts b/projects/app/src/web/core/workflow/utils.ts index 1d5c6f998..209b284f8 100644 --- a/projects/app/src/web/core/workflow/utils.ts +++ b/projects/app/src/web/core/workflow/utils.ts @@ -118,7 +118,7 @@ export const storeNode2FlowNode = ({ toolDescription: t(templateInput.toolDescription ?? (storeInput.toolDescription as any)), selectedTypeIndex: storeInput.selectedTypeIndex ?? templateInput.selectedTypeIndex, - value: storeInput.value ?? templateInput.value, + value: storeInput.value, valueType: storeInput.valueType ?? templateInput.valueType, label: storeInput.label ?? templateInput.label }; diff --git a/projects/app/src/web/support/activity/promotion/api.ts b/projects/app/src/web/support/activity/promotion/api.ts index b44cf67cb..abccbee88 100644 --- a/projects/app/src/web/support/activity/promotion/api.ts +++ b/projects/app/src/web/support/activity/promotion/api.ts @@ -1,6 +1,6 @@ -import { GET, POST, PUT } from '@/web/common/api/request'; +import { GET, POST } from '@/web/common/api/request'; import type { PromotionRecordType } from '@/global/support/api/userRes.d'; -import { PagingData, type RequestPaging } from '@/types'; +import { PaginationProps, PaginationResponse } from '@fastgpt/web/common/fetch/type'; /* get promotion init data */ export const getPromotionInitData = () => @@ -10,5 +10,8 @@ export const getPromotionInitData = () => }>('/proApi/support/activity/promotion/getPromotionData'); /* promotion records */ -export const getPromotionRecords = (data: RequestPaging) => - POST>(`/proApi/support/activity/promotion/getPromotions`, data); +export const getPromotionRecords = (data: PaginationProps) => + POST>( + `/proApi/support/activity/promotion/getPromotions`, + data + ); diff --git a/projects/app/src/web/support/user/api.ts b/projects/app/src/web/support/user/api.ts index 6c6e17022..b1d076d37 100644 --- a/projects/app/src/web/support/user/api.ts +++ b/projects/app/src/web/support/user/api.ts @@ -90,3 +90,5 @@ export const getCaptchaPic = (username: string) => GET<{ captchaImage: string; }>('/proApi/support/user/account/captcha/getImgCaptcha', { username }); + +export const postSyncMembers = () => POST('/proApi/support/user/team/org/sync'); diff --git a/projects/app/src/web/support/user/inform/api.ts b/projects/app/src/web/support/user/inform/api.ts index fb5d4434d..206ad2ab1 100644 --- a/projects/app/src/web/support/user/inform/api.ts +++ b/projects/app/src/web/support/user/inform/api.ts @@ -1,10 +1,10 @@ -import { GET, POST, PUT } from '@/web/common/api/request'; -import type { PagingData, RequestPaging } from '@/types'; +import { GET, POST } from '@/web/common/api/request'; import type { UserInformSchema } from '@fastgpt/global/support/user/inform/type'; import { SystemMsgModalValueType } from '@fastgpt/service/support/user/inform/type'; +import { PaginationProps, PaginationResponse } from '@fastgpt/web/common/fetch/type'; -export const getInforms = (data: RequestPaging) => - POST>(`/proApi/support/user/inform/list`, data); +export const getInforms = (data: PaginationProps) => + POST>(`/proApi/support/user/inform/list`, data); export const getUnreadCount = () => GET<{ diff --git a/projects/app/src/web/support/user/team/api.ts b/projects/app/src/web/support/user/team/api.ts index 34e5759f9..af49e4022 100644 --- a/projects/app/src/web/support/user/team/api.ts +++ b/projects/app/src/web/support/user/team/api.ts @@ -19,6 +19,7 @@ import { } from '@fastgpt/global/support/user/team/type.d'; import { FeTeamPlanStatusType, TeamSubSchema } from '@fastgpt/global/support/wallet/sub/type'; import { TeamInvoiceHeaderType } from '@fastgpt/global/support/user/team/type'; +import { PaginationProps, PaginationResponse } from '@fastgpt/web/common/fetch/type'; /* --------------- team ---------------- */ export const getTeamList = (status: `${TeamMemberSchema['status']}`) => @@ -30,8 +31,8 @@ export const putSwitchTeam = (teamId: string) => PUT(`/proApi/support/user/team/switch`, { teamId }); /* --------------- team member ---------------- */ -export const getTeamMembers = () => - GET(`/proApi/support/user/team/member/list`); +export const getTeamMembers = (props: PaginationProps) => + GET>(`/proApi/support/user/team/member/list`, props); export const postInviteTeamMember = (data: InviteMemberProps) => POST(`/proApi/support/user/team/member/invite`, data); export const putUpdateMemberName = (name: string) => diff --git a/projects/app/src/web/support/user/useUserStore.ts b/projects/app/src/web/support/user/useUserStore.ts index 040e17556..6bb30d135 100644 --- a/projects/app/src/web/support/user/useUserStore.ts +++ b/projects/app/src/web/support/user/useUserStore.ts @@ -30,9 +30,6 @@ type State = { teamPlanStatus: FeTeamPlanStatusType | null; initTeamPlanStatus: () => Promise; - teamMembers: TeamMemberItemType[]; - loadAndGetTeamMembers: (init?: boolean) => Promise; - teamMemberGroups: MemberGroupListType; myGroups: MemberGroupListType; loadAndGetGroups: (init?: boolean) => Promise; @@ -102,7 +99,7 @@ export const useUserStore = create()( }, // team teamPlanStatus: null, - initTeamPlanStatus() { + async initTeamPlanStatus() { return getTeamPlanStatus().then((res) => { set((state) => { state.teamPlanStatus = res; @@ -110,21 +107,6 @@ export const useUserStore = create()( return res; }); }, - teamMembers: [], - loadAndGetTeamMembers: async (init = false) => { - if (!useSystemStore.getState()?.feConfigs?.isPlus) return []; - - const randomRefresh = Math.random() > 0.7; - if (!randomRefresh && !init && get().teamMembers?.length) - return Promise.resolve(get().teamMembers); - - const res = await getTeamMembers(); - set((state) => { - state.teamMembers = res; - }); - - return res; - }, teamMemberGroups: [], teamOrgs: [], myGroups: [], diff --git a/projects/app/src/web/support/wallet/bill/api.ts b/projects/app/src/web/support/wallet/bill/api.ts index a04de528c..3058340b3 100644 --- a/projects/app/src/web/support/wallet/bill/api.ts +++ b/projects/app/src/web/support/wallet/bill/api.ts @@ -1,14 +1,14 @@ -import { PagingData, RequestPaging } from '@/types'; import { GET, POST } from '@/web/common/api/request'; import { CreateBillProps, CreateBillResponse } from '@fastgpt/global/support/wallet/bill/api'; import { BillTypeEnum } from '@fastgpt/global/support/wallet/bill/constants'; import type { BillSchemaType } from '@fastgpt/global/support/wallet/bill/type.d'; +import { PaginationProps, PaginationResponse } from '@fastgpt/web/common/fetch/type'; export const getBills = ( - data: RequestPaging & { + data: PaginationProps<{ type?: BillTypeEnum; - } -) => POST>(`/proApi/support/wallet/bill/list`, data); + }> +) => POST>(`/proApi/support/wallet/bill/list`, data); export const getWxPayQRCode = (data: CreateBillProps) => POST(`/proApi/support/wallet/bill/create`, data); diff --git a/projects/app/src/web/support/wallet/bill/invoice/api.ts b/projects/app/src/web/support/wallet/bill/invoice/api.ts index 7ec7772e8..c5523e8d8 100644 --- a/projects/app/src/web/support/wallet/bill/invoice/api.ts +++ b/projects/app/src/web/support/wallet/bill/invoice/api.ts @@ -1,8 +1,8 @@ -import { PagingData, RequestPaging } from '@/types'; import { GET, POST } from '@/web/common/api/request'; import { BillTypeEnum } from '@fastgpt/global/support/wallet/bill/constants'; import { InvoiceType } from '@fastgpt/global/support/wallet/bill/type'; import { InvoiceSchemaType } from '@fastgpt/global/support/wallet/bill/type'; +import { PaginationProps, PaginationResponse } from '@fastgpt/web/common/fetch/type'; export type invoiceBillDataType = { type: BillTypeEnum; price: number; @@ -16,5 +16,5 @@ export const getInvoiceBillsList = () => export const submitInvoice = (data: InvoiceType) => POST(`/proApi/support/wallet/bill/invoice/submit`, data); -export const getInvoiceRecords = (data: RequestPaging) => - POST>(`/proApi/support/wallet/bill/invoice/records`, data); +export const getInvoiceRecords = (data: PaginationProps) => + POST>(`/proApi/support/wallet/bill/invoice/records`, data); diff --git a/projects/app/src/web/support/wallet/usage/api.ts b/projects/app/src/web/support/wallet/usage/api.ts index 41b32be3d..c4ce4171a 100644 --- a/projects/app/src/web/support/wallet/usage/api.ts +++ b/projects/app/src/web/support/wallet/usage/api.ts @@ -1,10 +1,17 @@ -import { GET, POST } from '@/web/common/api/request'; +import { POST } from '@/web/common/api/request'; import { CreateTrainingUsageProps } from '@fastgpt/global/support/wallet/usage/api.d'; -import type { PagingData, RequestPaging } from '@/types'; +import { UsageSourceEnum } from '@fastgpt/global/support/wallet/usage/constants'; import type { UsageItemType } from '@fastgpt/global/support/wallet/usage/type'; +import { PaginationProps, PaginationResponse } from '@fastgpt/web/common/fetch/type'; -export const getUserUsages = (data: RequestPaging) => - POST>(`/proApi/support/wallet/usage/getUsage`, data); +export const getUserUsages = ( + data: PaginationProps<{ + dateStart: Date; + dateEnd: Date; + source?: UsageSourceEnum; + teamMemberId: string; + }> +) => POST>(`/proApi/support/wallet/usage/getUsage`, data); export const postCreateTrainingUsage = (data: CreateTrainingUsageProps) => POST(`/support/wallet/usage/createTrainingUsage`, data);