Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion deno.jsonc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@grud/devtools",
"version": "0.3.6",
"version": "0.3.7",
"license": "Apache-2.0",
"imports": {
"ramda": "npm:ramda@^0.30.1",
Expand Down
55 changes: 55 additions & 0 deletions src/getDisplayValue.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import type {
DateTimeCellValue,
DateTimeColumn,
GroupColumn,
IntegerCellValue,
IntegerColumn,
LinkCellValue,
LinkColumn,
Locale,
Expand Down Expand Up @@ -175,6 +177,59 @@ describe("getDisplayValue()", () => {
});
});

describe("integer", () => {
it("should format single lang number values for specific langs when no user lang is given", () => {
const columnWithSeparator: IntegerColumn = {
id: 1,
kind: "integer",
multilanguage: false,
separator: true,
} as any;

const columnWithoutSeparator: IntegerColumn = {
id: 1,
kind: "integer",
multilanguage: false,
separator: false,
} as any;

const value: IntegerCellValue = { value: 1234 };
const getDisplayValueWithoutUserLocale = getDisplayValue();
expect(getDisplayValueWithoutUserLocale(columnWithSeparator, value))
.toEqual({
"de-DE": "1.234",
"en-GB": "1,234",
"en-US": "1,234",
});
expect(getDisplayValueWithoutUserLocale(columnWithoutSeparator, value))
.toEqual({
"de-DE": "1234",
"en-GB": "1234",
"en-US": "1234",
});
});
it("should format single lang number values for all values to specified user Lang", () => {
const column: IntegerColumn = {
id: 1,
kind: "integer",
multilanguage: false,
} as any;
const value: IntegerCellValue = { value: 1234 };
const getDisplayValueForGerman = getDisplayValue("de-DE");
const getDisplayValueForGB = getDisplayValue("en-GB");
expect(getDisplayValueForGerman(column, value)).toEqual({
"de-DE": "1.234",
"en-GB": "1.234",
"en-US": "1.234",
});
expect(getDisplayValueForGB(column, value)).toEqual({
"de-DE": "1,234",
"en-GB": "1,234",
"en-US": "1,234",
});
});
});

describe("date", () => {
it("should format date values for specific langs when no user lang is given", () => {
const column: DateColumn = {
Expand Down
10 changes: 9 additions & 1 deletion src/getDisplayValue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
isDateColumn,
isDateTimeColumn,
isGroupColumn,
isIntegerColumn,
isLinkColumn,
isMultilangColumn,
isNumberColumn,
Expand All @@ -33,6 +34,7 @@ import type {
DisplayValueForColumn,
GroupColumn,
grudAny,
IntegerColumn,
LinkColumn,
MultilangValue,
NumberColumn,
Expand Down Expand Up @@ -134,9 +136,14 @@ export const getDisplayValue = (
};
const getNumberValue: getValueT<NumberColumn> = (column, value) => {
const formatNumber = (lt: Langtag, val: number) =>
i.formatNumber(userLang ?? lt, val);
i.formatNumber(userLang ?? lt, column.separator, val);
return mkDisplayMap(langs, column, value, formatNumber);
};
const getIntegerValue: getValueT<IntegerColumn> = (column, value) => {
const formatInteger = (lt: Langtag, val: number) =>
i.formatNumber(userLang ?? lt, column.separator, val);
return mkDisplayMap(langs, column, value, formatInteger);
};
const getPlainValue: getValueT<Column> = (column, value) =>
mkDisplayMap(langs, column, value);

Expand Down Expand Up @@ -188,6 +195,7 @@ export const getDisplayValue = (
[isDateColumn, getDateValue],
[isDateTimeColumn, getDateTimeValue],
[isGroupColumn, getGroupValue],
[isIntegerColumn, getIntegerValue],
[isLinkColumn, getLinkValue],
[isNumberColumn, getNumberValue],
[isRichtextColumn, getPlainValue],
Expand Down
16 changes: 14 additions & 2 deletions src/grud-intl.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ describe("grud-intl", () => {
);
});

describe("formatNumber()", () => {
describe("formatNumber() with separator", () => {
const amount = 1234.56;
it.each`
langtag | result
Expand All @@ -119,7 +119,19 @@ describe("grud-intl", () => {
${"en-US"} | ${"1,234.56"}
`("should format correctly for $langtag", ({ langtag, result }) => {
// be aware of uncommon white space in the results
expect(i.formatNumber(langtag, amount)).toBe(result);
expect(i.formatNumber(langtag, true, amount)).toBe(result);
});
});
describe("formatNumber() without separator", () => {
const amount = 1234.56;
it.each`
langtag | result
${"de-DE"} | ${"1234,56"}
${"en-GB"} | ${"1234.56"}
${"fr-CH"} | ${"1234,56"}
${"en-US"} | ${"1234.56"}
`("should format correctly for $langtag", ({ langtag, result }) => {
expect(i.formatNumber(langtag, false, amount)).toBe(result);
});
});

Expand Down
14 changes: 11 additions & 3 deletions src/grud-intl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -304,13 +304,21 @@ export function formatCurrency(
return arguments.length < 3 ? formatter.format : formatter.format(value);
}

export function formatNumber(lt: Country | Locale, value: number): string;
export function formatNumber(lt: Country | Locale): (_: number) => string;
export function formatNumber(
lt: Country | Locale,
separator: boolean,
value: number,
): string;
export function formatNumber(
lt: Country | Locale,
separator: boolean,
): (_: number) => string;
export function formatNumber(
langtag: Country | Locale = DEFAULT_LOCALE,
separator: boolean = true,
value: number = 0,
) {
const formatter = new Intl.NumberFormat(langtag);
const formatter = new Intl.NumberFormat(langtag, { useGrouping: separator });
return arguments.length < 2 ? formatter.format : formatter.format(value);
Comment thread
zingmane marked this conversation as resolved.
}

Expand Down
3 changes: 3 additions & 0 deletions src/predicates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import type {
CurrencyColumn,
DateColumn,
DateTimeColumn,
IntegerColumn,
LinkColumn,
NumberColumn,
RichTextColumn,
Expand All @@ -28,6 +29,8 @@ export const isConcatColumn = (column: Column): column is ConcatColumn =>
column.kind === ColumnKind.concat;
export const isGroupColumn = (column: Column): column is ConcatColumn =>
column.kind === ColumnKind.group;
export const isIntegerColumn = (column: Column): column is IntegerColumn =>
column.kind === ColumnKind.integer;
export const isLinkColumn = (column: Column): column is LinkColumn =>
column.kind === ColumnKind.link;
export const isNumberColumn = (column: Column): column is NumberColumn =>
Expand Down
1 change: 1 addition & 0 deletions src/types/cell.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export type TextCellValue = BaseCellValue<string>;
export type RichTextCellValue = BaseCellValue<string>;
export type ShortTextCellValue = BaseCellValue<string>;
export type NumberCellValue = BaseCellValue<number>;
export type IntegerCellValue = BaseCellValue<number>;
export type BooleanCellValue = BaseCellValue<boolean>;
export type LinkCellValue = SingleLangCellValue<
Array<CellValue & { id: number }>
Expand Down
19 changes: 18 additions & 1 deletion src/types/column.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export const ColumnKind = {
date: "date",
datetime: "datetime",
group: "group",
integer: "integer",
link: "link",
numeric: "numeric",
richtext: "richtext",
Expand All @@ -22,6 +23,14 @@ export const ColumnKind = {
} as const;
export type ColumnKind = (typeof ColumnKind)[keyof typeof ColumnKind];

export const LanguageType = {
language: "language",
country: "country",
neutral: "neutral",
} as const;

export type LanguageType = (typeof LanguageType)[keyof typeof LanguageType];

export type ColumnAttributeString = { type: "string"; value: string };
export type ColumnAttributeNumber = { type: "number"; value: number };
export type ColumnAttributeBoolean = { type: "boolean"; value: boolean };
Expand All @@ -43,9 +52,12 @@ interface BaseColumn {
format?: string;
id: ColumnID;
identifier: boolean;
languagetype?: LanguageType;
name: string;
ordering: number;
separator: boolean;
minLength?: number;
maxLength?: number;
}

interface SingleLangColumn<Kind extends ColumnKind> extends BaseColumn {
Expand All @@ -56,7 +68,7 @@ interface SingleLangColumn<Kind extends ColumnKind> extends BaseColumn {
interface MultilangColumn<Kind extends ColumnKind> extends BaseColumn {
multilanguage: true;
kind: Kind;
languagetype?: "language";
languagetype: "language";
}

interface MultiCountryColumn<Kind extends ColumnKind> extends BaseColumn {
Expand Down Expand Up @@ -125,6 +137,10 @@ export type AttachmentColumn = SingleOrMultilangColumn<"attachment">;
export type BooleanColumn = SingleLangColumn<"boolean">;
export type CurrencyColumn = MultiCountryColumn<"currency">;
export type NumberColumn = SingleOrMultilangColumn<"numeric">;

export type IntegerColumn = SingleOrMultilangColumn<"integer"> & {
separator?: boolean;
};
export type RichTextColumn = SingleOrMultilangColumn<"richtext">;
export type ShortTextColumn = SingleOrMultilangColumn<"shorttext">;
export type TextColumn = SingleOrMultilangColumn<"text">;
Expand All @@ -139,6 +155,7 @@ export type Column =
| DateColumn
| DateTimeColumn
| GroupColumn
| IntegerColumn
| LinkColumn
| NumberColumn
| RichTextColumn
Expand Down
2 changes: 2 additions & 0 deletions src/types/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ type CellValueForColumnMap = {
[Col.ColumnKind.date]: Cell.DateCellValue;
[Col.ColumnKind.datetime]: Cell.DateTimeCellValue;
[Col.ColumnKind.group]: Cell.GroupCellValue;
[Col.ColumnKind.integer]: Cell.IntegerCellValue;
[Col.ColumnKind.link]: Cell.LinkCellValue;
[Col.ColumnKind.numeric]: Cell.NumberCellValue;
[Col.ColumnKind.richtext]: Cell.RichTextCellValue;
Expand All @@ -62,6 +63,7 @@ type CellDisplayValueForColumnMap = {
[Col.ColumnKind.date]: MultilangValue<string>;
[Col.ColumnKind.datetime]: MultilangValue<string>;
[Col.ColumnKind.group]: MultilangValue<string>;
[Col.ColumnKind.integer]: MultilangValue<string>;
[Col.ColumnKind.link]: MultilangValue<string>[];
[Col.ColumnKind.numeric]: MultilangValue<string>;
[Col.ColumnKind.richtext]: MultilangValue<string>;
Expand Down
Loading