@dsh-plus/notify-email 0.1.36 → 0.1.38
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.
- package/lib/client.js +349 -282
- package/package.json +2 -2
- package/src/client/card.tsx +124 -264
- package/src/client/client.ts +2 -2
- package/src/client/draft.ts +99 -0
- package/src/client/fields.tsx +153 -0
- package/src/ns.ts +2 -2
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 「邮件通知」卡片的字段组:SMTP 连接字段与触发/限流字段。
|
|
3
|
+
* 从 card.tsx 拆出,避免单组件过长;控件走 @dsh-plus/shared/client 套件。
|
|
4
|
+
* @module notify-email/client/fields
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { CheckRow, TextField } from '@dsh-plus/shared/client'
|
|
8
|
+
import type { ReactElement } from 'react'
|
|
9
|
+
|
|
10
|
+
import { type Draft, isPositiveInt, TRIGGER_KEYS, type TriggerKey } from './draft.ts'
|
|
11
|
+
import type { Translate } from './i18n.ts'
|
|
12
|
+
|
|
13
|
+
export interface CardFieldsProps {
|
|
14
|
+
t: Translate
|
|
15
|
+
draft: Draft
|
|
16
|
+
disabled: boolean
|
|
17
|
+
/** 字段编辑(与 card.tsx 的 edit 同签名:合并式写入并清空状态行)。 */
|
|
18
|
+
onEdit<K extends keyof Draft>(key: K, value: Draft[K]): void
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** SMTP 连接字段(密码为只写:留空保持已存密钥)。 */
|
|
22
|
+
export function SmtpFields(props: CardFieldsProps & { passConfigured: boolean }): ReactElement {
|
|
23
|
+
const { t, draft, disabled, onEdit } = props
|
|
24
|
+
return (
|
|
25
|
+
<>
|
|
26
|
+
<TextField
|
|
27
|
+
prefix="dne"
|
|
28
|
+
id="dne-host"
|
|
29
|
+
label={t('host')}
|
|
30
|
+
hint={t('hostHint')}
|
|
31
|
+
value={draft.host}
|
|
32
|
+
disabled={disabled}
|
|
33
|
+
onEdit={(v) => onEdit('host', v)}
|
|
34
|
+
/>
|
|
35
|
+
<TextField
|
|
36
|
+
prefix="dne"
|
|
37
|
+
id="dne-port"
|
|
38
|
+
label={t('port')}
|
|
39
|
+
hint={t('portHint')}
|
|
40
|
+
value={draft.port}
|
|
41
|
+
numeric
|
|
42
|
+
disabled={disabled}
|
|
43
|
+
invalid={!isPositiveInt(draft.port)}
|
|
44
|
+
invalidLabel={t('invalidNumber')}
|
|
45
|
+
onEdit={(v) => onEdit('port', v)}
|
|
46
|
+
/>
|
|
47
|
+
<CheckRow
|
|
48
|
+
prefix="dne"
|
|
49
|
+
id="dne-secure"
|
|
50
|
+
label={t('secure')}
|
|
51
|
+
checked={draft.secure}
|
|
52
|
+
disabled={disabled}
|
|
53
|
+
onEdit={(v) => onEdit('secure', v)}
|
|
54
|
+
/>
|
|
55
|
+
<TextField
|
|
56
|
+
prefix="dne"
|
|
57
|
+
id="dne-user"
|
|
58
|
+
label={t('user')}
|
|
59
|
+
hint={t('userHint')}
|
|
60
|
+
value={draft.user}
|
|
61
|
+
disabled={disabled}
|
|
62
|
+
onEdit={(v) => onEdit('user', v)}
|
|
63
|
+
/>
|
|
64
|
+
<TextField
|
|
65
|
+
prefix="dne"
|
|
66
|
+
id="dne-pass"
|
|
67
|
+
label={t('pass')}
|
|
68
|
+
hint={t('passHint')}
|
|
69
|
+
value={draft.pass}
|
|
70
|
+
password
|
|
71
|
+
disabled={disabled}
|
|
72
|
+
badge={{
|
|
73
|
+
text: props.passConfigured ? t('passSet') : t('passUnset'),
|
|
74
|
+
set: props.passConfigured,
|
|
75
|
+
}}
|
|
76
|
+
onEdit={(v) => onEdit('pass', v)}
|
|
77
|
+
/>
|
|
78
|
+
<TextField
|
|
79
|
+
prefix="dne"
|
|
80
|
+
id="dne-from"
|
|
81
|
+
label={t('from')}
|
|
82
|
+
hint={t('fromHint')}
|
|
83
|
+
value={draft.from}
|
|
84
|
+
disabled={disabled}
|
|
85
|
+
onEdit={(v) => onEdit('from', v)}
|
|
86
|
+
/>
|
|
87
|
+
</>
|
|
88
|
+
)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** 收件人、触发点开关与限流字段。 */
|
|
92
|
+
export function TriggerFields(
|
|
93
|
+
props: CardFieldsProps & { onTrigger(key: TriggerKey, checked: boolean): void },
|
|
94
|
+
): ReactElement {
|
|
95
|
+
const { t, draft, disabled, onEdit } = props
|
|
96
|
+
return (
|
|
97
|
+
<>
|
|
98
|
+
<TextField
|
|
99
|
+
prefix="dne"
|
|
100
|
+
id="dne-to"
|
|
101
|
+
label={t('to')}
|
|
102
|
+
hint={t('toHint')}
|
|
103
|
+
value={draft.toText}
|
|
104
|
+
disabled={disabled}
|
|
105
|
+
onEdit={(v) => onEdit('toText', v)}
|
|
106
|
+
/>
|
|
107
|
+
<p className="dne-groupLabel">{t('triggerGroup')}</p>
|
|
108
|
+
{TRIGGER_KEYS.map((key) => (
|
|
109
|
+
<CheckRow
|
|
110
|
+
prefix="dne"
|
|
111
|
+
key={key}
|
|
112
|
+
id={`dne-${key}`}
|
|
113
|
+
label={t(key)}
|
|
114
|
+
checked={draft.triggers[key]}
|
|
115
|
+
disabled={disabled}
|
|
116
|
+
onEdit={(v) => props.onTrigger(key, v)}
|
|
117
|
+
/>
|
|
118
|
+
))}
|
|
119
|
+
<TextField
|
|
120
|
+
prefix="dne"
|
|
121
|
+
id="dne-debounce"
|
|
122
|
+
label={t('idleDebounceMs')}
|
|
123
|
+
hint={t('idleDebounceMsHint')}
|
|
124
|
+
value={draft.idleDebounceMs}
|
|
125
|
+
numeric
|
|
126
|
+
disabled={disabled}
|
|
127
|
+
invalid={!isPositiveInt(draft.idleDebounceMs)}
|
|
128
|
+
invalidLabel={t('invalidNumber')}
|
|
129
|
+
onEdit={(v) => onEdit('idleDebounceMs', v)}
|
|
130
|
+
/>
|
|
131
|
+
<TextField
|
|
132
|
+
prefix="dne"
|
|
133
|
+
id="dne-maxchars"
|
|
134
|
+
label={t('maxBodyChars')}
|
|
135
|
+
hint={t('maxBodyCharsHint')}
|
|
136
|
+
value={draft.maxBodyChars}
|
|
137
|
+
numeric
|
|
138
|
+
disabled={disabled}
|
|
139
|
+
invalid={!isPositiveInt(draft.maxBodyChars) || Number(draft.maxBodyChars) < 200}
|
|
140
|
+
invalidLabel={t('invalidNumber')}
|
|
141
|
+
onEdit={(v) => onEdit('maxBodyChars', v)}
|
|
142
|
+
/>
|
|
143
|
+
<CheckRow
|
|
144
|
+
prefix="dne"
|
|
145
|
+
id="dne-dryrun"
|
|
146
|
+
label={t('dryRun')}
|
|
147
|
+
checked={draft.dryRun}
|
|
148
|
+
disabled={disabled}
|
|
149
|
+
onEdit={(v) => onEdit('dryRun', v)}
|
|
150
|
+
/>
|
|
151
|
+
</>
|
|
152
|
+
)
|
|
153
|
+
}
|
package/src/ns.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* settings 命名空间字面量(纯常量,零依赖,浏览器半可安全引入)。
|
|
3
3
|
* 服务端直接以字面量注册(0.1.2-alpha.2 起 dsh-settings 对命名空间做编译期
|
|
4
4
|
* 语法校验,见 config.ts);浏览器半把它作为配置卡片的注册键
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* (插件页配置卡片挂在 row/bundle config 槽位上,与命名空间解耦,
|
|
6
|
+
* 见 shared/config-slots),
|
|
7
7
|
* 同一字面量两处共用,防止漂移。
|
|
8
8
|
* @module notify-email/ns
|
|
9
9
|
*/
|