@open-mercato/core 0.6.4-develop.4133.1.48fc6c8f7b → 0.6.4-develop.4152.1.1c429e5200

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 (29) hide show
  1. package/dist/modules/customer_accounts/api/admin/users/[id]/reset-password.js +1 -0
  2. package/dist/modules/customer_accounts/api/admin/users/[id]/reset-password.js.map +2 -2
  3. package/dist/modules/customer_accounts/api/admin/users/[id]/send-reset-link.js +1 -0
  4. package/dist/modules/customer_accounts/api/admin/users/[id]/send-reset-link.js.map +2 -2
  5. package/dist/modules/customer_accounts/api/admin/users/[id]/verify-email.js +1 -0
  6. package/dist/modules/customer_accounts/api/admin/users/[id]/verify-email.js.map +2 -2
  7. package/dist/modules/customer_accounts/api/admin/users/[id].js +1 -0
  8. package/dist/modules/customer_accounts/api/admin/users/[id].js.map +2 -2
  9. package/dist/modules/customer_accounts/api/email/verify.js +1 -0
  10. package/dist/modules/customer_accounts/api/email/verify.js.map +2 -2
  11. package/dist/modules/customer_accounts/api/portal/events/stream.js +20 -2
  12. package/dist/modules/customer_accounts/api/portal/events/stream.js.map +2 -2
  13. package/dist/modules/planner/components/AvailabilityRulesEditor.js +19 -13
  14. package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
  15. package/dist/modules/planner/components/availabilityRulesEditorState.js +10 -1
  16. package/dist/modules/planner/components/availabilityRulesEditorState.js.map +2 -2
  17. package/package.json +7 -7
  18. package/src/modules/customer_accounts/api/admin/users/[id]/reset-password.ts +1 -0
  19. package/src/modules/customer_accounts/api/admin/users/[id]/send-reset-link.ts +1 -0
  20. package/src/modules/customer_accounts/api/admin/users/[id]/verify-email.ts +1 -0
  21. package/src/modules/customer_accounts/api/admin/users/[id].ts +1 -0
  22. package/src/modules/customer_accounts/api/email/verify.ts +1 -0
  23. package/src/modules/customer_accounts/api/portal/events/stream.ts +23 -2
  24. package/src/modules/planner/components/AvailabilityRulesEditor.tsx +20 -13
  25. package/src/modules/planner/components/availabilityRulesEditorState.ts +21 -0
  26. package/src/modules/planner/i18n/de.json +3 -3
  27. package/src/modules/planner/i18n/en.json +3 -3
  28. package/src/modules/planner/i18n/es.json +3 -3
  29. package/src/modules/planner/i18n/pl.json +3 -3
@@ -2,7 +2,16 @@ function resolveRuleSetSelectValue(ruleSets, selectedRulesetId) {
2
2
  if (!selectedRulesetId) return void 0;
3
3
  return ruleSets.some((ruleSet) => ruleSet.id === selectedRulesetId) ? selectedRulesetId : void 0;
4
4
  }
5
+ function selectCustomRuleIdsToDelete(transition, rules) {
6
+ if (transition === "switch") return [];
7
+ return Array.from(new Set(rules.map((rule) => rule.id)));
8
+ }
9
+ function requiresResetConfirmation(rules) {
10
+ return rules.length > 0;
11
+ }
5
12
  export {
6
- resolveRuleSetSelectValue
13
+ requiresResetConfirmation,
14
+ resolveRuleSetSelectValue,
15
+ selectCustomRuleIdsToDelete
7
16
  };
8
17
  //# sourceMappingURL=availabilityRulesEditorState.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/planner/components/availabilityRulesEditorState.ts"],
4
- "sourcesContent": ["export type AvailabilityRuleSetOption = {\n id: string\n}\n\nexport function resolveRuleSetSelectValue(\n ruleSets: AvailabilityRuleSetOption[],\n selectedRulesetId: string | null | undefined,\n): string | undefined {\n if (!selectedRulesetId) return undefined\n return ruleSets.some((ruleSet) => ruleSet.id === selectedRulesetId) ? selectedRulesetId : undefined\n}\n"],
5
- "mappings": "AAIO,SAAS,0BACd,UACA,mBACoB;AACpB,MAAI,CAAC,kBAAmB,QAAO;AAC/B,SAAO,SAAS,KAAK,CAAC,YAAY,QAAQ,OAAO,iBAAiB,IAAI,oBAAoB;AAC5F;",
4
+ "sourcesContent": ["export type AvailabilityRuleSetOption = {\n id: string\n}\n\nexport type AvailabilityRuleRef = {\n id: string\n}\n\nexport type RuleSetTransition = 'switch' | 'reset'\n\nexport function resolveRuleSetSelectValue(\n ruleSets: AvailabilityRuleSetOption[],\n selectedRulesetId: string | null | undefined,\n): string | undefined {\n if (!selectedRulesetId) return undefined\n return ruleSets.some((ruleSet) => ruleSet.id === selectedRulesetId) ? selectedRulesetId : undefined\n}\n\n// Selects which member-level custom rules to delete for a ruleset transition.\n// Switching schedules preserves the member's saved custom hours (#2325): only\n// an explicit \"Reset to schedule\" discards them so the shared schedule applies.\nexport function selectCustomRuleIdsToDelete(\n transition: RuleSetTransition,\n rules: AvailabilityRuleRef[],\n): string[] {\n if (transition === 'switch') return []\n return Array.from(new Set(rules.map((rule) => rule.id)))\n}\n\nexport function requiresResetConfirmation(rules: AvailabilityRuleRef[]): boolean {\n return rules.length > 0\n}\n"],
5
+ "mappings": "AAUO,SAAS,0BACd,UACA,mBACoB;AACpB,MAAI,CAAC,kBAAmB,QAAO;AAC/B,SAAO,SAAS,KAAK,CAAC,YAAY,QAAQ,OAAO,iBAAiB,IAAI,oBAAoB;AAC5F;AAKO,SAAS,4BACd,YACA,OACU;AACV,MAAI,eAAe,SAAU,QAAO,CAAC;AACrC,SAAO,MAAM,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;AACzD;AAEO,SAAS,0BAA0B,OAAuC;AAC/E,SAAO,MAAM,SAAS;AACxB;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/core",
3
- "version": "0.6.4-develop.4133.1.48fc6c8f7b",
3
+ "version": "0.6.4-develop.4152.1.1c429e5200",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "scripts": {
@@ -243,16 +243,16 @@
243
243
  "zod": "^4.4.3"
244
244
  },
245
245
  "peerDependencies": {
246
- "@open-mercato/ai-assistant": "0.6.4-develop.4133.1.48fc6c8f7b",
247
- "@open-mercato/shared": "0.6.4-develop.4133.1.48fc6c8f7b",
248
- "@open-mercato/ui": "0.6.4-develop.4133.1.48fc6c8f7b",
246
+ "@open-mercato/ai-assistant": "0.6.4-develop.4152.1.1c429e5200",
247
+ "@open-mercato/shared": "0.6.4-develop.4152.1.1c429e5200",
248
+ "@open-mercato/ui": "0.6.4-develop.4152.1.1c429e5200",
249
249
  "react": "^19.0.0",
250
250
  "react-dom": "^19.0.0"
251
251
  },
252
252
  "devDependencies": {
253
- "@open-mercato/ai-assistant": "0.6.4-develop.4133.1.48fc6c8f7b",
254
- "@open-mercato/shared": "0.6.4-develop.4133.1.48fc6c8f7b",
255
- "@open-mercato/ui": "0.6.4-develop.4133.1.48fc6c8f7b",
253
+ "@open-mercato/ai-assistant": "0.6.4-develop.4152.1.1c429e5200",
254
+ "@open-mercato/shared": "0.6.4-develop.4152.1.1c429e5200",
255
+ "@open-mercato/ui": "0.6.4-develop.4152.1.1c429e5200",
256
256
  "@testing-library/dom": "^10.4.1",
257
257
  "@testing-library/jest-dom": "^6.9.1",
258
258
  "@testing-library/react": "^16.3.1",
@@ -52,6 +52,7 @@ export async function POST(req: Request, { params }: { params: { id: string } })
52
52
 
53
53
  void emitCustomerAccountsEvent('customer_accounts.password.reset', {
54
54
  id: user.id,
55
+ recipientUserId: user.id,
55
56
  email: user.email,
56
57
  tenantId: auth.tenantId,
57
58
  organizationId: auth.orgId,
@@ -36,6 +36,7 @@ export async function POST(req: Request, { params }: { params: { id: string } })
36
36
 
37
37
  void emitCustomerAccountsEvent('customer_accounts.password.reset', {
38
38
  id: user.id,
39
+ recipientUserId: user.id,
39
40
  email: user.email,
40
41
  tenantId: auth.tenantId,
41
42
  organizationId: auth.orgId,
@@ -41,6 +41,7 @@ export async function POST(req: Request, { params }: { params: { id: string } })
41
41
 
42
42
  void emitCustomerAccountsEvent('customer_accounts.email.verified', {
43
43
  id: user.id,
44
+ recipientUserId: user.id,
44
45
  email: user.email,
45
46
  tenantId: auth.tenantId,
46
47
  organizationId: auth.orgId,
@@ -190,6 +190,7 @@ export async function PUT(req: Request, { params }: { params: { id: string } })
190
190
 
191
191
  void emitCustomerAccountsEvent('customer_accounts.user.updated', {
192
192
  id: user.id,
193
+ recipientUserId: user.id,
193
194
  email: user.email,
194
195
  tenantId: auth.tenantId,
195
196
  organizationId: auth.orgId,
@@ -35,6 +35,7 @@ export async function POST(req: Request) {
35
35
 
36
36
  void emitCustomerAccountsEvent('customer_accounts.email.verified', {
37
37
  userId: result.userId,
38
+ recipientUserId: result.userId,
38
39
  tenantId: result.tenantId,
39
40
  }).catch(() => undefined)
40
41
 
@@ -31,6 +31,7 @@ type PortalSseConnection = {
31
31
  function normalizeAudience(data: Record<string, unknown>): {
32
32
  tenantId: string | null
33
33
  organizationScopes: string[]
34
+ recipientUserScopes: string[]
34
35
  } {
35
36
  const tenantId = typeof data.tenantId === 'string' ? data.tenantId : null
36
37
  const organizationScopes = new Set<string>()
@@ -44,7 +45,24 @@ function normalizeAudience(data: Record<string, unknown>): {
44
45
  }
45
46
  }
46
47
  }
47
- return { tenantId, organizationScopes: Array.from(organizationScopes) }
48
+
49
+ const recipientUserScopes = new Set<string>()
50
+ if (typeof data.recipientUserId === 'string' && data.recipientUserId.trim().length > 0) {
51
+ recipientUserScopes.add(data.recipientUserId.trim())
52
+ }
53
+ if (Array.isArray(data.recipientUserIds)) {
54
+ for (const userId of data.recipientUserIds) {
55
+ if (typeof userId === 'string' && userId.trim().length > 0) {
56
+ recipientUserScopes.add(userId.trim())
57
+ }
58
+ }
59
+ }
60
+
61
+ return {
62
+ tenantId,
63
+ organizationScopes: Array.from(organizationScopes),
64
+ recipientUserScopes: Array.from(recipientUserScopes),
65
+ }
48
66
  }
49
67
 
50
68
  function matchesAudience(conn: PortalSseConnection, audience: ReturnType<typeof normalizeAudience>): boolean {
@@ -53,6 +71,9 @@ function matchesAudience(conn: PortalSseConnection, audience: ReturnType<typeof
53
71
  if (audience.organizationScopes.length > 0) {
54
72
  if (!audience.organizationScopes.includes(conn.organizationId)) return false
55
73
  }
74
+ if (audience.recipientUserScopes.length > 0 && !audience.recipientUserScopes.includes(conn.customerUserId)) {
75
+ return false
76
+ }
56
77
  return true
57
78
  }
58
79
 
@@ -194,7 +215,7 @@ export async function GET(req: Request): Promise<Response> {
194
215
 
195
216
  const methodDoc: OpenApiMethodDoc = {
196
217
  summary: 'Subscribe to portal events via SSE (Portal Event Bridge)',
197
- description: 'Long-lived SSE connection that receives server-side events marked with portalBroadcast: true. Events are filtered by the customer\'s tenant and organization.',
218
+ description: 'Long-lived SSE connection that receives server-side events marked with portalBroadcast: true. Events are filtered by the customer\'s tenant, organization, and recipient user audience.',
198
219
  tags: ['Customer Portal'],
199
220
  responses: [
200
221
  {
@@ -30,7 +30,11 @@ import { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'
30
30
  import { parseAvailabilityRuleWindow } from '@open-mercato/core/modules/planner/lib/availabilitySchedule'
31
31
  import { CrudForm, type CrudField } from '@open-mercato/ui/backend/CrudForm'
32
32
  import { Calendar, Clock, List, PencilLine, Plus, Trash2 } from 'lucide-react'
33
- import { resolveRuleSetSelectValue } from './availabilityRulesEditorState'
33
+ import {
34
+ resolveRuleSetSelectValue,
35
+ requiresResetConfirmation,
36
+ selectCustomRuleIdsToDelete,
37
+ } from './availabilityRulesEditorState'
34
38
 
35
39
  type AvailabilityRepeat = 'once' | 'daily' | 'weekly'
36
40
  type AvailabilitySubjectType = 'member' | 'resource' | 'ruleset'
@@ -455,7 +459,7 @@ export function AvailabilityRulesEditor({
455
459
  ruleSetPlaceholder: t(`${labelPrefix}.availability.ruleset.placeholder`, 'Custom schedule'),
456
460
  ruleSetCustomize: t(`${labelPrefix}.availability.ruleset.customize`, 'Customize schedule'),
457
461
  ruleSetReset: t(`${labelPrefix}.availability.ruleset.reset`, 'Reset to schedule'),
458
- ruleSetConfirm: t(`${labelPrefix}.availability.ruleset.confirm`, 'Changing the schedule will reset custom hours. Continue?'),
462
+ ruleSetConfirm: t(`${labelPrefix}.availability.ruleset.confirm`, 'Resetting to the schedule will delete your custom hours. Continue?'),
459
463
  ruleSetLoading: t(`${labelPrefix}.availability.ruleset.loading`, 'Loading schedules...'),
460
464
  ruleSetError: t(`${labelPrefix}.availability.ruleset.error`, 'Failed to load schedules.'),
461
465
  ruleSetCreateLabel: t(`${labelPrefix}.availability.ruleset.create`, 'New schedule'),
@@ -957,9 +961,17 @@ export function AvailabilityRulesEditor({
957
961
  const handleResetToRuleSet = React.useCallback(async () => {
958
962
  if (isReadOnly) return
959
963
  if (!effectiveRulesetId) return
964
+ if (requiresResetConfirmation(availabilityRules)) {
965
+ const confirmed = await confirm({
966
+ title: listLabels.ruleSetConfirm,
967
+ variant: 'destructive',
968
+ })
969
+ if (!confirmed) return
970
+ }
960
971
  try {
972
+ const idsToDelete = selectCustomRuleIdsToDelete('reset', availabilityRules)
961
973
  await Promise.all(
962
- availabilityRules.map((rule) => deleteCrud('planner/availability', rule.id, { errorMessage: listLabels.saveWeeklyError })),
974
+ idsToDelete.map((id) => deleteCrud('planner/availability', id, { errorMessage: listLabels.saveWeeklyError })),
963
975
  )
964
976
  setCustomOverridesEnabled(false)
965
977
  await refreshAvailability()
@@ -967,19 +979,16 @@ export function AvailabilityRulesEditor({
967
979
  const message = error instanceof Error ? error.message : listLabels.saveWeeklyError
968
980
  flash(message, 'error')
969
981
  }
970
- }, [availabilityRules, effectiveRulesetId, listLabels.saveWeeklyError, refreshAvailability, isReadOnly])
982
+ }, [availabilityRules, confirm, effectiveRulesetId, listLabels.ruleSetConfirm, listLabels.saveWeeklyError, refreshAvailability, isReadOnly])
971
983
 
972
984
  const handleRuleSetChange = React.useCallback(async (nextId: string | null) => {
973
985
  if (isReadOnly) return
974
986
  if (!onRulesetChange) return
975
- if (availabilityRules.length > 0 && nextId !== effectiveRulesetId) {
976
- const confirmed = await confirm({
977
- title: listLabels.ruleSetConfirm,
978
- variant: 'default',
979
- })
980
- if (!confirmed) return
987
+ // Switching preserves saved custom hours (#2325); only an explicit reset clears them.
988
+ const idsToDelete = selectCustomRuleIdsToDelete('switch', availabilityRules)
989
+ if (idsToDelete.length) {
981
990
  await Promise.all(
982
- availabilityRules.map((rule) => deleteCrud('planner/availability', rule.id, { errorMessage: listLabels.saveWeeklyError })),
991
+ idsToDelete.map((id) => deleteCrud('planner/availability', id, { errorMessage: listLabels.saveWeeklyError })),
983
992
  )
984
993
  }
985
994
  setSelectedRulesetId(nextId)
@@ -993,9 +1002,7 @@ export function AvailabilityRulesEditor({
993
1002
  }
994
1003
  }, [
995
1004
  availabilityRules,
996
- confirm,
997
1005
  effectiveRulesetId,
998
- listLabels.ruleSetConfirm,
999
1006
  listLabels.saveWeeklyError,
1000
1007
  onRulesetChange,
1001
1008
  refreshAvailability,
@@ -2,6 +2,12 @@ export type AvailabilityRuleSetOption = {
2
2
  id: string
3
3
  }
4
4
 
5
+ export type AvailabilityRuleRef = {
6
+ id: string
7
+ }
8
+
9
+ export type RuleSetTransition = 'switch' | 'reset'
10
+
5
11
  export function resolveRuleSetSelectValue(
6
12
  ruleSets: AvailabilityRuleSetOption[],
7
13
  selectedRulesetId: string | null | undefined,
@@ -9,3 +15,18 @@ export function resolveRuleSetSelectValue(
9
15
  if (!selectedRulesetId) return undefined
10
16
  return ruleSets.some((ruleSet) => ruleSet.id === selectedRulesetId) ? selectedRulesetId : undefined
11
17
  }
18
+
19
+ // Selects which member-level custom rules to delete for a ruleset transition.
20
+ // Switching schedules preserves the member's saved custom hours (#2325): only
21
+ // an explicit "Reset to schedule" discards them so the shared schedule applies.
22
+ export function selectCustomRuleIdsToDelete(
23
+ transition: RuleSetTransition,
24
+ rules: AvailabilityRuleRef[],
25
+ ): string[] {
26
+ if (transition === 'switch') return []
27
+ return Array.from(new Set(rules.map((rule) => rule.id)))
28
+ }
29
+
30
+ export function requiresResetConfirmation(rules: AvailabilityRuleRef[]): boolean {
31
+ return rules.length > 0
32
+ }
@@ -111,7 +111,7 @@
111
111
  "planner.availabilityRuleSets.availability.dateSpecific.saved": "Stunden für bestimmte Daten gespeichert.",
112
112
  "planner.availabilityRuleSets.availability.dateSpecific.subtitle": "Passe die Stunden für bestimmte Tage an.",
113
113
  "planner.availabilityRuleSets.availability.dateSpecific.title": "Stunden für bestimmte Daten",
114
- "planner.availabilityRuleSets.availability.ruleset.confirm": "Durch das Ändern des Zeitplans werden benutzerdefinierte Stunden zurückgesetzt. Fortfahren?",
114
+ "planner.availabilityRuleSets.availability.ruleset.confirm": "Beim Zurücksetzen auf den Zeitplan werden deine benutzerdefinierten Stunden gelöscht. Fortfahren?",
115
115
  "planner.availabilityRuleSets.availability.ruleset.create": "Neuer Zeitplan",
116
116
  "planner.availabilityRuleSets.availability.ruleset.createError": "Zeitplan konnte nicht gespeichert werden.",
117
117
  "planner.availabilityRuleSets.availability.ruleset.createName": "Name des Zeitplans",
@@ -247,7 +247,7 @@
247
247
  "planner.resources.availability.dateSpecific.saved": "Stunden für bestimmte Daten gespeichert.",
248
248
  "planner.resources.availability.dateSpecific.subtitle": "Passe die Stunden für bestimmte Tage an.",
249
249
  "planner.resources.availability.dateSpecific.title": "Stunden für bestimmte Daten",
250
- "planner.resources.availability.ruleset.confirm": "Durch das Ändern des Zeitplans werden benutzerdefinierte Stunden zurückgesetzt. Fortfahren?",
250
+ "planner.resources.availability.ruleset.confirm": "Beim Zurücksetzen auf den Zeitplan werden deine benutzerdefinierten Stunden gelöscht. Fortfahren?",
251
251
  "planner.resources.availability.ruleset.create": "Neuer Zeitplan",
252
252
  "planner.resources.availability.ruleset.createError": "Zeitplan konnte nicht gespeichert werden.",
253
253
  "planner.resources.availability.ruleset.createName": "Name des Zeitplans",
@@ -376,7 +376,7 @@
376
376
  "planner.teamMembers.availability.repeat.daily": "Täglich",
377
377
  "planner.teamMembers.availability.repeat.once": "Einmal",
378
378
  "planner.teamMembers.availability.repeat.weekly": "Wöchentlich",
379
- "planner.teamMembers.availability.ruleset.confirm": "Durch das Ändern des Zeitplans werden benutzerdefinierte Stunden zurückgesetzt. Fortfahren?",
379
+ "planner.teamMembers.availability.ruleset.confirm": "Beim Zurücksetzen auf den Zeitplan werden deine benutzerdefinierten Stunden gelöscht. Fortfahren?",
380
380
  "planner.teamMembers.availability.ruleset.create": "Neuer Zeitplan",
381
381
  "planner.teamMembers.availability.ruleset.createError": "Zeitplan konnte nicht gespeichert werden.",
382
382
  "planner.teamMembers.availability.ruleset.createName": "Name des Zeitplans",
@@ -111,7 +111,7 @@
111
111
  "planner.availabilityRuleSets.availability.dateSpecific.saved": "Date-specific hours saved.",
112
112
  "planner.availabilityRuleSets.availability.dateSpecific.subtitle": "Adjust hours for specific days.",
113
113
  "planner.availabilityRuleSets.availability.dateSpecific.title": "Date-specific hours",
114
- "planner.availabilityRuleSets.availability.ruleset.confirm": "Changing the schedule will reset custom hours. Continue?",
114
+ "planner.availabilityRuleSets.availability.ruleset.confirm": "Resetting to the schedule will delete your custom hours. Continue?",
115
115
  "planner.availabilityRuleSets.availability.ruleset.create": "New schedule",
116
116
  "planner.availabilityRuleSets.availability.ruleset.createError": "Failed to save schedule.",
117
117
  "planner.availabilityRuleSets.availability.ruleset.createName": "Schedule name",
@@ -247,7 +247,7 @@
247
247
  "planner.resources.availability.dateSpecific.saved": "Date-specific hours saved.",
248
248
  "planner.resources.availability.dateSpecific.subtitle": "Adjust hours for specific days.",
249
249
  "planner.resources.availability.dateSpecific.title": "Date-specific hours",
250
- "planner.resources.availability.ruleset.confirm": "Changing the schedule will reset custom hours. Continue?",
250
+ "planner.resources.availability.ruleset.confirm": "Resetting to the schedule will delete your custom hours. Continue?",
251
251
  "planner.resources.availability.ruleset.create": "New schedule",
252
252
  "planner.resources.availability.ruleset.createError": "Failed to save schedule.",
253
253
  "planner.resources.availability.ruleset.createName": "Schedule name",
@@ -376,7 +376,7 @@
376
376
  "planner.teamMembers.availability.repeat.daily": "Daily",
377
377
  "planner.teamMembers.availability.repeat.once": "Once",
378
378
  "planner.teamMembers.availability.repeat.weekly": "Weekly",
379
- "planner.teamMembers.availability.ruleset.confirm": "Changing the schedule will reset custom hours. Continue?",
379
+ "planner.teamMembers.availability.ruleset.confirm": "Resetting to the schedule will delete your custom hours. Continue?",
380
380
  "planner.teamMembers.availability.ruleset.create": "New schedule",
381
381
  "planner.teamMembers.availability.ruleset.createError": "Failed to save schedule.",
382
382
  "planner.teamMembers.availability.ruleset.createName": "Schedule name",
@@ -111,7 +111,7 @@
111
111
  "planner.availabilityRuleSets.availability.dateSpecific.saved": "Horas para fechas específicas guardadas.",
112
112
  "planner.availabilityRuleSets.availability.dateSpecific.subtitle": "Ajusta las horas para días específicos.",
113
113
  "planner.availabilityRuleSets.availability.dateSpecific.title": "Horas para fechas específicas",
114
- "planner.availabilityRuleSets.availability.ruleset.confirm": "Cambiar el horario restablecerá las horas personalizadas. ¿Continuar?",
114
+ "planner.availabilityRuleSets.availability.ruleset.confirm": "Restablecer al horario eliminará tus horas personalizadas. ¿Continuar?",
115
115
  "planner.availabilityRuleSets.availability.ruleset.create": "Nuevo horario",
116
116
  "planner.availabilityRuleSets.availability.ruleset.createError": "No se pudo guardar el horario.",
117
117
  "planner.availabilityRuleSets.availability.ruleset.createName": "Nombre del horario",
@@ -247,7 +247,7 @@
247
247
  "planner.resources.availability.dateSpecific.saved": "Horas para fechas específicas guardadas.",
248
248
  "planner.resources.availability.dateSpecific.subtitle": "Ajusta las horas para días específicos.",
249
249
  "planner.resources.availability.dateSpecific.title": "Horas para fechas específicas",
250
- "planner.resources.availability.ruleset.confirm": "Cambiar el horario restablecerá las horas personalizadas. ¿Continuar?",
250
+ "planner.resources.availability.ruleset.confirm": "Restablecer al horario eliminará tus horas personalizadas. ¿Continuar?",
251
251
  "planner.resources.availability.ruleset.create": "Nuevo horario",
252
252
  "planner.resources.availability.ruleset.createError": "No se pudo guardar el horario.",
253
253
  "planner.resources.availability.ruleset.createName": "Nombre del horario",
@@ -376,7 +376,7 @@
376
376
  "planner.teamMembers.availability.repeat.daily": "Diario",
377
377
  "planner.teamMembers.availability.repeat.once": "Una vez",
378
378
  "planner.teamMembers.availability.repeat.weekly": "Semanal",
379
- "planner.teamMembers.availability.ruleset.confirm": "Cambiar el horario restablecerá las horas personalizadas. ¿Continuar?",
379
+ "planner.teamMembers.availability.ruleset.confirm": "Restablecer al horario eliminará tus horas personalizadas. ¿Continuar?",
380
380
  "planner.teamMembers.availability.ruleset.create": "Nuevo horario",
381
381
  "planner.teamMembers.availability.ruleset.createError": "No se pudo guardar el horario.",
382
382
  "planner.teamMembers.availability.ruleset.createName": "Nombre del horario",
@@ -111,7 +111,7 @@
111
111
  "planner.availabilityRuleSets.availability.dateSpecific.saved": "Godziny dla dat zapisane.",
112
112
  "planner.availabilityRuleSets.availability.dateSpecific.subtitle": "Dostosuj godziny dla wybranych dni.",
113
113
  "planner.availabilityRuleSets.availability.dateSpecific.title": "Godziny dla konkretnych dat",
114
- "planner.availabilityRuleSets.availability.ruleset.confirm": "Zmiana harmonogramu zresetuje niestandardowe godziny. Kontynuować?",
114
+ "planner.availabilityRuleSets.availability.ruleset.confirm": "Przywrócenie harmonogramu usunie Twoje niestandardowe godziny. Kontynuować?",
115
115
  "planner.availabilityRuleSets.availability.ruleset.create": "Nowy harmonogram",
116
116
  "planner.availabilityRuleSets.availability.ruleset.createError": "Nie udało się zapisać harmonogramu.",
117
117
  "planner.availabilityRuleSets.availability.ruleset.createName": "Nazwa harmonogramu",
@@ -247,7 +247,7 @@
247
247
  "planner.resources.availability.dateSpecific.saved": "Godziny dla dat zapisane.",
248
248
  "planner.resources.availability.dateSpecific.subtitle": "Dostosuj godziny dla wybranych dni.",
249
249
  "planner.resources.availability.dateSpecific.title": "Godziny dla konkretnych dat",
250
- "planner.resources.availability.ruleset.confirm": "Zmiana harmonogramu zresetuje niestandardowe godziny. Kontynuować?",
250
+ "planner.resources.availability.ruleset.confirm": "Przywrócenie harmonogramu usunie Twoje niestandardowe godziny. Kontynuować?",
251
251
  "planner.resources.availability.ruleset.create": "Nowy harmonogram",
252
252
  "planner.resources.availability.ruleset.createError": "Nie udało się zapisać harmonogramu.",
253
253
  "planner.resources.availability.ruleset.createName": "Nazwa harmonogramu",
@@ -376,7 +376,7 @@
376
376
  "planner.teamMembers.availability.repeat.daily": "Codziennie",
377
377
  "planner.teamMembers.availability.repeat.once": "Jednorazowo",
378
378
  "planner.teamMembers.availability.repeat.weekly": "Co tydzień",
379
- "planner.teamMembers.availability.ruleset.confirm": "Zmiana harmonogramu zresetuje niestandardowe godziny. Kontynuować?",
379
+ "planner.teamMembers.availability.ruleset.confirm": "Przywrócenie harmonogramu usunie Twoje niestandardowe godziny. Kontynuować?",
380
380
  "planner.teamMembers.availability.ruleset.create": "Nowy harmonogram",
381
381
  "planner.teamMembers.availability.ruleset.createError": "Nie udało się zapisać harmonogramu.",
382
382
  "planner.teamMembers.availability.ruleset.createName": "Nazwa harmonogramu",