@baishuyun/ai-design 2.1.0-alpha.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/.storybook/preview.ts +2 -0
  2. package/CHANGELOG.md +189 -20
  3. package/package.json +8 -9
  4. package/scripts/post-build.cjs +32 -0
  5. package/src/components/agent-drawer.tsx +119 -0
  6. package/src/components/agent-helper/agent-entry-card/index.tsx +3 -8
  7. package/src/components/agent-helper/agent-helper-card/index.tsx +3 -3
  8. package/src/components/agent-helper/app-select/index.tsx +119 -84
  9. package/src/components/agent-helper/condition-input/index.tsx +18 -21
  10. package/src/components/agent-helper/condition-item/index.tsx +1 -0
  11. package/src/components/agent-helper/field-edit-preference-select/index.tsx +31 -4
  12. package/src/components/agent-helper/field-value-input/dept-select.tsx +447 -0
  13. package/src/components/agent-helper/field-value-input/index.tsx +3 -2
  14. package/src/components/agent-helper/field-value-input/picker-inputs.tsx +20 -18
  15. package/src/components/agent-helper/form-select/index.tsx +12 -25
  16. package/src/components/agent-helper/relational-operator-select/index.tsx +37 -23
  17. package/src/components/agent-helper/table/index.tsx +6 -2
  18. package/src/components/agent-helper/team-wide-form-select/data-adapter.ts +109 -0
  19. package/src/components/agent-helper/team-wide-form-select/index.tsx +289 -0
  20. package/src/components/agent-helper/team-wide-form-select/tree-panel.tsx +180 -0
  21. package/src/components/agent-helper/team-wide-form-select/types.ts +36 -0
  22. package/src/components/agent-helper/team-wide-form-select/use-form-tree.ts +108 -0
  23. package/src/components/agent-helper/trigger-select/index.tsx +1 -1
  24. package/src/components/agent-select.tsx +115 -35
  25. package/src/components/bot-avatar-name.tsx +1 -1
  26. package/src/components/bs-entry-select/build-tree.ts +0 -6
  27. package/src/components/bs-entry-select/entry-item.tsx +7 -11
  28. package/src/components/bs-entry-select/other-app-section.tsx +2 -4
  29. package/src/components/bs-entry-select/scroll-slider.tsx +6 -11
  30. package/src/components/bs-icons.tsx +752 -206
  31. package/src/components/card.tsx +55 -10
  32. package/src/components/circle-checker.tsx +18 -3
  33. package/src/components/collapsible-txt-msg.tsx +18 -13
  34. package/src/components/fake-bot-msg.tsx +18 -7
  35. package/src/components/field-checker-list-msg.tsx +4 -3
  36. package/src/components/fields-design-info-table.tsx +9 -26
  37. package/src/components/fields-portal.tsx +2 -2
  38. package/src/components/fields-previewer.tsx +1 -0
  39. package/src/components/font-icon.tsx +20 -9
  40. package/src/components/form-info-editor.tsx +21 -6
  41. package/src/components/legacy-slot.tsx +11 -16
  42. package/src/components/memoized-markdown.tsx +32 -19
  43. package/src/components/message-content.tsx +7 -3
  44. package/src/components/output-config-editor.tsx +39 -25
  45. package/src/components/primary-confirm-btn.tsx +6 -1
  46. package/src/components/scroll-to-bottom-btn.tsx +3 -2
  47. package/src/components/shadow-content.tsx +19 -0
  48. package/src/components/shadow-portal.tsx +23 -0
  49. package/src/components/ui/dialog.tsx +4 -1
  50. package/src/components/ui/drawer.tsx +3 -1
  51. package/src/components/ui/enhanced-drawer.tsx +134 -0
  52. package/src/components/ui/popover.tsx +3 -2
  53. package/src/components/ui/select.tsx +3 -2
  54. package/src/components/ui/tooltip.tsx +3 -2
  55. package/src/components/user-txt-msg-bubble.tsx +41 -19
  56. package/src/components/warning-msg.tsx +29 -12
  57. package/src/const/shadow.ts +17 -0
  58. package/src/const/ui.ts +2 -2
  59. package/src/hooks/use-column-appear.ts +1 -1
  60. package/src/hooks/use-portal-container.ts +6 -3
  61. package/src/hooks/use-shadow-boundary.ts +67 -0
  62. package/src/hooks/use-shadow.ts +24 -7
  63. package/src/index.ts +21 -0
  64. package/src/stories/AppSelect.stories.tsx +44 -0
  65. package/src/stories/FieldValueInput.stories.tsx +6 -3
  66. package/src/stories/FormSelect.stories.tsx +40 -0
  67. package/src/stories/IconfontPicker.stories.tsx +106 -0
  68. package/src/stories/RelationalOperatorSelect.stories.tsx +27 -0
  69. package/src/stories/TeamWideFormSelect.stories.tsx +362 -0
  70. package/src/stories/UserTextMsgBubble.stories.ts +28 -0
  71. package/src/style.css +28 -1
  72. package/style.css +172 -130
@@ -1,47 +1,69 @@
1
- import { TextIcon } from "./bs-icons";
2
- import { CollapsibleTxtMsg } from "./collapsible-txt-msg";
1
+ import { ReactNode } from 'react';
2
+ import { TextIcon } from './bs-icons';
3
+ import { CollapsibleTxtMsg } from './collapsible-txt-msg';
4
+ import { MemoizedMarkdown } from './memoized-markdown';
3
5
 
4
6
  export interface UserTextMsgBubbleProps {
5
7
  text?: string;
6
8
  children?: string;
9
+ /** 移动端消息内容文字 16px(PC 端 14px) */
10
+ isMobile?: boolean;
11
+ /** 超过 200 字时折叠为前 10 个字。默认开启 */
12
+ collapsible?: boolean;
13
+ /** 折叠条图标。不传为 TextIcon,null 不显示图标 */
14
+ icon?: ReactNode | null;
7
15
  }
8
16
 
9
- export const UserTextMsgBubble = ({ text, children }: UserTextMsgBubbleProps) => {
17
+ export const UserTextMsgBubble = ({
18
+ text,
19
+ children,
20
+ isMobile,
21
+ collapsible = true,
22
+ icon,
23
+ }: UserTextMsgBubbleProps) => {
10
24
  const content = (text || children) as string;
25
+ const sizeCls = isMobile ? 'text-[16px]' : 'text-[14px]';
26
+ const paddingCls = isMobile ? "px-[10px] py-[9px]" : "px-2.5 py-[8px]";
11
27
 
12
28
  if (typeof content !== 'string') {
13
29
  return (
14
- <div
15
- className="px-2.5 py-[7px] text-[#0265FF] text-[14px] w-fit"
16
- style={{
17
- borderRadius: `10px 0 10px 10px`,
18
- wordWrap: 'break-word',
19
- background: `linear-gradient(180deg, #DBE9FF 0%, #E9FFFD 100%)`,
20
- }}
21
- >
22
- {content}
23
- </div>
24
- )
30
+ <div
31
+ className={`${paddingCls} text-[#0265FF] ${sizeCls} w-fit`}
32
+ style={{
33
+ borderRadius: `10px 0 10px 10px`,
34
+ wordWrap: 'break-word',
35
+ background: `linear-gradient(180deg, #DBE9FF 0%, #E9FFFD 100%)`,
36
+ }}
37
+ >
38
+ {content}
39
+ </div>
40
+ );
25
41
  }
26
42
 
27
43
  const isTooLong = content.length > 200;
28
44
  const summary = `${content?.slice(0, 10)}...`;
45
+ const body = <MemoizedMarkdown breaks content={content} id="user-txt-msg" />;
29
46
  return (
30
47
  <div
31
- className="px-2.5 py-[7px] text-[#0265FF] text-[14px] w-fit"
48
+ className={`${paddingCls} text-[#0265FF] ${sizeCls} w-fit`}
32
49
  style={{
33
50
  borderRadius: `10px 0 10px 10px`,
34
51
  wordWrap: 'break-word',
35
52
  background: `linear-gradient(180deg, #DBE9FF 0%, #E9FFFD 100%)`,
36
53
  }}
37
54
  >
38
- {isTooLong ? (
55
+ {isTooLong && collapsible ? (
39
56
  <CollapsibleTxtMsg
40
- icon={<TextIcon />}
57
+ icon={icon === undefined ? <TextIcon /> : icon}
41
58
  ghost
59
+ isMobile={isMobile}
42
60
  title={summary}
43
- >{content}</CollapsibleTxtMsg>
44
- ) : content}
61
+ >
62
+ {body}
63
+ </CollapsibleTxtMsg>
64
+ ) : (
65
+ body
66
+ )}
45
67
  </div>
46
68
  );
47
69
  };
@@ -1,5 +1,5 @@
1
1
  import { cn } from '../lib/utils';
2
- import { WarningImgUrl } from '../const/ui';
2
+ import { WarningBannerImgUrl, WarningImgUrl } from '../const/ui';
3
3
 
4
4
  export interface WarningMessageProps {
5
5
  message?: string;
@@ -11,17 +11,34 @@ export const WarningMessage = ({
11
11
  className,
12
12
  }: WarningMessageProps) => {
13
13
  return (
14
- <div className={cn('flex flex-col items-center gap-[10px]', className)}>
15
- <div
16
- className="bg-no-repeat bg-center"
17
- style={{
18
- backgroundImage: WarningImgUrl,
19
- backgroundSize: '100% 100%',
20
- width: 120,
21
- height: 77,
22
- }}
23
- />
24
- <p className="text-[12px] text-[#999] leading-normal">{message}</p>
14
+ <div className={cn('flex flex-col items-center gap-[10px] mt-[40px]', className)}>
15
+ <div className="relative" style={{ width: 120, height: 58 }}>
16
+ <div
17
+ className="bg-no-repeat"
18
+ style={{
19
+ backgroundImage: WarningBannerImgUrl,
20
+ backgroundSize: '100% 100%',
21
+ position: 'absolute',
22
+ left: 0,
23
+ top: 26,
24
+ width: 120,
25
+ height: 51,
26
+ }}
27
+ />
28
+ <div
29
+ className="bg-no-repeat"
30
+ style={{
31
+ backgroundImage: WarningImgUrl,
32
+ backgroundSize: '100% 100%',
33
+ position: 'absolute',
34
+ left: 35,
35
+ top: 0,
36
+ width: 50,
37
+ height: 41,
38
+ }}
39
+ />
40
+ </div>
41
+ <p className="text-[#999] leading-normal">{message}</p>
25
42
  </div>
26
43
  );
27
44
  };
@@ -0,0 +1,17 @@
1
+ export const scopeSdkStyles = (css: string) => css.replace(/:host(?![-(])/g, ':is(:host, :host > div, [data-bs-shadow-content], [data-bs-portal-container])');
2
+
3
+ export const SDK_SHADOW_BASELINE = `
4
+ :host, :host > div {
5
+ font: 14px/1.5 ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
6
+ color: #121111;
7
+ letter-spacing: normal;
8
+ text-align: start;
9
+ text-transform: none;
10
+ color-scheme: light;
11
+ }
12
+ /* 移动端:shadow 基线字号提升到 16px(宿主在 shadow 宿主上标记 data-bs-layout="mobile") */
13
+ :host([data-bs-layout="mobile"]),
14
+ :host([data-bs-layout="mobile"]) > div {
15
+ font-size: 16px;
16
+ }
17
+ `;
package/src/const/ui.ts CHANGED
@@ -5,8 +5,8 @@ export const BotImgUrl = `
5
5
  url(data:image/png;base64,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)
6
6
  `;
7
7
 
8
- export const WarningImgUrl = `
9
- url(data:image/png;base64,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)`;
8
+ export const WarningBannerImgUrl = `url(data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI1MC45OTYxIiB2aWV3Qm94PSIwIDAgMTIwIDUwLjk5NjEiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGlkPSJTdWJ0cmFjdCIgZD0iTTc2LjU1NzYgMEMxMDEuNjQyIDMuMTE0MjQgMTIwIDEzLjEyNTUgMTIwIDI0Ljk5NjFDMTIwIDM5LjM1NTUgOTMuMTM3MSA1MC45OTYxIDYwIDUwLjk5NjFDMjYuODYyOSA1MC45OTYxIDAgMzkuMzU1NSAwIDI0Ljk5NjFDMCAxMy40ODg2IDE3LjI1MjQgMy43MjgxNSA0MS4xNjAyIDAuMzA0Njg4TDM2LjYzMTggOC41MzEyNUMzNS44OTggOS44NjQwNSAzNi44NjI0IDExLjQ5NTggMzguMzgzOCAxMS40OTYxSDcxLjAwMkM3Ni4yNDY2IDExLjQ5NjEgNzkuNjI4NyA1Ljk0MTM5IDc3LjIyMDcgMS4yODIyM0w3Ni41NTc2IDBaIiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNDEyMDJfMTIxNTUpIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfNDEyMDJfMTIxNTUiIHgxPSI2MCIgeTE9Ii0xLjIyNTkxIiB4Mj0iNjAiIHkyPSIzMC45ODk2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNCMkQxRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==)`;
9
+ export const WarningImgUrl = `url(data:image/png;base64,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)`;
10
10
 
11
11
  export const ChatHeaderBgImgUrl = `url(data:image/png;base64,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)`;
12
12
 
@@ -18,7 +18,7 @@ interface UseColumnAppearResult {
18
18
  /** 列是否正在执行 appear (hidden→visible) 动画 */
19
19
  appearing: boolean;
20
20
  /** 附加到列最外层 DOM 元素的 ref,用于监听 transitionend */
21
- colRef: React.RefObject<HTMLDivElement | null>;
21
+ colRef: React.RefObject<HTMLDivElement>;
22
22
  /** 当前适用的 transition CSS 属性,直接展开到 style={} */
23
23
  getTransitionStyle: React.CSSProperties;
24
24
  }
@@ -2,7 +2,9 @@ import { useCallback, useState } from 'react';
2
2
 
3
3
  export const usePortalContainer = (portalName: string) => {
4
4
  const [portalContainer, setPortalContainer] = useState<HTMLElement | null>(null);
5
+ const [portalReady, setPortalReady] = useState(false);
5
6
  const setTriggerRef = useCallback((node: HTMLElement | null) => {
7
+ setPortalReady(!!node);
6
8
  if (!node) {
7
9
  setPortalContainer(null);
8
10
  return;
@@ -14,14 +16,15 @@ export const usePortalContainer = (portalName: string) => {
14
16
  setPortalContainer(existing);
15
17
  return;
16
18
  }
17
- const container = document.createElement('div');
19
+ const container = node.ownerDocument.createElement('div');
18
20
  container.setAttribute(portalName, 'true');
21
+ container.setAttribute('data-bs-portal-container', '');
19
22
  rootNode.appendChild(container);
20
23
  setPortalContainer(container);
21
24
  } else {
22
25
  setPortalContainer(null);
23
26
  }
24
- }, []);
27
+ }, [portalName]);
25
28
 
26
- return { portalContainer, setTriggerRef };
29
+ return { portalContainer, setTriggerRef, portalReady };
27
30
  };
@@ -0,0 +1,67 @@
1
+ import { useEffect, useLayoutEffect, useState, type RefObject } from 'react';
2
+ import { syncHostStylesIntoShadow, injectHostFontFacesIntoShadow } from '@baishuyun/ai-feat-utils';
3
+ import { SDK_SHADOW_BASELINE, scopeSdkStyles } from '../const/shadow';
4
+
5
+ export type ShadowStyleMode = 'sdk' | 'host';
6
+ export type ShadowStyle = string | (() => string);
7
+
8
+ export const useShadowBoundary = (mode: ShadowStyleMode, styles?: ShadowStyle) => {
9
+ const [host, setHostRef] = useState<HTMLDivElement | null>(null);
10
+ const [boundary, setBoundary] = useState<{
11
+ root: ShadowRoot;
12
+ container: HTMLDivElement;
13
+ style: HTMLStyleElement;
14
+ } | null>(null);
15
+
16
+ useLayoutEffect(() => {
17
+ if (!host) return;
18
+ const root = host.shadowRoot || host.attachShadow({ mode: 'open' });
19
+ const style = host.ownerDocument.createElement('style');
20
+ const container = host.ownerDocument.createElement('div');
21
+ container.setAttribute('data-bs-shadow-content', '');
22
+ container.style.display = 'contents';
23
+ root.append(style, container);
24
+ setBoundary({ root, container, style });
25
+ return () => {
26
+ style.remove();
27
+ container.remove();
28
+ setBoundary(null);
29
+ };
30
+ }, [host]);
31
+
32
+ useLayoutEffect(() => {
33
+ if (!boundary || !host) return;
34
+ host.setAttribute('data-bs-style-mode', mode);
35
+ if (mode === 'sdk') {
36
+ boundary.container.className = '';
37
+ injectHostFontFacesIntoShadow(boundary.root, host);
38
+ }
39
+ return mode === 'host' ? syncHostStylesIntoShadow(boundary.root, host) : undefined;
40
+ }, [boundary, host, mode]);
41
+
42
+ useLayoutEffect(() => {
43
+ if (!boundary) return;
44
+ boundary.style.toggleAttribute('data-bs-sdk-styles', mode === 'sdk');
45
+ boundary.style.toggleAttribute('data-bs-custom-styles', mode === 'host');
46
+ const css = typeof styles === 'function' ? styles() : styles || '';
47
+ boundary.style.textContent = mode === 'sdk' ? SDK_SHADOW_BASELINE + scopeSdkStyles(css) : css;
48
+ }, [boundary, mode, styles]);
49
+
50
+ return { setHostRef, container: boundary?.container ?? null };
51
+ };
52
+
53
+ export const useInjectedShadowStyle = (host: RefObject<HTMLElement | null>, css: string | undefined, attribute: string) => {
54
+ useEffect(() => {
55
+ const root = host.current?.shadowRoot;
56
+ if (!root) return;
57
+ let style = root.querySelector<HTMLStyleElement>(`style[${attribute}]`);
58
+ if (!css) { style?.remove(); return; }
59
+ if (!style) {
60
+ style = root.ownerDocument.createElement('style');
61
+ style.setAttribute(attribute, '');
62
+ root.appendChild(style);
63
+ }
64
+ style.textContent = css;
65
+ return () => style?.remove();
66
+ }, [host, css, attribute]);
67
+ };
@@ -1,4 +1,6 @@
1
1
  import { useState, useEffect, useRef } from 'react';
2
+ import { SDK_SHADOW_BASELINE, scopeSdkStyles } from '../const/shadow';
3
+ import sdkStyles from '../style.css?inline';
2
4
 
3
5
  interface UseShadowOptions {
4
6
  /** Shadow DOM挂载的根元素(默认挂到body) */
@@ -15,6 +17,7 @@ interface UseShadowOptions {
15
17
  extraHtml?: string;
16
18
 
17
19
  id: string;
20
+ enabled?: boolean;
18
21
  }
19
22
 
20
23
  /**
@@ -24,6 +27,7 @@ interface UseShadowOptions {
24
27
  */
25
28
  export const useShadow = ({
26
29
  id,
30
+ enabled = true,
27
31
  style = '',
28
32
  rootEl,
29
33
  containerClasses = [],
@@ -57,10 +61,13 @@ export const useShadow = ({
57
61
  wrapperRef.current = null;
58
62
  }
59
63
 
64
+ if (!enabled) return;
65
+
60
66
  try {
61
67
  // 1. 创建外层包裹元素(挂载Shadow Root的载体)
62
68
  const wrapperEl = document.createElement('div');
63
- wrapperEl.classList.add(...wrapperClasses, 'wrapper');
69
+ wrapperEl.classList.add(...wrapperClasses, 'bs-sdk-shadow-wrapper');
70
+ wrapperEl.setAttribute('data-bs-style-mode', 'sdk');
64
71
  // wrapperEl.style.height = '100%';
65
72
  wrapperRef.current = wrapperEl;
66
73
 
@@ -81,15 +88,15 @@ export const useShadow = ({
81
88
  }
82
89
 
83
90
  // 3. 注入样式到Shadow DOM
84
- if (style) {
85
- const styleEl = document.createElement('style');
86
- styleEl.textContent = style;
87
- shadowRoot.appendChild(styleEl);
88
- }
91
+ const styleEl = document.createElement('style');
92
+ styleEl.setAttribute('data-bs-sdk-styles', '');
93
+ styleEl.textContent = SDK_SHADOW_BASELINE + scopeSdkStyles(sdkStyles + style);
94
+ shadowRoot.appendChild(styleEl);
89
95
 
90
96
  // 4. 创建Shadow内部的容器(最终挂载React Portal的元素)
91
97
  const containerEl = document.createElement('div');
92
98
  containerEl.classList.add(...containerClasses, 'shadow-container');
99
+ containerEl.setAttribute('data-bs-shadow-content', '');
93
100
  shadowRoot.appendChild(containerEl);
94
101
 
95
102
  // 5. 将外层元素挂载到指定根节点
@@ -109,7 +116,17 @@ export const useShadow = ({
109
116
  // wrapperRef.current = null;
110
117
  // }
111
118
  // };
112
- }, [rootEl]); // Recreate when rootEl changes
119
+ return () => {
120
+ wrapperRef.current?.remove();
121
+ wrapperRef.current = null;
122
+ setShadowContainer(null);
123
+ };
124
+ }, [rootEl, enabled]); // Recreate when rootEl changes
125
+
126
+ useEffect(() => {
127
+ const styleEl = wrapperRef.current?.shadowRoot?.querySelector('style[data-bs-sdk-styles]');
128
+ if (styleEl) styleEl.textContent = SDK_SHADOW_BASELINE + scopeSdkStyles(sdkStyles + style);
129
+ }, [style, shadowContainer]);
113
130
 
114
131
  if (shadowContainer) {
115
132
  shadowContainer.id = id;
package/src/index.ts CHANGED
@@ -3,12 +3,15 @@ export { cn, copyTextToClipboard, toHumanReadable, isSubformFieldEqual } from '.
3
3
 
4
4
  // Hooks
5
5
  export { useShadow } from './hooks/use-shadow';
6
+ export { ShadowContent } from './components/shadow-content';
7
+ export type { ShadowContentProps } from './components/shadow-content';
6
8
 
7
9
  // Constants
8
10
  export {
9
11
  transCls,
10
12
  BotImgUrl,
11
13
  WarningImgUrl,
14
+ WarningBannerImgUrl,
12
15
  ChatHeaderBgImgUrl,
13
16
  FORM_ICON_OPTIONS,
14
17
  FieldTypeNameMap,
@@ -26,6 +29,7 @@ export { EmptyAgentIcon } from './components/icons/empty-agent-icon';
26
29
  export * from './components/ui/button';
27
30
  export * from './components/ui/dialog';
28
31
  export * from './components/ui/drawer';
32
+ export * from './components/ui/enhanced-drawer';
29
33
  export * from './components/ui/popover';
30
34
  export * from './components/ui/tooltip';
31
35
  export * from './components/ui/spinner';
@@ -41,6 +45,8 @@ export { AbsFullscreenGradientBg } from './components/abs-fullscreen-gradient-bg
41
45
  export { AgentSelect } from './components/agent-select';
42
46
  export type { AgentSelectAgent, AgentSelectProps } from './components/agent-select';
43
47
  export { AgentScrollSelector } from './components/agent-scroll-selector';
48
+ export { AgentDrawer } from './components/agent-drawer';
49
+ export type { AgentDrawerProps } from './components/agent-drawer';
44
50
  export type { AgentScrollSelectorProps } from './components/agent-scroll-selector';
45
51
  export { AttachmentPartGroup } from './components/attachment-part-group';
46
52
  export { AttachmentPart } from './components/attachment-part';
@@ -87,6 +93,21 @@ export type {
87
93
  TriggerCardConfig,
88
94
  } from './components/agent-helper/trigger-select';
89
95
  export { FormSelect } from './components/agent-helper/form-select';
96
+ export {
97
+ TeamWideFormSelect,
98
+ TeamWideFormDrawer,
99
+ } from './components/agent-helper/team-wide-form-select';
100
+ export type {
101
+ TeamWideFormSelectProps,
102
+ TeamWideFormDrawerProps,
103
+ } from './components/agent-helper/team-wide-form-select';
104
+ export type {
105
+ TeamWideFormTreeNode,
106
+ TeamWideFormTreeSection,
107
+ TeamWideFormSelectChangeResult,
108
+ } from './components/agent-helper/team-wide-form-select/types';
109
+ export { appsAndFormsToTree } from './components/agent-helper/team-wide-form-select/data-adapter';
110
+
90
111
  export {
91
112
  AppSelect,
92
113
  groupsToAppTreeNodes,
@@ -1,5 +1,6 @@
1
1
  import { useState } from 'react';
2
2
  import type { Meta, StoryObj } from '@storybook/react-vite';
3
+ import { expect, userEvent, waitFor, within } from 'storybook/test';
3
4
  import { AppSelect, groupsToAppTreeNodes } from '../components/agent-helper/app-select';
4
5
  import type { AppTreeNode } from '../components/agent-helper/app-select';
5
6
  import type { IAppGroup } from '@baishuyun/types';
@@ -125,6 +126,49 @@ type Story = StoryObj<typeof meta>;
125
126
 
126
127
  export const Default: Story = {};
127
128
 
129
+ export const ConstrainedHeight: Story = {
130
+ args: { allowEmpty: true, showAll: true },
131
+ play: async ({ canvasElement }) => {
132
+ await userEvent.click(within(canvasElement).getByRole('button'));
133
+ const popover = await within(canvasElement.ownerDocument.body).findByRole('dialog');
134
+ await userEvent.clear(within(popover).getByRole('textbox'));
135
+ const content = popover.firstElementChild as HTMLElement;
136
+ const tree = content.lastElementChild as HTMLElement;
137
+ await waitFor(() => {
138
+ expect(popover.getBoundingClientRect().height).toBeLessThanOrEqual(parseFloat(getComputedStyle(popover).maxHeight));
139
+ expect(content.getBoundingClientRect().bottom).toBeLessThanOrEqual(popover.getBoundingClientRect().bottom);
140
+ expect(popover.scrollHeight).toBeLessThanOrEqual(popover.clientHeight);
141
+ expect(tree.scrollHeight).toBeGreaterThan(tree.clientHeight);
142
+ expect(content.firstElementChild!.getBoundingClientRect().height).toBe(30);
143
+ expect(within(popover).getByRole('button', { name: '无' }).getBoundingClientRect().height).toBe(34);
144
+ expect(within(popover).getByRole('button', { name: '全部应用' }).getBoundingClientRect().height).toBe(34);
145
+ });
146
+ tree.scrollTop = tree.scrollHeight;
147
+ expect(tree.scrollTop).toBeGreaterThan(0);
148
+ await userEvent.type(within(popover).getByRole('textbox'), 'API接口管理');
149
+ await userEvent.click(within(popover).getByRole('button', { name: 'API接口管理' }));
150
+ expect(within(canvasElement).getByRole('button')).toHaveTextContent('API接口管理');
151
+ },
152
+ };
153
+
154
+ export const EmbeddedConstrainedHeight: Story = {
155
+ args: { popoverContentOnly: true, disableMaxHeight: true, showAll: true, contentCls: 'h-full' },
156
+ render: (args) => <div style={{ height: 200 }}><AppSelect {...args} /></div>,
157
+ play: async ({ canvasElement }) => {
158
+ const content = within(canvasElement).getByRole('textbox').parentElement!.parentElement!;
159
+ const tree = content.lastElementChild as HTMLElement;
160
+ await waitFor(() => {
161
+ expect(content.getBoundingClientRect().height).toBe(200);
162
+ expect(tree.getBoundingClientRect().bottom).toBeLessThanOrEqual(content.getBoundingClientRect().bottom);
163
+ expect(tree.scrollHeight).toBeGreaterThan(tree.clientHeight);
164
+ expect(within(content).getByRole('button', { name: '全部应用' }).getBoundingClientRect().height).toBe(34);
165
+ });
166
+ expect(content.firstElementChild!.getBoundingClientRect().height).toBe(30);
167
+ tree.scrollTop = tree.scrollHeight;
168
+ expect(tree.scrollTop).toBeGreaterThan(0);
169
+ },
170
+ };
171
+
128
172
  export const SingleSelected: Story = {
129
173
  args: { defaultValue: 'app2' },
130
174
  };
@@ -21,9 +21,12 @@ const mockService: IFieldValueService = {
21
21
  searchDepts: async (keyword) => {
22
22
  await new Promise((r) => setTimeout(r, 500));
23
23
  const depts = [
24
- { id: 'dept1', name: '技术部' },
25
- { id: 'dept2', name: '产品部' },
26
- { id: 'dept3', name: '设计部' },
24
+ { id: 'dept-root', name: '百数科技' },
25
+ { id: 'dept1', name: '技术部', parentId: 'dept-root' },
26
+ { id: 'dept1-1', name: '前端组', parentId: 'dept1' },
27
+ { id: 'dept1-2', name: '后端组', parentId: 'dept1' },
28
+ { id: 'dept2', name: '产品部', parentId: 'dept-root' },
29
+ { id: 'dept3', name: '设计部', parentId: 'dept-root' },
27
30
  ];
28
31
  return keyword
29
32
  ? depts.filter((d) => d.name.includes(keyword))