@yoka-ui/ui 1.0.10-test → 1.1.1
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.
- package/@Docs-yoka/exports.generated.md +68 -62
- package/LICENSE +21 -0
- package/README.md +40 -189
- package/dist/es/assets/image/skills.zip +0 -0
- package/dist/es/business/AiChat/aichat-logo.svg +1 -0
- package/dist/es/business/AiChat/index.d.ts +3 -3
- package/dist/es/business/AiChat/index.js +322 -137
- package/dist/es/business/AiChat/index.js.map +3 -3
- package/dist/es/business/AiChat/index.module.less +24 -0
- package/dist/es/business/AiChat/intentRecognizer.js.map +1 -1
- package/dist/es/business/AiChat/navigationManager.js +6 -6
- package/dist/es/business/AiChat/navigationManager.js.map +2 -2
- package/dist/es/business/AiChat/sse.d.ts +15 -0
- package/dist/es/business/AiChat/sse.js +118 -7
- package/dist/es/business/AiChat/sse.js.map +2 -2
- package/dist/es/business/AiChat/type.d.ts +22 -23
- package/dist/es/business/AiChat/useAiChat.js +105 -75
- package/dist/es/business/AiChat/useAiChat.js.map +3 -3
- package/dist/es/business/AiChat/useTaskWorkflow.d.ts +1 -2
- package/dist/es/business/AiChat/useTaskWorkflow.js +2 -36
- package/dist/es/business/AiChat/useTaskWorkflow.js.map +2 -2
- package/dist/es/business/DrawerPageInfo/index.js.map +1 -1
- package/dist/es/business/Editor/index.d.ts +1 -1
- package/dist/es/business/Editor/index.js.map +2 -2
- package/dist/es/business/Empty/index.js +1 -1
- package/dist/es/business/Empty/index.js.map +1 -1
- package/dist/es/business/ModCommonFilter/components/PopoverContent/Category.js +2 -2
- package/dist/es/business/ModCommonFilter/components/PopoverContent/Category.js.map +2 -2
- package/dist/es/business/ModCommonFilter/components/PopoverContent/Content.js +3 -3
- package/dist/es/business/ModCommonFilter/components/PopoverContent/Content.js.map +2 -2
- package/dist/es/business/ModCommonFilter/components/PopoverContent/Selected.js +2 -2
- package/dist/es/business/ModCommonFilter/components/PopoverContent/Selected.js.map +2 -2
- package/dist/es/business/ModCommonFilter/index.d.ts +1 -1
- package/dist/es/business/ModCommonFilter/index.js.map +2 -2
- package/dist/es/business/YkCharts/Area.d.ts +18 -0
- package/dist/es/business/YkCharts/Area.js +336 -0
- package/dist/es/business/YkCharts/Area.js.map +7 -0
- package/dist/es/business/YkCharts/Bar.d.ts +21 -0
- package/dist/es/business/YkCharts/Bar.js +316 -0
- package/dist/es/business/YkCharts/Bar.js.map +7 -0
- package/dist/es/business/YkCharts/BarProperty.d.ts +21 -0
- package/dist/es/business/YkCharts/BarProperty.js +357 -0
- package/dist/es/business/YkCharts/BarProperty.js.map +7 -0
- package/dist/es/business/YkCharts/BarTotal.d.ts +21 -0
- package/dist/es/business/YkCharts/BarTotal.js +292 -0
- package/dist/es/business/YkCharts/BarTotal.js.map +7 -0
- package/dist/es/business/YkCharts/Line.d.ts +21 -0
- package/dist/es/business/YkCharts/Line.js +342 -0
- package/dist/es/business/YkCharts/Line.js.map +7 -0
- package/dist/es/business/YkCharts/Pie.d.ts +19 -0
- package/dist/es/business/YkCharts/Pie.js +107 -0
- package/dist/es/business/YkCharts/Pie.js.map +7 -0
- package/dist/es/business/YkCharts/PieProperty.d.ts +18 -0
- package/dist/es/business/YkCharts/PieProperty.js +180 -0
- package/dist/es/business/YkCharts/PieProperty.js.map +7 -0
- package/dist/es/business/YkCharts/Pies.d.ts +26 -0
- package/dist/es/business/YkCharts/Pies.js +352 -0
- package/dist/es/business/YkCharts/Pies.js.map +7 -0
- package/dist/es/business/YkCharts/constants.d.ts +1 -0
- package/dist/es/business/YkCharts/constants.js +47 -0
- package/dist/es/business/YkCharts/constants.js.map +7 -0
- package/dist/es/business/YkCharts/hooks.d.ts +4 -0
- package/dist/es/business/YkCharts/hooks.js +37 -0
- package/dist/es/business/YkCharts/hooks.js.map +7 -0
- package/dist/es/business/YkCharts/index.d.ts +9 -0
- package/dist/es/business/YkCharts/index.js +20 -0
- package/dist/es/business/YkCharts/index.js.map +7 -0
- package/dist/es/business/YkCharts/index.module.less +164 -0
- package/dist/es/business/YkCharts/tooltip.less +92 -0
- package/dist/es/business/YkCharts/transformData.js +16 -0
- package/dist/es/business/YkCharts/transformData.js.map +7 -0
- package/dist/es/business/YkCharts/typing.d.ts +74 -0
- package/dist/es/business/YkCharts/typing.js +1 -0
- package/dist/es/business/YkCharts/typing.js.map +7 -0
- package/dist/es/business/YkCharts/utils.d.ts +4 -0
- package/dist/es/business/YkCharts/utils.js +109 -0
- package/dist/es/business/YkCharts/utils.js.map +7 -0
- package/dist/es/business/YkCharts/variables.less +13 -0
- package/dist/es/business/YkLoginModule/SmsLoginForm.d.ts +25 -0
- package/dist/es/business/YkLoginModule/SmsLoginForm.js +178 -0
- package/dist/es/business/YkLoginModule/SmsLoginForm.js.map +7 -0
- package/dist/es/business/YkLoginModule/index.d.ts +48 -0
- package/dist/es/business/YkLoginModule/index.js +198 -0
- package/dist/es/business/YkLoginModule/index.js.map +7 -0
- package/dist/es/business/YkLoginModule/styles.module.less +169 -0
- package/dist/es/business/YkPorjectSelect/index.d.ts +1 -1
- package/dist/es/business/YkPorjectSelect/index.js +2 -2
- package/dist/es/business/YkPorjectSelect/index.js.map +2 -2
- package/dist/es/business/YkSqlEdit/code-mirror-custom.module.less +154 -0
- package/dist/es/business/YkSqlEdit/index.d.ts +20 -0
- package/dist/es/business/YkSqlEdit/index.js +180 -0
- package/dist/es/business/YkSqlEdit/index.js.map +7 -0
- package/dist/es/business/YkSqlEdit/sql-language.d.ts +11 -0
- package/dist/es/business/YkSqlEdit/sql-language.js +1460 -0
- package/dist/es/business/YkSqlEdit/sql-language.js.map +7 -0
- package/dist/es/components/DebounceInput/index.js.map +2 -2
- package/dist/es/components/MultipleSelect/index.d.ts +14 -0
- package/dist/es/components/MultipleSelect/index.js +1 -1
- package/dist/es/components/MultipleSelect/index.js.map +2 -2
- package/dist/es/components/RefreshButton/index.js.map +2 -2
- package/dist/es/components/SearchWithHistory/index.js +1 -1
- package/dist/es/components/SearchWithHistory/index.js.map +2 -2
- package/dist/es/components/TextWithToolTip/index.d.ts +1 -1
- package/dist/es/components/TextWithToolTip/index.js.map +2 -2
- package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.d.ts +1 -24
- package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.js +2 -2
- package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.js.map +2 -2
- package/dist/es/components/TreeTransfer/index.d.ts +1 -24
- package/dist/es/components/TreeTransfer/index.js +8 -8
- package/dist/es/components/TreeTransfer/index.js.map +2 -2
- package/dist/es/components/TreeTransfer/utils/index.d.ts +1 -1
- package/dist/es/components/TreeTransfer/utils/index.js.map +2 -2
- package/dist/es/components/YKMarkdown/index.d.ts +11 -0
- package/dist/es/components/YKMarkdown/index.js +236 -0
- package/dist/es/components/YKMarkdown/index.js.map +7 -0
- package/dist/es/components/YKMarkdown/index.module.less +83 -0
- package/dist/es/components/YkDateRangePicker/YkDateRangePicker.mdx +194 -0
- package/dist/es/components/YkDateRangePicker/index.d.ts +9 -1
- package/dist/es/components/YkDateRangePicker/index.js +127 -61
- package/dist/es/components/YkDateRangePicker/index.js.map +2 -2
- package/dist/es/components/YkDateRangePicker/index.module.less +33 -9
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.d.ts +1 -1
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js +3 -2
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js.map +2 -2
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.d.ts +1 -1
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js +23 -3
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +2 -2
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.d.ts +1 -1
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.js.map +2 -2
- package/dist/es/components/YkRangeDateWithVS/index.d.ts +2 -2
- package/dist/es/components/YkRangeDateWithVS/index.js.map +2 -2
- package/dist/es/components/YkRangeDateWithVS/index.module.less +22 -4
- package/dist/es/components/YkRangeTimeWithRecent/index.d.ts +1 -1
- package/dist/es/components/YkRangeTimeWithRecent/index.js.map +2 -2
- package/dist/es/creative/ArcCheckbox/index.d.ts +12 -0
- package/dist/es/creative/ArcCheckbox/index.js +49 -0
- package/dist/es/creative/ArcCheckbox/index.js.map +7 -0
- package/dist/es/creative/ArcCheckbox/index.module.less +102 -0
- package/dist/es/creative/ButtonRadioWithInfo/index.js.map +1 -1
- package/dist/es/creative/ButtonWithProgress/index.d.ts +1 -1
- package/dist/es/creative/ButtonWithProgress/index.js.map +2 -2
- package/dist/es/creative/GlassSegmentedRadio/index.d.ts +24 -0
- package/dist/es/creative/GlassSegmentedRadio/index.js +75 -0
- package/dist/es/creative/GlassSegmentedRadio/index.js.map +7 -0
- package/dist/es/creative/GlassSegmentedRadio/index.module.less +241 -0
- package/dist/es/creative/SkillsWriter/index.d.ts +3 -0
- package/dist/es/creative/SkillsWriter/index.js +191 -0
- package/dist/es/creative/SkillsWriter/index.js.map +7 -0
- package/dist/es/creative/SkillsWriter/index.module.less +21 -0
- package/dist/es/index.d.ts +32 -24
- package/dist/es/index.js +90 -80
- package/dist/es/index.js.map +2 -2
- package/dist/es/index.less +45 -0
- package/dist/es/layout/FlexGrid/index.d.ts +1 -1
- package/dist/es/layout/FlexGrid/index.js.map +2 -2
- package/dist/es/layout/YkContainer/index.js.map +1 -1
- package/dist/es/layout/YkDrawer/index.d.ts +1 -1
- package/dist/es/layout/YkDrawer/index.js.map +2 -2
- package/dist/es/ui/LabelSelect/demo.js +1 -1
- package/dist/es/ui/LabelSelect/demo.js.map +2 -2
- package/dist/es/ui/LabelSelect/index.d.ts +1 -1
- package/dist/es/ui/LabelSelect/index.js +1 -1
- package/dist/es/ui/LabelSelect/index.js.map +2 -2
- package/dist/es/ui/LogicOperator/index.d.ts +1 -1
- package/dist/es/ui/LogicOperator/index.js.map +2 -2
- package/dist/es/ui/YkButton/index.d.ts +1 -1
- package/dist/es/ui/YkButton/index.js.map +2 -2
- package/dist/es/ui/YkCard/index.d.ts +1 -1
- package/dist/es/ui/YkCard/index.js +1 -1
- package/dist/es/ui/YkCard/index.js.map +2 -2
- package/dist/es/ui/YkCheckbox/index.d.ts +1 -1
- package/dist/es/ui/YkCheckbox/index.js.map +2 -2
- package/dist/es/ui/YkDescriptions/index.d.ts +1 -1
- package/dist/es/ui/YkDescriptions/index.js.map +2 -2
- package/dist/es/ui/YkPagination/index.d.ts +1 -1
- package/dist/es/ui/YkPagination/index.js.map +2 -2
- package/dist/es/ui/YkRadio/index.d.ts +1 -1
- package/dist/es/ui/YkRadio/index.js.map +2 -2
- package/dist/es/ui/YkSegmented/index.d.ts +1 -1
- package/dist/es/ui/YkSegmented/index.js.map +2 -2
- package/dist/es/ui/YkSelect/index.d.ts +1 -1
- package/dist/es/ui/YkSelect/index.js.map +2 -2
- package/dist/es/ui/YkSpin/index.d.ts +1 -1
- package/dist/es/ui/YkSpin/index.js.map +2 -2
- package/dist/es/ui/YkStatistic/index.d.ts +1 -1
- package/dist/es/ui/YkStatistic/index.js.map +2 -2
- package/dist/es/ui/YkSwitch/index.d.ts +1 -1
- package/dist/es/ui/YkSwitch/index.js.map +2 -2
- package/dist/es/ui/YkTabs/index.d.ts +1 -1
- package/dist/es/ui/YkTabs/index.js.map +2 -2
- package/dist/es/ui/YkTooltip/index.d.ts +1 -1
- package/dist/es/ui/YkTooltip/index.js.map +2 -2
- package/dist/es/utils/styleUtils.js.map +2 -2
- package/dist/es/utils/ykStorybookDoc.d.ts +15 -0
- package/dist/es/utils/ykStorybookDoc.js +24 -2
- package/dist/es/utils/ykStorybookDoc.js.map +2 -2
- package/dist/lib/assets/image/skills.zip +0 -0
- package/dist/lib/business/AiChat/aichat-logo.svg +1 -0
- package/dist/lib/business/AiChat/index.d.ts +3 -3
- package/dist/lib/business/AiChat/index.js +311 -129
- package/dist/lib/business/AiChat/index.js.map +3 -3
- package/dist/lib/business/AiChat/index.module.less +24 -0
- package/dist/lib/business/AiChat/intentRecognizer.js.map +1 -1
- package/dist/lib/business/AiChat/navigationManager.js +6 -6
- package/dist/lib/business/AiChat/navigationManager.js.map +2 -2
- package/dist/lib/business/AiChat/sse.d.ts +15 -0
- package/dist/lib/business/AiChat/sse.js +117 -7
- package/dist/lib/business/AiChat/sse.js.map +2 -2
- package/dist/lib/business/AiChat/type.d.ts +22 -23
- package/dist/lib/business/AiChat/type.js.map +1 -1
- package/dist/lib/business/AiChat/useAiChat.js +104 -74
- package/dist/lib/business/AiChat/useAiChat.js.map +3 -3
- package/dist/lib/business/AiChat/useTaskWorkflow.d.ts +1 -2
- package/dist/lib/business/AiChat/useTaskWorkflow.js +0 -34
- package/dist/lib/business/AiChat/useTaskWorkflow.js.map +2 -2
- package/dist/lib/business/DrawerPageInfo/index.js.map +1 -1
- package/dist/lib/business/Editor/index.d.ts +1 -1
- package/dist/lib/business/Editor/index.js.map +2 -2
- package/dist/lib/business/Empty/index.js +1 -1
- package/dist/lib/business/Empty/index.js.map +1 -1
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/Category.js +3 -3
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/Category.js.map +2 -2
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/Content.js +4 -4
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/Content.js.map +2 -2
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/Selected.js +3 -3
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/Selected.js.map +2 -2
- package/dist/lib/business/ModCommonFilter/index.d.ts +1 -1
- package/dist/lib/business/ModCommonFilter/index.js.map +2 -2
- package/dist/lib/business/YkCharts/Area.d.ts +18 -0
- package/dist/lib/business/YkCharts/Area.js +346 -0
- package/dist/lib/business/YkCharts/Area.js.map +7 -0
- package/dist/lib/business/YkCharts/Bar.d.ts +21 -0
- package/dist/lib/business/YkCharts/Bar.js +323 -0
- package/dist/lib/business/YkCharts/Bar.js.map +7 -0
- package/dist/lib/business/YkCharts/BarProperty.d.ts +21 -0
- package/dist/lib/business/YkCharts/BarProperty.js +370 -0
- package/dist/lib/business/YkCharts/BarProperty.js.map +7 -0
- package/dist/lib/business/YkCharts/BarTotal.d.ts +21 -0
- package/dist/lib/business/YkCharts/BarTotal.js +298 -0
- package/dist/lib/business/YkCharts/BarTotal.js.map +7 -0
- package/dist/lib/business/YkCharts/Line.d.ts +21 -0
- package/dist/lib/business/YkCharts/Line.js +349 -0
- package/dist/lib/business/YkCharts/Line.js.map +7 -0
- package/dist/lib/business/YkCharts/Pie.d.ts +19 -0
- package/dist/lib/business/YkCharts/Pie.js +117 -0
- package/dist/lib/business/YkCharts/Pie.js.map +7 -0
- package/dist/lib/business/YkCharts/PieProperty.d.ts +18 -0
- package/dist/lib/business/YkCharts/PieProperty.js +193 -0
- package/dist/lib/business/YkCharts/PieProperty.js.map +7 -0
- package/dist/lib/business/YkCharts/Pies.d.ts +26 -0
- package/dist/lib/business/YkCharts/Pies.js +341 -0
- package/dist/lib/business/YkCharts/Pies.js.map +7 -0
- package/dist/lib/business/YkCharts/constants.d.ts +1 -0
- package/dist/lib/business/YkCharts/constants.js +71 -0
- package/dist/lib/business/YkCharts/constants.js.map +7 -0
- package/dist/lib/business/YkCharts/hooks.d.ts +4 -0
- package/dist/lib/business/YkCharts/hooks.js +62 -0
- package/dist/lib/business/YkCharts/hooks.js.map +7 -0
- package/dist/lib/business/YkCharts/index.d.ts +9 -0
- package/dist/lib/business/YkCharts/index.js +61 -0
- package/dist/lib/business/YkCharts/index.js.map +7 -0
- package/dist/lib/business/YkCharts/index.module.less +164 -0
- package/dist/lib/business/YkCharts/tooltip.less +92 -0
- package/dist/lib/business/YkCharts/transformData.js +40 -0
- package/dist/lib/business/YkCharts/transformData.js.map +7 -0
- package/dist/lib/business/YkCharts/typing.d.ts +74 -0
- package/dist/lib/business/YkCharts/typing.js +18 -0
- package/dist/lib/business/YkCharts/typing.js.map +7 -0
- package/dist/lib/business/YkCharts/utils.d.ts +4 -0
- package/dist/lib/business/YkCharts/utils.js +143 -0
- package/dist/lib/business/YkCharts/utils.js.map +7 -0
- package/dist/lib/business/YkCharts/variables.less +13 -0
- package/dist/lib/business/YkLoginModule/SmsLoginForm.d.ts +25 -0
- package/dist/lib/business/YkLoginModule/SmsLoginForm.js +171 -0
- package/dist/lib/business/YkLoginModule/SmsLoginForm.js.map +7 -0
- package/dist/lib/business/YkLoginModule/index.d.ts +48 -0
- package/dist/lib/business/YkLoginModule/index.js +206 -0
- package/dist/lib/business/YkLoginModule/index.js.map +7 -0
- package/dist/lib/business/YkLoginModule/styles.module.less +169 -0
- package/dist/lib/business/YkPorjectSelect/index.d.ts +1 -1
- package/dist/lib/business/YkPorjectSelect/index.js +3 -3
- package/dist/lib/business/YkPorjectSelect/index.js.map +2 -2
- package/dist/lib/business/YkSqlEdit/code-mirror-custom.module.less +154 -0
- package/dist/lib/business/YkSqlEdit/index.d.ts +20 -0
- package/dist/lib/business/YkSqlEdit/index.js +202 -0
- package/dist/lib/business/YkSqlEdit/index.js.map +7 -0
- package/dist/lib/business/YkSqlEdit/sql-language.d.ts +11 -0
- package/dist/lib/business/YkSqlEdit/sql-language.js +1493 -0
- package/dist/lib/business/YkSqlEdit/sql-language.js.map +7 -0
- package/dist/lib/components/DebounceInput/index.js.map +2 -2
- package/dist/lib/components/MultipleSelect/index.d.ts +14 -0
- package/dist/lib/components/MultipleSelect/index.js +1 -1
- package/dist/lib/components/MultipleSelect/index.js.map +2 -2
- package/dist/lib/components/RefreshButton/index.js.map +2 -2
- package/dist/lib/components/SearchWithHistory/index.js +1 -1
- package/dist/lib/components/SearchWithHistory/index.js.map +2 -2
- package/dist/lib/components/TextWithToolTip/index.d.ts +1 -1
- package/dist/lib/components/TextWithToolTip/index.js.map +2 -2
- package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.d.ts +1 -24
- package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.js +2 -2
- package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.js.map +2 -2
- package/dist/lib/components/TreeTransfer/index.d.ts +1 -24
- package/dist/lib/components/TreeTransfer/index.js +3 -3
- package/dist/lib/components/TreeTransfer/index.js.map +2 -2
- package/dist/lib/components/TreeTransfer/utils/index.d.ts +1 -1
- package/dist/lib/components/TreeTransfer/utils/index.js.map +2 -2
- package/dist/lib/components/YKMarkdown/index.d.ts +11 -0
- package/dist/lib/components/YKMarkdown/index.js +188 -0
- package/dist/lib/components/YKMarkdown/index.js.map +7 -0
- package/dist/lib/components/YKMarkdown/index.module.less +83 -0
- package/dist/lib/components/YkDateRangePicker/YkDateRangePicker.mdx +194 -0
- package/dist/lib/components/YkDateRangePicker/index.d.ts +9 -1
- package/dist/lib/components/YkDateRangePicker/index.js +127 -61
- package/dist/lib/components/YkDateRangePicker/index.js.map +2 -2
- package/dist/lib/components/YkDateRangePicker/index.module.less +33 -9
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.d.ts +1 -1
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js +3 -2
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js.map +2 -2
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.d.ts +1 -1
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js +22 -2
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +2 -2
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.d.ts +1 -1
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.js.map +2 -2
- package/dist/lib/components/YkRangeDateWithVS/index.d.ts +2 -2
- package/dist/lib/components/YkRangeDateWithVS/index.js.map +2 -2
- package/dist/lib/components/YkRangeDateWithVS/index.module.less +22 -4
- package/dist/lib/components/YkRangeTimeWithRecent/index.d.ts +1 -1
- package/dist/lib/components/YkRangeTimeWithRecent/index.js.map +2 -2
- package/dist/lib/creative/ArcCheckbox/index.d.ts +12 -0
- package/dist/lib/creative/ArcCheckbox/index.js +50 -0
- package/dist/lib/creative/ArcCheckbox/index.js.map +7 -0
- package/dist/lib/creative/ArcCheckbox/index.module.less +102 -0
- package/dist/lib/creative/ButtonRadioWithInfo/index.js.map +1 -1
- package/dist/lib/creative/ButtonWithProgress/index.d.ts +1 -1
- package/dist/lib/creative/ButtonWithProgress/index.js.map +2 -2
- package/dist/lib/creative/GlassSegmentedRadio/index.d.ts +24 -0
- package/dist/lib/creative/GlassSegmentedRadio/index.js +78 -0
- package/dist/lib/creative/GlassSegmentedRadio/index.js.map +7 -0
- package/dist/lib/creative/GlassSegmentedRadio/index.module.less +241 -0
- package/dist/lib/creative/SkillsWriter/index.d.ts +3 -0
- package/dist/lib/creative/SkillsWriter/index.js +200 -0
- package/dist/lib/creative/SkillsWriter/index.js.map +7 -0
- package/dist/lib/creative/SkillsWriter/index.module.less +21 -0
- package/dist/lib/index.d.ts +32 -24
- package/dist/lib/index.js +39 -24
- package/dist/lib/index.js.map +2 -2
- package/dist/lib/index.less +45 -0
- package/dist/lib/layout/FlexGrid/index.d.ts +1 -1
- package/dist/lib/layout/FlexGrid/index.js.map +2 -2
- package/dist/lib/layout/YkContainer/index.js.map +1 -1
- package/dist/lib/layout/YkDrawer/index.d.ts +1 -1
- package/dist/lib/layout/YkDrawer/index.js.map +2 -2
- package/dist/lib/ui/LabelSelect/demo.js +1 -1
- package/dist/lib/ui/LabelSelect/demo.js.map +2 -2
- package/dist/lib/ui/LabelSelect/index.d.ts +1 -1
- package/dist/lib/ui/LabelSelect/index.js +1 -1
- package/dist/lib/ui/LabelSelect/index.js.map +2 -2
- package/dist/lib/ui/LogicOperator/index.d.ts +1 -1
- package/dist/lib/ui/LogicOperator/index.js.map +2 -2
- package/dist/lib/ui/YkButton/index.d.ts +1 -1
- package/dist/lib/ui/YkButton/index.js.map +2 -2
- package/dist/lib/ui/YkCard/index.d.ts +1 -1
- package/dist/lib/ui/YkCard/index.js.map +2 -2
- package/dist/lib/ui/YkCheckbox/index.d.ts +1 -1
- package/dist/lib/ui/YkCheckbox/index.js.map +2 -2
- package/dist/lib/ui/YkDescriptions/index.d.ts +1 -1
- package/dist/lib/ui/YkDescriptions/index.js.map +2 -2
- package/dist/lib/ui/YkPagination/index.d.ts +1 -1
- package/dist/lib/ui/YkPagination/index.js.map +2 -2
- package/dist/lib/ui/YkRadio/index.d.ts +1 -1
- package/dist/lib/ui/YkRadio/index.js.map +2 -2
- package/dist/lib/ui/YkSegmented/index.d.ts +1 -1
- package/dist/lib/ui/YkSegmented/index.js.map +2 -2
- package/dist/lib/ui/YkSelect/index.d.ts +1 -1
- package/dist/lib/ui/YkSelect/index.js.map +2 -2
- package/dist/lib/ui/YkSpin/index.d.ts +1 -1
- package/dist/lib/ui/YkSpin/index.js.map +2 -2
- package/dist/lib/ui/YkStatistic/index.d.ts +1 -1
- package/dist/lib/ui/YkStatistic/index.js.map +2 -2
- package/dist/lib/ui/YkSwitch/index.d.ts +1 -1
- package/dist/lib/ui/YkSwitch/index.js.map +2 -2
- package/dist/lib/ui/YkTabs/index.d.ts +1 -1
- package/dist/lib/ui/YkTabs/index.js.map +2 -2
- package/dist/lib/ui/YkTooltip/index.d.ts +1 -1
- package/dist/lib/ui/YkTooltip/index.js.map +2 -2
- package/dist/lib/utils/styleUtils.js.map +2 -2
- package/dist/lib/utils/ykStorybookDoc.d.ts +15 -0
- package/dist/lib/utils/ykStorybookDoc.js +23 -1
- package/dist/lib/utils/ykStorybookDoc.js.map +2 -2
- package/package.json +151 -144
|
@@ -15,7 +15,27 @@ export interface ChatSession {
|
|
|
15
15
|
createTime: number;
|
|
16
16
|
messages: Message[];
|
|
17
17
|
}
|
|
18
|
-
export interface
|
|
18
|
+
export interface AiChatApiCallbacks {
|
|
19
|
+
onFetchSessions?: () => Promise<ChatSession[]>;
|
|
20
|
+
onFetchSessionDetail?: (sessionId: string) => Promise<ChatSession>;
|
|
21
|
+
onCreateSession?: () => Promise<{
|
|
22
|
+
sessionId: string;
|
|
23
|
+
}>;
|
|
24
|
+
onSendMessage?: (params: {
|
|
25
|
+
sessionId: string;
|
|
26
|
+
prompt: string;
|
|
27
|
+
history: Message[];
|
|
28
|
+
}) => Promise<void>;
|
|
29
|
+
onUploadFile?: (params: {
|
|
30
|
+
sessionId: string;
|
|
31
|
+
file: File;
|
|
32
|
+
type: 'image' | 'document';
|
|
33
|
+
}) => Promise<{
|
|
34
|
+
url: string;
|
|
35
|
+
name: string;
|
|
36
|
+
}>;
|
|
37
|
+
}
|
|
38
|
+
export interface AiChatConfig extends AiChatApiCallbacks {
|
|
19
39
|
apiPath?: string;
|
|
20
40
|
storageKey?: string;
|
|
21
41
|
position?: {
|
|
@@ -26,12 +46,11 @@ export interface AiChatConfig {
|
|
|
26
46
|
drawerWidth?: number;
|
|
27
47
|
zIndex?: number;
|
|
28
48
|
showSessionPanel?: boolean;
|
|
29
|
-
showExport?: boolean;
|
|
30
49
|
onBeforeSend?: (content: string) => boolean | Promise<boolean>;
|
|
31
50
|
onError?: (error: Error) => void;
|
|
32
51
|
onSuccess?: () => void;
|
|
33
52
|
}
|
|
34
|
-
export interface UseAiChatOptions {
|
|
53
|
+
export interface UseAiChatOptions extends AiChatApiCallbacks {
|
|
35
54
|
apiPath?: string;
|
|
36
55
|
storageKey?: string;
|
|
37
56
|
onBeforeSend?: (content: string) => boolean | Promise<boolean>;
|
|
@@ -49,8 +68,6 @@ export interface UseAiChatReturn {
|
|
|
49
68
|
sendQuestion: (content: string, regenId?: string) => Promise<void>;
|
|
50
69
|
regenerateAnswer: (msg: Message) => void;
|
|
51
70
|
deleteSingleMsg: (id: string, e: React.MouseEvent) => void;
|
|
52
|
-
clearCurrentSession: () => void;
|
|
53
|
-
exportCurrentSession: () => void;
|
|
54
71
|
cancelRequest: () => void;
|
|
55
72
|
toggleVisible: (v?: boolean) => void;
|
|
56
73
|
}
|
|
@@ -105,13 +122,6 @@ export interface NavigationOptions {
|
|
|
105
122
|
queryParams?: Record<string, string>;
|
|
106
123
|
fragment?: string;
|
|
107
124
|
}
|
|
108
|
-
export interface QuestionTemplate {
|
|
109
|
-
id: string;
|
|
110
|
-
name: string;
|
|
111
|
-
content: string;
|
|
112
|
-
category?: MessageCategory;
|
|
113
|
-
tags?: string[];
|
|
114
|
-
}
|
|
115
125
|
export interface EnhancedAiChatConfig extends AiChatConfig {
|
|
116
126
|
taskWorkflow?: {
|
|
117
127
|
enabled?: boolean;
|
|
@@ -132,26 +142,15 @@ export interface EnhancedAiChatConfig extends AiChatConfig {
|
|
|
132
142
|
preserveQueryParams?: boolean;
|
|
133
143
|
urlBuilder?: (taskId: string, taskType: string) => string;
|
|
134
144
|
};
|
|
135
|
-
questionConfig?: {
|
|
136
|
-
enableQuestionEnhancement?: boolean;
|
|
137
|
-
categories?: string[];
|
|
138
|
-
templates?: QuestionTemplate[];
|
|
139
|
-
maxRelatedQuestions?: number;
|
|
140
|
-
};
|
|
141
145
|
}
|
|
142
146
|
export interface EnhancedUseAiChatReturn extends UseAiChatReturn {
|
|
143
147
|
tasks: Task[];
|
|
144
148
|
createTask: (task: Omit<Task, 'id' | 'createTime'>) => void;
|
|
145
149
|
updateTaskStatus: (taskId: string, status: TaskStatus) => void;
|
|
146
150
|
deleteTask: (taskId: string) => void;
|
|
147
|
-
exportTasks: (format?: 'json' | 'csv') => void;
|
|
148
151
|
recognizeIntent: (text: string) => Intent;
|
|
149
152
|
createTaskFromNaturalLanguage: (description: string) => Promise<TaskCreationResult>;
|
|
150
153
|
updateUrlWithTaskId: (taskId: string, options?: NavigationOptions) => void;
|
|
151
154
|
refreshCurrentPage: (taskId?: string) => void;
|
|
152
155
|
executeTaskCreationWorkflow: (description: string) => Promise<void>;
|
|
153
|
-
categorizeQuestion: (content: string) => MessageCategory;
|
|
154
|
-
getRelatedQuestions: (messageId: string) => string[];
|
|
155
|
-
applyQuestionTemplate: (templateId: string) => void;
|
|
156
|
-
questionTemplates: QuestionTemplate[];
|
|
157
156
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/business/AiChat/type.ts"],
|
|
4
|
-
"sourcesContent": ["export interface Message {\n id: string;\n role: 'user' | 'ai' | 'system';\n content: string;\n loading?: boolean;\n category?: MessageCategory;\n tags?: string[];\n taskId?: string;\n}\n\nexport type MessageCategory = 'technical' | 'business' | 'general' | 'task_creation' | 'task_query' | 'api_call';\n\nexport interface ChatSession {\n id: string;\n title: string;\n createTime: number;\n messages: Message[];\n}\n\nexport interface AiChatConfig {\n apiPath?: string;\n storageKey?: string;\n position?: { bottom?: number; right?: number };\n buttonSize?: number;\n drawerWidth?: number;\n zIndex?: number;\n showSessionPanel?: boolean;\n
|
|
4
|
+
"sourcesContent": ["export interface Message {\n id: string;\n role: 'user' | 'ai' | 'system';\n content: string;\n loading?: boolean;\n category?: MessageCategory;\n tags?: string[];\n taskId?: string;\n}\n\nexport type MessageCategory = 'technical' | 'business' | 'general' | 'task_creation' | 'task_query' | 'api_call';\n\nexport interface ChatSession {\n id: string;\n title: string;\n createTime: number;\n messages: Message[];\n}\n\nexport interface AiChatApiCallbacks {\n onFetchSessions?: () => Promise<ChatSession[]>;\n onFetchSessionDetail?: (sessionId: string) => Promise<ChatSession>;\n onCreateSession?: () => Promise<{ sessionId: string }>;\n onSendMessage?: (params: { sessionId: string; prompt: string; history: Message[] }) => Promise<void>;\n onUploadFile?: (params: {\n sessionId: string;\n file: File;\n type: 'image' | 'document';\n }) => Promise<{ url: string; name: string }>;\n}\n\nexport interface AiChatConfig extends AiChatApiCallbacks {\n apiPath?: string;\n storageKey?: string;\n position?: { bottom?: number; right?: number };\n buttonSize?: number;\n drawerWidth?: number;\n zIndex?: number;\n showSessionPanel?: boolean;\n onBeforeSend?: (content: string) => boolean | Promise<boolean>;\n onError?: (error: Error) => void;\n onSuccess?: () => void;\n}\n\nexport interface UseAiChatOptions extends AiChatApiCallbacks {\n apiPath?: string;\n storageKey?: string;\n onBeforeSend?: (content: string) => boolean | Promise<boolean>;\n onError?: (error: Error) => void;\n onSuccess?: () => void;\n}\n\nexport interface UseAiChatReturn {\n sessions: ChatSession[];\n activeSession: ChatSession | null;\n loading: boolean;\n visible: boolean;\n createNewSession: () => void;\n switchSession: (id: string) => void;\n deleteSession: (id: string, e: React.MouseEvent) => void;\n sendQuestion: (content: string, regenId?: string) => Promise<void>;\n regenerateAnswer: (msg: Message) => void;\n deleteSingleMsg: (id: string, e: React.MouseEvent) => void;\n cancelRequest: () => void;\n toggleVisible: (v?: boolean) => void;\n}\n\n// ============= 意图识别类型 =============\nexport interface Intent {\n type: IntentType;\n confidence: number;\n parameters: Record<string, any>;\n rawText: string;\n matchedPattern?: string;\n}\n\nexport type IntentType = 'create_task' | 'query_task' | 'update_task' | 'delete_task' | 'call_api' | 'general_question';\n\nexport interface IntentPattern {\n type: IntentType;\n patterns: RegExp[];\n taskType?: TaskCategory;\n}\n\n// ============= 任务类型 =============\nexport interface Task {\n id: string;\n title: string;\n description: string;\n category: TaskCategory;\n priority: TaskPriority;\n status: TaskStatus;\n dueDate?: number;\n assignee?: string;\n sourceMessageId?: string;\n createTime: number;\n apiResponse?: Record<string, any>;\n}\n\nexport type TaskCategory = 'paimon' | 'data_sync' | 'report' | 'etl' | 'bug' | 'feature' | 'analysis' | 'other';\nexport type TaskPriority = 'high' | 'medium' | 'low';\nexport type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'cancelled' | 'failed';\n\n// ============= 任务类型配置 =============\nexport interface TaskTypeConfig {\n type: string;\n name: string;\n description?: string;\n apiEndpoint?: string;\n defaultParams?: Record<string, any>;\n urlPattern?: string;\n keywords?: string[];\n}\n\n// ============= 任务创建结果 =============\nexport interface TaskCreationResult {\n success: boolean;\n taskId?: string;\n taskData?: any;\n error?: string;\n redirectUrl?: string;\n}\n\n// ============= 导航选项 =============\nexport interface NavigationOptions {\n replace?: boolean;\n merge?: boolean;\n queryParams?: Record<string, string>;\n fragment?: string;\n}\n\n// ============= 增强配置 =============\nexport interface EnhancedAiChatConfig extends AiChatConfig {\n taskWorkflow?: {\n enabled?: boolean;\n createTaskApi?: string;\n supportedTaskTypes?: TaskTypeConfig[];\n autoNavigate?: boolean;\n taskIdParamName?: string;\n taskTypeParamName?: string;\n };\n intentRecognition?: {\n enabled?: boolean;\n customPatterns?: IntentPattern[];\n confidenceThreshold?: number;\n };\n navigation?: {\n refreshStrategy?: 'immediate' | 'delayed' | 'manual';\n refreshDelay?: number;\n preserveQueryParams?: boolean;\n urlBuilder?: (taskId: string, taskType: string) => string;\n };\n}\n\n// ============= 增强Hook返回类型 =============\nexport interface EnhancedUseAiChatReturn extends UseAiChatReturn {\n // 任务管理\n tasks: Task[];\n createTask: (task: Omit<Task, 'id' | 'createTime'>) => void;\n updateTaskStatus: (taskId: string, status: TaskStatus) => void;\n deleteTask: (taskId: string) => void;\n\n // 意图识别\n recognizeIntent: (text: string) => Intent;\n\n // 任务工作流\n createTaskFromNaturalLanguage: (description: string) => Promise<TaskCreationResult>;\n updateUrlWithTaskId: (taskId: string, options?: NavigationOptions) => void;\n refreshCurrentPage: (taskId?: string) => void;\n executeTaskCreationWorkflow: (description: string) => Promise<void>;\n}\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -34,21 +34,49 @@ function useAiChat(options) {
|
|
|
34
34
|
const [cancelFn, setCancelFn] = (0, import_react.useState)(null);
|
|
35
35
|
const [visible, setVisible] = (0, import_react.useState)(false);
|
|
36
36
|
(0, import_react.useEffect)(() => {
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
37
|
+
const loadSessions = async () => {
|
|
38
|
+
if (options == null ? void 0 : options.onFetchSessions) {
|
|
39
|
+
try {
|
|
40
|
+
const list = await options.onFetchSessions();
|
|
41
|
+
setSessions(list);
|
|
42
|
+
if (list.length > 0)
|
|
43
|
+
setActiveSession(list[list.length - 1]);
|
|
44
|
+
} catch (err) {
|
|
45
|
+
console.error("加载会话失败:", err);
|
|
46
|
+
}
|
|
47
|
+
} else {
|
|
48
|
+
const saved = localStorage.getItem(storageKey);
|
|
49
|
+
if (saved) {
|
|
50
|
+
const list = JSON.parse(saved);
|
|
51
|
+
setSessions(list);
|
|
52
|
+
if (list.length > 0)
|
|
53
|
+
setActiveSession(list[list.length - 1]);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
loadSessions();
|
|
58
|
+
}, [storageKey, options == null ? void 0 : options.onFetchSessions]);
|
|
45
59
|
(0, import_react.useEffect)(() => {
|
|
46
|
-
if (sessions.length)
|
|
60
|
+
if (!(options == null ? void 0 : options.onFetchSessions) && sessions.length) {
|
|
47
61
|
localStorage.setItem(storageKey, JSON.stringify(sessions));
|
|
48
|
-
|
|
49
|
-
|
|
62
|
+
}
|
|
63
|
+
}, [sessions, storageKey, options == null ? void 0 : options.onFetchSessions]);
|
|
64
|
+
const createNewSession = (0, import_react.useCallback)(async () => {
|
|
65
|
+
let newSessionId;
|
|
66
|
+
if (options == null ? void 0 : options.onCreateSession) {
|
|
67
|
+
try {
|
|
68
|
+
const result = await options.onCreateSession();
|
|
69
|
+
newSessionId = result.sessionId;
|
|
70
|
+
} catch (err) {
|
|
71
|
+
console.error("创建会话失败:", err);
|
|
72
|
+
import_antd.message.error("创建会话失败");
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
} else {
|
|
76
|
+
newSessionId = Date.now().toString();
|
|
77
|
+
}
|
|
50
78
|
const s = {
|
|
51
|
-
id:
|
|
79
|
+
id: newSessionId,
|
|
52
80
|
title: "新会话",
|
|
53
81
|
createTime: Date.now(),
|
|
54
82
|
messages: []
|
|
@@ -56,14 +84,24 @@ function useAiChat(options) {
|
|
|
56
84
|
setSessions((prev) => [...prev, s]);
|
|
57
85
|
setActiveSession(s);
|
|
58
86
|
setVisible(true);
|
|
59
|
-
}, []);
|
|
87
|
+
}, [options == null ? void 0 : options.onCreateSession]);
|
|
60
88
|
const switchSession = (0, import_react.useCallback)(
|
|
61
|
-
(id) => {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
89
|
+
async (id) => {
|
|
90
|
+
if (options == null ? void 0 : options.onFetchSessionDetail) {
|
|
91
|
+
try {
|
|
92
|
+
const detail = await options.onFetchSessionDetail(id);
|
|
93
|
+
setActiveSession(detail);
|
|
94
|
+
} catch (err) {
|
|
95
|
+
console.error("获取会话详情失败:", err);
|
|
96
|
+
import_antd.message.error("获取会话详情失败");
|
|
97
|
+
}
|
|
98
|
+
} else {
|
|
99
|
+
const s = sessions.find((x) => x.id === id);
|
|
100
|
+
if (s)
|
|
101
|
+
setActiveSession(s);
|
|
102
|
+
}
|
|
65
103
|
},
|
|
66
|
-
[sessions]
|
|
104
|
+
[sessions, options == null ? void 0 : options.onFetchSessionDetail]
|
|
67
105
|
);
|
|
68
106
|
const deleteSession = (0, import_react.useCallback)(
|
|
69
107
|
(id, e) => {
|
|
@@ -77,6 +115,7 @@ function useAiChat(options) {
|
|
|
77
115
|
);
|
|
78
116
|
const sendQuestion = (0, import_react.useCallback)(
|
|
79
117
|
async (content, regenId) => {
|
|
118
|
+
var _a, _b;
|
|
80
119
|
if (!content.trim() || !activeSession)
|
|
81
120
|
return;
|
|
82
121
|
if (options == null ? void 0 : options.onBeforeSend) {
|
|
@@ -105,40 +144,61 @@ function useAiChat(options) {
|
|
|
105
144
|
setActiveSession(updated);
|
|
106
145
|
setSessions((prev) => prev.map((x) => x.id === updated.id ? updated : x));
|
|
107
146
|
setLoading(true);
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
},
|
|
116
|
-
(text) => {
|
|
117
|
-
if (!activeSession)
|
|
118
|
-
return;
|
|
119
|
-
const ms = updated.messages.map((m) => m.loading ? { ...m, content: m.content + text } : m);
|
|
120
|
-
const su = { ...updated, messages: ms };
|
|
121
|
-
setActiveSession(su);
|
|
122
|
-
setSessions((prev) => prev.map((x) => x.id === su.id ? su : x));
|
|
123
|
-
},
|
|
124
|
-
() => {
|
|
125
|
-
var _a;
|
|
147
|
+
if (options == null ? void 0 : options.onSendMessage) {
|
|
148
|
+
try {
|
|
149
|
+
await options.onSendMessage({
|
|
150
|
+
sessionId: activeSession.id,
|
|
151
|
+
prompt: content,
|
|
152
|
+
history: updated.messages.filter((m) => !m.loading)
|
|
153
|
+
});
|
|
126
154
|
setLoading(false);
|
|
127
155
|
const ms = updated.messages.map((m) => m.loading ? { ...m, loading: false } : m);
|
|
128
156
|
const su = { ...updated, messages: ms };
|
|
129
157
|
setActiveSession(su);
|
|
130
158
|
setSessions((prev) => prev.map((x) => x.id === su.id ? su : x));
|
|
131
159
|
(_a = options == null ? void 0 : options.onSuccess) == null ? void 0 : _a.call(options);
|
|
132
|
-
}
|
|
133
|
-
(err) => {
|
|
134
|
-
var _a;
|
|
160
|
+
} catch (err) {
|
|
135
161
|
setLoading(false);
|
|
136
|
-
const
|
|
137
|
-
import_antd.message.error(`请求异常:${
|
|
138
|
-
(
|
|
162
|
+
const error = err;
|
|
163
|
+
import_antd.message.error(`请求异常:${error.message}`);
|
|
164
|
+
(_b = options == null ? void 0 : options.onError) == null ? void 0 : _b.call(options, error);
|
|
139
165
|
}
|
|
140
|
-
|
|
141
|
-
|
|
166
|
+
} else {
|
|
167
|
+
const cancel = await (0, import_sse.createSSE)(
|
|
168
|
+
apiPath,
|
|
169
|
+
{
|
|
170
|
+
prompt: content,
|
|
171
|
+
history: updated.messages.filter((m) => !m.loading),
|
|
172
|
+
useMcp: true,
|
|
173
|
+
sessionId: activeSession.id
|
|
174
|
+
},
|
|
175
|
+
(text) => {
|
|
176
|
+
if (!activeSession)
|
|
177
|
+
return;
|
|
178
|
+
const ms = updated.messages.map((m) => m.loading ? { ...m, content: m.content + text } : m);
|
|
179
|
+
const su = { ...updated, messages: ms };
|
|
180
|
+
setActiveSession(su);
|
|
181
|
+
setSessions((prev) => prev.map((x) => x.id === su.id ? su : x));
|
|
182
|
+
},
|
|
183
|
+
() => {
|
|
184
|
+
var _a2;
|
|
185
|
+
setLoading(false);
|
|
186
|
+
const ms = updated.messages.map((m) => m.loading ? { ...m, loading: false } : m);
|
|
187
|
+
const su = { ...updated, messages: ms };
|
|
188
|
+
setActiveSession(su);
|
|
189
|
+
setSessions((prev) => prev.map((x) => x.id === su.id ? su : x));
|
|
190
|
+
(_a2 = options == null ? void 0 : options.onSuccess) == null ? void 0 : _a2.call(options);
|
|
191
|
+
},
|
|
192
|
+
(err) => {
|
|
193
|
+
var _a2;
|
|
194
|
+
setLoading(false);
|
|
195
|
+
const errorMsg = err.message;
|
|
196
|
+
import_antd.message.error(`请求异常:${errorMsg}`);
|
|
197
|
+
(_a2 = options == null ? void 0 : options.onError) == null ? void 0 : _a2.call(options, err);
|
|
198
|
+
}
|
|
199
|
+
);
|
|
200
|
+
setCancelFn(() => cancel);
|
|
201
|
+
}
|
|
142
202
|
},
|
|
143
203
|
[activeSession, apiPath, options]
|
|
144
204
|
);
|
|
@@ -165,34 +225,6 @@ function useAiChat(options) {
|
|
|
165
225
|
},
|
|
166
226
|
[activeSession]
|
|
167
227
|
);
|
|
168
|
-
const clearCurrentSession = (0, import_react.useCallback)(() => {
|
|
169
|
-
if (!activeSession)
|
|
170
|
-
return;
|
|
171
|
-
const up = { ...activeSession, messages: [] };
|
|
172
|
-
setActiveSession(up);
|
|
173
|
-
setSessions((prev) => prev.map((x) => x.id === up.id ? up : x));
|
|
174
|
-
}, [activeSession]);
|
|
175
|
-
const exportCurrentSession = (0, import_react.useCallback)(() => {
|
|
176
|
-
if (!activeSession || activeSession.messages.length === 0) {
|
|
177
|
-
import_antd.message.warning("无内容可导出");
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
const data = {
|
|
181
|
-
title: activeSession.title,
|
|
182
|
-
createTime: new Date(activeSession.createTime).toLocaleString(),
|
|
183
|
-
exportTime: (/* @__PURE__ */ new Date()).toLocaleString(),
|
|
184
|
-
messages: activeSession.messages
|
|
185
|
-
};
|
|
186
|
-
const blob = new Blob([JSON.stringify(data, null, 2)], {
|
|
187
|
-
type: "application/json"
|
|
188
|
-
});
|
|
189
|
-
const a = document.createElement("a");
|
|
190
|
-
a.href = URL.createObjectURL(blob);
|
|
191
|
-
a.download = `${activeSession.title}_${Date.now()}.json`;
|
|
192
|
-
a.click();
|
|
193
|
-
URL.revokeObjectURL(a.href);
|
|
194
|
-
import_antd.message.success("导出成功");
|
|
195
|
-
}, [activeSession]);
|
|
196
228
|
const cancelRequest = (0, import_react.useCallback)(() => {
|
|
197
229
|
cancelFn == null ? void 0 : cancelFn();
|
|
198
230
|
setLoading(false);
|
|
@@ -209,8 +241,6 @@ function useAiChat(options) {
|
|
|
209
241
|
sendQuestion,
|
|
210
242
|
regenerateAnswer,
|
|
211
243
|
deleteSingleMsg,
|
|
212
|
-
clearCurrentSession,
|
|
213
|
-
exportCurrentSession,
|
|
214
244
|
cancelRequest,
|
|
215
245
|
toggleVisible
|
|
216
246
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/business/AiChat/useAiChat.ts"],
|
|
4
|
-
"sourcesContent": ["import { message } from 'antd';\nimport { useCallback, useEffect, useState } from 'react';\nimport { createSSE } from './sse';\nimport type { ChatSession, Message, UseAiChatOptions, UseAiChatReturn } from './type';\n\nexport function useAiChat(options?: UseAiChatOptions): UseAiChatReturn {\n const apiPath = options?.apiPath || '/api/ai/chat-stream';\n const storageKey = options?.storageKey || 'ai_chat_sessions';\n\n const [sessions, setSessions] = useState<ChatSession[]>([]);\n const [activeSession, setActiveSession] = useState<ChatSession | null>(null);\n const [loading, setLoading] = useState(false);\n const [cancelFn, setCancelFn] = useState<(() => void) | null>(null);\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n const saved = localStorage.getItem(storageKey);\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AACxB,mBAAiD;AACjD,iBAA0B;AAGnB,SAAS,UAAU,SAA6C;AACrE,QAAM,WAAU,mCAAS,YAAW;AACpC,QAAM,cAAa,mCAAS,eAAc;AAE1C,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAwB,CAAC,CAAC;AAC1D,QAAM,CAAC,eAAe,gBAAgB,QAAI,uBAA6B,IAAI;AAC3E,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAC5C,QAAM,CAAC,UAAU,WAAW,QAAI,uBAA8B,IAAI;AAClE,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAE5C,8BAAU,MAAM;AACd,UAAM,QAAQ,aAAa,QAAQ,UAAU;AAC7C,
|
|
6
|
-
"names": []
|
|
4
|
+
"sourcesContent": ["import { message } from 'antd';\nimport { useCallback, useEffect, useState } from 'react';\nimport { createSSE } from './sse';\nimport type { ChatSession, Message, UseAiChatOptions, UseAiChatReturn } from './type';\n\nexport function useAiChat(options?: UseAiChatOptions): UseAiChatReturn {\n const apiPath = options?.apiPath || '/api/ai/chat-stream';\n const storageKey = options?.storageKey || 'ai_chat_sessions';\n\n const [sessions, setSessions] = useState<ChatSession[]>([]);\n const [activeSession, setActiveSession] = useState<ChatSession | null>(null);\n const [loading, setLoading] = useState(false);\n const [cancelFn, setCancelFn] = useState<(() => void) | null>(null);\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n const loadSessions = async () => {\n if (options?.onFetchSessions) {\n try {\n const list = await options.onFetchSessions();\n setSessions(list);\n if (list.length > 0) setActiveSession(list[list.length - 1]);\n } catch (err) {\n console.error('加载会话失败:', err);\n }\n } else {\n const saved = localStorage.getItem(storageKey);\n if (saved) {\n const list = JSON.parse(saved);\n setSessions(list);\n if (list.length > 0) setActiveSession(list[list.length - 1]);\n }\n }\n };\n loadSessions();\n }, [storageKey, options?.onFetchSessions]);\n\n useEffect(() => {\n if (!options?.onFetchSessions && sessions.length) {\n localStorage.setItem(storageKey, JSON.stringify(sessions));\n }\n }, [sessions, storageKey, options?.onFetchSessions]);\n\n const createNewSession = useCallback(async () => {\n let newSessionId: string;\n\n if (options?.onCreateSession) {\n try {\n const result = await options.onCreateSession();\n newSessionId = result.sessionId;\n } catch (err) {\n console.error('创建会话失败:', err);\n message.error('创建会话失败');\n return;\n }\n } else {\n newSessionId = Date.now().toString();\n }\n\n const s: ChatSession = {\n id: newSessionId,\n title: '新会话',\n createTime: Date.now(),\n messages: [],\n };\n setSessions((prev) => [...prev, s]);\n setActiveSession(s);\n setVisible(true);\n }, [options?.onCreateSession]);\n\n const switchSession = useCallback(\n async (id: string) => {\n if (options?.onFetchSessionDetail) {\n try {\n const detail = await options.onFetchSessionDetail(id);\n setActiveSession(detail);\n } catch (err) {\n console.error('获取会话详情失败:', err);\n message.error('获取会话详情失败');\n }\n } else {\n const s = sessions.find((x) => x.id === id);\n if (s) setActiveSession(s);\n }\n },\n [sessions, options?.onFetchSessionDetail],\n );\n\n const deleteSession = useCallback(\n (id: string, e: React.MouseEvent) => {\n e.stopPropagation();\n const ns = sessions.filter((x) => x.id !== id);\n setSessions(ns);\n if (activeSession?.id === id) setActiveSession(ns.at(-1) ?? null);\n },\n [sessions, activeSession],\n );\n\n const sendQuestion = useCallback(\n async (content: string, regenId?: string) => {\n if (!content.trim() || !activeSession) return;\n\n if (options?.onBeforeSend) {\n const canSend = await options.onBeforeSend(content);\n if (!canSend) return;\n }\n\n const user: Message = { id: `${Date.now()}_u`, role: 'user', content };\n const ai: Message = {\n id: `${Date.now()}_ai`,\n role: 'ai',\n content: '',\n loading: true,\n };\n\n let newMsgs: Message[] = [];\n if (regenId) {\n newMsgs = activeSession.messages.map((m) => (m.id === regenId ? ai : m));\n } else {\n newMsgs = [...activeSession.messages, user, ai];\n }\n\n const updated: ChatSession = {\n ...activeSession,\n title: activeSession.messages.length === 0 ? content.slice(0, 20) : activeSession.title,\n messages: newMsgs,\n };\n setActiveSession(updated);\n setSessions((prev) => prev.map((x) => (x.id === updated.id ? updated : x)));\n\n setLoading(true);\n\n // 如果提供了 onSendMessage 回调,则使用自定义发送逻辑\n if (options?.onSendMessage) {\n try {\n await options.onSendMessage({\n sessionId: activeSession.id,\n prompt: content,\n history: updated.messages.filter((m) => !m.loading),\n });\n setLoading(false);\n const ms = updated.messages.map((m) => (m.loading ? { ...m, loading: false } : m));\n const su = { ...updated, messages: ms };\n setActiveSession(su);\n setSessions((prev) => prev.map((x) => (x.id === su.id ? su : x)));\n options?.onSuccess?.();\n } catch (err) {\n setLoading(false);\n const error = err as Error;\n message.error(`请求异常:${error.message}`);\n options?.onError?.(error);\n }\n } else {\n // 使用默认 SSE 逻辑\n const cancel = await createSSE(\n apiPath,\n {\n prompt: content,\n history: updated.messages.filter((m) => !m.loading),\n useMcp: true,\n sessionId: activeSession.id,\n },\n (text) => {\n if (!activeSession) return;\n const ms = updated.messages.map((m) => (m.loading ? { ...m, content: m.content + text } : m));\n const su = { ...updated, messages: ms };\n setActiveSession(su);\n setSessions((prev) => prev.map((x) => (x.id === su.id ? su : x)));\n },\n () => {\n setLoading(false);\n const ms = updated.messages.map((m) => (m.loading ? { ...m, loading: false } : m));\n const su = { ...updated, messages: ms };\n setActiveSession(su);\n setSessions((prev) => prev.map((x) => (x.id === su.id ? su : x)));\n options?.onSuccess?.();\n },\n (err) => {\n setLoading(false);\n const errorMsg = err.message;\n message.error(`请求异常:${errorMsg}`);\n options?.onError?.(err);\n },\n );\n setCancelFn(() => cancel);\n }\n },\n [activeSession, apiPath, options],\n );\n\n const regenerateAnswer = useCallback(\n (msg: Message) => {\n if (!activeSession) return;\n const idx = activeSession.messages.findIndex((x) => x.id === msg.id);\n const userMsg = activeSession.messages[idx - 1];\n if (userMsg?.role === 'user') sendQuestion(userMsg.content, msg.id);\n },\n [activeSession, sendQuestion],\n );\n\n const deleteSingleMsg = useCallback(\n (id: string, e: React.MouseEvent) => {\n e.stopPropagation();\n if (!activeSession) return;\n const ms = activeSession.messages.filter((x) => x.id !== id);\n const up = { ...activeSession, messages: ms };\n setActiveSession(up);\n setSessions((prev) => prev.map((x) => (x.id === up.id ? up : x)));\n },\n [activeSession],\n );\n\n const cancelRequest = useCallback(() => {\n cancelFn?.();\n setLoading(false);\n }, [cancelFn]);\n\n const toggleVisible = useCallback((v?: boolean) => setVisible(v ?? !visible), [visible]);\n\n return {\n sessions,\n activeSession,\n loading,\n visible,\n createNewSession,\n switchSession,\n deleteSession,\n sendQuestion,\n regenerateAnswer,\n deleteSingleMsg,\n cancelRequest,\n toggleVisible,\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["_a"]
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { recognizeIntent } from './intentRecognizer';
|
|
2
|
-
import type { Task, TaskCreationResult,
|
|
2
|
+
import type { NavigationOptions, Task, TaskCreationResult, TaskTypeConfig } from './type';
|
|
3
3
|
export interface UseTaskWorkflowOptions {
|
|
4
4
|
enabled?: boolean;
|
|
5
5
|
createTaskApi?: string;
|
|
@@ -16,7 +16,6 @@ export interface UseTaskWorkflowReturn {
|
|
|
16
16
|
createTask: (task: Omit<Task, 'id' | 'createTime'>) => void;
|
|
17
17
|
updateTaskStatus: (taskId: string, status: Task['status']) => void;
|
|
18
18
|
deleteTask: (taskId: string) => void;
|
|
19
|
-
exportTasks: (format?: 'json' | 'csv') => void;
|
|
20
19
|
recognizeIntent: (text: string) => ReturnType<typeof recognizeIntent>;
|
|
21
20
|
createTaskFromNaturalLanguage: (description: string) => Promise<TaskCreationResult>;
|
|
22
21
|
updateUrlWithTaskId: (taskId: string, options?: NavigationOptions) => void;
|
|
@@ -54,39 +54,6 @@ function useTaskWorkflow(options = {}) {
|
|
|
54
54
|
const deleteTask = (0, import_react.useCallback)((taskId) => {
|
|
55
55
|
setTasks((prev) => prev.filter((task) => task.id !== taskId));
|
|
56
56
|
}, []);
|
|
57
|
-
const exportTasks = (0, import_react.useCallback)(
|
|
58
|
-
(format = "json") => {
|
|
59
|
-
if (tasks.length === 0) {
|
|
60
|
-
import_antd.message.warning("没有任务可导出");
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
let content;
|
|
64
|
-
let filename;
|
|
65
|
-
let mimeType;
|
|
66
|
-
if (format === "json") {
|
|
67
|
-
content = JSON.stringify(tasks, null, 2);
|
|
68
|
-
filename = `tasks_${Date.now()}.json`;
|
|
69
|
-
mimeType = "application/json";
|
|
70
|
-
} else {
|
|
71
|
-
const headers = "ID,Title,Description,Category,Priority,Status,CreateTime";
|
|
72
|
-
const rows = tasks.map(
|
|
73
|
-
(t) => `"${t.id}","${t.title}","${t.description}","${t.category}","${t.priority}","${t.status}","${new Date(t.createTime).toLocaleString()}"`
|
|
74
|
-
);
|
|
75
|
-
content = [headers, ...rows].join("\n");
|
|
76
|
-
filename = `tasks_${Date.now()}.csv`;
|
|
77
|
-
mimeType = "text/csv";
|
|
78
|
-
}
|
|
79
|
-
const blob = new Blob([content], { type: mimeType });
|
|
80
|
-
const url = URL.createObjectURL(blob);
|
|
81
|
-
const a = document.createElement("a");
|
|
82
|
-
a.href = url;
|
|
83
|
-
a.download = filename;
|
|
84
|
-
a.click();
|
|
85
|
-
URL.revokeObjectURL(url);
|
|
86
|
-
import_antd.message.success(`导出成功 (${tasks.length} 个任务)`);
|
|
87
|
-
},
|
|
88
|
-
[tasks]
|
|
89
|
-
);
|
|
90
57
|
const recognizeIntentCallback = (0, import_react.useCallback)((text) => (0, import_intentRecognizer.recognizeIntent)(text), []);
|
|
91
58
|
const createTaskFromNaturalLanguage = (0, import_react.useCallback)(
|
|
92
59
|
async (description) => {
|
|
@@ -201,7 +168,6 @@ function useTaskWorkflow(options = {}) {
|
|
|
201
168
|
createTask,
|
|
202
169
|
updateTaskStatus,
|
|
203
170
|
deleteTask,
|
|
204
|
-
exportTasks,
|
|
205
171
|
recognizeIntent: recognizeIntentCallback,
|
|
206
172
|
createTaskFromNaturalLanguage,
|
|
207
173
|
updateUrlWithTaskId,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/business/AiChat/useTaskWorkflow.ts"],
|
|
4
|
-
"sourcesContent": ["import { message } from 'antd';\nimport { useCallback, useState } from 'react';\nimport {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AACxB,mBAAsC;AACtC,8BAAsD;AACtD,+BAAyC;
|
|
4
|
+
"sourcesContent": ["import { message } from 'antd';\nimport { useCallback, useState } from 'react';\nimport { parseTaskDescription, recognizeIntent } from './intentRecognizer';\nimport { delay, NavigationManager } from './navigationManager';\nimport type { NavigationOptions, Task, TaskCreationResult, TaskTypeConfig } from './type';\n\nexport interface UseTaskWorkflowOptions {\n enabled?: boolean;\n createTaskApi?: string;\n supportedTaskTypes?: TaskTypeConfig[];\n autoNavigate?: boolean;\n refreshDelay?: number;\n taskIdParamName?: string;\n taskTypeParamName?: string;\n onTaskCreated?: (taskId: string, taskData?: any) => void;\n onError?: (error: Error) => void;\n}\n\nexport interface UseTaskWorkflowReturn {\n tasks: Task[];\n createTask: (task: Omit<Task, 'id' | 'createTime'>) => void;\n updateTaskStatus: (taskId: string, status: Task['status']) => void;\n deleteTask: (taskId: string) => void;\n\n // 意图识别\n recognizeIntent: (text: string) => ReturnType<typeof recognizeIntent>;\n\n // 任务工作流\n createTaskFromNaturalLanguage: (description: string) => Promise<TaskCreationResult>;\n updateUrlWithTaskId: (taskId: string, options?: NavigationOptions) => void;\n refreshCurrentPage: (taskId?: string) => void;\n executeTaskCreationWorkflow: (description: string) => Promise<void>;\n}\n\nconst DEFAULT_API_PATH = '/api/task/create';\n\nexport function useTaskWorkflow(options: UseTaskWorkflowOptions = {}): UseTaskWorkflowReturn {\n const {\n enabled = true,\n createTaskApi = DEFAULT_API_PATH,\n autoNavigate = true,\n refreshDelay = 1500,\n taskIdParamName = 'taskId',\n taskTypeParamName = 'type',\n onTaskCreated,\n onError,\n } = options;\n\n const [tasks, setTasks] = useState<Task[]>([]);\n\n // 创建任务\n const createTask = useCallback((task: Omit<Task, 'id' | 'createTime'>) => {\n const newTask: Task = {\n ...task,\n id: Date.now().toString(),\n createTime: Date.now(),\n };\n setTasks((prev) => [...prev, newTask]);\n return newTask;\n }, []);\n\n // 更新任务状态\n const updateTaskStatus = useCallback((taskId: string, status: Task['status']) => {\n setTasks((prev) => prev.map((task) => (task.id === taskId ? { ...task, status } : task)));\n }, []);\n\n // 删除任务\n const deleteTask = useCallback((taskId: string) => {\n setTasks((prev) => prev.filter((task) => task.id !== taskId));\n }, []);\n\n // 识别意图\n const recognizeIntentCallback = useCallback((text: string) => recognizeIntent(text), []);\n\n // 从自然语言创建任务\n const createTaskFromNaturalLanguage = useCallback(\n async (description: string): Promise<TaskCreationResult> => {\n try {\n // 解析任务描述\n const taskDesc = parseTaskDescription(description);\n\n // 构建请求数据\n const requestData = {\n type: taskDesc.taskType,\n name: taskDesc.taskName,\n description: taskDesc.description,\n priority: taskDesc.priority,\n timestamp: Date.now(),\n };\n\n // 调用API创建任务\n const response = await fetch(createTaskApi, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestData),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const result = await response.json();\n\n if (result.code !== 0 && result.code !== 200) {\n throw new Error(result.message || '创建任务失败');\n }\n\n const taskId = result.data?.taskId || result.data?.id;\n\n if (!taskId) {\n throw new Error('未获取到任务ID');\n }\n\n // 创建本地任务记录\n createTask({\n title: taskDesc.taskName,\n description: taskDesc.description,\n category: taskDesc.taskType as Task['category'],\n priority: taskDesc.priority as Task['priority'],\n status: 'pending',\n sourceMessageId: undefined,\n apiResponse: result.data,\n });\n\n // 触发回调\n onTaskCreated?.(taskId, result.data);\n\n return {\n success: true,\n taskId,\n taskData: result.data,\n redirectUrl: result.data?.redirectUrl,\n };\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n onError?.(err);\n return {\n success: false,\n error: err.message,\n };\n }\n },\n [createTaskApi, createTask, onTaskCreated, onError],\n );\n\n // 更新URL中的任务ID\n const updateUrlWithTaskId = useCallback(\n (taskId: string, options?: NavigationOptions) => {\n const taskType = NavigationManager.getQueryParam(taskTypeParamName);\n NavigationManager.updateQueryParams(\n {\n [taskIdParamName]: taskId,\n ...(taskType ? { [taskTypeParamName]: taskType } : {}),\n },\n {\n replace: options?.replace || false,\n merge: options?.merge !== false,\n queryParams: options?.queryParams,\n },\n );\n },\n [taskIdParamName, taskTypeParamName],\n );\n\n // 刷新当前页面\n const refreshCurrentPage = useCallback(\n (taskId?: string) => {\n if (taskId) {\n updateUrlWithTaskId(taskId);\n }\n\n // 延迟刷新,让用户看到成功消息\n setTimeout(() => {\n window.location.reload();\n }, refreshDelay);\n },\n [updateUrlWithTaskId, refreshDelay],\n );\n\n // 执行任务创建工作流\n const executeTaskCreationWorkflow = useCallback(\n async (description: string) => {\n if (!enabled) {\n message.warning('任务工作流未启用');\n return;\n }\n\n // 1. 调用API创建任务\n const result = await createTaskFromNaturalLanguage(description);\n\n if (!result.success) {\n message.error(`创建任务失败: ${result.error}`);\n return;\n }\n\n const taskId = result.taskId!;\n\n // 2. 显示成功消息\n message.success(`任务创建成功,ID: ${taskId}`);\n\n // 3. 更新URL\n if (autoNavigate) {\n updateUrlWithTaskId(taskId);\n }\n\n // 4. 延迟刷新页面\n if (autoNavigate) {\n await delay(refreshDelay);\n refreshCurrentPage(taskId);\n }\n },\n [enabled, createTaskFromNaturalLanguage, autoNavigate, updateUrlWithTaskId, refreshDelay, refreshCurrentPage],\n );\n\n return {\n tasks,\n createTask,\n updateTaskStatus,\n deleteTask,\n recognizeIntent: recognizeIntentCallback,\n createTaskFromNaturalLanguage,\n updateUrlWithTaskId,\n refreshCurrentPage,\n executeTaskCreationWorkflow,\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["options"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/business/DrawerPageInfo/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { CloseOutlined, DislikeOutlined, LikeOutlined } from '@ant-design/icons';\nimport { Button, Divider, Drawer, Modal, Skeleton } from 'antd';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport styles from './index.module.less';\n\n/** 提示内容数据结构,与 loadData 返回一致 */\nexport interface TipContentData {\n tip_id: number;\n tip_name: string;\n content: string;\n stared: boolean;\n unstared: boolean;\n}\n\n/** 反馈接口参数 */\nexport interface FeedbackParams {\n stared?: boolean;\n unstared?: boolean;\n}\n\n/**\n * DrawerPageInfo 组件的 Props\n * 数据与请求通过 loadData / onFeedback 由父组件负责,组件仅负责展示与交互。\n */\nexport type PropsType = {\n /** 当前提示页 id,用于 loadData / onFeedback 入参 */\n id: number | string;\n /** 抽屉是否打开 */\n open: boolean;\n /** 抽屉打开状态变化回调(关闭时由组件调用) */\n onOpenChange?: (open: boolean) => void;\n /** 加载内容:抽屉打开且 id 有效时由组件调用,父组件请求后返回数据 */\n loadData: (id: number) => Promise<TipContentData>;\n /** 提交反馈(点赞/点踩):父组件请求接口,组件在成功后更新本地状态 */\n onFeedback: (id: number, params: FeedbackParams) => Promise<void>;\n};\n\nconst FEEDBACK_RESET_DELAY = 200;\n\n/**\n * 抽屉式提示页:展示富文本内容与点赞/点踩反馈,内容与反馈请求通过 props 回调解耦。\n */\nconst DrawerPageInfo: React.FC<PropsType> = ({ id, open, onOpenChange, loadData, onFeedback }) => {\n const numericId = Number(id);\n const onOpenChangeFn = onOpenChange ?? (() => {});\n const [title, setTitle] = useState('');\n const [content, setContent] = useState('');\n const [stared, setStared] = useState(false);\n const [unstared, setUnstared] = useState(false);\n const [loading, setLoading] = useState(false);\n const [feedbackLoading, setFeedbackLoading] = useState(false);\n\n const [previewOpen, setPreviewOpen] = useState(false);\n const [previewSrc, setPreviewSrc] = useState('');\n const richTextRef = useRef<HTMLDivElement>(null);\n\n /** 打开时根据 id 拉取内容 */\n useEffect(() => {\n if (!open || !numericId || Number.isNaN(numericId)) return;\n setLoading(true);\n loadData(numericId)\n .then((data) => {\n setTitle(data.tip_name);\n setContent(data.content);\n setStared(data.stared);\n setUnstared(data.unstared);\n })\n .finally(() => setLoading(false));\n }, [open, numericId, loadData]);\n\n const onClose = useCallback(() => {\n setContent('');\n onOpenChangeFn(false);\n }, [onOpenChangeFn]);\n\n /** 点赞:若已点踩则先取消点踩再点赞,否则直接点赞 */\n const handleLike = useCallback(() => {\n setFeedbackLoading(true);\n const nextStared = !stared;\n const run = unstared\n ? onFeedback(numericId, { unstared: false }).then(() => onFeedback(numericId, { stared: nextStared }))\n : onFeedback(numericId, { stared: nextStared });\n\n run\n .then(() => {\n setStared(nextStared);\n if (unstared) setUnstared(false);\n })\n .finally(() => {\n setTimeout(() => setFeedbackLoading(false), FEEDBACK_RESET_DELAY);\n });\n }, [numericId, stared, unstared, onFeedback]);\n\n /** 点踩:若已点赞则先取消点赞再点踩,否则直接点踩 */\n const handleDislike = useCallback(() => {\n setFeedbackLoading(true);\n const nextUnstared = !unstared;\n const run = stared\n ? onFeedback(numericId, { stared: false }).then(() => onFeedback(numericId, { unstared: nextUnstared }))\n : onFeedback(numericId, { unstared: nextUnstared });\n\n run\n .then(() => {\n setUnstared(nextUnstared);\n if (stared) setStared(false);\n })\n .finally(() => {\n setTimeout(() => setFeedbackLoading(false), FEEDBACK_RESET_DELAY);\n });\n }, [numericId, stared, unstared, onFeedback]);\n\n /** 富文本内图片点击放大:content 变化后重新绑定 */\n useEffect(() => {\n const el = richTextRef.current;\n if (!el || !content) return;\n const images = el.querySelectorAll<HTMLImageElement>('img');\n const handler = (e: Event) => {\n const img = e.currentTarget as HTMLImageElement;\n if (img?.src) {\n setPreviewSrc(img.src);\n setPreviewOpen(true);\n }\n };\n images.forEach((img) => {\n img.style.cursor = 'pointer';\n img.addEventListener('click', handler);\n });\n return () => images.forEach((img) => img.removeEventListener('click', handler));\n }, [content]);\n\n const showThanks = (stared || unstared) && !feedbackLoading;\n\n if (!numericId || Number.isNaN(numericId)) return null;\n\n return (\n <Drawer\n title={title}\n width={600}\n open={open}\n onClose={onClose}\n extra={\n <div className={styles.pageInfoDrawerExtraClose} onClick={onClose} role
|
|
4
|
+
"sourcesContent": ["import { CloseOutlined, DislikeOutlined, LikeOutlined } from '@ant-design/icons';\nimport { Button, Divider, Drawer, Modal, Skeleton } from 'antd';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport styles from './index.module.less';\n\n/** 提示内容数据结构,与 loadData 返回一致 */\nexport interface TipContentData {\n tip_id: number;\n tip_name: string;\n content: string;\n stared: boolean;\n unstared: boolean;\n}\n\n/** 反馈接口参数 */\nexport interface FeedbackParams {\n stared?: boolean;\n unstared?: boolean;\n}\n\n/**\n * DrawerPageInfo 组件的 Props\n * 数据与请求通过 loadData / onFeedback 由父组件负责,组件仅负责展示与交互。\n */\nexport type PropsType = {\n /** 当前提示页 id,用于 loadData / onFeedback 入参 */\n id: number | string;\n /** 抽屉是否打开 */\n open: boolean;\n /** 抽屉打开状态变化回调(关闭时由组件调用) */\n onOpenChange?: (open: boolean) => void;\n /** 加载内容:抽屉打开且 id 有效时由组件调用,父组件请求后返回数据 */\n loadData: (id: number) => Promise<TipContentData>;\n /** 提交反馈(点赞/点踩):父组件请求接口,组件在成功后更新本地状态 */\n onFeedback: (id: number, params: FeedbackParams) => Promise<void>;\n};\n\nconst FEEDBACK_RESET_DELAY = 200;\n\n/**\n * 抽屉式提示页:展示富文本内容与点赞/点踩反馈,内容与反馈请求通过 props 回调解耦。\n */\nconst DrawerPageInfo: React.FC<PropsType> = ({ id, open, onOpenChange, loadData, onFeedback }) => {\n const numericId = Number(id);\n const onOpenChangeFn = onOpenChange ?? (() => {});\n const [title, setTitle] = useState('');\n const [content, setContent] = useState('');\n const [stared, setStared] = useState(false);\n const [unstared, setUnstared] = useState(false);\n const [loading, setLoading] = useState(false);\n const [feedbackLoading, setFeedbackLoading] = useState(false);\n\n const [previewOpen, setPreviewOpen] = useState(false);\n const [previewSrc, setPreviewSrc] = useState('');\n const richTextRef = useRef<HTMLDivElement>(null);\n\n /** 打开时根据 id 拉取内容 */\n useEffect(() => {\n if (!open || !numericId || Number.isNaN(numericId)) return;\n setLoading(true);\n loadData(numericId)\n .then((data) => {\n setTitle(data.tip_name);\n setContent(data.content);\n setStared(data.stared);\n setUnstared(data.unstared);\n })\n .finally(() => setLoading(false));\n }, [open, numericId, loadData]);\n\n const onClose = useCallback(() => {\n setContent('');\n onOpenChangeFn(false);\n }, [onOpenChangeFn]);\n\n /** 点赞:若已点踩则先取消点踩再点赞,否则直接点赞 */\n const handleLike = useCallback(() => {\n setFeedbackLoading(true);\n const nextStared = !stared;\n const run = unstared\n ? onFeedback(numericId, { unstared: false }).then(() => onFeedback(numericId, { stared: nextStared }))\n : onFeedback(numericId, { stared: nextStared });\n\n run\n .then(() => {\n setStared(nextStared);\n if (unstared) setUnstared(false);\n })\n .finally(() => {\n setTimeout(() => setFeedbackLoading(false), FEEDBACK_RESET_DELAY);\n });\n }, [numericId, stared, unstared, onFeedback]);\n\n /** 点踩:若已点赞则先取消点赞再点踩,否则直接点踩 */\n const handleDislike = useCallback(() => {\n setFeedbackLoading(true);\n const nextUnstared = !unstared;\n const run = stared\n ? onFeedback(numericId, { stared: false }).then(() => onFeedback(numericId, { unstared: nextUnstared }))\n : onFeedback(numericId, { unstared: nextUnstared });\n\n run\n .then(() => {\n setUnstared(nextUnstared);\n if (stared) setStared(false);\n })\n .finally(() => {\n setTimeout(() => setFeedbackLoading(false), FEEDBACK_RESET_DELAY);\n });\n }, [numericId, stared, unstared, onFeedback]);\n\n /** 富文本内图片点击放大:content 变化后重新绑定 */\n useEffect(() => {\n const el = richTextRef.current;\n if (!el || !content) return;\n const images = el.querySelectorAll<HTMLImageElement>('img');\n const handler = (e: Event) => {\n const img = e.currentTarget as HTMLImageElement;\n if (img?.src) {\n setPreviewSrc(img.src);\n setPreviewOpen(true);\n }\n };\n images.forEach((img) => {\n img.style.cursor = 'pointer';\n img.addEventListener('click', handler);\n });\n return () => images.forEach((img) => img.removeEventListener('click', handler));\n }, [content]);\n\n const showThanks = (stared || unstared) && !feedbackLoading;\n\n if (!numericId || Number.isNaN(numericId)) return null;\n\n return (\n <Drawer\n title={title}\n width={600}\n open={open}\n onClose={onClose}\n extra={\n <div className={styles.pageInfoDrawerExtraClose} onClick={onClose} role='button' tabIndex={0}>\n <CloseOutlined />\n </div>\n }\n maskClosable={false}\n className={styles.drawerTipInfo}\n >\n {loading ? (\n <Skeleton active />\n ) : (\n <>\n <div ref={richTextRef} className={styles.boxTipHtml} dangerouslySetInnerHTML={{ __html: content }} />\n <div className={styles.boxStared}>\n <Divider plain style={{ margin: '10px 0' }}>\n 此内容是否有帮助\n </Divider>\n <div className={styles.btnsStared}>\n <Button\n type={stared ? 'primary' : 'default'}\n shape='circle'\n loading={feedbackLoading}\n disabled={feedbackLoading}\n icon={<LikeOutlined />}\n onClick={handleLike}\n />\n <Button\n type={unstared ? 'primary' : 'default'}\n shape='circle'\n loading={feedbackLoading}\n disabled={feedbackLoading}\n icon={<DislikeOutlined />}\n onClick={handleDislike}\n />\n </div>\n <div className={styles.thanksTip} style={{ cursor: 'default', opacity: showThanks ? 1 : 0 }}>\n 感谢您的反馈\n </div>\n </div>\n </>\n )}\n <Modal\n title='图片'\n style={{ top: 20 }}\n open={previewOpen}\n onCancel={() => {\n setPreviewOpen(false);\n setPreviewSrc('');\n }}\n footer={null}\n width='80%'\n >\n <img src={previewSrc} alt='预览' style={{ width: '100%' }} />\n </Modal>\n </Drawer>\n );\n};\n\nexport default DrawerPageInfo;\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA6D;AAC7D,kBAAyD;AACzD,mBAAgE;AAChE,0BAAmB;AAkCnB,IAAM,uBAAuB;AAK7B,IAAM,iBAAsC,CAAC,EAAE,IAAI,MAAM,cAAc,UAAU,WAAW,MAAM;AAChG,QAAM,YAAY,OAAO,EAAE;AAC3B,QAAM,iBAAiB,iBAAiB,MAAM;AAAA,EAAC;AAC/C,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,EAAE;AACzC,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,KAAK;AAC1C,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,KAAK;AAC9C,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAC5C,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,uBAAS,KAAK;AAE5D,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAS,KAAK;AACpD,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAS,EAAE;AAC/C,QAAM,kBAAc,qBAAuB,IAAI;AAG/C,8BAAU,MAAM;AACd,QAAI,CAAC,QAAQ,CAAC,aAAa,OAAO,MAAM,SAAS;AAAG;AACpD,eAAW,IAAI;AACf,aAAS,SAAS,EACf,KAAK,CAAC,SAAS;AACd,eAAS,KAAK,QAAQ;AACtB,iBAAW,KAAK,OAAO;AACvB,gBAAU,KAAK,MAAM;AACrB,kBAAY,KAAK,QAAQ;AAAA,IAC3B,CAAC,EACA,QAAQ,MAAM,WAAW,KAAK,CAAC;AAAA,EACpC,GAAG,CAAC,MAAM,WAAW,QAAQ,CAAC;AAE9B,QAAM,cAAU,0BAAY,MAAM;AAChC,eAAW,EAAE;AACb,mBAAe,KAAK;AAAA,EACtB,GAAG,CAAC,cAAc,CAAC;AAGnB,QAAM,iBAAa,0BAAY,MAAM;AACnC,uBAAmB,IAAI;AACvB,UAAM,aAAa,CAAC;AACpB,UAAM,MAAM,WACR,WAAW,WAAW,EAAE,UAAU,MAAM,CAAC,EAAE,KAAK,MAAM,WAAW,WAAW,EAAE,QAAQ,WAAW,CAAC,CAAC,IACnG,WAAW,WAAW,EAAE,QAAQ,WAAW,CAAC;AAEhD,QACG,KAAK,MAAM;AACV,gBAAU,UAAU;AACpB,UAAI;AAAU,oBAAY,KAAK;AAAA,IACjC,CAAC,EACA,QAAQ,MAAM;AACb,iBAAW,MAAM,mBAAmB,KAAK,GAAG,oBAAoB;AAAA,IAClE,CAAC;AAAA,EACL,GAAG,CAAC,WAAW,QAAQ,UAAU,UAAU,CAAC;AAG5C,QAAM,oBAAgB,0BAAY,MAAM;AACtC,uBAAmB,IAAI;AACvB,UAAM,eAAe,CAAC;AACtB,UAAM,MAAM,SACR,WAAW,WAAW,EAAE,QAAQ,MAAM,CAAC,EAAE,KAAK,MAAM,WAAW,WAAW,EAAE,UAAU,aAAa,CAAC,CAAC,IACrG,WAAW,WAAW,EAAE,UAAU,aAAa,CAAC;AAEpD,QACG,KAAK,MAAM;AACV,kBAAY,YAAY;AACxB,UAAI;AAAQ,kBAAU,KAAK;AAAA,IAC7B,CAAC,EACA,QAAQ,MAAM;AACb,iBAAW,MAAM,mBAAmB,KAAK,GAAG,oBAAoB;AAAA,IAClE,CAAC;AAAA,EACL,GAAG,CAAC,WAAW,QAAQ,UAAU,UAAU,CAAC;AAG5C,8BAAU,MAAM;AACd,UAAM,KAAK,YAAY;AACvB,QAAI,CAAC,MAAM,CAAC;AAAS;AACrB,UAAM,SAAS,GAAG,iBAAmC,KAAK;AAC1D,UAAM,UAAU,CAAC,MAAa;AAC5B,YAAM,MAAM,EAAE;AACd,UAAI,2BAAK,KAAK;AACZ,sBAAc,IAAI,GAAG;AACrB,uBAAe,IAAI;AAAA,MACrB;AAAA,IACF;AACA,WAAO,QAAQ,CAAC,QAAQ;AACtB,UAAI,MAAM,SAAS;AACnB,UAAI,iBAAiB,SAAS,OAAO;AAAA,IACvC,CAAC;AACD,WAAO,MAAM,OAAO,QAAQ,CAAC,QAAQ,IAAI,oBAAoB,SAAS,OAAO,CAAC;AAAA,EAChF,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,cAAc,UAAU,aAAa,CAAC;AAE5C,MAAI,CAAC,aAAa,OAAO,MAAM,SAAS;AAAG,WAAO;AAElD,SACE,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,OACE,6BAAAA,QAAA,cAAC,SAAI,WAAW,oBAAAC,QAAO,0BAA0B,SAAS,SAAS,MAAK,UAAS,UAAU,KACzF,6BAAAD,QAAA,cAAC,gCAAc,CACjB;AAAA,MAEF,cAAc;AAAA,MACd,WAAW,oBAAAC,QAAO;AAAA;AAAA,IAEjB,UACC,6BAAAD,QAAA,cAAC,wBAAS,QAAM,MAAC,IAEjB,6BAAAA,QAAA,2BAAAA,QAAA,gBACE,6BAAAA,QAAA,cAAC,SAAI,KAAK,aAAa,WAAW,oBAAAC,QAAO,YAAY,yBAAyB,EAAE,QAAQ,QAAQ,GAAG,GACnG,6BAAAD,QAAA,cAAC,SAAI,WAAW,oBAAAC,QAAO,aACrB,6BAAAD,QAAA,cAAC,uBAAQ,OAAK,MAAC,OAAO,EAAE,QAAQ,SAAS,KAAG,UAE5C,GACA,6BAAAA,QAAA,cAAC,SAAI,WAAW,oBAAAC,QAAO,cACrB,6BAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,SAAS,YAAY;AAAA,QAC3B,OAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU;AAAA,QACV,MAAM,6BAAAA,QAAA,cAAC,+BAAa;AAAA,QACpB,SAAS;AAAA;AAAA,IACX,GACA,6BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,WAAW,YAAY;AAAA,QAC7B,OAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU;AAAA,QACV,MAAM,6BAAAA,QAAA,cAAC,kCAAgB;AAAA,QACvB,SAAS;AAAA;AAAA,IACX,CACF,GACA,6BAAAA,QAAA,cAAC,SAAI,WAAW,oBAAAC,QAAO,WAAW,OAAO,EAAE,QAAQ,WAAW,SAAS,aAAa,IAAI,EAAE,KAAG,QAE7F,CACF,CACF;AAAA,IAEF,6BAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,OAAO,EAAE,KAAK,GAAG;AAAA,QACjB,MAAM;AAAA,QACN,UAAU,MAAM;AACd,yBAAe,KAAK;AACpB,wBAAc,EAAE;AAAA,QAClB;AAAA,QACA,QAAQ;AAAA,QACR,OAAM;AAAA;AAAA,MAEN,6BAAAA,QAAA,cAAC,SAAI,KAAK,YAAY,KAAI,MAAK,OAAO,EAAE,OAAO,OAAO,GAAG;AAAA,IAC3D;AAAA,EACF;AAEJ;AAEA,IAAO,yBAAQ;",
|
|
6
6
|
"names": ["React", "styles"]
|
|
7
7
|
}
|