@burdenoff/microfe-planmagnet 2026.1001.1 → 2026.1001.3
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/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoot.js +163 -150
- package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +124 -108
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/comments/CommentThread.js +36 -36
- package/dist/planmagnet/comments/RoadmapComments.js +21 -21
- package/dist/planmagnet/controls/AutomationRuleControls.js +24 -24
- package/dist/planmagnet/controls/FeatureControls.js +60 -60
- package/dist/planmagnet/controls/MilestoneControls.d.ts +2 -0
- package/dist/planmagnet/controls/MilestoneControls.d.ts.map +1 -1
- package/dist/planmagnet/controls/MilestoneControls.js +89 -72
- package/dist/planmagnet/controls/MilestoneControls.js.map +1 -1
- package/dist/planmagnet/controls/SyncControls.js +59 -59
- package/dist/planmagnet/discussion/WorkItemDiscussionPanel.js +15 -15
- package/dist/planmagnet/docs/DocSuggestionsPanel.js +12 -12
- package/dist/planmagnet/docs/DocVersionCompare.js +3 -3
- package/dist/planmagnet/forecast/DeliveryForecastCard.d.ts +12 -0
- package/dist/planmagnet/forecast/DeliveryForecastCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/DeliveryForecastCard.js +208 -0
- package/dist/planmagnet/forecast/DeliveryForecastCard.js.map +1 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.d.ts +5 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.js +190 -0
- package/dist/planmagnet/forecast/ProjectOutlookCard.js.map +1 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.d.ts +5 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js +99 -0
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js.map +1 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.d.ts +8 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.d.ts.map +1 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.js +185 -0
- package/dist/planmagnet/forecast/ResourceForecastCard.js.map +1 -0
- package/dist/planmagnet/forecast/riskFlags.d.ts +35 -0
- package/dist/planmagnet/forecast/riskFlags.d.ts.map +1 -0
- package/dist/planmagnet/forecast/riskFlags.js +37 -0
- package/dist/planmagnet/forecast/riskFlags.js.map +1 -0
- package/dist/planmagnet/meetings/MeetingActionItemsPanel.d.ts +17 -0
- package/dist/planmagnet/meetings/MeetingActionItemsPanel.d.ts.map +1 -0
- package/dist/planmagnet/meetings/MeetingActionItemsPanel.js +218 -0
- package/dist/planmagnet/meetings/MeetingActionItemsPanel.js.map +1 -0
- package/dist/planmagnet/meetings/MeetingsCard.d.ts +7 -0
- package/dist/planmagnet/meetings/MeetingsCard.d.ts.map +1 -0
- package/dist/planmagnet/meetings/MeetingsCard.js +108 -0
- package/dist/planmagnet/meetings/MeetingsCard.js.map +1 -0
- package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.d.ts +9 -0
- package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.d.ts.map +1 -0
- package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.js +232 -0
- package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.js.map +1 -0
- package/dist/planmagnet/meetings/ScheduleMeetingDialog.d.ts +19 -0
- package/dist/planmagnet/meetings/ScheduleMeetingDialog.d.ts.map +1 -0
- package/dist/planmagnet/meetings/ScheduleMeetingDialog.js +226 -0
- package/dist/planmagnet/meetings/ScheduleMeetingDialog.js.map +1 -0
- package/dist/planmagnet/meetings/UnlinkMeetingDialog.d.ts +14 -0
- package/dist/planmagnet/meetings/UnlinkMeetingDialog.d.ts.map +1 -0
- package/dist/planmagnet/meetings/UnlinkMeetingDialog.js +81 -0
- package/dist/planmagnet/meetings/UnlinkMeetingDialog.js.map +1 -0
- package/dist/planmagnet/meetings/meetingActions.d.ts +57 -0
- package/dist/planmagnet/meetings/meetingActions.d.ts.map +1 -0
- package/dist/planmagnet/meetings/meetingActions.js +51 -0
- package/dist/planmagnet/meetings/meetingActions.js.map +1 -0
- package/dist/planmagnet/meetings/meetingGraphql.d.ts +29 -0
- package/dist/planmagnet/meetings/meetingGraphql.d.ts.map +1 -0
- package/dist/planmagnet/meetings/meetingGraphql.js +166 -0
- package/dist/planmagnet/meetings/meetingGraphql.js.map +1 -0
- package/dist/planmagnet/meetings/meetingModel.d.ts +74 -0
- package/dist/planmagnet/meetings/meetingModel.d.ts.map +1 -0
- package/dist/planmagnet/meetings/meetingModel.js +88 -0
- package/dist/planmagnet/meetings/meetingModel.js.map +1 -0
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +216 -182
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js +11 -11
- package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js +4 -4
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js +163 -163
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js +165 -165
- package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js.map +1 -1
- package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.js +197 -0
- package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/MeetingsMeetingsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/MeetingsMeetingsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/MeetingsMeetingsPagePage.js +173 -0
- package/dist/planmagnet/pages/MeetingsMeetingsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js +234 -0
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +73 -52
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +205 -190
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +211 -182
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ReportsReportPagePage.js +22 -22
- package/dist/planmagnet/pages/ReportsReportPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ReportsReportsPagePage.js +21 -21
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.js +88 -83
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.d.ts.map +1 -1
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js +139 -112
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js.map +1 -1
- package/dist/planmagnet/pages/analytics/StatusFlowCard.js +21 -21
- package/dist/planmagnet/product/ProductControls.js +91 -91
- package/dist/planmagnet/reports/SchedulesPanel.js +33 -33
- package/dist/planmagnet/reports/ShareDialog.js +76 -76
- package/dist/planmagnet/reports/ShareDialog.js.map +1 -1
- package/dist/planmagnet/reports/sharedReportRoute.d.ts +3 -2
- package/dist/planmagnet/reports/sharedReportRoute.d.ts.map +1 -1
- package/dist/planmagnet/reports/sharedReportRoute.js.map +1 -1
- package/dist/planmagnet/roadmaps/RoadmapControls.js +60 -60
- package/dist/planmagnet/roadmaps/RoadmapNowNextLater.js +30 -30
- package/dist/planmagnet/roadmaps/RoadmapReviewPanel.js +21 -21
- package/dist/planmagnet/roadmaps/RoadmapVersionsPanel.js +22 -22
- package/package.json +1 -1
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { gql as e } from "@apollo/client";
|
|
2
|
+
//#region src/planmagnet/meetings/meetingGraphql.ts
|
|
3
|
+
var t = e`
|
|
4
|
+
query ScheduleMeetingCalendars($pagination: CalendarPaginationInput) {
|
|
5
|
+
calendars(pagination: $pagination) {
|
|
6
|
+
calendars {
|
|
7
|
+
id
|
|
8
|
+
name
|
|
9
|
+
isDefault
|
|
10
|
+
calendarType
|
|
11
|
+
}
|
|
12
|
+
hasMore
|
|
13
|
+
total
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
`, n = e`
|
|
17
|
+
mutation ScheduleMeetingCreateEvent($input: CreateEventInput!) {
|
|
18
|
+
createEvent(input: $input) {
|
|
19
|
+
id
|
|
20
|
+
startTime
|
|
21
|
+
endTime
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
`, r = e`
|
|
25
|
+
mutation ScheduleMeetingDeleteEvent($id: ID!, $scope: UpdateScope) {
|
|
26
|
+
deleteEvent(id: $id, scope: $scope)
|
|
27
|
+
}
|
|
28
|
+
`, i = ["ListPlanmagnetMeetings", "GetPlanmagnetMeeting"], a = e`
|
|
29
|
+
query ListPlanmagnetMeetings(
|
|
30
|
+
$workspaceId: ID!
|
|
31
|
+
$filter: PlanmagnetMeetingFilter
|
|
32
|
+
$pagination: PlanmagnetPaginationInput
|
|
33
|
+
) {
|
|
34
|
+
planmagnetMeetings(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {
|
|
35
|
+
items {
|
|
36
|
+
id
|
|
37
|
+
title
|
|
38
|
+
kind
|
|
39
|
+
startsAt
|
|
40
|
+
endsAt
|
|
41
|
+
calendarEventId
|
|
42
|
+
recurrenceRule
|
|
43
|
+
projectId
|
|
44
|
+
project {
|
|
45
|
+
id
|
|
46
|
+
name
|
|
47
|
+
}
|
|
48
|
+
sprintId
|
|
49
|
+
milestoneId
|
|
50
|
+
actionItems {
|
|
51
|
+
id
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
totalCount
|
|
55
|
+
pageInfo {
|
|
56
|
+
hasNextPage
|
|
57
|
+
endCursor
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
`, o = e`
|
|
62
|
+
query GetPlanmagnetMeeting($id: ID!) {
|
|
63
|
+
planmagnetMeeting(id: $id) {
|
|
64
|
+
id
|
|
65
|
+
title
|
|
66
|
+
kind
|
|
67
|
+
agenda
|
|
68
|
+
notes
|
|
69
|
+
startsAt
|
|
70
|
+
endsAt
|
|
71
|
+
calendarEventId
|
|
72
|
+
recurrenceRule
|
|
73
|
+
projectId
|
|
74
|
+
project {
|
|
75
|
+
id
|
|
76
|
+
name
|
|
77
|
+
}
|
|
78
|
+
sprintId
|
|
79
|
+
sprint {
|
|
80
|
+
id
|
|
81
|
+
name
|
|
82
|
+
}
|
|
83
|
+
milestoneId
|
|
84
|
+
milestone {
|
|
85
|
+
id
|
|
86
|
+
name
|
|
87
|
+
}
|
|
88
|
+
createdBy
|
|
89
|
+
createdAt
|
|
90
|
+
updatedBy
|
|
91
|
+
updatedAt
|
|
92
|
+
actionItems {
|
|
93
|
+
id
|
|
94
|
+
workItemId
|
|
95
|
+
workItem {
|
|
96
|
+
id
|
|
97
|
+
key
|
|
98
|
+
title
|
|
99
|
+
status
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
`, s = e`
|
|
105
|
+
mutation ScheduleMeetingLink($workspaceId: ID!, $input: PlanmagnetLinkMeetingInput!) {
|
|
106
|
+
planmagnetLinkMeeting(workspaceId: $workspaceId, input: $input) {
|
|
107
|
+
id
|
|
108
|
+
title
|
|
109
|
+
kind
|
|
110
|
+
startsAt
|
|
111
|
+
endsAt
|
|
112
|
+
calendarEventId
|
|
113
|
+
recurrenceRule
|
|
114
|
+
projectId
|
|
115
|
+
sprintId
|
|
116
|
+
milestoneId
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
`, c = e`
|
|
120
|
+
mutation MeetingDetailUpdate($id: ID!, $input: PlanmagnetUpdateMeetingInput!) {
|
|
121
|
+
planmagnetUpdateMeeting(id: $id, input: $input) {
|
|
122
|
+
id
|
|
123
|
+
title
|
|
124
|
+
kind
|
|
125
|
+
agenda
|
|
126
|
+
notes
|
|
127
|
+
startsAt
|
|
128
|
+
endsAt
|
|
129
|
+
recurrenceRule
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
`, l = e`
|
|
133
|
+
mutation MeetingDetailUnlink($id: ID!) {
|
|
134
|
+
planmagnetUnlinkMeeting(id: $id)
|
|
135
|
+
}
|
|
136
|
+
`, u = e`
|
|
137
|
+
mutation MeetingAddActionItem($meetingId: ID!, $workItemId: ID!) {
|
|
138
|
+
planmagnetAddMeetingActionItem(meetingId: $meetingId, workItemId: $workItemId) {
|
|
139
|
+
id
|
|
140
|
+
workItemId
|
|
141
|
+
workItem {
|
|
142
|
+
id
|
|
143
|
+
key
|
|
144
|
+
title
|
|
145
|
+
status
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
`, d = e`
|
|
150
|
+
mutation MeetingRemoveActionItem($meetingId: ID!, $workItemId: ID!) {
|
|
151
|
+
planmagnetRemoveMeetingActionItem(meetingId: $meetingId, workItemId: $workItemId)
|
|
152
|
+
}
|
|
153
|
+
`, f = e`
|
|
154
|
+
mutation MeetingCreateActionWorkItem($input: PlanmagnetCreateWorkItemInput!) {
|
|
155
|
+
planmagnetCreateWorkItem(input: $input) {
|
|
156
|
+
id
|
|
157
|
+
key
|
|
158
|
+
title
|
|
159
|
+
status
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
`;
|
|
163
|
+
//#endregion
|
|
164
|
+
export { u as ADD_MEETING_ACTION_ITEM, n as CREATE_CALENDAR_EVENT, f as CREATE_MEETING_ACTION_WORK_ITEM, r as DELETE_CALENDAR_EVENT, o as GET_PLANMAGNET_MEETING, s as LINK_PLANMAGNET_MEETING, a as LIST_PLANMAGNET_MEETINGS, i as MEETING_QUERIES, d as REMOVE_MEETING_ACTION_ITEM, t as SCHEDULE_MEETING_CALENDARS, l as UNLINK_PLANMAGNET_MEETING, c as UPDATE_PLANMAGNET_MEETING };
|
|
165
|
+
|
|
166
|
+
//# sourceMappingURL=meetingGraphql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meetingGraphql.js","names":[],"sources":["../../../src/planmagnet/meetings/meetingGraphql.ts"],"sourcesContent":["import { gql } from '@apollo/client';\n\n/**\n * GraphQL documents for PlanMagnet meetings (GAP-06, CWF-22/23), from two different subgraphs:\n *\n * - The platform **Calendar** module (`calendars`, `createEvent`, `deleteEvent`) — a meeting's real schedule\n * lives here. The UI creates the calendar event AS THE USER, then links it below.\n * - **PlanMagnet** itself (`planmagnetMeeting(s)`, `planmagnetLinkMeeting`, `planmagnetUpdateMeeting`,\n * `planmagnetUnlinkMeeting`, the action-item mutations) — PlanMagnet-owned content (agenda/notes/kind) plus a\n * read-only snapshot of the schedule for listing/sorting. See `PlanmagnetMeeting`'s doc comment in\n * `graphql/wspace.graphql` for the full split, and `meetingActions.ts` for how the two are composed.\n *\n * Selection sets are written out in full rather than shared via fragment interpolation, same convention as\n * `reports/reportGraphql.ts` (one literal per `gql` call; validated by `bun run validate:schema` against\n * `graphql/wspace.graphql`).\n */\n\n// ─── Platform Calendar ──────────────────────────────────────────────────────────────────────────────────────\n\nexport const SCHEDULE_MEETING_CALENDARS = gql`\n query ScheduleMeetingCalendars($pagination: CalendarPaginationInput) {\n calendars(pagination: $pagination) {\n calendars {\n id\n name\n isDefault\n calendarType\n }\n hasMore\n total\n }\n }\n`;\n\nexport const CREATE_CALENDAR_EVENT = gql`\n mutation ScheduleMeetingCreateEvent($input: CreateEventInput!) {\n createEvent(input: $input) {\n id\n startTime\n endTime\n }\n }\n`;\n\nexport const DELETE_CALENDAR_EVENT = gql`\n mutation ScheduleMeetingDeleteEvent($id: ID!, $scope: UpdateScope) {\n deleteEvent(id: $id, scope: $scope)\n }\n`;\n\n// ─── PlanMagnet meetings ────────────────────────────────────────────────────────────────────────────────────\n\n/** Every query a meeting write should refresh. */\nexport const MEETING_QUERIES = ['ListPlanmagnetMeetings', 'GetPlanmagnetMeeting'];\n\nexport const LIST_PLANMAGNET_MEETINGS = gql`\n query ListPlanmagnetMeetings(\n $workspaceId: ID!\n $filter: PlanmagnetMeetingFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetMeetings(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n items {\n id\n title\n kind\n startsAt\n endsAt\n calendarEventId\n recurrenceRule\n projectId\n project {\n id\n name\n }\n sprintId\n milestoneId\n actionItems {\n id\n }\n }\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n`;\n\nexport const GET_PLANMAGNET_MEETING = gql`\n query GetPlanmagnetMeeting($id: ID!) {\n planmagnetMeeting(id: $id) {\n id\n title\n kind\n agenda\n notes\n startsAt\n endsAt\n calendarEventId\n recurrenceRule\n projectId\n project {\n id\n name\n }\n sprintId\n sprint {\n id\n name\n }\n milestoneId\n milestone {\n id\n name\n }\n createdBy\n createdAt\n updatedBy\n updatedAt\n actionItems {\n id\n workItemId\n workItem {\n id\n key\n title\n status\n }\n }\n }\n }\n`;\n\nexport const LINK_PLANMAGNET_MEETING = gql`\n mutation ScheduleMeetingLink($workspaceId: ID!, $input: PlanmagnetLinkMeetingInput!) {\n planmagnetLinkMeeting(workspaceId: $workspaceId, input: $input) {\n id\n title\n kind\n startsAt\n endsAt\n calendarEventId\n recurrenceRule\n projectId\n sprintId\n milestoneId\n }\n }\n`;\n\nexport const UPDATE_PLANMAGNET_MEETING = gql`\n mutation MeetingDetailUpdate($id: ID!, $input: PlanmagnetUpdateMeetingInput!) {\n planmagnetUpdateMeeting(id: $id, input: $input) {\n id\n title\n kind\n agenda\n notes\n startsAt\n endsAt\n recurrenceRule\n }\n }\n`;\n\nexport const UNLINK_PLANMAGNET_MEETING = gql`\n mutation MeetingDetailUnlink($id: ID!) {\n planmagnetUnlinkMeeting(id: $id)\n }\n`;\n\nexport const ADD_MEETING_ACTION_ITEM = gql`\n mutation MeetingAddActionItem($meetingId: ID!, $workItemId: ID!) {\n planmagnetAddMeetingActionItem(meetingId: $meetingId, workItemId: $workItemId) {\n id\n workItemId\n workItem {\n id\n key\n title\n status\n }\n }\n }\n`;\n\nexport const REMOVE_MEETING_ACTION_ITEM = gql`\n mutation MeetingRemoveActionItem($meetingId: ID!, $workItemId: ID!) {\n planmagnetRemoveMeetingActionItem(meetingId: $meetingId, workItemId: $workItemId)\n }\n`;\n\n/** Minimal create, for \"Add action item\" (a brand-new work item attached to the meeting it was raised in). */\nexport const CREATE_MEETING_ACTION_WORK_ITEM = gql`\n mutation MeetingCreateActionWorkItem($input: PlanmagnetCreateWorkItemInput!) {\n planmagnetCreateWorkItem(input: $input) {\n id\n key\n title\n status\n }\n }\n`;\n"],"mappings":";;AAmBA,IAAa,IAA6B,CAAG;;;;;;;;;;;;;GAehC,IAAwB,CAAG;;;;;;;;GAU3B,IAAwB,CAAG;;;;GAS3B,IAAkB,CAAC,0BAA0B,uBAAuB,EAEpE,IAA2B,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmC9B,IAAyB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6C5B,IAA0B,CAAG;;;;;;;;;;;;;;;GAiB7B,IAA4B,CAAG;;;;;;;;;;;;;GAe/B,IAA4B,CAAG;;;;GAM/B,IAA0B,CAAG;;;;;;;;;;;;;GAe7B,IAA6B,CAAG;;;;GAOhC,IAAkC,CAAG"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types, RRULE helpers and client-side validation for PlanMagnet meetings (GAP-06, CWF-22/23).
|
|
3
|
+
*
|
|
4
|
+
* A meeting is scheduled through the platform Calendar module (`createEvent`) and then recorded here
|
|
5
|
+
* (`planmagnetLinkMeeting`) — see `graphql/wspace.graphql`'s `PlanmagnetMeeting` doc comment and
|
|
6
|
+
* `meetingActions.ts` for the "who creates the calendar event" split this file's helpers serve.
|
|
7
|
+
*/
|
|
8
|
+
/** Mirrors `PlanmagnetMeetingKind` (graphql/wspace.graphql). TEXT-backed server-side, not a Postgres enum, so a
|
|
9
|
+
* future value never needs an `ALTER TYPE` — this list is the only client-side validator, same contract as the
|
|
10
|
+
* server's. */
|
|
11
|
+
export declare const MEETING_KINDS: readonly ["STANDUP", "PLANNING", "REVIEW", "RETROSPECTIVE", "DEMO", "MILESTONE_CELEBRATION", "OTHER"];
|
|
12
|
+
export type MeetingKind = (typeof MEETING_KINDS)[number];
|
|
13
|
+
/** Server rule mirrored client-side (see `PlanmagnetMeetingKind.MILESTONE_CELEBRATION`'s doc comment in the
|
|
14
|
+
* schema): only this kind requires a milestone. */
|
|
15
|
+
export declare const MEETING_KIND_REQUIRES_MILESTONE: ReadonlySet<MeetingKind>;
|
|
16
|
+
export declare const RECURRENCE_OPTIONS: readonly ["NONE", "EVERY_WEEKDAY", "WEEKLY"];
|
|
17
|
+
export type RecurrenceOption = (typeof RECURRENCE_OPTIONS)[number];
|
|
18
|
+
export declare const RECURRENCE_LABELS: Record<RecurrenceOption, string>;
|
|
19
|
+
/** Common meeting lengths, in minutes, for the duration select. */
|
|
20
|
+
export declare const DURATION_OPTIONS_MINUTES: readonly [15, 30, 45, 60, 90, 120];
|
|
21
|
+
/**
|
|
22
|
+
* An ISO (UTC) instant -> the value a `<input type="datetime-local">` needs, in the VIEWER's own zone. Distinct
|
|
23
|
+
* from `timeShared.ts`'s `toDateInputValue`, which is for pure calendar-day fields and stays UTC — a meeting's
|
|
24
|
+
* start is a real moment, read in local wall-clock time (repo convention: moments show local, calendar days
|
|
25
|
+
* show UTC).
|
|
26
|
+
*/
|
|
27
|
+
export declare function toLocalInputValue(iso: string | null | undefined): string;
|
|
28
|
+
/** The reverse of `toLocalInputValue`: a `datetime-local` value (viewer's local wall-clock, no zone suffix) -> an
|
|
29
|
+
* ISO UTC instant for the wire. `Date` parses a zone-less date-time string as local time, which is exactly the
|
|
30
|
+
* conversion wanted here. */
|
|
31
|
+
export declare function localInputValueToISO(value: string): string | null;
|
|
32
|
+
/** `startIso` plus a duration in minutes, as an ISO UTC instant. */
|
|
33
|
+
export declare function addMinutesIso(startIso: string, minutes: number): string;
|
|
34
|
+
/** Now, rounded up to the next half hour, as a `datetime-local` value — the dialog's default start. */
|
|
35
|
+
export declare function defaultLocalStart(from?: Date): string;
|
|
36
|
+
/** The viewer's IANA time zone, sent to `createEvent` so the server (and any other client) can re-derive what
|
|
37
|
+
* "every weekday" means for this series. Falls back to UTC if the runtime cannot report one. */
|
|
38
|
+
export declare function viewerTimeZone(): string;
|
|
39
|
+
/** An RFC 5545 UTC `UNTIL` value: `YYYYMMDDTHHMMSSZ`. Exported for callers (`ScheduleCeremoniesDialog`) that
|
|
40
|
+
* build an UNTIL-bearing RRULE by hand rather than through `buildRRule` (the standup's UNTIL is the sprint's
|
|
41
|
+
* own end day, not something the WEEKLY/EVERY_WEEKDAY picker above expresses). */
|
|
42
|
+
export declare function rruleUntil(until: Date): string;
|
|
43
|
+
/**
|
|
44
|
+
* Builds the RRULE written to BOTH the calendar event (`createEvent.input.rrule`) and the link's
|
|
45
|
+
* `recurrenceRule` snapshot — the two must agree, since the snapshot is display-only and the calendar event
|
|
46
|
+
* stays the source of truth for the real schedule (`PlanmagnetMeeting.recurrenceRule` doc comment).
|
|
47
|
+
*
|
|
48
|
+
* `startLocalValue` is the `datetime-local` value the recurrence's weekday is read from (the viewer's own
|
|
49
|
+
* wall-clock day — reading it from a UTC-shifted instant could land on the wrong day near midnight).
|
|
50
|
+
* `until`, when given, is the last UTC instant the series may recur through (sprint ceremonies' daily standup).
|
|
51
|
+
*/
|
|
52
|
+
export declare function buildRRule(option: RecurrenceOption, startLocalValue: string, until?: Date | null): string | undefined;
|
|
53
|
+
/** A short, human summary of a calendar RRULE snapshot (display only — see `PlanmagnetMeeting.recurrenceRule`'s
|
|
54
|
+
* doc comment; the calendar event is the real schedule). */
|
|
55
|
+
export declare function summarizeRecurrence(rrule: string | null | undefined): string;
|
|
56
|
+
export interface MeetingDraft {
|
|
57
|
+
title: string;
|
|
58
|
+
calendarId: string;
|
|
59
|
+
startLocal: string;
|
|
60
|
+
durationMinutes: number;
|
|
61
|
+
kind: MeetingKind;
|
|
62
|
+
milestoneId?: string | null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Client-side mirror of the rules `MeetingService` enforces: a calendar and a start are required to create the
|
|
66
|
+
* event at all; a positive duration keeps `endsAt` structurally after `startsAt` (these dialogs only ever take a
|
|
67
|
+
* start + a duration, never an independent end); `MILESTONE_CELEBRATION` requires a milestone (the schema's own
|
|
68
|
+
* doc comment on that enum value). Text-length caps are deliberately NOT mirrored here — the schema documents
|
|
69
|
+
* `agenda`/`notes` as "Length-capped" without publishing the number, so an over-length value is left to the
|
|
70
|
+
* server's own refusal, shown verbatim (never a guessed client-side limit that could be wrong in either
|
|
71
|
+
* direction).
|
|
72
|
+
*/
|
|
73
|
+
export declare function validateMeetingDraft(draft: MeetingDraft): string | null;
|
|
74
|
+
//# sourceMappingURL=meetingModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meetingModel.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/meetings/meetingModel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;gBAEgB;AAChB,eAAO,MAAM,aAAa,uGAQhB,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD;oDACoD;AACpD,eAAO,MAAM,+BAA+B,EAAE,WAAW,CAAC,WAAW,CAEnE,CAAC;AAEH,eAAO,MAAM,kBAAkB,8CAA+C,CAAC;AAC/E,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAI9D,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,wBAAwB,oCAAqC,CAAC;AAI3E;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKxE;AAED;;8BAE8B;AAC9B,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIjE;AAED,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,uGAAuG;AACvG,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CASjE;AAED;iGACiG;AACjG,wBAAgB,cAAc,IAAI,MAAM,CAMvC;AAaD;;mFAEmF;AACnF,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAK9C;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,gBAAgB,EACxB,eAAe,EAAE,MAAM,EACvB,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,GAClB,MAAM,GAAG,SAAS,CAOpB;AAED;6DAC6D;AAC7D,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAe5E;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAWvE"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
//#region src/planmagnet/meetings/meetingModel.ts
|
|
2
|
+
var e = [
|
|
3
|
+
"STANDUP",
|
|
4
|
+
"PLANNING",
|
|
5
|
+
"REVIEW",
|
|
6
|
+
"RETROSPECTIVE",
|
|
7
|
+
"DEMO",
|
|
8
|
+
"MILESTONE_CELEBRATION",
|
|
9
|
+
"OTHER"
|
|
10
|
+
], t = new Set(["MILESTONE_CELEBRATION"]), n = [
|
|
11
|
+
"NONE",
|
|
12
|
+
"EVERY_WEEKDAY",
|
|
13
|
+
"WEEKLY"
|
|
14
|
+
], r = {
|
|
15
|
+
NONE: "Does not repeat",
|
|
16
|
+
EVERY_WEEKDAY: "Every weekday",
|
|
17
|
+
WEEKLY: "Weekly"
|
|
18
|
+
}, i = [
|
|
19
|
+
15,
|
|
20
|
+
30,
|
|
21
|
+
45,
|
|
22
|
+
60,
|
|
23
|
+
90,
|
|
24
|
+
120
|
|
25
|
+
], a = (e) => String(e).padStart(2, "0");
|
|
26
|
+
function o(e) {
|
|
27
|
+
if (!e) return "";
|
|
28
|
+
let t = new Date(e);
|
|
29
|
+
return Number.isNaN(t.getTime()) ? "" : `${t.getFullYear()}-${a(t.getMonth() + 1)}-${a(t.getDate())}T${a(t.getHours())}:${a(t.getMinutes())}`;
|
|
30
|
+
}
|
|
31
|
+
function s(e) {
|
|
32
|
+
if (!e) return null;
|
|
33
|
+
let t = new Date(e);
|
|
34
|
+
return Number.isNaN(t.getTime()) ? null : t.toISOString();
|
|
35
|
+
}
|
|
36
|
+
function c(e, t) {
|
|
37
|
+
return new Date(new Date(e).getTime() + t * 6e4).toISOString();
|
|
38
|
+
}
|
|
39
|
+
function l(e = /* @__PURE__ */ new Date()) {
|
|
40
|
+
let t = new Date(e);
|
|
41
|
+
return t.setSeconds(0, 0), t.getMinutes() > 30 ? t.setHours(t.getHours() + 1, 0, 0, 0) : t.getMinutes() > 0 && t.setMinutes(30, 0, 0), o(t.toISOString());
|
|
42
|
+
}
|
|
43
|
+
function u() {
|
|
44
|
+
try {
|
|
45
|
+
return Intl.DateTimeFormat().resolvedOptions().timeZone || "UTC";
|
|
46
|
+
} catch {
|
|
47
|
+
return "UTC";
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
var d = [
|
|
51
|
+
"SU",
|
|
52
|
+
"MO",
|
|
53
|
+
"TU",
|
|
54
|
+
"WE",
|
|
55
|
+
"TH",
|
|
56
|
+
"FR",
|
|
57
|
+
"SA"
|
|
58
|
+
], f = {
|
|
59
|
+
SU: "Sun",
|
|
60
|
+
MO: "Mon",
|
|
61
|
+
TU: "Tue",
|
|
62
|
+
WE: "Wed",
|
|
63
|
+
TH: "Thu",
|
|
64
|
+
FR: "Fri",
|
|
65
|
+
SA: "Sat"
|
|
66
|
+
};
|
|
67
|
+
function p(e) {
|
|
68
|
+
return e.toISOString().replace(/[-:]/g, "").replace(/\.\d{3}Z$/, "Z");
|
|
69
|
+
}
|
|
70
|
+
function m(e, t, n) {
|
|
71
|
+
if (e === "NONE") return;
|
|
72
|
+
let r = n ? `;UNTIL=${p(n)}` : "";
|
|
73
|
+
if (e === "EVERY_WEEKDAY") return `FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR${r}`;
|
|
74
|
+
let i = new Date(t);
|
|
75
|
+
return `FREQ=WEEKLY;BYDAY=${Number.isNaN(i.getTime()) ? "MO" : d[i.getDay()]}${r}`;
|
|
76
|
+
}
|
|
77
|
+
function h(e) {
|
|
78
|
+
if (!e) return "Does not repeat";
|
|
79
|
+
let t = /BYDAY=([^;]+)/.exec(e)?.[1], n = /UNTIL=(\d{4})(\d{2})(\d{2})/.exec(e), r;
|
|
80
|
+
return r = t === "MO,TU,WE,TH,FR" ? "Every weekday" : t ? `Weekly on ${t.split(",").map((e) => f[e] ?? e).join(", ")}` : /FREQ=DAILY/.test(e) ? "Daily" : "Repeats", n && (r += ` until ${n[2]}/${n[3]}/${n[1]}`), r;
|
|
81
|
+
}
|
|
82
|
+
function g(e) {
|
|
83
|
+
return e.title.trim() ? e.calendarId ? e.startLocal ? !Number.isFinite(e.durationMinutes) || e.durationMinutes <= 0 ? "Duration must be at least 1 minute." : t.has(e.kind) && !e.milestoneId ? "A milestone celebration needs a milestone." : null : "Pick a start time." : "Pick a calendar." : "A title is required.";
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
86
|
+
export { i as DURATION_OPTIONS_MINUTES, e as MEETING_KINDS, r as RECURRENCE_LABELS, n as RECURRENCE_OPTIONS, c as addMinutesIso, m as buildRRule, l as defaultLocalStart, s as localInputValueToISO, p as rruleUntil, h as summarizeRecurrence, g as validateMeetingDraft, u as viewerTimeZone };
|
|
87
|
+
|
|
88
|
+
//# sourceMappingURL=meetingModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meetingModel.js","names":[],"sources":["../../../src/planmagnet/meetings/meetingModel.ts"],"sourcesContent":["/**\n * Shared types, RRULE helpers and client-side validation for PlanMagnet meetings (GAP-06, CWF-22/23).\n *\n * A meeting is scheduled through the platform Calendar module (`createEvent`) and then recorded here\n * (`planmagnetLinkMeeting`) — see `graphql/wspace.graphql`'s `PlanmagnetMeeting` doc comment and\n * `meetingActions.ts` for the \"who creates the calendar event\" split this file's helpers serve.\n */\n\n/** Mirrors `PlanmagnetMeetingKind` (graphql/wspace.graphql). TEXT-backed server-side, not a Postgres enum, so a\n * future value never needs an `ALTER TYPE` — this list is the only client-side validator, same contract as the\n * server's. */\nexport const MEETING_KINDS = [\n 'STANDUP',\n 'PLANNING',\n 'REVIEW',\n 'RETROSPECTIVE',\n 'DEMO',\n 'MILESTONE_CELEBRATION',\n 'OTHER',\n] as const;\nexport type MeetingKind = (typeof MEETING_KINDS)[number];\n\n/** Server rule mirrored client-side (see `PlanmagnetMeetingKind.MILESTONE_CELEBRATION`'s doc comment in the\n * schema): only this kind requires a milestone. */\nexport const MEETING_KIND_REQUIRES_MILESTONE: ReadonlySet<MeetingKind> = new Set([\n 'MILESTONE_CELEBRATION',\n]);\n\nexport const RECURRENCE_OPTIONS = ['NONE', 'EVERY_WEEKDAY', 'WEEKLY'] as const;\nexport type RecurrenceOption = (typeof RECURRENCE_OPTIONS)[number];\n\nexport const RECURRENCE_LABELS: Record<RecurrenceOption, string> = {\n NONE: 'Does not repeat',\n EVERY_WEEKDAY: 'Every weekday',\n WEEKLY: 'Weekly',\n};\n\n/** Common meeting lengths, in minutes, for the duration select. */\nexport const DURATION_OPTIONS_MINUTES = [15, 30, 45, 60, 90, 120] as const;\n\nconst pad = (n: number): string => String(n).padStart(2, '0');\n\n/**\n * An ISO (UTC) instant -> the value a `<input type=\"datetime-local\">` needs, in the VIEWER's own zone. Distinct\n * from `timeShared.ts`'s `toDateInputValue`, which is for pure calendar-day fields and stays UTC — a meeting's\n * start is a real moment, read in local wall-clock time (repo convention: moments show local, calendar days\n * show UTC).\n */\nexport function toLocalInputValue(iso: string | null | undefined): string {\n if (!iso) return '';\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return '';\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;\n}\n\n/** The reverse of `toLocalInputValue`: a `datetime-local` value (viewer's local wall-clock, no zone suffix) -> an\n * ISO UTC instant for the wire. `Date` parses a zone-less date-time string as local time, which is exactly the\n * conversion wanted here. */\nexport function localInputValueToISO(value: string): string | null {\n if (!value) return null;\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d.toISOString();\n}\n\n/** `startIso` plus a duration in minutes, as an ISO UTC instant. */\nexport function addMinutesIso(startIso: string, minutes: number): string {\n return new Date(new Date(startIso).getTime() + minutes * 60_000).toISOString();\n}\n\n/** Now, rounded up to the next half hour, as a `datetime-local` value — the dialog's default start. */\nexport function defaultLocalStart(from: Date = new Date()): string {\n const d = new Date(from);\n d.setSeconds(0, 0);\n if (d.getMinutes() > 30) {\n d.setHours(d.getHours() + 1, 0, 0, 0);\n } else if (d.getMinutes() > 0) {\n d.setMinutes(30, 0, 0);\n }\n return toLocalInputValue(d.toISOString());\n}\n\n/** The viewer's IANA time zone, sent to `createEvent` so the server (and any other client) can re-derive what\n * \"every weekday\" means for this series. Falls back to UTC if the runtime cannot report one. */\nexport function viewerTimeZone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';\n } catch {\n return 'UTC';\n }\n}\n\nconst WEEKDAY_CODES = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'] as const;\nconst WEEKDAY_LABELS: Record<string, string> = {\n SU: 'Sun',\n MO: 'Mon',\n TU: 'Tue',\n WE: 'Wed',\n TH: 'Thu',\n FR: 'Fri',\n SA: 'Sat',\n};\n\n/** An RFC 5545 UTC `UNTIL` value: `YYYYMMDDTHHMMSSZ`. Exported for callers (`ScheduleCeremoniesDialog`) that\n * build an UNTIL-bearing RRULE by hand rather than through `buildRRule` (the standup's UNTIL is the sprint's\n * own end day, not something the WEEKLY/EVERY_WEEKDAY picker above expresses). */\nexport function rruleUntil(until: Date): string {\n return until\n .toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\.\\d{3}Z$/, 'Z');\n}\n\n/**\n * Builds the RRULE written to BOTH the calendar event (`createEvent.input.rrule`) and the link's\n * `recurrenceRule` snapshot — the two must agree, since the snapshot is display-only and the calendar event\n * stays the source of truth for the real schedule (`PlanmagnetMeeting.recurrenceRule` doc comment).\n *\n * `startLocalValue` is the `datetime-local` value the recurrence's weekday is read from (the viewer's own\n * wall-clock day — reading it from a UTC-shifted instant could land on the wrong day near midnight).\n * `until`, when given, is the last UTC instant the series may recur through (sprint ceremonies' daily standup).\n */\nexport function buildRRule(\n option: RecurrenceOption,\n startLocalValue: string,\n until?: Date | null\n): string | undefined {\n if (option === 'NONE') return undefined;\n const untilPart = until ? `;UNTIL=${rruleUntil(until)}` : '';\n if (option === 'EVERY_WEEKDAY') return `FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR${untilPart}`;\n const start = new Date(startLocalValue);\n const day = Number.isNaN(start.getTime()) ? 'MO' : WEEKDAY_CODES[start.getDay()];\n return `FREQ=WEEKLY;BYDAY=${day}${untilPart}`;\n}\n\n/** A short, human summary of a calendar RRULE snapshot (display only — see `PlanmagnetMeeting.recurrenceRule`'s\n * doc comment; the calendar event is the real schedule). */\nexport function summarizeRecurrence(rrule: string | null | undefined): string {\n if (!rrule) return 'Does not repeat';\n const byday = /BYDAY=([^;]+)/.exec(rrule)?.[1];\n const until = /UNTIL=(\\d{4})(\\d{2})(\\d{2})/.exec(rrule);\n let base: string;\n if (byday === 'MO,TU,WE,TH,FR') base = 'Every weekday';\n else if (byday) {\n base = `Weekly on ${byday\n .split(',')\n .map((d) => WEEKDAY_LABELS[d] ?? d)\n .join(', ')}`;\n } else if (/FREQ=DAILY/.test(rrule)) base = 'Daily';\n else base = 'Repeats';\n if (until) base += ` until ${until[2]}/${until[3]}/${until[1]}`;\n return base;\n}\n\nexport interface MeetingDraft {\n title: string;\n calendarId: string;\n startLocal: string;\n durationMinutes: number;\n kind: MeetingKind;\n milestoneId?: string | null;\n}\n\n/**\n * Client-side mirror of the rules `MeetingService` enforces: a calendar and a start are required to create the\n * event at all; a positive duration keeps `endsAt` structurally after `startsAt` (these dialogs only ever take a\n * start + a duration, never an independent end); `MILESTONE_CELEBRATION` requires a milestone (the schema's own\n * doc comment on that enum value). Text-length caps are deliberately NOT mirrored here — the schema documents\n * `agenda`/`notes` as \"Length-capped\" without publishing the number, so an over-length value is left to the\n * server's own refusal, shown verbatim (never a guessed client-side limit that could be wrong in either\n * direction).\n */\nexport function validateMeetingDraft(draft: MeetingDraft): string | null {\n if (!draft.title.trim()) return 'A title is required.';\n if (!draft.calendarId) return 'Pick a calendar.';\n if (!draft.startLocal) return 'Pick a start time.';\n if (!Number.isFinite(draft.durationMinutes) || draft.durationMinutes <= 0) {\n return 'Duration must be at least 1 minute.';\n }\n if (MEETING_KIND_REQUIRES_MILESTONE.has(draft.kind) && !draft.milestoneId) {\n return 'A milestone celebration needs a milestone.';\n }\n return null;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsAnalyticsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/AnalyticsAnalyticsPagePage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AnalyticsAnalyticsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/AnalyticsAnalyticsPagePage.tsx"],"names":[],"mappings":"AAiTA,wBAAgB,0BAA0B,4CA+uBzC"}
|