/// /// Copyright © 2016-2022 The Thingsboard Authors /// /// Licensed under the Apache License, Version 2.0 (the "License"); /// you may not use this file except in compliance with the License. /// You may obtain a copy of the License at /// /// http://www.apache.org/licenses/LICENSE-2.0 /// /// Unless required by applicable law or agreed to in writing, software /// distributed under the License is distributed on an "AS IS" BASIS, /// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. /// See the License for the specific language governing permissions and /// limitations under the License. /// import { Pipe, PipeTransform } from '@angular/core'; type unit = 'bytes' | 'KB' | 'MB' | 'GB' | 'TB' | 'PB'; type unitPrecisionMap = { [u in unit]: number; }; const defaultPrecisionMap: unitPrecisionMap = { bytes: 0, KB: 1, MB: 1, GB: 1, TB: 2, PB: 2 }; @Pipe({ name: 'fileSize' }) export class FileSizePipe implements PipeTransform { private readonly units: unit[] = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB']; transform(bytes: number = 0, precision: number | unitPrecisionMap = defaultPrecisionMap): string { if (isNaN(parseFloat(String(bytes))) || !isFinite(bytes)) { return '?'; } let unitIndex = 0; while (bytes >= 1024) { bytes /= 1024; unitIndex++; } const unitSymbol = this.units[unitIndex]; if (typeof precision === 'number') { return `${bytes.toFixed(+precision)} ${unitSymbol}`; } return `${bytes.toFixed(precision[unitSymbol])} ${unitSymbol}`; } }