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: 2 additions & 0 deletions .spelling.dic
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,5 @@ statuslabel
Baselining
reengagement
macrotask
buildingsync
uniformat
10 changes: 10 additions & 0 deletions public/i18n/en_US.json
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@
"Associated Tax Lot IDs": "Associated Tax Lot IDs",
"Audit Template": "Audit Template",
"Audit Template Building ID": "Audit Template Building ID",
"Audit Template City ID": "Audit Template City ID",
"Audit Template Email": "Audit Template Email",
"Audit Template Organization Token": "Audit Template Organization Token",
"Audit Template Password": "Audit Template Password",
Expand Down Expand Up @@ -485,6 +486,7 @@
"Date Imported": "Date Imported",
"Date Uploaded": "Date Uploaded",
"Datetime": "Datetime",
"Day": "Day",
"Deadline": "Deadline",
"Deadline:": "Deadline:",
"Decode UBID": "Decode UBID",
Expand Down Expand Up @@ -609,6 +611,7 @@
"Emission Metric": "Emission Metric",
"Enable Audit Template Auto Sync": "Enable Audit Template Auto Sync",
"Enable ComStock Functionality": "Enable ComStock Functionality",
"Enable Conditional Import": "Enable Conditional Import",
"Enable Geocoding": "Enable Geocoding",
"Enable Labels in Public Feed": "Enable Labels in Public Feed",
"Enable Public Endpoints": "Enable Public Endpoints",
Expand Down Expand Up @@ -639,6 +642,7 @@
"Enter your Salesforce OAuth credentials to connect portfolio data": "Enter your Salesforce OAuth credentials to connect portfolio data",
"Error": "Error",
"Error Processing Data": "Error Processing Data",
"Error importing from ESPM": "Error importing from ESPM",
"Errors occurred while importing access level instances:": "Errors occurred while importing access level instances:",
"Example": "Example",
"Example Access Level Tree": "Example Access Level Tree",
Expand Down Expand Up @@ -844,6 +848,7 @@
"IRREVERSIBLE_OPERATION_WARNING": "This operation is irreversible.",
"ITEMS_WILL_NOT_CHANGE": "these will not change",
"If you are unable to scan the QR code, select a different method below.": "If you are unable to scan the QR code, select a different method below.",
"If you wish to generate stub Audit Template reports from SEED data, select which Audit Template Report Type SEED should generate.": "If you wish to generate stub Audit Template reports from SEED data, select which Audit Template Report Type SEED should generate.",
"If your organization requires partner approval for notes, please ensure that the appropriate stakeholders are notified. Partner: once you have reviewed and edited the note above, please check the box below to indicate your approval.": "If your organization requires partner approval for notes, please ensure that the appropriate stakeholders are notified. Partner: once you have reviewed and edited the note above, please check the box below to indicate your approval.",
"Ignored duplicates of existing properties": "Ignored duplicates of existing properties",
"Ignored duplicates of existing tax lots": "Ignored duplicates of existing tax lots",
Expand Down Expand Up @@ -1288,6 +1293,7 @@
"Property UBIDs": "Property UBIDs",
"Property Visibility": "Property Visibility",
"Property and Tax Lot Data": "Property and Tax Lot Data",
"Property updated from ESPM successfully.": "Property updated from ESPM successfully.",
"Public Data Sharing": "Public Data Sharing",
"Public Disclosure - Sharing Your Data": "Public Disclosure - Sharing Your Data",
"Public Query Threshold": "Public Query Threshold",
Expand Down Expand Up @@ -1324,6 +1330,7 @@
"Remove System": "Remove System",
"Remove User": "Remove User",
"Remove User from Organizatio": "Remove User from Organizatio",
"Remove User from Organization": "Remove User from Organization",
"Remove buildings from project": "Remove buildings from project",
"Remove inventory and organizations": "Remove inventory and organizations",
"Removing buildings from project": "Removing buildings from project",
Expand Down Expand Up @@ -1505,7 +1512,9 @@
"Search column name": "Search column name",
"Search display name": "Search display name",
"Search field name": "Search field name",
"Search goals…": "Search goals…",
"Search table name": "Search table name",
"Search…": "Search…",
"Secondary (optional)": "Secondary (optional)",
"Secondary Column (optional)": "Secondary Column (optional)",
"Secondary EUI": "Secondary EUI",
Expand Down Expand Up @@ -1774,6 +1783,7 @@
"Units": "Units",
"Unknown": "Unknown",
"Unmerge Last": "Unmerge Last",
"Unmerge complete.": "Unmerge complete.",
"Unsuccessful Exports": "Unsuccessful Exports",
"Until last date of": "Until last date of",
"Update": "Update",
Expand Down
10 changes: 10 additions & 0 deletions public/i18n/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@
"Associated Tax Lot IDs": "CIF asociados",
"Audit Template": "Plantilla de auditoría",
"Audit Template Building ID": "Plantilla de auditoría ID del edificio",
"Audit Template City ID": "Plantilla de auditoría ID de ciudad",
"Audit Template Email": "Plantilla de auditoría por correo electrónico",
"Audit Template Organization Token": "Plantilla de auditoría Token de organización",
"Audit Template Password": "Contraseña de la plantilla de auditoría",
Expand Down Expand Up @@ -485,6 +486,7 @@
"Date Imported": "Fecha de importación",
"Date Uploaded": "Fecha de carga",
"Datetime": "Fecha y hora",
"Day": "Día",
"Deadline": "Plazo",
"Deadline:": "Fecha límite:",
"Decode UBID": "Descodificar UBID",
Expand Down Expand Up @@ -609,6 +611,7 @@
"Emission Metric": "Emisión Métrica",
"Enable Audit Template Auto Sync": "Activar la sincronización automática de plantillas de auditoría",
"Enable ComStock Functionality": "Activar la funcionalidad ComStock",
"Enable Conditional Import": "Habilitar importación condicional",
"Enable Geocoding": "Activar la geocodificación",
"Enable Labels in Public Feed": "Habilitar etiquetas en el feed público",
"Enable Public Endpoints": "Habilitar puntos finales públicos",
Expand Down Expand Up @@ -639,6 +642,7 @@
"Enter your Salesforce OAuth credentials to connect portfolio data": "Ingrese sus credenciales de Salesforce OAuth para conectar los datos del portafolio.",
"Error": "Error",
"Error Processing Data": "Datos de procesamiento de errores",
"Error importing from ESPM": "Error al importar desde ESPM",
"Errors occurred while importing access level instances:": "Se produjeron errores al importar instancias de nivel de acceso:",
"Example": "Ejemplo",
"Example Access Level Tree": "Ejemplo de árbol de niveles de acceso",
Expand Down Expand Up @@ -844,6 +848,7 @@
"IRREVERSIBLE_OPERATION_WARNING": "Esta operación es irreversible.",
"ITEMS_WILL_NOT_CHANGE": "estos no cambiarán",
"If you are unable to scan the QR code, select a different method below.": "Si no puede escanear el código QR, seleccione un método diferente a continuación.",
"If you wish to generate stub Audit Template reports from SEED data, select which Audit Template Report Type SEED should generate.": "Si desea generar informes de plantilla de auditoría preliminares a partir de datos de SEED, seleccione el tipo de informe de plantilla de auditoría que SEED debe generar.",
"If your organization requires partner approval for notes, please ensure that the appropriate stakeholders are notified. Partner: once you have reviewed and edited the note above, please check the box below to indicate your approval.": "Si su organización requiere la aprobación de los socios para las notas, asegúrese de notificar a las partes interesadas correspondientes. Socio: una vez que haya revisado y editado la nota anterior, marque la casilla a continuación para indicar su aprobación.",
"Ignored duplicates of existing properties": "Duplicados ignorados de propiedades existentes",
"Ignored duplicates of existing tax lots": "Duplicados ignorados de lotes fiscales existentes",
Expand Down Expand Up @@ -1288,6 +1293,7 @@
"Property UBIDs": "UBID de la propiedad",
"Property Visibility": "Visibilidad de la propiedad",
"Property and Tax Lot Data": "Datos sobre propiedades y lotes fiscales",
"Property updated from ESPM successfully.": "La propiedad se actualizó correctamente desde ESPM.",
"Public Data Sharing": "Intercambio de datos públicos",
"Public Disclosure - Sharing Your Data": "Divulgación pública - Compartir sus datos",
"Public Query Threshold": "Umbral de consulta pública",
Expand Down Expand Up @@ -1324,6 +1330,7 @@
"Remove System": "Quitar sistema",
"Remove User": "Eliminar usuario",
"Remove User from Organizatio": "Eliminar usuario de la organización",
"Remove User from Organization": "Eliminar usuario de la organización",
"Remove buildings from project": "Retirar edificios del proyecto",
"Remove inventory and organizations": "Eliminar inventario y organizaciones",
"Removing buildings from project": "Retirada de edificios del proyecto",
Expand Down Expand Up @@ -1505,7 +1512,9 @@
"Search column name": "Nombre de la columna de búsqueda",
"Search display name": "Buscar nombre para mostrar",
"Search field name": "Nombre del campo de búsqueda",
"Search goals…": "Objetivos de búsqueda…",
"Search table name": "Buscar nombre de tabla",
"Search…": "Buscar…",
"Secondary (optional)": "Secundaria (opcional)",
"Secondary Column (optional)": "Columna secundaria (opcional)",
"Secondary EUI": "EUI secundario",
Expand Down Expand Up @@ -1774,6 +1783,7 @@
"Units": "Unidades",
"Unknown": "Desconocido",
"Unmerge Last": "Fusión final",
"Unmerge complete.": "Descombinación completada.",
"Unsuccessful Exports": "Exportaciones fallidas",
"Until last date of": "Hasta la última fecha de",
"Update": "Actualizar",
Expand Down
10 changes: 10 additions & 0 deletions public/i18n/fr_CA.json
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,7 @@
"Associated Tax Lot IDs": "IDs des lots d'impôt associé",
"Audit Template": "Modèle d'audit",
"Audit Template Building ID": "Audit Template ID de bâtiment",
"Audit Template City ID": "Modèle d'audit ID de ville",
"Audit Template Email": "Audit Template Email",
"Audit Template Organization Token": "Audit Template jeton d'organisation",
"Audit Template Password": "Audit Template le mot de passe",
Expand Down Expand Up @@ -485,6 +486,7 @@
"Date Imported": "Date d'importation",
"Date Uploaded": "Date de téléchargement",
"Datetime": "Datetime",
"Day": "Jour",
"Deadline": "Date limite",
"Deadline:": "Date limite:",
"Decode UBID": "Décoder UBID",
Expand Down Expand Up @@ -609,6 +611,7 @@
"Emission Metric": "Mesure des émissions",
"Enable Audit Template Auto Sync": "Activer la synchronisation automatique du modèle d'audit",
"Enable ComStock Functionality": "Activer la fonctionnalité ComStock",
"Enable Conditional Import": "Activer l'importation conditionnelle",
"Enable Geocoding": "Activer le géocodage",
"Enable Labels in Public Feed": "Activer les étiquettes dans le flux public",
"Enable Public Endpoints": "Activer les points de terminaison publics",
Expand Down Expand Up @@ -639,6 +642,7 @@
"Enter your Salesforce OAuth credentials to connect portfolio data": "Saisissez vos identifiants OAuth Salesforce pour connecter les données du portefeuille",
"Error": "Erreur",
"Error Processing Data": "Erreur lors du traitement des données",
"Error importing from ESPM": "Erreur lors de l'importation depuis ESPM",
"Errors occurred while importing access level instances:": "Des erreurs se sont produites lors de l'importation des instances de niveau d'accès :",
"Example": "Exemple",
"Example Access Level Tree": "Exemple de graphe en arbre de niveaux d'accès",
Expand Down Expand Up @@ -844,6 +848,7 @@
"IRREVERSIBLE_OPERATION_WARNING": "Cette opération est irréversible.",
"ITEMS_WILL_NOT_CHANGE": "ceux-ci ne changeront pas",
"If you are unable to scan the QR code, select a different method below.": "Si vous ne parvenez pas à scanner le code QR, veuillez sélectionner une autre méthode ci-dessous.",
"If you wish to generate stub Audit Template reports from SEED data, select which Audit Template Report Type SEED should generate.": "Si vous souhaitez générer des rapports de modèle d'audit préliminaires à partir des données SEED, sélectionnez le type de rapport de modèle d'audit que SEED doit générer.",
"If your organization requires partner approval for notes, please ensure that the appropriate stakeholders are notified. Partner: once you have reviewed and edited the note above, please check the box below to indicate your approval.": "Si votre organisation exige l'approbation des partenaires pour les notes, veuillez vous assurer que les parties prenantes concernées en sont informées. Partenaire : après avoir examiné et modifié la note ci-dessus, veuillez cocher la case ci-dessous pour indiquer votre approbation.",
"Ignored duplicates of existing properties": "Copies ignorées des propriétés existantes",
"Ignored duplicates of existing tax lots": "Copies ignorées des lots d'impôt existants",
Expand Down Expand Up @@ -1288,6 +1293,7 @@
"Property UBIDs": "UBID de propriété",
"Property Visibility": "Visibilité de la propriété",
"Property and Tax Lot Data": "Données foncières et fiscales",
"Property updated from ESPM successfully.": "Propriété mise à jour avec succès depuis ESPM.",
"Public Data Sharing": "Partage de données publiques",
"Public Disclosure - Sharing Your Data": "Divulgation publique – Partage de données",
"Public Query Threshold": "Seuil de requête publique",
Expand Down Expand Up @@ -1324,6 +1330,7 @@
"Remove System": "Supprimer le système",
"Remove User": "Supprimer l'utilisateur",
"Remove User from Organizatio": "Supprimer l'utilisateur de l'organisation",
"Remove User from Organization": "Supprimer l'utilisateur de l'organisation",
"Remove buildings from project": "Supprimer les bâtiments du projet",
"Remove inventory and organizations": "Supprimer l'inventaire et les organisations",
"Removing buildings from project": "Retrait des bâtiments du projet",
Expand Down Expand Up @@ -1505,7 +1512,9 @@
"Search column name": "Rechercher le nom de la colonne",
"Search display name": "Rechercher le nom d'affichage",
"Search field name": "Rechercher le nom du champ",
"Search goals…": "Objectifs de recherche…",
"Search table name": "Rechercher le nom de la table",
"Search…": "Rechercher…",
"Secondary (optional)": "Secondaire (facultatif)",
"Secondary Column (optional)": "Colonne secondaire (facultative)",
"Secondary EUI": "UI secondaire",
Expand Down Expand Up @@ -1774,6 +1783,7 @@
"Units": "Unités",
"Unknown": "Inconnue",
"Unmerge Last": "Défaire la fusion Dernière",
"Unmerge complete.": "Fusion terminée.",
"Unsuccessful Exports": "Exportations infructueuses",
"Until last date of": "Jusqu'à la dernière date de",
"Update": "Mise à jour",
Expand Down
2 changes: 2 additions & 0 deletions src/@seed/api/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export * from './organization'
export * from './pairing'
export * from './postoffice'
export * from './property'
export * from './property-element'
export * from './program'
export * from './report-configuration'
export * from './progress'
Expand All @@ -36,5 +37,6 @@ export * from './sensor'
export * from './swagger'
export * from './two-factor'
export * from './ubid'
export * from './uniformat'
export * from './user'
export * from './version'
3 changes: 2 additions & 1 deletion src/@seed/api/inventory/inventory.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -507,7 +507,8 @@ export class InventoryService {

unmerge(orgId: number, viewId: number, type: InventoryType): Observable<{ view_id: number }> {
const url = `/api/v3/${type}/${viewId}/unmerge/?organization_id=${orgId}`
const request$ = type === 'properties' ? this._httpClient.put<{ view_id: number }>(url, {}) : this._httpClient.post<{ view_id: number }>(url, {})
const request$
= type === 'properties' ? this._httpClient.put<{ view_id: number }>(url, {}) : this._httpClient.post<{ view_id: number }>(url, {})
return request$.pipe(
catchError((error: HttpErrorResponse) => {
return this._errorService.handleError(error, 'Error unmerging inventory')
Expand Down
1 change: 1 addition & 0 deletions src/@seed/api/organization/organization.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ export type PropertyInsightsUserSettings = {

export type InsightsUserSettings = {
propertyInsights?: PropertyInsightsUserSettings;
portfolioSummary?: { goalId?: number };
}

export type OrganizationUsersResponse = {
Expand Down
2 changes: 2 additions & 0 deletions src/@seed/api/property-element/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './property-element.service'
export * from './property-element.types'
20 changes: 20 additions & 0 deletions src/@seed/api/property-element/property-element.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import type { HttpErrorResponse } from '@angular/common/http'
import { HttpClient } from '@angular/common/http'
import { inject, Injectable } from '@angular/core'
import type { Observable } from 'rxjs'
import { catchError } from 'rxjs'
import { ErrorService } from '@seed/services'
import type { PropertyElement } from './property-element.types'

@Injectable({ providedIn: 'root' })
export class PropertyElementService {
private _httpClient = inject(HttpClient)
private _errorService = inject(ErrorService)

getElements(orgId: number, propertyId: number): Observable<PropertyElement[]> {
const url = `/api/v3/properties/${propertyId}/elements/`
return this._httpClient
.get<PropertyElement[]>(url, { params: { organization_id: orgId } })
.pipe(catchError((error: HttpErrorResponse) => this._errorService.handleError(error, 'Error fetching building elements')))
}
}
10 changes: 10 additions & 0 deletions src/@seed/api/property-element/property-element.types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
export type PropertyElement = {
id: number;
code: string;
description: string | null;
installation_date: string | null;
condition_index: number | null;
remaining_service_life: number | null;
replacement_cost: number | null;
extra_data: Record<string, unknown>;
}
2 changes: 2 additions & 0 deletions src/@seed/api/uniformat/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './uniformat.service'
export * from './uniformat.types'
25 changes: 25 additions & 0 deletions src/@seed/api/uniformat/uniformat.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import type { HttpErrorResponse } from '@angular/common/http'
import { HttpClient } from '@angular/common/http'
import { inject, Injectable } from '@angular/core'
import type { Observable } from 'rxjs'
import { catchError, map } from 'rxjs'
import { ErrorService } from '@seed/services'
import type { UniformatLookup } from './uniformat.types'

@Injectable({ providedIn: 'root' })
export class UniformatService {
private _httpClient = inject(HttpClient)
private _errorService = inject(ErrorService)

getUniformat(): Observable<UniformatLookup> {
return this._httpClient.get<{ id: string; category: string; parent: string | null }[]>('/api/v3/uniformat/').pipe(
map((items) =>
items.reduce<UniformatLookup>((acc, { id, category, parent }) => {
acc[id] = { category, parent }
return acc
}, {}),
),
catchError((error: HttpErrorResponse) => this._errorService.handleError(error, 'Error fetching uniformat data')),
)
}
}
6 changes: 6 additions & 0 deletions src/@seed/api/uniformat/uniformat.types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export type UniformatCategory = {
category: string;
parent: string | null;
}

export type UniformatLookup = Record<string, UniformatCategory>
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,24 @@
<div class="mb-1 flex items-center gap-3">
<mat-label class="text-secondary shrink-0 text-sm">{{ t('Goal') }}:</mat-label>
<mat-form-field class="w-72" subscriptSizing="dynamic">
<mat-select [value]="currentGoal?.id" (selectionChange)="selectGoal($event)" placeholder="{{ t('(select a goal)') }}">
@for (goal of goals; track goal.id) {
<mat-select
[value]="currentGoal?.id"
[placeholder]="t('(select a goal)')"
(selectionChange)="selectGoal($event)"
(openedChange)="onGoalDropdownOpened($event)"
>
<mat-select-trigger>{{ currentGoal?.name ?? t('(select a goal)') }}</mat-select-trigger>
<!-- Search input pinned at top of dropdown -->
<div class="px-4 py-1">
<input
class="h-8 w-full bg-transparent outline-none"
[formControl]="goalSearchCtrl"
[placeholder]="t('Search\u2026')"
(click)="$event.stopPropagation()"
(keydown)="$event.stopPropagation()"
/>
</div>
@for (goal of filteredGoals; track goal.id) {
<mat-option [value]="goal.id">{{ goal.name }}</mat-option>
}
</mat-select>
Expand Down
Loading
Loading