@yoka-ui/ui 1.0.4 → 1.0.5
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 +71 -63
- package/README.md +6 -4
- package/dist/es/business/AiChat/index.js.map +1 -1
- 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/DrawerPageInfo/index.js +2 -2
- package/dist/es/business/DrawerPageInfo/index.js.map +2 -2
- 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/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/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/YkDateRangePicker/index.d.ts +1 -1
- package/dist/es/components/YkDateRangePicker/index.js +1 -1
- package/dist/es/components/YkDateRangePicker/index.js.map +2 -2
- package/dist/es/components/YkDateRangePicker/index.module.less +2 -1
- 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 +60 -9
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +3 -3
- 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 +4 -4
- package/dist/es/components/YkRangeDateWithVS/index.js +2 -3
- package/dist/es/components/YkRangeDateWithVS/index.js.map +2 -2
- package/dist/es/components/YkRangeDateWithVS/index.module.less +23 -4
- package/dist/es/components/YkRangeTimeWithRecent/index.d.ts +1 -18
- package/dist/es/components/YkRangeTimeWithRecent/index.js +27 -7
- 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/index.d.ts +30 -26
- package/dist/es/index.js +86 -82
- package/dist/es/index.js.map +2 -2
- package/dist/es/index.less +3 -1
- 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 +2 -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.js +1 -1
- package/dist/es/utils/ykStorybookDoc.js.map +1 -1
- package/dist/lib/business/AiChat/index.js.map +1 -1
- 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/DrawerPageInfo/index.js +1 -1
- package/dist/lib/business/DrawerPageInfo/index.js.map +2 -2
- 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/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/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/YkDateRangePicker/index.d.ts +1 -1
- package/dist/lib/components/YkDateRangePicker/index.js +1 -1
- package/dist/lib/components/YkDateRangePicker/index.js.map +2 -2
- package/dist/lib/components/YkDateRangePicker/index.module.less +2 -1
- 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 +59 -8
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +3 -3
- 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 +4 -4
- package/dist/lib/components/YkRangeDateWithVS/index.js +4 -5
- package/dist/lib/components/YkRangeDateWithVS/index.js.map +3 -3
- package/dist/lib/components/YkRangeDateWithVS/index.module.less +23 -4
- package/dist/lib/components/YkRangeTimeWithRecent/index.d.ts +1 -18
- package/dist/lib/components/YkRangeTimeWithRecent/index.js +27 -7
- 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/index.d.ts +30 -26
- package/dist/lib/index.js +31 -25
- package/dist/lib/index.js.map +2 -2
- package/dist/lib/index.less +3 -1
- 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 +2 -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.js +1 -1
- package/dist/lib/utils/ykStorybookDoc.js.map +1 -1
- package/package.json +137 -144
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/ui/YkDescriptions/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Descriptions, DescriptionsProps } from 'antd';\nimport React from 'react';\n\nconst YkDescriptions: React.FC<DescriptionsProps> = ({ ...props }) => {\n return <Descriptions {...props} />;\n};\n\nexport default YkDescriptions;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,
|
|
4
|
+
"sourcesContent": ["import { Descriptions, type DescriptionsProps } from 'antd';\nimport React from 'react';\n\nconst YkDescriptions: React.FC<DescriptionsProps> = ({ ...props }) => {\n return <Descriptions {...props} />;\n};\n\nexport default YkDescriptions;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,oBAA4C;AACrD,OAAO,WAAW;AAElB,IAAM,iBAA8C,CAAC,OAAiB;AAAjB,MAAK,kBAAL,IAAK;AACxD,SAAO,oCAAC,iCAAiB,MAAO;AAClC;AAEA,IAAO,yBAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/ui/YkPagination/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { ConfigProvider, Pagination, PaginationProps } from 'antd';\nimport React from 'react';\nimport styles from './index.module.less';\n\nconst YkPagination: React.FC<PaginationProps> = ({ size = 'small', ...props }) => {\n return (\n <ConfigProvider\n theme={{\n components: {\n Pagination: {\n itemActiveBg: '#3b86f9',\n itemActiveColor: '#fff',\n itemActiveColorHover: '#fff',\n itemBg: '#fff',\n },\n },\n token: {\n borderRadius: 2,\n },\n }}\n >\n <Pagination size={size} {...props} className={styles.ykPagination} />\n </ConfigProvider>\n );\n};\n\nexport default YkPagination;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAgB,
|
|
4
|
+
"sourcesContent": ["import { ConfigProvider, Pagination, type PaginationProps } from 'antd';\nimport React from 'react';\nimport styles from './index.module.less';\n\nconst YkPagination: React.FC<PaginationProps> = ({ size = 'small', ...props }) => {\n return (\n <ConfigProvider\n theme={{\n components: {\n Pagination: {\n itemActiveBg: '#3b86f9',\n itemActiveColor: '#fff',\n itemActiveColorHover: '#fff',\n itemBg: '#fff',\n },\n },\n token: {\n borderRadius: 2,\n },\n }}\n >\n <Pagination size={size} {...props} className={styles.ykPagination} />\n </ConfigProvider>\n );\n};\n\nexport default YkPagination;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAgB,kBAAwC;AACjE,OAAO,WAAW;AAClB,OAAO,YAAY;AAEnB,IAAM,eAA0C,CAAC,OAAiC;AAAjC,eAAE,SAAO,QAJ1D,IAIiD,IAAqB,kBAArB,IAAqB,CAAnB;AACjD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,YAAY;AAAA,UACV,YAAY;AAAA,YACV,cAAc;AAAA,YACd,iBAAiB;AAAA,YACjB,sBAAsB;AAAA,YACtB,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL,cAAc;AAAA,QAChB;AAAA,MACF;AAAA;AAAA,IAEA,oCAAC,2CAAW,QAAgB,QAA3B,EAAkC,WAAW,OAAO,eAAc;AAAA,EACrE;AAEJ;AAEA,IAAO,uBAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/ui/YkRadio/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { ConfigProvider, Radio, RadioGroupProps } from 'antd';\nimport React from 'react';\n// import styles from './index.module.less';\n\nconst YkRadio: React.FC<RadioGroupProps> = ({ ...props }) => {\n return (\n <ConfigProvider\n theme={{\n token: {\n borderRadius: 2,\n },\n }}\n >\n <Radio.Group {...props} />\n </ConfigProvider>\n );\n};\n\nexport default YkRadio;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAgB,
|
|
4
|
+
"sourcesContent": ["import { ConfigProvider, Radio, type RadioGroupProps } from 'antd';\nimport React from 'react';\n\n// import styles from './index.module.less';\n\nconst YkRadio: React.FC<RadioGroupProps> = ({ ...props }) => {\n return (\n <ConfigProvider\n theme={{\n token: {\n borderRadius: 2,\n },\n }}\n >\n <Radio.Group {...props} />\n </ConfigProvider>\n );\n};\n\nexport default YkRadio;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAgB,aAAmC;AAC5D,OAAO,WAAW;AAIlB,IAAM,UAAqC,CAAC,OAAiB;AAAjB,MAAK,kBAAL,IAAK;AAC/C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,UACL,cAAc;AAAA,QAChB;AAAA,MACF;AAAA;AAAA,IAEA,oCAAC,MAAM,OAAN,mBAAgB,MAAO;AAAA,EAC1B;AAEJ;AAEA,IAAO,kBAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/ui/YkSegmented/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Segmented, SegmentedProps } from 'antd';\nimport React from 'react';\n\nconst YkSegmented: React.FC<SegmentedProps> = ({ ...props }) => {\n return <Segmented {...props} />;\n};\n\nexport default YkSegmented;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,
|
|
4
|
+
"sourcesContent": ["import { Segmented, type SegmentedProps } from 'antd';\nimport React from 'react';\n\nconst YkSegmented: React.FC<SegmentedProps> = ({ ...props }) => {\n return <Segmented {...props} />;\n};\n\nexport default YkSegmented;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,iBAAsC;AAC/C,OAAO,WAAW;AAElB,IAAM,cAAwC,CAAC,OAAiB;AAAjB,MAAK,kBAAL,IAAK;AAClD,SAAO,oCAAC,8BAAc,MAAO;AAC/B;AAEA,IAAO,sBAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/ui/YkSelect/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { ConfigProvider, Select, SelectProps } from 'antd';\nimport React from 'react';\n\nconst YkSelectComponent: React.FC<SelectProps> = ({ ...props }) => {\n return (\n <ConfigProvider\n theme={{\n token: {\n borderRadius: 2,\n },\n }}\n >\n <Select {...props} />\n </ConfigProvider>\n );\n};\n\n// 添加静态属性并导出\nconst YkSelect = YkSelectComponent as typeof YkSelectComponent & {\n Option: typeof Select.Option;\n OptGroup: typeof Select.OptGroup;\n};\n\nYkSelect.Option = Select.Option;\nYkSelect.OptGroup = Select.OptGroup;\n\nexport default YkSelect;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAgB,
|
|
4
|
+
"sourcesContent": ["import { ConfigProvider, Select, type SelectProps } from 'antd';\nimport React from 'react';\n\nconst YkSelectComponent: React.FC<SelectProps> = ({ ...props }) => {\n return (\n <ConfigProvider\n theme={{\n token: {\n borderRadius: 2,\n },\n }}\n >\n <Select {...props} />\n </ConfigProvider>\n );\n};\n\n// 添加静态属性并导出\nconst YkSelect = YkSelectComponent as typeof YkSelectComponent & {\n Option: typeof Select.Option;\n OptGroup: typeof Select.OptGroup;\n};\n\nYkSelect.Option = Select.Option;\nYkSelect.OptGroup = Select.OptGroup;\n\nexport default YkSelect;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAgB,cAAgC;AACzD,OAAO,WAAW;AAElB,IAAM,oBAA2C,CAAC,OAAiB;AAAjB,MAAK,kBAAL,IAAK;AACrD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,UACL,cAAc;AAAA,QAChB;AAAA,MACF;AAAA;AAAA,IAEA,oCAAC,2BAAW,MAAO;AAAA,EACrB;AAEJ;AAGA,IAAM,WAAW;AAKjB,SAAS,SAAS,OAAO;AACzB,SAAS,WAAW,OAAO;AAE3B,IAAO,mBAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/ui/YkSpin/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Spin, SpinProps } from 'antd';\nimport React from 'react';\n\nconst YkSpin: React.FC<SpinProps> = ({ ...props }) => {\n return <Spin {...props} />;\n};\n\nexport default YkSpin;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,
|
|
4
|
+
"sourcesContent": ["import { Spin, type SpinProps } from 'antd';\nimport React from 'react';\n\nconst YkSpin: React.FC<SpinProps> = ({ ...props }) => {\n return <Spin {...props} />;\n};\n\nexport default YkSpin;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAA4B;AACrC,OAAO,WAAW;AAElB,IAAM,SAA8B,CAAC,OAAiB;AAAjB,MAAK,kBAAL,IAAK;AACxC,SAAO,oCAAC,yBAAS,MAAO;AAC1B;AAEA,IAAO,iBAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/ui/YkStatistic/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Statistic, StatisticProps } from 'antd';\nimport React from 'react';\n\nconst YkStatistic: React.FC<StatisticProps> = ({ ...props }) => {\n return <Statistic {...props} />;\n};\n\nexport default YkStatistic;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,
|
|
4
|
+
"sourcesContent": ["import { Statistic, type StatisticProps } from 'antd';\nimport React from 'react';\n\nconst YkStatistic: React.FC<StatisticProps> = ({ ...props }) => {\n return <Statistic {...props} />;\n};\n\nexport default YkStatistic;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,iBAAsC;AAC/C,OAAO,WAAW;AAElB,IAAM,cAAwC,CAAC,OAAiB;AAAjB,MAAK,kBAAL,IAAK;AAClD,SAAO,oCAAC,8BAAc,MAAO;AAC/B;AAEA,IAAO,sBAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/ui/YkSwitch/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { ConfigProvider, Switch, SwitchProps } from 'antd';\nimport React from 'react';\n\nconst YkSwitch: React.FC<SwitchProps> = ({ ...props }) => {\n return (\n <ConfigProvider\n theme={{\n token: {\n borderRadius: 2,\n },\n }}\n >\n <Switch {...props} />\n </ConfigProvider>\n );\n};\n\nexport default YkSwitch;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAgB,
|
|
4
|
+
"sourcesContent": ["import { ConfigProvider, Switch, type SwitchProps } from 'antd';\nimport React from 'react';\n\nconst YkSwitch: React.FC<SwitchProps> = ({ ...props }) => {\n return (\n <ConfigProvider\n theme={{\n token: {\n borderRadius: 2,\n },\n }}\n >\n <Switch {...props} />\n </ConfigProvider>\n );\n};\n\nexport default YkSwitch;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAgB,cAAgC;AACzD,OAAO,WAAW;AAElB,IAAM,WAAkC,CAAC,OAAiB;AAAjB,MAAK,kBAAL,IAAK;AAC5C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,OAAO;AAAA,UACL,cAAc;AAAA,QAChB;AAAA,MACF;AAAA;AAAA,IAEA,oCAAC,2BAAW,MAAO;AAAA,EACrB;AAEJ;AAEA,IAAO,mBAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/ui/YkTabs/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { ConfigProvider, Tabs, TabsProps } from 'antd';\nimport React, { useMemo } from 'react';\nimport styles from './index.module.less';\n\ntype AntTabItem = NonNullable<TabsProps['items']>[number];\n\n/** 在 Ant Design Tab 项基础上增加可选 icon,展示在 label 左侧 */\nexport type YkTabItem = AntTabItem & {\n icon?: React.ReactNode;\n};\n\nexport type YkTabsProps = Omit<TabsProps, 'items'> & {\n items?: YkTabItem[];\n};\n\nconst YkTabs: React.FC<YkTabsProps> = ({ items, ...rest }) => {\n const normalizedItems = useMemo(() => {\n if (!items?.length) {\n return items;\n }\n return items.map(({ icon, label, ...tabRest }) => ({\n ...tabRest,\n label:\n icon != null ? (\n <span className={styles.tabLabel}>\n <span className={styles.tabIcon} aria-hidden>\n {icon}\n </span>\n {label}\n </span>\n ) : (\n label\n ),\n }));\n }, [items]);\n\n return (\n <ConfigProvider\n theme={{\n components: {\n Tabs: {\n cardBg: '#f9fafc',\n cardGutter: 0,\n itemColor: '#666',\n itemHoverColor: '#333',\n itemSelectedColor: '#333',\n },\n },\n token: {\n borderRadius: 2,\n },\n }}\n >\n <Tabs {...rest} items={normalizedItems} />\n </ConfigProvider>\n );\n};\n\nexport default YkTabs;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAgB,
|
|
4
|
+
"sourcesContent": ["import { ConfigProvider, Tabs, type TabsProps } from 'antd';\nimport React, { useMemo } from 'react';\nimport styles from './index.module.less';\n\ntype AntTabItem = NonNullable<TabsProps['items']>[number];\n\n/** 在 Ant Design Tab 项基础上增加可选 icon,展示在 label 左侧 */\nexport type YkTabItem = AntTabItem & {\n icon?: React.ReactNode;\n};\n\nexport type YkTabsProps = Omit<TabsProps, 'items'> & {\n items?: YkTabItem[];\n};\n\nconst YkTabs: React.FC<YkTabsProps> = ({ items, ...rest }) => {\n const normalizedItems = useMemo(() => {\n if (!items?.length) {\n return items;\n }\n return items.map(({ icon, label, ...tabRest }) => ({\n ...tabRest,\n label:\n icon != null ? (\n <span className={styles.tabLabel}>\n <span className={styles.tabIcon} aria-hidden>\n {icon}\n </span>\n {label}\n </span>\n ) : (\n label\n ),\n }));\n }, [items]);\n\n return (\n <ConfigProvider\n theme={{\n components: {\n Tabs: {\n cardBg: '#f9fafc',\n cardGutter: 0,\n itemColor: '#666',\n itemHoverColor: '#333',\n itemSelectedColor: '#333',\n },\n },\n token: {\n borderRadius: 2,\n },\n }}\n >\n <Tabs {...rest} items={normalizedItems} />\n </ConfigProvider>\n );\n};\n\nexport default YkTabs;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAgB,YAA4B;AACrD,OAAO,SAAS,eAAe;AAC/B,OAAO,YAAY;AAanB,IAAM,SAAgC,CAAC,OAAuB;AAAvB,eAAE,QAfzC,IAeuC,IAAY,iBAAZ,IAAY,CAAV;AACvC,QAAM,kBAAkB,QAAQ,MAAM;AACpC,QAAI,EAAC,+BAAO,SAAQ;AAClB,aAAO;AAAA,IACT;AACA,WAAO,MAAM,IAAI,CAACA,QAA6B;AAA7B,UAAAC,MAAAD,KAAE,QAAM,MApB9B,IAoBsBC,KAAkB,oBAAlBA,KAAkB,CAAhB,QAAM;AAAyB,8CAC9C,UAD8C;AAAA,QAEjD,OACE,QAAQ,OACN,oCAAC,UAAK,WAAW,OAAO,YACtB,oCAAC,UAAK,WAAW,OAAO,SAAS,eAAW,QACzC,IACH,GACC,KACH,IAEA;AAAA,MAEN;AAAA,KAAE;AAAA,EACJ,GAAG,CAAC,KAAK,CAAC;AAEV,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,YAAY;AAAA,UACV,MAAM;AAAA,YACJ,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,WAAW;AAAA,YACX,gBAAgB;AAAA,YAChB,mBAAmB;AAAA,UACrB;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL,cAAc;AAAA,QAChB;AAAA,MACF;AAAA;AAAA,IAEA,oCAAC,uCAAS,OAAT,EAAe,OAAO,kBAAiB;AAAA,EAC1C;AAEJ;AAEA,IAAO,iBAAQ;",
|
|
6
6
|
"names": ["_a", "_b"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/ui/YkTooltip/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Tooltip, TooltipProps } from 'antd';\nimport React from 'react';\n\nconst YkTooltip: React.FC<TooltipProps> = ({\n color = '#fff',\n styles = { body: { color: '#333', fontSize: 12, borderRadius: 2 } },\n ...props\n}) => {\n return <Tooltip {...props} color={color} styles={styles} />;\n};\n\nexport default YkTooltip;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,
|
|
4
|
+
"sourcesContent": ["import { Tooltip, type TooltipProps } from 'antd';\nimport React from 'react';\n\nconst YkTooltip: React.FC<TooltipProps> = ({\n color = '#fff',\n styles = { body: { color: '#333', fontSize: 12, borderRadius: 2 } },\n ...props\n}) => {\n return <Tooltip {...props} color={color} styles={styles} />;\n};\n\nexport default YkTooltip;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,eAAkC;AAC3C,OAAO,WAAW;AAElB,IAAM,YAAoC,CAAC,OAIrC;AAJqC,eACzC;AAAA,YAAQ;AAAA,IACR,SAAS,EAAE,MAAM,EAAE,OAAO,QAAQ,UAAU,IAAI,cAAc,EAAE,EAAE;AAAA,EALpE,IAG2C,IAGtC,kBAHsC,IAGtC;AAAA,IAFH;AAAA,IACA;AAAA;AAGA,SAAO,oCAAC,0CAAY,QAAZ,EAAmB,OAAc,SAAgB;AAC3D;AAEA,IAAO,oBAAQ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/utils/styleUtils.ts"],
|
|
4
|
-
"sourcesContent": ["import {
|
|
5
|
-
"mappings": ";
|
|
4
|
+
"sourcesContent": ["import type { CSSInterpolation } from '@ant-design/cssinjs';\nimport { type Theme, useStyleRegister } from '@ant-design/cssinjs';\nimport { theme } from 'antd';\nimport type { AliasToken, GlobalToken } from 'antd/es/theme/internal';\nimport React from 'react';\n\n// 样式缓存\nconst styleCache = new Map<string, string>();\n\n/**\n * 注册组件样式 (CSS-in-JS 方式)\n */\nexport function useComponentStyle(\n componentName: string,\n styleFn: (token: AliasToken) => Record<string, React.CSSProperties | Record<string, string | number>>,\n): React.CSSProperties {\n const { token } = theme.useToken();\n\n // 使用 useStyleRegister 注册样式并生成类名\n // 注意:这里简化了使用,直接使用 token 作为 theme 和 token\n useStyleRegister(\n {\n theme: token as unknown as Theme<GlobalToken, AliasToken>,\n token,\n path: [componentName],\n },\n () => {\n const styles = styleFn(token as unknown as AliasToken);\n // 直接将样式转换为 CSSInterpolation 类型\n return styles as CSSInterpolation;\n },\n );\n\n // 返回空对象,因为样式是通过CSS-in-JS 全局注入的\n // 实际使用时应该通过 className 应用样式\n return {};\n}\n\n/**\n * 获取组件类名\n */\nexport function getComponentClassName(componentName: string, ...classNames: string[]): string {\n return [`yoka-${componentName}`, ...classNames].filter(Boolean).join(' ');\n}\n\n/**\n * 注册全局样式(用于需要全局样式的组件)\n */\nexport function registerGlobalStyle(componentName: string, css: string) {\n if (!styleCache.has(componentName)) {\n const styleId = `yoka-${componentName}-style`;\n let styleElement = document.getElementById(styleId);\n\n if (!styleElement) {\n styleElement = document.createElement('style');\n styleElement.id = styleId;\n styleElement.textContent = css;\n document.head.appendChild(styleElement);\n }\n\n styleCache.set(componentName, css);\n }\n}\n\n/**\n * 动态注入样式\n */\nexport function injectStyle(css: string, styleId?: string): () => void {\n const id = styleId || `yoka-style-${Date.now()}`;\n let styleElement = document.getElementById(id);\n\n if (!styleElement) {\n styleElement = document.createElement('style');\n styleElement.id = id;\n styleElement.textContent = css;\n document.head.appendChild(styleElement);\n }\n\n // 返回清理函数\n return () => {\n if (styleElement && styleElement.parentNode) {\n styleElement.parentNode.removeChild(styleElement);\n }\n };\n}\n"],
|
|
5
|
+
"mappings": ";AACA,SAAqB,wBAAwB;AAC7C,SAAS,aAAa;AAKtB,IAAM,aAAa,oBAAI,IAAoB;AAKpC,SAAS,kBACd,eACA,SACqB;AACrB,QAAM,EAAE,MAAM,IAAI,MAAM,SAAS;AAIjC;AAAA,IACE;AAAA,MACE,OAAO;AAAA,MACP;AAAA,MACA,MAAM,CAAC,aAAa;AAAA,IACtB;AAAA,IACA,MAAM;AACJ,YAAM,SAAS,QAAQ,KAA8B;AAErD,aAAO;AAAA,IACT;AAAA,EACF;AAIA,SAAO,CAAC;AACV;AAKO,SAAS,sBAAsB,kBAA0B,YAA8B;AAC5F,SAAO,CAAC,QAAQ,iBAAiB,GAAG,UAAU,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAC1E;AAKO,SAAS,oBAAoB,eAAuB,KAAa;AACtE,MAAI,CAAC,WAAW,IAAI,aAAa,GAAG;AAClC,UAAM,UAAU,QAAQ;AACxB,QAAI,eAAe,SAAS,eAAe,OAAO;AAElD,QAAI,CAAC,cAAc;AACjB,qBAAe,SAAS,cAAc,OAAO;AAC7C,mBAAa,KAAK;AAClB,mBAAa,cAAc;AAC3B,eAAS,KAAK,YAAY,YAAY;AAAA,IACxC;AAEA,eAAW,IAAI,eAAe,GAAG;AAAA,EACnC;AACF;AAKO,SAAS,YAAY,KAAa,SAA8B;AACrE,QAAM,KAAK,WAAW,cAAc,KAAK,IAAI;AAC7C,MAAI,eAAe,SAAS,eAAe,EAAE;AAE7C,MAAI,CAAC,cAAc;AACjB,mBAAe,SAAS,cAAc,OAAO;AAC7C,iBAAa,KAAK;AAClB,iBAAa,cAAc;AAC3B,aAAS,KAAK,YAAY,YAAY;AAAA,EACxC;AAGA,SAAO,MAAM;AACX,QAAI,gBAAgB,aAAa,YAAY;AAC3C,mBAAa,WAAW,YAAY,YAAY;AAAA,IAClD;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/utils/ykStorybookDoc.ts
|
|
2
|
-
var YK_STORYBOOK_PLATFORM_NOTE = "业务侧使用 `@yoka/ui` 时需保证 React 18、与库一致的 Ant Design 5;入口引入 Ant Design 全局样式(可与库一致使用 `antd/dist/reset.css`),并引入 `@yoka/ui/dist/index.less`(以 README 为准)。";
|
|
2
|
+
var YK_STORYBOOK_PLATFORM_NOTE = "业务侧使用 `@yoka-ui/ui` 时需保证 React 18、与库一致的 Ant Design 5;入口引入 Ant Design 全局样式(可与库一致使用 `antd/dist/reset.css`),并引入 `@yoka-ui/ui/dist/index.less`(以 README 为准)。";
|
|
3
3
|
function ykStoryDoc(input) {
|
|
4
4
|
var _a;
|
|
5
5
|
const deps = input.dependencies.length > 0 ? input.dependencies.join("、") : "`react`、`antd`(具体见源码 import)";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/utils/ykStorybookDoc.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Storybook Autodocs 统一文案:**描述** / **依赖** / **备注**。\n * 用于各 `*.stories.tsx` 的 `meta.parameters.docs.description.component`。\n */\nexport type YkStoryDocInput = {\n /** 一句话概括组件用途(建议以句号结尾) */\n summary: string;\n /**\n * 运行时主要依赖:`npm 包(用到的子模块)` 或 `本库 · 模块名`\n */\n dependencies: string[];\n /**\n * 组件特有备注(交互、API、Story 限制等);环境类说明由函数自动追加。\n */\n notes?: string[];\n};\n\nconst YK_STORYBOOK_PLATFORM_NOTE =\n '业务侧使用 `@yoka/ui` 时需保证 React 18、与库一致的 Ant Design 5;入口引入 Ant Design 全局样式(可与库一致使用 `antd/dist/reset.css`),并引入 `@yoka/ui/dist/index.less`(以 README 为准)。';\n\nexport function ykStoryDoc(input: YkStoryDocInput): string {\n const deps = input.dependencies.length > 0 ? input.dependencies.join('、') : '`react`、`antd`(具体见源码 import)';\n\n const extra = (input.notes ?? []).filter(Boolean);\n const remarks = [...extra, YK_STORYBOOK_PLATFORM_NOTE];\n\n return `**描述**:${input.summary}\\n\\n**依赖**:${deps}\\n\\n**备注**:\\n${remarks.map((line) => `- ${line}`).join('\\n')}`;\n}\n"],
|
|
4
|
+
"sourcesContent": ["/**\n * Storybook Autodocs 统一文案:**描述** / **依赖** / **备注**。\n * 用于各 `*.stories.tsx` 的 `meta.parameters.docs.description.component`。\n */\nexport type YkStoryDocInput = {\n /** 一句话概括组件用途(建议以句号结尾) */\n summary: string;\n /**\n * 运行时主要依赖:`npm 包(用到的子模块)` 或 `本库 · 模块名`\n */\n dependencies: string[];\n /**\n * 组件特有备注(交互、API、Story 限制等);环境类说明由函数自动追加。\n */\n notes?: string[];\n};\n\nconst YK_STORYBOOK_PLATFORM_NOTE =\n '业务侧使用 `@yoka-ui/ui` 时需保证 React 18、与库一致的 Ant Design 5;入口引入 Ant Design 全局样式(可与库一致使用 `antd/dist/reset.css`),并引入 `@yoka-ui/ui/dist/index.less`(以 README 为准)。';\n\nexport function ykStoryDoc(input: YkStoryDocInput): string {\n const deps = input.dependencies.length > 0 ? input.dependencies.join('、') : '`react`、`antd`(具体见源码 import)';\n\n const extra = (input.notes ?? []).filter(Boolean);\n const remarks = [...extra, YK_STORYBOOK_PLATFORM_NOTE];\n\n return `**描述**:${input.summary}\\n\\n**依赖**:${deps}\\n\\n**备注**:\\n${remarks.map((line) => `- ${line}`).join('\\n')}`;\n}\n"],
|
|
5
5
|
"mappings": ";AAiBA,IAAM,6BACJ;AAEK,SAAS,WAAW,OAAgC;AApB3D;AAqBE,QAAM,OAAO,MAAM,aAAa,SAAS,IAAI,MAAM,aAAa,KAAK,GAAG,IAAI;AAE5E,QAAM,UAAS,WAAM,UAAN,YAAe,CAAC,GAAG,OAAO,OAAO;AAChD,QAAM,UAAU,CAAC,GAAG,OAAO,0BAA0B;AAErD,SAAO,UAAU,MAAM;AAAA;AAAA,SAAqB;AAAA;AAAA;AAAA,EAAoB,QAAQ,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE,KAAK,IAAI;AAC9G;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/business/AiChat/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import {\n CloseOutlined,\n CompressOutlined,\n CopyOutlined,\n DeleteOutlined,\n ExpandOutlined,\n FileImageOutlined,\n MenuOutlined,\n MessageOutlined,\n PaperClipOutlined,\n PlusOutlined,\n ReloadOutlined,\n SendOutlined,\n StopOutlined,\n} from '@ant-design/icons';\nimport type { UploadFile } from 'antd';\nimport { Button, Input, List, message, Popconfirm, Space, Tooltip, Typography, Upload } from 'antd';\nimport type { CSSProperties, FC, ReactNode } from 'react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { generateSuggestions, isTaskCreationIntent, recognizeIntent } from './intentRecognizer';\nimport MarkdownRender from './MarkdownRender';\nimport type { AiChatConfig, ChatSession, EnhancedAiChatConfig, Message } from './type';\nimport { useAiChat } from './useAiChat';\nimport { useTaskWorkflow } from './useTaskWorkflow';\n\nconst { TextArea } = Input;\nconst { Title } = Typography;\n\n// 合并Props类型\nexport interface AiChatProps extends AiChatConfig, Partial<EnhancedAiChatConfig> {\n className?: string;\n style?: CSSProperties;\n renderTrigger?: ReactNode;\n renderHeader?: ReactNode;\n renderFooter?: ReactNode;\n}\n\nconst AiChat: FC<AiChatProps> = ({\n apiPath = '/api/ai/chat-stream',\n storageKey = 'ai_chat_sessions',\n position: initialPosition = { bottom: 24, right: 24 },\n buttonSize = 56,\n zIndex = 1080,\n showSessionPanel = true,\n onBeforeSend,\n onError,\n onSuccess,\n onFetchSessions,\n onFetchSessionDetail,\n onCreateSession,\n onSendMessage,\n onUploadFile,\n className,\n style,\n renderTrigger,\n renderHeader,\n renderFooter,\n // 增强配置\n taskWorkflow,\n intentRecognition: intentConfig,\n navigation: navConfig,\n}) => {\n const {\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 } = useAiChat({\n apiPath,\n storageKey,\n onBeforeSend,\n onError,\n onSuccess,\n onFetchSessions,\n onFetchSessionDetail,\n onCreateSession,\n onSendMessage,\n onUploadFile,\n });\n\n // 任务工作流\n const {\n tasks,\n createTask,\n updateTaskStatus,\n deleteTask,\n createTaskFromNaturalLanguage,\n updateUrlWithTaskId,\n refreshCurrentPage,\n executeTaskCreationWorkflow,\n } = useTaskWorkflow({\n enabled: taskWorkflow?.enabled,\n createTaskApi: taskWorkflow?.createTaskApi,\n supportedTaskTypes: taskWorkflow?.supportedTaskTypes,\n autoNavigate: taskWorkflow?.autoNavigate,\n refreshDelay: navConfig?.refreshDelay,\n taskIdParamName: taskWorkflow?.taskIdParamName,\n taskTypeParamName: taskWorkflow?.taskTypeParamName,\n onTaskCreated: (taskId, taskData) => {\n // 添加系统消息到会话\n if (activeSession) {\n const systemMsg: Message = {\n id: `${Date.now()}_sys`,\n role: 'system',\n content: `任务创建成功,ID: ${taskId}`,\n taskId,\n };\n // 这里可以添加到消息列表的逻辑\n }\n },\n onError,\n });\n\n const [inputValue, setInputValue] = useState('');\n const [showSessions, setShowSessions] = useState(false);\n const [suggestions, setSuggestions] = useState<string[]>([]);\n const [fileList, setFileList] = useState<UploadFile<any>[]>([]);\n const [isMaximized, setIsMaximized] = useState(false);\n const [dialogPosition, setDialogPosition] = useState({ x: 0, y: 0 });\n const [isDragging, setIsDragging] = useState(false);\n const dragOffset = useRef({ x: 0, y: 0 });\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [activeSession?.messages]);\n\n // 拖拽处理 - 拖拽整个组件位置\n const handleTriggerMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (visible) return; // 对话框展开时不处理\n const target = e.target as HTMLElement;\n if (target.closest('.ant-upload, .ant-btn')) return; // 排除按钮和上传元素\n\n e.preventDefault();\n const triggerEl = triggerRef.current;\n if (!triggerEl) return;\n\n const rect = triggerEl.getBoundingClientRect();\n dragOffset.current = {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n setIsDragging(true);\n },\n [visible],\n );\n\n const handleTriggerMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isDragging || visible) return;\n setDialogPosition({\n x: e.clientX - dragOffset.current.x,\n y: e.clientY - dragOffset.current.y,\n });\n },\n [isDragging, visible],\n );\n\n const handleTriggerMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n useEffect(() => {\n if (isDragging && !visible) {\n document.addEventListener('mousemove', handleTriggerMouseMove);\n document.addEventListener('mouseup', handleTriggerMouseUp);\n return () => {\n document.removeEventListener('mousemove', handleTriggerMouseMove);\n document.removeEventListener('mouseup', handleTriggerMouseUp);\n };\n }\n return undefined;\n }, [isDragging, visible, handleTriggerMouseMove, handleTriggerMouseUp]);\n\n // 实时分析输入内容生成建议\n const handleInputChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const value = e.target.value;\n setInputValue(value);\n\n if (value.length > 3) {\n const intent = recognizeIntent(value);\n const newSuggestions = generateSuggestions(value, intent);\n setSuggestions(newSuggestions);\n } else {\n setSuggestions([]);\n }\n }, []);\n\n // 文件上传处理\n const handleFileChange = useCallback(\n async (info: { fileList: UploadFile<any>[]; file?: UploadFile<any> }) => {\n const uploadFile = info.file;\n if (!uploadFile || !uploadFile.originFileObj) {\n setFileList(info.fileList);\n return;\n }\n\n const file = uploadFile.originFileObj as File;\n const isImage = file.type.startsWith('image/');\n const fileType: 'image' | 'document' = isImage ? 'image' : 'document';\n\n try {\n // 调用 onUploadFile 回调\n if (onUploadFile && activeSession) {\n const result = await onUploadFile({\n sessionId: activeSession.id,\n file: file as any,\n type: fileType,\n });\n\n // 将上传结果添加到文件列表\n const uploadedFile: UploadFile = {\n uid: file.name,\n name: result.name || file.name,\n status: 'done',\n url: result.url,\n };\n setFileList([...fileList, uploadedFile]);\n message.success(`${fileType === 'image' ? '图片' : '文件'}上传成功`);\n } else {\n // 没有回调时,仅本地记录\n setFileList([...fileList, uploadFile]);\n }\n } catch (err) {\n console.error('文件上传失败:', err);\n message.error('文件上传失败');\n setFileList(fileList.filter((f) => f.uid !== file.name));\n }\n },\n [fileList, activeSession, onUploadFile],\n );\n\n // 判断是否为任务创建意图并执行工作流\n const handleSend = useCallback(async () => {\n if (!inputValue.trim() && fileList.length === 0) {\n message.warning('请输入问题或上传文件');\n return;\n }\n\n let content = inputValue.trim();\n\n // 如果有文件,附加文件信息\n if (fileList.length > 0) {\n const fileInfo = fileList.map((f) => f.name).join(', ');\n content += `\\n[附件: ${fileInfo}]`;\n }\n\n setInputValue('');\n setSuggestions([]);\n setFileList([]);\n\n // 检查是否为任务创建意图\n const intentEnabled = intentConfig?.enabled !== false;\n if (intentEnabled && isTaskCreationIntent(content)) {\n // 执行任务创建工作流\n await executeTaskCreationWorkflow(content);\n return;\n }\n\n // 普通问答\n sendQuestion(content);\n }, [inputValue, fileList, intentConfig?.enabled, executeTaskCreationWorkflow, sendQuestion]);\n\n const copyMsg = (c: string) => {\n navigator.clipboard.writeText(c);\n message.success('复制成功');\n };\n\n const toggleMaximize = useCallback(() => {\n setIsMaximized((prev) => !prev);\n }, []);\n\n const renderMsg = (item: Message) => (\n <List.Item\n key={item.id}\n style={{\n justifyContent: item.role === 'user' ? 'flex-end' : 'flex-start',\n marginBottom: 12,\n padding: '4px 0',\n }}\n >\n <div\n style={{\n maxWidth: '85%',\n padding: '10px 14px',\n borderRadius: 12,\n backgroundColor: item.role === 'user' ? '#1677ff' : item.role === 'system' ? '#f6ffed' : '#fafafa',\n color: item.role === 'user' ? '#fff' : '#333',\n border: item.role === 'ai' ? '1px solid #f0f0f0' : item.role === 'system' ? '1px solid #b7eb8f' : 'none',\n boxShadow:\n item.role === 'user'\n ? '0 2px 8px rgba(22, 119, 255, 0.3)'\n : item.role === 'system'\n ? '0 1px 4px rgba(82, 196, 26, 0.1)'\n : '0 1px 4px rgba(0,0,0,0.05)',\n }}\n >\n {item.role === 'user' ? (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 8 }}>\n <span>{item.content}</span>\n <CopyOutlined\n onClick={() => copyMsg(item.content)}\n style={{\n fontSize: 12,\n color: 'rgba(255,255,255,0.7)',\n cursor: 'pointer',\n flexShrink: 0,\n }}\n />\n </div>\n ) : item.role === 'system' ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n fontSize: 13,\n }}\n >\n <span style={{ color: '#52c41a' }}>✓</span>\n <span>{item.content}</span>\n {item.taskId && (\n <Button\n type=\"link\"\n size=\"small\"\n style={{ padding: 0, fontSize: 12 }}\n onClick={() => updateUrlWithTaskId(item.taskId!)}\n >\n 查看任务\n </Button>\n )}\n </div>\n ) : (\n <>\n <div style={{ minHeight: 20 }}>\n <MarkdownRender content={item.content} msgId={item.id} isAi={true} onDelete={deleteSingleMsg} />\n </div>\n {item.loading && <span style={{ color: '#1677ff', fontSize: 12 }}> 思考中...</span>}\n {!item.loading && (\n <Space size={8} style={{ fontSize: 12, marginTop: 6, display: 'flex' }}>\n <Tooltip title=\"复制\">\n <CopyOutlined onClick={() => copyMsg(item.content)} style={{ cursor: 'pointer', color: '#999' }} />\n </Tooltip>\n <Tooltip title=\"重新生成\">\n <ReloadOutlined onClick={() => regenerateAnswer(item)} style={{ cursor: 'pointer', color: '#999' }} />\n </Tooltip>\n </Space>\n )}\n </>\n )}\n </div>\n </List.Item>\n );\n\n const renderSession = (s: ChatSession) => (\n <List.Item\n key={s.id}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest('.ant-popover, .ant-popconfirm')) {\n return;\n }\n switchSession(s.id);\n }}\n style={{\n padding: '10px 12px',\n borderRadius: 8,\n cursor: 'pointer',\n backgroundColor: activeSession?.id === s.id ? '#e6f7ff' : '#fff',\n transition: 'all 0.2s',\n marginBottom: 8,\n }}\n >\n <div\n style={{\n flex: 1,\n overflow: 'hidden',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <div\n style={{\n fontSize: 14,\n fontWeight: 500,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {s.title}\n </div>\n <div style={{ fontSize: 12, color: '#999', marginTop: 2 }}>\n {new Date(s.createTime).toLocaleString().slice(0, 16)}\n </div>\n </div>\n <Popconfirm\n title=\"确定删除?\"\n onConfirm={(e: any) => {\n deleteSession(s.id, e as React.MouseEvent);\n }}\n >\n <DeleteOutlined\n style={{ color: '#ff4d4f', cursor: 'pointer', marginLeft: 8 }}\n onClick={(e) => e.stopPropagation()}\n />\n </Popconfirm>\n </div>\n </List.Item>\n );\n\n // 计算对话框位置和大小\n const getDialogStyle = (): CSSProperties => {\n if (isMaximized) {\n return {\n position: 'fixed',\n top: 0,\n left: 0,\n width: '100vw',\n height: '100vh',\n borderRadius: 0,\n };\n }\n\n const baseStyle: CSSProperties = {\n position: 'relative',\n width: showSessions ? 960 : 720,\n height: 680,\n borderRadius: 12,\n };\n\n if (dialogPosition.x !== 0 || dialogPosition.y !== 0) {\n return {\n ...baseStyle,\n transform: `translate(${dialogPosition.x}px, ${dialogPosition.y}px)`,\n };\n }\n\n return baseStyle;\n };\n\n return (\n <div\n className={className}\n style={{\n position: 'fixed',\n bottom: initialPosition.bottom,\n right: initialPosition.right,\n zIndex,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n transform:\n dialogPosition.x !== 0 || dialogPosition.y !== 0\n ? `translate(${dialogPosition.x}px, ${dialogPosition.y}px)`\n : undefined,\n ...style,\n }}\n >\n {!visible ? (\n renderTrigger ? (\n <div\n ref={triggerRef}\n onMouseDown={handleTriggerMouseDown}\n onClick={() => !isDragging && toggleVisible(true)}\n style={{ cursor: isDragging ? 'grabbing' : 'grab' }}\n >\n {renderTrigger}\n </div>\n ) : (\n <div\n ref={triggerRef}\n onMouseDown={handleTriggerMouseDown}\n onClick={() => !isDragging && toggleVisible(true)}\n style={{ cursor: isDragging ? 'grabbing' : 'grab' }}\n >\n <Button\n type=\"primary\"\n shape=\"circle\"\n size=\"large\"\n icon={<MessageOutlined />}\n style={{\n width: buttonSize,\n height: buttonSize,\n boxShadow: '0 4px 16px rgba(22, 119, 255, 0.4)',\n }}\n />\n </div>\n )\n ) : (\n <div\n style={{\n ...getDialogStyle(),\n background: '#fff',\n boxShadow: '0 4px 20px rgba(0,0,0,0.15)',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'row',\n marginBottom: isMaximized ? 0 : 12,\n transition: 'all 0.3s ease',\n }}\n >\n {/* 历史会话面板 - 左侧 */}\n {showSessionPanel && showSessions && (\n <div\n style={{\n width: 280,\n borderRight: '1px solid #f0f0f0',\n background: '#fafafa',\n display: 'flex',\n flexDirection: 'column',\n flexShrink: 0,\n }}\n >\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid #f0f0f0',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <Title level={5} style={{ margin: 0, fontSize: 16 }}>\n 历史会话\n </Title>\n <Button type=\"text\" size=\"small\" icon={<CloseOutlined />} onClick={() => setShowSessions(false)} />\n </div>\n <div style={{ flex: 1, padding: 16, overflowY: 'auto' }}>\n <Button\n type=\"primary\"\n block\n icon={<PlusOutlined />}\n onClick={createNewSession}\n style={{ marginBottom: 12 }}\n >\n 新建会话\n </Button>\n <List dataSource={sessions} renderItem={renderSession} locale={{ emptyText: '暂无会话' }} />\n </div>\n </div>\n )}\n\n {/* 主对话区域 */}\n <div\n style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n }}\n >\n {renderHeader || (\n <div\n className=\"ai-chat-header\"\n style={{\n padding: '12px 16px',\n background: '#fafafa',\n borderBottom: '1px solid #f0f0f0',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n flexShrink: 0,\n }}\n >\n <Space>\n {showSessionPanel && (\n <Button\n type={showSessions ? 'primary' : 'text'}\n icon={<MenuOutlined />}\n size=\"small\"\n onClick={() => setShowSessions(!showSessions)}\n >\n {showSessions ? '收起' : '会话'}\n </Button>\n )}\n <Button type=\"text\" icon={<PlusOutlined />} onClick={createNewSession} size=\"small\">\n 新会话\n </Button>\n </Space>\n <Space>\n <Tooltip title={isMaximized ? '还原' : '最大化'}>\n <Button\n type=\"text\"\n icon={isMaximized ? <CompressOutlined /> : <ExpandOutlined />}\n onClick={toggleMaximize}\n size=\"small\"\n />\n </Tooltip>\n <Tooltip title=\"关闭\">\n <Button type=\"text\" icon={<CloseOutlined />} onClick={() => toggleVisible(false)} size=\"small\" />\n </Tooltip>\n </Space>\n </div>\n )}\n\n <div\n style={{\n flex: 1,\n padding: 16,\n overflowY: 'auto',\n }}\n >\n {!activeSession || activeSession.messages.length === 0 ? (\n <div\n style={{\n textAlign: 'center',\n padding: '60px 0',\n color: '#999',\n }}\n >\n <MessageOutlined style={{ fontSize: 48, color: '#d9d9d9' }} />\n <div style={{ marginTop: 16, fontSize: 16 }}>开始你的 AI 对话</div>\n <div style={{ marginTop: 8, fontSize: 13, color: '#bfbfbf' }}>我可以帮你解答问题、创建任务</div>\n <Button type=\"primary\" onClick={createNewSession} style={{ marginTop: 20 }}>\n 新建会话\n </Button>\n </div>\n ) : (\n <List dataSource={activeSession.messages} renderItem={renderMsg} />\n )}\n <div ref={messagesEndRef} />\n </div>\n\n {renderFooter || (\n <div\n style={{\n padding: 12,\n borderTop: '1px solid #f0f0f0',\n background: '#fafafa',\n flexShrink: 0,\n }}\n >\n {/* 智能建议 */}\n {suggestions.length > 0 && (\n <div\n style={{\n marginBottom: 8,\n display: 'flex',\n flexWrap: 'wrap',\n gap: 4,\n }}\n >\n {suggestions.slice(0, 3).map((suggestion, index) => (\n <Button\n key={index}\n size=\"small\"\n type=\"dashed\"\n onClick={() => setInputValue(suggestion)}\n style={{ fontSize: 12 }}\n >\n {suggestion}\n </Button>\n ))}\n </div>\n )}\n\n {/* 文件预览 */}\n {fileList.length > 0 && (\n <div style={{ marginBottom: 8 }}>\n {fileList.map((file) => (\n <div\n key={file.uid}\n style={{\n display: 'inline-block',\n padding: '4px 8px',\n background: '#e6f7ff',\n borderRadius: 4,\n marginRight: 8,\n fontSize: 12,\n }}\n >\n {file.name}\n <CloseOutlined\n style={{\n marginLeft: 8,\n cursor: 'pointer',\n fontSize: 10,\n }}\n onClick={() => setFileList(fileList.filter((f) => f.uid !== file.uid))}\n />\n </div>\n ))}\n </div>\n )}\n\n <div style={{ position: 'relative' }}>\n <TextArea\n value={inputValue}\n onChange={handleInputChange}\n placeholder=\"输入问题或任务描述,如:帮我创建一个paimon调用任务\"\n autoSize={{ minRows: 2, maxRows: 4 }}\n onPressEnter={(e) => {\n if (!e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n }}\n style={{\n marginBottom: 8,\n borderRadius: 8,\n paddingRight: 80,\n }}\n disabled={loading}\n />\n {/* 上传文件和图片按钮 */}\n <div\n style={{\n position: 'absolute',\n right: 12,\n bottom: 16,\n display: 'flex',\n gap: 8,\n }}\n >\n <Upload\n fileList={fileList}\n onChange={handleFileChange}\n beforeUpload={() => false}\n showUploadList={false}\n accept=\"image/*\"\n >\n <Tooltip title=\"上传图片\">\n <Button type=\"text\" size=\"small\" icon={<FileImageOutlined />} />\n </Tooltip>\n </Upload>\n <Upload\n fileList={fileList}\n onChange={handleFileChange}\n beforeUpload={() => false}\n showUploadList={false}\n >\n <Tooltip title=\"上传文件\">\n <Button type=\"text\" size=\"small\" icon={<PaperClipOutlined />} />\n </Tooltip>\n </Upload>\n </div>\n </div>\n <div style={{ display: 'flex', justifyContent: 'flex-end' }}>\n <Space>\n {loading && (\n <Button danger icon={<StopOutlined />} onClick={cancelRequest} size=\"small\">\n 终止\n </Button>\n )}\n <Button\n type=\"primary\"\n icon={<SendOutlined />}\n onClick={handleSend}\n loading={loading}\n disabled={!inputValue.trim() && fileList.length === 0}\n size=\"small\"\n >\n 发送\n </Button>\n </Space>\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default AiChat;\nexport { generateSuggestions, isTaskCreationIntent, parseTaskDescription, recognizeIntent } from './intentRecognizer';\nexport { delay, NavigationManager } from './navigationManager';\nexport type {\n AiChatConfig,\n ChatSession,\n EnhancedAiChatConfig,\n Intent,\n IntentType,\n Message,\n NavigationOptions,\n Task,\n TaskCategory,\n TaskCreationResult,\n TaskPriority,\n TaskStatus,\n UseAiChatOptions,\n UseAiChatReturn,\n} from './type';\nexport { useAiChat } from './useAiChat';\nexport { useTaskWorkflow } from './useTaskWorkflow';\n"],
|
|
4
|
+
"sourcesContent": ["import {\n CloseOutlined,\n CompressOutlined,\n CopyOutlined,\n DeleteOutlined,\n ExpandOutlined,\n FileImageOutlined,\n MenuOutlined,\n MessageOutlined,\n PaperClipOutlined,\n PlusOutlined,\n ReloadOutlined,\n SendOutlined,\n StopOutlined,\n} from '@ant-design/icons';\nimport type { UploadFile } from 'antd';\nimport { Button, Input, List, message, Popconfirm, Space, Tooltip, Typography, Upload } from 'antd';\nimport type { CSSProperties, FC, ReactNode } from 'react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { generateSuggestions, isTaskCreationIntent, recognizeIntent } from './intentRecognizer';\nimport MarkdownRender from './MarkdownRender';\nimport type { AiChatConfig, ChatSession, EnhancedAiChatConfig, Message } from './type';\nimport { useAiChat } from './useAiChat';\nimport { useTaskWorkflow } from './useTaskWorkflow';\n\nconst { TextArea } = Input;\nconst { Title } = Typography;\n\n// 合并Props类型\nexport interface AiChatProps extends AiChatConfig, Partial<EnhancedAiChatConfig> {\n className?: string;\n style?: CSSProperties;\n renderTrigger?: ReactNode;\n renderHeader?: ReactNode;\n renderFooter?: ReactNode;\n}\n\nconst AiChat: FC<AiChatProps> = ({\n apiPath = '/api/ai/chat-stream',\n storageKey = 'ai_chat_sessions',\n position: initialPosition = { bottom: 24, right: 24 },\n buttonSize = 56,\n zIndex = 1080,\n showSessionPanel = true,\n onBeforeSend,\n onError,\n onSuccess,\n onFetchSessions,\n onFetchSessionDetail,\n onCreateSession,\n onSendMessage,\n onUploadFile,\n className,\n style,\n renderTrigger,\n renderHeader,\n renderFooter,\n // 增强配置\n taskWorkflow,\n intentRecognition: intentConfig,\n navigation: navConfig,\n}) => {\n const {\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 } = useAiChat({\n apiPath,\n storageKey,\n onBeforeSend,\n onError,\n onSuccess,\n onFetchSessions,\n onFetchSessionDetail,\n onCreateSession,\n onSendMessage,\n onUploadFile,\n });\n\n // 任务工作流\n const {\n tasks,\n createTask,\n updateTaskStatus,\n deleteTask,\n createTaskFromNaturalLanguage,\n updateUrlWithTaskId,\n refreshCurrentPage,\n executeTaskCreationWorkflow,\n } = useTaskWorkflow({\n enabled: taskWorkflow?.enabled,\n createTaskApi: taskWorkflow?.createTaskApi,\n supportedTaskTypes: taskWorkflow?.supportedTaskTypes,\n autoNavigate: taskWorkflow?.autoNavigate,\n refreshDelay: navConfig?.refreshDelay,\n taskIdParamName: taskWorkflow?.taskIdParamName,\n taskTypeParamName: taskWorkflow?.taskTypeParamName,\n onTaskCreated: (taskId, taskData) => {\n // 添加系统消息到会话\n if (activeSession) {\n const systemMsg: Message = {\n id: `${Date.now()}_sys`,\n role: 'system',\n content: `任务创建成功,ID: ${taskId}`,\n taskId,\n };\n // 这里可以添加到消息列表的逻辑\n }\n },\n onError,\n });\n\n const [inputValue, setInputValue] = useState('');\n const [showSessions, setShowSessions] = useState(false);\n const [suggestions, setSuggestions] = useState<string[]>([]);\n const [fileList, setFileList] = useState<UploadFile<any>[]>([]);\n const [isMaximized, setIsMaximized] = useState(false);\n const [dialogPosition, setDialogPosition] = useState({ x: 0, y: 0 });\n const [isDragging, setIsDragging] = useState(false);\n const dragOffset = useRef({ x: 0, y: 0 });\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [activeSession?.messages]);\n\n // 拖拽处理 - 拖拽整个组件位置\n const handleTriggerMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (visible) return; // 对话框展开时不处理\n const target = e.target as HTMLElement;\n if (target.closest('.ant-upload, .ant-btn')) return; // 排除按钮和上传元素\n\n e.preventDefault();\n const triggerEl = triggerRef.current;\n if (!triggerEl) return;\n\n const rect = triggerEl.getBoundingClientRect();\n dragOffset.current = {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n setIsDragging(true);\n },\n [visible],\n );\n\n const handleTriggerMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isDragging || visible) return;\n setDialogPosition({\n x: e.clientX - dragOffset.current.x,\n y: e.clientY - dragOffset.current.y,\n });\n },\n [isDragging, visible],\n );\n\n const handleTriggerMouseUp = useCallback(() => {\n setIsDragging(false);\n }, []);\n\n useEffect(() => {\n if (isDragging && !visible) {\n document.addEventListener('mousemove', handleTriggerMouseMove);\n document.addEventListener('mouseup', handleTriggerMouseUp);\n return () => {\n document.removeEventListener('mousemove', handleTriggerMouseMove);\n document.removeEventListener('mouseup', handleTriggerMouseUp);\n };\n }\n return undefined;\n }, [isDragging, visible, handleTriggerMouseMove, handleTriggerMouseUp]);\n\n // 实时分析输入内容生成建议\n const handleInputChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const value = e.target.value;\n setInputValue(value);\n\n if (value.length > 3) {\n const intent = recognizeIntent(value);\n const newSuggestions = generateSuggestions(value, intent);\n setSuggestions(newSuggestions);\n } else {\n setSuggestions([]);\n }\n }, []);\n\n // 文件上传处理\n const handleFileChange = useCallback(\n async (info: { fileList: UploadFile<any>[]; file?: UploadFile<any> }) => {\n const uploadFile = info.file;\n if (!uploadFile || !uploadFile.originFileObj) {\n setFileList(info.fileList);\n return;\n }\n\n const file = uploadFile.originFileObj as File;\n const isImage = file.type.startsWith('image/');\n const fileType: 'image' | 'document' = isImage ? 'image' : 'document';\n\n try {\n // 调用 onUploadFile 回调\n if (onUploadFile && activeSession) {\n const result = await onUploadFile({\n sessionId: activeSession.id,\n file: file as any,\n type: fileType,\n });\n\n // 将上传结果添加到文件列表\n const uploadedFile: UploadFile = {\n uid: file.name,\n name: result.name || file.name,\n status: 'done',\n url: result.url,\n };\n setFileList([...fileList, uploadedFile]);\n message.success(`${fileType === 'image' ? '图片' : '文件'}上传成功`);\n } else {\n // 没有回调时,仅本地记录\n setFileList([...fileList, uploadFile]);\n }\n } catch (err) {\n console.error('文件上传失败:', err);\n message.error('文件上传失败');\n setFileList(fileList.filter((f) => f.uid !== file.name));\n }\n },\n [fileList, activeSession, onUploadFile],\n );\n\n // 判断是否为任务创建意图并执行工作流\n const handleSend = useCallback(async () => {\n if (!inputValue.trim() && fileList.length === 0) {\n message.warning('请输入问题或上传文件');\n return;\n }\n\n let content = inputValue.trim();\n\n // 如果有文件,附加文件信息\n if (fileList.length > 0) {\n const fileInfo = fileList.map((f) => f.name).join(', ');\n content += `\\n[附件: ${fileInfo}]`;\n }\n\n setInputValue('');\n setSuggestions([]);\n setFileList([]);\n\n // 检查是否为任务创建意图\n const intentEnabled = intentConfig?.enabled !== false;\n if (intentEnabled && isTaskCreationIntent(content)) {\n // 执行任务创建工作流\n await executeTaskCreationWorkflow(content);\n return;\n }\n\n // 普通问答\n sendQuestion(content);\n }, [inputValue, fileList, intentConfig?.enabled, executeTaskCreationWorkflow, sendQuestion]);\n\n const copyMsg = (c: string) => {\n navigator.clipboard.writeText(c);\n message.success('复制成功');\n };\n\n const toggleMaximize = useCallback(() => {\n setIsMaximized((prev) => !prev);\n }, []);\n\n const renderMsg = (item: Message) => (\n <List.Item\n key={item.id}\n style={{\n justifyContent: item.role === 'user' ? 'flex-end' : 'flex-start',\n marginBottom: 12,\n padding: '4px 0',\n }}\n >\n <div\n style={{\n maxWidth: '85%',\n padding: '10px 14px',\n borderRadius: 12,\n backgroundColor: item.role === 'user' ? '#1677ff' : item.role === 'system' ? '#f6ffed' : '#fafafa',\n color: item.role === 'user' ? '#fff' : '#333',\n border: item.role === 'ai' ? '1px solid #f0f0f0' : item.role === 'system' ? '1px solid #b7eb8f' : 'none',\n boxShadow:\n item.role === 'user'\n ? '0 2px 8px rgba(22, 119, 255, 0.3)'\n : item.role === 'system'\n ? '0 1px 4px rgba(82, 196, 26, 0.1)'\n : '0 1px 4px rgba(0,0,0,0.05)',\n }}\n >\n {item.role === 'user' ? (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 8 }}>\n <span>{item.content}</span>\n <CopyOutlined\n onClick={() => copyMsg(item.content)}\n style={{\n fontSize: 12,\n color: 'rgba(255,255,255,0.7)',\n cursor: 'pointer',\n flexShrink: 0,\n }}\n />\n </div>\n ) : item.role === 'system' ? (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n fontSize: 13,\n }}\n >\n <span style={{ color: '#52c41a' }}>✓</span>\n <span>{item.content}</span>\n {item.taskId && (\n <Button\n type='link'\n size='small'\n style={{ padding: 0, fontSize: 12 }}\n onClick={() => updateUrlWithTaskId(item.taskId!)}\n >\n 查看任务\n </Button>\n )}\n </div>\n ) : (\n <>\n <div style={{ minHeight: 20 }}>\n <MarkdownRender content={item.content} msgId={item.id} isAi={true} onDelete={deleteSingleMsg} />\n </div>\n {item.loading && <span style={{ color: '#1677ff', fontSize: 12 }}> 思考中...</span>}\n {!item.loading && (\n <Space size={8} style={{ fontSize: 12, marginTop: 6, display: 'flex' }}>\n <Tooltip title='复制'>\n <CopyOutlined onClick={() => copyMsg(item.content)} style={{ cursor: 'pointer', color: '#999' }} />\n </Tooltip>\n <Tooltip title='重新生成'>\n <ReloadOutlined onClick={() => regenerateAnswer(item)} style={{ cursor: 'pointer', color: '#999' }} />\n </Tooltip>\n </Space>\n )}\n </>\n )}\n </div>\n </List.Item>\n );\n\n const renderSession = (s: ChatSession) => (\n <List.Item\n key={s.id}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest('.ant-popover, .ant-popconfirm')) {\n return;\n }\n switchSession(s.id);\n }}\n style={{\n padding: '10px 12px',\n borderRadius: 8,\n cursor: 'pointer',\n backgroundColor: activeSession?.id === s.id ? '#e6f7ff' : '#fff',\n transition: 'all 0.2s',\n marginBottom: 8,\n }}\n >\n <div\n style={{\n flex: 1,\n overflow: 'hidden',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <div\n style={{\n fontSize: 14,\n fontWeight: 500,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {s.title}\n </div>\n <div style={{ fontSize: 12, color: '#999', marginTop: 2 }}>\n {new Date(s.createTime).toLocaleString().slice(0, 16)}\n </div>\n </div>\n <Popconfirm\n title='确定删除?'\n onConfirm={(e: any) => {\n deleteSession(s.id, e as React.MouseEvent);\n }}\n >\n <DeleteOutlined\n style={{ color: '#ff4d4f', cursor: 'pointer', marginLeft: 8 }}\n onClick={(e) => e.stopPropagation()}\n />\n </Popconfirm>\n </div>\n </List.Item>\n );\n\n // 计算对话框位置和大小\n const getDialogStyle = (): CSSProperties => {\n if (isMaximized) {\n return {\n position: 'fixed',\n top: 0,\n left: 0,\n width: '100vw',\n height: '100vh',\n borderRadius: 0,\n };\n }\n\n const baseStyle: CSSProperties = {\n position: 'relative',\n width: showSessions ? 960 : 720,\n height: 680,\n borderRadius: 12,\n };\n\n if (dialogPosition.x !== 0 || dialogPosition.y !== 0) {\n return {\n ...baseStyle,\n transform: `translate(${dialogPosition.x}px, ${dialogPosition.y}px)`,\n };\n }\n\n return baseStyle;\n };\n\n return (\n <div\n className={className}\n style={{\n position: 'fixed',\n bottom: initialPosition.bottom,\n right: initialPosition.right,\n zIndex,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n transform:\n dialogPosition.x !== 0 || dialogPosition.y !== 0\n ? `translate(${dialogPosition.x}px, ${dialogPosition.y}px)`\n : undefined,\n ...style,\n }}\n >\n {!visible ? (\n renderTrigger ? (\n <div\n ref={triggerRef}\n onMouseDown={handleTriggerMouseDown}\n onClick={() => !isDragging && toggleVisible(true)}\n style={{ cursor: isDragging ? 'grabbing' : 'grab' }}\n >\n {renderTrigger}\n </div>\n ) : (\n <div\n ref={triggerRef}\n onMouseDown={handleTriggerMouseDown}\n onClick={() => !isDragging && toggleVisible(true)}\n style={{ cursor: isDragging ? 'grabbing' : 'grab' }}\n >\n <Button\n type='primary'\n shape='circle'\n size='large'\n icon={<MessageOutlined />}\n style={{\n width: buttonSize,\n height: buttonSize,\n boxShadow: '0 4px 16px rgba(22, 119, 255, 0.4)',\n }}\n />\n </div>\n )\n ) : (\n <div\n style={{\n ...getDialogStyle(),\n background: '#fff',\n boxShadow: '0 4px 20px rgba(0,0,0,0.15)',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'row',\n marginBottom: isMaximized ? 0 : 12,\n transition: 'all 0.3s ease',\n }}\n >\n {/* 历史会话面板 - 左侧 */}\n {showSessionPanel && showSessions && (\n <div\n style={{\n width: 280,\n borderRight: '1px solid #f0f0f0',\n background: '#fafafa',\n display: 'flex',\n flexDirection: 'column',\n flexShrink: 0,\n }}\n >\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid #f0f0f0',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <Title level={5} style={{ margin: 0, fontSize: 16 }}>\n 历史会话\n </Title>\n <Button type='text' size='small' icon={<CloseOutlined />} onClick={() => setShowSessions(false)} />\n </div>\n <div style={{ flex: 1, padding: 16, overflowY: 'auto' }}>\n <Button\n type='primary'\n block\n icon={<PlusOutlined />}\n onClick={createNewSession}\n style={{ marginBottom: 12 }}\n >\n 新建会话\n </Button>\n <List dataSource={sessions} renderItem={renderSession} locale={{ emptyText: '暂无会话' }} />\n </div>\n </div>\n )}\n\n {/* 主对话区域 */}\n <div\n style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n }}\n >\n {renderHeader || (\n <div\n className='ai-chat-header'\n style={{\n padding: '12px 16px',\n background: '#fafafa',\n borderBottom: '1px solid #f0f0f0',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n flexShrink: 0,\n }}\n >\n <Space>\n {showSessionPanel && (\n <Button\n type={showSessions ? 'primary' : 'text'}\n icon={<MenuOutlined />}\n size='small'\n onClick={() => setShowSessions(!showSessions)}\n >\n {showSessions ? '收起' : '会话'}\n </Button>\n )}\n <Button type='text' icon={<PlusOutlined />} onClick={createNewSession} size='small'>\n 新会话\n </Button>\n </Space>\n <Space>\n <Tooltip title={isMaximized ? '还原' : '最大化'}>\n <Button\n type='text'\n icon={isMaximized ? <CompressOutlined /> : <ExpandOutlined />}\n onClick={toggleMaximize}\n size='small'\n />\n </Tooltip>\n <Tooltip title='关闭'>\n <Button type='text' icon={<CloseOutlined />} onClick={() => toggleVisible(false)} size='small' />\n </Tooltip>\n </Space>\n </div>\n )}\n\n <div\n style={{\n flex: 1,\n padding: 16,\n overflowY: 'auto',\n }}\n >\n {!activeSession || activeSession.messages.length === 0 ? (\n <div\n style={{\n textAlign: 'center',\n padding: '60px 0',\n color: '#999',\n }}\n >\n <MessageOutlined style={{ fontSize: 48, color: '#d9d9d9' }} />\n <div style={{ marginTop: 16, fontSize: 16 }}>开始你的 AI 对话</div>\n <div style={{ marginTop: 8, fontSize: 13, color: '#bfbfbf' }}>我可以帮你解答问题、创建任务</div>\n <Button type='primary' onClick={createNewSession} style={{ marginTop: 20 }}>\n 新建会话\n </Button>\n </div>\n ) : (\n <List dataSource={activeSession.messages} renderItem={renderMsg} />\n )}\n <div ref={messagesEndRef} />\n </div>\n\n {renderFooter || (\n <div\n style={{\n padding: 12,\n borderTop: '1px solid #f0f0f0',\n background: '#fafafa',\n flexShrink: 0,\n }}\n >\n {/* 智能建议 */}\n {suggestions.length > 0 && (\n <div\n style={{\n marginBottom: 8,\n display: 'flex',\n flexWrap: 'wrap',\n gap: 4,\n }}\n >\n {suggestions.slice(0, 3).map((suggestion, index) => (\n <Button\n key={index}\n size='small'\n type='dashed'\n onClick={() => setInputValue(suggestion)}\n style={{ fontSize: 12 }}\n >\n {suggestion}\n </Button>\n ))}\n </div>\n )}\n\n {/* 文件预览 */}\n {fileList.length > 0 && (\n <div style={{ marginBottom: 8 }}>\n {fileList.map((file) => (\n <div\n key={file.uid}\n style={{\n display: 'inline-block',\n padding: '4px 8px',\n background: '#e6f7ff',\n borderRadius: 4,\n marginRight: 8,\n fontSize: 12,\n }}\n >\n {file.name}\n <CloseOutlined\n style={{\n marginLeft: 8,\n cursor: 'pointer',\n fontSize: 10,\n }}\n onClick={() => setFileList(fileList.filter((f) => f.uid !== file.uid))}\n />\n </div>\n ))}\n </div>\n )}\n\n <div style={{ position: 'relative' }}>\n <TextArea\n value={inputValue}\n onChange={handleInputChange}\n placeholder='输入问题或任务描述,如:帮我创建一个paimon调用任务'\n autoSize={{ minRows: 2, maxRows: 4 }}\n onPressEnter={(e) => {\n if (!e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n }}\n style={{\n marginBottom: 8,\n borderRadius: 8,\n paddingRight: 80,\n }}\n disabled={loading}\n />\n {/* 上传文件和图片按钮 */}\n <div\n style={{\n position: 'absolute',\n right: 12,\n bottom: 16,\n display: 'flex',\n gap: 8,\n }}\n >\n <Upload\n fileList={fileList}\n onChange={handleFileChange}\n beforeUpload={() => false}\n showUploadList={false}\n accept='image/*'\n >\n <Tooltip title='上传图片'>\n <Button type='text' size='small' icon={<FileImageOutlined />} />\n </Tooltip>\n </Upload>\n <Upload\n fileList={fileList}\n onChange={handleFileChange}\n beforeUpload={() => false}\n showUploadList={false}\n >\n <Tooltip title='上传文件'>\n <Button type='text' size='small' icon={<PaperClipOutlined />} />\n </Tooltip>\n </Upload>\n </div>\n </div>\n <div style={{ display: 'flex', justifyContent: 'flex-end' }}>\n <Space>\n {loading && (\n <Button danger icon={<StopOutlined />} onClick={cancelRequest} size='small'>\n 终止\n </Button>\n )}\n <Button\n type='primary'\n icon={<SendOutlined />}\n onClick={handleSend}\n loading={loading}\n disabled={!inputValue.trim() && fileList.length === 0}\n size='small'\n >\n 发送\n </Button>\n </Space>\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default AiChat;\nexport { generateSuggestions, isTaskCreationIntent, parseTaskDescription, recognizeIntent } from './intentRecognizer';\nexport { delay, NavigationManager } from './navigationManager';\nexport type {\n AiChatConfig,\n ChatSession,\n EnhancedAiChatConfig,\n Intent,\n IntentType,\n Message,\n NavigationOptions,\n Task,\n TaskCategory,\n TaskCreationResult,\n TaskPriority,\n TaskStatus,\n UseAiChatOptions,\n UseAiChatReturn,\n} from './type';\nexport { useAiChat } from './useAiChat';\nexport { useTaskWorkflow } from './useTaskWorkflow';\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["import_intentRecognizer", "import_useAiChat", "import_useTaskWorkflow", "React", "MarkdownRender"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/business/AiChat/intentRecognizer.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Intent,
|
|
4
|
+
"sourcesContent": ["import type { Intent, IntentPattern, IntentType, TaskCategory } from './type';\n\n// 默认意图模式\nconst DEFAULT_PATTERNS: IntentPattern[] = [\n {\n type: 'create_task',\n patterns: [/创建|新建|启动|开始|生成|建立|发起/i, /帮我|请|帮忙|协助/i, /任务|作业|job|task/i],\n },\n {\n type: 'query_task',\n patterns: [/查询|查看|获取|显示|看看|找/i, /任务|作业|状态|进度|结果/i],\n },\n {\n type: 'update_task',\n patterns: [/更新|修改|编辑|更改|调整|优化/i, /任务|配置|参数|设置/i],\n },\n {\n type: 'delete_task',\n patterns: [/删除|取消|移除|清除|销毁/i, /任务|作业|job|task/i],\n },\n {\n type: 'call_api',\n patterns: [/调用|请求|发送|访问/i, /接口|API|服务|请求/i],\n },\n];\n\n// 任务类型关键词映射\nconst TASK_TYPE_KEYWORDS: Record<string, { patterns: RegExp[]; type: TaskCategory }> = {\n paimon: {\n patterns: [/paimon|帕蒙/i],\n type: 'paimon',\n },\n data_sync: {\n patterns: [/数据同步|同步|数据迁移|迁移/i],\n type: 'data_sync',\n },\n report: {\n patterns: [/报表|报告|report|数据报表|统计/i],\n type: 'report',\n },\n etl: {\n patterns: [/ETL|数据处理|数据清洗|数据转换/i],\n type: 'etl',\n },\n bug: {\n patterns: [/bug|缺陷|问题|错误|修复|fix/i],\n type: 'bug',\n },\n feature: {\n patterns: [/功能|新特性|feature|需求|新特性/i],\n type: 'feature',\n },\n analysis: {\n patterns: [/分析|解析|analyze|数据分析|统计分析/i],\n type: 'analysis',\n },\n};\n\n/**\n * 识别用户意图\n * @param text 用户输入文本\n * @param customPatterns 自定义意图模式\n * @returns 识别结果\n */\nexport function recognizeIntent(text: string, customPatterns?: IntentPattern[]): Intent {\n const patterns = customPatterns || DEFAULT_PATTERNS;\n\n let bestMatch: IntentType = 'general_question';\n let bestScore = 0;\n let matchedPattern = '';\n\n // 计算每个意图的匹配分数\n for (const pattern of patterns) {\n let score = 0;\n for (const regex of pattern.patterns) {\n if (regex.test(text)) {\n score += 1;\n matchedPattern = regex.source;\n }\n }\n\n // 如果有多个模式匹配,增加权重\n if (score === pattern.patterns.length && score > 0) {\n score += 0.5;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestMatch = pattern.type;\n }\n }\n\n // 提取任务类型参数\n const parameters: Record<string, any> = extractTaskParameters(text);\n\n // 计算置信度\n const confidence = Math.min(bestScore / 3, 1);\n\n return {\n type: bestMatch,\n confidence,\n parameters,\n rawText: text,\n matchedPattern: bestMatch !== 'general_question' ? matchedPattern : undefined,\n };\n}\n\n/**\n * 提取任务参数\n * @param text 用户输入文本\n * @returns 提取的参数\n */\nfunction extractTaskParameters(text: string): Record<string, any> {\n const params: Record<string, any> = {\n taskType: detectTaskType(text),\n originalText: text,\n };\n\n // 提取任务名称\n const nameMatch = text.match(/名为[\"']?([^\"']+)[\"']?/i);\n if (nameMatch) {\n params.taskName = nameMatch[1];\n }\n\n // 提取优先级\n if (/高优先级|紧急|urgent|critical/i.test(text)) {\n params.priority = 'high';\n } else if (/低优先级|optional|low/i.test(text)) {\n params.priority = 'low';\n } else {\n params.priority = 'medium';\n }\n\n // 提取描述信息\n const descMatch = text.match(/描述|说明|备注[::]?\\s*(.+)$/i);\n if (descMatch) {\n params.description = descMatch[1].trim();\n }\n\n // 提取时间信息\n const timeMatch = text.match(/(明天|下周|后天|今天|立即|马上|尽快)/i);\n if (timeMatch) {\n params.scheduledTime = timeMatch[1];\n }\n\n return params;\n}\n\n/**\n * 检测任务类型\n * @param text 用户输入文本\n * @returns 任务类型\n */\nfunction detectTaskType(text: string): TaskCategory {\n for (const [key, config] of Object.entries(TASK_TYPE_KEYWORDS)) {\n for (const pattern of config.patterns) {\n if (pattern.test(text)) {\n return config.type;\n }\n }\n }\n return 'other';\n}\n\n/**\n * 生成建议问题\n * @param text 用户输入文本\n * @param intent 识别的意图\n * @returns 建议问题列表\n */\nexport function generateSuggestions(text: string, intent: Intent): string[] {\n const suggestions: string[] = [];\n\n switch (intent.type) {\n case 'create_task':\n suggestions.push(\n '帮我创建一个数据同步任务',\n '创建一个新的报表生成任务',\n '启动Paimon表同步作业',\n '帮我创建一个ETL数据处理任务',\n );\n break;\n case 'query_task':\n suggestions.push('查询我的任务列表', '查看任务执行状态', '获取任务执行结果', '查看任务进度');\n break;\n case 'update_task':\n suggestions.push('更新任务配置', '修改任务参数', '调整任务执行时间', '优化任务设置');\n break;\n case 'delete_task':\n suggestions.push('取消当前任务', '删除失败任务', '清除已完成的任务');\n break;\n default:\n suggestions.push('帮我解答一个问题', '分析这段代码', '解释这个概念', '如何优化查询性能');\n }\n\n return suggestions;\n}\n\n/**\n * 判断是否为任务创建意图\n * @param text 用户输入文本\n * @param threshold 置信度阈值\n * @returns 是否为任务创建意图\n */\nexport function isTaskCreationIntent(text: string, threshold = 0.5): boolean {\n const intent = recognizeIntent(text);\n return intent.type === 'create_task' && intent.confidence >= threshold;\n}\n\n/**\n * 创建任务描述(自然语言转结构化数据)\n * @param text 用户输入文本\n * @returns 结构化的任务描述\n */\nexport function parseTaskDescription(text: string): {\n taskType: TaskCategory;\n taskName: string;\n description: string;\n priority: 'high' | 'medium' | 'low';\n} {\n const intent = recognizeIntent(text);\n const params = intent.parameters;\n\n return {\n taskType: params.taskType || detectTaskType(text),\n taskName: params.taskName || `${params.taskType || '新'}任务 - ${new Date().toLocaleTimeString().slice(0, 5)}`,\n description: params.description || text,\n priority: params.priority || 'medium',\n };\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -105,7 +105,7 @@ var NavigationManager = class {
|
|
|
105
105
|
* @param options 导航选项
|
|
106
106
|
*/
|
|
107
107
|
static navigateToTask(taskId, options) {
|
|
108
|
-
const url =
|
|
108
|
+
const url = NavigationManager.buildTaskUrl(taskId, {
|
|
109
109
|
baseUrl: options == null ? void 0 : options.baseUrl,
|
|
110
110
|
taskType: options == null ? void 0 : options.taskType,
|
|
111
111
|
additionalParams: options == null ? void 0 : options.queryParams
|
|
@@ -122,7 +122,7 @@ var NavigationManager = class {
|
|
|
122
122
|
*/
|
|
123
123
|
static refreshCurrentPage(taskId) {
|
|
124
124
|
if (taskId) {
|
|
125
|
-
|
|
125
|
+
NavigationManager.updateQueryParams({ taskId }, { replace: false });
|
|
126
126
|
}
|
|
127
127
|
window.location.reload();
|
|
128
128
|
}
|
|
@@ -131,7 +131,7 @@ var NavigationManager = class {
|
|
|
131
131
|
* @param params 查询参数
|
|
132
132
|
*/
|
|
133
133
|
static refreshWithParams(params) {
|
|
134
|
-
|
|
134
|
+
NavigationManager.updateQueryParams(params, { replace: false });
|
|
135
135
|
window.location.reload();
|
|
136
136
|
}
|
|
137
137
|
/**
|
|
@@ -140,14 +140,14 @@ var NavigationManager = class {
|
|
|
140
140
|
* @returns 任务ID
|
|
141
141
|
*/
|
|
142
142
|
static extractTaskId(paramName = "taskId") {
|
|
143
|
-
return
|
|
143
|
+
return NavigationManager.getQueryParam(paramName);
|
|
144
144
|
}
|
|
145
145
|
/**
|
|
146
146
|
* 从URL中提取所有任务相关信息
|
|
147
147
|
* @returns 任务相关信息对象
|
|
148
148
|
*/
|
|
149
149
|
static extractTaskInfo() {
|
|
150
|
-
const params =
|
|
150
|
+
const params = NavigationManager.getCurrentParams();
|
|
151
151
|
return {
|
|
152
152
|
taskId: params.taskId,
|
|
153
153
|
taskType: params.type,
|
|
@@ -163,7 +163,7 @@ var NavigationManager = class {
|
|
|
163
163
|
paramsToClean.forEach((key) => {
|
|
164
164
|
params[key] = "";
|
|
165
165
|
});
|
|
166
|
-
|
|
166
|
+
NavigationManager.updateQueryParams(params, { merge: false });
|
|
167
167
|
}
|
|
168
168
|
/**
|
|
169
169
|
* 监听URL变化(用于SPA路由变化检测)
|