feat(console): Add organization ID filter to organization list (#9823)

<!--
Please inform yourself about the contribution guidelines on submitting a
PR here:
https://github.com/zitadel/zitadel/blob/main/CONTRIBUTING.md#submit-a-pull-request-pr.
Take note of how PR/commit titles should be written and replace the
template texts in the sections below. Don't remove any of the sections.
It is important that the commit history clearly shows what is changed
and why.
Important: By submitting a contribution you agree to the terms from our
Licensing Policy as described here:
https://github.com/zitadel/zitadel/blob/main/LICENSING.md#community-contributions.
-->

# Which Problems Are Solved

Replace this example text with a concise list of problems that this PR
solves.
- Organization list lacked the ability to filter by organization ID
- No efficient method was provided for users to search organizations by
ID


# How the Problems Are Solved

Replace this example text with a concise list of changes that this PR
introduces.
- Added organization ID filtering functionality to
`filter-org.component.ts`
  - Added `ID` to the `SubQuery` enum
- Added `ID` case handling to `changeCheckbox`, `setValue`, and
`getSubFilter` methods
- Added ID filter UI to `filter-org.component.html`
  - Added checkbox and text input field
  - Used translation key to display "Organization ID" label
- Added new translation key to translation file (`en.json`)
  - Added `FILTER.ORGID` key with "Organization ID" value


# Additional Changes

Replace this example text with a concise list of additional changes that
this PR introduces, that are not directly solving the initial problem
but are related.
- Maintained consistency with existing filtering functionality
- Ensured intuitive user interface usability
- Added new key while maintaining translation file structure


# Additional Context

Replace this example with links to related issues, discussions, discord
threads, or other sources with more context.
Use the Closing #issue syntax for issues that are resolved with this PR.
- Closes #8792
- Discussion #xxx
- Follow-up for PR #xxx
- https://discord.com/channels/xxx/xxx

---------

Co-authored-by: Marco A. <kwbmm1990@gmail.com>
This commit is contained in:
subaru
2025-05-12 17:04:32 +09:00
committed by GitHub
parent 60ce32ca4f
commit 28856015d6
21 changed files with 95 additions and 4 deletions

View File

@@ -69,4 +69,19 @@
</cnsl-form-field>
</div>
</div>
<div class="id-query">
<mat-checkbox id="id" class="cb" [checked]="getSubFilter(SubQuery.ID)" (change)="changeCheckbox(SubQuery.ID, $event)"
>{{ 'FILTER.ORGID' | translate }}
</mat-checkbox>
<div class="subquery" *ngIf="getSubFilter(SubQuery.ID) as idq">
<span class="nomethod cnsl-secondary-text">
{{ 'FILTER.METHODS.1' | translate }}
</span>
<cnsl-form-field class="filter-input-value">
<input cnslInput name="value" [value]="idq.getId()" (change)="setValue(SubQuery.ID, idq, $event)" />
</cnsl-form-field>
</div>
</div>
</cnsl-filter>

View File

@@ -3,7 +3,14 @@ import { MatCheckboxChange } from '@angular/material/checkbox';
import { ActivatedRoute, Router } from '@angular/router';
import { take } from 'rxjs';
import { TextQueryMethod } from 'src/app/proto/generated/zitadel/object_pb';
import { OrgDomainQuery, OrgNameQuery, OrgQuery, OrgState, OrgStateQuery } from 'src/app/proto/generated/zitadel/org_pb';
import {
OrgDomainQuery,
OrgNameQuery,
OrgQuery,
OrgState,
OrgStateQuery,
OrgIDQuery,
} from 'src/app/proto/generated/zitadel/org_pb';
import { UserNameQuery } from 'src/app/proto/generated/zitadel/user_pb';
import { FilterComponent } from '../filter/filter.component';
@@ -12,6 +19,7 @@ enum SubQuery {
NAME,
STATE,
DOMAIN,
ID,
}
@Component({
@@ -61,6 +69,12 @@ export class FilterOrgComponent extends FilterComponent implements OnInit {
orgDomainQuery.setMethod(filter.domainQuery.method);
orgQuery.setDomainQuery(orgDomainQuery);
return orgQuery;
} else if (filter.idQuery) {
const orgQuery = new OrgQuery();
const orgIdQuery = new OrgIDQuery();
orgIdQuery.setId(filter.idQuery.id);
orgQuery.setIdQuery(orgIdQuery);
return orgQuery;
} else {
return undefined;
}
@@ -100,6 +114,13 @@ export class FilterOrgComponent extends FilterComponent implements OnInit {
odq.setDomainQuery(dq);
this.searchQueries.push(odq);
break;
case SubQuery.ID:
const idq = new OrgIDQuery();
idq.setId('');
const oidq = new OrgQuery();
oidq.setIdQuery(idq);
this.searchQueries.push(oidq);
break;
}
} else {
switch (subquery) {
@@ -121,6 +142,12 @@ export class FilterOrgComponent extends FilterComponent implements OnInit {
this.searchQueries.splice(index_pdn, 1);
}
break;
case SubQuery.ID:
const index_id = this.searchQueries.findIndex((q) => (q as OrgQuery).toObject().idQuery !== undefined);
if (index_id > -1) {
this.searchQueries.splice(index_id, 1);
}
break;
}
}
}
@@ -140,6 +167,10 @@ export class FilterOrgComponent extends FilterComponent implements OnInit {
(query as OrgDomainQuery).setDomain(value);
this.filterChanged.emit(this.searchQueries ? this.searchQueries : []);
break;
case SubQuery.ID:
(query as OrgIDQuery).setId(value);
this.filterChanged.emit(this.searchQueries ? this.searchQueries : []);
break;
}
}
@@ -166,6 +197,13 @@ export class FilterOrgComponent extends FilterComponent implements OnInit {
} else {
return undefined;
}
case SubQuery.ID:
const id = this.searchQueries.find((q) => (q as OrgQuery).toObject().idQuery !== undefined);
if (id) {
return (id as OrgQuery).getIdQuery();
} else {
return undefined;
}
}
}

View File

@@ -692,6 +692,7 @@
"EMAIL": "електронна поща",
"USERNAME": "Потребителско име",
"ORGNAME": "Наименование на организацията",
"ORGID": "Идентификатор на организацията",
"PRIMARYDOMAIN": "Основен домейн",
"PROJECTNAME": "Име на проекта",
"RESOURCEOWNER": "Собственик на ресурс",
@@ -2150,6 +2151,7 @@
"ACTIVATE": "Активиране на проекта",
"DELETE": "Изтриване на проекта",
"ORGNAME": "Наименование на организацията",
"ORGID": "Идентификатор на организацията",
"ORGDOMAIN": "Домейн на организацията",
"STATE": "Статус",
"TYPE": "Тип",

View File

@@ -693,6 +693,7 @@
"EMAIL": "Email",
"USERNAME": "Uživatelské jméno",
"ORGNAME": "Název organizace",
"ORGID": "ID organizace",
"PRIMARYDOMAIN": "Primární doména",
"PROJECTNAME": "Název projektu",
"RESOURCEOWNER": "Vlastník zdroje",
@@ -2151,6 +2152,7 @@
"ACTIVATE": "Aktivovat projekt",
"DELETE": "Smazat projekt",
"ORGNAME": "Název organizace",
"ORGID": "ID organizace",
"ORGDOMAIN": "Doména organizace",
"STATE": "Stav",
"TYPE": "Typ",

View File

@@ -693,6 +693,7 @@
"EMAIL": "Email",
"USERNAME": "Nutzername",
"ORGNAME": "Organisationsname",
"ORGID": "Organisations ID",
"PRIMARYDOMAIN": "Primäre Domäne",
"PROJECTNAME": "Projektname",
"RESOURCEOWNER": "Ressourcenbesitzer",
@@ -2150,6 +2151,7 @@
"ACTIVATE": "Projekt aktivieren",
"DELETE": "Projekt löschen",
"ORGNAME": "Name der Organisation",
"ORGID": "Organisations ID",
"ORGDOMAIN": "Domain der Organisation",
"STATE": "Status",
"TYPE": "Typ",

View File

@@ -688,12 +688,13 @@
},
"FILTER": {
"TITLE": "Filter",
"STATE": "Status",
"ORGNAME": "Organization Name",
"ORGID": "Organization ID",
"STATE": "State",
"PRIMARYDOMAIN": "Primary Domain",
"DISPLAYNAME": "User Display Name",
"EMAIL": "Email",
"USERNAME": "User Name",
"ORGNAME": "Organization Name",
"PRIMARYDOMAIN": "Primary Domain",
"PROJECTNAME": "Project Name",
"RESOURCEOWNER": "Resource Owner",
"METHODS": {
@@ -2153,6 +2154,7 @@
"ACTIVATE": "Activate Project",
"DELETE": "Delete Project",
"ORGNAME": "Organization Name",
"ORGID": "Organization ID",
"ORGDOMAIN": "Organization Domain",
"STATE": "Status",
"TYPE": "Type",

View File

@@ -693,6 +693,7 @@
"EMAIL": "Email",
"USERNAME": "Nombre de usuario",
"ORGNAME": "Nombre de organización",
"ORGID": "ID de organización",
"PRIMARYDOMAIN": "Dominio primario",
"PROJECTNAME": "Nombre de proyecto",
"RESOURCEOWNER": "Propietario del recurso",
@@ -2151,6 +2152,7 @@
"ACTIVATE": "Activar proyecto",
"DELETE": "Borrar proyecto",
"ORGNAME": "Nombre de organización",
"ORGID": "ID de organización",
"ORGDOMAIN": "Dominio de organización",
"STATE": "Estado",
"TYPE": "Tipo",

View File

@@ -693,6 +693,7 @@
"EMAIL": "Courriel",
"USERNAME": "Nom de l'utilisateur",
"ORGNAME": "Nom de l'organisation",
"ORGID": "ID de l'organisation",
"PRIMARYDOMAIN": "Domaine principal",
"PROJECTNAME": "Nom du projet",
"RESOURCEOWNER": "Propriétaire des ressources",
@@ -2150,6 +2151,7 @@
"ACTIVATE": "Activer le projet",
"DELETE": "Supprimer le projet",
"ORGNAME": "Nom de l'organisation",
"ORGID": "ID de l'organisation",
"ORGDOMAIN": "Domaine de l'organisation",
"STATE": "Statut",
"TYPE": "Type",

View File

@@ -693,6 +693,7 @@
"EMAIL": "E-mail",
"USERNAME": "Felhasználói Név",
"ORGNAME": "Szervezet Neve",
"ORGID": "Szervezet ID",
"PRIMARYDOMAIN": "Elsődleges Domain",
"PROJECTNAME": "Projekt Neve",
"RESOURCEOWNER": "Erőforrás Tulajdonos",
@@ -2148,6 +2149,7 @@
"ACTIVATE": "Projekt aktiválása",
"DELETE": "Projekt törlése",
"ORGNAME": "Szervezet neve",
"ORGID": "Szervezet ID",
"ORGDOMAIN": "Szervezet domainje",
"STATE": "Státusz",
"TYPE": "Típus",

View File

@@ -652,6 +652,7 @@
"EMAIL": "E-mail",
"USERNAME": "Nama belakang",
"ORGNAME": "Nama Organisasi",
"ORGID": "ID Organisasi",
"PRIMARYDOMAIN": "Domain Utama",
"PROJECTNAME": "Nama Proyek",
"RESOURCEOWNER": "Pemilik Sumber Daya",
@@ -1980,6 +1981,7 @@
"ACTIVATE": "Aktifkan Proyek",
"DELETE": "Hapus Proyek",
"ORGNAME": "Nama Organisasi",
"ORGID": "ID Organisasi",
"ORGDOMAIN": "Domain Organisasi",
"STATE": "Status",
"TYPE": "Jenis",

View File

@@ -692,6 +692,7 @@
"EMAIL": "Email",
"USERNAME": "User Name",
"ORGNAME": "Nome organizzazione",
"ORGID": "ID organizzazione",
"PRIMARYDOMAIN": "Dominio primario",
"PROJECTNAME": "Nome del progetto",
"RESOURCEOWNER": "Resource Owner",
@@ -2150,6 +2151,7 @@
"ACTIVATE": "Attiva progetto",
"DELETE": "Rimuovi progetto",
"ORGNAME": "Nome dell'organizzazione",
"ORGID": "ID organizzazione",
"ORGDOMAIN": "Dominio",
"STATE": "Stato",
"TYPE": "Tipo",

View File

@@ -693,6 +693,7 @@
"EMAIL": "Eメール",
"USERNAME": "ユーザー名",
"ORGNAME": "組織名",
"ORGID": "組織ID",
"PRIMARYDOMAIN": "プライマリドメイン",
"PROJECTNAME": "プロジェクト名",
"RESOURCEOWNER": "リソース所有者",
@@ -2150,6 +2151,7 @@
"ACTIVATE": "プロジェクトのアクティブ化",
"DELETE": "プロジェクトの削除",
"ORGNAME": "組織名",
"ORGID": "組織ID",
"ORGDOMAIN": "組織ドメイン",
"STATE": "ステータス",
"TYPE": "タイプ",

View File

@@ -693,6 +693,7 @@
"EMAIL": "이메일",
"USERNAME": "사용자 이름",
"ORGNAME": "조직 이름",
"ORGID": "조직 ID",
"PRIMARYDOMAIN": "기본 도메인",
"PROJECTNAME": "프로젝트 이름",
"RESOURCEOWNER": "리소스 소유자",
@@ -2150,6 +2151,7 @@
"ACTIVATE": "프로젝트 활성화",
"DELETE": "프로젝트 삭제",
"ORGNAME": "조직 이름",
"ORGID": "조직 ID",
"ORGDOMAIN": "조직 도메인",
"STATE": "상태",
"TYPE": "유형",

View File

@@ -693,6 +693,7 @@
"EMAIL": "Е-пошта",
"USERNAME": "Корисничко име",
"ORGNAME": "Име на организацијата",
"ORGID": "Идентификатор на организацијата",
"PRIMARYDOMAIN": "Примарен домен",
"PROJECTNAME": "Име на проектот",
"RESOURCEOWNER": "Сопственик на ресурсот",
@@ -2153,6 +2154,7 @@
"ACTIVATE": "Активирај проект",
"DELETE": "Избриши проект",
"ORGNAME": "Име на организација",
"ORGID": "Идентификатор на организација",
"ORGDOMAIN": "Домен на организација",
"STATE": "Статус",
"TYPE": "Тип",

View File

@@ -693,6 +693,7 @@
"EMAIL": "E-mail",
"USERNAME": "Gebruikersnaam",
"ORGNAME": "Organisatienaam",
"ORGID": "Organisatie ID",
"PRIMARYDOMAIN": "Primair domein",
"PROJECTNAME": "Projectnaam",
"RESOURCEOWNER": "Eigenaar van de bron",
@@ -2150,6 +2151,7 @@
"ACTIVATE": "Activeer Project",
"DELETE": "Verwijder Project",
"ORGNAME": "Organisatienaam",
"ORGID": "Organisatie ID",
"ORGDOMAIN": "Organisatie Domein",
"STATE": "Status",
"TYPE": "Type",

View File

@@ -692,6 +692,7 @@
"EMAIL": "Email",
"USERNAME": "Nazwa Użytkownika",
"ORGNAME": "Nazwa Organizacji",
"ORGID": "ID Organizacji",
"PRIMARYDOMAIN": "Domena podstawowa",
"PROJECTNAME": "Nazwa Projektu",
"RESOURCEOWNER": "Właściciel Zasobu",
@@ -2149,6 +2150,7 @@
"ACTIVATE": "Aktywuj projekt",
"DELETE": "Usuń projekt",
"ORGNAME": "Nazwa organizacji",
"ORGID": "ID organizacji",
"ORGDOMAIN": "Domena organizacji",
"STATE": "Status",
"TYPE": "Typ",

View File

@@ -693,6 +693,7 @@
"EMAIL": "E-mail",
"USERNAME": "Nome de Usuário",
"ORGNAME": "Nome da Organização",
"ORGID": "ID da Organização",
"PRIMARYDOMAIN": "Domínio primário",
"PROJECTNAME": "Nome do Projeto",
"RESOURCEOWNER": "Proprietário do Recurso",
@@ -2152,6 +2153,7 @@
"ACTIVATE": "Ativar Projeto",
"DELETE": "Excluir Projeto",
"ORGNAME": "Nome da Organização",
"ORGID": "ID da Organização",
"ORGDOMAIN": "Domínio da Organização",
"STATE": "Status",
"TYPE": "Tipo",

View File

@@ -691,6 +691,7 @@
"EMAIL": "E-mail",
"USERNAME": "Numele utilizatorului",
"ORGNAME": "Numele organizației",
"ORGID": "ID-ul organizației",
"PRIMARYDOMAIN": "Domeniu principal",
"PROJECTNAME": "Numele proiectului",
"RESOURCEOWNER": "Proprietarul resursei",
@@ -2148,6 +2149,7 @@
"ACTIVATE": "Activați proiectul",
"DELETE": "Ștergeți proiectul",
"ORGNAME": "Nume organizație",
"ORGID": "ID organizație",
"ORGDOMAIN": "Domeniu organizație",
"STATE": "Stare",
"TYPE": "Tip",

View File

@@ -693,6 +693,7 @@
"EMAIL": "Электронная почта",
"USERNAME": "Имя пользователя",
"ORGNAME": "Название организации",
"ORGID": "ID организации",
"PRIMARYDOMAIN": "Основной домен",
"PROJECTNAME": "Название проекта",
"RESOURCEOWNER": "Владелец ресурса",
@@ -2237,6 +2238,7 @@
"ACTIVATE": "Активировать проект",
"DELETE": "Удалить проект",
"ORGNAME": "Название организации",
"ORGID": "ID организации",
"ORGDOMAIN": "Домен организации",
"STATE": "Статус",
"TYPE": "Тип",

View File

@@ -693,6 +693,7 @@
"EMAIL": "E-post",
"USERNAME": "Användarnamn",
"ORGNAME": "Organisationsnamn",
"ORGID": "Organisations ID",
"PRIMARYDOMAIN": "Primär domän",
"PROJECTNAME": "Projektnamn",
"RESOURCEOWNER": "Resursägare",
@@ -2154,6 +2155,7 @@
"ACTIVATE": "Aktivera projekt",
"DELETE": "Ta bort projekt",
"ORGNAME": "Organisationsnamn",
"ORGID": "Organisations ID",
"ORGDOMAIN": "Organisationsdomän",
"STATE": "Status",
"TYPE": "Typ",

View File

@@ -693,6 +693,7 @@
"EMAIL": "邮箱",
"USERNAME": "用户名",
"ORGNAME": "组织名称",
"ORGID": "组织ID",
"PRIMARYDOMAIN": "主域",
"PROJECTNAME": "项目名称",
"RESOURCEOWNER": "资源所有者",
@@ -2149,6 +2150,7 @@
"ACTIVATE": "启用项目",
"DELETE": "删除项目",
"ORGNAME": "组织名称",
"ORGID": "组织ID",
"ORGDOMAIN": "组织域名",
"STATE": "状态",
"TYPE": "类型",