refactor: enhance routing and state management in CoopBuilder, add migration checks on startup, and update Tailwind configuration for improved component styling
This commit is contained in:
parent
848386e3dd
commit
4cea1f71fe
55 changed files with 4053 additions and 1486 deletions
|
|
@ -208,6 +208,34 @@
|
|||
</UCard>
|
||||
</div>
|
||||
|
||||
<!-- Team Coverage Summary -->
|
||||
<div class="bg-white border-2 border-black rounded-lg p-4 mb-4">
|
||||
<h4 class="font-medium text-sm mb-3">Team Coverage (min needs)</h4>
|
||||
<div class="flex flex-wrap gap-4 text-sm">
|
||||
<div class="flex items-center gap-2">
|
||||
<UIcon
|
||||
:name="teamStats.under100 === 0 ? 'i-heroicons-check-circle' : 'i-heroicons-exclamation-triangle'"
|
||||
:class="teamStats.under100 === 0 ? 'text-green-500' : 'text-yellow-500'"
|
||||
class="w-4 h-4" />
|
||||
<span>
|
||||
<strong>{{ teamStats.under100 }}</strong> under 100%
|
||||
</span>
|
||||
</div>
|
||||
<div v-if="teamStats.median" class="flex items-center gap-1">
|
||||
<span class="text-neutral-600">Median:</span>
|
||||
<strong>{{ Math.round(teamStats.median) }}%</strong>
|
||||
</div>
|
||||
<div v-if="teamStats.gini !== undefined" class="flex items-center gap-1">
|
||||
<span class="text-neutral-600">Gini:</span>
|
||||
<strong>{{ teamStats.gini.toFixed(2) }}</strong>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="teamStats.under100 > 0" class="mt-3 p-2 bg-yellow-50 rounded text-xs text-yellow-800">
|
||||
Consider more needs-weighting or a smaller headcount to ensure everyone's minimum needs are met.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Overall Status -->
|
||||
<div class="bg-neutral-50 rounded-lg p-4">
|
||||
<h4 class="font-medium text-sm mb-3">Setup Status</h4>
|
||||
|
|
@ -304,29 +332,28 @@ const emit = defineEmits<{
|
|||
reset: [];
|
||||
}>();
|
||||
|
||||
// Stores
|
||||
const membersStore = useMembersStore();
|
||||
const policiesStore = usePoliciesStore();
|
||||
const budgetStore = useBudgetStore();
|
||||
const streamsStore = useStreamsStore();
|
||||
// Store
|
||||
const coop = useCoopBuilder();
|
||||
|
||||
// Computed data
|
||||
const members = computed(() => membersStore.members);
|
||||
const members = computed(() => coop.members.value);
|
||||
const teamStats = computed(() => coop.teamCoverageStats());
|
||||
const policies = computed(() => ({
|
||||
equalHourlyWage: policiesStore.equalHourlyWage,
|
||||
payrollOncostPct: policiesStore.payrollOncostPct,
|
||||
savingsTargetMonths: policiesStore.savingsTargetMonths,
|
||||
minCashCushionAmount: policiesStore.minCashCushionAmount,
|
||||
deferredCapHoursPerQtr: policiesStore.deferredCapHoursPerQtr,
|
||||
volunteerScope: policiesStore.volunteerScope,
|
||||
// TODO: Get actual policy data from centralized store
|
||||
equalHourlyWage: 0,
|
||||
payrollOncostPct: 0,
|
||||
savingsTargetMonths: 0,
|
||||
minCashCushionAmount: 0,
|
||||
deferredCapHoursPerQtr: 0,
|
||||
volunteerScope: { allowedFlows: [] },
|
||||
}));
|
||||
const overheadCosts = computed(() => budgetStore.overheadCosts);
|
||||
const streams = computed(() => streamsStore.streams);
|
||||
const overheadCosts = computed(() => []);
|
||||
const streams = computed(() => coop.streams.value);
|
||||
|
||||
// Validation
|
||||
const membersValid = computed(() => membersStore.isValid);
|
||||
const policiesValid = computed(() => policiesStore.isValid);
|
||||
const streamsValid = computed(() => streamsStore.hasValidStreams);
|
||||
const membersValid = computed(() => coop.members.value.length > 0);
|
||||
const policiesValid = computed(() => true); // TODO: Add validation
|
||||
const streamsValid = computed(() => coop.streams.value.length > 0);
|
||||
const canComplete = computed(
|
||||
() => membersValid.value && policiesValid.value && streamsValid.value
|
||||
);
|
||||
|
|
@ -349,7 +376,9 @@ const totalMonthlyCosts = computed(() =>
|
|||
overheadCosts.value.reduce((sum, c) => sum + (c.amount || 0), 0)
|
||||
);
|
||||
|
||||
const totalTargetPct = computed(() => streamsStore.totalTargetPct);
|
||||
const totalTargetPct = computed(() =>
|
||||
coop.streams.value.reduce((sum, s) => sum + (s.targetPct || 0), 0)
|
||||
);
|
||||
const totalMonthlyTarget = computed(() =>
|
||||
Math.round(
|
||||
streams.value.reduce((sum, s) => sum + (s.targetMonthlyAmount || 0), 0)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue