feat(i18n): enhance locale support for rebate settings and report exports
- Updated English, Nepali, and Chinese locale files to include new translations for the "apply rebate to payout" feature, enhancing clarity on its functionality. - Added new export options for previewing CSV and Excel files in reports, improving user experience with clearer export capabilities. - Enhanced internationalization support across multiple locales to ensure consistent messaging in the admin interface.
This commit is contained in:
@@ -58,7 +58,9 @@ export function ReportJobsPanel({ canExport, refreshToken = 0 }: ReportJobsPanel
|
||||
}, [t]);
|
||||
|
||||
useEffect(() => {
|
||||
void loadJobs();
|
||||
queueMicrotask(() => {
|
||||
void loadJobs();
|
||||
});
|
||||
}, [loadJobs, refreshToken]);
|
||||
|
||||
async function handleDownload(job: AdminReportJobRow): Promise<void> {
|
||||
|
||||
@@ -431,7 +431,9 @@ export function ReportsConsole() {
|
||||
}, [i18n.language]);
|
||||
|
||||
useEffect(() => {
|
||||
void loadPlayOptions();
|
||||
queueMicrotask(() => {
|
||||
void loadPlayOptions();
|
||||
});
|
||||
}, [loadPlayOptions]);
|
||||
|
||||
const loadSearchOptions = useCallback(async (kind: SearchKind, query: string) => {
|
||||
@@ -764,14 +766,18 @@ export function ReportsConsole() {
|
||||
}, [canViewReports, filters, page, perPage, selectedReport, t]);
|
||||
|
||||
useEffect(() => {
|
||||
setResult(null);
|
||||
setError(null);
|
||||
setPage(1);
|
||||
queueMicrotask(() => {
|
||||
setResult(null);
|
||||
setError(null);
|
||||
setPage(1);
|
||||
});
|
||||
}, [selectedKey]);
|
||||
|
||||
useEffect(() => {
|
||||
if (result && result.key === selectedReport.key && selectedReport.connected) {
|
||||
void queryReport();
|
||||
queueMicrotask(() => {
|
||||
void queryReport();
|
||||
});
|
||||
}
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [page, perPage]);
|
||||
@@ -828,14 +834,10 @@ export function ReportsConsole() {
|
||||
}
|
||||
}
|
||||
|
||||
function exportReport(format: ExportFormat): void {
|
||||
function exportPreview(format: ExportFormat): void {
|
||||
if (!canExportReports) {
|
||||
return;
|
||||
}
|
||||
if (usesServerExport) {
|
||||
void exportViaServer(format);
|
||||
return;
|
||||
}
|
||||
if (!result || result.rows.length === 0) {
|
||||
toast.info(t("empty"));
|
||||
return;
|
||||
@@ -851,6 +853,17 @@ export function ReportsConsole() {
|
||||
}
|
||||
}
|
||||
|
||||
function exportReport(format: ExportFormat): void {
|
||||
if (!canExportReports) {
|
||||
return;
|
||||
}
|
||||
if (usesServerExport) {
|
||||
void exportViaServer(format);
|
||||
return;
|
||||
}
|
||||
exportPreview(format);
|
||||
}
|
||||
|
||||
const renderSearchPicker = (kind: SearchKind) => {
|
||||
const value =
|
||||
kind === "draw" ? filters.drawNo : kind === "player" ? filters.player : filters.operator;
|
||||
@@ -1327,39 +1340,52 @@ export function ReportsConsole() {
|
||||
<div>
|
||||
<CardTitle className="admin-list-title">{t("preview.title")}</CardTitle>
|
||||
</div>
|
||||
<div className="flex flex-col items-end gap-2 sm:flex-row sm:items-center">
|
||||
{usesServerExport ? (
|
||||
<p className="text-xs text-muted-foreground sm:mr-2">{t("exportServerHint")}</p>
|
||||
) : (
|
||||
<p className="text-xs text-muted-foreground sm:mr-2">{t("exportClientHint")}</p>
|
||||
)}
|
||||
<div className="flex shrink-0 gap-2">
|
||||
<div className="flex flex-col items-end gap-2">
|
||||
<p className="text-xs text-muted-foreground">{t("exportServerHint")}</p>
|
||||
<div className="flex flex-wrap justify-end gap-2">
|
||||
<Button
|
||||
type="button"
|
||||
variant="outline"
|
||||
disabled={
|
||||
!canExportReports ||
|
||||
exporting !== null ||
|
||||
(!usesServerExport && (!result || result.rows.length === 0))
|
||||
}
|
||||
disabled={!canExportReports || exporting !== null}
|
||||
onClick={() => exportReport("csv")}
|
||||
>
|
||||
<FileDown data-icon="inline-start" />
|
||||
{usesServerExport ? t("formats.csvServer") : t("formats.csv")}
|
||||
{t("formats.csvServer")}
|
||||
</Button>
|
||||
<Button
|
||||
type="button"
|
||||
disabled={
|
||||
!canExportReports ||
|
||||
exporting !== null ||
|
||||
(!usesServerExport && (!result || result.rows.length === 0))
|
||||
}
|
||||
disabled={!canExportReports || exporting !== null}
|
||||
onClick={() => exportReport("excel")}
|
||||
>
|
||||
<FileSpreadsheet data-icon="inline-start" />
|
||||
{usesServerExport ? t("formats.excelServer") : t("formats.excel")}
|
||||
{t("formats.excelServer")}
|
||||
</Button>
|
||||
</div>
|
||||
{result && result.rows.length > 0 ? (
|
||||
<>
|
||||
<p className="text-xs text-muted-foreground">{t("exportPreviewHint")}</p>
|
||||
<div className="flex flex-wrap justify-end gap-2">
|
||||
<Button
|
||||
type="button"
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
disabled={!canExportReports || exporting !== null}
|
||||
onClick={() => exportPreview("csv")}
|
||||
>
|
||||
{t("formats.csvPreview")}
|
||||
</Button>
|
||||
<Button
|
||||
type="button"
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
disabled={!canExportReports || exporting !== null}
|
||||
onClick={() => exportPreview("excel")}
|
||||
>
|
||||
{t("formats.excelPreview")}
|
||||
</Button>
|
||||
</div>
|
||||
</>
|
||||
) : null}
|
||||
</div>
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-4 pt-4">
|
||||
|
||||
Reference in New Issue
Block a user