@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.
@@ -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
- * (legacy settings.plugin.item keyed 槽位按「卡片编辑的 settings 命名空间」
6
- * 分发;0.1.6-alpha.2 起改挂插件页 row/bundle config,见 shared/config-slots),
5
+ * (插件页配置卡片挂在 row/bundle config 槽位上,与命名空间解耦,
6
+ * 见 shared/config-slots),
7
7
  * 同一字面量两处共用,防止漂移。
8
8
  * @module notify-email/ns
9
9
  */