This commit is contained in:
JCEEE
2026-08-02 17:02:14 +01:00
parent d720f4e863
commit efc50f82c5
@@ -210,7 +210,7 @@
let outstandingConfigs = $derived(allBonusConfigs.filter((c: BonusConfig) => isOutstanding(c))); let outstandingConfigs = $derived(allBonusConfigs.filter((c: BonusConfig) => isOutstanding(c)));
let doneConfigs = $derived( let doneConfigs = $derived(
allBonusConfigs.filter((c: BonusConfig) => isCompleted(c) && !isOutstanding(c)) configs.filter((c: BonusConfig) => c.status === 'completed') as BonusConfig[]
); );
function isCompleted(cfg: BonusConfig): boolean { function isCompleted(cfg: BonusConfig): boolean {
@@ -223,6 +223,7 @@
return prog.progress.every((p) => p.achieved); return prog.progress.every((p) => p.achieved);
} }
// todo - redundant?
function isOutstanding(cfg: BonusConfig): boolean { function isOutstanding(cfg: BonusConfig): boolean {
if (!isCompleted(cfg)) return false; if (!isCompleted(cfg)) return false;
const rewards = allRewards.filter((r) => r.bonusConfigId === cfg.id); const rewards = allRewards.filter((r) => r.bonusConfigId === cfg.id);
@@ -296,12 +297,10 @@
<div class="column member-col" ondragover={handleDragOver} ondrop={handleDropToMember}> <div class="column member-col" ondragover={handleDragOver} ondrop={handleDropToMember}>
<h3>Member</h3> <h3>Member</h3>
{#each allBonusConfigs.filter((c) => c.target === 'individual' && !doneConfigs.includes(c)) as cfg} {#each allBonusConfigs.filter((c) => c.target === 'individual' && !doneConfigs.includes(c)) as cfg}
{@const done = isCompleted(cfg)}
{@const outstanding = isOutstanding(cfg)}
<div <div
class="col-card" class="col-card"
class:done class:done={outstandingConfigs.includes(cfg)}
class:outstanding class:outstanding={outstandingConfigs.includes(cfg)}
class:disabled={disabledIds.has(cfg.id)} class:disabled={disabledIds.has(cfg.id)}
> >
<div class="col-card-head"> <div class="col-card-head">
@@ -334,14 +333,14 @@
</div> </div>
{/if} {/if}
<span class="stat {p?.state ?? 'pending'}"> <span class="stat {p?.state ?? 'pending'}">
{p ? (outstanding ? 'Outstanding' : p.state) : 'Pending'} {p ? (outstandingConfigs.includes(cfg) ? 'Outstanding' : p.state) : 'Pending'}
</span> </span>
</div> </div>
{/if} {/if}
{/if} {/if}
{/each} {/each}
<div class="col-card-foot"> <div class="col-card-foot">
{#if !done} {#if !outstandingConfigs.includes(cfg)}
<Button variant="secondary" size="sm" onclick={() => openEditConfig(cfg)}> <Button variant="secondary" size="sm" onclick={() => openEditConfig(cfg)}>
Edit Edit
</Button> </Button>
@@ -358,13 +357,11 @@
<div class="column comp-col" ondragover={handleDragOver} ondrop={handleDropToCompetition}> <div class="column comp-col" ondragover={handleDragOver} ondrop={handleDropToCompetition}>
<h3>Competition</h3> <h3>Competition</h3>
{#each allBonusConfigs.filter((c) => c.target === 'competitive' && !doneConfigs.includes(c)) as cfg} {#each allBonusConfigs.filter((c) => c.target === 'competitive' && !doneConfigs.includes(c)) as cfg}
{@const done = isCompleted(cfg)}
{@const outstanding = isOutstanding(cfg)}
{@const prog = progressByConfigId.get(cfg.id)} {@const prog = progressByConfigId.get(cfg.id)}
<div <div
class="col-card" class="col-card"
class:done class:done={outstandingConfigs.includes(cfg)}
class:outstanding class:outstanding={outstandingConfigs.includes(cfg)}
class:disabled={disabledIds.has(cfg.id)} class:disabled={disabledIds.has(cfg.id)}
> >
<div class="col-card-head"> <div class="col-card-head">
@@ -394,14 +391,14 @@
</div> </div>
{/if} {/if}
<span class="stat {p.state}"> <span class="stat {p.state}">
{outstanding ? 'Outstanding' : p.state} {outstandingConfigs.includes(cfg) ? 'Outstanding' : p.state}
</span> </span>
</div> </div>
{/each} {/each}
</div> </div>
{/if} {/if}
<div class="col-card-foot"> <div class="col-card-foot">
{#if !done} {#if !outstandingConfigs.includes(cfg)}
<Button variant="secondary" size="sm" onclick={() => openEditConfig(cfg)}> <Button variant="secondary" size="sm" onclick={() => openEditConfig(cfg)}>
Edit Edit
</Button> </Button>
@@ -418,13 +415,11 @@
<div class="column collab-col" ondragover={handleDragOver} ondrop={handleDropToCollaboration}> <div class="column collab-col" ondragover={handleDragOver} ondrop={handleDropToCollaboration}>
<h3>Collaboration</h3> <h3>Collaboration</h3>
{#each allBonusConfigs.filter((c) => c.target === 'collaborative') as cfg} {#each allBonusConfigs.filter((c) => c.target === 'collaborative') as cfg}
{@const done = isCompleted(cfg)}
{@const outstanding = isOutstanding(cfg)}
{@const prog = progressByConfigId.get(cfg.id)} {@const prog = progressByConfigId.get(cfg.id)}
<div <div
class="col-card" class="col-card"
class:done class:done={outstandingConfigs.includes(cfg)}
class:outstanding class:outstanding={outstandingConfigs.includes(cfg)}
class:disabled={disabledIds.has(cfg.id)} class:disabled={disabledIds.has(cfg.id)}
> >
<div class="col-card-head"> <div class="col-card-head">
@@ -457,13 +452,13 @@
{cfg.type === 'threshold' ? 'pts' : 'chores'}</span {cfg.type === 'threshold' ? 'pts' : 'chores'}</span
> >
<span class="stat {team.state}"> <span class="stat {team.state}">
{team.state} {outstandingConfigs.includes(cfg) ? 'Outstanding' : team.state}
</span> </span>
</div> </div>
{/if} {/if}
{/if} {/if}
<div class="col-card-foot"> <div class="col-card-foot">
{#if !done} {#if !outstandingConfigs.includes(cfg)}
<Button variant="secondary" size="sm" onclick={() => openEditConfig(cfg)}> <Button variant="secondary" size="sm" onclick={() => openEditConfig(cfg)}>
Edit Edit
</Button> </Button>
@@ -775,6 +770,22 @@
> >
{editingConfig.status === 'disabled' ? 'Enable' : 'Disable'} {editingConfig.status === 'disabled' ? 'Enable' : 'Disable'}
</button> </button>
{#if editingConfig.status !== 'completed'}
<button
type="button"
class="complete-btn"
onclick={async () => {
if (!editingConfig) return;
if (!confirm('Mark this bonus as completed?')) return;
const fd = new FormData();
fd.append('id', editingConfig.id);
const res = await fetch('?/completeConfig', { method: 'POST', body: fd });
if (res.ok) showEditModal = false;
}}
>
Mark Complete
</button>
{/if}
<button <button
type="button" type="button"
class="delete-btn" class="delete-btn"
@@ -1049,6 +1060,7 @@
display: flex; display: flex;
gap: 0.5rem; gap: 0.5rem;
margin-top: 1rem; margin-top: 1rem;
flex-wrap: wrap;
} }
.modal-actions button { .modal-actions button {
padding: 0.5rem 1rem; padding: 0.5rem 1rem;
@@ -1069,6 +1081,10 @@
background: #f59e0b; background: #f59e0b;
color: white; color: white;
} }
.modal-actions button.complete-btn {
background: #10b981;
color: white;
}
.modal-actions button.delete-btn { .modal-actions button.delete-btn {
background: #ef4444; background: #ef4444;
color: white; color: white;