@antscorp/antsomi-ui 2.0.103 → 2.0.105

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 (168) hide show
  1. package/es/__mocks__/sql-query.json +56 -0
  2. package/es/assets/css/main.scss +2 -2
  3. package/es/components/atoms/App/App.d.ts +7 -0
  4. package/es/components/atoms/App/App.js +5 -0
  5. package/es/components/atoms/App/index.d.ts +1 -0
  6. package/es/components/atoms/App/index.js +1 -0
  7. package/es/components/atoms/Input/Input.d.ts +11 -17
  8. package/es/components/atoms/Input/Input.js +11 -12
  9. package/es/components/atoms/List/List.d.ts +1 -0
  10. package/es/components/atoms/List/List.js +1 -0
  11. package/es/components/atoms/List/index.d.ts +1 -0
  12. package/es/components/atoms/List/index.js +1 -0
  13. package/es/components/atoms/Scrollbars/Scrollbars.d.ts +3 -4
  14. package/es/components/atoms/Scrollbars/Scrollbars.js +2 -1
  15. package/es/components/atoms/SlideBar/SlideBar.js +1 -1
  16. package/es/components/atoms/Tag/Tag.js +1 -1
  17. package/es/components/atoms/index.d.ts +3 -0
  18. package/es/components/atoms/index.js +2 -0
  19. package/es/components/icons/FeedbackOutlinedIcon.d.ts +3 -0
  20. package/es/components/icons/FeedbackOutlinedIcon.js +7 -0
  21. package/es/components/icons/LazyIcon/LazyIcon.d.ts +5 -0
  22. package/es/components/icons/LazyIcon/LazyIcon.js +5 -0
  23. package/es/components/icons/NavigateBeforeIcon.d.ts +3 -0
  24. package/es/components/icons/NavigateBeforeIcon.js +7 -0
  25. package/es/components/icons/NavigateNextIcon.d.ts +3 -0
  26. package/es/components/icons/NavigateNextIcon.js +7 -0
  27. package/es/components/icons/PenSparkIcon.d.ts +3 -0
  28. package/es/components/icons/PenSparkIcon.js +7 -0
  29. package/es/components/icons/StatusSuccessIcon.d.ts +3 -0
  30. package/es/components/icons/StatusSuccessIcon.js +7 -0
  31. package/es/components/icons/SummarizeIconIcon.d.ts +3 -0
  32. package/es/components/icons/SummarizeIconIcon.js +7 -0
  33. package/es/components/icons/index.d.ts +5 -0
  34. package/es/components/icons/index.js +5 -0
  35. package/es/components/index.scss +1 -0
  36. package/es/components/molecules/AddDynamicContent/AddDynamicContent.d.ts +1 -2
  37. package/es/components/molecules/CalendarSelection/constants.d.ts +1 -1
  38. package/es/components/molecules/CalendarSelection/constants.js +1 -1
  39. package/es/components/molecules/CaptureScreen/CaptureScreen.d.ts +8 -2
  40. package/es/components/molecules/CaptureScreen/CaptureScreen.js +2 -2
  41. package/es/components/molecules/DrawerDetail/DrawerDetail.js +19 -7
  42. package/es/components/molecules/DrawerDetail/types.d.ts +5 -0
  43. package/es/components/molecules/EditingListV2/components/Loadable.d.ts +1 -1
  44. package/es/components/molecules/EditorScript/EditorScript.d.ts +1 -2
  45. package/es/components/molecules/EditorScript/EditorScript.js +5 -1
  46. package/es/components/molecules/FontSizeInput/index.scss +15 -0
  47. package/es/components/molecules/Select/styled.js +1 -1
  48. package/es/components/molecules/SelectAccount/type.d.ts +1 -1
  49. package/es/components/molecules/TagifyInput/utils.style.js +1 -0
  50. package/es/components/molecules/TemplateSaveAs/hooks/useTemplateSave.d.ts +1 -1
  51. package/es/components/organism/AccountProfile/components/AccountSetting/AccountSetting.js +2 -1
  52. package/es/components/organism/AccountProfile/components/AccountSetting/components/LanguageSelector/styles.d.ts +1 -1
  53. package/es/components/organism/AccountProfile/components/AccountSetting/components/LanguageSelector/styles.js +1 -1
  54. package/es/components/organism/ActivityTimeline/__mocks__/event_tracking.json +1290 -0
  55. package/es/components/organism/ActivityTimeline/__mocks__/timeline.json +3059 -0
  56. package/es/components/organism/DataTable/hooks/useDataTableListing/useDataTableListing.js +5 -4
  57. package/es/components/organism/Login/components/LoginWithEmail/styled.js +1 -1
  58. package/es/components/organism/Login/components/SetupGGAuthenticator/styled.js +1 -1
  59. package/es/components/organism/Login/components/SignIn/styled.js +1 -1
  60. package/es/components/organism/Login/components/WidgetLayout/styled.js +1 -1
  61. package/es/components/organism/Login/styled.d.ts +3 -3
  62. package/es/components/organism/Login/styled.js +11 -11
  63. package/es/components/organism/ModifyColumnModal/styled.d.ts +2 -2
  64. package/es/components/organism/PreviewTemplateModal/components/ThumbnailSlider/styled.d.ts +1 -2
  65. package/es/components/organism/PreviewTemplateModal/components/ThumbnailSlider/styled.js +3 -1
  66. package/es/components/organism/SQLGeneration/SQLGeneration.d.ts +3 -0
  67. package/es/components/organism/SQLGeneration/SQLGeneration.js +26 -0
  68. package/es/components/organism/SQLGeneration/components/CheckboxShowDiff.d.ts +2 -0
  69. package/es/components/organism/SQLGeneration/components/CheckboxShowDiff.js +16 -0
  70. package/es/components/organism/SQLGeneration/components/EditTableSourcesDrawer.d.ts +2 -0
  71. package/es/components/organism/SQLGeneration/components/EditTableSourcesDrawer.js +56 -0
  72. package/es/components/organism/SQLGeneration/components/ErrorDisplay.d.ts +21 -0
  73. package/es/components/organism/SQLGeneration/components/ErrorDisplay.js +69 -0
  74. package/es/components/organism/SQLGeneration/components/SQLGenerationActions.d.ts +4 -0
  75. package/es/components/organism/SQLGeneration/components/SQLGenerationActions.js +23 -0
  76. package/es/components/organism/SQLGeneration/components/SQLGenerationCodeBlock.d.ts +2 -0
  77. package/es/components/organism/SQLGeneration/components/SQLGenerationCodeBlock.js +22 -0
  78. package/es/components/organism/SQLGeneration/components/SQLGenerationEditPrompt.d.ts +2 -0
  79. package/es/components/organism/SQLGeneration/components/SQLGenerationEditPrompt.js +66 -0
  80. package/es/components/organism/SQLGeneration/components/SQLGenerationHeader.d.ts +2 -0
  81. package/es/components/organism/SQLGeneration/components/SQLGenerationHeader.js +10 -0
  82. package/es/components/organism/SQLGeneration/components/SQLGenerationModal.d.ts +2 -0
  83. package/es/components/organism/SQLGeneration/components/SQLGenerationModal.js +35 -0
  84. package/es/components/organism/SQLGeneration/components/SQLGenerationPagination.d.ts +4 -0
  85. package/es/components/organism/SQLGeneration/components/SQLGenerationPagination.js +13 -0
  86. package/es/components/organism/SQLGeneration/components/SQLGenerationPrompt.d.ts +2 -0
  87. package/es/components/organism/SQLGeneration/components/SQLGenerationPrompt.js +31 -0
  88. package/es/components/organism/SQLGeneration/components/SQLGenerationPromptDisplay.d.ts +2 -0
  89. package/es/components/organism/SQLGeneration/components/SQLGenerationPromptDisplay.js +15 -0
  90. package/es/components/organism/SQLGeneration/components/SQLGenerationQuerySummary.d.ts +2 -0
  91. package/es/components/organism/SQLGeneration/components/SQLGenerationQuerySummary.js +17 -0
  92. package/es/components/organism/SQLGeneration/components/SQLGenerationRefine.d.ts +1 -0
  93. package/es/components/organism/SQLGeneration/components/SQLGenerationRefine.js +55 -0
  94. package/es/components/organism/SQLGeneration/components/SQLGenerationResult.d.ts +5 -0
  95. package/es/components/organism/SQLGeneration/components/SQLGenerationResult.js +29 -0
  96. package/es/components/organism/SQLGeneration/components/index.d.ts +9 -0
  97. package/es/components/organism/SQLGeneration/components/index.js +9 -0
  98. package/es/components/organism/SQLGeneration/components/styled.d.ts +52 -0
  99. package/es/components/organism/SQLGeneration/components/styled.js +382 -0
  100. package/es/components/organism/SQLGeneration/constants.d.ts +48 -0
  101. package/es/components/organism/SQLGeneration/constants.js +48 -0
  102. package/es/components/organism/SQLGeneration/hooks/index.d.ts +1 -0
  103. package/es/components/organism/SQLGeneration/hooks/index.js +1 -0
  104. package/es/components/organism/SQLGeneration/hooks/useKeyboardNavigation.d.ts +14 -0
  105. package/es/components/organism/SQLGeneration/hooks/useKeyboardNavigation.js +123 -0
  106. package/es/components/organism/SQLGeneration/index.d.ts +10 -0
  107. package/es/components/organism/SQLGeneration/index.js +6 -0
  108. package/es/components/organism/SQLGeneration/index.scss +1 -0
  109. package/es/components/organism/SQLGeneration/integrations/AceEditor/index.d.ts +1 -0
  110. package/es/components/organism/SQLGeneration/integrations/AceEditor/index.js +1 -0
  111. package/es/components/organism/SQLGeneration/integrations/AceEditor/index.scss +4 -0
  112. package/es/components/organism/SQLGeneration/integrations/AceEditor/useAceEditor.d.ts +9 -0
  113. package/es/components/organism/SQLGeneration/integrations/AceEditor/useAceEditor.js +24 -0
  114. package/es/components/organism/SQLGeneration/integrations/AceEditor/useEnhancePlaceholder.d.ts +10 -0
  115. package/es/components/organism/SQLGeneration/integrations/AceEditor/useEnhancePlaceholder.js +172 -0
  116. package/es/components/organism/SQLGeneration/integrations/AceEditor/useInsertQuery.d.ts +8 -0
  117. package/es/components/organism/SQLGeneration/integrations/AceEditor/useInsertQuery.js +21 -0
  118. package/es/components/organism/SQLGeneration/integrations/AntsomiAI/index.d.ts +1 -0
  119. package/es/components/organism/SQLGeneration/integrations/AntsomiAI/index.js +1 -0
  120. package/es/components/organism/SQLGeneration/integrations/AntsomiAI/useAntsomiAI.d.ts +1 -0
  121. package/es/components/organism/SQLGeneration/integrations/AntsomiAI/useAntsomiAI.js +35 -0
  122. package/es/components/organism/SQLGeneration/integrations/AntsomiSqlWS/index.d.ts +1 -0
  123. package/es/components/organism/SQLGeneration/integrations/AntsomiSqlWS/index.js +1 -0
  124. package/es/components/organism/SQLGeneration/integrations/AntsomiSqlWS/useAntsomiSqlWS.d.ts +7 -0
  125. package/es/components/organism/SQLGeneration/integrations/AntsomiSqlWS/useAntsomiSqlWS.js +10 -0
  126. package/es/components/organism/SQLGeneration/selectors.d.ts +857 -0
  127. package/es/components/organism/SQLGeneration/selectors.js +61 -0
  128. package/es/components/organism/SQLGeneration/store/index.d.ts +2 -0
  129. package/es/components/organism/SQLGeneration/store/index.js +1 -0
  130. package/es/components/organism/SQLGeneration/store/provider.d.ts +7 -0
  131. package/es/components/organism/SQLGeneration/store/provider.js +40 -0
  132. package/es/components/organism/SQLGeneration/store/store.d.ts +383 -0
  133. package/es/components/organism/SQLGeneration/store/store.js +309 -0
  134. package/es/components/organism/SQLGeneration/store/types.d.ts +97 -0
  135. package/es/components/organism/SQLGeneration/store/types.js +1 -0
  136. package/es/components/organism/SQLGeneration/types.d.ts +29 -0
  137. package/es/components/organism/SQLGeneration/types.js +1 -0
  138. package/es/components/organism/index.d.ts +1 -0
  139. package/es/components/organism/index.js +1 -0
  140. package/es/components/organism/index.scss +1 -0
  141. package/es/components/template/TemplateListing/hooks/useTemplateListing.d.ts +3 -4
  142. package/es/hooks/index.d.ts +1 -0
  143. package/es/hooks/index.js +1 -0
  144. package/es/hooks/useFocusManagement.d.ts +14 -0
  145. package/es/hooks/useFocusManagement.js +124 -0
  146. package/es/locales/ja/google-sheet.json +2 -2
  147. package/es/providers/ConfigProvider/ConfigProvider.js +4 -1
  148. package/es/providers/ConfigProvider/GlobalStyle.js +153 -46
  149. package/es/queries/AI/index.d.ts +23 -0
  150. package/es/queries/AI/index.js +4 -0
  151. package/es/queries/AI/useSqlGeneration.d.ts +25 -0
  152. package/es/queries/AI/useSqlGeneration.js +13 -0
  153. package/es/queries/TemplateListing/index.d.ts +2 -2
  154. package/es/queries/index.d.ts +1 -0
  155. package/es/queries/index.js +1 -0
  156. package/es/services/AI/index.d.ts +15 -0
  157. package/es/services/AI/index.js +15 -0
  158. package/es/types/auth.d.ts +25 -0
  159. package/es/types/auth.js +1 -0
  160. package/es/types/index.d.ts +1 -0
  161. package/es/types/index.js +1 -0
  162. package/es/utils/common.d.ts +1 -0
  163. package/es/utils/common.js +16 -1
  164. package/es/utils/web.d.ts +16 -3
  165. package/es/utils/web.js +36 -3
  166. package/es/utils/zustand.d.ts +10 -0
  167. package/es/utils/zustand.js +8 -0
  168. package/package.json +16 -11
@@ -0,0 +1,56 @@
1
+ {
2
+ "queries": [
3
+ {
4
+ "name": "Tìm nhân viên có mức lương cao thứ hai của mỗi phòng ban",
5
+ "description": "Sử dụng Window Function DENSE_RANK() để xếp hạng nhân viên theo lương trong mỗi phòng ban và lấy ra những người có thứ hạng là 2.",
6
+ "query": "-- Sử dụng Window Function DENSE_RANK() để xếp hạng nhân viên theo lương trong mỗi phòng ban.\n-- DENSE_RANK() sẽ gán cùng một thứ hạng cho các nhân viên có cùng mức lương.\n-- Sau đó, chúng ta chỉ cần chọn những nhân viên có thứ hạng là 2.\nSELECT \n e.name,\n d.name AS department_name,\n e.salary\nFROM (\n SELECT\n e.name,\n e.salary,\n e.department_id,\n d.name AS department_name,\n -- Xếp hạng nhân viên theo mức lương giảm dần trong từng phòng ban.\n -- PARTITION BY chia dữ liệu thành các nhóm theo department_id.\n -- ORDER BY sắp xếp các dòng trong mỗi nhóm theo salary.\n DENSE_RANK() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) as salary_rank\n FROM \n employees e\n JOIN \n departments d ON e.department_id = d.id\n) as ranked_employees\nWHERE \n ranked_employees.salary_rank = 2;"
7
+ },
8
+ {
9
+ "name": "Tính tổng doanh số tích lũy của mỗi nhân viên theo thời gian",
10
+ "description": "Sử dụng Window Function SUM() với ORDER BY để tính tổng doanh số tích lũy (Running Total) cho từng nhân viên theo ngày bán hàng.",
11
+ "query": "-- Sử dụng Window Function SUM() với ORDER BY để tính tổng doanh số tích lũy (Running Total).\n-- Điều này cho phép chúng ta tính tổng của một cột trong một cửa sổ dữ liệu được sắp xếp.\nSELECT\n s.employee_id,\n s.sale_date,\n s.amount,\n -- Tính tổng doanh số tích lũy cho mỗi nhân viên.\n -- PARTITION BY employee_id đảm bảo tổng chỉ tính trong phạm vi của từng nhân viên.\n -- ORDER BY sale_date sắp xếp các giao dịch theo thời gian.\n -- Cửa sổ mặc định sẽ là từ đầu partition đến dòng hiện tại.\n SUM(s.amount) OVER (PARTITION BY s.employee_id ORDER BY s.sale_date) as cumulative_sales\nFROM\n sales s\nORDER BY \n s.employee_id, \n s.sale_date;"
12
+ },
13
+ {
14
+ "name": "Tìm phòng ban có doanh số cao hơn mức trung bình của tất cả các phòng ban",
15
+ "description": "Kết hợp Common Table Expression (CTE) để tính tổng doanh số của mỗi phòng ban, sau đó dùng subquery để so sánh với mức trung bình chung.",
16
+ "query": "-- Sử dụng Common Table Expression (CTE) để tính tổng doanh số của mỗi phòng ban trước.\n-- Điều này giúp cho truy vấn chính trở nên gọn gàng và dễ hiểu hơn.\nWITH DepartmentSales AS (\n -- Bước 1: Tính tổng doanh số của mỗi phòng ban.\n SELECT \n d.id AS department_id,\n d.name AS department_name,\n SUM(s.amount) as total_department_sales\n FROM \n departments d\n JOIN \n employees e ON d.id = e.department_id\n JOIN \n sales s ON e.id = s.employee_id\n GROUP BY \n d.id, d.name\n)\n-- Bước 2: Truy vấn chính. Lấy những phòng ban có tổng doanh số lớn hơn mức trung bình của tất cả các phòng ban.\nSELECT\n department_name,\n total_department_sales\nFROM \n DepartmentSales\nWHERE\n total_department_sales > (\n -- Subquery: Tính mức trung bình của tổng doanh số của tất cả các phòng ban.\n -- Chúng ta không thể sử dụng trực tiếp AVG() trên total_department_sales ở đây.\n SELECT \n AVG(total_department_sales)\n FROM \n DepartmentSales\n );"
17
+ },
18
+ {
19
+ "name": "Tìm nhân viên không có giao dịch bán hàng trong 30 ngày gần nhất",
20
+ "description": "Sử dụng LEFT JOIN từ bảng nhân viên đến bảng doanh số và dùng HAVING cùng hàm DATEDIFF() để lọc ra những nhân viên không có giao dịch gần đây.",
21
+ "query": "-- Tìm nhân viên không có giao dịch nào trong 30 ngày gần nhất.\n-- Bước 1: LEFT JOIN từ bảng employees đến bảng sales.\n-- Điều này đảm bảo tất cả nhân viên đều được hiển thị, ngay cả khi họ không có giao dịch nào.\nSELECT \n e.name,\n e.department_id,\n e.salary\nFROM \n employees e\nLEFT JOIN \n sales s ON e.id = s.employee_id\nGROUP BY \n e.id, e.name, e.department_id, e.salary\n-- Bước 2: Sử dụng HAVING để lọc các nhóm (nhân viên)\n-- có giao dịch gần nhất (MAX(s.sale_date)) đã lâu hơn 30 ngày so với ngày hiện tại (CURDATE()).\n-- COALESCE() được sử dụng để xử lý trường hợp nhân viên chưa bao giờ có giao dịch nào,\n-- khi đó MAX(s.sale_date) sẽ là NULL. COALESCE sẽ thay thế NULL bằng một ngày rất xa trong quá khứ\n-- để đảm bảo điều kiện DATEDIFF() luôn đúng.\nHAVING \n COALESCE(MAX(s.sale_date), '1900-01-01') < CURDATE() - INTERVAL 30 DAY;"
22
+ },
23
+ {
24
+ "name": "Phân loại nhân viên dựa trên mức lương so với trung bình của phòng ban",
25
+ "description": "Sử dụng Window Function AVG() OVER() để tính mức lương trung bình của từng phòng ban, sau đó dùng CASE statement để phân loại từng nhân viên.",
26
+ "query": "-- Phân loại nhân viên dựa trên mức lương của họ so với mức lương trung bình của phòng ban.\nSELECT \n e.name,\n d.name AS department_name,\n e.salary,\n -- Sử dụng CASE statement để tạo một phân loại mới.\n -- Mức lương của từng nhân viên được so sánh với mức lương trung bình của phòng ban.\n CASE\n -- AVG(e.salary) OVER (PARTITION BY e.department_id) tính mức lương trung bình của mỗi phòng ban.\n -- Đây là một Window Function, giúp chúng ta tính toán giá trị tổng hợp (AVG) mà không làm mất các dòng dữ liệu chi tiết.\n WHEN e.salary > AVG(e.salary) OVER (PARTITION BY e.department_id) THEN 'Above Average'\n WHEN e.salary < AVG(e.salary) OVER (PARTITION BY e.department_id) THEN 'Below Average'\n ELSE 'Average'\n END AS salary_category\nFROM \n employees e\nJOIN \n departments d ON e.department_id = d.id;"
27
+ }
28
+ ],
29
+ "queries_optimization": [
30
+ {
31
+ "name": "Query 1: Top 3 lương cao nhất mỗi phòng ban (Correlated Subquery)",
32
+ "description": "Đây là cách tiếp cận cổ điển nhưng kém hiệu quả nhất, sử dụng một subquery phụ thuộc vào truy vấn chính. Subquery này sẽ chạy lại cho mỗi dòng của bảng chính, gây tốn tài nguyên trên dữ liệu lớn.",
33
+ "query": "-- Sử dụng Correlated Subquery để tìm 3 nhân viên có lương cao nhất.\n-- Subquery bên trong sẽ đếm số lượng nhân viên trong cùng phòng ban\n-- có mức lương cao hơn hoặc bằng nhân viên hiện tại.\n-- Nếu số lượng đó nhỏ hơn 3, nhân viên hiện tại sẽ được chọn.\nSELECT\n\te1.name,\n\te1.salary,\n\td.name AS department_name\nFROM\n\temployees e1\nJOIN\n\tdepartments d ON e1.department_id = d.id\nWHERE\n\t3 > (SELECT\n\t\tCOUNT(DISTINCT e2.salary)\n\tFROM\n\t\temployees e2\n\tWHERE\n\t\te2.department_id = e1.department_id\n\t\tAND e2.salary > e1.salary\n\t);"
34
+ },
35
+ {
36
+ "name": "Query 2: Top 3 lương cao nhất mỗi phòng ban (Self-JOIN)",
37
+ "description": "Một cách tiếp cận cũ khác sử dụng Self-JOIN. Đây là một cải tiến nhỏ so với subquery nhưng vẫn phức tạp và khó đọc. Hiệu suất cũng không cao trên dữ liệu lớn.",
38
+ "query": "-- Sử dụng kỹ thuật Self-JOIN để so sánh mỗi nhân viên với những người khác\n-- trong cùng phòng ban có mức lương cao hơn.\n-- Sau đó, GROUP BY và COUNT() để lọc ra những nhân viên nằm trong top 3.\nSELECT\n\te1.name,\n\te1.salary,\n\td.name AS department_name\nFROM\n\temployees e1\nJOIN\n\tdepartments d ON e1.department_id = d.id\nLEFT JOIN\n\temployees e2 ON e1.department_id = e2.department_id AND e1.salary < e2.salary\nGROUP BY\n\te1.id, e1.name, e1.salary, d.name\nHAVING\n\tCOUNT(DISTINCT e2.salary) < 3\nORDER BY\n\td.name, e1.salary DESC;"
39
+ },
40
+ {
41
+ "name": "Query 3: Top 3 lương cao nhất mỗi phòng ban (Window Function: RANK())",
42
+ "description": "Đây là cách hiện đại và được khuyến nghị nhất. Sử dụng Window Function giúp truy vấn hiệu quả và dễ đọc hơn rất nhiều. RANK() sẽ xếp hạng các nhân viên và bỏ qua các số thứ tự nếu có các giá trị bằng nhau.",
43
+ "query": "-- Cách hiện đại và hiệu quả nhất dùng Window Function RANK() trong một CTE (Common Table Expression).\n-- CTE giúp truy vấn dễ đọc hơn bằng cách tạo một tập kết quả tạm thời có tên.\nWITH RankedEmployees AS (\n\tSELECT\n\t\te.name,\n\t\te.salary,\n\t\td.name AS department_name,\n\t\t-- RANK() xếp hạng nhân viên theo lương trong từng phòng ban.\n\t\t-- PARTITION BY chia dữ liệu thành các nhóm theo department_id.\n\t\t-- ORDER BY sắp xếp các dòng trong mỗi nhóm theo salary DESC.\n\t\tRANK() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) as rnk\n\tFROM\n\t\temployees e\n\tJOIN\n\t\tdepartments d ON e.department_id = d.id\n)\n-- Truy vấn chính sẽ chọn ra các nhân viên có thứ hạng <= 3 từ CTE.\nSELECT\n\tname,\n\tsalary,\n\tdepartment_name\nFROM\n\tRankedEmployees\nWHERE\n\trnk <= 3\nORDER BY\n\tdepartment_name, salary DESC;"
44
+ },
45
+ {
46
+ "name": "Query 4: Top 3 lương cao nhất mỗi phòng ban (Window Function: DENSE_RANK())",
47
+ "description": "Một biến thể của Query 3, sử dụng DENSE_RANK(). Chức năng này tương tự RANK() nhưng sẽ không bỏ qua các số thứ tự khi có các giá trị bằng nhau, phù hợp cho nhiều trường hợp phân tích hơn.",
48
+ "query": "-- Biến thể của cách trên, dùng DENSE_RANK() thay vì RANK().\n-- DENSE_RANK() sẽ không bỏ qua các số thứ tự khi có các giá trị bằng nhau.\nWITH RankedEmployees AS (\n\tSELECT\n\t\te.name,\n\t\te.salary,\n\t\td.name AS department_name,\n\t\t-- DENSE_RANK() xếp hạng nhân viên, không bỏ qua các số thứ tự.\n\t\tDENSE_RANK() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) as rnk\n\tFROM\n\t\temployees e\n\tJOIN\n\t\tdepartments d ON e.department_id = d.id\n)\n-- Truy vấn chính sẽ chọn ra các nhân viên có thứ hạng <= 3.\nSELECT\n\tname,\n\tsalary,\n\tdepartment_name\nFROM\n\tRankedEmployees\nWHERE\n\trnk <= 3\nORDER BY\n\tdepartment_name, salary DESC;"
49
+ },
50
+ {
51
+ "name": "Query 5: Top 3 lương cao nhất mỗi phòng ban (Với JSON output)",
52
+ "description": "Đây là một cách tiếp cận nâng cao hơn, kết hợp Window Function và các hàm JSON để nhóm dữ liệu thành một định dạng JSON duy nhất. Rất hữu ích cho việc tạo API hoặc xử lý dữ liệu phức tạp trên tầng ứng dụng.",
53
+ "query": "-- Kết hợp Window Function với hàm JSON để nhóm dữ liệu thành một định dạng JSON duy nhất.\n-- Rất hữu ích khi bạn muốn trả về dữ liệu có cấu trúc từ database mà không cần xử lý thêm ở tầng ứng dụng.\nWITH RankedEmployees AS (\n\tSELECT\n\t\te.name,\n\t\te.salary,\n\t\td.name AS department_name,\n\t\tROW_NUMBER() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) as rnk\n\tFROM\n\t\temployees e\n\tJOIN\n\t\tdepartments d ON e.department_id = d.id\n)\nSELECT\n\tdepartment_name,\n\t-- Sử dụng JSON_ARRAYAGG để tổng hợp các nhân viên vào một mảng JSON.\n\tJSON_ARRAYAGG(\n\t\tJSON_OBJECT('name', name, 'salary', salary)\n\t) AS top_employees\nFROM\n\tRankedEmployees\nWHERE\n\trnk <= 3\nGROUP BY\n\tdepartment_name\nORDER BY\n\tdepartment_name;"
54
+ }
55
+ ]
56
+ }
@@ -1,6 +1,6 @@
1
+ @use '../../components';
2
+
1
3
  :root {
2
4
  --primary-color: #005fb8;
3
5
  --text-base-color: #222222;
4
6
  }
5
-
6
-
@@ -0,0 +1,7 @@
1
+ import { type AppProps as AntdAppProps } from 'antd';
2
+ type AppProps = AntdAppProps;
3
+ declare const App: {
4
+ (props: AppProps): import("react/jsx-runtime").JSX.Element;
5
+ useApp: () => import("antd/es/app/context").useAppProps;
6
+ };
7
+ export { App, type AppProps };
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { App as AntdApp } from 'antd';
3
+ const App = (props) => (_jsx(AntdApp, { notification: { placement: 'bottomLeft', maxCount: 3 }, ...props }));
4
+ App.useApp = AntdApp.useApp;
5
+ export { App };
@@ -0,0 +1 @@
1
+ export * from './App';
@@ -0,0 +1 @@
1
+ export * from './App';
@@ -1,6 +1,5 @@
1
- /// <reference types="hoist-non-react-statics" />
2
1
  import React, { ReactNode } from 'react';
3
- import { InputProps as AntdInputProps, Input as AntdInput, InputRef } from 'antd';
2
+ import { InputProps as AntdInputProps, InputRef } from 'antd';
4
3
  export interface InputProps extends AntdInputProps {
5
4
  noborder?: 'true' | 'false' | boolean;
6
5
  debounce?: number;
@@ -16,20 +15,15 @@ export interface InputProps extends AntdInputProps {
16
15
  disableUndo?: boolean;
17
16
  withWrapper?: boolean;
18
17
  }
19
- export declare const Input: string & import("styled-components").StyledComponentBase<React.ForwardRefExoticComponent<AntdInputProps & React.RefAttributes<InputRef>> & {
20
- Group: React.FC<import("antd/es/input").GroupProps>;
21
- Search: React.ForwardRefExoticComponent<import("antd/es/input").SearchProps & React.RefAttributes<InputRef>>;
22
- TextArea: React.ForwardRefExoticComponent<import("antd/es/input").TextAreaProps & React.RefAttributes<import("antd/es/input/TextArea").TextAreaRef>>;
23
- Password: React.ForwardRefExoticComponent<import("antd/es/input").PasswordProps & React.RefAttributes<InputRef>>;
24
- }, any, InputProps, never> & import("hoist-non-react-statics").NonReactStatics<React.ForwardRefExoticComponent<AntdInputProps & React.RefAttributes<InputRef>> & {
25
- Group: React.FC<import("antd/es/input").GroupProps>;
26
- Search: React.ForwardRefExoticComponent<import("antd/es/input").SearchProps & React.RefAttributes<InputRef>>;
27
- TextArea: React.ForwardRefExoticComponent<import("antd/es/input").TextAreaProps & React.RefAttributes<import("antd/es/input/TextArea").TextAreaRef>>;
28
- Password: React.ForwardRefExoticComponent<import("antd/es/input").PasswordProps & React.RefAttributes<InputRef>>;
29
- }, {}> & {
30
- DefaultInput: typeof AntdInput;
31
- CustomSearch: typeof SearchInput;
18
+ export declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<InputRef>> & {
19
+ readonly DefaultInput: React.ForwardRefExoticComponent<AntdInputProps & React.RefAttributes<InputRef>> & {
20
+ Group: React.FC<import("antd/es/input").GroupProps>;
21
+ Search: React.ForwardRefExoticComponent<import("antd/es/input").SearchProps & React.RefAttributes<InputRef>>;
22
+ TextArea: React.ForwardRefExoticComponent<import("antd/es/input").TextAreaProps & React.RefAttributes<import("antd/es/input/TextArea").TextAreaRef>>;
23
+ Password: React.ForwardRefExoticComponent<import("antd/es/input").PasswordProps & React.RefAttributes<InputRef>>;
24
+ };
25
+ readonly CustomSearch: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<InputRef>>;
26
+ readonly TextArea: React.ForwardRefExoticComponent<import("antd/es/input").TextAreaProps & React.RefAttributes<import("antd/es/input/TextArea").TextAreaRef>>;
27
+ readonly Password: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<InputRef>>;
32
28
  };
33
- declare const SearchInput: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<InputRef>>;
34
29
  export declare const TextArea: React.ForwardRefExoticComponent<import("antd/es/input").TextAreaProps & React.RefAttributes<import("antd/es/input/TextArea").TextAreaRef>>;
35
- export {};
@@ -17,7 +17,7 @@ import { PreviewVisibilityEyeIcon, VisibilityOffEyeIcon } from '../../icons';
17
17
  const PATH = '@antscorp/antsomi-ui/es/components/atoms/Input/Input.tsx';
18
18
  const OriginInput = React.forwardRef((props, ref) => {
19
19
  // Props
20
- const { withWrapper, debounce, errorArchive, required, labelColor, isReverseMask, isHideErrMessage, focused, label, onAfterChange, onChange, errorMsg, ...restProps } = props;
20
+ const { debounce = 400, isHideErrMessage = false, withWrapper = true, errorArchive, required, labelColor, isReverseMask, focused, label, onAfterChange, onChange, errorMsg, ...restProps } = props;
21
21
  // State
22
22
  const [value, setValue] = useState(props.value);
23
23
  const [isFocused, setFocused] = useState(false);
@@ -74,21 +74,20 @@ const OriginInput = React.forwardRef((props, ref) => {
74
74
  setFocused(true);
75
75
  }
76
76
  restProps.onBlur && restProps.onBlur(e);
77
- }, onChange: onChangeInput, ...getPreventKeyboardAction(listDisableActions) }), (restProps.status === 'error' || errorArchive || requiredMsg) && !isHideErrMessage ? (_jsx(Text, { color: "#ff4d4f", style: { marginLeft: 8, marginTop: 5 }, children: errorMsg || errorArchive || requiredMsg })) : null] }));
77
+ }, onChange: onChangeInput, ...getPreventKeyboardAction(listDisableActions, {
78
+ onKeydown: restProps.onKeyDown,
79
+ onKeyup: restProps.onKeyUp,
80
+ }) }), (restProps.status === 'error' || errorArchive || requiredMsg) && !isHideErrMessage ? (_jsx(Text, { color: "#ff4d4f", style: { marginLeft: 8, marginTop: 5 }, children: errorMsg || errorArchive || requiredMsg })) : null] }));
78
81
  if (!withWrapper)
79
82
  return content;
80
83
  return _jsx("div", { className: "input__wrapper", children: content });
81
84
  });
82
- OriginInput.defaultProps = {
83
- debounce: 400,
84
- isHideErrMessage: false,
85
- withWrapper: true,
86
- };
87
- export const Input = OriginInput;
88
85
  const SearchInput = React.forwardRef((props, ref) => (_jsx(OriginInput, { bordered: false, autoFocus: true, suffix: _jsx(Icon, { type: "icon-ants-search-2", size: 24, color: globalToken?.bw8 }), ...props, ref: ref, className: `${props.className} antsomi-search-input` })));
89
86
  const PasswordInput = React.forwardRef((props, ref) => (_jsx(AntdInput.Password, { iconRender: visible => visible ? (_jsx(StyledIconWrapper, { type: "text", children: _jsx(PreviewVisibilityEyeIcon, {}) })) : (_jsx(StyledIconWrapper, { type: "text", children: _jsx(VisibilityOffEyeIcon, {}) })), ...props, ref: ref })));
90
- Input.CustomSearch = SearchInput;
91
- Input.TextArea = StyledInput.TextArea;
92
- Input.DefaultInput = AntdInput;
93
- Input.Password = PasswordInput;
87
+ export const Input = Object.assign(OriginInput, {
88
+ DefaultInput: AntdInput,
89
+ CustomSearch: SearchInput,
90
+ TextArea: StyledInput.TextArea,
91
+ Password: PasswordInput,
92
+ });
94
93
  export const { TextArea } = StyledInput;
@@ -0,0 +1 @@
1
+ export { List, type ListProps } from 'antd';
@@ -0,0 +1 @@
1
+ export { List } from 'antd';
@@ -0,0 +1 @@
1
+ export { List, type ListProps } from './List';
@@ -0,0 +1 @@
1
+ export { List } from './List';
@@ -1,5 +1,4 @@
1
1
  import { ScrollbarProps as CustomScrollbarProps } from 'react-custom-scrollbars';
2
- import React from 'react';
3
- export interface ScrollbarsProps extends CustomScrollbarProps {
4
- }
5
- export declare const Scrollbars: React.FC<ScrollbarsProps>;
2
+ import { FC } from 'react';
3
+ export type ScrollbarsProps = CustomScrollbarProps & {};
4
+ export declare const Scrollbars: FC<ScrollbarsProps>;
@@ -40,7 +40,8 @@ export const Scrollbars = forwardRef((props, refProp) => {
40
40
  ref.current.thumbVertical.style.height = `${thumbHeight}px`;
41
41
  ref.current.thumbVertical.style.transform = `translateY(${thumbVerticalPosition}px)`;
42
42
  ref.current.thumbHorizontal.style.width = `${thumbWidth}px`;
43
- ref.current.thumbHorizontal.style.transform = `translateX(${thumbHorizontalPosition}px)`;
43
+ ref.current.thumbHorizontal.style.transform =
44
+ `translateX(${thumbHorizontalPosition}px)`;
44
45
  }
45
46
  // Handle show hide track bar
46
47
  ref.current.trackVertical.style.visibility =
@@ -270,7 +270,7 @@ export const SlideBar = props => {
270
270
  if (!disabledDelete) {
271
271
  handleDeleteSlide(state.cacheInfoClicked);
272
272
  }
273
- }, children: t(translations.delete.title) }) })] }), arrow: false, children: _jsx(Icon, { type: "icon-ants-three-dot-vertical", color: activeId === item.value ? THEME.token?.colorPrimary : THEME.token?.colorText, size: "20px", onClick: (event) => handleClick(event, item), disabled: false }) }))] })) }, item.value));
273
+ }, children: t(translations.delete.title) }) })] }), arrow: false, children: _jsx(Icon, { type: "icon-ants-three-dot-vertical", color: activeId === item.value ? THEME.token?.colorPrimary : THEME.token?.colorText, size: 20, onClick: (event) => handleClick(event, item), disabled: false }) }))] })) }, item.value));
274
274
  });
275
275
  const renderSliderDragDrop = () => (_jsx(WrapperOverflow, { ref: wrapperOverflowRef, id: "wrapper-overflow", children: _jsx(DragDropContext, { onDragEnd: handleDragEnd, children: _jsx(Droppable, { droppableId: "droppable", direction: "horizontal", children: (providedDroppable, _snapshotDroppable) => (_jsx(MainContent, { ref: providedDroppable.innerRef, ...providedDroppable.droppableProps, children: renderMainContent() })) }) }) }));
276
276
  return (_jsxs(ContainerSlideBar, { children: [_jsxs(SliderWrapper, { size: size, isViewMode: isViewMode, className: classNames({ 'slider-wrapper--borderless': borderless }), children: [_jsx(Icon, { type: "icon-ants-angle-left", style: { fontSize: '16px', cursor: 'pointer', color: THEME.token?.colorPrimary }, className: "btn-arrow-left btn-action-slide-template", disabled: state.disabledPrev, onClick: (e) => {
@@ -10,7 +10,7 @@ import { CloseIcon } from '../../icons';
10
10
  import { Flex } from '../Flex';
11
11
  import { Button } from '../Button';
12
12
  import { Typography } from '../Typography';
13
- import { SearchPopover } from '../../molecules';
13
+ import { SearchPopover } from '../../molecules/SearchPopover';
14
14
  // Constants
15
15
  import { globalToken } from '@antscorp/antsomi-ui/es/constants';
16
16
  import { translate, translations } from '@antscorp/antsomi-ui/es/locales';
@@ -33,6 +33,7 @@ export { ContentEditable } from './ContentEditable';
33
33
  export { Image } from './Image';
34
34
  export { IconField } from './IconField';
35
35
  export { Suspense } from './Suspense';
36
+ export { App } from './App';
36
37
  export { default as MobileBrandingBar } from './MobileBrandingBar';
37
38
  export { MobileFrameV3 } from './MobileFrameV3';
38
39
  export * from './Flex';
@@ -48,9 +49,11 @@ export * from './RateV2';
48
49
  export * from './Popover';
49
50
  export * from './Iframe';
50
51
  export * from './Avatar';
52
+ export * from './List';
51
53
  export * from './Upload';
52
54
  export * from './NotificationStatus';
53
55
  export type { SliderProps } from './Slider';
54
56
  export type { PaginationProps } from './Pagination';
55
57
  export type { InputDynamicProps } from './InputDynamic';
56
58
  export type { ImageProps } from './Image';
59
+ export type { AppProps } from './App';
@@ -33,6 +33,7 @@ export { ContentEditable } from './ContentEditable';
33
33
  export { Image } from './Image';
34
34
  export { IconField } from './IconField';
35
35
  export { Suspense } from './Suspense';
36
+ export { App } from './App';
36
37
  export { default as MobileBrandingBar } from './MobileBrandingBar';
37
38
  export { MobileFrameV3 } from './MobileFrameV3';
38
39
  export * from './Flex';
@@ -48,5 +49,6 @@ export * from './RateV2';
48
49
  export * from './Popover';
49
50
  export * from './Iframe';
50
51
  export * from './Avatar';
52
+ export * from './List';
51
53
  export * from './Upload';
52
54
  export * from './NotificationStatus';
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { IconProps } from './types';
3
+ export declare const FeedbackOutlinedIcon: React.ForwardRefExoticComponent<IconProps & React.RefAttributes<SVGSVGElement>>;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from 'react';
3
+ import { useIcon } from './hooks/useIcon';
4
+ export const FeedbackOutlinedIcon = forwardRef((props, ref) => {
5
+ const { width, height } = useIcon(props);
6
+ return (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, ref: ref, width: width, height: height, children: _jsx("path", { d: "M20 2H4C2.9 2 2.01 2.9 2.01 4L2 22L6 18H20C21.1 18 22 17.1 22 16V4C22 2.9 21.1 2 20 2ZM20 16H5.17L4.58 16.59L4 17.17V4H20V16ZM11 12H13V14H11V12ZM11 6H13V10H11V6Z", fill: "currentColor" }) }));
7
+ });
@@ -174,6 +174,7 @@ export declare const LazyIcon: {
174
174
  ExtendValueIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
175
175
  FactCheckIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
176
176
  FailSlim: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
177
+ FeedbackOutlinedIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
177
178
  FeedbackRatingIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
178
179
  FileDownloadIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
179
180
  FileTransferIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
@@ -257,6 +258,8 @@ export declare const LazyIcon: {
257
258
  MoreInfoIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
258
259
  MoveToIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
259
260
  MuteIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
261
+ NavigateBeforeIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
262
+ NavigateNextIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
260
263
  NodeViewIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
261
264
  NoteNewIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
262
265
  NotificationIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
@@ -270,6 +273,7 @@ export declare const LazyIcon: {
270
273
  PaymentIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
271
274
  PenDrawingIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
272
275
  PenRulerIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
276
+ PenSparkIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
273
277
  PersonAddDisabledIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
274
278
  PersonUserAccountIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
275
279
  PhoneCallbackIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
@@ -341,6 +345,7 @@ export declare const LazyIcon: {
341
345
  SqlWorkspaceIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
342
346
  StatisticIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
343
347
  StatusInfoIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
348
+ StatusSuccessIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
344
349
  StickerIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
345
350
  StopRecordIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
346
351
  StoreIcon: import("react").LazyExoticComponent<import("react").ForwardRefExoticComponent<import("../types").IconProps & import("react").RefAttributes<SVGSVGElement>>>;
@@ -177,6 +177,7 @@ export const LazyIcon = {
177
177
  ExtendValueIcon: lazy(() => import('../ExtendValueIcon').then(m => ({ default: m.ExtendValueIcon }))),
178
178
  FactCheckIcon: lazy(() => import('../FactCheckIcon').then(m => ({ default: m.FactCheckIcon }))),
179
179
  FailSlim: lazy(() => import('../FailSlim').then(m => ({ default: m.FailSlim }))),
180
+ FeedbackOutlinedIcon: lazy(() => import('../FeedbackOutlinedIcon').then(m => ({ default: m.FeedbackOutlinedIcon }))),
180
181
  FeedbackRatingIcon: lazy(() => import('../FeedbackRatingIcon').then(m => ({ default: m.FeedbackRatingIcon }))),
181
182
  FileDownloadIcon: lazy(() => import('../FileDownloadIcon').then(m => ({ default: m.FileDownloadIcon }))),
182
183
  FileTransferIcon: lazy(() => import('../FileTransferIcon').then(m => ({ default: m.FileTransferIcon }))),
@@ -258,6 +259,8 @@ export const LazyIcon = {
258
259
  MoreInfoIcon: lazy(() => import('../MoreInfoIcon').then(m => ({ default: m.MoreInfoIcon }))),
259
260
  MoveToIcon: lazy(() => import('../MoveToIcon').then(m => ({ default: m.MoveToIcon }))),
260
261
  MuteIcon: lazy(() => import('../MuteIcon').then(m => ({ default: m.MuteIcon }))),
262
+ NavigateBeforeIcon: lazy(() => import('../NavigateBeforeIcon').then(m => ({ default: m.NavigateBeforeIcon }))),
263
+ NavigateNextIcon: lazy(() => import('../NavigateNextIcon').then(m => ({ default: m.NavigateNextIcon }))),
261
264
  NodeViewIcon: lazy(() => import('../NodeViewIcon').then(m => ({ default: m.NodeViewIcon }))),
262
265
  NoteNewIcon: lazy(() => import('../NoteNewIcon').then(m => ({ default: m.NoteNewIcon }))),
263
266
  NotificationIcon: lazy(() => import('../NotificationIcon').then(m => ({ default: m.NotificationIcon }))),
@@ -271,6 +274,7 @@ export const LazyIcon = {
271
274
  PaymentIcon: lazy(() => import('../PaymentIcon').then(m => ({ default: m.PaymentIcon }))),
272
275
  PenDrawingIcon: lazy(() => import('../PenDrawingIcon').then(m => ({ default: m.PenDrawingIcon }))),
273
276
  PenRulerIcon: lazy(() => import('../PenRulerIcon').then(m => ({ default: m.PenRulerIcon }))),
277
+ PenSparkIcon: lazy(() => import('../PenSparkIcon').then(m => ({ default: m.PenSparkIcon }))),
274
278
  PersonAddDisabledIcon: lazy(() => import('../PersonAddDisabledIcon').then(m => ({ default: m.PersonAddDisabledIcon }))),
275
279
  PersonUserAccountIcon: lazy(() => import('../PersonUserAccountIcon').then(m => ({ default: m.PersonUserAccountIcon }))),
276
280
  PhoneCallbackIcon: lazy(() => import('../PhoneCallbackIcon').then(m => ({ default: m.PhoneCallbackIcon }))),
@@ -344,6 +348,7 @@ export const LazyIcon = {
344
348
  SqlWorkspaceIcon: lazy(() => import('../SqlWorkspaceIcon').then(m => ({ default: m.SqlWorkspaceIcon }))),
345
349
  StatisticIcon: lazy(() => import('../StatisticIcon').then(m => ({ default: m.StatisticIcon }))),
346
350
  StatusInfoIcon: lazy(() => import('../StatusInfoIcon').then(m => ({ default: m.StatusInfoIcon }))),
351
+ StatusSuccessIcon: lazy(() => import('../StatusSuccessIcon').then(m => ({ default: m.StatusSuccessIcon }))),
347
352
  StickerIcon: lazy(() => import('../StickerIcon').then(m => ({ default: m.StickerIcon }))),
348
353
  StopRecordIcon: lazy(() => import('../StopRecordIcon').then(m => ({ default: m.StopRecordIcon }))),
349
354
  StoreIcon: lazy(() => import('../StoreIcon').then(m => ({ default: m.StoreIcon }))),
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { IconProps } from './types';
3
+ export declare const NavigateBeforeIcon: React.ForwardRefExoticComponent<IconProps & React.RefAttributes<SVGSVGElement>>;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from 'react';
3
+ import { useIcon } from './hooks/useIcon';
4
+ export const NavigateBeforeIcon = forwardRef((props, ref) => {
5
+ const { width, height } = useIcon(props);
6
+ return (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, ref: ref, width: width, height: height, children: _jsx("path", { d: "M15.41 7.41L14 6L8 12L14 18L15.41 16.59L10.83 12L15.41 7.41Z", fill: "currentColor" }) }));
7
+ });
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { IconProps } from './types';
3
+ export declare const NavigateNextIcon: React.ForwardRefExoticComponent<IconProps & React.RefAttributes<SVGSVGElement>>;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from 'react';
3
+ import { useIcon } from './hooks/useIcon';
4
+ export const NavigateNextIcon = forwardRef((props, ref) => {
5
+ const { width, height } = useIcon(props);
6
+ return (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, ref: ref, width: width, height: height, children: _jsx("path", { d: "M10 6L8.59 7.41L13.17 12L8.59 16.59L10 18L16 12L10 6Z", fill: "currentColor" }) }));
7
+ });
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { IconProps } from './types';
3
+ export declare const PenSparkIcon: React.ForwardRefExoticComponent<IconProps & React.RefAttributes<SVGSVGElement>>;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from 'react';
3
+ import { useIcon } from './hooks/useIcon';
4
+ export const PenSparkIcon = forwardRef((props, ref) => {
5
+ const { width, height } = useIcon(props);
6
+ return (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, ref: ref, width: width, height: height, children: _jsx("path", { d: "M21.4795 7.15625L20.2326 5.8975C20.0696 5.73091 19.8754 5.59864 19.6614 5.50836C19.4474 5.41809 19.2177 5.3716 18.9857 5.3716C18.7538 5.3716 18.5241 5.41809 18.3101 5.50836C18.096 5.59864 17.9019 5.73091 17.7389 5.8975L5.52889 18.2237V22H9.26952L21.4795 9.67375C22.1735 8.985 22.1735 7.85687 21.4795 7.15625ZM8.54021 20.2188H7.29334V18.96L16.492 9.67375L17.7389 10.9325L8.54021 20.2188ZM12.5867 8.34375C9.6577 8.34375 7.29334 5.95688 7.29334 3C7.29334 5.95688 4.92898 8.34375 2 8.34375C4.92898 8.34375 7.29334 10.7306 7.29334 13.6875C7.29334 10.7306 9.6577 8.34375 12.5867 8.34375Z", fill: "currentColor" }) }));
7
+ });
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { IconProps } from './types';
3
+ export declare const StatusSuccessIcon: React.ForwardRefExoticComponent<IconProps & React.RefAttributes<SVGSVGElement>>;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from 'react';
3
+ import { useIcon } from './hooks/useIcon';
4
+ export const StatusSuccessIcon = forwardRef((props, ref) => {
5
+ const { width, height } = useIcon(props);
6
+ return (_jsx("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, ref: ref, width: width, height: height, children: _jsx("path", { d: "M12 2C6.42857 2 2 6.42857 2 12C2 17.5714 6.42857 22 12 22C17.5714 22 22 17.5714 22 12C22 6.42857 17.5714 2 12 2ZM10 17L5 12L6.42857 10.5714L10 14.1429L17.5714 6.57143L19 8L10 17Z", fill: "currentColor" }) }));
7
+ });
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { IconProps } from './types';
3
+ export declare const SummarizeIconIcon: React.ForwardRefExoticComponent<IconProps & React.RefAttributes<SVGSVGElement>>;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from 'react';
3
+ import { useIcon } from './hooks/useIcon';
4
+ export const SummarizeIconIcon = forwardRef((props, ref) => {
5
+ const { width, height } = useIcon(props);
6
+ return (_jsx("svg", { viewBox: "0 0 25 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, ref: ref, width: width, height: height, children: _jsx("path", { d: "M7.5 20C6.97005 19.9984 6.46225 19.7872 6.08752 19.4125C5.71279 19.0377 5.50158 18.5299 5.5 18L5.51001 6C5.51 5.4713 5.71934 4.9641 6.09225 4.58931C6.46517 4.21452 6.9713 4.00264 7.5 4H17.5C18.0299 4.00158 18.5377 4.2128 18.9125 4.58753C19.2872 4.96227 19.4984 5.47005 19.5 6V18C19.4984 18.5299 19.2872 19.0377 18.9125 19.4125C18.5377 19.7872 18.0299 19.9984 17.5 20H7.5ZM7.5 18H17.5V6H7.5V18ZM8.5 16V14H10.5V16H8.5ZM11.5 15V14H15.5V15H11.5ZM8.5 13V11H10.5V13H8.5ZM11.5 12V11H15.5V12H11.5ZM8.5 10V8H10.5V10H8.5ZM11.5 9V8H15.5V9H11.5Z", fill: "currentColor" }) }));
7
+ });
@@ -169,6 +169,7 @@ export { ExportMenuIcon } from './ExportMenuIcon';
169
169
  export { ExtendValueIcon } from './ExtendValueIcon';
170
170
  export { FactCheckIcon } from './FactCheckIcon';
171
171
  export { FailSlim } from './FailSlim';
172
+ export { FeedbackOutlinedIcon } from './FeedbackOutlinedIcon';
172
173
  export { FeedbackRatingIcon } from './FeedbackRatingIcon';
173
174
  export { FileDownloadIcon } from './FileDownloadIcon';
174
175
  export { FileTransferIcon } from './FileTransferIcon';
@@ -250,6 +251,8 @@ export { MoreIcon } from './MoreIcon';
250
251
  export { MoreInfoIcon } from './MoreInfoIcon';
251
252
  export { MoveToIcon } from './MoveToIcon';
252
253
  export { MuteIcon } from './MuteIcon';
254
+ export { NavigateBeforeIcon } from './NavigateBeforeIcon';
255
+ export { NavigateNextIcon } from './NavigateNextIcon';
253
256
  export { NodeViewIcon } from './NodeViewIcon';
254
257
  export { NoteNewIcon } from './NoteNewIcon';
255
258
  export { NotificationIcon } from './NotificationIcon';
@@ -263,6 +266,7 @@ export { PauseIcon } from './PauseIcon';
263
266
  export { PaymentIcon } from './PaymentIcon';
264
267
  export { PenDrawingIcon } from './PenDrawingIcon';
265
268
  export { PenRulerIcon } from './PenRulerIcon';
269
+ export { PenSparkIcon } from './PenSparkIcon';
266
270
  export { PersonAddDisabledIcon } from './PersonAddDisabledIcon';
267
271
  export { PersonUserAccountIcon } from './PersonUserAccountIcon';
268
272
  export { PhoneCallbackIcon } from './PhoneCallbackIcon';
@@ -334,6 +338,7 @@ export { SQLWorkspace30Icon } from './SQLWorkspace30Icon';
334
338
  export { SqlWorkspaceIcon } from './SqlWorkspaceIcon';
335
339
  export { StatisticIcon } from './StatisticIcon';
336
340
  export { StatusInfoIcon } from './StatusInfoIcon';
341
+ export { StatusSuccessIcon } from './StatusSuccessIcon';
337
342
  export { StickerIcon } from './StickerIcon';
338
343
  export { StopRecordIcon } from './StopRecordIcon';
339
344
  export { StoreIcon } from './StoreIcon';
@@ -169,6 +169,7 @@ export { ExportMenuIcon } from './ExportMenuIcon';
169
169
  export { ExtendValueIcon } from './ExtendValueIcon';
170
170
  export { FactCheckIcon } from './FactCheckIcon';
171
171
  export { FailSlim } from './FailSlim';
172
+ export { FeedbackOutlinedIcon } from './FeedbackOutlinedIcon';
172
173
  export { FeedbackRatingIcon } from './FeedbackRatingIcon';
173
174
  export { FileDownloadIcon } from './FileDownloadIcon';
174
175
  export { FileTransferIcon } from './FileTransferIcon';
@@ -250,6 +251,8 @@ export { MoreIcon } from './MoreIcon';
250
251
  export { MoreInfoIcon } from './MoreInfoIcon';
251
252
  export { MoveToIcon } from './MoveToIcon';
252
253
  export { MuteIcon } from './MuteIcon';
254
+ export { NavigateBeforeIcon } from './NavigateBeforeIcon';
255
+ export { NavigateNextIcon } from './NavigateNextIcon';
253
256
  export { NodeViewIcon } from './NodeViewIcon';
254
257
  export { NoteNewIcon } from './NoteNewIcon';
255
258
  export { NotificationIcon } from './NotificationIcon';
@@ -263,6 +266,7 @@ export { PauseIcon } from './PauseIcon';
263
266
  export { PaymentIcon } from './PaymentIcon';
264
267
  export { PenDrawingIcon } from './PenDrawingIcon';
265
268
  export { PenRulerIcon } from './PenRulerIcon';
269
+ export { PenSparkIcon } from './PenSparkIcon';
266
270
  export { PersonAddDisabledIcon } from './PersonAddDisabledIcon';
267
271
  export { PersonUserAccountIcon } from './PersonUserAccountIcon';
268
272
  export { PhoneCallbackIcon } from './PhoneCallbackIcon';
@@ -334,6 +338,7 @@ export { SQLWorkspace30Icon } from './SQLWorkspace30Icon';
334
338
  export { SqlWorkspaceIcon } from './SqlWorkspaceIcon';
335
339
  export { StatisticIcon } from './StatisticIcon';
336
340
  export { StatusInfoIcon } from './StatusInfoIcon';
341
+ export { StatusSuccessIcon } from './StatusSuccessIcon';
337
342
  export { StickerIcon } from './StickerIcon';
338
343
  export { StopRecordIcon } from './StopRecordIcon';
339
344
  export { StoreIcon } from './StoreIcon';
@@ -0,0 +1 @@
1
+ @use './organism';
@@ -16,7 +16,7 @@ export interface LabeledTreeValue extends LabeledValue {
16
16
  type: number | null;
17
17
  status?: any;
18
18
  }
19
- interface AddDynamicContentProps {
19
+ export interface AddDynamicContentProps {
20
20
  defaultDynamicIndex?: number;
21
21
  journeySettings: Record<string, any>;
22
22
  contentSources: Record<string, any>;
@@ -32,4 +32,3 @@ interface AddDynamicContentProps {
32
32
  APIConfig: APIConfig;
33
33
  }
34
34
  export declare const AddDynamicContent: React.FC<AddDynamicContentProps>;
35
- export {};
@@ -3,7 +3,7 @@ export declare const TRIGGER_OUT_MODE: {
3
3
  readonly auto: "auto";
4
4
  readonly manual: "manual";
5
5
  };
6
- export declare const LOCAL_TIMEZONE = "Asia/Hong_Kong";
6
+ export declare const LOCAL_TIMEZONE: string;
7
7
  export declare const RANGE_LIMIT: number;
8
8
  export declare const DEFAULT_NUM_UP_TO = 30;
9
9
  export declare const AUTO_UPDATE_TO_KEY: {
@@ -2,7 +2,7 @@ export const TRIGGER_OUT_MODE = {
2
2
  auto: 'auto',
3
3
  manual: 'manual',
4
4
  };
5
- export const LOCAL_TIMEZONE = 'Asia/Hong_Kong' || Intl.DateTimeFormat().resolvedOptions().timeZone;
5
+ export const LOCAL_TIMEZONE = Intl.DateTimeFormat().resolvedOptions().timeZone;
6
6
  export const RANGE_LIMIT = 365 * 2;
7
7
  export const DEFAULT_NUM_UP_TO = 30;
8
8
  export const AUTO_UPDATE_TO_KEY = {
@@ -6,8 +6,14 @@ declare const CaptureScreen: {
6
6
  src: string;
7
7
  alt: string;
8
8
  defaultPositions: {
9
- capture: null;
10
- record: null;
9
+ capture: {
10
+ x: number;
11
+ y: number;
12
+ };
13
+ record: {
14
+ x: number;
15
+ y: number;
16
+ };
11
17
  };
12
18
  callback: () => void;
13
19
  };
@@ -786,8 +786,8 @@ CaptureScreen.defaultProps = {
786
786
  src: '',
787
787
  alt: 'CaptureScreen',
788
788
  defaultPositions: {
789
- capture: null,
790
- record: null,
789
+ capture: { x: 0, y: 0 },
790
+ record: { x: 0, y: 0 },
791
791
  },
792
792
  callback: () => { },
793
793
  };