@aneuhold/core-ts-db-lib 5.0.7 → 5.0.9
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/CHANGELOG.md +15 -0
- package/lib/browser.d.ts +14 -14
- package/lib/browser.d.ts.map +1 -1
- package/lib/browser.js +12 -12
- package/lib/browser.js.map +1 -1
- package/lib/browser.ts +14 -14
- package/lib/documents/BaseDocument.js +1 -1
- package/lib/documents/BaseDocument.js.map +1 -1
- package/lib/documents/BaseDocument.ts +1 -1
- package/lib/documents/dashboard/Task.d.ts +1 -1
- package/lib/documents/dashboard/Task.d.ts.map +1 -1
- package/lib/documents/dashboard/Task.ts +1 -1
- package/lib/schemas/UUIDSchema.js +1 -1
- package/lib/schemas/UUIDSchema.js.map +1 -1
- package/lib/schemas/UUIDSchema.ts +1 -1
- package/lib/services/{DocumentService.d.ts → Document.service.d.ts} +1 -1
- package/lib/services/Document.service.d.ts.map +1 -0
- package/lib/services/{DocumentService.js → Document.service.js} +1 -1
- package/lib/services/Document.service.js.map +1 -0
- package/lib/services/dashboard/Task/{TaskService.d.ts → Task.service.d.ts} +2 -10
- package/lib/services/dashboard/Task/Task.service.d.ts.map +1 -0
- package/lib/services/dashboard/Task/{TaskService.js → Task.service.js} +8 -8
- package/lib/services/dashboard/Task/Task.service.js.map +1 -0
- package/lib/services/dashboard/Task/{TaskService.ts → Task.service.ts} +8 -8
- package/lib/services/dashboard/Task/{TaskFilterService.d.ts → TaskFilter.service.d.ts} +1 -1
- package/lib/services/dashboard/Task/TaskFilter.service.d.ts.map +1 -0
- package/lib/services/dashboard/Task/{TaskFilterService.js → TaskFilter.service.js} +1 -1
- package/lib/services/dashboard/Task/TaskFilter.service.js.map +1 -0
- package/lib/services/dashboard/Task/{TaskRecurrenceService.d.ts → TaskRecurrence.service.d.ts} +2 -9
- package/lib/services/dashboard/Task/TaskRecurrence.service.d.ts.map +1 -0
- package/lib/services/dashboard/Task/{TaskRecurrenceService.js → TaskRecurrence.service.js} +6 -6
- package/lib/services/dashboard/Task/TaskRecurrence.service.js.map +1 -0
- package/lib/services/dashboard/Task/{TaskRecurrenceService.ts → TaskRecurrence.service.ts} +5 -8
- package/lib/services/dashboard/Task/{TaskSortService.d.ts → TaskSort.service.d.ts} +2 -42
- package/lib/services/dashboard/Task/TaskSort.service.d.ts.map +1 -0
- package/lib/services/dashboard/Task/{TaskSortService.js → TaskSort.service.js} +12 -12
- package/lib/services/dashboard/Task/TaskSort.service.js.map +1 -0
- package/lib/services/dashboard/Task/{TaskSortService.ts → TaskSort.service.ts} +11 -11
- package/lib/services/workout/EquipmentType/{WorkoutEquipmentTypeService.d.ts → WorkoutEquipmentType.service.d.ts} +1 -1
- package/lib/services/workout/EquipmentType/WorkoutEquipmentType.service.d.ts.map +1 -0
- package/lib/services/workout/EquipmentType/{WorkoutEquipmentTypeService.js → WorkoutEquipmentType.service.js} +1 -1
- package/lib/services/workout/EquipmentType/WorkoutEquipmentType.service.js.map +1 -0
- package/lib/services/workout/Exercise/WorkoutExercise.service.d.ts +52 -0
- package/lib/services/workout/Exercise/WorkoutExercise.service.d.ts.map +1 -0
- package/lib/services/workout/Exercise/{WorkoutExerciseService.js → WorkoutExercise.service.js} +18 -18
- package/lib/services/workout/Exercise/WorkoutExercise.service.js.map +1 -0
- package/lib/services/workout/Exercise/{WorkoutExerciseService.ts → WorkoutExercise.service.ts} +17 -17
- package/lib/services/workout/ExerciseCalibration/{WorkoutExerciseCalibrationService.d.ts → WorkoutExerciseCalibration.service.d.ts} +2 -12
- package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibration.service.d.ts.map +1 -0
- package/lib/services/workout/ExerciseCalibration/{WorkoutExerciseCalibrationService.js → WorkoutExerciseCalibration.service.js} +10 -7
- package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibration.service.js.map +1 -0
- package/lib/services/workout/ExerciseCalibration/{WorkoutExerciseCalibrationService.ts → WorkoutExerciseCalibration.service.ts} +10 -7
- package/lib/services/workout/Mesocycle/{WorkoutMesocycleService.d.ts → WorkoutMesocycle.service.d.ts} +3 -41
- package/lib/services/workout/Mesocycle/WorkoutMesocycle.service.d.ts.map +1 -0
- package/lib/services/workout/Mesocycle/{WorkoutMesocycleService.js → WorkoutMesocycle.service.js} +21 -21
- package/lib/services/workout/Mesocycle/WorkoutMesocycle.service.js.map +1 -0
- package/lib/services/workout/Mesocycle/{WorkoutMesocycleService.ts → WorkoutMesocycle.service.ts} +21 -21
- package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.d.ts +1 -10
- package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.d.ts.map +1 -1
- package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.js +3 -3
- package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.js.map +1 -1
- package/lib/services/workout/Mesocycle/WorkoutMesocyclePlanContext.ts +3 -3
- package/lib/services/workout/Microcycle/{WorkoutMicrocycleService.d.ts → WorkoutMicrocycle.service.d.ts} +1 -1
- package/lib/services/workout/Microcycle/WorkoutMicrocycle.service.d.ts.map +1 -0
- package/lib/services/workout/Microcycle/{WorkoutMicrocycleService.js → WorkoutMicrocycle.service.js} +4 -4
- package/lib/services/workout/Microcycle/WorkoutMicrocycle.service.js.map +1 -0
- package/lib/services/workout/Microcycle/{WorkoutMicrocycleService.ts → WorkoutMicrocycle.service.ts} +3 -3
- package/lib/services/workout/Session/{WorkoutSessionService.d.ts → WorkoutSession.service.d.ts} +2 -6
- package/lib/services/workout/Session/WorkoutSession.service.d.ts.map +1 -0
- package/lib/services/workout/Session/{WorkoutSessionService.js → WorkoutSession.service.js} +5 -5
- package/lib/services/workout/Session/WorkoutSession.service.js.map +1 -0
- package/lib/services/workout/Session/{WorkoutSessionService.ts → WorkoutSession.service.ts} +4 -4
- package/lib/services/workout/SessionExercise/{WorkoutSessionExerciseService.d.ts → WorkoutSessionExercise.service.d.ts} +2 -8
- package/lib/services/workout/SessionExercise/WorkoutSessionExercise.service.d.ts.map +1 -0
- package/lib/services/workout/SessionExercise/{WorkoutSessionExerciseService.js → WorkoutSessionExercise.service.js} +5 -5
- package/lib/services/workout/SessionExercise/WorkoutSessionExercise.service.js.map +1 -0
- package/lib/services/workout/SessionExercise/{WorkoutSessionExerciseService.ts → WorkoutSessionExercise.service.ts} +4 -4
- package/lib/services/workout/Set/{WorkoutSetService.d.ts → WorkoutSet.service.d.ts} +2 -23
- package/lib/services/workout/Set/WorkoutSet.service.d.ts.map +1 -0
- package/lib/services/workout/Set/{WorkoutSetService.js → WorkoutSet.service.js} +7 -7
- package/lib/services/workout/Set/WorkoutSet.service.js.map +1 -0
- package/lib/services/workout/Set/{WorkoutSetService.ts → WorkoutSet.service.ts} +6 -6
- package/lib/services/workout/util/SFR/{WorkoutSFRService.d.ts → WorkoutSFR.service.d.ts} +1 -1
- package/lib/services/workout/util/SFR/WorkoutSFR.service.d.ts.map +1 -0
- package/lib/services/workout/util/SFR/{WorkoutSFRService.js → WorkoutSFR.service.js} +1 -1
- package/lib/services/workout/util/SFR/WorkoutSFR.service.js.map +1 -0
- package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanning.service.d.ts +53 -0
- package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanning.service.d.ts.map +1 -0
- package/lib/services/workout/util/VolumePlanning/{WorkoutVolumePlanningService.js → WorkoutVolumePlanning.service.js} +53 -53
- package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanning.service.js.map +1 -0
- package/lib/services/workout/util/VolumePlanning/{WorkoutVolumePlanningService.ts → WorkoutVolumePlanning.service.ts} +52 -52
- package/package.json +4 -4
- package/lib/services/DocumentService.d.ts.map +0 -1
- package/lib/services/DocumentService.js.map +0 -1
- package/lib/services/dashboard/Task/TaskFilterService.d.ts.map +0 -1
- package/lib/services/dashboard/Task/TaskFilterService.js.map +0 -1
- package/lib/services/dashboard/Task/TaskRecurrenceService.d.ts.map +0 -1
- package/lib/services/dashboard/Task/TaskRecurrenceService.js.map +0 -1
- package/lib/services/dashboard/Task/TaskService.d.ts.map +0 -1
- package/lib/services/dashboard/Task/TaskService.js.map +0 -1
- package/lib/services/dashboard/Task/TaskSortService.d.ts.map +0 -1
- package/lib/services/dashboard/Task/TaskSortService.js.map +0 -1
- package/lib/services/workout/EquipmentType/WorkoutEquipmentTypeService.d.ts.map +0 -1
- package/lib/services/workout/EquipmentType/WorkoutEquipmentTypeService.js.map +0 -1
- package/lib/services/workout/Exercise/WorkoutExerciseService.d.ts +0 -99
- package/lib/services/workout/Exercise/WorkoutExerciseService.d.ts.map +0 -1
- package/lib/services/workout/Exercise/WorkoutExerciseService.js.map +0 -1
- package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.d.ts.map +0 -1
- package/lib/services/workout/ExerciseCalibration/WorkoutExerciseCalibrationService.js.map +0 -1
- package/lib/services/workout/Mesocycle/WorkoutMesocycleService.d.ts.map +0 -1
- package/lib/services/workout/Mesocycle/WorkoutMesocycleService.js.map +0 -1
- package/lib/services/workout/Microcycle/WorkoutMicrocycleService.d.ts.map +0 -1
- package/lib/services/workout/Microcycle/WorkoutMicrocycleService.js.map +0 -1
- package/lib/services/workout/Session/WorkoutSessionService.d.ts.map +0 -1
- package/lib/services/workout/Session/WorkoutSessionService.js.map +0 -1
- package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.d.ts.map +0 -1
- package/lib/services/workout/SessionExercise/WorkoutSessionExerciseService.js.map +0 -1
- package/lib/services/workout/Set/WorkoutSetService.d.ts.map +0 -1
- package/lib/services/workout/Set/WorkoutSetService.js.map +0 -1
- package/lib/services/workout/util/SFR/WorkoutSFRService.d.ts.map +0 -1
- package/lib/services/workout/util/SFR/WorkoutSFRService.js.map +0 -1
- package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.d.ts +0 -198
- package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.d.ts.map +0 -1
- package/lib/services/workout/util/VolumePlanning/WorkoutVolumePlanningService.js.map +0 -1
- /package/lib/services/{DocumentService.ts → Document.service.ts} +0 -0
- /package/lib/services/dashboard/Task/{TaskFilterService.ts → TaskFilter.service.ts} +0 -0
- /package/lib/services/workout/EquipmentType/{WorkoutEquipmentTypeService.ts → WorkoutEquipmentType.service.ts} +0 -0
- /package/lib/services/workout/util/SFR/{WorkoutSFRService.ts → WorkoutSFR.service.ts} +0 -0
|
@@ -7,6 +7,7 @@ import type { DashboardTagSettings } from '../../../embedded-types/dashboard/use
|
|
|
7
7
|
* A service for sorting tasks.
|
|
8
8
|
*/
|
|
9
9
|
export default class DashboardTaskSortService {
|
|
10
|
+
#private;
|
|
10
11
|
/**
|
|
11
12
|
* Sorts the provided task IDs based on the provided sort settings.
|
|
12
13
|
*
|
|
@@ -31,46 +32,5 @@ export default class DashboardTaskSortService {
|
|
|
31
32
|
* @returns A map of task IDs to tag header names.
|
|
32
33
|
*/
|
|
33
34
|
static getTagHeaderMap(taskMap: DashboardTaskMap, taskIds: UUID[], userId: UUID, tagSettings: DashboardTagSettings, noPriorityTagsIndicator: string, sortDirection: DashboardTaskSortDirection): Record<UUID, string>;
|
|
34
|
-
/**
|
|
35
|
-
* Gets the task sort function based on the sort by and sort direction.
|
|
36
|
-
*
|
|
37
|
-
* @param sortBy The field to sort by.
|
|
38
|
-
* @param sortDirection The direction to sort.
|
|
39
|
-
* @param tagSettings The tag settings.
|
|
40
|
-
* @param userId The user ID.
|
|
41
|
-
* @returns A function that compares two tasks.
|
|
42
|
-
*/
|
|
43
|
-
private static getTaskSortFunction;
|
|
44
|
-
/**
|
|
45
|
-
* Gets the highest priority tag for the provided task. If there are no tags,
|
|
46
|
-
* or if there are no tags with a priority, then this will return null.
|
|
47
|
-
*
|
|
48
|
-
* @param task The task.
|
|
49
|
-
* @param userId The user ID.
|
|
50
|
-
* @param tagSettings The tag settings.
|
|
51
|
-
* @param sortDirection The sort direction.
|
|
52
|
-
* @returns The highest priority tag or null.
|
|
53
|
-
*/
|
|
54
|
-
private static getHighestPriorityTag;
|
|
55
|
-
/**
|
|
56
|
-
* Gets the highest priority tag value for the provided task.
|
|
57
|
-
*
|
|
58
|
-
* @param task The task.
|
|
59
|
-
* @param userId The user ID.
|
|
60
|
-
* @param tagSettings The tag settings.
|
|
61
|
-
* @param sortDirection The sort direction.
|
|
62
|
-
* @returns The highest priority tag value.
|
|
63
|
-
*/
|
|
64
|
-
private static getHighestPriorityTagValue;
|
|
65
|
-
/**
|
|
66
|
-
* Gets the priority tag for the provided task.
|
|
67
|
-
*
|
|
68
|
-
* @param task The task.
|
|
69
|
-
* @param userId The user ID.
|
|
70
|
-
* @param tagSettings The tag settings.
|
|
71
|
-
* @param sortDirection The sort direction.
|
|
72
|
-
* @returns The priority tag or null.
|
|
73
|
-
*/
|
|
74
|
-
private static getPriorityTagForTask;
|
|
75
35
|
}
|
|
76
|
-
//# sourceMappingURL=
|
|
36
|
+
//# sourceMappingURL=TaskSort.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskSort.service.d.ts","sourceRoot":"","sources":["../../../../src/services/dashboard/Task/TaskSort.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAiB,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC5F,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,wDAAwD,CAAC;AAC5G,OAAO,EAEL,0BAA0B,EAC3B,MAAM,wDAAwD,CAAC;AAChE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sDAAsD,CAAC;AAEjG;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,wBAAwB;;IAC3C;;;;;;;;OAQG;IACH,MAAM,CAAC,IAAI,CACT,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,IAAI,EAAE,EACf,YAAY,EAAE,6BAA6B,EAC3C,WAAW,EAAE,oBAAoB,GAChC,IAAI,EAAE;IAyBT;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,eAAe,CACpB,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,IAAI,EAAE,EACf,MAAM,EAAE,IAAI,EACZ,WAAW,EAAE,oBAAoB,EACjC,uBAAuB,EAAE,MAAM,EAC/B,aAAa,EAAE,0BAA0B,GACxC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;CAmLxB"}
|
|
@@ -21,7 +21,7 @@ export default class DashboardTaskSortService {
|
|
|
21
21
|
for (const sortSetting of sortSettings.sortList) {
|
|
22
22
|
const { sortBy } = sortSetting;
|
|
23
23
|
const { sortDirection } = sortSetting;
|
|
24
|
-
const result = this
|
|
24
|
+
const result = this.#getTaskSortFunction(sortBy, sortDirection, tagSettings, sortSettings.userId)(taskA, taskB);
|
|
25
25
|
if (result !== 0) {
|
|
26
26
|
return result;
|
|
27
27
|
}
|
|
@@ -49,7 +49,7 @@ export default class DashboardTaskSortService {
|
|
|
49
49
|
const firstTask = taskMap[taskIds[0]];
|
|
50
50
|
if (!firstTask)
|
|
51
51
|
return tagHeaderMap;
|
|
52
|
-
let tag = this
|
|
52
|
+
let tag = this.#getHighestPriorityTag(firstTask, userId, tagSettings, sortDirection);
|
|
53
53
|
if (!tag) {
|
|
54
54
|
tagHeaderMap[taskIds[0]] = noPriorityTagsIndicator;
|
|
55
55
|
}
|
|
@@ -59,7 +59,7 @@ export default class DashboardTaskSortService {
|
|
|
59
59
|
for (let i = 1; i < taskIds.length; i += 1) {
|
|
60
60
|
const task = taskMap[taskIds[i]];
|
|
61
61
|
if (task) {
|
|
62
|
-
const taskTag = this
|
|
62
|
+
const taskTag = this.#getHighestPriorityTag(task, userId, tagSettings, sortDirection);
|
|
63
63
|
if (taskTag !== tag && tag !== noPriorityTagsIndicator) {
|
|
64
64
|
tag = taskTag || noPriorityTagsIndicator;
|
|
65
65
|
tagHeaderMap[taskIds[i]] = tag;
|
|
@@ -77,12 +77,12 @@ export default class DashboardTaskSortService {
|
|
|
77
77
|
* @param userId The user ID.
|
|
78
78
|
* @returns A function that compares two tasks.
|
|
79
79
|
*/
|
|
80
|
-
static getTaskSortFunction(sortBy, sortDirection, tagSettings, userId) {
|
|
80
|
+
static #getTaskSortFunction(sortBy, sortDirection, tagSettings, userId) {
|
|
81
81
|
switch (sortBy) {
|
|
82
82
|
case DashboardTaskSortBy.tags:
|
|
83
83
|
return (taskA, taskB) => {
|
|
84
|
-
const highestPriorityTagA = this
|
|
85
|
-
const highestPriorityTagB = this
|
|
84
|
+
const highestPriorityTagA = this.#getHighestPriorityTagValue(taskA, userId, tagSettings, sortDirection);
|
|
85
|
+
const highestPriorityTagB = this.#getHighestPriorityTagValue(taskB, userId, tagSettings, sortDirection);
|
|
86
86
|
if (highestPriorityTagA === highestPriorityTagB) {
|
|
87
87
|
return 0;
|
|
88
88
|
}
|
|
@@ -140,8 +140,8 @@ export default class DashboardTaskSortService {
|
|
|
140
140
|
* @param sortDirection The sort direction.
|
|
141
141
|
* @returns The highest priority tag or null.
|
|
142
142
|
*/
|
|
143
|
-
static getHighestPriorityTag(task, userId, tagSettings, sortDirection) {
|
|
144
|
-
const priorityTag = this
|
|
143
|
+
static #getHighestPriorityTag(task, userId, tagSettings, sortDirection) {
|
|
144
|
+
const priorityTag = this.#getPriorityTagForTask(task, userId, tagSettings, sortDirection);
|
|
145
145
|
return priorityTag ? priorityTag.tag : null;
|
|
146
146
|
}
|
|
147
147
|
/**
|
|
@@ -153,8 +153,8 @@ export default class DashboardTaskSortService {
|
|
|
153
153
|
* @param sortDirection The sort direction.
|
|
154
154
|
* @returns The highest priority tag value.
|
|
155
155
|
*/
|
|
156
|
-
static getHighestPriorityTagValue(task, userId, tagSettings, sortDirection) {
|
|
157
|
-
const priorityTag = this
|
|
156
|
+
static #getHighestPriorityTagValue(task, userId, tagSettings, sortDirection) {
|
|
157
|
+
const priorityTag = this.#getPriorityTagForTask(task, userId, tagSettings, sortDirection);
|
|
158
158
|
return priorityTag ? priorityTag.priority : 0;
|
|
159
159
|
}
|
|
160
160
|
/**
|
|
@@ -166,7 +166,7 @@ export default class DashboardTaskSortService {
|
|
|
166
166
|
* @param sortDirection The sort direction.
|
|
167
167
|
* @returns The priority tag or null.
|
|
168
168
|
*/
|
|
169
|
-
static getPriorityTagForTask(task, userId, tagSettings, sortDirection) {
|
|
169
|
+
static #getPriorityTagForTask(task, userId, tagSettings, sortDirection) {
|
|
170
170
|
let priorityTag = null;
|
|
171
171
|
const tags = task.tags[userId];
|
|
172
172
|
if (!tags || tags.length === 0)
|
|
@@ -192,4 +192,4 @@ export default class DashboardTaskSortService {
|
|
|
192
192
|
return priorityTag;
|
|
193
193
|
}
|
|
194
194
|
}
|
|
195
|
-
//# sourceMappingURL=
|
|
195
|
+
//# sourceMappingURL=TaskSort.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskSort.service.js","sourceRoot":"","sources":["../../../../src/services/dashboard/Task/TaskSort.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,7 +36,7 @@ export default class DashboardTaskSortService {
|
|
|
36
36
|
const { sortBy } = sortSetting;
|
|
37
37
|
const { sortDirection } = sortSetting;
|
|
38
38
|
|
|
39
|
-
const result = this
|
|
39
|
+
const result = this.#getTaskSortFunction(
|
|
40
40
|
sortBy,
|
|
41
41
|
sortDirection,
|
|
42
42
|
tagSettings,
|
|
@@ -75,7 +75,7 @@ export default class DashboardTaskSortService {
|
|
|
75
75
|
if (taskIds.length === 0 || taskIds.length === 1) return tagHeaderMap;
|
|
76
76
|
const firstTask = taskMap[taskIds[0]];
|
|
77
77
|
if (!firstTask) return tagHeaderMap;
|
|
78
|
-
let tag = this
|
|
78
|
+
let tag = this.#getHighestPriorityTag(firstTask, userId, tagSettings, sortDirection);
|
|
79
79
|
if (!tag) {
|
|
80
80
|
tagHeaderMap[taskIds[0]] = noPriorityTagsIndicator;
|
|
81
81
|
} else {
|
|
@@ -84,7 +84,7 @@ export default class DashboardTaskSortService {
|
|
|
84
84
|
for (let i = 1; i < taskIds.length; i += 1) {
|
|
85
85
|
const task = taskMap[taskIds[i]];
|
|
86
86
|
if (task) {
|
|
87
|
-
const taskTag = this
|
|
87
|
+
const taskTag = this.#getHighestPriorityTag(task, userId, tagSettings, sortDirection);
|
|
88
88
|
if (taskTag !== tag && tag !== noPriorityTagsIndicator) {
|
|
89
89
|
tag = taskTag || noPriorityTagsIndicator;
|
|
90
90
|
tagHeaderMap[taskIds[i]] = tag;
|
|
@@ -103,7 +103,7 @@ export default class DashboardTaskSortService {
|
|
|
103
103
|
* @param userId The user ID.
|
|
104
104
|
* @returns A function that compares two tasks.
|
|
105
105
|
*/
|
|
106
|
-
|
|
106
|
+
static #getTaskSortFunction(
|
|
107
107
|
sortBy: DashboardTaskSortBy,
|
|
108
108
|
sortDirection: DashboardTaskSortDirection,
|
|
109
109
|
tagSettings: DashboardTagSettings,
|
|
@@ -112,13 +112,13 @@ export default class DashboardTaskSortService {
|
|
|
112
112
|
switch (sortBy) {
|
|
113
113
|
case DashboardTaskSortBy.tags:
|
|
114
114
|
return (taskA: DashboardTask, taskB: DashboardTask) => {
|
|
115
|
-
const highestPriorityTagA = this
|
|
115
|
+
const highestPriorityTagA = this.#getHighestPriorityTagValue(
|
|
116
116
|
taskA,
|
|
117
117
|
userId,
|
|
118
118
|
tagSettings,
|
|
119
119
|
sortDirection
|
|
120
120
|
);
|
|
121
|
-
const highestPriorityTagB = this
|
|
121
|
+
const highestPriorityTagB = this.#getHighestPriorityTagValue(
|
|
122
122
|
taskB,
|
|
123
123
|
userId,
|
|
124
124
|
tagSettings,
|
|
@@ -179,13 +179,13 @@ export default class DashboardTaskSortService {
|
|
|
179
179
|
* @param sortDirection The sort direction.
|
|
180
180
|
* @returns The highest priority tag or null.
|
|
181
181
|
*/
|
|
182
|
-
|
|
182
|
+
static #getHighestPriorityTag(
|
|
183
183
|
task: DashboardTask,
|
|
184
184
|
userId: UUID,
|
|
185
185
|
tagSettings: DashboardTagSettings,
|
|
186
186
|
sortDirection: DashboardTaskSortDirection
|
|
187
187
|
): string | null {
|
|
188
|
-
const priorityTag = this
|
|
188
|
+
const priorityTag = this.#getPriorityTagForTask(task, userId, tagSettings, sortDirection);
|
|
189
189
|
return priorityTag ? priorityTag.tag : null;
|
|
190
190
|
}
|
|
191
191
|
|
|
@@ -198,13 +198,13 @@ export default class DashboardTaskSortService {
|
|
|
198
198
|
* @param sortDirection The sort direction.
|
|
199
199
|
* @returns The highest priority tag value.
|
|
200
200
|
*/
|
|
201
|
-
|
|
201
|
+
static #getHighestPriorityTagValue(
|
|
202
202
|
task: DashboardTask,
|
|
203
203
|
userId: UUID,
|
|
204
204
|
tagSettings: DashboardTagSettings,
|
|
205
205
|
sortDirection: DashboardTaskSortDirection
|
|
206
206
|
): number {
|
|
207
|
-
const priorityTag = this
|
|
207
|
+
const priorityTag = this.#getPriorityTagForTask(task, userId, tagSettings, sortDirection);
|
|
208
208
|
return priorityTag ? priorityTag.priority : 0;
|
|
209
209
|
}
|
|
210
210
|
|
|
@@ -217,7 +217,7 @@ export default class DashboardTaskSortService {
|
|
|
217
217
|
* @param sortDirection The sort direction.
|
|
218
218
|
* @returns The priority tag or null.
|
|
219
219
|
*/
|
|
220
|
-
|
|
220
|
+
static #getPriorityTagForTask(
|
|
221
221
|
task: DashboardTask,
|
|
222
222
|
userId: UUID,
|
|
223
223
|
tagSettings: DashboardTagSettings,
|
|
@@ -45,4 +45,4 @@ export default class WorkoutEquipmentTypeService {
|
|
|
45
45
|
*/
|
|
46
46
|
static findNearestWeight(equipmentType: WorkoutEquipmentType, targetWeight: number, direction: 'up' | 'down' | 'nearest' | 'prefer-down' | 'prefer-up'): number | null;
|
|
47
47
|
}
|
|
48
|
-
//# sourceMappingURL=
|
|
48
|
+
//# sourceMappingURL=WorkoutEquipmentType.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkoutEquipmentType.service.d.ts","sourceRoot":"","sources":["../../../../src/services/workout/EquipmentType/WorkoutEquipmentType.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAC;AAE/F;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,2BAA2B;IAC9C;;;;;;;;;OASG;IACH,MAAM,CAAC,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAY/F;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,0BAA0B,CAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAC/C,MAAM,EAAE;IAoBX;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,iBAAiB,CACtB,aAAa,EAAE,oBAAoB,EACnC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GACjE,MAAM,GAAG,IAAI;CAyCjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkoutEquipmentType.service.js","sourceRoot":"","sources":["../../../../src/services/workout/EquipmentType/WorkoutEquipmentType.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { WorkoutEquipmentType } from '../../../documents/workout/WorkoutEquipmentType.js';
|
|
2
|
+
import type { WorkoutExercise } from '../../../documents/workout/WorkoutExercise.js';
|
|
3
|
+
import { ExerciseRepRange } from '../../../documents/workout/WorkoutExercise.js';
|
|
4
|
+
import type { WorkoutExerciseCalibration } from '../../../documents/workout/WorkoutExerciseCalibration.js';
|
|
5
|
+
import type { WorkoutSet } from '../../../documents/workout/WorkoutSet.js';
|
|
6
|
+
/**
|
|
7
|
+
* A service for handling operations related to {@link WorkoutExercise}s.
|
|
8
|
+
*/
|
|
9
|
+
export default class WorkoutExerciseService {
|
|
10
|
+
#private;
|
|
11
|
+
/**
|
|
12
|
+
* Returns the numeric rep range based on the ExerciseRepRange enum.
|
|
13
|
+
*
|
|
14
|
+
* - Heavy: { min: 5, max: 15 }
|
|
15
|
+
* - Medium: { min: 10, max: 20 }
|
|
16
|
+
* - Light: { min: 15, max: 30 }
|
|
17
|
+
*
|
|
18
|
+
* @param repRange The exercise rep range.
|
|
19
|
+
*/
|
|
20
|
+
static getRepRangeValues(repRange: ExerciseRepRange): {
|
|
21
|
+
min: number;
|
|
22
|
+
max: number;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Gets the fatigue score for an exercise.
|
|
26
|
+
*
|
|
27
|
+
* @param exercise The exercise to get the fatigue score for.
|
|
28
|
+
*/
|
|
29
|
+
static getFatigueScore(exercise: WorkoutExercise): number;
|
|
30
|
+
/**
|
|
31
|
+
* Calculates the target weight and reps for the FIRST set of an exercise.
|
|
32
|
+
*
|
|
33
|
+
* When `previousSets` are provided (completed or planned-only), autoregulation
|
|
34
|
+
* computes an average surplus across all sets and applies progression. Planned-only
|
|
35
|
+
* sets are forecasted with surplus = 0 so the plan progresses smoothly without
|
|
36
|
+
* falling back to calibration.
|
|
37
|
+
*
|
|
38
|
+
* When no previous sets exist (first mesocycle or new exercise), the calibration-based
|
|
39
|
+
* formula computes initial targets from the exercise's 1RM and rep range.
|
|
40
|
+
*/
|
|
41
|
+
static calculateTargetRepsAndWeightForFirstSet(params: {
|
|
42
|
+
exercise: WorkoutExercise;
|
|
43
|
+
calibration: WorkoutExerciseCalibration;
|
|
44
|
+
equipment: WorkoutEquipmentType;
|
|
45
|
+
firstMicrocycleRir: number;
|
|
46
|
+
previousSets: WorkoutSet[];
|
|
47
|
+
}): {
|
|
48
|
+
targetWeight: number;
|
|
49
|
+
targetReps: number;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=WorkoutExercise.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkoutExercise.service.d.ts","sourceRoot":"","sources":["../../../../src/services/workout/Exercise/WorkoutExercise.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oDAAoD,CAAC;AAC/F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAC;AACrF,OAAO,EAEL,gBAAgB,EACjB,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0DAA0D,CAAC;AAC3G,OAAO,KAAK,EAAuB,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAMhG;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,sBAAsB;;IACzC;;;;;;;;OAQG;IACH,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;IAWlF;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM;IAIzD;;;;;;;;;;OAUG;IACH,MAAM,CAAC,uCAAuC,CAAC,MAAM,EAAE;QACrD,QAAQ,EAAE,eAAe,CAAC;QAC1B,WAAW,EAAE,0BAA0B,CAAC;QACxC,SAAS,EAAE,oBAAoB,CAAC;QAChC,kBAAkB,EAAE,MAAM,CAAC;QAC3B,YAAY,EAAE,UAAU,EAAE,CAAC;KAC5B,GAAG;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;CA6RjD"}
|
package/lib/services/workout/Exercise/{WorkoutExerciseService.js → WorkoutExercise.service.js}
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ExerciseProgressionType, ExerciseRepRange } from '../../../documents/workout/WorkoutExercise.js';
|
|
2
|
-
import WorkoutEquipmentTypeService from '../EquipmentType/
|
|
3
|
-
import WorkoutExerciseCalibrationService from '../ExerciseCalibration/
|
|
4
|
-
import WorkoutSessionExerciseService from '../SessionExercise/
|
|
5
|
-
import WorkoutSFRService from '../util/SFR/
|
|
2
|
+
import WorkoutEquipmentTypeService from '../EquipmentType/WorkoutEquipmentType.service.js';
|
|
3
|
+
import WorkoutExerciseCalibrationService from '../ExerciseCalibration/WorkoutExerciseCalibration.service.js';
|
|
4
|
+
import WorkoutSessionExerciseService from '../SessionExercise/WorkoutSessionExercise.service.js';
|
|
5
|
+
import WorkoutSFRService from '../util/SFR/WorkoutSFR.service.js';
|
|
6
6
|
/**
|
|
7
7
|
* A service for handling operations related to {@link WorkoutExercise}s.
|
|
8
8
|
*/
|
|
@@ -59,10 +59,10 @@ export default class WorkoutExerciseService {
|
|
|
59
59
|
// forecasts by copying planned values into actuals (surplus = 0) so the
|
|
60
60
|
// plan progresses smoothly from the planned baseline.
|
|
61
61
|
const completedSets = previousSets
|
|
62
|
-
.map((set) => this
|
|
62
|
+
.map((set) => this.#toCompletedSet(set))
|
|
63
63
|
.filter((set) => set !== null);
|
|
64
64
|
if (completedSets.length > 0) {
|
|
65
|
-
return this
|
|
65
|
+
return this.#calculateAutoRegulatedTargets({
|
|
66
66
|
exercise,
|
|
67
67
|
equipment,
|
|
68
68
|
previousSets: completedSets,
|
|
@@ -70,7 +70,7 @@ export default class WorkoutExerciseService {
|
|
|
70
70
|
});
|
|
71
71
|
}
|
|
72
72
|
// Calibration-based formula (no previous set available)
|
|
73
|
-
return this
|
|
73
|
+
return this.#calculateCalibrationBasedTargets({
|
|
74
74
|
exercise,
|
|
75
75
|
calibration,
|
|
76
76
|
equipment,
|
|
@@ -85,7 +85,7 @@ export default class WorkoutExerciseService {
|
|
|
85
85
|
* Previously only the first set's surplus was used, which masked poor performance
|
|
86
86
|
* on later sets (e.g., first set hits target but second set falls far short).
|
|
87
87
|
*/
|
|
88
|
-
static calculateAutoRegulatedTargets(params) {
|
|
88
|
+
static #calculateAutoRegulatedTargets(params) {
|
|
89
89
|
const { exercise, equipment, previousSets, repRange } = params;
|
|
90
90
|
// The first set is the reference for rep/weight targets (subsequent sets are
|
|
91
91
|
// derived from the first via intra-session fatigue drops).
|
|
@@ -94,9 +94,9 @@ export default class WorkoutExerciseService {
|
|
|
94
94
|
// previousSets are CompletedWorkoutSets (all fields non-null), so this always returns a number.
|
|
95
95
|
const surplus = WorkoutSessionExerciseService.calculateAverageSurplus(previousSets) ?? 0;
|
|
96
96
|
if (exercise.preferredProgressionType === ExerciseProgressionType.Rep) {
|
|
97
|
-
return this
|
|
97
|
+
return this.#calculateAutoRegulatedRepTargets(previousFirstSet, surplus, repRange, equipment);
|
|
98
98
|
}
|
|
99
|
-
return this
|
|
99
|
+
return this.#calculateAutoRegulatedLoadTargets(previousFirstSet, surplus, repRange, equipment);
|
|
100
100
|
}
|
|
101
101
|
/**
|
|
102
102
|
* Auto-regulated rep progression. Attempts to increase reps until hitting rep range max,
|
|
@@ -110,7 +110,7 @@ export default class WorkoutExerciseService {
|
|
|
110
110
|
* | -3 | Regress: actualReps (use actual as new baseline) |
|
|
111
111
|
* | < -3 | Severe regress: actualReps + reduce weight (weight is too heavy for rep range) |
|
|
112
112
|
*/
|
|
113
|
-
static calculateAutoRegulatedRepTargets(previousSet, surplus, repRange, equipment) {
|
|
113
|
+
static #calculateAutoRegulatedRepTargets(previousSet, surplus, repRange, equipment) {
|
|
114
114
|
let targetReps;
|
|
115
115
|
let targetWeight = previousSet.plannedWeight;
|
|
116
116
|
if (surplus >= 3) {
|
|
@@ -140,7 +140,7 @@ export default class WorkoutExerciseService {
|
|
|
140
140
|
// Handle rep range ceiling: if target exceeds max, reset and bump weight
|
|
141
141
|
if (targetReps > repRange.max) {
|
|
142
142
|
targetReps = Math.floor((repRange.min + repRange.max) / 2);
|
|
143
|
-
const nextWeight = this
|
|
143
|
+
const nextWeight = this.#findNextTwoPercentWeight(targetWeight, equipment);
|
|
144
144
|
if (nextWeight !== null) {
|
|
145
145
|
targetWeight = nextWeight;
|
|
146
146
|
}
|
|
@@ -162,7 +162,7 @@ export default class WorkoutExerciseService {
|
|
|
162
162
|
* | -1 to -2 | Hold weight (no increase) |
|
|
163
163
|
* | <= -3 | Reduce weight by minimum equipment increment |
|
|
164
164
|
*/
|
|
165
|
-
static calculateAutoRegulatedLoadTargets(previousSet, surplus, repRange, equipment) {
|
|
165
|
+
static #calculateAutoRegulatedLoadTargets(previousSet, surplus, repRange, equipment) {
|
|
166
166
|
const targetReps = repRange.max;
|
|
167
167
|
let targetWeight = previousSet.plannedWeight;
|
|
168
168
|
if (surplus >= 2) {
|
|
@@ -175,7 +175,7 @@ export default class WorkoutExerciseService {
|
|
|
175
175
|
}
|
|
176
176
|
else if (surplus >= 0) {
|
|
177
177
|
// Normal: increase by 2%
|
|
178
|
-
const nextWeight = this
|
|
178
|
+
const nextWeight = this.#findNextTwoPercentWeight(targetWeight, equipment);
|
|
179
179
|
if (nextWeight !== null) {
|
|
180
180
|
targetWeight = nextWeight;
|
|
181
181
|
}
|
|
@@ -201,7 +201,7 @@ export default class WorkoutExerciseService {
|
|
|
201
201
|
*
|
|
202
202
|
* Returns null if the set lacks the minimum planned data needed.
|
|
203
203
|
*/
|
|
204
|
-
static toCompletedSet(set) {
|
|
204
|
+
static #toCompletedSet(set) {
|
|
205
205
|
if (!set) {
|
|
206
206
|
return null;
|
|
207
207
|
}
|
|
@@ -224,7 +224,7 @@ export default class WorkoutExerciseService {
|
|
|
224
224
|
* set exists (first microcycle of the first mesocycle, or brand-new exercise).
|
|
225
225
|
* All subsequent microcycle progression is handled by autoregulation/forecasting.
|
|
226
226
|
*/
|
|
227
|
-
static calculateCalibrationBasedTargets(params) {
|
|
227
|
+
static #calculateCalibrationBasedTargets(params) {
|
|
228
228
|
const { exercise, calibration, equipment, firstMicrocycleRir, repRange, repRangeMidpoint } = params;
|
|
229
229
|
// For rep progression, calculate weight based on midpoint + RIR reps
|
|
230
230
|
// For load progression, use max reps
|
|
@@ -243,7 +243,7 @@ export default class WorkoutExerciseService {
|
|
|
243
243
|
: repRange.max;
|
|
244
244
|
return { targetWeight, targetReps };
|
|
245
245
|
}
|
|
246
|
-
static findNextTwoPercentWeight(currentWeight, equipment) {
|
|
246
|
+
static #findNextTwoPercentWeight(currentWeight, equipment) {
|
|
247
247
|
// Increase weight by at least 2%
|
|
248
248
|
const twoPercentIncrease = currentWeight * 1.02;
|
|
249
249
|
// Find the smallest weight >= 2% increase (This is purposefully done from the rounded weight
|
|
@@ -252,4 +252,4 @@ export default class WorkoutExerciseService {
|
|
|
252
252
|
return nextWeight;
|
|
253
253
|
}
|
|
254
254
|
}
|
|
255
|
-
//# sourceMappingURL=
|
|
255
|
+
//# sourceMappingURL=WorkoutExercise.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkoutExercise.service.js","sourceRoot":"","sources":["../../../../src/services/workout/Exercise/WorkoutExercise.service.ts"],"names":[],"mappings":"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"}
|
package/lib/services/workout/Exercise/{WorkoutExerciseService.ts → WorkoutExercise.service.ts}
RENAMED
|
@@ -6,10 +6,10 @@ import {
|
|
|
6
6
|
} from '../../../documents/workout/WorkoutExercise.js';
|
|
7
7
|
import type { WorkoutExerciseCalibration } from '../../../documents/workout/WorkoutExerciseCalibration.js';
|
|
8
8
|
import type { CompletedWorkoutSet, WorkoutSet } from '../../../documents/workout/WorkoutSet.js';
|
|
9
|
-
import WorkoutEquipmentTypeService from '../EquipmentType/
|
|
10
|
-
import WorkoutExerciseCalibrationService from '../ExerciseCalibration/
|
|
11
|
-
import WorkoutSessionExerciseService from '../SessionExercise/
|
|
12
|
-
import WorkoutSFRService from '../util/SFR/
|
|
9
|
+
import WorkoutEquipmentTypeService from '../EquipmentType/WorkoutEquipmentType.service.js';
|
|
10
|
+
import WorkoutExerciseCalibrationService from '../ExerciseCalibration/WorkoutExerciseCalibration.service.js';
|
|
11
|
+
import WorkoutSessionExerciseService from '../SessionExercise/WorkoutSessionExercise.service.js';
|
|
12
|
+
import WorkoutSFRService from '../util/SFR/WorkoutSFR.service.js';
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* A service for handling operations related to {@link WorkoutExercise}s.
|
|
@@ -80,11 +80,11 @@ export default class WorkoutExerciseService {
|
|
|
80
80
|
// forecasts by copying planned values into actuals (surplus = 0) so the
|
|
81
81
|
// plan progresses smoothly from the planned baseline.
|
|
82
82
|
const completedSets = previousSets
|
|
83
|
-
.map((set) => this
|
|
83
|
+
.map((set) => this.#toCompletedSet(set))
|
|
84
84
|
.filter((set): set is CompletedWorkoutSet => set !== null);
|
|
85
85
|
|
|
86
86
|
if (completedSets.length > 0) {
|
|
87
|
-
return this
|
|
87
|
+
return this.#calculateAutoRegulatedTargets({
|
|
88
88
|
exercise,
|
|
89
89
|
equipment,
|
|
90
90
|
previousSets: completedSets,
|
|
@@ -93,7 +93,7 @@ export default class WorkoutExerciseService {
|
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
// Calibration-based formula (no previous set available)
|
|
96
|
-
return this
|
|
96
|
+
return this.#calculateCalibrationBasedTargets({
|
|
97
97
|
exercise,
|
|
98
98
|
calibration,
|
|
99
99
|
equipment,
|
|
@@ -109,7 +109,7 @@ export default class WorkoutExerciseService {
|
|
|
109
109
|
* Previously only the first set's surplus was used, which masked poor performance
|
|
110
110
|
* on later sets (e.g., first set hits target but second set falls far short).
|
|
111
111
|
*/
|
|
112
|
-
|
|
112
|
+
static #calculateAutoRegulatedTargets(params: {
|
|
113
113
|
exercise: WorkoutExercise;
|
|
114
114
|
equipment: WorkoutEquipmentType;
|
|
115
115
|
previousSets: CompletedWorkoutSet[];
|
|
@@ -126,10 +126,10 @@ export default class WorkoutExerciseService {
|
|
|
126
126
|
const surplus = WorkoutSessionExerciseService.calculateAverageSurplus(previousSets) ?? 0;
|
|
127
127
|
|
|
128
128
|
if (exercise.preferredProgressionType === ExerciseProgressionType.Rep) {
|
|
129
|
-
return this
|
|
129
|
+
return this.#calculateAutoRegulatedRepTargets(previousFirstSet, surplus, repRange, equipment);
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
return this
|
|
132
|
+
return this.#calculateAutoRegulatedLoadTargets(previousFirstSet, surplus, repRange, equipment);
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
/**
|
|
@@ -144,7 +144,7 @@ export default class WorkoutExerciseService {
|
|
|
144
144
|
* | -3 | Regress: actualReps (use actual as new baseline) |
|
|
145
145
|
* | < -3 | Severe regress: actualReps + reduce weight (weight is too heavy for rep range) |
|
|
146
146
|
*/
|
|
147
|
-
|
|
147
|
+
static #calculateAutoRegulatedRepTargets(
|
|
148
148
|
previousSet: CompletedWorkoutSet,
|
|
149
149
|
surplus: number,
|
|
150
150
|
repRange: { min: number; max: number },
|
|
@@ -182,7 +182,7 @@ export default class WorkoutExerciseService {
|
|
|
182
182
|
// Handle rep range ceiling: if target exceeds max, reset and bump weight
|
|
183
183
|
if (targetReps > repRange.max) {
|
|
184
184
|
targetReps = Math.floor((repRange.min + repRange.max) / 2);
|
|
185
|
-
const nextWeight = this
|
|
185
|
+
const nextWeight = this.#findNextTwoPercentWeight(targetWeight, equipment);
|
|
186
186
|
if (nextWeight !== null) {
|
|
187
187
|
targetWeight = nextWeight;
|
|
188
188
|
}
|
|
@@ -211,7 +211,7 @@ export default class WorkoutExerciseService {
|
|
|
211
211
|
* | -1 to -2 | Hold weight (no increase) |
|
|
212
212
|
* | <= -3 | Reduce weight by minimum equipment increment |
|
|
213
213
|
*/
|
|
214
|
-
|
|
214
|
+
static #calculateAutoRegulatedLoadTargets(
|
|
215
215
|
previousSet: CompletedWorkoutSet,
|
|
216
216
|
surplus: number,
|
|
217
217
|
repRange: { min: number; max: number },
|
|
@@ -233,7 +233,7 @@ export default class WorkoutExerciseService {
|
|
|
233
233
|
}
|
|
234
234
|
} else if (surplus >= 0) {
|
|
235
235
|
// Normal: increase by 2%
|
|
236
|
-
const nextWeight = this
|
|
236
|
+
const nextWeight = this.#findNextTwoPercentWeight(targetWeight, equipment);
|
|
237
237
|
if (nextWeight !== null) {
|
|
238
238
|
targetWeight = nextWeight;
|
|
239
239
|
}
|
|
@@ -263,7 +263,7 @@ export default class WorkoutExerciseService {
|
|
|
263
263
|
*
|
|
264
264
|
* Returns null if the set lacks the minimum planned data needed.
|
|
265
265
|
*/
|
|
266
|
-
|
|
266
|
+
static #toCompletedSet(set?: WorkoutSet): CompletedWorkoutSet | null {
|
|
267
267
|
if (!set) {
|
|
268
268
|
return null;
|
|
269
269
|
}
|
|
@@ -287,7 +287,7 @@ export default class WorkoutExerciseService {
|
|
|
287
287
|
* set exists (first microcycle of the first mesocycle, or brand-new exercise).
|
|
288
288
|
* All subsequent microcycle progression is handled by autoregulation/forecasting.
|
|
289
289
|
*/
|
|
290
|
-
|
|
290
|
+
static #calculateCalibrationBasedTargets(params: {
|
|
291
291
|
exercise: WorkoutExercise;
|
|
292
292
|
calibration: WorkoutExerciseCalibration;
|
|
293
293
|
equipment: WorkoutEquipmentType;
|
|
@@ -330,7 +330,7 @@ export default class WorkoutExerciseService {
|
|
|
330
330
|
return { targetWeight, targetReps };
|
|
331
331
|
}
|
|
332
332
|
|
|
333
|
-
|
|
333
|
+
static #findNextTwoPercentWeight(
|
|
334
334
|
currentWeight: number,
|
|
335
335
|
equipment: WorkoutEquipmentType
|
|
336
336
|
): number | null {
|
|
@@ -5,6 +5,7 @@ import type { WorkoutExerciseCalibration } from '../../../documents/workout/Work
|
|
|
5
5
|
* A service for handling operations related to {@link WorkoutExerciseCalibration}s.
|
|
6
6
|
*/
|
|
7
7
|
export default class WorkoutExerciseCalibrationService {
|
|
8
|
+
#private;
|
|
8
9
|
/**
|
|
9
10
|
* Calculates the 1 Rep Max using the NASM formula.
|
|
10
11
|
*
|
|
@@ -73,16 +74,5 @@ export default class WorkoutExerciseCalibrationService {
|
|
|
73
74
|
* @param dateRecorded The date to use as dateRecorded for new calibrations.
|
|
74
75
|
*/
|
|
75
76
|
static generateAutoCalibrations(exerciseCTOs: WorkoutExerciseCTO[], userId: UUID, dateRecorded: Date): WorkoutExerciseCalibration[];
|
|
76
|
-
/**
|
|
77
|
-
* Calculates the target percentage of 1RM for a given target rep count.
|
|
78
|
-
*
|
|
79
|
-
* Uses the formula: targetPercentage = 85 - ((targetReps - 5) * 2.2)
|
|
80
|
-
*
|
|
81
|
-
* This ensures training stays within the 85%-30% 1RM range (5 reps to 30 reps).
|
|
82
|
-
* Higher rep counts produce lower percentages of 1RM.
|
|
83
|
-
*
|
|
84
|
-
* @param targetReps The target number of reps.
|
|
85
|
-
*/
|
|
86
|
-
private static getTargetPercentage;
|
|
87
77
|
}
|
|
88
|
-
//# sourceMappingURL=
|
|
78
|
+
//# sourceMappingURL=WorkoutExerciseCalibration.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkoutExerciseCalibration.service.d.ts","sourceRoot":"","sources":["../../../../src/services/workout/ExerciseCalibration/WorkoutExerciseCalibration.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AACtF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0DAA0D,CAAC;AAG3G;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,iCAAiC;;IAIpD;;;;;;OAMG;IACH,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,0BAA0B,GAAG,MAAM;IAI9D;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAItD;;;;;;;OAOG;IACH,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;;;IAS7D;;;;;;;;OAQG;IACH,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,0BAA0B,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAK3F;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAK/E;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,wBAAwB,CAC7B,YAAY,EAAE,kBAAkB,EAAE,EAClC,MAAM,EAAE,IAAI,EACZ,YAAY,EAAE,IAAI,GACjB,0BAA0B,EAAE;CAyChC"}
|