cx-chat 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/dist/cx-chat.css +1 -0
  2. package/dist/cx-chat.es.js +68257 -0
  3. package/dist/cx-chat.umd.js +492 -0
  4. package/package.json +27 -3
  5. package/.cursor/rules/i18n-cn-gloss-comments.mdc +0 -31
  6. package/.cursor/rules/list-page-view-pageconfig.mdc +0 -32
  7. package/.cursor/rules/no-over-defensive-programming.mdc +0 -90
  8. package/.cursor/rules/requirement-description-for-agent.mdc +0 -33
  9. package/.cursor/rules/use-showToast-not-antd-message.mdc +0 -28
  10. package/.docker/Dockerfile +0 -7
  11. package/.env +0 -9
  12. package/.env.development +0 -7
  13. package/.env.production +0 -7
  14. package/.gitlab-ci/docker-build.yaml +0 -28
  15. package/.gitlab-ci/k8s-deploy-dev-master.yaml +0 -42
  16. package/.gitlab-ci/npm-build.yaml +0 -17
  17. package/.gitlab-ci.yml +0 -8
  18. package/.k8s/0-namespace.yaml +0 -6
  19. package/.k8s/1-configmap-web.yaml +0 -7
  20. package/.k8s/1-nginx-conf-dev.yaml +0 -110
  21. package/.k8s/2-deployment.yaml +0 -27
  22. package/.k8s/3-service.yaml +0 -16
  23. package/.k8s/4-ingress-dev.yaml +0 -30
  24. package/.lingma/rules/use-showToast-not-antd-message.md +0 -34
  25. package/.nginx/nginx.conf +0 -52
  26. package/.prettierrc +0 -9
  27. package/eslint.config.js +0 -32
  28. package/index.html +0 -13
  29. package/postcss.config.js +0 -6
  30. package/src/App.tsx +0 -96
  31. package/src/_doc/0.docs-overview.md +0 -28
  32. package/src/_doc/cx-ui/0.docs-overview.md +0 -30
  33. package/src/_doc/cx-ui/comp.1.cx-ui-overview.md +0 -82
  34. package/src/_doc/cx-ui/comp.2.cx-modal.md +0 -82
  35. package/src/_doc/cx-ui/comp.3.cx-button.md +0 -89
  36. package/src/_doc/cx-ui/comp.4.cx-form.md +0 -72
  37. package/src/_doc/cx-ui/comp.5.cx-fields.md +0 -76
  38. package/src/_doc/cx-ui/comp.6.cx-tag.md +0 -57
  39. package/src/_doc/cx-ui/comp.7.cx-empty-state.md +0 -29
  40. package/src/_doc/meta/0.docs-overview.md +0 -24
  41. package/src/_doc/meta/comp.1.enum-runtime.md +0 -33
  42. package/src/_doc/meta/comp.2.dict-runtime.md +0 -39
  43. package/src/_doc/router/0.docs-overview.md +0 -14
  44. package/src/_doc/router/guide.1.menu-component-config.md +0 -181
  45. package/src/_doc/router/guide.2.router-auto-registration.md +0 -114
  46. package/src/_doc/table-view/0.docs-overview.md +0 -30
  47. package/src/_doc/table-view/comp.1.table-view.md +0 -542
  48. package/src/_doc/table-view/props.1.create-table-view-config.md +0 -193
  49. package/src/_doc/table-view/props.2.table-view-search-fields.md +0 -106
  50. package/src/api/_mock/README.md +0 -340
  51. package/src/api/_mock/api.ts +0 -1642
  52. package/src/api/_mock/bundle-shim.ts +0 -16
  53. package/src/api/_mock/handler-shim.ts +0 -6
  54. package/src/api/_mock/handler.ts +0 -458
  55. package/src/api/_mock/index.ts +0 -711
  56. package/src/api/_mock/interceptor.ts +0 -15
  57. package/src/api/_mock/mod.ts +0 -12
  58. package/src/api/_mock/utils.ts +0 -65
  59. package/src/api/base/memory.js +0 -24
  60. package/src/api/chat.js +0 -210
  61. package/src/api/common/auth.js +0 -70
  62. package/src/api/menus/business-rules.js +0 -76
  63. package/src/api/menus/feedback.js +0 -102
  64. package/src/api/menus/knowledge.js +0 -159
  65. package/src/api/menus/model-metadata/manage.js +0 -70
  66. package/src/api/menus/model-metadata/role.js +0 -50
  67. package/src/api/menus/model-metadata/training-detail-mock-data.js +0 -569
  68. package/src/api/menus/model-metadata/training.js +0 -28
  69. package/src/api/menus/skill.js +0 -40
  70. package/src/api/system/agent-config.js +0 -16
  71. package/src/api/system/department.js +0 -94
  72. package/src/api/system/dict.js +0 -86
  73. package/src/api/system/menu.js +0 -37
  74. package/src/api/system/permission.js +0 -26
  75. package/src/api/system/role.js +0 -34
  76. package/src/api/system/sys-config.js +0 -16
  77. package/src/api/system/sys-log.js +0 -17
  78. package/src/api/system/user.js +0 -75
  79. package/src/api/upload.js +0 -39
  80. package/src/assets/react.svg +0 -1
  81. package/src/components/auth/current-user-avatar.tsx +0 -77
  82. package/src/components/common/code-view.tsx +0 -149
  83. package/src/components/common/detail-link.tsx +0 -67
  84. package/src/components/common/error-boundary.tsx +0 -98
  85. package/src/components/common/language-switcher.tsx +0 -91
  86. package/src/components/common/lite-table/index.tsx +0 -135
  87. package/src/components/common/md-editor.tsx +0 -126
  88. package/src/components/common/modal/confirm-dialog.tsx +0 -113
  89. package/src/components/common/modal/dep-user-select-multi.tsx +0 -324
  90. package/src/components/common/modal/dep-user-select.tsx +0 -249
  91. package/src/components/common/modal/user-select-multi.tsx +0 -266
  92. package/src/components/common/pagination.tsx +0 -472
  93. package/src/components/common/path.tsx +0 -175
  94. package/src/components/common/system-logo-mark.tsx +0 -48
  95. package/src/components/cx-ui/button/index.less +0 -208
  96. package/src/components/cx-ui/button/index.tsx +0 -611
  97. package/src/components/cx-ui/checkbox/index.tsx +0 -78
  98. package/src/components/cx-ui/date-picker/index.less +0 -17
  99. package/src/components/cx-ui/date-picker/index.tsx +0 -193
  100. package/src/components/cx-ui/drawer/index.tsx +0 -47
  101. package/src/components/cx-ui/empty-state/index.tsx +0 -20
  102. package/src/components/cx-ui/floating-shell/CxFloatingShell.tsx +0 -89
  103. package/src/components/cx-ui/floating-shell/cx-floating-shell.less +0 -283
  104. package/src/components/cx-ui/floating-shell/has-floating-value.ts +0 -41
  105. package/src/components/cx-ui/form/CxForm.tsx +0 -15
  106. package/src/components/cx-ui/form/index.tsx +0 -20
  107. package/src/components/cx-ui/form-item/index.less +0 -26
  108. package/src/components/cx-ui/form-item/index.tsx +0 -36
  109. package/src/components/cx-ui/index.ts +0 -70
  110. package/src/components/cx-ui/input/auto-complete.tsx +0 -134
  111. package/src/components/cx-ui/input/index.tsx +0 -259
  112. package/src/components/cx-ui/input-number/index.jsx +0 -66
  113. package/src/components/cx-ui/modal/index.jsx +0 -212
  114. package/src/components/cx-ui/modal/index.less +0 -144
  115. package/src/components/cx-ui/modal/useCxModal.ts +0 -125
  116. package/src/components/cx-ui/multi-select/index.jsx +0 -74
  117. package/src/components/cx-ui/multi-select/index.less +0 -40
  118. package/src/components/cx-ui/multi-select/index2.tsx +0 -361
  119. package/src/components/cx-ui/radio/index.tsx +0 -33
  120. package/src/components/cx-ui/range-picker/index.less +0 -65
  121. package/src/components/cx-ui/range-picker/index.tsx +0 -219
  122. package/src/components/cx-ui/select/index.less +0 -34
  123. package/src/components/cx-ui/select/index.tsx +0 -196
  124. package/src/components/cx-ui/skeleton/index.tsx +0 -12
  125. package/src/components/cx-ui/steps/index.tsx +0 -14
  126. package/src/components/cx-ui/styles/_tokens.less +0 -79
  127. package/src/components/cx-ui/styles/index.less +0 -246
  128. package/src/components/cx-ui/switch/index.less +0 -106
  129. package/src/components/cx-ui/switch/index.tsx +0 -120
  130. package/src/components/cx-ui/table/index.less +0 -160
  131. package/src/components/cx-ui/table/index.tsx +0 -152
  132. package/src/components/cx-ui/tabs/index.less +0 -15
  133. package/src/components/cx-ui/tabs/index.tsx +0 -34
  134. package/src/components/cx-ui/tag/index.less +0 -51
  135. package/src/components/cx-ui/tag/index.tsx +0 -140
  136. package/src/components/cx-ui/timeline/index.tsx +0 -14
  137. package/src/components/cx-ui/tooltip/index.tsx +0 -67
  138. package/src/components/cx-ui/tree/index.tsx +0 -193
  139. package/src/components/cx-ui/tree-select/index.jsx +0 -91
  140. package/src/components/cx-ui/tree-select/index.less +0 -27
  141. package/src/components/cx-ui/upload-file/index.less +0 -223
  142. package/src/components/cx-ui/upload-file/index.tsx +0 -640
  143. package/src/components/cx-ui/upload-img/index.tsx +0 -291
  144. package/src/components/layout/components/Header.tsx +0 -216
  145. package/src/components/layout/components/Sidebar.tsx +0 -717
  146. package/src/components/layout/index.tsx +0 -95
  147. package/src/components/table-view/components/search-area.tsx +0 -411
  148. package/src/components/table-view/components/table-view-config.tsx +0 -528
  149. package/src/components/table-view/components/table-view.types.ts +0 -478
  150. package/src/components/table-view/components/tree-api-normalize.ts +0 -38
  151. package/src/components/table-view/components/tree-data-annotate.ts +0 -31
  152. package/src/components/table-view/components/tree-sidebar.tsx +0 -74
  153. package/src/components/table-view/index.tsx +0 -61
  154. package/src/components/table-view/list-page-view.tsx +0 -1049
  155. package/src/components/table-view/select-table-view.tsx +0 -1094
  156. package/src/components/table-view/styles/select-table-view.less +0 -51
  157. package/src/config/default-system-name.ts +0 -9
  158. package/src/config/system.ts +0 -165
  159. package/src/constants/countryCodes.ts +0 -3
  160. package/src/contexts/AuthContext.tsx +0 -256
  161. package/src/contexts/ChatContext.tsx +0 -839
  162. package/src/contexts/MenuContext.tsx +0 -62
  163. package/src/contexts/ToastContext.tsx +0 -181
  164. package/src/hooks/useCopyToClipboard.ts +0 -47
  165. package/src/hooks/useModalSubmit.ts +0 -104
  166. package/src/hooks/useRouter.ts +0 -240
  167. package/src/hooks/useStepForm.ts +0 -46
  168. package/src/hooks/useStickyHeader.ts +0 -42
  169. package/src/hooks/useThreadActions.ts +0 -105
  170. package/src/hooks/useUserPreferences.ts +0 -101
  171. package/src/http/axios.js +0 -372
  172. package/src/http/mock.interceptor.ts +0 -9
  173. package/src/http/obfuscationKey.ts +0 -41
  174. package/src/i18n.ts +0 -60
  175. package/src/index.js +0 -1
  176. package/src/index.less +0 -169
  177. package/src/locales/en/auth.ts +0 -70
  178. package/src/locales/en/base/memory.ts +0 -28
  179. package/src/locales/en/base/settings.ts +0 -41
  180. package/src/locales/en/chat.ts +0 -40
  181. package/src/locales/en/common.ts +0 -173
  182. package/src/locales/en/enum.ts +0 -27
  183. package/src/locales/en/menus/business-rules.ts +0 -48
  184. package/src/locales/en/menus/feedback.ts +0 -62
  185. package/src/locales/en/menus/knowledge.ts +0 -120
  186. package/src/locales/en/menus/model-metadata/index.ts +0 -10
  187. package/src/locales/en/menus/model-metadata/manage.ts +0 -151
  188. package/src/locales/en/menus/model-metadata/role.ts +0 -48
  189. package/src/locales/en/menus/model-metadata/training.ts +0 -65
  190. package/src/locales/en/menus/skill.ts +0 -34
  191. package/src/locales/en/system/agent-config.ts +0 -34
  192. package/src/locales/en/system/department.ts +0 -68
  193. package/src/locales/en/system/dict.ts +0 -44
  194. package/src/locales/en/system/menu.ts +0 -45
  195. package/src/locales/en/system/permission.ts +0 -89
  196. package/src/locales/en/system/role.ts +0 -25
  197. package/src/locales/en/system/sys-config.ts +0 -33
  198. package/src/locales/en/system/sys-log.ts +0 -38
  199. package/src/locales/en/system/user.ts +0 -113
  200. package/src/locales/en.ts +0 -68
  201. package/src/locales/zh/auth.ts +0 -70
  202. package/src/locales/zh/base/memory.ts +0 -29
  203. package/src/locales/zh/base/settings.ts +0 -41
  204. package/src/locales/zh/chat.ts +0 -47
  205. package/src/locales/zh/common.ts +0 -178
  206. package/src/locales/zh/enum.ts +0 -28
  207. package/src/locales/zh/menus/business-rules.ts +0 -47
  208. package/src/locales/zh/menus/feedback.ts +0 -62
  209. package/src/locales/zh/menus/knowledge.ts +0 -117
  210. package/src/locales/zh/menus/model-metadata/index.ts +0 -10
  211. package/src/locales/zh/menus/model-metadata/manage.ts +0 -151
  212. package/src/locales/zh/menus/model-metadata/role.ts +0 -47
  213. package/src/locales/zh/menus/model-metadata/training.ts +0 -64
  214. package/src/locales/zh/menus/skill.ts +0 -34
  215. package/src/locales/zh/system/agent-config.ts +0 -33
  216. package/src/locales/zh/system/department.ts +0 -69
  217. package/src/locales/zh/system/dict.ts +0 -44
  218. package/src/locales/zh/system/menu.ts +0 -47
  219. package/src/locales/zh/system/permission.ts +0 -94
  220. package/src/locales/zh/system/role.ts +0 -25
  221. package/src/locales/zh/system/sys-config.ts +0 -32
  222. package/src/locales/zh/system/sys-log.ts +0 -38
  223. package/src/locales/zh/system/user.ts +0 -114
  224. package/src/locales/zh.ts +0 -67
  225. package/src/main.tsx +0 -50
  226. package/src/meta/const/index.ts +0 -40
  227. package/src/meta/index-dict.ts +0 -56
  228. package/src/meta/index-enum.ts +0 -95
  229. package/src/meta/index.ts +0 -14
  230. package/src/meta/module/dict-data/runtime.ts +0 -199
  231. package/src/meta/module/dict-data/types.ts +0 -17
  232. package/src/meta/module/enum-data/runtime.ts +0 -75
  233. package/src/meta/module/enum-data/types.ts +0 -18
  234. package/src/router/index.tsx +0 -312
  235. package/src/styles/AntdThemeProvider.tsx +0 -40
  236. package/src/styles/antd-theme.ts +0 -20
  237. package/src/styles/global.less +0 -107
  238. package/src/styles/variable.less +0 -103
  239. package/src/types/feedback.ts +0 -43
  240. package/src/types/index.ts +0 -85
  241. package/src/types/menu.ts +0 -43
  242. package/src/utils/aesUtil.ts +0 -123
  243. package/src/utils/chatUtils.ts +0 -524
  244. package/src/utils/cn.ts +0 -6
  245. package/src/utils/crypto.ts +0 -164
  246. package/src/utils/date.ts +0 -72
  247. package/src/utils/file-icons.tsx +0 -79
  248. package/src/utils/index.ts +0 -168
  249. package/src/utils/markdown-math-plugins.ts +0 -21
  250. package/src/utils/menuI18n.ts +0 -305
  251. package/src/utils/menuRouteRegistry.ts +0 -78
  252. package/src/utils/permission-crud.ts +0 -147
  253. package/src/utils/routeConfig.ts +0 -350
  254. package/src/utils/storage.ts +0 -135
  255. package/src/utils/toastBridge.ts +0 -26
  256. package/src/utils/url.ts +0 -38
  257. package/src/utils/validation.ts +0 -16
  258. package/src/views/auth/auth-code/index.less +0 -169
  259. package/src/views/auth/auth-code/index.module.less +0 -174
  260. package/src/views/auth/auth-code/index.tsx +0 -233
  261. package/src/views/auth/login.tsx +0 -498
  262. package/src/views/auth/register.tsx +0 -388
  263. package/src/views/base/memory/index.tsx +0 -136
  264. package/src/views/base/memory/modal/detail-modal.tsx +0 -89
  265. package/src/views/base/memory/modal/submit-modal.tsx +0 -134
  266. package/src/views/base/settings/index.tsx +0 -657
  267. package/src/views/chat/chat.less +0 -323
  268. package/src/views/chat/components/chat-input.tsx +0 -298
  269. package/src/views/chat/components/header-thread-title.tsx +0 -210
  270. package/src/views/chat/components/message-list/content-answer.tsx +0 -100
  271. package/src/views/chat/components/message-list/content-question.tsx +0 -18
  272. package/src/views/chat/components/message-list/index.tsx +0 -520
  273. package/src/views/chat/components/message-list/message-item.tsx +0 -199
  274. package/src/views/chat/components/message-list/preparation-demo-items.ts +0 -147
  275. package/src/views/chat/components/message-list/preparation-steps.tsx +0 -506
  276. package/src/views/chat/components/message-list/suggestion-list.tsx +0 -36
  277. package/src/views/chat/components/message-list/thinking-process.tsx +0 -49
  278. package/src/views/chat/components/message-list/toolbar.tsx +0 -224
  279. package/src/views/chat/components/message-list/use-message-list-scroll.ts +0 -214
  280. package/src/views/chat/components/references-knowledge/context.tsx +0 -57
  281. package/src/views/chat/components/references-knowledge/index.ts +0 -9
  282. package/src/views/chat/components/references-knowledge/modal/knowledge-detail-drawer.tsx +0 -556
  283. package/src/views/chat/components/references-knowledge/modal/knowledge-doc-detail-drawer.tsx +0 -529
  284. package/src/views/chat/components/references-knowledge/panel.tsx +0 -115
  285. package/src/views/chat/hooks/use-chat-common.ts +0 -19
  286. package/src/views/chat/index-session.tsx +0 -647
  287. package/src/views/chat/index.tsx +0 -127
  288. package/src/views/page-error/401.tsx +0 -56
  289. package/src/views/page-error/404.tsx +0 -56
  290. package/src/views/page-menus/business-rules/index.tsx +0 -376
  291. package/src/views/page-menus/business-rules/modal/detail-modal.tsx +0 -186
  292. package/src/views/page-menus/business-rules/modal/scope-modal.tsx +0 -272
  293. package/src/views/page-menus/business-rules/modal/submit-modal.tsx +0 -142
  294. package/src/views/page-menus/feedback/components/feedback-dataset-list.tsx +0 -471
  295. package/src/views/page-menus/feedback/index.tsx +0 -166
  296. package/src/views/page-menus/feedback/modal/export-feedback-modal.tsx +0 -367
  297. package/src/views/page-menus/knowledge/components/doc-editor-by-type.tsx +0 -32
  298. package/src/views/page-menus/knowledge/components/doc-editor-type-file.tsx +0 -330
  299. package/src/views/page-menus/knowledge/detail.tsx +0 -600
  300. package/src/views/page-menus/knowledge/index.tsx +0 -337
  301. package/src/views/page-menus/knowledge/modal/detail-modal.tsx +0 -618
  302. package/src/views/page-menus/knowledge/modal/doc-detail-modal.tsx +0 -550
  303. package/src/views/page-menus/knowledge/modal/doc-parse.ts +0 -99
  304. package/src/views/page-menus/knowledge/modal/doc-submit-modal.tsx +0 -349
  305. package/src/views/page-menus/knowledge/modal/doc-type-picker-modal.tsx +0 -88
  306. package/src/views/page-menus/knowledge/modal/knowledge-user-select-modal.tsx +0 -283
  307. package/src/views/page-menus/knowledge/modal/submit-modal.tsx +0 -179
  308. package/src/views/page-menus/model-metadata/manage/components/metadata-detail-schema-tab.tsx +0 -114
  309. package/src/views/page-menus/model-metadata/manage/components/step1-basic-info.tsx +0 -232
  310. package/src/views/page-menus/model-metadata/manage/components/step2-schema.tsx +0 -316
  311. package/src/views/page-menus/model-metadata/manage/components/step3-permissions.tsx +0 -134
  312. package/src/views/page-menus/model-metadata/manage/components/step4-documents.tsx +0 -134
  313. package/src/views/page-menus/model-metadata/manage/components/step5-example-sql.tsx +0 -101
  314. package/src/views/page-menus/model-metadata/manage/components/submit-add.tsx +0 -338
  315. package/src/views/page-menus/model-metadata/manage/components/submit-edit.tsx +0 -276
  316. package/src/views/page-menus/model-metadata/manage/detail.tsx +0 -298
  317. package/src/views/page-menus/model-metadata/manage/hooks/model-metadata-submit-shared.ts +0 -113
  318. package/src/views/page-menus/model-metadata/manage/hooks/use-model-metadata-item-state.ts +0 -20
  319. package/src/views/page-menus/model-metadata/manage/index.tsx +0 -304
  320. package/src/views/page-menus/model-metadata/manage/modal/components/table-schema.ts +0 -374
  321. package/src/views/page-menus/model-metadata/manage/modal/components/use-table-detail-tabs.tsx +0 -151
  322. package/src/views/page-menus/model-metadata/manage/modal/components/use-table-submit-tabs.tsx +0 -423
  323. package/src/views/page-menus/model-metadata/manage/modal/detail-modal.tsx +0 -218
  324. package/src/views/page-menus/model-metadata/manage/modal/submit-modal.tsx +0 -261
  325. package/src/views/page-menus/model-metadata/manage/modal/table-detail-modal.tsx +0 -196
  326. package/src/views/page-menus/model-metadata/manage/modal/table-submit-modal.tsx +0 -229
  327. package/src/views/page-menus/model-metadata/manage/submit.tsx +0 -31
  328. package/src/views/page-menus/model-metadata/role/index.tsx +0 -207
  329. package/src/views/page-menus/model-metadata/role/modal/detail-modal.tsx +0 -97
  330. package/src/views/page-menus/model-metadata/role/modal/role-assign-users-modal.tsx +0 -254
  331. package/src/views/page-menus/model-metadata/role/modal/role-assign-users-panel.tsx +0 -393
  332. package/src/views/page-menus/model-metadata/role/modal/role-assign-users-utils.ts +0 -120
  333. package/src/views/page-menus/model-metadata/role/modal/role-permission-assign-panel.tsx +0 -698
  334. package/src/views/page-menus/model-metadata/role/modal/role-permission-modal.tsx +0 -237
  335. package/src/views/page-menus/model-metadata/role/modal/submit-modal.tsx +0 -135
  336. package/src/views/page-menus/model-metadata/training/components/detail-records/index.ts +0 -4
  337. package/src/views/page-menus/model-metadata/training/components/detail-records/node-card.tsx +0 -72
  338. package/src/views/page-menus/model-metadata/training/components/detail-records/summary-lines.ts +0 -196
  339. package/src/views/page-menus/model-metadata/training/components/detail-records/summary-list.tsx +0 -153
  340. package/src/views/page-menus/model-metadata/training/components/detail-records/timeline.tsx +0 -103
  341. package/src/views/page-menus/model-metadata/training/components/detail-records/types.ts +0 -82
  342. package/src/views/page-menus/model-metadata/training/detail.tsx +0 -159
  343. package/src/views/page-menus/model-metadata/training/index.tsx +0 -236
  344. package/src/views/page-menus/model-metadata/training/modal/update-detail-modal.tsx +0 -154
  345. package/src/views/page-menus/skill/index.tsx +0 -201
  346. package/src/views/page-menus/skill/modal/detail-modal.tsx +0 -156
  347. package/src/views/page-menus/skill/modal/submit-modal.tsx +0 -214
  348. package/src/views/page-system/agent-config/index.tsx +0 -370
  349. package/src/views/page-system/department/departmentFormShared.ts +0 -36
  350. package/src/views/page-system/department/index.tsx +0 -541
  351. package/src/views/page-system/department/modal/detail-modal.tsx +0 -94
  352. package/src/views/page-system/department/modal/member-role-modal.tsx +0 -128
  353. package/src/views/page-system/department/modal/submit-modal.tsx +0 -265
  354. package/src/views/page-system/dict/index.tsx +0 -440
  355. package/src/views/page-system/dict/modal/cate-submit-modal.tsx +0 -315
  356. package/src/views/page-system/dict/modal/submit-modal.tsx +0 -184
  357. package/src/views/page-system/logs/components/index.ts +0 -3
  358. package/src/views/page-system/logs/components/log-message-demo.tsx +0 -30
  359. package/src/views/page-system/logs/components/log-message-stream.ts +0 -184
  360. package/src/views/page-system/logs/components/message-list/content-answer.tsx +0 -100
  361. package/src/views/page-system/logs/components/message-list/content-question.tsx +0 -18
  362. package/src/views/page-system/logs/components/message-list/index.tsx +0 -515
  363. package/src/views/page-system/logs/components/message-list/message-item.tsx +0 -193
  364. package/src/views/page-system/logs/components/message-list/preparation-demo-items.ts +0 -147
  365. package/src/views/page-system/logs/components/message-list/preparation-steps.tsx +0 -506
  366. package/src/views/page-system/logs/components/message-list/suggestion-list.tsx +0 -36
  367. package/src/views/page-system/logs/components/message-list/thinking-process.tsx +0 -49
  368. package/src/views/page-system/logs/components/message-list/toolbar.tsx +0 -134
  369. package/src/views/page-system/logs/components/message-list/use-message-list-scroll.ts +0 -214
  370. package/src/views/page-system/logs/components/message-modal.tsx +0 -239
  371. package/src/views/page-system/logs/index.tsx +0 -132
  372. package/src/views/page-system/logs/modal/detail-modal.tsx +0 -157
  373. package/src/views/page-system/menu/components/menuFormShared.ts +0 -283
  374. package/src/views/page-system/menu/index.less +0 -12
  375. package/src/views/page-system/menu/index.tsx +0 -410
  376. package/src/views/page-system/menu/modal/icon-modal.less +0 -51
  377. package/src/views/page-system/menu/modal/icon-modal.tsx +0 -87
  378. package/src/views/page-system/menu/modal/submit-modal.tsx +0 -263
  379. package/src/views/page-system/permission/index.tsx +0 -562
  380. package/src/views/page-system/permission/modal/detail-modal.tsx +0 -179
  381. package/src/views/page-system/permission/modal/submit-modal.less +0 -146
  382. package/src/views/page-system/permission/modal/submit-modal.tsx +0 -650
  383. package/src/views/page-system/role/index.tsx +0 -163
  384. package/src/views/page-system/role/modal/detail-modal.tsx +0 -127
  385. package/src/views/page-system/role/modal/permission-assign-group-rules.ts +0 -86
  386. package/src/views/page-system/role/modal/permission-modal.tsx +0 -111
  387. package/src/views/page-system/role/modal/role-modal-shell-styles.ts +0 -21
  388. package/src/views/page-system/role/modal/role-permission-assign-panel.tsx +0 -916
  389. package/src/views/page-system/role/modal/role-permission-assign-shared.ts +0 -1047
  390. package/src/views/page-system/role/modal/submit-modal.tsx +0 -193
  391. package/src/views/page-system/sys-config/index.tsx +0 -294
  392. package/src/views/page-system/user/components/user-role-column.tsx +0 -87
  393. package/src/views/page-system/user/index.tsx +0 -439
  394. package/src/views/page-system/user/modal/assign-roles-modal.tsx +0 -389
  395. package/src/views/page-system/user/modal/detail-modal.tsx +0 -72
  396. package/src/views/page-system/user/modal/modal-style/submit-modal.less +0 -40
  397. package/src/views/page-system/user/modal/submit-modal.less +0 -40
  398. package/src/views/page-system/user/modal/submit-modal.tsx +0 -287
  399. package/src/views/page-system/user/userFormShared.ts +0 -51
  400. package/tailwind.config.js +0 -17
  401. package/tsconfig.app.json +0 -48
  402. package/tsconfig.json +0 -11
  403. package/tsconfig.node.json +0 -26
  404. package/vite.config.ts +0 -272
  405. /package/{public → dist}/favicon.ico +0 -0
  406. /package/{public → dist}/vite.svg +0 -0
@@ -1,472 +0,0 @@
1
- import React from 'react';
2
- import { useTranslation } from 'react-i18next';
3
- import clsx from 'clsx';
4
- import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from 'lucide-react';
5
- import CxSelect from '@/components/cx-ui/select';
6
-
7
- interface PaginationProps {
8
- /** Current page (0-indexed by default, see zeroIndexed prop) */
9
- page: number;
10
- /** Total number of items */
11
- total: number;
12
- /** Items per page */
13
- pageSize: number;
14
- /** Callback when page changes */
15
- onPageChange: (page: number) => void;
16
- /** Available page size options */
17
- pageSizeOptions?: number[];
18
- /** Callback when page size changes */
19
- onPageSizeChange?: (size: number) => void;
20
- /** Whether to show stats ("Showing X-Y of Z") */
21
- showStats?: boolean;
22
- /** Whether to show page size selector */
23
- showSizeChanger?: boolean;
24
- /** Whether to show first/last page buttons */
25
- showFirstLast?: boolean;
26
- /** Maximum number of page buttons to show (default: 7) */
27
- maxPageButtons?: number;
28
- /** Layout variant */
29
- variant?: 'spread' | 'compact' | 'simple' | 'slice';
30
- /** Button size */
31
- size?: 'sm' | 'md';
32
- /** Whether page is 0-indexed (default: true) */
33
- zeroIndexed?: boolean;
34
- /** Translation key prefix */
35
- translationPrefix?: string;
36
- /** Whether pagination is disabled */
37
- disabled?: boolean;
38
- /** Additional CSS class */
39
- className?: string;
40
- /** For simple variant without total - whether there are more views */
41
- hasMore?: boolean;
42
- /** slice variant: whether current page is first */
43
- isFirst?: boolean;
44
- /** slice variant: whether current page is last */
45
- isLast?: boolean;
46
- }
47
-
48
- /**
49
- * 增强版分页组件(与 ui/Pagination 行为一致,供 table-view 等使用)
50
- * Enhanced Pagination Component with page numbers, ellipsis, and page size selector.
51
- */
52
- const Pagination: React.FC<PaginationProps> = ({
53
- page,
54
- total = 0,
55
- pageSize,
56
- onPageChange,
57
- pageSizeOptions = [10, 20, 50, 100],
58
- onPageSizeChange,
59
- showStats = true,
60
- showSizeChanger = false,
61
- showFirstLast = true,
62
- maxPageButtons = 7,
63
- variant = 'spread',
64
- size = 'md',
65
- zeroIndexed = true,
66
- translationPrefix = 'common.pagination',
67
- disabled = false,
68
- className,
69
- hasMore = false,
70
- isFirst,
71
- isLast,
72
- }) => {
73
- const { t } = useTranslation();
74
- const [navLock, setNavLock] = React.useState(false)
75
-
76
- const resolvedPageSizeNum = (() => {
77
- const n = Number(pageSize);
78
- return Number.isFinite(n) && n > 0 ? n : pageSizeOptions[0];
79
- })();
80
-
81
- // Normalize to 0-indexed internally
82
- const currentPage = zeroIndexed ? page : page - 1;
83
- const totalPages = Math.max(1, Math.ceil(total / resolvedPageSizeNum));
84
-
85
- // Calculate displayed range
86
- const startItem = total > 0 ? currentPage * resolvedPageSizeNum + 1 : 0;
87
- const endItem = Math.min((currentPage + 1) * resolvedPageSizeNum, total);
88
-
89
- // Navigation handlers
90
- const goToPage = (targetPage: number) => {
91
- if (disabled || navLock) return;
92
- // slice 模式后端不返回 total,不能用 totalPages 去 clamp,否则“下一页”会永远被限制在第 1 页
93
- const normalizedTarget =
94
- variant === 'slice'
95
- ? Math.max(0, targetPage)
96
- : Math.max(0, Math.min(totalPages - 1, targetPage));
97
- setNavLock(true)
98
- onPageChange(zeroIndexed ? normalizedTarget : normalizedTarget + 1);
99
- };
100
-
101
- const handleFirst = () => goToPage(0);
102
- const handleLast = () => goToPage(totalPages - 1);
103
- const handlePrev = () => {
104
- if (variant === 'slice') {
105
- if (disabled || navLock) return
106
- if (!isFirst) {
107
- setNavLock(true)
108
- onPageChange(zeroIndexed ? Math.max(0, currentPage - 1) : currentPage);
109
- }
110
- } else {
111
- goToPage(currentPage - 1);
112
- }
113
- };
114
- const handleNext = () => {
115
- if (variant === 'simple') {
116
- if (hasMore) onPageChange(zeroIndexed ? currentPage + 1 : currentPage + 2);
117
- } else if (variant === 'slice') {
118
- if (disabled || navLock) return
119
- if (!isLast) {
120
- setNavLock(true)
121
- onPageChange(zeroIndexed ? currentPage + 1 : currentPage + 2);
122
- }
123
- } else {
124
- goToPage(currentPage + 1);
125
- }
126
- };
127
-
128
- React.useEffect(() => {
129
- setNavLock(false)
130
- }, [page, pageSize, disabled, variant])
131
-
132
- const isPrevDisabled =
133
- disabled ||
134
- (variant === 'slice'
135
- ? !!isFirst
136
- : currentPage === 0);
137
- const isNextDisabled =
138
- disabled ||
139
- (variant === 'slice'
140
- ? !!isLast
141
- : (variant === 'simple' ? !hasMore : currentPage >= totalPages - 1));
142
-
143
- // Generate page numbers with ellipsis
144
- const generatePageNumbers = (): (number | 'ellipsis-start' | 'ellipsis-end')[] => {
145
- if (totalPages <= maxPageButtons) {
146
- return Array.from({ length: totalPages }, (_, i) => i);
147
- }
148
-
149
- const pages: (number | 'ellipsis-start' | 'ellipsis-end')[] = [];
150
- const sideButtons = Math.floor((maxPageButtons - 3) / 2); // buttons on each side of current
151
-
152
- // Always show first page
153
- pages.push(0);
154
-
155
- // Calculate range around current page
156
- let rangeStart = Math.max(1, currentPage - sideButtons);
157
- let rangeEnd = Math.min(totalPages - 2, currentPage + sideButtons);
158
-
159
- // Adjust range if near edges
160
- if (currentPage <= sideButtons + 1) {
161
- rangeEnd = Math.min(totalPages - 2, maxPageButtons - 3);
162
- } else if (currentPage >= totalPages - sideButtons - 2) {
163
- rangeStart = Math.max(1, totalPages - maxPageButtons + 2);
164
- }
165
-
166
- // Add start ellipsis
167
- if (rangeStart > 1) {
168
- pages.push('ellipsis-start');
169
- }
170
-
171
- // Add middle views
172
- for (let i = rangeStart; i <= rangeEnd; i++) {
173
- pages.push(i);
174
- }
175
-
176
- // Add end ellipsis
177
- if (rangeEnd < totalPages - 2) {
178
- pages.push('ellipsis-end');
179
- }
180
-
181
- // Always show last page
182
- if (totalPages > 1) {
183
- pages.push(totalPages - 1);
184
- }
185
-
186
- return pages;
187
- };
188
-
189
- // Styles
190
- const sizeClasses = {
191
- sm: 'h-7 min-w-[28px] text-xs',
192
- md: 'h-8 min-w-[32px] text-sm'
193
- };
194
-
195
- const buttonBase = clsx(
196
- "inline-flex items-center justify-center rounded border transition-all",
197
- "disabled:opacity-50 disabled:cursor-not-allowed",
198
- sizeClasses[size]
199
- );
200
-
201
- const navButton = clsx(
202
- buttonBase,
203
- "px-2 border-gray-300 dark:border-gray-600",
204
- "text-gray-700 dark:text-gray-300",
205
- "hover:bg-gray-50 dark:hover:bg-gray-700",
206
- "active:scale-95 active:bg-gray-100 dark:active:bg-gray-600"
207
- );
208
-
209
- const pageButton = (isActive: boolean) => clsx(
210
- buttonBase,
211
- "px-2.5",
212
- isActive
213
- ? "bg-blue-600 border-blue-600 text-white hover:bg-blue-700"
214
- : clsx(
215
- "border-gray-300 dark:border-gray-600",
216
- "text-gray-700 dark:text-gray-300",
217
- "hover:bg-gray-50 dark:hover:bg-gray-700 hover:border-blue-300 dark:hover:border-blue-500",
218
- "active:scale-95"
219
- )
220
- );
221
-
222
- const ellipsisClass = clsx(
223
- "inline-flex items-center justify-center px-1 text-gray-400 dark:text-gray-500",
224
- sizeClasses[size]
225
- );
226
-
227
- // Simple variant (for FeedbackPage style - no total)
228
- if (variant === 'simple') {
229
- return (
230
- <div className={clsx("flex justify-between items-center pt-8", className)}>
231
- <button
232
- onClick={handlePrev}
233
- disabled={isPrevDisabled}
234
- className={clsx(navButton, "px-4 py-2 rounded-lg")}
235
- >
236
- {t(`${translationPrefix}.previous`, { defaultValue: 'Previous' })}
237
- </button>
238
- <span className="text-sm text-gray-500 dark:text-gray-400">
239
- {t(`${translationPrefix}.page`, { page: currentPage + 1, defaultValue: `Page ${currentPage + 1}` })}
240
- </span>
241
- <button
242
- onClick={handleNext}
243
- disabled={isNextDisabled}
244
- className={clsx(navButton, "px-4 py-2 rounded-lg")}
245
- >
246
- {t(`${translationPrefix}.next`, { defaultValue: 'Next' })}
247
- </button>
248
- </div>
249
- );
250
- }
251
-
252
- // Slice variant(后端切片:首页/上一页/下一页 + 每页条数,同一行靠右)
253
- if (variant === 'slice') {
254
- return (
255
- <div
256
- className={clsx(
257
- 'flex flex-wrap items-center justify-end gap-2',
258
- className,
259
- )}>
260
- <button
261
- onClick={handleFirst}
262
- disabled={isPrevDisabled}
263
- className={navButton}
264
- title={t(`${translationPrefix}.first`, { defaultValue: 'First' })}
265
- >
266
- <ChevronsLeft size={size === 'sm' ? 14 : 16} />
267
- </button>
268
- <button
269
- onClick={handlePrev}
270
- disabled={isPrevDisabled}
271
- className={navButton}
272
- title={t(`${translationPrefix}.previous`, { defaultValue: 'Previous' })}
273
- >
274
- <ChevronLeft size={size === 'sm' ? 14 : 16} />
275
- </button>
276
- <span className="px-2 text-sm text-gray-500 dark:text-gray-400">
277
- {t(`${translationPrefix}.page`, {
278
- page: currentPage + 1,
279
- defaultValue: `Page ${currentPage + 1}`,
280
- })}
281
- </span>
282
- <button
283
- onClick={handleNext}
284
- disabled={isNextDisabled}
285
- className={navButton}
286
- title={t(`${translationPrefix}.next`, { defaultValue: 'Next' })}
287
- >
288
- <ChevronRight size={size === 'sm' ? 14 : 16} />
289
- </button>
290
- {showSizeChanger && onPageSizeChange ? (
291
- <CxSelect.Medium
292
- size="small"
293
- value={String(resolvedPageSizeNum)}
294
- onChange={(val) => {
295
- const n = Number(val);
296
- if (!Number.isFinite(n)) return;
297
- onPageSizeChange(n);
298
- }}
299
- disabled={disabled}
300
- options={pageSizeOptions.map((opt) => ({
301
- label: `${opt} ${t(`${translationPrefix}.per_page`, { defaultValue: '/ page' })}`,
302
- value: String(opt),
303
- }))}
304
- style={{ width: 120 }}
305
- getPopupContainer={() => document.body}
306
- />
307
- ) : null}
308
- </div>
309
- );
310
- }
311
-
312
- // Compact variant (centered, no stats)
313
- if (variant === 'compact') {
314
- const pageNumbers = generatePageNumbers();
315
- return (
316
- <div className={clsx("flex justify-center items-center gap-1", className)}>
317
- {showFirstLast && (
318
- <button onClick={handleFirst} disabled={isPrevDisabled} className={navButton} title={t(`${translationPrefix}.first`, { defaultValue: 'First' })}>
319
- <ChevronsLeft size={size === 'sm' ? 14 : 16} />
320
- </button>
321
- )}
322
- <button onClick={handlePrev} disabled={isPrevDisabled} className={navButton}>
323
- <ChevronLeft size={size === 'sm' ? 14 : 16} />
324
- </button>
325
-
326
- {pageNumbers.map((p, idx) =>
327
- typeof p === 'number' ? (
328
- <button
329
- key={p}
330
- onClick={() => goToPage(p)}
331
- disabled={disabled}
332
- className={pageButton(p === currentPage)}
333
- >
334
- {p + 1}
335
- </button>
336
- ) : (
337
- <span key={`${p}-${idx}`} className={ellipsisClass}>...</span>
338
- )
339
- )}
340
-
341
- <button onClick={handleNext} disabled={isNextDisabled} className={navButton}>
342
- <ChevronRight size={size === 'sm' ? 14 : 16} />
343
- </button>
344
- {showFirstLast && (
345
- <button onClick={handleLast} disabled={isNextDisabled} className={navButton} title={t(`${translationPrefix}.last`, { defaultValue: 'Last' })}>
346
- <ChevronsRight size={size === 'sm' ? 14 : 16} />
347
- </button>
348
- )}
349
- </div>
350
- );
351
- }
352
-
353
- // Default: spread variant (full featured)
354
- const pageNumbers = generatePageNumbers();
355
-
356
- return (
357
- <div className={clsx(
358
- "flex flex-wrap items-center justify-between gap-4",
359
- className
360
- )}>
361
- {/* Left: Stats */}
362
- <div className="flex items-center gap-4">
363
- {showStats && (
364
- <span className="text-sm text-gray-500 dark:text-gray-400">
365
- {t(`${translationPrefix}.showing`, {
366
- start: startItem,
367
- end: endItem,
368
- total: total,
369
- defaultValue: `Showing ${startItem}-${endItem} of ${total}`
370
- })}
371
- </span>
372
- )}
373
-
374
- {/* Page Size Selector */}
375
- {showSizeChanger && onPageSizeChange && (
376
- <div className="flex items-center gap-2">
377
- <CxSelect.Medium
378
- size="small"
379
- /** antd Select 受控值与 options.value 类型须一致;统一用 string 避免 number/string 混用不触发变更 */
380
- value={String(resolvedPageSizeNum)}
381
- onChange={(val) => {
382
- const n = Number(val);
383
- if (!Number.isFinite(n)) return;
384
- onPageSizeChange(n);
385
- /**
386
- * 勿在此处再调 goToPage(0)。
387
- * 父级若在 onPageChange 里写 handleTableChange({ current, pageSize: paginationData.pageSize }),
388
- * 会与本次 setState 同 tick 触发,闭包里的 pageSize 仍是旧值,会把刚改的条数覆盖回去。
389
- * 需要回到第一页时:在 onPageSizeChange 里与条数一并处理,或交给 table-view 的 handleTableChange(已按条数变化重置 page)。
390
- */
391
- }}
392
- disabled={disabled}
393
- options={pageSizeOptions.map((opt) => ({
394
- label: `${opt} ${t(`${translationPrefix}.per_page`, { defaultValue: '/ page' })}`,
395
- value: String(opt),
396
- }))}
397
- style={{ width: 120 }}
398
- getPopupContainer={() => document.body}
399
- />
400
- </div>
401
- )}
402
- </div>
403
-
404
- {/* Right: Page Navigation */}
405
- <div className="flex items-center gap-1">
406
- {/* First */}
407
- {showFirstLast && (
408
- <button
409
- onClick={handleFirst}
410
- disabled={isPrevDisabled}
411
- className={navButton}
412
- title={t(`${translationPrefix}.first`, { defaultValue: 'First page' })}
413
- >
414
- <ChevronsLeft size={size === 'sm' ? 14 : 16} />
415
- </button>
416
- )}
417
-
418
- {/* Previous */}
419
- <button
420
- onClick={handlePrev}
421
- disabled={isPrevDisabled}
422
- className={navButton}
423
- title={t(`${translationPrefix}.previous`, { defaultValue: 'Previous' })}
424
- >
425
- <ChevronLeft size={size === 'sm' ? 14 : 16} />
426
- </button>
427
-
428
- {/* Page Numbers */}
429
- <div className="flex items-center gap-1 mx-1">
430
- {pageNumbers.map((p, idx) =>
431
- typeof p === 'number' ? (
432
- <button
433
- key={p}
434
- onClick={() => goToPage(p)}
435
- disabled={disabled}
436
- className={pageButton(p === currentPage)}
437
- >
438
- {p + 1}
439
- </button>
440
- ) : (
441
- <span key={`${p}-${idx}`} className={ellipsisClass}>...</span>
442
- )
443
- )}
444
- </div>
445
-
446
- {/* Next */}
447
- <button
448
- onClick={handleNext}
449
- disabled={isNextDisabled}
450
- className={navButton}
451
- title={t(`${translationPrefix}.next`, { defaultValue: 'Next' })}
452
- >
453
- <ChevronRight size={size === 'sm' ? 14 : 16} />
454
- </button>
455
-
456
- {/* Last */}
457
- {showFirstLast && (
458
- <button
459
- onClick={handleLast}
460
- disabled={isNextDisabled}
461
- className={navButton}
462
- title={t(`${translationPrefix}.last`, { defaultValue: 'Last page' })}
463
- >
464
- <ChevronsRight size={size === 'sm' ? 14 : 16} />
465
- </button>
466
- )}
467
- </div>
468
- </div>
469
- );
470
- };
471
-
472
- export default Pagination;
@@ -1,175 +0,0 @@
1
- import { CxTag } from '@cx-ui'
2
- import clsx from 'clsx'
3
- import { Copy } from 'lucide-react'
4
- import { Fragment, memo, useState } from 'react'
5
- import { useTranslation } from 'react-i18next'
6
- import { useCopyToClipboard } from '@/hooks/useCopyToClipboard'
7
-
8
- /**
9
- * 接口路径按 `/` 分段,每段一个 CxTag,颜色按层级循环;前导 `/` 单独展示。
10
- * 默认不用 `pill`,与列表「状态」等胶囊 Tag 区分。
11
- * 左侧复制按钮复制完整路径(自动补全前导 `/`)。
12
- */
13
-
14
- const SEGMENT_COLORS = [
15
- '#2563eb',
16
- '#0d9488',
17
- '#16a34a',
18
- '#ca8a04',
19
- '#9333ea',
20
- '#dc2626',
21
- ]
22
-
23
- export type PathTagsProps = {
24
- path?: string | null
25
- /** 无有效分段时展示 */
26
- emptyText?: string
27
- className?: string
28
- /** 是否使用胶囊 Tag;不传时 `whole` 默认 true,`segment` 默认 false */
29
- pill?: boolean
30
- /** 是否紧凑模式:`segment` 默认 true;`whole` 默认 false */
31
- compact?: boolean
32
- /** `renderMode="whole"` 时的 Tag 颜色(如与 httpMethod 同色) */
33
- color?: string
34
- /**
35
- * 渲染模式:
36
- * - whole(默认):整条路径一个 Tag
37
- * - segment:按 `/` 分段多个 Tag(历史效果)
38
- */
39
- renderMode?: string
40
- /**
41
- * `renderMode="segment"` 时的颜色模式:
42
- * - same:所有分段同色(直接用 CxTag 默认样式,便于后续统一调整/一键切回)
43
- * - segment:按层级循环配色(历史效果)
44
- */
45
- colorMode?: string
46
- }
47
-
48
- /** 用于展示与复制:无内容返回空串;否则保证以 `/` 开头 */
49
- function normalizePathForCopy(raw: string): string {
50
- const s = String(raw).trim()
51
- if (!s) return ''
52
- return s.startsWith('/') ? s : `/${s}`
53
- }
54
-
55
- function splitSegments(normalized: string): string[] {
56
- if (!normalized) return []
57
- return normalized.split('/').filter((p) => p.length > 0)
58
- }
59
-
60
- function PathTagsInner({
61
- path,
62
- emptyText = '-',
63
- className,
64
- color,
65
- renderMode = 'whole',
66
- colorMode = 'same',
67
- pill,
68
- compact,
69
- }: PathTagsProps) {
70
- const { t } = useTranslation()
71
- const [showCopy, setShowCopy] = useState(false)
72
- const { copy } = useCopyToClipboard()
73
-
74
- const compactResolved = compact ?? (renderMode === 'segment')
75
- const pillResolved = pill ?? (renderMode === 'whole')
76
-
77
- // 用于显示的标准化路径(保证以 / 开头)
78
- const fullPath =
79
- path != null && String(path).trim() !== ''
80
- ? normalizePathForCopy(String(path))
81
- : ''
82
-
83
- // 用于复制的原始路径(只 trim,不添加前导 /)
84
- const rawPathForCopy =
85
- path != null && String(path).trim() !== ''
86
- ? String(path).trim()
87
- : ''
88
-
89
- const segments = fullPath ? splitSegments(fullPath) : []
90
-
91
- if (!fullPath || segments.length === 0) {
92
- return (
93
- <span className="text-gray-500 dark:text-gray-400">{emptyText}</span>
94
- )
95
- }
96
-
97
- return (
98
- <div
99
- className={clsx(
100
- 'inline-flex max-w-full flex-wrap items-center gap-x-1 gap-y-1',
101
- compactResolved ? 'gap-x-0.5' : 'gap-x-1',
102
- className,
103
- )}
104
- onMouseEnter={() => setShowCopy(true)}
105
- onMouseLeave={() => setShowCopy(false)}>
106
- <div className="inline-flex min-w-0 flex-wrap items-center gap-y-1">
107
- {renderMode === 'segment' ? (
108
- <>
109
- <span
110
- className={clsx(
111
- 'select-none self-center text-gray-400 dark:text-gray-500',
112
- compactResolved ? 'mx-0' : 'mx-0.5',
113
- )}
114
- aria-hidden>
115
- /
116
- </span>
117
- {segments.map((seg, i) => (
118
- <Fragment key={`${i}-${seg}`}>
119
- {i > 0 ? (
120
- <span
121
- className={clsx(
122
- 'select-none self-center text-gray-400 dark:text-gray-500',
123
- compactResolved ? 'mx-0' : 'mx-0.5',
124
- )}
125
- aria-hidden>
126
- /
127
- </span>
128
- ) : null}
129
- <CxTag
130
- color={
131
- colorMode === 'segment'
132
- ? SEGMENT_COLORS[i % SEGMENT_COLORS.length]
133
- : undefined
134
- }
135
- pill={pillResolved}
136
- className={compactResolved ? 'px-1 py-0 text-xs' : undefined}>
137
- {seg}
138
- </CxTag>
139
- </Fragment>
140
- ))}
141
- </>
142
- ) : (
143
- <CxTag
144
- color={color}
145
- pill={pillResolved}
146
- className={compactResolved ? 'px-1 py-0 text-xs' : undefined}
147
- >
148
- {fullPath}
149
- </CxTag>
150
- )}
151
- </div>
152
- <button
153
- type="button"
154
- className={clsx(
155
- 'inline-flex rounded p-0.5 text-gray-500 transition-all',
156
- 'hover:bg-gray-100 hover:text-blue-600',
157
- 'dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-blue-400',
158
- compactResolved ? 'ml-0.5' : 'ml-1',
159
- !showCopy && 'opacity-0 pointer-events-none',
160
- )}
161
- title={t('common.copy_path')}
162
- aria-label={t('common.copy_path')}
163
- onClick={(e) => {
164
- e.stopPropagation()
165
- void copy(rawPathForCopy)
166
- }}>
167
- <Copy size={14} strokeWidth={2} aria-hidden />
168
- </button>
169
- </div>
170
- )
171
- }
172
-
173
- PathTagsInner.displayName = 'PathTags'
174
-
175
- export const PathTags = memo(PathTagsInner)
@@ -1,48 +0,0 @@
1
- import React from 'react'
2
- import clsx from 'clsx'
3
- import { useSystemConfig } from '@/config/system'
4
-
5
- type SystemLogoMarkProps = {
6
- className?: string
7
- /** 没有系统 Logo 时的占位形态:square=方形,circle=圆形 */
8
- fallbackShape?: 'circle' | 'square'
9
- }
10
-
11
- /** 系统 Logo 标识:统一登录/注册/会话首页的品牌展示(有配置用配置)。 */
12
- export function SystemLogoMark({
13
- className,
14
- fallbackShape = 'square',
15
- }: SystemLogoMarkProps) {
16
- const { systemLogo, systemName } = useSystemConfig()
17
- const shapeCls =
18
- fallbackShape === 'circle' ? 'rounded-full' : 'rounded-xl'
19
-
20
- if (systemLogo) {
21
- return (
22
- <img
23
- src={systemLogo}
24
- alt={systemName}
25
- className={clsx(shapeCls, 'object-cover', className)}
26
- onError={(e) => {
27
- e.currentTarget.style.display = 'none'
28
- }}
29
- />
30
- )
31
- }
32
-
33
- return (
34
- <div
35
- className={clsx(
36
- shapeCls,
37
- 'bg-gradient-to-tr from-blue-600 to-purple-600 flex items-center justify-center shadow-lg shadow-blue-500/20',
38
- className,
39
- )}
40
- aria-hidden
41
- >
42
- <span className="text-white font-bold">
43
- {(systemName || 'A').substring(0, 2).toUpperCase()}
44
- </span>
45
- </div>
46
- )
47
- }
48
-