From 2e65c79184e2261451287522a149efb758ce1e77 Mon Sep 17 00:00:00 2001 From: Vladyslav_Prykhodko Date: Tue, 6 May 2025 18:42:38 +0300 Subject: [PATCH] UI: Updated unit definition --- ui-ngx/src/app/core/services/unit.service.ts | 6 +- .../shared/components/unit-input.component.ts | 12 ++-- ui-ngx/src/app/shared/models/unit.models.ts | 69 +++++-------------- .../app/shared/models/units/acceleration.ts | 4 +- ui-ngx/src/app/shared/models/units/length.ts | 6 ++ .../shared/models/units/logarithmic-ratio.ts | 4 +- .../assets/locale/locale.constant-en_US.json | 3 +- 7 files changed, 40 insertions(+), 64 deletions(-) diff --git a/ui-ngx/src/app/core/services/unit.service.ts b/ui-ngx/src/app/core/services/unit.service.ts index 3d1fc4de0a..9e656907f3 100644 --- a/ui-ngx/src/app/core/services/unit.service.ts +++ b/ui-ngx/src/app/core/services/unit.service.ts @@ -44,10 +44,8 @@ export class UnitService { takeUntilDestroyed() ).subscribe(() => { this.converter = getUnitConverter(this.translate); - console.warn(this.converter?.listUnits()); - console.warn(this.converter?.listUnits('temperature')); - console.warn(this.converter?.listUnits('temperature', UnitSystem.METRIC)); - console.warn(this.converter?.listUnits(null, UnitSystem.IMPERIAL)); + console.warn(this.converter.listUnits()); + console.warn(this.converter.listUnits(null, UnitSystem.IMPERIAL)); }); } diff --git a/ui-ngx/src/app/shared/components/unit-input.component.ts b/ui-ngx/src/app/shared/components/unit-input.component.ts index 9b582d1266..9ec990a0da 100644 --- a/ui-ngx/src/app/shared/components/unit-input.component.ts +++ b/ui-ngx/src/app/shared/components/unit-input.component.ts @@ -31,7 +31,7 @@ import { } from '@angular/core'; import { ControlValueAccessor, FormBuilder, FormControl, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; import { Observable, of, shareReplay } from 'rxjs'; -import { AllMeasures, searchUnits, TbUnit, UnitInfo, UnitsType, UnitSystem } from '@shared/models/unit.models'; +import { AllMeasures, TbUnit, UnitInfo, UnitsType, UnitSystem } from '@shared/models/unit.models'; import { map, mergeMap } from 'rxjs/operators'; import { UnitService } from '@core/services/unit.service'; import { TbPopoverService } from '@shared/components/popover.service'; @@ -247,9 +247,13 @@ export class UnitInputComponent implements ControlValueAccessor, OnInit, OnChang private searchUnit(units: Array<[AllMeasures, Array]>, searchText?: string): Array<[AllMeasures, Array]> { if (isNotEmptyStr(searchText)) { const filterValue = searchText.trim().toUpperCase() - return units - .map(measure => [measure[0], searchUnits(measure[1], filterValue)] as [AllMeasures, UnitInfo[]]) - .filter((measure) => measure[1].length > 0); + return units.reduce((result: Array<[AllMeasures, Array]>, [measure, unitInfos]) => { + const filteredUnits = unitInfos.filter(unit => unit.searchText.toUpperCase().includes(filterValue)); + if (filteredUnits.length > 0) { + result.push([measure, filteredUnits]); + } + return result; + }, []); } return units; } diff --git a/ui-ngx/src/app/shared/models/unit.models.ts b/ui-ngx/src/app/shared/models/unit.models.ts index 3fcf742cb0..57a2f26f6e 100644 --- a/ui-ngx/src/app/shared/models/unit.models.ts +++ b/ui-ngx/src/app/shared/models/unit.models.ts @@ -83,6 +83,7 @@ import radioactivity, { RadioactivityUnits } from '@shared/models/units/radioact import radioactivityConcentration, { RadioactivityConcentrationUnits } from '@shared/models/units/radioactivity-concentration'; +import reciprocalLength, { ReciprocalLengthUnits } from '@shared/models/units/reciprocal-length'; import resistance, { ResistanceUnits } from '@shared/models/units/resistance'; import reynoldsNumber, { ReynoldsNumberUnits } from '@shared/models/units/reynolds-number'; import signalLevel, { SignalLevelUnits } from '@shared/models/units/signal-level'; @@ -103,7 +104,6 @@ import voltage, { VoltageUnits } from '@shared/models/units/voltage'; import volume, { VolumeUnits } from '@shared/models/units/volume'; import volumeFlow, { VolumeFlowUnits } from '@shared/models/units/volume-flow'; import { TranslateService } from '@ngx-translate/core'; -import reciprocalLength, { ReciprocalLengthUnits } from '@shared/models/units/reciprocal-length'; export type AllMeasuresUnits = | AbsorbedDoseRateUnits @@ -388,6 +388,7 @@ export interface UnitInfo { system: UnitSystem; name: string; tags: string[]; + searchText: string; } export enum UnitSystem { @@ -423,43 +424,21 @@ export interface TbMeasureUnits { units?: Partial>; } -export interface Conversion { - abbr: TUnits; - measure: TMeasures; +export interface UnitCacheInfo { system: UnitSystem; + measure: AllMeasures; unit: Unit; + abbr: AllMeasuresUnits; + searchText: string; } -export type UnitCache = Map; - -const searchUnitTags = (unit: UnitInfo, searchText: string): boolean => - !!unit.tags.find(t => t.toUpperCase().includes(searchText)); - -export const searchUnits = (_units: Array, searchText: string): Array => _units.filter( - u => u.abbr.toUpperCase().includes(searchText) || - u.name.toUpperCase().includes(searchText) || - searchUnitTags(u, searchText) -); +export type UnitCache = Map; type Entries = [S, T[keyof T]]; export class Converter { private readonly measureData: Record>; - private unitCache: Map< - string, - { - system: UnitSystem; - measure: AllMeasures; - unit: Unit; - abbr: AllMeasuresUnits; - } - >; + private unitCache: UnitCache; constructor( measures: Record>, @@ -534,7 +513,7 @@ export class Converter { return null; } - getUnit(abbr: AllMeasuresUnits | string): Conversion | null { + getUnit(abbr: AllMeasuresUnits | string): UnitCacheInfo | null { return this.unitCache.get(abbr) ?? null; } @@ -565,22 +544,15 @@ export class Converter { continue; } - for (const [abbr, unit] of Object.entries(units) as [AllMeasuresUnits, Unit][]) { - results.push( - this.describeUnit({ - abbr, - measure: name as AllMeasures, - system, - unit, - }) - ); + for (const abbr of Object.keys(units) as AllMeasuresUnits[]) { + results.push(this.describe(abbr)); } } } return results; } - unitsGroupByMeasure(measureName?: AllMeasures, unitSystem?: UnitSystem): UnitInfoGroupByMeasure | never { + unitsGroupByMeasure(measureName?: AllMeasures, unitSystem?: UnitSystem): UnitInfoGroupByMeasure { const results: UnitInfoGroupByMeasure = {}; const measures = measureName @@ -604,28 +576,22 @@ export class Converter { continue; } - for (const [abbr, unit] of Object.entries(units) as [AllMeasuresUnits, Unit][]) { - results[name].push( - this.describeUnit({ - abbr, - measure: name as AllMeasures, - system, - unit, - }) - ); + for (const abbr of Object.keys(units) as AllMeasuresUnits[]) { + results[name].push(this.describe(abbr)); } } } return results; } - private describeUnit(unit: Conversion): UnitInfo { + private describeUnit(unit: UnitCacheInfo): UnitInfo { return { abbr: unit.abbr, measure: unit.measure, system: unit.system, name: unit.unit.name, - tags: unit.unit.tags + tags: unit.unit.tags, + searchText: unit.searchText }; } @@ -671,6 +637,7 @@ function buildUnitCache(measures: Record = { ratio: 3.28084, units: { - G: { + 'g₀': { name: 'unit.g-force', tags: ['gravity', 'load'], to_anchor: 9.80665, diff --git a/ui-ngx/src/app/shared/models/units/length.ts b/ui-ngx/src/app/shared/models/units/length.ts index 549a66c3e6..57847fb71d 100644 --- a/ui-ngx/src/app/shared/models/units/length.ts +++ b/ui-ngx/src/app/shared/models/units/length.ts @@ -27,6 +27,7 @@ export type LengthImperialUnits = | 'fathom' | 'mi' | 'nmi' + | 'pouce' | 'thou' | 'barleycorn' | 'hand' @@ -122,6 +123,11 @@ const IMPERIAL: TbMeasureUnits = { tags: ['level', 'height', 'distance', 'width', 'gap', 'depth', 'nautical mile'], to_anchor: 6076.12, }, + pouce: { + name: 'unit.paris-inch', + tags: ['level', 'height', 'distance', 'width', 'gap', 'depth', 'nautical mile'], + to_anchor: 1.0657, + }, thou: { name: 'unit.thou', tags: ['measurement'], diff --git a/ui-ngx/src/app/shared/models/units/logarithmic-ratio.ts b/ui-ngx/src/app/shared/models/units/logarithmic-ratio.ts index 83a26c3030..709eb44e35 100644 --- a/ui-ngx/src/app/shared/models/units/logarithmic-ratio.ts +++ b/ui-ngx/src/app/shared/models/units/logarithmic-ratio.ts @@ -16,7 +16,7 @@ import { TbMeasure, TbMeasureUnits } from '@shared/models/unit.models'; -export type LogarithmicRatioUnits = 'dB' | 'B' | 'Np'; +export type LogarithmicRatioUnits = 'dB' | 'bel' | 'Np'; const METRIC: TbMeasureUnits = { units: { @@ -25,7 +25,7 @@ const METRIC: TbMeasureUnits = { tags: ['noise level', 'sound level', 'volume', 'acoustics'], to_anchor: 1, }, - B: { + bel: { name: 'unit.bel', tags: ['power ratio', 'intensity ratio'], to_anchor: 10, diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json index 3798e96a9b..aa4ef10837 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -6376,7 +6376,8 @@ "rotation-per-minute": "Rotation per minute", "degrees-brix": "Degrees Brix", "katal": "Katal", - "katal-per-cubic-metre": "Katal per Cubic Metre" + "katal-per-cubic-metre": "Katal per Cubic Metre", + "paris-inch": "Paris inch" }, "user": { "user": "User",