@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.
- package/dist/modules/customer_accounts/api/admin/users/[id]/reset-password.js +1 -0
- package/dist/modules/customer_accounts/api/admin/users/[id]/reset-password.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/users/[id]/send-reset-link.js +1 -0
- package/dist/modules/customer_accounts/api/admin/users/[id]/send-reset-link.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/users/[id]/verify-email.js +1 -0
- package/dist/modules/customer_accounts/api/admin/users/[id]/verify-email.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/users/[id].js +1 -0
- package/dist/modules/customer_accounts/api/admin/users/[id].js.map +2 -2
- package/dist/modules/customer_accounts/api/email/verify.js +1 -0
- package/dist/modules/customer_accounts/api/email/verify.js.map +2 -2
- package/dist/modules/customer_accounts/api/portal/events/stream.js +20 -2
- package/dist/modules/customer_accounts/api/portal/events/stream.js.map +2 -2
- package/dist/modules/planner/components/AvailabilityRulesEditor.js +19 -13
- package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
- package/dist/modules/planner/components/availabilityRulesEditorState.js +10 -1
- package/dist/modules/planner/components/availabilityRulesEditorState.js.map +2 -2
- package/package.json +7 -7
- package/src/modules/customer_accounts/api/admin/users/[id]/reset-password.ts +1 -0
- package/src/modules/customer_accounts/api/admin/users/[id]/send-reset-link.ts +1 -0
- package/src/modules/customer_accounts/api/admin/users/[id]/verify-email.ts +1 -0
- package/src/modules/customer_accounts/api/admin/users/[id].ts +1 -0
- package/src/modules/customer_accounts/api/email/verify.ts +1 -0
- package/src/modules/customer_accounts/api/portal/events/stream.ts +23 -2
- package/src/modules/planner/components/AvailabilityRulesEditor.tsx +20 -13
- package/src/modules/planner/components/availabilityRulesEditorState.ts +21 -0
- package/src/modules/planner/i18n/de.json +3 -3
- package/src/modules/planner/i18n/en.json +3 -3
- package/src/modules/planner/i18n/es.json +3 -3
- 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
|
-
|
|
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": "
|
|
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.
|
|
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.
|
|
247
|
-
"@open-mercato/shared": "0.6.4-develop.
|
|
248
|
-
"@open-mercato/ui": "0.6.4-develop.
|
|
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.
|
|
254
|
-
"@open-mercato/shared": "0.6.4-develop.
|
|
255
|
-
"@open-mercato/ui": "0.6.4-develop.
|
|
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,
|
|
@@ -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
|
-
|
|
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
|
|
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 {
|
|
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`, '
|
|
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
|
-
|
|
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
|
-
|
|
976
|
-
|
|
977
|
-
|
|
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
|
-
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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",
|