mirror of
https://github.com/solidtime-io/solidtime.git
synced 2026-10-10 14:53:17 +01:00
64 lines
2.3 KiB
TypeScript
64 lines
2.3 KiB
TypeScript
import type { Goal, GoalComparison, GoalPeriod, GoalStatus } from '@/packages/api/src';
|
|
import { canDeleteOrganizationGoals, canUpdateOrganizationGoals } from '@/utils/permissions';
|
|
import { getCurrentMembershipId } from '@/utils/useUser';
|
|
|
|
export const goalComparisonOptions: { value: GoalComparison; label: string }[] = [
|
|
{ value: 'at_least', label: 'At least' },
|
|
{ value: 'less_than', label: 'Less than' },
|
|
];
|
|
|
|
export const goalPeriodOptions: { value: GoalPeriod; label: string }[] = [
|
|
{ value: 'day', label: 'per day' },
|
|
{ value: 'week', label: 'per week' },
|
|
{ value: 'month', label: 'per month' },
|
|
];
|
|
|
|
/**
|
|
* Who a goal is for. The three answers map to the goal type and the member of the goal:
|
|
* me = a personal goal for yourself, other = an organization goal for one member,
|
|
* organization = an organization goal that counts every member.
|
|
*/
|
|
export type GoalTarget = 'me' | 'other' | 'organization';
|
|
|
|
export const goalTargetOptions: { value: GoalTarget; label: string }[] = [
|
|
{ value: 'me', label: 'For me' },
|
|
{ value: 'other', label: 'For someone else' },
|
|
{ value: 'organization', label: 'Organization goal' },
|
|
];
|
|
|
|
/**
|
|
* Mirrors the access rules on the server: a personal goal belongs to its member, an organization goal
|
|
* to the members that may manage goals. The member an organization goal is for never manages it.
|
|
*/
|
|
export function canManageGoal(goal: Goal): boolean {
|
|
if (goal.type === 'personal') {
|
|
return goal.member_id === getCurrentMembershipId();
|
|
}
|
|
return canUpdateOrganizationGoals() || canDeleteOrganizationGoals();
|
|
}
|
|
|
|
export function goalTypeLabel(goal: Goal): string {
|
|
return goal.type === 'personal' ? 'Personal goal' : 'Organization goal';
|
|
}
|
|
|
|
export function goalComparisonLabel(comparison: GoalComparison): string {
|
|
return goalComparisonOptions.find((option) => option.value === comparison)?.label ?? comparison;
|
|
}
|
|
|
|
export function goalStatusLabel(status: GoalStatus): string {
|
|
switch (status) {
|
|
case 'in_progress':
|
|
return 'In progress';
|
|
case 'achieved':
|
|
return 'Achieved';
|
|
case 'on_track':
|
|
return 'On track';
|
|
case 'exceeded':
|
|
return 'Exceeded';
|
|
}
|
|
}
|
|
|
|
export function goalStatusIsPositive(status: GoalStatus): boolean {
|
|
return status === 'achieved' || status === 'on_track';
|
|
}
|