diff --git a/src/locales/en.json b/src/locales/en.json index 58a243c..f4a8923 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -2762,7 +2762,15 @@ "rateLimit": "Rate limit", "rateLimitValue": "Rate limit value", "rateValue": "{{count}}/hr", - "perHour": "actions per hour" + "perHour": "actions per hour", + "weekdays": "Days of week", + "day0": "Sun", + "day1": "Mon", + "day2": "Tue", + "day3": "Wed", + "day4": "Thu", + "day5": "Fri", + "day6": "Sat" }, "confirm": { "title": "Delete policy?", diff --git a/src/locales/fa.json b/src/locales/fa.json index 614efa1..8b875d8 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -2548,7 +2548,15 @@ "rateLimit": "محدودیت نرخ", "rateLimitValue": "مقدار محدودیت نرخ", "rateValue": "{{count}}/ساعت", - "perHour": "عملیات در ساعت" + "perHour": "عملیات در ساعت", + "weekdays": "روزهای هفته", + "day0": "یکشنبه", + "day1": "دوشنبه", + "day2": "سه‌شنبه", + "day3": "چهارشنبه", + "day4": "پنجشنبه", + "day5": "جمعه", + "day6": "شنبه" }, "confirm": { "title": "حذف سیاست؟", diff --git a/src/locales/ru.json b/src/locales/ru.json index 9376a0d..6e37bd5 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -3313,7 +3313,15 @@ "rateLimit": "Лимит запросов", "rateLimitValue": "Значение лимита запросов", "rateValue": "{{count}}/ч", - "perHour": "действий в час" + "perHour": "действий в час", + "weekdays": "Дни недели", + "day0": "Вс", + "day1": "Пн", + "day2": "Вт", + "day3": "Ср", + "day4": "Чт", + "day5": "Пт", + "day6": "Сб" }, "confirm": { "title": "Удалить политику?", diff --git a/src/locales/zh.json b/src/locales/zh.json index d81072d..b5fccc6 100644 --- a/src/locales/zh.json +++ b/src/locales/zh.json @@ -2547,7 +2547,15 @@ "rateLimit": "速率限制", "rateLimitValue": "速率限制值", "rateValue": "{{count}}/小时", - "perHour": "每小时操作数" + "perHour": "每小时操作数", + "weekdays": "星期", + "day0": "日", + "day1": "一", + "day2": "二", + "day3": "三", + "day4": "四", + "day5": "五", + "day6": "六" }, "confirm": { "title": "删除策略?", diff --git a/src/pages/AdminPolicies.tsx b/src/pages/AdminPolicies.tsx index 7d2b100..bc11e36 100644 --- a/src/pages/AdminPolicies.tsx +++ b/src/pages/AdminPolicies.tsx @@ -86,12 +86,23 @@ const BoltIcon = () => ( ); +const CalendarIcon = () => ( + + + +); + // === Helpers === interface PolicyConditions { time_range?: { start: string; end: string }; ip_whitelist?: string[]; rate_limit?: number; + weekdays?: number[]; } function parseConditions(raw: Record): PolicyConditions { @@ -112,6 +123,10 @@ function parseConditions(raw: Record): PolicyConditions { result.rate_limit = raw.rate_limit; } + if (Array.isArray(raw.weekdays)) { + result.weekdays = raw.weekdays.filter((d): d is number => typeof d === 'number'); + } + return result; } @@ -239,6 +254,22 @@ export default function AdminPolicies() { ); } + if (parsed.weekdays && parsed.weekdays.length > 0 && parsed.weekdays.length < 7) { + const dayOrder = [1, 2, 3, 4, 5, 6, 0]; + const sorted = dayOrder.filter((d) => parsed.weekdays!.includes(d)); + const dayNames = sorted.map((d) => t(`admin.policies.conditions.day${d}`)); + icons.push( + + + {dayNames.join(', ')} + , + ); + } + return icons; }, [t], diff --git a/src/pages/AdminPolicyEdit.tsx b/src/pages/AdminPolicyEdit.tsx index cb93b27..a0fc77b 100644 --- a/src/pages/AdminPolicyEdit.tsx +++ b/src/pages/AdminPolicyEdit.tsx @@ -11,6 +11,7 @@ interface PolicyConditions { time_range?: { start: string; end: string }; ip_whitelist?: string[]; rate_limit?: number; + weekdays?: number[]; } interface PolicyFormData { @@ -26,6 +27,7 @@ interface PolicyFormData { time_range: boolean; ip_whitelist: boolean; rate_limit: boolean; + weekdays: boolean; }; } @@ -41,11 +43,13 @@ const INITIAL_FORM: PolicyFormData = { time_range: { start: '09:00', end: '18:00' }, ip_whitelist: [], rate_limit: 100, + weekdays: [1, 2, 3, 4, 5], }, conditionsEnabled: { time_range: false, ip_whitelist: false, rate_limit: false, + weekdays: false, }, }; @@ -69,6 +73,10 @@ function parseConditions(raw: Record): PolicyConditions { result.rate_limit = raw.rate_limit; } + if (Array.isArray(raw.weekdays)) { + result.weekdays = raw.weekdays.filter((d): d is number => typeof d === 'number'); + } + return result; } @@ -87,6 +95,9 @@ function buildConditionsPayload( if (enabled.rate_limit && conditions.rate_limit !== undefined) { result.rate_limit = conditions.rate_limit; } + if (enabled.weekdays && conditions.weekdays && conditions.weekdays.length > 0) { + result.weekdays = conditions.weekdays; + } return result; } @@ -232,11 +243,13 @@ export default function AdminPolicyEdit() { time_range: parsed.time_range ?? { start: '09:00', end: '18:00' }, ip_whitelist: parsed.ip_whitelist ?? [], rate_limit: parsed.rate_limit ?? 100, + weekdays: parsed.weekdays ?? [1, 2, 3, 4, 5], }, conditionsEnabled: { time_range: !!parsed.time_range, ip_whitelist: !!parsed.ip_whitelist && parsed.ip_whitelist.length > 0, rate_limit: parsed.rate_limit !== undefined, + weekdays: !!parsed.weekdays && parsed.weekdays.length > 0, }, }); } @@ -687,6 +700,53 @@ export default function AdminPolicyEdit() { + + {/* Weekdays */} + + setFormData((prev) => ({ + ...prev, + conditionsEnabled: { + ...prev.conditionsEnabled, + weekdays: !prev.conditionsEnabled.weekdays, + }, + })) + } + > +
+ {[1, 2, 3, 4, 5, 6, 0].map((day) => { + const selected = (formData.conditions.weekdays ?? []).includes(day); + return ( + + ); + })} +
+