mail-editor-pancake 0.2.1 → 0.2.2

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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * 右侧「图片地址」类字段:宿主可选手输 URL、本地上传、内置图库弹层或完全自管图床回调。
2
+ * 右侧「图片地址」类字段:宿主可选手输 URL、本地上传、内置图库弹层或完全自管图库回调。
3
3
  * 编辑器最终只把 URL 写入 props。
4
4
  */
5
5
 
@@ -26,6 +26,62 @@ export interface ImageGalleryListResult {
26
26
  hasMore: boolean;
27
27
  }
28
28
 
29
+ /**
30
+ * 资源动作权限的语义标识。宿主在 `ImageAssetPermissions.check` 中据此返回是否有权限:
31
+ * - `'upload'`:右栏「上传」按钮、图库弹层「上传」按钮(对应创建/上传权限)
32
+ * - `'addUrl'`:图库弹层「添加链接」按钮(对应创建权限)
33
+ * - `'delete'`:图库弹层缩略图删除按钮(对应删除权限)
34
+ */
35
+ export type AssetPermissionAction = 'upload' | 'addUrl' | 'delete';
36
+
37
+ /**
38
+ * 图片资源动作的权限管控配置。未配置 `check` 时视为全部有权限(不做管控)。
39
+ */
40
+ export interface ImageAssetPermissions {
41
+ /**
42
+ * 权限校验:返回 `false` 表示该动作无权限。
43
+ * 未配置时视为全部有权限。
44
+ */
45
+ check?: (action: AssetPermissionAction) => boolean;
46
+ /**
47
+ * 无权限时的表现:
48
+ * - `'disable'`(默认):按钮置灰禁用,hover 提示无权限。
49
+ * - `'hide'`:直接隐藏对应按钮。
50
+ */
51
+ noPermissionMode?: 'disable' | 'hide';
52
+ /**
53
+ * 无权限禁用时 hover 提示文案;未配置或为空时使用编辑器默认文案(`common.noPermission`)。
54
+ */
55
+ noPermissionTip?: string;
56
+ }
57
+
58
+ /** `resolveAssetPermission` 的结果。 */
59
+ export interface ResolvedAssetPermission {
60
+ /** `true` 表示有权限 */
61
+ allowed: boolean;
62
+ /** 无权限时的表现(仅在 `allowed === false` 时有意义) */
63
+ mode: 'disable' | 'hide';
64
+ /** 无权限禁用时的 hover 提示文案(仅在 `allowed === false` 且 `mode === 'disable'` 时有意义) */
65
+ tip: string;
66
+ }
67
+
68
+ /**
69
+ * 解析某个动作的权限状态。未配置 `permissions` 或 `check` 时视为有权限。
70
+ * @param defaultNoPermissionTip 编辑器默认的无权限提示文案(由调用方从 i18n 传入)
71
+ */
72
+ export function resolveAssetPermission(
73
+ permissions: ImageAssetPermissions | undefined,
74
+ action: AssetPermissionAction,
75
+ defaultNoPermissionTip: string,
76
+ ): ResolvedAssetPermission {
77
+ if (!permissions?.check) return { allowed: true, mode: 'disable', tip: '' };
78
+ const allowed = permissions.check(action);
79
+ if (allowed) return { allowed: true, mode: 'disable', tip: '' };
80
+ const mode: 'disable' | 'hide' = permissions.noPermissionMode === 'hide' ? 'hide' : 'disable';
81
+ const tip = (permissions.noPermissionTip ?? '').trim() || defaultNoPermissionTip;
82
+ return { allowed: false, mode, tip };
83
+ }
84
+
29
85
  /**
30
86
  * 内置图库弹层的数据与扩展能力。实现 `listItems` 即可;上传、链接添加、删除等仅在提供对应方法时显示。
31
87
  */
@@ -47,7 +103,7 @@ export interface ImageAssetsHandlers {
47
103
  uploadImage?: (file: File, ctx: ImageFieldContext) => Promise<string>;
48
104
 
49
105
  /**
50
- * 完全自管图床:与内置 `imageGallery` 可并存;
106
+ * 完全自管图库:与内置 `imageGallery` 可并存;
51
107
  * **同时配置时优先使用内置 `imageGallery` 弹层**。
52
108
  */
53
109
  pickImageFromGallery?: (ctx: ImageFieldContext) => Promise<string | null>;
@@ -65,8 +121,14 @@ export interface ImageAssetsHandlers {
65
121
  showUpload?: boolean;
66
122
 
67
123
  /**
68
- * 是否显示「图床」按钮。在配置了 `pickImageFromGallery` 或 `imageGallery` 时有效。
124
+ * 是否显示「图库」按钮。在配置了 `pickImageFromGallery` 或 `imageGallery` 时有效。
69
125
  * 默认 `false`;需显式设为 `true` 才展示入口。
70
126
  */
71
127
  showGallery?: boolean;
128
+
129
+ /**
130
+ * 资源动作权限管控。配置后,「上传 / 添加链接 / 删除」按钮将按 `check` 结果禁用或隐藏。
131
+ * 默认无权限时禁用并 hover 提示。右栏「上传」与图库弹层内按钮共用同一份配置。
132
+ */
133
+ permissions?: ImageAssetPermissions;
72
134
  }
@@ -1294,6 +1294,14 @@
1294
1294
  border-color: var(--sm-primary);
1295
1295
  }
1296
1296
 
1297
+ .sm-input[disabled],
1298
+ .sm-textarea[disabled],
1299
+ .sm-select[disabled] {
1300
+ opacity: 0.55;
1301
+ cursor: not-allowed;
1302
+ background: var(--sm-surface-disabled, #f3f4f6);
1303
+ }
1304
+
1297
1305
  .sm-spacing-grid {
1298
1306
  display: grid;
1299
1307
  grid-template-columns: repeat(4, 1fr);
@@ -2148,6 +2156,13 @@
2148
2156
  .sm-gallery-modal__cell-delete:hover {
2149
2157
  background: var(--sm-danger, #dc2626);
2150
2158
  }
2159
+ .sm-gallery-modal__cell-delete[disabled] {
2160
+ opacity: 0.45;
2161
+ cursor: not-allowed;
2162
+ }
2163
+ .sm-gallery-modal__cell-delete[disabled]:hover {
2164
+ background: rgba(15, 23, 42, 0.82);
2165
+ }
2151
2166
 
2152
2167
  .sm-gallery-modal__cell {
2153
2168
  display: flex;
@@ -31,6 +31,10 @@ export const zhCNMessages: SimpleMailMessages = {
31
31
  'common.insert': '插入',
32
32
  'common.copy': '复制',
33
33
  'common.image': '图片',
34
+ 'common.noPermission': '无权限',
35
+ 'common.noPermissionUpload': '无上传权限',
36
+ 'common.noPermissionAdd': '无添加权限',
37
+ 'common.noPermissionDelete': '无删除权限',
34
38
  'common.left': '左',
35
39
  'common.center': '居中',
36
40
  'common.right': '右',
@@ -145,10 +149,10 @@ export const zhCNMessages: SimpleMailMessages = {
145
149
  'rightPanel.image.uploadTitle': '上传本地图片',
146
150
  'rightPanel.image.upload': '上传',
147
151
  'rightPanel.image.galleryTitle': '从图库选择',
148
- 'rightPanel.image.gallery': '图床',
152
+ 'rightPanel.image.gallery': '图库',
149
153
  'rightPanel.image.helpManual': '可手输 URL',
150
154
  'rightPanel.image.helpUpload': '或使用「上传」',
151
- 'rightPanel.image.helpGallery': '或使用「图床」',
155
+ 'rightPanel.image.helpGallery': '或使用「图库」',
152
156
  'rightPanel.image.helpSeparator': ';',
153
157
  'rightPanel.image.helpEnd': '。',
154
158
  'rightPanel.image.helpAssetsConfigured': '已传入 imageAssets:上传默认显示(提供 uploadImage 且未设 showUpload:false);图库需 showGallery:true,可使用内置 imageGallery 或自管 pickImageFromGallery。仍可手输 URL。',
@@ -334,6 +338,10 @@ export const enUSMessages: SimpleMailMessages = {
334
338
  'common.insert': 'Insert',
335
339
  'common.copy': 'Copy',
336
340
  'common.image': 'Image',
341
+ 'common.noPermission': 'No permission',
342
+ 'common.noPermissionUpload': 'No upload permission',
343
+ 'common.noPermissionAdd': 'No add permission',
344
+ 'common.noPermissionDelete': 'No delete permission',
337
345
  'common.left': 'Left',
338
346
  'common.center': 'Center',
339
347
  'common.right': 'Right',
@@ -86,12 +86,16 @@ export type {
86
86
  } from './types';
87
87
  export type { EditorTheme } from './editor/theme';
88
88
  export type {
89
+ AssetPermissionAction,
89
90
  GalleryItem,
90
91
  ImageAssetsHandlers,
92
+ ImageAssetPermissions,
91
93
  ImageFieldContext,
92
94
  ImageGalleryAdapter,
93
95
  ImageGalleryListResult,
96
+ ResolvedAssetPermission,
94
97
  } from './editor/imageAssets';
98
+ export { resolveAssetPermission } from './editor/imageAssets';
95
99
  export type { OpenImageGalleryModalOptions } from './editor/ImageGalleryModal';
96
100
  export { openImageGalleryModal } from './editor/ImageGalleryModal';
97
101
  export {