@hkyhy/marsun-components-core 0.1.18 → 0.1.19

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 (145) hide show
  1. package/dist/components/Auth/ProtectedRoute.js +20 -14
  2. package/dist/components/Auth/ProtectedRoute.js.map +1 -1
  3. package/dist/components/File/index.d.ts +2 -0
  4. package/dist/components/File/utils/download.d.ts +20 -0
  5. package/dist/components/File/utils/download.js +30 -0
  6. package/dist/components/File/utils/download.js.map +1 -0
  7. package/dist/components/Filter/types.d.ts +1 -0
  8. package/dist/components/Filter/types.js.map +1 -1
  9. package/dist/index.d.ts +14 -0
  10. package/dist/index.js +361 -298
  11. package/dist/index.js.map +1 -1
  12. package/dist/node_modules/axios/index.js +41 -0
  13. package/dist/node_modules/axios/index.js.map +1 -0
  14. package/dist/node_modules/axios/lib/adapters/adapters.js +66 -0
  15. package/dist/node_modules/axios/lib/adapters/adapters.js.map +1 -0
  16. package/dist/node_modules/axios/lib/adapters/fetch.js +324 -0
  17. package/dist/node_modules/axios/lib/adapters/fetch.js.map +1 -0
  18. package/dist/node_modules/axios/lib/adapters/xhr.js +86 -0
  19. package/dist/node_modules/axios/lib/adapters/xhr.js.map +1 -0
  20. package/dist/node_modules/axios/lib/axios.js +47 -0
  21. package/dist/node_modules/axios/lib/axios.js.map +1 -0
  22. package/dist/node_modules/axios/lib/cancel/CancelToken.js +78 -0
  23. package/dist/node_modules/axios/lib/cancel/CancelToken.js.map +1 -0
  24. package/dist/node_modules/axios/lib/cancel/CanceledError.js +19 -0
  25. package/dist/node_modules/axios/lib/cancel/CanceledError.js.map +1 -0
  26. package/dist/node_modules/axios/lib/cancel/isCancel.js +7 -0
  27. package/dist/node_modules/axios/lib/cancel/isCancel.js.map +1 -0
  28. package/dist/node_modules/axios/lib/core/Axios.js +168 -0
  29. package/dist/node_modules/axios/lib/core/Axios.js.map +1 -0
  30. package/dist/node_modules/axios/lib/core/AxiosError.js +110 -0
  31. package/dist/node_modules/axios/lib/core/AxiosError.js.map +1 -0
  32. package/dist/node_modules/axios/lib/core/AxiosHeaders.js +193 -0
  33. package/dist/node_modules/axios/lib/core/AxiosHeaders.js.map +1 -0
  34. package/dist/node_modules/axios/lib/core/InterceptorManager.js +60 -0
  35. package/dist/node_modules/axios/lib/core/InterceptorManager.js.map +1 -0
  36. package/dist/node_modules/axios/lib/core/buildFullPath.js +30 -0
  37. package/dist/node_modules/axios/lib/core/buildFullPath.js.map +1 -0
  38. package/dist/node_modules/axios/lib/core/dispatchRequest.js +43 -0
  39. package/dist/node_modules/axios/lib/core/dispatchRequest.js.map +1 -0
  40. package/dist/node_modules/axios/lib/core/mergeConfig.js +94 -0
  41. package/dist/node_modules/axios/lib/core/mergeConfig.js.map +1 -0
  42. package/dist/node_modules/axios/lib/core/settle.js +15 -0
  43. package/dist/node_modules/axios/lib/core/settle.js.map +1 -0
  44. package/dist/node_modules/axios/lib/core/transformData.js +14 -0
  45. package/dist/node_modules/axios/lib/core/transformData.js.map +1 -0
  46. package/dist/node_modules/axios/lib/defaults/index.js +96 -0
  47. package/dist/node_modules/axios/lib/defaults/index.js.map +1 -0
  48. package/dist/node_modules/axios/lib/defaults/transitional.js +12 -0
  49. package/dist/node_modules/axios/lib/defaults/transitional.js.map +1 -0
  50. package/dist/node_modules/axios/lib/env/data.js +5 -0
  51. package/dist/node_modules/axios/lib/env/data.js.map +1 -0
  52. package/dist/node_modules/axios/lib/helpers/AxiosURLSearchParams.js +31 -0
  53. package/dist/node_modules/axios/lib/helpers/AxiosURLSearchParams.js.map +1 -0
  54. package/dist/node_modules/axios/lib/helpers/HttpStatusCode.js +78 -0
  55. package/dist/node_modules/axios/lib/helpers/HttpStatusCode.js.map +1 -0
  56. package/dist/node_modules/axios/lib/helpers/bind.js +9 -0
  57. package/dist/node_modules/axios/lib/helpers/bind.js.map +1 -0
  58. package/dist/node_modules/axios/lib/helpers/buildURL.js +24 -0
  59. package/dist/node_modules/axios/lib/helpers/buildURL.js.map +1 -0
  60. package/dist/node_modules/axios/lib/helpers/combineURLs.js +7 -0
  61. package/dist/node_modules/axios/lib/helpers/combineURLs.js.map +1 -0
  62. package/dist/node_modules/axios/lib/helpers/composeSignals.js +33 -0
  63. package/dist/node_modules/axios/lib/helpers/composeSignals.js.map +1 -0
  64. package/dist/node_modules/axios/lib/helpers/cookies.js +44 -0
  65. package/dist/node_modules/axios/lib/helpers/cookies.js.map +1 -0
  66. package/dist/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +43 -0
  67. package/dist/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js.map +1 -0
  68. package/dist/node_modules/axios/lib/helpers/formDataToJSON.js +47 -0
  69. package/dist/node_modules/axios/lib/helpers/formDataToJSON.js.map +1 -0
  70. package/dist/node_modules/axios/lib/helpers/isAbsoluteURL.js +7 -0
  71. package/dist/node_modules/axios/lib/helpers/isAbsoluteURL.js.map +1 -0
  72. package/dist/node_modules/axios/lib/helpers/isAxiosError.js +8 -0
  73. package/dist/node_modules/axios/lib/helpers/isAxiosError.js.map +1 -0
  74. package/dist/node_modules/axios/lib/helpers/isURLSameOrigin.js +9 -0
  75. package/dist/node_modules/axios/lib/helpers/isURLSameOrigin.js.map +1 -0
  76. package/dist/node_modules/axios/lib/helpers/null.js +5 -0
  77. package/dist/node_modules/axios/lib/helpers/null.js.map +1 -0
  78. package/dist/node_modules/axios/lib/helpers/parseHeaders.js +31 -0
  79. package/dist/node_modules/axios/lib/helpers/parseHeaders.js.map +1 -0
  80. package/dist/node_modules/axios/lib/helpers/parseProtocol.js +8 -0
  81. package/dist/node_modules/axios/lib/helpers/parseProtocol.js.map +1 -0
  82. package/dist/node_modules/axios/lib/helpers/progressEventReducer.js +41 -0
  83. package/dist/node_modules/axios/lib/helpers/progressEventReducer.js.map +1 -0
  84. package/dist/node_modules/axios/lib/helpers/resolveConfig.js +54 -0
  85. package/dist/node_modules/axios/lib/helpers/resolveConfig.js.map +1 -0
  86. package/dist/node_modules/axios/lib/helpers/sanitizeHeaderValue.js +34 -0
  87. package/dist/node_modules/axios/lib/helpers/sanitizeHeaderValue.js.map +1 -0
  88. package/dist/node_modules/axios/lib/helpers/speedometer.js +20 -0
  89. package/dist/node_modules/axios/lib/helpers/speedometer.js.map +1 -0
  90. package/dist/node_modules/axios/lib/helpers/spread.js +9 -0
  91. package/dist/node_modules/axios/lib/helpers/spread.js.map +1 -0
  92. package/dist/node_modules/axios/lib/helpers/throttle.js +16 -0
  93. package/dist/node_modules/axios/lib/helpers/throttle.js.map +1 -0
  94. package/dist/node_modules/axios/lib/helpers/toFormData.js +115 -0
  95. package/dist/node_modules/axios/lib/helpers/toFormData.js.map +1 -0
  96. package/dist/node_modules/axios/lib/helpers/toURLEncodedForm.js +15 -0
  97. package/dist/node_modules/axios/lib/helpers/toURLEncodedForm.js.map +1 -0
  98. package/dist/node_modules/axios/lib/helpers/trackStream.js +67 -0
  99. package/dist/node_modules/axios/lib/helpers/trackStream.js.map +1 -0
  100. package/dist/node_modules/axios/lib/helpers/validator.js +58 -0
  101. package/dist/node_modules/axios/lib/helpers/validator.js.map +1 -0
  102. package/dist/node_modules/axios/lib/platform/browser/classes/Blob.js +5 -0
  103. package/dist/node_modules/axios/lib/platform/browser/classes/Blob.js.map +1 -0
  104. package/dist/node_modules/axios/lib/platform/browser/classes/FormData.js +5 -0
  105. package/dist/node_modules/axios/lib/platform/browser/classes/FormData.js.map +1 -0
  106. package/dist/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js +6 -0
  107. package/dist/node_modules/axios/lib/platform/browser/classes/URLSearchParams.js.map +1 -0
  108. package/dist/node_modules/axios/lib/platform/browser/index.js +16 -0
  109. package/dist/node_modules/axios/lib/platform/browser/index.js.map +1 -0
  110. package/dist/node_modules/axios/lib/platform/common/utils.js +10 -0
  111. package/dist/node_modules/axios/lib/platform/common/utils.js.map +1 -0
  112. package/dist/node_modules/axios/lib/platform/index.js +10 -0
  113. package/dist/node_modules/axios/lib/platform/index.js.map +1 -0
  114. package/dist/node_modules/axios/lib/utils.js +303 -0
  115. package/dist/node_modules/axios/lib/utils.js.map +1 -0
  116. package/dist/types/auth.d.ts +18 -0
  117. package/dist/utils/authRedirect.d.ts +6 -0
  118. package/dist/utils/authRedirect.js +33 -0
  119. package/dist/utils/authRedirect.js.map +1 -0
  120. package/dist/utils/createMarsunRequest.d.ts +26 -0
  121. package/dist/utils/createMarsunRequest.js +53 -0
  122. package/dist/utils/createMarsunRequest.js.map +1 -0
  123. package/dist/utils/date.d.ts +4 -0
  124. package/dist/utils/date.js +11 -0
  125. package/dist/utils/date.js.map +1 -0
  126. package/dist/utils/department/departmentPath.d.ts +18 -0
  127. package/dist/utils/department/departmentPath.js +63 -0
  128. package/dist/utils/department/departmentPath.js.map +1 -0
  129. package/dist/utils/department/departmentScope.d.ts +20 -0
  130. package/dist/utils/department/departmentScope.js +63 -0
  131. package/dist/utils/department/departmentScope.js.map +1 -0
  132. package/dist/utils/department/types.d.ts +12 -0
  133. package/dist/utils/permissionStorage.d.ts +13 -0
  134. package/dist/utils/permissionStorage.js +43 -0
  135. package/dist/utils/permissionStorage.js.map +1 -0
  136. package/dist/utils/personOption.d.ts +49 -0
  137. package/dist/utils/personOption.js +90 -0
  138. package/dist/utils/personOption.js.map +1 -0
  139. package/dist/utils/sessionActivity.d.ts +5 -0
  140. package/dist/utils/sessionActivity.js +18 -0
  141. package/dist/utils/sessionActivity.js.map +1 -0
  142. package/dist/utils/user/employeeId.d.ts +8 -0
  143. package/dist/utils/user/employeeId.js +14 -0
  144. package/dist/utils/user/employeeId.js.map +1 -0
  145. package/package.json +24 -1
@@ -1,21 +1,27 @@
1
1
  import { jsx as t, Fragment as f } from "react/jsx-runtime";
2
- import { useLocation as $, Navigate as c } from "react-router-dom";
3
- import { useMarsunAuth as g } from "../../provider/context.js";
4
- const x = ({
5
- roles: e,
6
- permission: u,
7
- loginPath: i = "/login",
2
+ import { buildLoginPath as d, buildLocationRedirectUrl as g } from "../../utils/authRedirect.js";
3
+ import { useLocation as h, Navigate as i } from "react-router-dom";
4
+ import { useMarsunAuth as l } from "../../provider/context.js";
5
+ const j = ({
6
+ roles: r,
7
+ permission: n,
8
+ loginPath: c = "/login",
8
9
  fallbackPath: a = "/",
9
- children: p
10
+ children: m
10
11
  }) => {
11
- const { isAuthenticated: m, hasAnyRole: r, hasPermission: o } = g(), n = $();
12
- if (!m) {
13
- const d = encodeURIComponent(`${n.pathname}${n.search}${n.hash}`);
14
- return /* @__PURE__ */ t(c, { to: `${i}?redirect=${d}`, replace: !0 });
15
- }
16
- return e && e.length > 0 && !(r != null && r(e)) ? /* @__PURE__ */ t(c, { to: a, replace: !0 }) : u && !(o != null && o(u)) ? /* @__PURE__ */ t(c, { to: a, replace: !0 }) : /* @__PURE__ */ t(f, { children: p });
12
+ const { isAuthenticated: p, hasAnyRole: e, hasPermission: o } = l(), u = h();
13
+ return p ? r && r.length > 0 && !(e != null && e(r)) ? /* @__PURE__ */ t(i, { to: a, replace: !0 }) : n && !(o != null && o(n)) ? /* @__PURE__ */ t(i, { to: a, replace: !0 }) : /* @__PURE__ */ t(f, { children: m }) : /* @__PURE__ */ t(
14
+ i,
15
+ {
16
+ to: d(
17
+ g(u.pathname, u.search, u.hash),
18
+ c
19
+ ),
20
+ replace: !0
21
+ }
22
+ );
17
23
  };
18
24
  export {
19
- x as default
25
+ j as default
20
26
  };
21
27
  //# sourceMappingURL=ProtectedRoute.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProtectedRoute.js","sources":["../../../src/components/Auth/ProtectedRoute.tsx"],"sourcesContent":["import { useMarsunAuth } from '@/provider';\nimport React from 'react';\nimport { Navigate, useLocation } from 'react-router-dom';\n\nexport interface ProtectedRouteProps {\n roles?: string[];\n permission?: string;\n loginPath?: string;\n fallbackPath?: string;\n children: React.ReactNode;\n}\n\nconst ProtectedRoute: React.FC<ProtectedRouteProps> = ({\n roles,\n permission,\n loginPath = '/login',\n fallbackPath = '/',\n children,\n}) => {\n const { isAuthenticated, hasAnyRole, hasPermission } = useMarsunAuth();\n const location = useLocation();\n\n if (!isAuthenticated) {\n const redirect = encodeURIComponent(`${location.pathname}${location.search}${location.hash}`);\n return <Navigate to={`${loginPath}?redirect=${redirect}`} replace />;\n }\n\n if (roles && roles.length > 0 && !hasAnyRole?.(roles)) {\n return <Navigate to={fallbackPath} replace />;\n }\n\n if (permission && !hasPermission?.(permission)) {\n return <Navigate to={fallbackPath} replace />;\n }\n\n return <>{children}</>;\n};\n\nexport default ProtectedRoute;\n"],"names":["ProtectedRoute","roles","permission","loginPath","fallbackPath","children","isAuthenticated","hasAnyRole","hasPermission","useMarsunAuth","location","useLocation","redirect","jsx","Navigate"],"mappings":";;;AAYA,MAAMA,IAAgD,CAAC;AAAA,EACrD,OAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,cAAAC,IAAe;AAAA,EACf,UAAAC;AACF,MAAM;AACJ,QAAM,EAAE,iBAAAC,GAAiB,YAAAC,GAAY,eAAAC,EAAA,IAAkBC,EAAA,GACjDC,IAAWC,EAAA;AAEjB,MAAI,CAACL,GAAiB;AACpB,UAAMM,IAAW,mBAAmB,GAAGF,EAAS,QAAQ,GAAGA,EAAS,MAAM,GAAGA,EAAS,IAAI,EAAE;AAC5F,WAAO,gBAAAG,EAACC,KAAS,IAAI,GAAGX,CAAS,aAAaS,CAAQ,IAAI,SAAO,GAAA,CAAC;AAAA,EACpE;AAEA,SAAIX,KAASA,EAAM,SAAS,KAAK,EAACM,KAAA,QAAAA,EAAaN,MACtC,gBAAAY,EAACC,GAAA,EAAS,IAAIV,GAAc,SAAO,IAAC,IAGzCF,KAAc,EAACM,KAAA,QAAAA,EAAgBN,MAC1B,gBAAAW,EAACC,GAAA,EAAS,IAAIV,GAAc,SAAO,IAAC,2BAGnC,UAAAC,GAAS;AACrB;"}
1
+ {"version":3,"file":"ProtectedRoute.js","sources":["../../../src/components/Auth/ProtectedRoute.tsx"],"sourcesContent":["import { useMarsunAuth } from '@/provider';\nimport { buildLocationRedirectUrl, buildLoginPath } from '@/utils/authRedirect';\nimport React from 'react';\nimport { Navigate, useLocation } from 'react-router-dom';\n\nexport interface ProtectedRouteProps {\n roles?: string[];\n permission?: string;\n loginPath?: string;\n fallbackPath?: string;\n children: React.ReactNode;\n}\n\nconst ProtectedRoute: React.FC<ProtectedRouteProps> = ({\n roles,\n permission,\n loginPath = '/login',\n fallbackPath = '/',\n children,\n}) => {\n const { isAuthenticated, hasAnyRole, hasPermission } = useMarsunAuth();\n const location = useLocation();\n\n if (!isAuthenticated) {\n return (\n <Navigate\n to={buildLoginPath(\n buildLocationRedirectUrl(location.pathname, location.search, location.hash),\n loginPath,\n )}\n replace\n />\n );\n }\n\n if (roles && roles.length > 0 && !hasAnyRole?.(roles)) {\n return <Navigate to={fallbackPath} replace />;\n }\n\n if (permission && !hasPermission?.(permission)) {\n return <Navigate to={fallbackPath} replace />;\n }\n\n return <>{children}</>;\n};\n\nexport default ProtectedRoute;\n"],"names":["ProtectedRoute","roles","permission","loginPath","fallbackPath","children","isAuthenticated","hasAnyRole","hasPermission","useMarsunAuth","location","useLocation","jsx","Navigate","buildLoginPath","buildLocationRedirectUrl"],"mappings":";;;;AAaA,MAAMA,IAAgD,CAAC;AAAA,EACrD,OAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,cAAAC,IAAe;AAAA,EACf,UAAAC;AACF,MAAM;AACJ,QAAM,EAAE,iBAAAC,GAAiB,YAAAC,GAAY,eAAAC,EAAA,IAAkBC,EAAA,GACjDC,IAAWC,EAAA;AAEjB,SAAKL,IAYDL,KAASA,EAAM,SAAS,KAAK,EAACM,KAAA,QAAAA,EAAaN,MACtC,gBAAAW,EAACC,GAAA,EAAS,IAAIT,GAAc,SAAO,IAAC,IAGzCF,KAAc,EAACM,KAAA,QAAAA,EAAgBN,MAC1B,gBAAAU,EAACC,GAAA,EAAS,IAAIT,GAAc,SAAO,IAAC,2BAGnC,UAAAC,GAAS,IAlBf,gBAAAO;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,IAAIC;AAAA,QACFC,EAAyBL,EAAS,UAAUA,EAAS,QAAQA,EAAS,IAAI;AAAA,QAC1EP;AAAA,MAAA;AAAA,MAEF,SAAO;AAAA,IAAA;AAAA,EAAA;AAcf;"}
@@ -10,3 +10,5 @@ export { default as FilePreviewModal } from './FilePreviewModal';
10
10
  export type { FilePreviewModalProps } from './FilePreviewModal';
11
11
  export { default as FilePreviewLink } from './FilePreviewLink';
12
12
  export type { FilePreviewLinkProps } from './FilePreviewLink';
13
+ export { downloadFileItem, getFileDownloadAuthHeaders, getFileDownloadUrl } from './utils/download';
14
+ export type { FileDownloadAuthOptions, FileDownloadOptions } from './utils/download';
@@ -0,0 +1,20 @@
1
+ export interface FileDownloadOptions {
2
+ preview?: boolean;
3
+ token?: string | null;
4
+ /** API 前缀,默认 /api */
5
+ apiPrefix?: string;
6
+ }
7
+ export interface FileDownloadAuthOptions {
8
+ getToken?: () => string | null;
9
+ apiPrefix?: string;
10
+ }
11
+ /** 带鉴权参数的文件下载 URL(用于新窗口打开、iframe 等场景) */
12
+ export declare function getFileDownloadUrl(fileId: string, options?: FileDownloadOptions & {
13
+ getToken?: () => string | null;
14
+ }): string;
15
+ export declare function getFileDownloadAuthHeaders(getToken?: () => string | null): HeadersInit | undefined;
16
+ /** 通过 fetch 鉴权后触发浏览器下载 */
17
+ export declare function downloadFileItem(file: {
18
+ id: string;
19
+ name: string;
20
+ }, options?: FileDownloadAuthOptions): Promise<boolean>;
@@ -0,0 +1,30 @@
1
+ function t(r, e) {
2
+ var a;
3
+ const f = (e == null ? void 0 : e.apiPrefix) ?? "/api", c = (e == null ? void 0 : e.token) === void 0 ? ((a = e == null ? void 0 : e.getToken) == null ? void 0 : a.call(e)) ?? null : e.token, d = new URLSearchParams();
4
+ c && d.set("token", c), e != null && e.preview && d.set("preview", "1");
5
+ const l = d.toString();
6
+ return `${f}/files/${r}/download${l ? `?${l}` : ""}`;
7
+ }
8
+ function u(r) {
9
+ const e = r == null ? void 0 : r();
10
+ return e ? { Authorization: `Bearer ${e}` } : void 0;
11
+ }
12
+ async function w(r, e) {
13
+ const f = (e == null ? void 0 : e.apiPrefix) ?? "/api";
14
+ try {
15
+ const c = await fetch(`${f}/files/${r.id}/download`, {
16
+ headers: u(e == null ? void 0 : e.getToken)
17
+ });
18
+ if (!c.ok) return !1;
19
+ const d = await c.blob(), l = URL.createObjectURL(d), a = document.createElement("a");
20
+ return a.href = l, a.download = r.name, document.body.appendChild(a), a.click(), document.body.removeChild(a), URL.revokeObjectURL(l), !0;
21
+ } catch {
22
+ return !1;
23
+ }
24
+ }
25
+ export {
26
+ w as downloadFileItem,
27
+ u as getFileDownloadAuthHeaders,
28
+ t as getFileDownloadUrl
29
+ };
30
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sources":["../../../../src/components/File/utils/download.ts"],"sourcesContent":["export interface FileDownloadOptions {\n preview?: boolean;\n token?: string | null;\n /** API 前缀,默认 /api */\n apiPrefix?: string;\n}\n\nexport interface FileDownloadAuthOptions {\n getToken?: () => string | null;\n apiPrefix?: string;\n}\n\n/** 带鉴权参数的文件下载 URL(用于新窗口打开、iframe 等场景) */\nexport function getFileDownloadUrl(\n fileId: string,\n options?: FileDownloadOptions & { getToken?: () => string | null },\n): string {\n const apiPrefix = options?.apiPrefix ?? '/api';\n const token = options?.token === undefined ? (options?.getToken?.() ?? null) : options.token;\n const params = new URLSearchParams();\n if (token) params.set('token', token);\n if (options?.preview) params.set('preview', '1');\n const qs = params.toString();\n return `${apiPrefix}/files/${fileId}/download${qs ? `?${qs}` : ''}`;\n}\n\nexport function getFileDownloadAuthHeaders(\n getToken?: () => string | null,\n): HeadersInit | undefined {\n const token = getToken?.();\n return token ? { Authorization: `Bearer ${token}` } : undefined;\n}\n\n/** 通过 fetch 鉴权后触发浏览器下载 */\nexport async function downloadFileItem(\n file: { id: string; name: string },\n options?: FileDownloadAuthOptions,\n): Promise<boolean> {\n const apiPrefix = options?.apiPrefix ?? '/api';\n try {\n const res = await fetch(`${apiPrefix}/files/${file.id}/download`, {\n headers: getFileDownloadAuthHeaders(options?.getToken),\n });\n if (!res.ok) return false;\n\n const blob = await res.blob();\n const blobUrl = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = blobUrl;\n anchor.download = file.name;\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n URL.revokeObjectURL(blobUrl);\n return true;\n } catch {\n return false;\n }\n}\n"],"names":["getFileDownloadUrl","fileId","options","_a","apiPrefix","token","params","qs","getFileDownloadAuthHeaders","getToken","downloadFileItem","file","res","blob","blobUrl","anchor"],"mappings":"AAaO,SAASA,EACdC,GACAC,GACQ;AAHH,MAAAC;AAIL,QAAMC,KAAYF,KAAA,gBAAAA,EAAS,cAAa,QAClCG,KAAQH,KAAA,gBAAAA,EAAS,WAAU,WAAaC,IAAAD,KAAA,gBAAAA,EAAS,aAAT,gBAAAC,EAAA,KAAAD,OAAyB,OAAQA,EAAQ,OACjFI,IAAS,IAAI,gBAAA;AACnB,EAAID,KAAOC,EAAO,IAAI,SAASD,CAAK,GAChCH,KAAA,QAAAA,EAAS,WAASI,EAAO,IAAI,WAAW,GAAG;AAC/C,QAAMC,IAAKD,EAAO,SAAA;AAClB,SAAO,GAAGF,CAAS,UAAUH,CAAM,YAAYM,IAAK,IAAIA,CAAE,KAAK,EAAE;AACnE;AAEO,SAASC,EACdC,GACyB;AACzB,QAAMJ,IAAQI,KAAA,gBAAAA;AACd,SAAOJ,IAAQ,EAAE,eAAe,UAAUA,CAAK,OAAO;AACxD;AAGA,eAAsBK,EACpBC,GACAT,GACkB;AAClB,QAAME,KAAYF,KAAA,gBAAAA,EAAS,cAAa;AACxC,MAAI;AACF,UAAMU,IAAM,MAAM,MAAM,GAAGR,CAAS,UAAUO,EAAK,EAAE,aAAa;AAAA,MAChE,SAASH,EAA2BN,KAAA,gBAAAA,EAAS,QAAQ;AAAA,IAAA,CACtD;AACD,QAAI,CAACU,EAAI,GAAI,QAAO;AAEpB,UAAMC,IAAO,MAAMD,EAAI,KAAA,GACjBE,IAAU,IAAI,gBAAgBD,CAAI,GAClCE,IAAS,SAAS,cAAc,GAAG;AACzC,WAAAA,EAAO,OAAOD,GACdC,EAAO,WAAWJ,EAAK,MACvB,SAAS,KAAK,YAAYI,CAAM,GAChCA,EAAO,MAAA,GACP,SAAS,KAAK,YAAYA,CAAM,GAChC,IAAI,gBAAgBD,CAAO,GACpB;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;"}
@@ -6,6 +6,7 @@ export interface FilterOption {
6
6
  }
7
7
  /** 人员展示选项(仅 UI 字段,数据由消费方提供) */
8
8
  export interface PersonOption extends FilterOption {
9
+ departmentId?: string;
9
10
  departmentName?: string;
10
11
  email?: string;
11
12
  phone?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../src/components/Filter/types.ts"],"sourcesContent":["import type { MaybeFn, Visibility } from '@/utils/resolveMaybeFn';\nimport { resolveMaybeFn } from '@/utils/resolveMaybeFn';\n\n/** 筛选选项基础类型 */\nexport interface FilterOption {\n label: string;\n value: string | number;\n}\n\n/** 人员展示选项(仅 UI 字段,数据由消费方提供) */\nexport interface PersonOption extends FilterOption {\n departmentName?: string;\n email?: string;\n phone?: string;\n employeeId?: string;\n}\n\n/** 已选项 */\nexport interface SelectedItem {\n key: string;\n label: string;\n valueLabel: string;\n onRemove: () => void;\n /** 为 false 时不允许移除(如多选至少保留一项) */\n removable?: boolean;\n}\n\n/** 所有筛选组件共用的 Props */\nexport interface BaseFilterProps {\n filterKey: string;\n label: string;\n active?: boolean;\n /** 隐藏;支持 boolean 或 (ctx) => boolean */\n hidden?: Visibility;\n /** 展示;与 hidden 二选一,display 优先 */\n display?: Visibility;\n}\n\nexport type FilterVisibilityContext = Record<string, unknown>;\n\n/** 解析 hidden(兼容旧 API,支持 MaybeFn) */\nexport function resolveHidden(\n hidden: MaybeFn<boolean, FilterVisibilityContext> | undefined,\n ctx: FilterVisibilityContext = {},\n): boolean {\n if (hidden === undefined) return false;\n return resolveMaybeFn(hidden, ctx, false);\n}\n\n/** 根据 display / hidden 计算筛选项是否可见 */\nexport function resolveFilterVisible(\n props: Pick<BaseFilterProps, 'display' | 'hidden'>,\n ctx: FilterVisibilityContext = {},\n): boolean {\n if (props.display !== undefined) {\n return resolveMaybeFn(props.display, ctx, true);\n }\n return !resolveHidden(props.hidden, ctx);\n}\n"],"names":["resolveHidden","hidden","ctx","resolveMaybeFn","resolveFilterVisible","props"],"mappings":";AAyCO,SAASA,EACdC,GACAC,IAA+B,IACtB;AACT,SAAID,MAAW,SAAkB,KAC1BE,EAAeF,GAAQC,GAAK,EAAK;AAC1C;AAGO,SAASE,EACdC,GACAH,IAA+B,IACtB;AACT,SAAIG,EAAM,YAAY,SACbF,EAAeE,EAAM,SAASH,GAAK,EAAI,IAEzC,CAACF,EAAcK,EAAM,QAAQH,CAAG;AACzC;"}
1
+ {"version":3,"file":"types.js","sources":["../../../src/components/Filter/types.ts"],"sourcesContent":["import type { MaybeFn, Visibility } from '@/utils/resolveMaybeFn';\nimport { resolveMaybeFn } from '@/utils/resolveMaybeFn';\n\n/** 筛选选项基础类型 */\nexport interface FilterOption {\n label: string;\n value: string | number;\n}\n\n/** 人员展示选项(仅 UI 字段,数据由消费方提供) */\nexport interface PersonOption extends FilterOption {\n departmentId?: string;\n departmentName?: string;\n email?: string;\n phone?: string;\n employeeId?: string;\n}\n\n/** 已选项 */\nexport interface SelectedItem {\n key: string;\n label: string;\n valueLabel: string;\n onRemove: () => void;\n /** 为 false 时不允许移除(如多选至少保留一项) */\n removable?: boolean;\n}\n\n/** 所有筛选组件共用的 Props */\nexport interface BaseFilterProps {\n filterKey: string;\n label: string;\n active?: boolean;\n /** 隐藏;支持 boolean 或 (ctx) => boolean */\n hidden?: Visibility;\n /** 展示;与 hidden 二选一,display 优先 */\n display?: Visibility;\n}\n\nexport type FilterVisibilityContext = Record<string, unknown>;\n\n/** 解析 hidden(兼容旧 API,支持 MaybeFn) */\nexport function resolveHidden(\n hidden: MaybeFn<boolean, FilterVisibilityContext> | undefined,\n ctx: FilterVisibilityContext = {},\n): boolean {\n if (hidden === undefined) return false;\n return resolveMaybeFn(hidden, ctx, false);\n}\n\n/** 根据 display / hidden 计算筛选项是否可见 */\nexport function resolveFilterVisible(\n props: Pick<BaseFilterProps, 'display' | 'hidden'>,\n ctx: FilterVisibilityContext = {},\n): boolean {\n if (props.display !== undefined) {\n return resolveMaybeFn(props.display, ctx, true);\n }\n return !resolveHidden(props.hidden, ctx);\n}\n"],"names":["resolveHidden","hidden","ctx","resolveMaybeFn","resolveFilterVisible","props"],"mappings":";AA0CO,SAASA,EACdC,GACAC,IAA+B,IACtB;AACT,SAAID,MAAW,SAAkB,KAC1BE,EAAeF,GAAQC,GAAK,EAAK;AAC1C;AAGO,SAASE,EACdC,GACAH,IAA+B,IACtB;AACT,SAAIG,EAAM,YAAY,SACbF,EAAeE,EAAM,SAASH,GAAK,EAAI,IAEzC,CAACF,EAAcK,EAAM,QAAQH,CAAG;AACzC;"}
package/dist/index.d.ts CHANGED
@@ -5,6 +5,20 @@ export { useFetchData, fetchWithTimeout } from './hooks/useFetchData';
5
5
  export type { FetchDataOptions, FetchDataResult } from './hooks/useFetchData';
6
6
  export { resolveMaybeFn, resolveVisible, type MaybeFn, type Visibility, } from './utils/resolveMaybeFn';
7
7
  export { formatFileSize } from './utils/format';
8
+ export { toDateRange, toDateTimeRange } from './utils/date';
9
+ export { REDIRECT_URL_PARAM, resolveRedirectUrl, buildLocationRedirectUrl, buildLoginPath, readRedirectUrlFromSearch, } from './utils/authRedirect';
10
+ export { DEFAULT_LAST_ACTIVITY_STORAGE_KEY, getLastActivityTime, touchLastActivity, clearLastActivity, } from './utils/sessionActivity';
11
+ export { USER_ROLE_PERMISSIONS_KEY, PERMISSION_DEFINITIONS_KEY, PERMISSIONS_STORAGE_KEY, loadUserRolePermissions, saveUserRolePermissions, loadPermissionDefinitions, savePermissionDefinitions, getStoredUserPermissions, getStoredPermissionMap, } from './utils/permissionStorage';
12
+ export { createMarsunRequest } from './utils/createMarsunRequest';
13
+ export type { MarsunApiResponse, CreateMarsunRequestOptions, MarsunRequestClient, } from './utils/createMarsunRequest';
14
+ export type { UserRolePermissions, PermissionDefinition, PermissionDefinitionsResponse, } from './types/auth';
15
+ export { buildDepartmentPathMapFromTree, buildDepartmentPathMapFromFlat, getDepartmentPath, buildLeafDepartmentPathMap, buildDepartmentPathMaps, mergeDepartmentPathMaps, toDepartmentPathMaps, } from './utils/department/departmentPath';
16
+ export type { DepartmentPathMaps } from './utils/department/departmentPath';
17
+ export { flattenDepartments, findDepartmentRootId, collectDepartmentIds, getNormalUserAccessibleDepartmentIds, extractDepartmentSubtree, getNormalUserDepartmentTree, intersectDepartmentIds, } from './utils/department/departmentScope';
18
+ export type { DepartmentTreeNode, FlatDepartment } from './utils/department/types';
19
+ export { EMPLOYEE_ID_SIX_DIGIT_PATTERN, EMPLOYEE_ID_FORMAT_MESSAGE, employeeIdFormatRule, isValidEmployeeIdFormat, } from './utils/user/employeeId';
20
+ export { normalizeRawPersonList, normalizePersonDtos, resolvePersonDepartmentName, toPersonOptions, toReviewerPersonOptions, formatPersonValueLabel, toPersonSelectOptions, buildPersonOptionLookup, resolveSelectPersonOption, createPersonSelectFilter, matchPersonOptionSearch, } from './utils/personOption';
21
+ export type { PersonOptionDto, ReviewerOptionDto, PersonSelectOption } from './utils/personOption';
8
22
  export * from './components/Auth';
9
23
  export * from './components/Descriptions';
10
24
  export * from './components/File';