@zjlab-fe/data-hub-ui 0.21.6 → 0.22.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 (226) hide show
  1. package/dist/types/components/tip-tap/extensions/index.d.ts +1 -1
  2. package/es/assets/cardImg.png.js +3 -0
  3. package/es/assets/closeBtn.png.js +3 -0
  4. package/es/assets/icon-tag-header.png.js +3 -0
  5. package/es/assets/source.png.js +3 -0
  6. package/es/components/FileUploader/FileUploadModal.js +24 -0
  7. package/es/components/FileUploader/FileUploader.js +20 -0
  8. package/es/components/FileUploader/FileUploaderImpl/FileUploader.js +34 -0
  9. package/es/components/FileUploader/FileUploaderImpl/FileUploaderContextProvider.js +46 -0
  10. package/es/components/FileUploader/FileUploaderImpl/FileUploaderFileReceiver.css.js +36 -0
  11. package/es/components/FileUploader/FileUploaderImpl/FileUploaderFileReceiver.js +57 -0
  12. package/es/components/FileUploader/FileUploaderImpl/FileUploaderFileReceiverContainer.js +24 -0
  13. package/es/components/FileUploader/FileUploaderImpl/FileUploaderFileReceiverDesc.js +9 -0
  14. package/es/components/FileUploader/FileUploaderImpl/FileUploaderList.js +46 -0
  15. package/es/components/FileUploader/FileUploaderImpl/FileUploaderListItem.js +46 -0
  16. package/es/components/FileUploader/FileUploaderImpl/FileUploaderListItemFail.js +21 -0
  17. package/es/components/FileUploader/FileUploaderImpl/FileUploaderListItemPaused.js +20 -0
  18. package/es/components/FileUploader/FileUploaderImpl/FileUploaderListItemUploading.js +43 -0
  19. package/es/components/FileUploader/FileUploaderImpl/FileUploaderlListItemFinished.js +32 -0
  20. package/es/components/FileUploader/Locale/translations.js +52 -0
  21. package/es/components/FileUploader/Locale/useTranslate.js +16 -0
  22. package/es/components/FileUploader/UploadStoreProvider/UploadStoreProvider.js +31 -0
  23. package/es/components/FileUploader/UploadStoreProvider/uploadStoreReducer.js +62 -0
  24. package/es/components/FileUploader/UploadStoreProvider/useOnFileAllUploaded.js +31 -0
  25. package/es/components/FileUploader/UploadStoreProvider/useSaveUnfinishedUploads.js +42 -0
  26. package/es/components/FileUploader/UploadStoreProvider/useSetupMergingEvent.js +45 -0
  27. package/es/components/FileUploader/hooks/useCancelUpload.js +40 -0
  28. package/es/components/FileUploader/hooks/useCurrentFile.js +61 -0
  29. package/es/components/FileUploader/hooks/useCurrentFileOnUploading.js +52 -0
  30. package/es/components/FileUploader/hooks/useCurrentFileSetupAndBackUp.js +39 -0
  31. package/es/components/FileUploader/hooks/useFormatFiles.js +64 -0
  32. package/es/components/FileUploader/hooks/useFormatFilesFindDuplicates.js +75 -0
  33. package/es/components/FileUploader/hooks/useFormatFilesRemoveDuplicates.js +21 -0
  34. package/es/components/FileUploader/hooks/useHandleChunkCompletion.js +31 -0
  35. package/es/components/FileUploader/hooks/useOnMounted.js +24 -0
  36. package/es/components/FileUploader/hooks/useOnMountedResumeUnfinished.js +58 -0
  37. package/es/components/FileUploader/hooks/useRetryUpload.js +33 -0
  38. package/es/components/FileUploader/hooks/useUploadChunk.js +46 -0
  39. package/es/components/FileUploader/icons/CloseFilled.js +7 -0
  40. package/es/components/FileUploader/icons/UnkownFileIcon.js +7 -0
  41. package/es/components/FileUploader/icons/UploadIcon.js +7 -0
  42. package/es/components/FileUploader/index.css.js +532 -0
  43. package/es/components/FileUploader/index.js +23 -0
  44. package/es/components/FileUploader/types.js +13 -0
  45. package/es/components/FileUploader/utils/calcDisplaySize.js +20 -0
  46. package/es/components/FileUploader/utils/checkExpiryTime.js +15 -0
  47. package/es/components/FileUploader/utils/createFileToUpload.js +60 -0
  48. package/es/components/FileUploader/utils/fileDB/addFilesToIndexdb.js +14 -0
  49. package/es/components/FileUploader/utils/fileDB/deleteFileInStore.js +18 -0
  50. package/es/components/FileUploader/utils/fileDB/deleteObjectStore.js +25 -0
  51. package/es/components/FileUploader/utils/fileDB/index.js +77 -0
  52. package/es/components/FileUploader/utils/fileDB/openDBAndRetrieveData.js +90 -0
  53. package/es/components/FileUploader/utils/fileDB/retrieveExistingData.js +49 -0
  54. package/es/components/FileUploader/utils/modalConfig.css.js +20 -0
  55. package/es/components/FileUploader/utils/modalConfig.js +32 -0
  56. package/es/components/FileUploader/utils/retrieveAllFiles.js +70 -0
  57. package/es/components/FileUploader/utils/splitFileIntoChunk.js +15 -0
  58. package/es/components/SDK-modal/document-link.js +8 -0
  59. package/es/components/SDK-modal/index.js +25 -0
  60. package/es/components/SDK-modal/index.module.scss.js +49 -0
  61. package/es/components/SDK-modal/inner-modal.js +59 -0
  62. package/es/components/SDK-modal/locale/translations.js +17 -0
  63. package/es/components/apply-perm-modal/index.js +53 -0
  64. package/es/components/apply-perm-modal/index.module.scss.js +96 -0
  65. package/es/components/auth-tag/index.js +23 -0
  66. package/es/components/bench-card/index.js +20 -0
  67. package/es/components/bench-card/index.module.scss.js +48 -0
  68. package/es/components/confirm-again/index.js +15 -0
  69. package/es/components/confirm-again/index.scss.js +37 -0
  70. package/es/components/copy/index.js +41 -0
  71. package/es/components/copy/index.module.scss.js +15 -0
  72. package/es/components/corpus-card/index.js +88 -0
  73. package/es/components/corpus-card/index.module.scss.js +171 -0
  74. package/es/components/feature-card/classNames.js +72 -0
  75. package/es/components/feature-card/components.js +48 -0
  76. package/es/components/feature-card/context.js +13 -0
  77. package/es/components/feature-card/index.css.js +655 -0
  78. package/es/components/feature-card/index.js +48 -0
  79. package/es/components/file-preview/data-table/index.js +94 -0
  80. package/es/components/file-preview/data-table/index.module.scss.js +54 -0
  81. package/es/components/file-preview/excel-preview/index.js +132 -0
  82. package/es/components/file-preview/excel-preview/index.module.scss.js +11 -0
  83. package/es/components/file-preview/excel-preview/utils.js +46 -0
  84. package/es/components/file-preview/img-preview/index.js +18 -0
  85. package/es/components/file-preview/img-preview/index.module.scss.js +17 -0
  86. package/es/components/file-preview/index.js +124 -0
  87. package/es/components/file-preview/index.module.scss.js +32 -0
  88. package/es/components/file-preview/json-preview/index.js +166 -0
  89. package/es/components/file-preview/markdown-preview/index.js +53 -0
  90. package/es/components/file-preview/markdown-preview/index.module.scss.js +1055 -0
  91. package/es/components/file-preview/parquet-preview/index.js +54 -0
  92. package/es/components/file-preview/pdf-preview/index.js +215 -0
  93. package/es/components/file-preview/pdf-preview/index.module.scss.js +16 -0
  94. package/es/components/file-preview/table-preview/index.js +43 -0
  95. package/es/components/file-preview/table-preview/index.module.scss.js +11 -0
  96. package/es/components/file-preview/txt-preview/index.js +24 -0
  97. package/es/components/file-preview/util.js +94 -0
  98. package/es/components/file-uploader/components/circle-progress.css.js +39 -0
  99. package/es/components/file-uploader/components/circle-progress.js +12 -0
  100. package/es/components/file-uploader/components/hooks/use-drop-zone.js +74 -0
  101. package/es/components/file-uploader/components/hooks/use-file-validation.js +52 -0
  102. package/es/components/file-uploader/components/icons.js +19 -0
  103. package/es/components/file-uploader/components/theme.css.js +64 -0
  104. package/es/components/file-uploader/components/uploader-drop-zone.css.js +66 -0
  105. package/es/components/file-uploader/components/uploader-drop-zone.js +74 -0
  106. package/es/components/file-uploader/components/uploader-file-item.css.js +186 -0
  107. package/es/components/file-uploader/components/uploader-file-item.js +63 -0
  108. package/es/components/file-uploader/components/uploader-file-list.css.js +43 -0
  109. package/es/components/file-uploader/components/uploader-file-list.js +27 -0
  110. package/es/components/file-uploader/components/uploader.css.js +20 -0
  111. package/es/components/file-uploader/components/uploader.js +51 -0
  112. package/es/components/file-uploader/components/uploading-status.css.js +52 -0
  113. package/es/components/file-uploader/components/uploading-status.js +54 -0
  114. package/es/components/file-uploader/components/utils/directory-reader.js +65 -0
  115. package/es/components/file-uploader/constants.js +31 -0
  116. package/es/components/file-uploader/context/action-registry.js +69 -0
  117. package/es/components/file-uploader/context/file-state-store.js +83 -0
  118. package/es/components/file-uploader/context/handler-registry.js +119 -0
  119. package/es/components/file-uploader/context/upload-context.js +36 -0
  120. package/es/components/file-uploader/context/upload-provider.js +77 -0
  121. package/es/components/file-uploader/context/upload-reducer.js +21 -0
  122. package/es/components/file-uploader/context/use-upload-engine.js +440 -0
  123. package/es/components/file-uploader/engine/queue-callbacks.js +257 -0
  124. package/es/components/file-uploader/engine/queue-manager.js +195 -0
  125. package/es/components/file-uploader/engine/queue-uploader.js +25 -0
  126. package/es/components/file-uploader/hooks/use-upload.js +327 -0
  127. package/es/components/file-uploader/utils/chunk-handlers.js +66 -0
  128. package/es/components/file-uploader/utils/ensure-handlers.js +53 -0
  129. package/es/components/file-uploader/utils/error-handler.js +84 -0
  130. package/es/components/file-uploader/utils/upload-controllers.js +43 -0
  131. package/es/components/file-uploader/utils/upload-handler.js +68 -0
  132. package/es/components/file-uploader/utils/validate-handlers.js +16 -0
  133. package/es/components/floating-label-input/index.js +46 -0
  134. package/es/components/floating-label-input/index.module.scss.js +30 -0
  135. package/es/components/floating-layer/index.js +15 -0
  136. package/es/components/floating-layer/index.scss.js +31 -0
  137. package/es/components/header/index.js +10 -0
  138. package/es/components/header/index.module.scss.js +16 -0
  139. package/es/components/input-tag/index.js +65 -0
  140. package/es/components/menu/index.js +96 -0
  141. package/es/components/menu/index.module.scss.js +188 -0
  142. package/es/components/model-card/index.js +20 -0
  143. package/es/components/model-card/index.module.scss.js +116 -0
  144. package/es/components/notion-editor/code-block/index.js +18 -0
  145. package/es/components/notion-editor/code-block/languageDetector.js +134 -0
  146. package/es/components/notion-editor/code-block/languages.js +42 -0
  147. package/es/components/notion-editor/index.js +258 -0
  148. package/es/components/notion-editor/index.scss.js +421 -0
  149. package/es/components/notion-editor/parseMarkdown.js +184 -0
  150. package/es/components/operator-chain/components/AddButton.js +20 -0
  151. package/es/components/operator-chain/components/IOCard.js +8 -0
  152. package/es/components/operator-chain/components/SingleCard.js +12 -0
  153. package/es/components/operator-chain/components/VirtualDropdown.js +56 -0
  154. package/es/components/operator-chain/index.js +83 -0
  155. package/es/components/operator-chain/index.module.scss.js +232 -0
  156. package/es/components/permission-editor/index.js +9 -0
  157. package/es/components/permission-editor/permissionEditModal/index.js +37 -0
  158. package/es/components/permission-editor/permissionEditor/index.js +253 -0
  159. package/es/components/permission-editor/permissionEditor/index.module.scss.js +22 -0
  160. package/es/components/permission-editor/permissionViewPopover/index.js +9 -0
  161. package/es/components/popover-select/index.js +42 -0
  162. package/es/components/popover-select/index.module.scss.js +22 -0
  163. package/es/components/radio-card/index.js +24 -0
  164. package/es/components/radio-card/index.scss.js +58 -0
  165. package/es/components/section-heading/classNames.js +22 -0
  166. package/es/components/section-heading/components.js +27 -0
  167. package/es/components/section-heading/context.js +13 -0
  168. package/es/components/section-heading/index.css.js +648 -0
  169. package/es/components/section-heading/index.js +37 -0
  170. package/es/components/status-tag/index.js +31 -0
  171. package/es/components/tag-group-filter/dataSizeFilter.js +100 -0
  172. package/es/components/tag-group-filter/index.js +53 -0
  173. package/es/components/tag-group-filter/index.module.scss.js +134 -0
  174. package/es/components/tag-group-filter/tagFilter.js +19 -0
  175. package/es/components/tag-view/index.js +138 -0
  176. package/es/components/tag-view/index.module.scss.js +56 -0
  177. package/es/components/tag-view/useSize.js +41 -0
  178. package/es/components/tip-tap/bubble-menu.js +47 -0
  179. package/es/components/tip-tap/editor.js +34 -0
  180. package/es/components/tip-tap/extensions/index.js +133 -0
  181. package/es/components/tip-tap/extensions/markdown-paste.js +148 -0
  182. package/es/components/tip-tap/icons/index.js +29 -0
  183. package/es/components/tip-tap/reader.js +15 -0
  184. package/es/components/tip-tap/styles/editor.css.js +863 -0
  185. package/es/components/tip-tap/toolbar/components/color-picker.js +76 -0
  186. package/es/components/tip-tap/toolbar/components/heading-dropdown.js +44 -0
  187. package/es/components/tip-tap/toolbar/components/image-button.js +26 -0
  188. package/es/components/tip-tap/toolbar/components/link-button.js +107 -0
  189. package/es/components/tip-tap/toolbar/components/table-button.js +37 -0
  190. package/es/components/tip-tap/toolbar/components/toolbar-button.js +7 -0
  191. package/es/components/tip-tap/toolbar/index.js +39 -0
  192. package/es/components/uploadDrawer/UploadStoreProvider.js +61 -0
  193. package/es/components/uploadDrawer/fileUploadDrawer.js +66 -0
  194. package/es/components/uploadDrawer/fileUploadDrawerFileDragger.js +71 -0
  195. package/es/components/uploadDrawer/fileUploadDrawerList.js +54 -0
  196. package/es/components/uploadDrawer/fileUploadDrawerListProgressButton.js +54 -0
  197. package/es/components/uploadDrawer/hooks/useCancelUpload.js +37 -0
  198. package/es/components/uploadDrawer/hooks/useFilterFiles.js +107 -0
  199. package/es/components/uploadDrawer/hooks/useFinishUpload.js +33 -0
  200. package/es/components/uploadDrawer/hooks/useFormatFiles.js +54 -0
  201. package/es/components/uploadDrawer/hooks/useProgressButtonRef.js +22 -0
  202. package/es/components/uploadDrawer/hooks/useRemoveFilesInUploadQueue.js +21 -0
  203. package/es/components/uploadDrawer/hooks/useResumeUnfinishedUploads.js +52 -0
  204. package/es/components/uploadDrawer/hooks/useRetryUpload.js +35 -0
  205. package/es/components/uploadDrawer/hooks/useSaveUnfinishedUploads.js +42 -0
  206. package/es/components/uploadDrawer/hooks/useSetupUpload.js +80 -0
  207. package/es/components/uploadDrawer/hooks/useUploadFileToOSS.js +23 -0
  208. package/es/components/uploadDrawer/index.css.js +511 -0
  209. package/es/components/uploadDrawer/index.js +43 -0
  210. package/es/components/uploadDrawer/utils/calcDisplaySize.js +19 -0
  211. package/es/components/uploadDrawer/utils/constant.js +16 -0
  212. package/es/components/uploadDrawer/utils/createFileToUpload.js +51 -0
  213. package/es/components/uploadDrawer/utils/fileDB/deleteFileInStore.js +28 -0
  214. package/es/components/uploadDrawer/utils/fileDB/deleteObjectStore.js +28 -0
  215. package/es/components/uploadDrawer/utils/fileDB/handleAddFilesToDB.js +37 -0
  216. package/es/components/uploadDrawer/utils/fileDB/index.js +9 -0
  217. package/es/components/uploadDrawer/utils/fileDB/openDB.js +111 -0
  218. package/es/components/uploadDrawer/utils/retrieveAllFiles.js +110 -0
  219. package/es/components/uploadDrawer/utils/shouldCreateNewFile.js +13 -0
  220. package/es/components/uploadDrawer/utils/splitFileIntoChunk.js +15 -0
  221. package/es/index.js +42 -1
  222. package/es/lib/utils.js +8 -0
  223. package/lib/index.js +1 -1
  224. package/package.json +164 -154
  225. package/rollup.es.config.mjs +177 -0
  226. package/tsconfig.rollup.json +7 -0
@@ -0,0 +1,25 @@
1
+ import { __awaiter } from 'tslib';
2
+ import { CURRENT_DATABASE_CONNECTION, DATABASE_NAME } from './index.js';
3
+
4
+ function deleteObjectStore(storeName) {
5
+ return __awaiter(this, void 0, void 0, function* () {
6
+ const newVersion = CURRENT_DATABASE_CONNECTION.version + 1;
7
+ CURRENT_DATABASE_CONNECTION.close();
8
+ return new Promise((resolve, reject) => {
9
+ const openRequest = window.indexedDB.open(DATABASE_NAME, newVersion);
10
+ openRequest.onupgradeneeded = () => {
11
+ const db = openRequest.result;
12
+ if (db.objectStoreNames.contains(storeName)) {
13
+ db.deleteObjectStore(storeName);
14
+ }
15
+ };
16
+ openRequest.onsuccess = () => {
17
+ openRequest.result.close();
18
+ resolve();
19
+ };
20
+ openRequest.onerror = () => reject(openRequest.error);
21
+ });
22
+ });
23
+ }
24
+
25
+ export { deleteObjectStore };
@@ -0,0 +1,77 @@
1
+ import 'tslib';
2
+
3
+ /**
4
+ * IndexedDB 是一个底层的 API,用于在客户端存储大量的结构化数据。
5
+ * 它是一个事务型数据库系统,类似于基于 SQL 的 RDBMS。
6
+ *
7
+ * 事务是一组原子性的数据库操作,具有以下特点(ACID):
8
+ * 1. 原子性(Atomicity): 事务中的所有操作要么全部成功,要么全部失败回滚
9
+ * 2. 一致性(Consistency): 事务执行前后数据库必须处于一致状态
10
+ * 3. 隔离性(Isolation): 多个事务并发执行时不会相互影响
11
+ * 4. 持久性(Durability): 事务一旦提交,其结果就是永久性的
12
+ *
13
+ * 一致状态(Consistency)是指数据库在事务执行前后都必须满足预定的规则和约束条件,保持数据的完整性和有效性。
14
+ *
15
+ * 在 IndexedDB 中:
16
+ * - 所有数据操作都必须在事务中进行
17
+ * - 事务可以是只读或读写的
18
+ * - 事务有自动提交和回滚机制
19
+ * - 事务具有作用域,只能访问指定的对象仓库
20
+ *
21
+ * 基本概念:
22
+ * - Database: 数据库
23
+ * - ObjectStore: 对象仓库,类似于关系型数据库中的表
24
+ * - Index: 索引,用于加快数据检索
25
+ * - Transaction: 事务,确保数据操作的原子性
26
+ * - Cursor: 游标,用于遍历数据
27
+ *
28
+ * 主要 API:
29
+ * 1. 打开数据库:
30
+ * const request = indexedDB.open(dbName, version)
31
+ *
32
+ * 2. 创建对象仓库:
33
+ * db.createObjectStore(storeName, { keyPath: 'id' })
34
+ *
35
+ * 3. 事务操作:
36
+ * const transaction = db.transaction([storeName], 'readwrite')
37
+ * const store = transaction.objectStore(storeName)
38
+ *
39
+ * 4. 数据操作:
40
+ * - 添加: store.add(data)
41
+ * - 获取: store.get(key)
42
+ * - 更新: store.put(data)
43
+ * - 删除: store.delete(key)
44
+ *
45
+ * 5. 索引操作:
46
+ * - 创建: store.createIndex(indexName, keyPath)
47
+ * - 使用: store.index(indexName).get(value)
48
+ *
49
+ * KeyPath 说明:
50
+ * - keyPath 是对象仓库中用于唯一标识记录的属性路径
51
+ * - 它类似于关系型数据库中的主键(Primary Key)
52
+ * - keyPath 可以是:
53
+ * 1. 简单字符串: { keyPath: 'id' }
54
+ * 示例数据: { id: 1, name: 'file1' }
55
+ *
56
+ * 2. 点符号路径: { keyPath: 'user.id' }
57
+ * 示例数据: { user: { id: 1 }, name: 'file1' }
58
+ *
59
+ * 3. 数组路径: { keyPath: ['userId', 'timestamp'] }
60
+ * 示例数据: { userId: 1, timestamp: 123456, name: 'file1' }
61
+ *
62
+ * - 如果不指定 keyPath,可以使用自动生成的键:
63
+ * db.createObjectStore(storeName, { autoIncrement: true })
64
+ *
65
+ * - keyPath 的值必须是:
66
+ * - 唯一的
67
+ * - 非空的
68
+ * - 可以是数字、字符串或日期类型
69
+ * - 不能是数组或对象类型(除非是复合键)
70
+ */
71
+ const DATABASE_NAME = 'uploadStore';
72
+ let CURRENT_DATABASE_CONNECTION;
73
+ function updateUploadsDatabase(db) {
74
+ CURRENT_DATABASE_CONNECTION = db;
75
+ }
76
+
77
+ export { CURRENT_DATABASE_CONNECTION, DATABASE_NAME, updateUploadsDatabase };
@@ -0,0 +1,90 @@
1
+ import { DATABASE_NAME, updateUploadsDatabase, CURRENT_DATABASE_CONNECTION } from './index.js';
2
+ import { retrieveExistingData } from './retrieveExistingData.js';
3
+
4
+ /**
5
+ * IndexedDB 数据库操作说明:
6
+ *
7
+ * 1. 版本升级机制
8
+ * - 每个数据库都有一个版本号,用于管理数据库结构的变化
9
+ * - 当需要修改数据库结构(如添加/删除对象仓库)时,必须升级数据库版本
10
+ * - 版本号必须递增,不能降级或重用相同版本号
11
+ *
12
+ * 2. 升级流程
13
+ * - 首先关闭现有数据库连接
14
+ * - 使用新版本号打开数据库,触发 onupgradeneeded 事件
15
+ * - 在 onupgradeneeded 事件中进行数据库结构修改(这是唯一可以修改数据库结构的地方)
16
+ *
17
+ * 3. 注意事项
18
+ * - 升级过程中需要处理各种错误情况(如被阻塞、升级失败等)
19
+ * - 需要监听 versionchange 事件,确保数据库连接正确关闭
20
+ * - 建议在升级完成后重新检查对象仓库是否创建成功
21
+ *
22
+ * 4. 事件执行顺序
23
+ * - 当打开数据库时:
24
+ * a. 如果数据库不需要升级:直接触发 onsuccess
25
+ * b. 如果数据库需要升级:
26
+ * 1. 先触发 onupgradeneeded(在此事件中修改数据库结构)
27
+ * 2. 再触发 onsuccess(表示数据库打开成功)
28
+ * - 错误处理:
29
+ * - onerror:在任何阶段发生错误时触发
30
+ * - onblocked:当其他标签页正在使用旧版本数据库时触发
31
+ */
32
+ function openDBAndRetrieveData(storeName) {
33
+ return new Promise((resolve, reject) => {
34
+ if (CURRENT_DATABASE_CONNECTION) {
35
+ retrieveData(storeName);
36
+ }
37
+ else {
38
+ createDatabaseConnection(storeName);
39
+ }
40
+ function createDatabaseConnection(storeName) {
41
+ try {
42
+ const openRequest = window.indexedDB.open(DATABASE_NAME);
43
+ openRequest.onsuccess = () => {
44
+ updateUploadsDatabase(openRequest.result);
45
+ retrieveData(storeName);
46
+ };
47
+ openRequest.onerror = () => reject(Error(`打开数据库失败: ${openRequest.error}`));
48
+ openRequest.onblocked = () => reject(Error(`数据库被阻塞: ${openRequest.error}`));
49
+ openRequest.onupgradeneeded = () => console.info('openRequest.onupgradeneeded(SHOULD NOT BE CALLED)');
50
+ }
51
+ catch (ex) {
52
+ console.warn(`打开数据库时发生异常: ${ex.message}`, ex);
53
+ reject(ex);
54
+ }
55
+ }
56
+ function retrieveData(storeName) {
57
+ if (CURRENT_DATABASE_CONNECTION.objectStoreNames.contains(storeName)) {
58
+ retrieveExistingData(storeName).then(resolve).catch(reject);
59
+ }
60
+ else {
61
+ triggerDatabaseUpgrade(storeName);
62
+ }
63
+ }
64
+ function triggerDatabaseUpgrade(storeName) {
65
+ const newVersion = CURRENT_DATABASE_CONNECTION.version + 1;
66
+ CURRENT_DATABASE_CONNECTION.close();
67
+ const openRequest = window.indexedDB.open(DATABASE_NAME, newVersion);
68
+ openRequest.onerror = () => reject(Error(`打开数据库失败: ${openRequest.error}`));
69
+ openRequest.onblocked = () => reject(Error(`数据库被阻塞: ${openRequest.error}`));
70
+ openRequest.onsuccess = () => console.info('openRequest.onsuccess 在 triggerDatabaseUpgrade 中被触发');
71
+ openRequest.onupgradeneeded = () => {
72
+ updateUploadsDatabase(openRequest.result);
73
+ try {
74
+ openRequest.result.createObjectStore(storeName, {});
75
+ openRequest.result.onversionchange = (event) => {
76
+ if (event.newVersion === null) {
77
+ openRequest.result.close();
78
+ }
79
+ };
80
+ resolve([]);
81
+ }
82
+ catch (ex) {
83
+ reject(Error(`升级数据库异常: ${ex.message}`));
84
+ }
85
+ };
86
+ }
87
+ });
88
+ }
89
+
90
+ export { openDBAndRetrieveData };
@@ -0,0 +1,49 @@
1
+ import { CURRENT_DATABASE_CONNECTION } from './index.js';
2
+
3
+ /**
4
+ * IDBDatabase.transaction 使用说明:
5
+ * - 用于创建一个事务,以便在 IndexedDB 数据库中执行一系列的操作。
6
+ * - 语法: const transaction = db.transaction(storeNames, mode);
7
+ * - `storeNames`: 字符串或字符串数组,表示要访问的对象仓库名称。
8
+ * - `mode`: 事务模式,'readonly' 或 'readwrite',默认 'readonly'。
9
+ * - 事务模式:
10
+ * - `readonly`: 只能读取数据。
11
+ * - `readwrite`: 可以进行读写操作。
12
+ * - 注意:
13
+ * - 事务只能访问在创建时指定的对象仓库。
14
+ * - 事务在所有操作完成后会自动提交,失败则回滚。
15
+ * - 事务和请求都有各自的事件处理程序。
16
+ *
17
+ * objectStore.openCursor 使用说明:
18
+ * - 游标的遍历是异步的,使用事件驱动机制:
19
+ * - `onsuccess` 事件在游标初始化/游标成功移动到一条记录时触发。
20
+ * - 当游标指向一条记录时,可以访问该记录的 key 和 value。
21
+ * - 调用 cursor.continue() 会将游标移动到下一条记录,并再次触发 onsuccess 事件。
22
+ * - 这个过程会一直持续,直到游标遍历完所有记录。当游标遍历完所有记录时,`onsuccess` 事件中 `cursor.result` 为 `null`,此时解析 Promise。
23
+ */
24
+ function retrieveExistingData(storeName) {
25
+ return new Promise(function (resolve, reject) {
26
+ try {
27
+ const transaction = CURRENT_DATABASE_CONNECTION.transaction(storeName, 'readonly');
28
+ const objectStore = transaction.objectStore(storeName);
29
+ const files = [];
30
+ const cursor = objectStore.openCursor();
31
+ cursor.onsuccess = () => {
32
+ const cursorResult = cursor.result;
33
+ if (cursorResult) {
34
+ files.push(cursorResult.value);
35
+ cursorResult.continue();
36
+ }
37
+ else {
38
+ resolve(files);
39
+ }
40
+ };
41
+ cursor.onerror = () => console.warn(`retrieveExistingData 中游标操作失败 - 错误代码: ${cursor.error}`);
42
+ }
43
+ catch (ex) {
44
+ reject(Error(`retrieveExistingData 中执行事务或打开游标时发生异常 - ${ex.message}`));
45
+ }
46
+ });
47
+ }
48
+
49
+ export { retrieveExistingData };
@@ -0,0 +1,20 @@
1
+ var style = document.createElement('style');
2
+ style.textContent = `.zjlab-fe-data-hub-ui-modal .ant-modal-title,
3
+ .zjlab-fe-data-hub-ui-modal .ant-modal-confirm-title {
4
+ font-family: AlibabaPuHuiTi-3-65-Medium
5
+ }
6
+ .zjlab-fe-data-hub-ui-modal .ant-modal-title,
7
+ .zjlab-fe-data-hub-ui-modal .ant-modal-confirm-title {
8
+ font-size: 1.125rem;
9
+ line-height: 1.75rem
10
+ }
11
+ .zjlab-fe-data-hub-ui-modal .ant-modal-title,
12
+ .zjlab-fe-data-hub-ui-modal .ant-modal-confirm-title {
13
+ font-weight: 400
14
+ }
15
+ .zjlab-fe-data-hub-ui-modal .ant-modal-title,
16
+ .zjlab-fe-data-hub-ui-modal .ant-modal-confirm-title {
17
+ line-height: 1.5rem
18
+ }
19
+ `;
20
+ document.head.appendChild(style);
@@ -0,0 +1,32 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { Flex } from 'antd';
3
+
4
+ const confirmModalConfig = {
5
+ icon: null,
6
+ centered: true,
7
+ closable: true,
8
+ styles: {
9
+ mask: { backgroundColor: 'rgba(0, 0, 0, 0.6)' },
10
+ body: { marginTop: '24px', textAlign: 'center' },
11
+ content: { padding: '20px 20px 16px 20px', borderRadius: '10px' },
12
+ },
13
+ footer(originNode) {
14
+ return (jsx(Flex, { justify: "center", align: "center", children: originNode }));
15
+ },
16
+ className: 'zjlab-fe-data-hub-ui-modal',
17
+ };
18
+ const modalConfig = {
19
+ width: 600,
20
+ centered: true,
21
+ closable: true,
22
+ styles: {
23
+ body: { display: 'flow-root' },
24
+ footer: { textAlign: 'center' },
25
+ header: { marginBlockEnd: '16px' },
26
+ mask: { backgroundColor: 'rgba(0, 0, 0, 0.6)' },
27
+ content: { padding: '20px 20px 16px 20px', borderRadius: '10px' },
28
+ },
29
+ className: 'zjlab-fe-data-hub-ui-file-uploader zjlab-fe-data-hub-ui-modal',
30
+ };
31
+
32
+ export { confirmModalConfig, modalConfig };
@@ -0,0 +1,70 @@
1
+ import { __awaiter } from 'tslib';
2
+
3
+ /**
4
+ * 文件系统 API 中,FileSystemEntry 是表示文件系统中的条目(项目)的基础接口, 它可以是文件或目录,主要有两种类型的 Entry:
5
+ * 1. FileSystemFileEntry(文件条目)代表一个文件, 可以通过 file() 方法获取实际的 File 对象
6
+ * 2. FileSystemDirectoryEntry(目录条目)代表一个文件夹/目录, 可以包含其他文件或目录, 可以通过 createReader() 方法读取目录内容
7
+ */
8
+ function retrieveFilesFromEntry(item_1, directory_1, acceptList_1) {
9
+ return __awaiter(this, arguments, void 0, function* (item, directory, acceptList, fileNameWithLocation = '') {
10
+ if (isDirectoryEntry(item)) {
11
+ if (!directory)
12
+ return []; // 如果不允许处理目录,则返回空数组
13
+ return handleDirectory(item, acceptList);
14
+ }
15
+ if (isFileEntry(item)) {
16
+ if (item.name.includes('.DS_Store'))
17
+ return []; // 忽略 .DS_Store 文件
18
+ return handleFile(item, acceptList, fileNameWithLocation);
19
+ }
20
+ return []; // 如果既不是文件也不是目录,返回空数组,理论上不会执行
21
+ });
22
+ }
23
+ function handleDirectory(directory, acceptList) {
24
+ return __awaiter(this, void 0, void 0, function* () {
25
+ const entries = yield retrieveEntriesInDirectory(directory);
26
+ const filePromises = entries.map((entry) => retrieveFilesFromEntry(entry, true, acceptList, entry.fullPath));
27
+ const results = yield Promise.allSettled(filePromises);
28
+ return results
29
+ .filter((result) => result.status === 'fulfilled')
30
+ .flatMap((result) => result.value);
31
+ });
32
+ }
33
+ function retrieveEntriesInDirectory(directory) {
34
+ return new Promise((resolve, reject) => {
35
+ const reader = directory.createReader();
36
+ reader.readEntries(resolve, reject);
37
+ });
38
+ }
39
+ function handleFile(fileEntry, acceptList, fileNameWithLocation) {
40
+ return __awaiter(this, void 0, void 0, function* () {
41
+ const file = yield getFile(fileEntry);
42
+ if (!isAcceptableFile(file, acceptList)) {
43
+ return [];
44
+ }
45
+ return [formatFile(file, fileNameWithLocation)];
46
+ });
47
+ }
48
+ function getFile(fileEntry) {
49
+ return new Promise((resolve, reject) => {
50
+ fileEntry.file(resolve, reject);
51
+ });
52
+ }
53
+ function isAcceptableFile(file, acceptList) {
54
+ if (acceptList.size === 0)
55
+ return true; // 如果 acceptList 为空,接受所有文件
56
+ const extendName = file.name.split('.').pop() || '';
57
+ return acceptList.has(`.${extendName}`);
58
+ }
59
+ function formatFile(file, fileNameWithLocation) {
60
+ const blob = file.slice(0, file.size, file.type);
61
+ return new File([blob], fileNameWithLocation.slice(1) || file.name, { type: file.type });
62
+ }
63
+ function isDirectoryEntry(entry) {
64
+ return entry.isDirectory;
65
+ }
66
+ function isFileEntry(entry) {
67
+ return entry.isFile;
68
+ }
69
+
70
+ export { retrieveFilesFromEntry as retrieveAllFiles };
@@ -0,0 +1,15 @@
1
+ function splitFileIntoChunk(file) {
2
+ const { uploadUrls, chunkSize, raw } = file;
3
+ const fileSize = raw.size;
4
+ return uploadUrls.map(({ partNum, uploadUrl }) => {
5
+ const start = partNum * chunkSize;
6
+ const end = Math.min((partNum + 1) * chunkSize, fileSize);
7
+ const chunk = raw.slice(start, end);
8
+ return {
9
+ url: { partNum, uploadUrl },
10
+ chunk,
11
+ };
12
+ });
13
+ }
14
+
15
+ export { splitFileIntoChunk };
@@ -0,0 +1,8 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { documentLink, documentLinkAnchor } from './index.module.scss.js';
3
+
4
+ function DocumentationLink({ link, locale }) {
5
+ return (jsxs("span", { className: documentLink, children: [locale['documentPrefix'], jsx("a", { href: link, target: "_blank", rel: "noopener noreferrer", className: documentLinkAnchor, children: locale['documentLinkText'] })] }));
6
+ }
7
+
8
+ export { DocumentationLink as default };
@@ -0,0 +1,25 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { createRoot } from 'react-dom/client';
3
+ import InnerModal from './inner-modal.js';
4
+
5
+ function showSDKModal(config) {
6
+ const container = document.createElement('div');
7
+ document.body.appendChild(container);
8
+ let root = createRoot(container);
9
+ const destroy = () => {
10
+ var _a;
11
+ (_a = config.onClose) === null || _a === void 0 ? void 0 : _a.call(config);
12
+ root === null || root === void 0 ? void 0 : root.unmount();
13
+ root = null;
14
+ container.remove();
15
+ };
16
+ root.render(jsx(InnerModal, { open: true, onClose: destroy, SDKCode: config.SDKCode, loadSDK: config.loadSDK, title: config.title, subTitle: config.subTitle, modalConfig: config.modalConfig, documentLink: config.documentLink, locale: config.locale }));
17
+ return { destroy };
18
+ }
19
+ function SDKModalComponent(props) {
20
+ return jsx(InnerModal, Object.assign({}, props));
21
+ }
22
+ const SDKModal = SDKModalComponent;
23
+ SDKModal.show = showSDKModal;
24
+
25
+ export { SDKModal as default, showSDKModal };
@@ -0,0 +1,49 @@
1
+ var style = document.createElement('style');
2
+ style.textContent = `.index-module__modal___P--8v .ant-modal-title {
3
+ font-size: 18px;
4
+ line-height: 24px;
5
+ font-family: "AlibabaPuHuiTi-3-65-Medium";
6
+ font-weight: 400;
7
+ }
8
+
9
+ .index-module__codeBlock___QOg38 {
10
+ padding: 16px;
11
+ border-radius: 4px;
12
+ margin: 8px 0;
13
+ position: relative;
14
+ min-height: 56px;
15
+ background-color: #f3f4f6 !important;
16
+ box-shadow: inset 0 2px 4px 0 rgba(0, 0, 0, 0.05);
17
+ }
18
+
19
+ .index-module__loading___JWS7C {
20
+ width: 100%;
21
+ }
22
+
23
+ .index-module__errorText___YBeKO {
24
+ color: #f43f5e;
25
+ }
26
+
27
+ .index-module__codeContent___BmCSu {
28
+ max-width: 41rem;
29
+ }
30
+
31
+ .index-module__documentLink___PX-ly {
32
+ display: block;
33
+ margin-top: 8px;
34
+ font-size: 14px;
35
+ line-height: 20px;
36
+ }
37
+
38
+ .index-module__documentLinkAnchor___HAHYt {
39
+ margin-left: 4px;
40
+ color: #1775fe;
41
+ }
42
+
43
+ .index-module__documentLinkAnchor___HAHYt:hover {
44
+ color: #1775fe;
45
+ }`;
46
+ document.head.appendChild(style);
47
+ var codeBlock = "index-module__codeBlock___QOg38";var loading = "index-module__loading___JWS7C";var errorText = "index-module__errorText___YBeKO";var codeContent = "index-module__codeContent___BmCSu";var documentLink = "index-module__documentLink___PX-ly";var documentLinkAnchor = "index-module__documentLinkAnchor___HAHYt";
48
+
49
+ export { codeBlock, codeContent, documentLink, documentLinkAnchor, errorText, loading };
@@ -0,0 +1,59 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { Modal, Spin, Flex, Button } from 'antd';
3
+ import { memo, useState, useEffect } from 'react';
4
+ import classNames from 'classnames';
5
+ import Copy from '../copy/index.js';
6
+ import DocumentationLink from './document-link.js';
7
+ import { getLocale } from './locale/translations.js';
8
+ import { codeBlock, loading, errorText, codeContent } from './index.module.scss.js';
9
+
10
+ const defaultModalConfig = {
11
+ width: 600,
12
+ centered: true,
13
+ closable: true,
14
+ styles: {
15
+ body: { display: 'flow-root' },
16
+ footer: { textAlign: 'center' },
17
+ header: { marginBlockEnd: '16px' },
18
+ mask: { backgroundColor: 'rgba(0, 0, 0, 0.6)' },
19
+ content: { padding: '20px 20px 16px 20px', borderRadius: '10px' },
20
+ },
21
+ };
22
+ var InnerModal = memo(function InnerModal({ open, onClose, SDKCode, loadSDK, title, subTitle, modalConfig, documentLink, locale, }) {
23
+ const [code, setCode] = useState('');
24
+ const [loading$1, setLoading] = useState(false);
25
+ const [error, setError] = useState('');
26
+ const resolvedLocale = getLocale(locale);
27
+ useEffect(() => {
28
+ if (!open) {
29
+ setCode('');
30
+ setError('');
31
+ setLoading(false);
32
+ return;
33
+ }
34
+ if (SDKCode !== undefined) {
35
+ setCode(SDKCode);
36
+ return;
37
+ }
38
+ if (loadSDK) {
39
+ setCode('');
40
+ setError('');
41
+ setLoading(true);
42
+ loadSDK()
43
+ .then((result) => {
44
+ setCode(result);
45
+ })
46
+ .catch((err) => {
47
+ var _a;
48
+ setError((_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : String(err));
49
+ })
50
+ .finally(() => {
51
+ setLoading(false);
52
+ });
53
+ }
54
+ }, [open, SDKCode, loadSDK]);
55
+ const mergedConfig = Object.assign(Object.assign({}, defaultModalConfig), modalConfig);
56
+ return (jsxs(Modal, Object.assign({}, mergedConfig, { open: open, title: title, onCancel: onClose, footer: jsx(Button, { type: "primary", onClick: onClose, children: resolvedLocale['confirm'] }), children: [subTitle && jsx("div", { children: subTitle }), jsx(Spin, { spinning: loading$1, className: classNames(codeBlock, loading) }), !loading$1 && (jsx(Flex, { align: "start", justify: "space-between", className: codeBlock, children: error ? (jsx("span", { className: errorText, children: error })) : (jsxs(Fragment, { children: [jsx("div", { className: codeContent, dangerouslySetInnerHTML: { __html: code.replace(/\n/g, '<br>') } }), jsx(Copy, { text: code, showFeedback: true })] })) })), documentLink && jsx(DocumentationLink, { link: documentLink, locale: resolvedLocale })] })));
57
+ });
58
+
59
+ export { InnerModal as default };
@@ -0,0 +1,17 @@
1
+ const localeMap = {
2
+ zh: {
3
+ confirm: '知道了',
4
+ documentPrefix: '详细操作请参考',
5
+ documentLinkText: '使用文档',
6
+ },
7
+ en: {
8
+ confirm: 'Got it',
9
+ documentPrefix: 'For more details, see',
10
+ documentLinkText: 'Documentation',
11
+ },
12
+ };
13
+ function getLocale(lang = 'zh') {
14
+ return localeMap[lang];
15
+ }
16
+
17
+ export { getLocale };
@@ -0,0 +1,53 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Flex, Button, Modal } from 'antd';
3
+ import { noModalWrap, title, content, footer, permModal, permFunModal } from './index.module.scss.js';
4
+ import { isPublicNetwork } from '@zjlab-fe/util';
5
+
6
+ const okText = {
7
+ zh: '申请',
8
+ en: 'Apply',
9
+ };
10
+ const cancelText = {
11
+ zh: '取消',
12
+ en: 'Cancel',
13
+ };
14
+ const titleText = {
15
+ zh: '提示',
16
+ en: 'Notice',
17
+ };
18
+ const contentText = {
19
+ zh: '抱歉,您没有此功能权限,请点击申请',
20
+ en: 'Sorry, you do not have permission to use this function, please click apply',
21
+ };
22
+ const applyUrl = (isPublic) => isPublic
23
+ ? 'https://alidocs.dingtalk.com/notable/share/form/v01ZWGl05mv1P2a0n34_dv19yqvsgs3oebp3pcjys_1qX0QQ0'
24
+ : 'https://alidocs.dingtalk.com/notable/share/form/v01Q35O8510LgZgBl9V_dv19yqvsgs3oebp3pcjys_1qX0QQ0';
25
+ /**
26
+ * 申请权限弹窗
27
+ * @param locale {string} 语言 'zh' | 'en',默认zh
28
+ * @param open {boolean} 是否展示弹窗
29
+ * @param noModal {boolean} 是否以非弹窗形式展示
30
+ * @param onCancel {function} 取消回调
31
+ * @returns
32
+ */
33
+ function ApplyPermModal(props) {
34
+ const { locale = 'zh', noModal = false } = props;
35
+ const handleApply = () => window.open(applyUrl(isPublicNetwork()), '_blank');
36
+ if (noModal) {
37
+ return (jsxs(Flex, { vertical: true, align: "center", gap: 8, className: noModalWrap, children: [jsx("div", { className: title, children: titleText[locale] }), jsx("div", { className: content, children: contentText[locale] }), jsx(Flex, { className: footer, children: jsx(Button, { type: "primary", onClick: handleApply, children: okText[locale] }) })] }));
38
+ }
39
+ return (jsx(Modal, Object.assign({}, props, { title: titleText[locale], onOk: handleApply, okText: okText[locale], cancelText: cancelText[locale], wrapClassName: permModal, width: 400, children: contentText[locale] })));
40
+ }
41
+ ApplyPermModal.confirm = (props) => {
42
+ const { locale = 'zh' } = props || {};
43
+ const handleApply = () => window.open(applyUrl(isPublicNetwork()), '_blank');
44
+ const modal = Modal.confirm(Object.assign(Object.assign({}, props), { open: true, title: titleText[locale], content: contentText[locale], onOk: handleApply, okText: okText[locale], cancelText: cancelText[locale] }));
45
+ modal.update({
46
+ icon: null,
47
+ closable: true,
48
+ width: 400,
49
+ wrapClassName: `${permFunModal}`,
50
+ });
51
+ };
52
+
53
+ export { ApplyPermModal as default };