allow decimal in roles leaderboard

This commit is contained in:
Abhijit 2026-11-04 17:06:16 +05:30
parent db593f9a6c
commit e084690999
2 changed files with 36 additions and 7 deletions

View File

@ -323,12 +323,26 @@ export function MappingField({ field, control }) {
/> />
</td> </td>
<td> <td>
<Form.Control {field.decimalWeight ? (
type="number" <Form.Control
step="any" type="text"
value={row.weight ?? 1} inputMode="decimal"
onChange={(e) => rhf.onChange(patchRow(rows, index, { weight: e.target.value }))} value={row.weight ?? 1}
/> onChange={(e) => {
const next = e.target.value;
if (next === '' || /^\d*\.?\d*$/.test(next)) {
rhf.onChange(patchRow(rows, index, { weight: next }));
}
}}
/>
) : (
<Form.Control
type="number"
step="any"
value={row.weight ?? 1}
onChange={(e) => rhf.onChange(patchRow(rows, index, { weight: e.target.value }))}
/>
)}
</td> </td>
<td> <td>
<Form.Select <Form.Select

View File

@ -46,6 +46,13 @@ function bySortOrder(left, right) {
return (Number(left?.sort_order) || 0) - (Number(right?.sort_order) || 0); return (Number(left?.sort_order) || 0) - (Number(right?.sort_order) || 0);
} }
function toApiDate(value) {
const text = String(value || '').slice(0, 10);
const parts = text.split('-');
if (parts.length !== 3 || parts[0].length !== 4) return value || '';
return `${parts[1]}/${parts[2]}/${parts[0]}`;
}
function itemsToMap(items) { function itemsToMap(items) {
const values = {}; const values = {};
(items || []).forEach((item) => { (items || []).forEach((item) => {
@ -141,6 +148,7 @@ const leaderboards = {
title: 'Choose Metric', title: 'Choose Metric',
type: 'mapping', type: 'mapping',
variant: 'grouped', variant: 'grouped',
decimalWeight: true,
required: true, required: true,
metrics, metrics,
fullwidth: true, fullwidth: true,
@ -222,6 +230,8 @@ const leaderboards = {
const leaderboardType = payload.leaderboard_roles_type === 'team' ? 'team' : 'roles'; const leaderboardType = payload.leaderboard_roles_type === 'team' ? 'team' : 'roles';
payload.leaderboard_roles_type = leaderboardType; payload.leaderboard_roles_type = leaderboardType;
payload.sort_order = payload.sort_order === '' || payload.sort_order == null ? 0 : Number(payload.sort_order); payload.sort_order = payload.sort_order === '' || payload.sort_order == null ? 0 : Number(payload.sort_order);
payload.validity_start = toApiDate(payload.validity_start);
payload.validity_end = toApiDate(payload.validity_end);
payload.visible_roles = asArray(payload.visible_roles); payload.visible_roles = asArray(payload.visible_roles);
payload.reporting_roles = asArray(payload.reporting_roles); payload.reporting_roles = asArray(payload.reporting_roles);
payload.intervals = asArray(payload.intervals); payload.intervals = asArray(payload.intervals);
@ -250,7 +260,12 @@ const leaderboards = {
metric: row.metric, metric: row.metric,
display: row.display || '', display: row.display || '',
sort_order: row.sort_order === '' || row.sort_order == null ? 0 : Number(row.sort_order), sort_order: row.sort_order === '' || row.sort_order == null ? 0 : Number(row.sort_order),
weight: row.weight === '' || row.weight == null ? '1' : String(row.weight), weight: (() => {
const text = row.weight == null ? '' : String(row.weight).trim();
const num = Number(text);
if (text === '' || !Number.isFinite(num) || num <= 0) return '1';
return text.endsWith('.') ? String(num) : text;
})(),
})); }));
payload.combined_metrics = stringifyCombinedMetrics( payload.combined_metrics = stringifyCombinedMetrics(
(Array.isArray(payload.combined_metrics) ? payload.combined_metrics : []).filter((row) => row?.type), (Array.isArray(payload.combined_metrics) ? payload.combined_metrics : []).filter((row) => row?.type),