@dflat-core/web 1.7.2066 → 1.7.2067

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,9 +8,9 @@ import * as i0 from "@angular/core";
8
8
  import { ChangeDetectionStrategy, Component, Directive, EventEmitter, Inject, Injectable, InjectionToken, Input, LOCALE_ID, NgModule, Optional, Output, ViewChild, ViewEncapsulation, effect, inject, runInInjectionContext, viewChild } from "@angular/core";
9
9
  import { Observable, Subject, combineLatest, forkJoin, map, of, takeUntil } from "rxjs";
10
10
  import { catchError, filter, map as map$1, switchMap, take, takeUntil as takeUntil$1 } from "rxjs/operators";
11
- import { ActivationResults, CustomFieldGroupTypes, FieldColumnSpans, FieldConditionalResults, FieldFilterTypes, FileTypes, ImageUploadEventType, MetaEntityTypes, PresentationProfilePurposes, PresentationProfileScopes, SystemModelModule } from "@dflat-core/web/system-model";
11
+ import { ActivationResults, ColumnDisplayTypes, CustomFieldGroupTypes, FieldColumnSpans, FieldConditionalResults, FieldFilterTypes, FileTypes, ImageUploadEventType, MetaEntityTypes, PresentationProfilePurposes, PresentationProfileScopes, SystemModelModule } from "@dflat-core/web/system-model";
12
12
  import * as i2$2 from "@angular/common";
13
- import { CommonModule, DatePipe, registerLocaleData } from "@angular/common";
13
+ import { CommonModule, DatePipe, formatCurrency, formatDate, formatNumber, formatPercent, getCurrencySymbol, registerLocaleData } from "@angular/common";
14
14
  import * as i2$3 from "@angular/forms";
15
15
  import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from "@angular/forms";
16
16
  import * as i3$1 from "@angular/cdk/drag-drop";
@@ -88,10 +88,7 @@ var PresentationProfileTransformer = class PresentationProfileTransformer {
88
88
  ...template,
89
89
  Name: isImage ? "" : displayLabel,
90
90
  FieldName: displayLabel,
91
- Display: isImage ? template.Display : {
92
- ...template.Display ?? {},
93
- type: "text"
94
- }
91
+ Display: template.Display ?? { type: "text" }
95
92
  };
96
93
  }
97
94
  return {
@@ -132,9 +129,27 @@ var PresentationProfileTransformer = class PresentationProfileTransformer {
132
129
  IsLocked: item.IsLocked ?? false,
133
130
  IsAllowed: item.IsAllowed ?? null,
134
131
  ColumnSourceType: item.ColumnSourceType ?? 1,
135
- CustomFieldId: item.CustomFieldId ?? null
132
+ CustomFieldId: item.CustomFieldId ?? null,
133
+ ...PresentationProfileTransformer.displayOf(item)
136
134
  }));
137
135
  }
136
+ static displayOf(item) {
137
+ return {
138
+ ColumnDisplayType: item.ColumnDisplayType ?? null,
139
+ Currency: item.Currency ?? null,
140
+ CurrencyPropertyName: item.CurrencyPropertyName ?? null,
141
+ Multiplier: item.Multiplier ?? null,
142
+ MinIntegerDigits: item.MinIntegerDigits ?? null,
143
+ MinFractionDigits: item.MinFractionDigits ?? null,
144
+ MaxFractionDigits: item.MaxFractionDigits ?? null,
145
+ DisplayFormat: item.DisplayFormat ?? null,
146
+ NullCaseText: item.NullCaseText ?? null,
147
+ HandleError: item.HandleError ?? null,
148
+ DisplayWidth: item.DisplayWidth ?? null,
149
+ BaseUrl: item.BaseUrl ?? null,
150
+ CompletingCharacter: item.CompletingCharacter ?? null
151
+ };
152
+ }
138
153
  static splitForExport(items) {
139
154
  const cols = [];
140
155
  const ids = [];
@@ -20239,6 +20254,426 @@ i0.ɵɵngDeclareClassMetadata({
20239
20254
  ],
20240
20255
  propDecorators: { newCompanySelected: [{ type: Output }] }
20241
20256
  });
20257
+ const COMMON = ["nullCaseText", "handleError"];
20258
+ const COLUMN_DISPLAY_TYPES = [
20259
+ {
20260
+ type: ColumnDisplayTypes.Text,
20261
+ label: "Texte",
20262
+ short: "Texte",
20263
+ icon: "font",
20264
+ options: ["nullCaseText"]
20265
+ },
20266
+ {
20267
+ type: ColumnDisplayTypes.Number,
20268
+ label: "Nombre",
20269
+ short: "Nombre",
20270
+ icon: "hashtag",
20271
+ options: [
20272
+ "digits",
20273
+ "multiplier",
20274
+ ...COMMON
20275
+ ]
20276
+ },
20277
+ {
20278
+ type: ColumnDisplayTypes.Money,
20279
+ label: "Montant",
20280
+ short: "Montant",
20281
+ icon: "eur",
20282
+ options: ["currency", ...COMMON]
20283
+ },
20284
+ {
20285
+ type: ColumnDisplayTypes.Percent,
20286
+ label: "Pourcentage",
20287
+ short: "%",
20288
+ icon: "percent",
20289
+ options: [
20290
+ "digits",
20291
+ "multiplier",
20292
+ ...COMMON
20293
+ ]
20294
+ },
20295
+ {
20296
+ type: ColumnDisplayTypes.Date,
20297
+ label: "Date",
20298
+ short: "Date",
20299
+ icon: "calendar",
20300
+ options: ["format", "nullCaseText"]
20301
+ },
20302
+ {
20303
+ type: ColumnDisplayTypes.DateTime,
20304
+ label: "Date et heure",
20305
+ short: "Date/h",
20306
+ icon: "clock-o",
20307
+ options: ["format", "nullCaseText"]
20308
+ },
20309
+ {
20310
+ type: ColumnDisplayTypes.Boolean,
20311
+ label: "Oui / Non",
20312
+ short: "Oui/Non",
20313
+ icon: "check-square-o",
20314
+ options: ["nullCaseText"]
20315
+ },
20316
+ {
20317
+ type: ColumnDisplayTypes.EnumImage,
20318
+ label: "Icône du type énuméré",
20319
+ short: "Icône",
20320
+ icon: "picture-o",
20321
+ options: [
20322
+ "enum",
20323
+ "width",
20324
+ "nullCaseText"
20325
+ ]
20326
+ },
20327
+ {
20328
+ type: ColumnDisplayTypes.WideEnumImage,
20329
+ label: "Grande icône du type énuméré",
20330
+ short: "Icône L",
20331
+ icon: "picture-o",
20332
+ options: [
20333
+ "enum",
20334
+ "width",
20335
+ "nullCaseText"
20336
+ ]
20337
+ },
20338
+ {
20339
+ type: ColumnDisplayTypes.ImageFile,
20340
+ label: "Image (fichier)",
20341
+ short: "Image",
20342
+ icon: "file-image-o",
20343
+ options: ["nullCaseText"]
20344
+ },
20345
+ {
20346
+ type: ColumnDisplayTypes.Base64Image,
20347
+ label: "Image (base64)",
20348
+ short: "Image",
20349
+ icon: "file-image-o",
20350
+ options: ["nullCaseText"]
20351
+ },
20352
+ {
20353
+ type: ColumnDisplayTypes.Url,
20354
+ label: "Lien",
20355
+ short: "Lien",
20356
+ icon: "link",
20357
+ options: ["baseUrl", "nullCaseText"]
20358
+ },
20359
+ {
20360
+ type: ColumnDisplayTypes.FixedSizeInteger,
20361
+ label: "Entier de taille fixe",
20362
+ short: "0042",
20363
+ icon: "sort-numeric-asc",
20364
+ options: ["fixedSize", "nullCaseText"]
20365
+ }
20366
+ ];
20367
+ function getColumnDisplayType(type) {
20368
+ return type === null || type === void 0 ? void 0 : COLUMN_DISPLAY_TYPES.find((t) => t.type === type);
20369
+ }
20370
+ const COLUMN_DISPLAY_FIELDS = [
20371
+ "ColumnDisplayType",
20372
+ "Currency",
20373
+ "CurrencyPropertyName",
20374
+ "Multiplier",
20375
+ "MinIntegerDigits",
20376
+ "MinFractionDigits",
20377
+ "MaxFractionDigits",
20378
+ "DisplayFormat",
20379
+ "NullCaseText",
20380
+ "HandleError",
20381
+ "DisplayWidth",
20382
+ "BaseUrl",
20383
+ "CompletingCharacter"
20384
+ ];
20385
+ function describeColumnDisplay(item) {
20386
+ const info = getColumnDisplayType(item.ColumnDisplayType);
20387
+ if (!info) return "Affichage par défaut (selon le type de la colonne)";
20388
+ const parts = [info.label];
20389
+ if (info.options.includes("digits") && (item.MinFractionDigits != null || item.MaxFractionDigits != null)) parts.push(`${item.MinFractionDigits ?? 0} à ${item.MaxFractionDigits ?? item.MinFractionDigits ?? 3} décimales`);
20390
+ if (info.options.includes("multiplier") && item.Multiplier != null && item.Multiplier !== 1) parts.push(`× ${item.Multiplier}`);
20391
+ if (info.options.includes("currency")) parts.push(item.Currency ? `devise ${item.Currency}` : item.CurrencyPropertyName ? `devise de ${item.CurrencyPropertyName}` : "devise EUR");
20392
+ if (info.options.includes("format") && item.DisplayFormat) parts.push(item.DisplayFormat);
20393
+ if (item.NullCaseText) parts.push(`vide : « ${item.NullCaseText} »`);
20394
+ if (item.HandleError) parts.push("vide en évidence");
20395
+ return parts.join(" — ");
20396
+ }
20397
+ var ColumnDisplayDialogComponent = class ColumnDisplayDialogComponent {
20398
+ constructor(locale) {
20399
+ this.locale = locale;
20400
+ this.naturalLabel = "";
20401
+ this.defaultDisplayType = null;
20402
+ this.enumEntityName = null;
20403
+ this.columns = [];
20404
+ this.isPerimeter = false;
20405
+ this.readonly = false;
20406
+ this.confirmed = new EventEmitter();
20407
+ this.cancelled = new EventEmitter();
20408
+ this.types = COLUMN_DISPLAY_TYPES;
20409
+ this.currencyMode = "fixed";
20410
+ this.model = {};
20411
+ this.dateFormats = [
20412
+ "dd/MM/yyyy",
20413
+ "dd/MM/yy",
20414
+ "EEEE d MMMM yyyy",
20415
+ "MMMM yyyy"
20416
+ ];
20417
+ this.dateTimeFormats = [
20418
+ "dd/MM/yyyy HH:mm:ss",
20419
+ "dd/MM/yyyy HH:mm",
20420
+ "HH:mm"
20421
+ ];
20422
+ }
20423
+ ngOnInit() {
20424
+ this.model = { ...this.item };
20425
+ if (this.model.ColumnDisplayType === null || this.model.ColumnDisplayType === void 0) this.model.ColumnDisplayType = this.defaultDisplayType ?? ColumnDisplayTypes.Text;
20426
+ this.currencyMode = this.model.CurrencyPropertyName && !this.model.Currency ? "column" : "fixed";
20427
+ }
20428
+ get selectedType() {
20429
+ return getColumnDisplayType(this.model.ColumnDisplayType);
20430
+ }
20431
+ has(option) {
20432
+ return !!this.selectedType?.options.includes(option);
20433
+ }
20434
+ isDefault(type) {
20435
+ return type.type === this.defaultDisplayType;
20436
+ }
20437
+ selectType(type) {
20438
+ if (this.readonly) return;
20439
+ this.model.ColumnDisplayType = type.type;
20440
+ }
20441
+ get isPercent() {
20442
+ return this.model.ColumnDisplayType === ColumnDisplayTypes.Percent;
20443
+ }
20444
+ get isDateTime() {
20445
+ return this.model.ColumnDisplayType === ColumnDisplayTypes.DateTime;
20446
+ }
20447
+ get defaultDateFormat() {
20448
+ return this.isDateTime ? "dd/MM/yyyy HH:mm:ss" : "dd/MM/yyyy";
20449
+ }
20450
+ get preview() {
20451
+ try {
20452
+ const m = this.model;
20453
+ const multiplier = m.Multiplier ?? 1;
20454
+ const digits = this.digitsFormat;
20455
+ switch (m.ColumnDisplayType) {
20456
+ case ColumnDisplayTypes.Number: return formatNumber(1234.5678 * multiplier, this.locale, digits ?? "1.0-3");
20457
+ case ColumnDisplayTypes.Percent: return formatPercent((multiplier !== 1 ? 12.345 : .12345) * multiplier, this.locale, digits ?? "1.0-3");
20458
+ case ColumnDisplayTypes.Money: {
20459
+ const code = this.currencyMode === "fixed" ? m.Currency || "EUR" : "EUR";
20460
+ return formatCurrency(1234.5, this.locale, getCurrencySymbol(code, "wide", this.locale), code) + (this.currencyMode === "column" && m.CurrencyPropertyName ? ` (devise de ${m.CurrencyPropertyName})` : "");
20461
+ }
20462
+ case ColumnDisplayTypes.Date:
20463
+ case ColumnDisplayTypes.DateTime: return formatDate(/* @__PURE__ */ new Date(), m.DisplayFormat || this.defaultDateFormat, this.locale);
20464
+ case ColumnDisplayTypes.Boolean: return "OUI / NON";
20465
+ case ColumnDisplayTypes.FixedSizeInteger: return "42".padStart(Math.max(m.DisplayWidth ?? 0, 2), m.CompletingCharacter || "0");
20466
+ case ColumnDisplayTypes.Url: return `${m.BaseUrl || "/"}/42`.replace("//", "/");
20467
+ case ColumnDisplayTypes.EnumImage:
20468
+ case ColumnDisplayTypes.WideEnumImage: return this.enumEntityName ? `Icône de la valeur (${this.enumEntityName})` : "Icône de la valeur";
20469
+ case ColumnDisplayTypes.ImageFile:
20470
+ case ColumnDisplayTypes.Base64Image: return "Image";
20471
+ default: return "Texte de la colonne";
20472
+ }
20473
+ } catch {
20474
+ return "Format invalide";
20475
+ }
20476
+ }
20477
+ get digitsFormat() {
20478
+ const m = this.model;
20479
+ if (m.MinIntegerDigits == null && m.MinFractionDigits == null && m.MaxFractionDigits == null) return null;
20480
+ const min = m.MinFractionDigits ?? 0;
20481
+ const max = Math.max(min, m.MaxFractionDigits ?? Math.max(min, 3));
20482
+ return `${m.MinIntegerDigits ?? 1}.${min}-${max}`;
20483
+ }
20484
+ apply() {
20485
+ if (this.readonly) {
20486
+ this.cancel();
20487
+ return;
20488
+ }
20489
+ const result = {
20490
+ ...this.item,
20491
+ Label: this.model.Label || null,
20492
+ IsLocked: this.model.IsLocked,
20493
+ IsAllowed: this.model.IsAllowed
20494
+ };
20495
+ COLUMN_DISPLAY_FIELDS.forEach((field) => result[field] = null);
20496
+ result.ColumnDisplayType = this.model.ColumnDisplayType;
20497
+ const keep = (field) => result[field] = this.emptyToNull(this.model[field]);
20498
+ if (this.has("digits")) {
20499
+ keep("MinIntegerDigits");
20500
+ keep("MinFractionDigits");
20501
+ keep("MaxFractionDigits");
20502
+ }
20503
+ if (this.has("multiplier")) keep("Multiplier");
20504
+ if (this.has("currency")) {
20505
+ if (this.currencyMode === "fixed") result.Currency = this.emptyToNull(this.model.Currency?.trim().toUpperCase());
20506
+ else keep("CurrencyPropertyName");
20507
+ }
20508
+ if (this.has("format")) keep("DisplayFormat");
20509
+ if (this.has("nullCaseText")) keep("NullCaseText");
20510
+ if (this.has("handleError")) result.HandleError = this.model.HandleError ? true : null;
20511
+ if (this.has("width") || this.has("fixedSize")) keep("DisplayWidth");
20512
+ if (this.has("fixedSize")) keep("CompletingCharacter");
20513
+ if (this.has("baseUrl")) keep("BaseUrl");
20514
+ this.confirmed.emit(result);
20515
+ }
20516
+ cancel() {
20517
+ this.cancelled.emit();
20518
+ }
20519
+ emptyToNull(value) {
20520
+ return value === void 0 || value === null || value === "" ? null : value;
20521
+ }
20522
+ static {
20523
+ this.ɵfac = i0.ɵɵngDeclareFactory({
20524
+ minVersion: "12.0.0",
20525
+ version: "22.2.1",
20526
+ ngImport: i0,
20527
+ type: ColumnDisplayDialogComponent,
20528
+ deps: [{ token: LOCALE_ID }],
20529
+ target: i0.ɵɵFactoryTarget.Component
20530
+ });
20531
+ }
20532
+ static {
20533
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
20534
+ minVersion: "17.0.0",
20535
+ version: "22.2.1",
20536
+ type: ColumnDisplayDialogComponent,
20537
+ isStandalone: true,
20538
+ selector: "alg-column-display-dialog",
20539
+ inputs: {
20540
+ item: "item",
20541
+ naturalLabel: "naturalLabel",
20542
+ defaultDisplayType: "defaultDisplayType",
20543
+ enumEntityName: "enumEntityName",
20544
+ columns: "columns",
20545
+ isPerimeter: "isPerimeter",
20546
+ readonly: "readonly"
20547
+ },
20548
+ outputs: {
20549
+ confirmed: "confirmed",
20550
+ cancelled: "cancelled"
20551
+ },
20552
+ ngImport: i0,
20553
+ template: "<div class=\"cdd-header\">\r\n <h4 class=\"cdd-title\">\r\n Colonne <span class=\"cdd-title__key\">{{ item.ColumnKey }}</span>\r\n </h4>\r\n <button class=\"cdd-icon-btn\" type=\"button\" (click)=\"cancel()\" aria-label=\"Fermer\">&#x2715;</button>\r\n</div>\r\n\r\n<div class=\"cdd-body\">\r\n <!-- Libellé -->\r\n <div class=\"cdd-field\">\r\n <label class=\"cdd-label\" for=\"cdd-label\">Libellé</label>\r\n <input id=\"cdd-label\" class=\"cdd-input\" type=\"text\" [(ngModel)]=\"model.Label\" [placeholder]=\"naturalLabel || item.ColumnKey\" [disabled]=\"readonly\">\r\n <span class=\"cdd-hint\">Vide : libellé de la colonne ({{ naturalLabel || item.ColumnKey }}).</span>\r\n </div>\r\n\r\n <!-- Type d'affichage -->\r\n <div class=\"cdd-field\">\r\n <span class=\"cdd-label\">Affichage</span>\r\n <div class=\"cdd-types\" role=\"radiogroup\" aria-label=\"Type d'affichage\">\r\n @for (type of types; track type.type) {\r\n <button type=\"button\" class=\"cdd-type\" role=\"radio\"\r\n [class.cdd-type--active]=\"model.ColumnDisplayType === type.type\"\r\n [attr.aria-checked]=\"model.ColumnDisplayType === type.type\"\r\n [disabled]=\"readonly\"\r\n (click)=\"selectType(type)\">\r\n <i class=\"fa fa-{{ type.icon }}\"></i>\r\n <span class=\"cdd-type__label\">{{ type.label }}</span>\r\n @if (isDefault(type)) {\r\n <span class=\"cdd-type__default\" title=\"Affichage par défaut selon le type de la colonne\">défaut</span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Options du type -->\r\n <div class=\"cdd-options\">\r\n @if (has('digits')) {\r\n <div class=\"cdd-row\">\r\n <div class=\"cdd-field cdd-field--small\">\r\n <label class=\"cdd-label\" for=\"cdd-minint\">Chiffres entiers min.</label>\r\n <input id=\"cdd-minint\" class=\"cdd-input\" type=\"number\" min=\"0\" [(ngModel)]=\"model.MinIntegerDigits\" placeholder=\"1\" [disabled]=\"readonly\">\r\n </div>\r\n <div class=\"cdd-field cdd-field--small\">\r\n <label class=\"cdd-label\" for=\"cdd-minfrac\">Décimales min.</label>\r\n <input id=\"cdd-minfrac\" class=\"cdd-input\" type=\"number\" min=\"0\" [(ngModel)]=\"model.MinFractionDigits\" placeholder=\"0\" [disabled]=\"readonly\">\r\n </div>\r\n <div class=\"cdd-field cdd-field--small\">\r\n <label class=\"cdd-label\" for=\"cdd-maxfrac\">Décimales max.</label>\r\n <input id=\"cdd-maxfrac\" class=\"cdd-input\" type=\"number\" min=\"0\" [(ngModel)]=\"model.MaxFractionDigits\" placeholder=\"3\" [disabled]=\"readonly\">\r\n </div>\r\n @if (has('multiplier')) {\r\n <div class=\"cdd-field cdd-field--small\">\r\n <label class=\"cdd-label\" for=\"cdd-mult\">Multiplicateur</label>\r\n <input id=\"cdd-mult\" class=\"cdd-input\" type=\"number\" step=\"any\" [(ngModel)]=\"model.Multiplier\" placeholder=\"1\" [disabled]=\"readonly\">\r\n </div>\r\n }\r\n </div>\r\n @if (isPercent) {\r\n <span class=\"cdd-hint\">Valeur enregistrée en pourcentage (12,5 pour 12,5 %) : multiplicateur 0,01.</span>\r\n }\r\n }\r\n\r\n @if (has('currency')) {\r\n <div class=\"cdd-field\">\r\n <span class=\"cdd-label\">Devise</span>\r\n <div class=\"cdd-choice\">\r\n <label><input type=\"radio\" name=\"cdd-currency\" value=\"fixed\" [(ngModel)]=\"currencyMode\" [disabled]=\"readonly\"> Devise fixe</label>\r\n <input class=\"cdd-input cdd-input--currency\" type=\"text\" maxlength=\"3\" [(ngModel)]=\"model.Currency\" placeholder=\"EUR\"\r\n [disabled]=\"readonly || currencyMode !== 'fixed'\" aria-label=\"Code de la devise\">\r\n </div>\r\n <div class=\"cdd-choice\">\r\n <label><input type=\"radio\" name=\"cdd-currency\" value=\"column\" [(ngModel)]=\"currencyMode\" [disabled]=\"readonly\"> Devise de la ligne, colonne</label>\r\n <select class=\"cdd-input\" [(ngModel)]=\"model.CurrencyPropertyName\" [disabled]=\"readonly || currencyMode !== 'column'\" aria-label=\"Colonne de la devise\">\r\n <option [ngValue]=\"null\">—</option>\r\n @for (column of columns; track column.key) {\r\n <option [ngValue]=\"column.key\">{{ column.label }} ({{ column.key }})</option>\r\n }\r\n </select>\r\n </div>\r\n <span class=\"cdd-hint\">Sans devise : EUR.</span>\r\n </div>\r\n }\r\n\r\n @if (has('format')) {\r\n <div class=\"cdd-field\">\r\n <label class=\"cdd-label\" for=\"cdd-format\">Format</label>\r\n <input id=\"cdd-format\" class=\"cdd-input\" type=\"text\" [(ngModel)]=\"model.DisplayFormat\" [placeholder]=\"defaultDateFormat\" [disabled]=\"readonly\">\r\n <div class=\"cdd-chips\">\r\n @for (format of (isDateTime ? dateTimeFormats : dateFormats); track format) {\r\n <button type=\"button\" class=\"cdd-chip\" [disabled]=\"readonly\" (click)=\"model.DisplayFormat = format\">{{ format }}</button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (has('enum')) {\r\n <div class=\"cdd-field\">\r\n <span class=\"cdd-label\">Type énuméré</span>\r\n @if (enumEntityName) {\r\n <span class=\"cdd-value\">{{ enumEntityName }}</span>\r\n <span class=\"cdd-hint\">Icônes simg/&lt;Module&gt;/&lt;Type&gt;/&lt;Valeur&gt;.svg ; infobulle : libellé de la valeur.</span>\r\n } @else {\r\n <span class=\"cdd-hint cdd-hint--warn\">Pas de clé étrangère vers une table Enum… : le type vient de l'attribut Enum de la propriété ; sans lui, la colonne s'affiche en texte.</span>\r\n }\r\n </div>\r\n }\r\n\r\n @if (has('width')) {\r\n <div class=\"cdd-field cdd-field--small\">\r\n <label class=\"cdd-label\" for=\"cdd-width\">Largeur (px)</label>\r\n <input id=\"cdd-width\" class=\"cdd-input\" type=\"number\" min=\"0\" [(ngModel)]=\"model.DisplayWidth\" [disabled]=\"readonly\">\r\n </div>\r\n }\r\n\r\n @if (has('fixedSize')) {\r\n <div class=\"cdd-row\">\r\n <div class=\"cdd-field cdd-field--small\">\r\n <label class=\"cdd-label\" for=\"cdd-size\">Taille</label>\r\n <input id=\"cdd-size\" class=\"cdd-input\" type=\"number\" min=\"0\" [(ngModel)]=\"model.DisplayWidth\" placeholder=\"10\" [disabled]=\"readonly\">\r\n </div>\r\n <div class=\"cdd-field cdd-field--small\">\r\n <label class=\"cdd-label\" for=\"cdd-char\">Caractère de complément</label>\r\n <input id=\"cdd-char\" class=\"cdd-input\" type=\"text\" maxlength=\"1\" [(ngModel)]=\"model.CompletingCharacter\" placeholder=\"0\" [disabled]=\"readonly\">\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (has('baseUrl')) {\r\n <div class=\"cdd-field\">\r\n <label class=\"cdd-label\" for=\"cdd-url\">Adresse de base</label>\r\n <input id=\"cdd-url\" class=\"cdd-input\" type=\"text\" [(ngModel)]=\"model.BaseUrl\" placeholder=\"/\" [disabled]=\"readonly\">\r\n </div>\r\n }\r\n\r\n @if (has('nullCaseText') || has('handleError')) {\r\n <div class=\"cdd-row\">\r\n @if (has('nullCaseText')) {\r\n <div class=\"cdd-field\">\r\n <label class=\"cdd-label\" for=\"cdd-null\">Texte si vide</label>\r\n <input id=\"cdd-null\" class=\"cdd-input\" type=\"text\" maxlength=\"100\" [(ngModel)]=\"model.NullCaseText\" placeholder=\"(rien)\" [disabled]=\"readonly\">\r\n </div>\r\n }\r\n @if (has('handleError')) {\r\n <label class=\"cdd-check\">\r\n <input type=\"checkbox\" [(ngModel)]=\"model.HandleError\" [disabled]=\"readonly\"> Valeur vide en évidence (rouge)\r\n </label>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Aperçu -->\r\n <div class=\"cdd-preview\">\r\n <span class=\"cdd-label\">Aperçu</span>\r\n <span class=\"cdd-preview__value\">{{ preview }}</span>\r\n </div>\r\n\r\n <!-- Drapeaux -->\r\n <div class=\"cdd-row cdd-flags\">\r\n <label class=\"cdd-check\"><input type=\"checkbox\" [(ngModel)]=\"model.IsLocked\" [disabled]=\"readonly\"> Verrouillée (ne peut pas être retirée)</label>\r\n @if (isPerimeter) {\r\n <label class=\"cdd-check\"><input type=\"checkbox\" [(ngModel)]=\"model.IsAllowed\" [disabled]=\"readonly\"> Autorisée</label>\r\n }\r\n </div>\r\n</div>\r\n\r\n<div class=\"cdd-footer\">\r\n <button class=\"cdd-btn cdd-btn--secondary\" type=\"button\" (click)=\"cancel()\">Annuler</button>\r\n @if (!readonly) {\r\n <button class=\"cdd-btn cdd-btn--primary\" type=\"button\" (click)=\"apply()\">Appliquer</button>\r\n }\r\n</div>\r\n",
20554
+ styles: [".home-page{font-family:Open sans,sans-serif;background:#fff;-webkit-font-smoothing:antialiased;height:100%;width:100%;padding:16px}.main-container{margin:0 50px}.main-container-modal{width:calc(100% - 50px);margin:10px 25px 0}.moyen-titre{font-weight:700;font-size:24px;color:#4d5a81;margin:8px 0;border-bottom:solid 1px #DBE4FF}.grand-titre{font-weight:700;font-size:28px;color:#4d5a81;margin:0 0 8px}.petit-titre{font-weight:700;font-size:16px;color:#4d5a81;margin:0 0 8px}.petit-titre.underlined{border-bottom:solid 1px #4D5A81}.paragraph{padding:0 15px}.paragraph-highlight{padding:5px 15px 0 12px;border-left:5px solid #8EA7F8;border-bottom:1px solid #DBE4FF;border-top:1px solid #DBE4FF;border-right:1px solid #DBE4FF;background-color:#f7faff}.highlight{background-color:#f7faff;border:1px solid #DBE4FF;border-radius:5px;padding:15px;color:#3c5dc4;margin:0 0 16px}.highlight p{margin-bottom:0}.highlight:before{position:relative;display:block;float:left;width:24px;height:24px;content:\" \";background-size:24px 24px;-webkit-background-size:24px 24px;background-image:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"53.294\" height=\"50.629\" viewBox=\"0 0 53.294 50.629\">%0D%0A <path id=\"allerg\\e8ne\" d=\"M830.494,25.793l-5.814,6.783.727,8.963-8.721,1.938-4.6,7.752L803.847,47.6l-8.236,3.634-4.6-7.51-8.721-1.938.727-8.963L777.2,26.035l5.814-6.783-.727-8.963,8.721-1.938L795.61.6l8.236,3.634L812.083.6l4.6,7.752,8.721,1.938-.727,8.963Zm-24.467,2.422V13.681h-4.845V28.216Zm0,9.69V33.06h-4.845v4.845Z\" transform=\"translate(-777.2 -0.6)\"/>%0D%0A</svg>%0D%0A');background-repeat:no-repeat;margin:0 8px 24px 0;filter:invert(31%) sepia(51%) saturate(1323%) hue-rotate(199deg) brightness(99%) contrast(94%)}.notification{background-color:#dbe4ff;border:1px solid #C4D0F9;border-radius:5px;color:#4d5a81;margin:16px;padding:5px 15px;text-align:justify}.notification:before{position:relative;display:block;float:left;width:24px;height:24px;content:\" \";background-size:24px 24px;-webkit-background-size:24px 24px;background-image:url('data:image/svg+xml,<svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"fas\" data-icon=\"info-circle\" class=\"svg-inline--fa fa-info-circle fa-w-16\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\"></path></svg>');background-repeat:no-repeat;margin:0 8px 0 0;filter:invert(31%) sepia(8%) saturate(2329%) hue-rotate(188deg) brightness(103%) contrast(85%)}.notification-text{padding:0 15px 0 30px;font-size:16px}:host{display:flex;flex-direction:column;max-height:85vh}.cdd-header{display:flex;align-items:center;justify-content:space-between;padding:12px 20px;background:#5272d3;border-bottom:1px solid #3C5DC4}.cdd-title{margin:0;font-size:16px;font-weight:600;color:#fff}.cdd-title__key{font-family:monospace;font-weight:500}.cdd-icon-btn{width:28px;height:28px;border:none;border-radius:50%;background:transparent;color:#fffc;cursor:pointer}.cdd-icon-btn:hover{background:#ffffff26;color:#fff}.cdd-body{overflow:auto;padding:16px 20px}.cdd-field{display:flex;flex-direction:column;gap:4px;margin-bottom:12px;flex:1 1 200px;min-width:0}.cdd-field--small{flex:0 1 140px}.cdd-label{font-size:12px;font-weight:600;color:#535353}.cdd-input{padding:4px 8px;border:1px solid #ced4da;border-radius:3px;font-size:13px}.cdd-input--currency{width:70px;text-transform:uppercase}.cdd-hint{font-size:11px;color:#888}.cdd-hint--warn{color:#b26a00}.cdd-value{font-family:monospace;font-size:13px}.cdd-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:12px}.cdd-types{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:6px}.cdd-type{position:relative;display:flex;align-items:center;gap:8px;padding:6px 8px;border:1px solid #C4D0F9;border-radius:6px;background:#fff;font-size:12px;text-align:left;cursor:pointer}.cdd-type .fa{width:16px;text-align:center;color:#4465c9}.cdd-type:hover:not(:disabled){background:#f7faff}.cdd-type--active{border-color:#4465c9;background:#ebf0ff;font-weight:600}.cdd-type__label{flex:1}.cdd-type__default{font-size:10px;font-weight:400;color:#888}.cdd-options{padding-top:4px;border-top:1px solid #e9ecef;margin-top:4px}.cdd-choice{display:flex;align-items:center;gap:8px;margin-bottom:4px}.cdd-choice label{margin:0;font-weight:400;white-space:nowrap}.cdd-choice select{flex:1;min-width:0}.cdd-chips{display:flex;flex-wrap:wrap;gap:4px}.cdd-chip{padding:1px 8px;border:1px solid #C4D0F9;border-radius:10px;background:#fff;font-family:monospace;font-size:11px;cursor:pointer}.cdd-chip:hover:not(:disabled){background:#f7faff}.cdd-check{display:flex;align-items:center;gap:6px;margin:0 0 12px;font-weight:400;font-size:13px}.cdd-preview{display:flex;align-items:baseline;gap:12px;padding:8px 12px;margin-bottom:12px;border-radius:6px;background:#f5f5f5}.cdd-preview__value{font-size:14px;font-variant-numeric:tabular-nums}.cdd-flags{border-top:1px solid #e9ecef;padding-top:10px}.cdd-footer{display:flex;justify-content:flex-end;gap:8px;padding:10px 20px;border-top:1px solid #e9ecef}.cdd-btn{padding:5px 16px;border-radius:4px;font-size:13px;cursor:pointer}.cdd-btn--secondary{border:1px solid #ced4da;background:#fff}.cdd-btn--primary{border:1px solid #4465C9;background:#4465c9;color:#fff}\n"],
20555
+ dependencies: [
20556
+ {
20557
+ kind: "ngmodule",
20558
+ type: CommonModule
20559
+ },
20560
+ {
20561
+ kind: "ngmodule",
20562
+ type: FormsModule
20563
+ },
20564
+ {
20565
+ kind: "directive",
20566
+ type: i2$3.NgSelectOption,
20567
+ selector: "option",
20568
+ inputs: ["ngValue", "value"]
20569
+ },
20570
+ {
20571
+ kind: "directive",
20572
+ type: i2$3.ɵNgSelectMultipleOption,
20573
+ selector: "option",
20574
+ inputs: ["ngValue", "value"]
20575
+ },
20576
+ {
20577
+ kind: "directive",
20578
+ type: i2$3.DefaultValueAccessor,
20579
+ selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]"
20580
+ },
20581
+ {
20582
+ kind: "directive",
20583
+ type: i2$3.NumberValueAccessor,
20584
+ selector: "input[type=number]:not([ngNoCva])[formControlName],input[type=number]:not([ngNoCva])[formControl],input[type=number]:not([ngNoCva])[ngModel]"
20585
+ },
20586
+ {
20587
+ kind: "directive",
20588
+ type: i2$3.CheckboxControlValueAccessor,
20589
+ selector: "input[type=checkbox]:not([ngNoCva])[formControlName],input[type=checkbox]:not([ngNoCva])[formControl],input[type=checkbox]:not([ngNoCva])[ngModel]"
20590
+ },
20591
+ {
20592
+ kind: "directive",
20593
+ type: i2$3.SelectControlValueAccessor,
20594
+ selector: "select:not([multiple]):not([ngNoCva])[formControlName],select:not([multiple]):not([ngNoCva])[formControl],select:not([multiple]):not([ngNoCva])[ngModel]",
20595
+ inputs: ["compareWith"]
20596
+ },
20597
+ {
20598
+ kind: "directive",
20599
+ type: i2$3.RadioControlValueAccessor,
20600
+ selector: "input[type=radio]:not([ngNoCva])[formControlName],input[type=radio]:not([ngNoCva])[formControl],input[type=radio]:not([ngNoCva])[ngModel]",
20601
+ inputs: [
20602
+ "name",
20603
+ "formControlName",
20604
+ "value"
20605
+ ]
20606
+ },
20607
+ {
20608
+ kind: "directive",
20609
+ type: i2$3.NgControlStatus,
20610
+ selector: "[formControlName],[ngModel],[formControl]"
20611
+ },
20612
+ {
20613
+ kind: "directive",
20614
+ type: i2$3.MaxLengthValidator,
20615
+ selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]",
20616
+ inputs: ["maxlength"]
20617
+ },
20618
+ {
20619
+ kind: "directive",
20620
+ type: i2$3.MinValidator,
20621
+ selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",
20622
+ inputs: ["min"]
20623
+ },
20624
+ {
20625
+ kind: "directive",
20626
+ type: i2$3.NgModel,
20627
+ selector: "[ngModel]:not([formControlName]):not([formControl])",
20628
+ inputs: [
20629
+ "name",
20630
+ "disabled",
20631
+ "ngModel",
20632
+ "ngModelOptions"
20633
+ ],
20634
+ outputs: ["ngModelChange"],
20635
+ exportAs: ["ngModel"]
20636
+ }
20637
+ ],
20638
+ changeDetection: i0.ChangeDetectionStrategy.Eager
20639
+ });
20640
+ }
20641
+ };
20642
+ i0.ɵɵngDeclareClassMetadata({
20643
+ minVersion: "12.0.0",
20644
+ version: "22.2.1",
20645
+ ngImport: i0,
20646
+ type: ColumnDisplayDialogComponent,
20647
+ decorators: [{
20648
+ type: Component,
20649
+ args: [{
20650
+ selector: "alg-column-display-dialog",
20651
+ standalone: true,
20652
+ imports: [CommonModule, FormsModule],
20653
+ changeDetection: ChangeDetectionStrategy.Eager,
20654
+ template: "<div class=\"cdd-header\">\r\n <h4 class=\"cdd-title\">\r\n Colonne <span class=\"cdd-title__key\">{{ item.ColumnKey }}</span>\r\n </h4>\r\n <button class=\"cdd-icon-btn\" type=\"button\" (click)=\"cancel()\" aria-label=\"Fermer\">&#x2715;</button>\r\n</div>\r\n\r\n<div class=\"cdd-body\">\r\n <!-- Libellé -->\r\n <div class=\"cdd-field\">\r\n <label class=\"cdd-label\" for=\"cdd-label\">Libellé</label>\r\n <input id=\"cdd-label\" class=\"cdd-input\" type=\"text\" [(ngModel)]=\"model.Label\" [placeholder]=\"naturalLabel || item.ColumnKey\" [disabled]=\"readonly\">\r\n <span class=\"cdd-hint\">Vide : libellé de la colonne ({{ naturalLabel || item.ColumnKey }}).</span>\r\n </div>\r\n\r\n <!-- Type d'affichage -->\r\n <div class=\"cdd-field\">\r\n <span class=\"cdd-label\">Affichage</span>\r\n <div class=\"cdd-types\" role=\"radiogroup\" aria-label=\"Type d'affichage\">\r\n @for (type of types; track type.type) {\r\n <button type=\"button\" class=\"cdd-type\" role=\"radio\"\r\n [class.cdd-type--active]=\"model.ColumnDisplayType === type.type\"\r\n [attr.aria-checked]=\"model.ColumnDisplayType === type.type\"\r\n [disabled]=\"readonly\"\r\n (click)=\"selectType(type)\">\r\n <i class=\"fa fa-{{ type.icon }}\"></i>\r\n <span class=\"cdd-type__label\">{{ type.label }}</span>\r\n @if (isDefault(type)) {\r\n <span class=\"cdd-type__default\" title=\"Affichage par défaut selon le type de la colonne\">défaut</span>\r\n }\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Options du type -->\r\n <div class=\"cdd-options\">\r\n @if (has('digits')) {\r\n <div class=\"cdd-row\">\r\n <div class=\"cdd-field cdd-field--small\">\r\n <label class=\"cdd-label\" for=\"cdd-minint\">Chiffres entiers min.</label>\r\n <input id=\"cdd-minint\" class=\"cdd-input\" type=\"number\" min=\"0\" [(ngModel)]=\"model.MinIntegerDigits\" placeholder=\"1\" [disabled]=\"readonly\">\r\n </div>\r\n <div class=\"cdd-field cdd-field--small\">\r\n <label class=\"cdd-label\" for=\"cdd-minfrac\">Décimales min.</label>\r\n <input id=\"cdd-minfrac\" class=\"cdd-input\" type=\"number\" min=\"0\" [(ngModel)]=\"model.MinFractionDigits\" placeholder=\"0\" [disabled]=\"readonly\">\r\n </div>\r\n <div class=\"cdd-field cdd-field--small\">\r\n <label class=\"cdd-label\" for=\"cdd-maxfrac\">Décimales max.</label>\r\n <input id=\"cdd-maxfrac\" class=\"cdd-input\" type=\"number\" min=\"0\" [(ngModel)]=\"model.MaxFractionDigits\" placeholder=\"3\" [disabled]=\"readonly\">\r\n </div>\r\n @if (has('multiplier')) {\r\n <div class=\"cdd-field cdd-field--small\">\r\n <label class=\"cdd-label\" for=\"cdd-mult\">Multiplicateur</label>\r\n <input id=\"cdd-mult\" class=\"cdd-input\" type=\"number\" step=\"any\" [(ngModel)]=\"model.Multiplier\" placeholder=\"1\" [disabled]=\"readonly\">\r\n </div>\r\n }\r\n </div>\r\n @if (isPercent) {\r\n <span class=\"cdd-hint\">Valeur enregistrée en pourcentage (12,5 pour 12,5 %) : multiplicateur 0,01.</span>\r\n }\r\n }\r\n\r\n @if (has('currency')) {\r\n <div class=\"cdd-field\">\r\n <span class=\"cdd-label\">Devise</span>\r\n <div class=\"cdd-choice\">\r\n <label><input type=\"radio\" name=\"cdd-currency\" value=\"fixed\" [(ngModel)]=\"currencyMode\" [disabled]=\"readonly\"> Devise fixe</label>\r\n <input class=\"cdd-input cdd-input--currency\" type=\"text\" maxlength=\"3\" [(ngModel)]=\"model.Currency\" placeholder=\"EUR\"\r\n [disabled]=\"readonly || currencyMode !== 'fixed'\" aria-label=\"Code de la devise\">\r\n </div>\r\n <div class=\"cdd-choice\">\r\n <label><input type=\"radio\" name=\"cdd-currency\" value=\"column\" [(ngModel)]=\"currencyMode\" [disabled]=\"readonly\"> Devise de la ligne, colonne</label>\r\n <select class=\"cdd-input\" [(ngModel)]=\"model.CurrencyPropertyName\" [disabled]=\"readonly || currencyMode !== 'column'\" aria-label=\"Colonne de la devise\">\r\n <option [ngValue]=\"null\">—</option>\r\n @for (column of columns; track column.key) {\r\n <option [ngValue]=\"column.key\">{{ column.label }} ({{ column.key }})</option>\r\n }\r\n </select>\r\n </div>\r\n <span class=\"cdd-hint\">Sans devise : EUR.</span>\r\n </div>\r\n }\r\n\r\n @if (has('format')) {\r\n <div class=\"cdd-field\">\r\n <label class=\"cdd-label\" for=\"cdd-format\">Format</label>\r\n <input id=\"cdd-format\" class=\"cdd-input\" type=\"text\" [(ngModel)]=\"model.DisplayFormat\" [placeholder]=\"defaultDateFormat\" [disabled]=\"readonly\">\r\n <div class=\"cdd-chips\">\r\n @for (format of (isDateTime ? dateTimeFormats : dateFormats); track format) {\r\n <button type=\"button\" class=\"cdd-chip\" [disabled]=\"readonly\" (click)=\"model.DisplayFormat = format\">{{ format }}</button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (has('enum')) {\r\n <div class=\"cdd-field\">\r\n <span class=\"cdd-label\">Type énuméré</span>\r\n @if (enumEntityName) {\r\n <span class=\"cdd-value\">{{ enumEntityName }}</span>\r\n <span class=\"cdd-hint\">Icônes simg/&lt;Module&gt;/&lt;Type&gt;/&lt;Valeur&gt;.svg ; infobulle : libellé de la valeur.</span>\r\n } @else {\r\n <span class=\"cdd-hint cdd-hint--warn\">Pas de clé étrangère vers une table Enum… : le type vient de l'attribut Enum de la propriété ; sans lui, la colonne s'affiche en texte.</span>\r\n }\r\n </div>\r\n }\r\n\r\n @if (has('width')) {\r\n <div class=\"cdd-field cdd-field--small\">\r\n <label class=\"cdd-label\" for=\"cdd-width\">Largeur (px)</label>\r\n <input id=\"cdd-width\" class=\"cdd-input\" type=\"number\" min=\"0\" [(ngModel)]=\"model.DisplayWidth\" [disabled]=\"readonly\">\r\n </div>\r\n }\r\n\r\n @if (has('fixedSize')) {\r\n <div class=\"cdd-row\">\r\n <div class=\"cdd-field cdd-field--small\">\r\n <label class=\"cdd-label\" for=\"cdd-size\">Taille</label>\r\n <input id=\"cdd-size\" class=\"cdd-input\" type=\"number\" min=\"0\" [(ngModel)]=\"model.DisplayWidth\" placeholder=\"10\" [disabled]=\"readonly\">\r\n </div>\r\n <div class=\"cdd-field cdd-field--small\">\r\n <label class=\"cdd-label\" for=\"cdd-char\">Caractère de complément</label>\r\n <input id=\"cdd-char\" class=\"cdd-input\" type=\"text\" maxlength=\"1\" [(ngModel)]=\"model.CompletingCharacter\" placeholder=\"0\" [disabled]=\"readonly\">\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (has('baseUrl')) {\r\n <div class=\"cdd-field\">\r\n <label class=\"cdd-label\" for=\"cdd-url\">Adresse de base</label>\r\n <input id=\"cdd-url\" class=\"cdd-input\" type=\"text\" [(ngModel)]=\"model.BaseUrl\" placeholder=\"/\" [disabled]=\"readonly\">\r\n </div>\r\n }\r\n\r\n @if (has('nullCaseText') || has('handleError')) {\r\n <div class=\"cdd-row\">\r\n @if (has('nullCaseText')) {\r\n <div class=\"cdd-field\">\r\n <label class=\"cdd-label\" for=\"cdd-null\">Texte si vide</label>\r\n <input id=\"cdd-null\" class=\"cdd-input\" type=\"text\" maxlength=\"100\" [(ngModel)]=\"model.NullCaseText\" placeholder=\"(rien)\" [disabled]=\"readonly\">\r\n </div>\r\n }\r\n @if (has('handleError')) {\r\n <label class=\"cdd-check\">\r\n <input type=\"checkbox\" [(ngModel)]=\"model.HandleError\" [disabled]=\"readonly\"> Valeur vide en évidence (rouge)\r\n </label>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Aperçu -->\r\n <div class=\"cdd-preview\">\r\n <span class=\"cdd-label\">Aperçu</span>\r\n <span class=\"cdd-preview__value\">{{ preview }}</span>\r\n </div>\r\n\r\n <!-- Drapeaux -->\r\n <div class=\"cdd-row cdd-flags\">\r\n <label class=\"cdd-check\"><input type=\"checkbox\" [(ngModel)]=\"model.IsLocked\" [disabled]=\"readonly\"> Verrouillée (ne peut pas être retirée)</label>\r\n @if (isPerimeter) {\r\n <label class=\"cdd-check\"><input type=\"checkbox\" [(ngModel)]=\"model.IsAllowed\" [disabled]=\"readonly\"> Autorisée</label>\r\n }\r\n </div>\r\n</div>\r\n\r\n<div class=\"cdd-footer\">\r\n <button class=\"cdd-btn cdd-btn--secondary\" type=\"button\" (click)=\"cancel()\">Annuler</button>\r\n @if (!readonly) {\r\n <button class=\"cdd-btn cdd-btn--primary\" type=\"button\" (click)=\"apply()\">Appliquer</button>\r\n }\r\n</div>\r\n",
20655
+ styles: [".home-page{font-family:Open sans,sans-serif;background:#fff;-webkit-font-smoothing:antialiased;height:100%;width:100%;padding:16px}.main-container{margin:0 50px}.main-container-modal{width:calc(100% - 50px);margin:10px 25px 0}.moyen-titre{font-weight:700;font-size:24px;color:#4d5a81;margin:8px 0;border-bottom:solid 1px #DBE4FF}.grand-titre{font-weight:700;font-size:28px;color:#4d5a81;margin:0 0 8px}.petit-titre{font-weight:700;font-size:16px;color:#4d5a81;margin:0 0 8px}.petit-titre.underlined{border-bottom:solid 1px #4D5A81}.paragraph{padding:0 15px}.paragraph-highlight{padding:5px 15px 0 12px;border-left:5px solid #8EA7F8;border-bottom:1px solid #DBE4FF;border-top:1px solid #DBE4FF;border-right:1px solid #DBE4FF;background-color:#f7faff}.highlight{background-color:#f7faff;border:1px solid #DBE4FF;border-radius:5px;padding:15px;color:#3c5dc4;margin:0 0 16px}.highlight p{margin-bottom:0}.highlight:before{position:relative;display:block;float:left;width:24px;height:24px;content:\" \";background-size:24px 24px;-webkit-background-size:24px 24px;background-image:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"53.294\" height=\"50.629\" viewBox=\"0 0 53.294 50.629\">%0D%0A <path id=\"allerg\\e8ne\" d=\"M830.494,25.793l-5.814,6.783.727,8.963-8.721,1.938-4.6,7.752L803.847,47.6l-8.236,3.634-4.6-7.51-8.721-1.938.727-8.963L777.2,26.035l5.814-6.783-.727-8.963,8.721-1.938L795.61.6l8.236,3.634L812.083.6l4.6,7.752,8.721,1.938-.727,8.963Zm-24.467,2.422V13.681h-4.845V28.216Zm0,9.69V33.06h-4.845v4.845Z\" transform=\"translate(-777.2 -0.6)\"/>%0D%0A</svg>%0D%0A');background-repeat:no-repeat;margin:0 8px 24px 0;filter:invert(31%) sepia(51%) saturate(1323%) hue-rotate(199deg) brightness(99%) contrast(94%)}.notification{background-color:#dbe4ff;border:1px solid #C4D0F9;border-radius:5px;color:#4d5a81;margin:16px;padding:5px 15px;text-align:justify}.notification:before{position:relative;display:block;float:left;width:24px;height:24px;content:\" \";background-size:24px 24px;-webkit-background-size:24px 24px;background-image:url('data:image/svg+xml,<svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"fas\" data-icon=\"info-circle\" class=\"svg-inline--fa fa-info-circle fa-w-16\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\"></path></svg>');background-repeat:no-repeat;margin:0 8px 0 0;filter:invert(31%) sepia(8%) saturate(2329%) hue-rotate(188deg) brightness(103%) contrast(85%)}.notification-text{padding:0 15px 0 30px;font-size:16px}:host{display:flex;flex-direction:column;max-height:85vh}.cdd-header{display:flex;align-items:center;justify-content:space-between;padding:12px 20px;background:#5272d3;border-bottom:1px solid #3C5DC4}.cdd-title{margin:0;font-size:16px;font-weight:600;color:#fff}.cdd-title__key{font-family:monospace;font-weight:500}.cdd-icon-btn{width:28px;height:28px;border:none;border-radius:50%;background:transparent;color:#fffc;cursor:pointer}.cdd-icon-btn:hover{background:#ffffff26;color:#fff}.cdd-body{overflow:auto;padding:16px 20px}.cdd-field{display:flex;flex-direction:column;gap:4px;margin-bottom:12px;flex:1 1 200px;min-width:0}.cdd-field--small{flex:0 1 140px}.cdd-label{font-size:12px;font-weight:600;color:#535353}.cdd-input{padding:4px 8px;border:1px solid #ced4da;border-radius:3px;font-size:13px}.cdd-input--currency{width:70px;text-transform:uppercase}.cdd-hint{font-size:11px;color:#888}.cdd-hint--warn{color:#b26a00}.cdd-value{font-family:monospace;font-size:13px}.cdd-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:12px}.cdd-types{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:6px}.cdd-type{position:relative;display:flex;align-items:center;gap:8px;padding:6px 8px;border:1px solid #C4D0F9;border-radius:6px;background:#fff;font-size:12px;text-align:left;cursor:pointer}.cdd-type .fa{width:16px;text-align:center;color:#4465c9}.cdd-type:hover:not(:disabled){background:#f7faff}.cdd-type--active{border-color:#4465c9;background:#ebf0ff;font-weight:600}.cdd-type__label{flex:1}.cdd-type__default{font-size:10px;font-weight:400;color:#888}.cdd-options{padding-top:4px;border-top:1px solid #e9ecef;margin-top:4px}.cdd-choice{display:flex;align-items:center;gap:8px;margin-bottom:4px}.cdd-choice label{margin:0;font-weight:400;white-space:nowrap}.cdd-choice select{flex:1;min-width:0}.cdd-chips{display:flex;flex-wrap:wrap;gap:4px}.cdd-chip{padding:1px 8px;border:1px solid #C4D0F9;border-radius:10px;background:#fff;font-family:monospace;font-size:11px;cursor:pointer}.cdd-chip:hover:not(:disabled){background:#f7faff}.cdd-check{display:flex;align-items:center;gap:6px;margin:0 0 12px;font-weight:400;font-size:13px}.cdd-preview{display:flex;align-items:baseline;gap:12px;padding:8px 12px;margin-bottom:12px;border-radius:6px;background:#f5f5f5}.cdd-preview__value{font-size:14px;font-variant-numeric:tabular-nums}.cdd-flags{border-top:1px solid #e9ecef;padding-top:10px}.cdd-footer{display:flex;justify-content:flex-end;gap:8px;padding:10px 20px;border-top:1px solid #e9ecef}.cdd-btn{padding:5px 16px;border-radius:4px;font-size:13px;cursor:pointer}.cdd-btn--secondary{border:1px solid #ced4da;background:#fff}.cdd-btn--primary{border:1px solid #4465C9;background:#4465c9;color:#fff}\n"]
20656
+ }]
20657
+ }],
20658
+ ctorParameters: () => [{
20659
+ type: void 0,
20660
+ decorators: [{
20661
+ type: Inject,
20662
+ args: [LOCALE_ID]
20663
+ }]
20664
+ }],
20665
+ propDecorators: {
20666
+ item: [{ type: Input }],
20667
+ naturalLabel: [{ type: Input }],
20668
+ defaultDisplayType: [{ type: Input }],
20669
+ enumEntityName: [{ type: Input }],
20670
+ columns: [{ type: Input }],
20671
+ isPerimeter: [{ type: Input }],
20672
+ readonly: [{ type: Input }],
20673
+ confirmed: [{ type: Output }],
20674
+ cancelled: [{ type: Output }]
20675
+ }
20676
+ });
20242
20677
  var PresentationProfileEditorComponent = class PresentationProfileEditorComponent extends BaseEntityEditor {
20243
20678
  static {
20244
20679
  this.frozenFields = [
@@ -20269,9 +20704,10 @@ var PresentationProfileEditorComponent = class PresentationProfileEditorComponen
20269
20704
  if (!this.entity) return void 0;
20270
20705
  return this.facade?.change.getModified(this.entity.Id) ?? this.entity;
20271
20706
  }
20272
- constructor(app, validationService, itemData) {
20707
+ constructor(app, validationService, itemData, modalService) {
20273
20708
  super(app, validationService);
20274
20709
  this.itemData = itemData;
20710
+ this.modalService = modalService;
20275
20711
  this.activeTab = 0;
20276
20712
  this.loadedEntity = void 0;
20277
20713
  this.isLoading = false;
@@ -20281,6 +20717,7 @@ var PresentationProfileEditorComponent = class PresentationProfileEditorComponen
20281
20717
  this.selectedIds = /* @__PURE__ */ new Set();
20282
20718
  this.searchText = "";
20283
20719
  this.naturalLabelByKey = /* @__PURE__ */ new Map();
20720
+ this.catalogByKey = /* @__PURE__ */ new Map();
20284
20721
  this.load$ = new Subject();
20285
20722
  }
20286
20723
  ngOnInit() {
@@ -20360,6 +20797,7 @@ var PresentationProfileEditorComponent = class PresentationProfileEditorComponen
20360
20797
  };
20361
20798
  });
20362
20799
  const catalogByKey = new Map(known.map((i) => [i.ColumnKey, i]));
20800
+ this.catalogByKey = catalogByKey;
20363
20801
  this.orderedSelection = rawItems.filter((i) => !!i.ColumnKey).sort((a, b) => (a.DisplayOrder ?? 0) - (b.DisplayOrder ?? 0)).map((i) => ({
20364
20802
  ...catalogByKey.get(i.ColumnKey) ?? {},
20365
20803
  ...i
@@ -20374,6 +20812,7 @@ var PresentationProfileEditorComponent = class PresentationProfileEditorComponen
20374
20812
  this.selectedIds = /* @__PURE__ */ new Set();
20375
20813
  this.searchText = "";
20376
20814
  this.naturalLabelByKey = /* @__PURE__ */ new Map();
20815
+ this.catalogByKey = /* @__PURE__ */ new Map();
20377
20816
  }
20378
20817
  onColumnsChanged() {
20379
20818
  const profile = this.current;
@@ -20383,6 +20822,41 @@ var PresentationProfileEditorComponent = class PresentationProfileEditorComponen
20383
20822
  getCatalogLabel(item) {
20384
20823
  return this.naturalLabelByKey.get(item.ColumnKey ?? "") ?? item.ColumnKey ?? "";
20385
20824
  }
20825
+ getDisplayType(item) {
20826
+ return getColumnDisplayType(item.ColumnDisplayType);
20827
+ }
20828
+ describeDisplay(item) {
20829
+ return describeColumnDisplay(item);
20830
+ }
20831
+ openColumn(item) {
20832
+ const catalog = this.catalogByKey.get(item.ColumnKey ?? "");
20833
+ const ref = this.modalService.show(ColumnDisplayDialogComponent, {
20834
+ class: "modal-lg",
20835
+ keyboard: true,
20836
+ initialState: {
20837
+ item: { ...item },
20838
+ naturalLabel: this.getCatalogLabel(item),
20839
+ defaultDisplayType: item.ColumnSourceType === 2 ? null : catalog?.ColumnDisplayType ?? null,
20840
+ enumEntityName: catalog?.EnumEntityName ?? null,
20841
+ columns: this.allItems.filter((i) => i.ColumnSourceType !== 2 && !!i.ColumnKey).map((i) => ({
20842
+ key: i.ColumnKey,
20843
+ label: i.Label ?? i.ColumnKey
20844
+ })),
20845
+ isPerimeter: this.isPerimeter,
20846
+ readonly: this.readonly
20847
+ }
20848
+ });
20849
+ if (!ref.content) return;
20850
+ ref.content.confirmed.pipe(take(1)).subscribe((result) => {
20851
+ this.orderedSelection = this.orderedSelection.map((i) => i.ColumnKey === item.ColumnKey ? {
20852
+ ...i,
20853
+ ...result
20854
+ } : i);
20855
+ this.onColumnsChanged();
20856
+ ref.hide();
20857
+ });
20858
+ ref.content.cancelled.pipe(take(1)).subscribe(() => ref.hide());
20859
+ }
20386
20860
  onSearch() {
20387
20861
  this.applyFilter();
20388
20862
  }
@@ -20436,7 +20910,8 @@ var PresentationProfileEditorComponent = class PresentationProfileEditorComponen
20436
20910
  deps: [
20437
20911
  { token: i4$2.ApplicationService },
20438
20912
  { token: i4$2.ValidationService },
20439
- { token: i1$3.PresentationProfileItemDataService }
20913
+ { token: i1$3.PresentationProfileItemDataService },
20914
+ { token: i1$2.BsModalService }
20440
20915
  ],
20441
20916
  target: i0.ɵɵFactoryTarget.Component
20442
20917
  });
@@ -20450,8 +20925,8 @@ var PresentationProfileEditorComponent = class PresentationProfileEditorComponen
20450
20925
  selector: "alg-presentation-profile-editor",
20451
20926
  usesInheritance: true,
20452
20927
  ngImport: i0,
20453
- template: "<div class=\"pp-editor\">\r\n @if (entity) {\r\n <alg-tabset [showNavs]=\"true\" [pills]=\"false\" (onSelect)=\"activeTab = $event\">\r\n\r\n <!--Propriétés : table, libellé, finalité et portée du profil, avec les composants des formulaires-->\r\n <alg-tab title=\"Propriétés\" [active]=\"activeTab === 0\" [class.pp-editor-tab]=\"activeTab === 0\">\r\n <div class=\"property-container pp-editor-properties\">\r\n @for (section of sections; track section.Name) {\r\n <div class=\"property-section-container\">\r\n <div class=\"property-section-title\">{{ section.Name }}</div>\r\n <div class=\"property-section-content\">\r\n @for (field of section.FieldViewModels; track field.PropertyName) {\r\n <div class=\"property-row\" [hidden]=\"isFieldHidden(field)\">\r\n <alg-field [field]=\"field\" [form]=\"form\" [readonly]=\"isFieldReadonly(field)\"\r\n (propertyChanged)=\"onPropertyChanged($event)\">\r\n </alg-field>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </alg-tab>\r\n\r\n <!--Colonnes : colonnes affichées par la grille, leur ordre et leurs libellés-->\r\n <alg-tab title=\"Colonnes\" [active]=\"activeTab === 1\" [class.pp-editor-tab]=\"activeTab === 1\">\r\n <div class=\"gcc pp-editor-columns\">\r\n <div *ngIf=\"isLoading\" class=\"gcc__loading\">\r\n <span class=\"gcc__spinner-icon fa fa-circle-o-notch fa-spin\"></span>\r\n Chargement des colonnes…\r\n </div>\r\n <div *ngIf=\"!isLoading && allItems.length === 0 && orderedSelection.length === 0\" class=\"gcc__hint\">\r\n Choisissez la table du profil dans l'onglet « Propriétés ».\r\n </div>\r\n <ng-container *ngIf=\"!isLoading && (allItems.length > 0 || orderedSelection.length > 0)\">\r\n <div class=\"gcc__panels\">\r\n\r\n <!-- ── Colonnes disponibles : celles de la table qui ne sont pas affichées ── -->\r\n <div class=\"gcc__browse\">\r\n <div class=\"gcc__panel-hd\">\r\n <span class=\"gcc__panel-label\">Colonnes disponibles</span>\r\n <span class=\"gcc__badge\">{{ filteredItems.length }}</span>\r\n <input class=\"gcc__search\" type=\"text\" placeholder=\"Rechercher…\"\r\n [(ngModel)]=\"searchText\" (ngModelChange)=\"onSearch()\">\r\n <button *ngIf=\"!readonly\" class=\"pp-editor-add-all\" type=\"button\" [disabled]=\"filteredItems.length === 0\"\r\n (click)=\"addAll()\" title=\"Afficher toutes les colonnes listées\">Tout ajouter</button>\r\n </div>\r\n\r\n <div class=\"gcc__table-wrap\">\r\n <table class=\"gcc__browse-table\">\r\n <tbody>\r\n <tr *ngFor=\"let item of filteredItems\"\r\n class=\"gcc__browse-row\"\r\n [class.gcc__browse-row--custom]=\"item.ColumnSourceType === 2\"\r\n title=\"Afficher cette colonne\"\r\n (click)=\"addItem(item)\">\r\n <td class=\"gcc__col-name\">\r\n <div class=\"gcc__col-key\">{{ item.ColumnKey }}</div>\r\n <div *ngIf=\"item.Label && item.Label !== item.ColumnKey\" class=\"gcc__sub\">{{ item.Label }}</div>\r\n </td>\r\n <td class=\"pp-editor-add\"><i *ngIf=\"!readonly\" class=\"fa fa-plus\"></i></td>\r\n </tr>\r\n <tr *ngIf=\"filteredItems.length === 0\">\r\n <td colspan=\"2\" class=\"gcc__browse-empty\">\r\n {{ searchText ? 'Aucune colonne trouvée' : 'Toutes les colonnes sont affichées' }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n <!-- ── Panel 4: Ordered selection with admin flags ────────────── -->\r\n <div class=\"gcc__selection\">\r\n <div class=\"gcc__panel-hd\">\r\n <span class=\"gcc__panel-label\">Colonnes affichées</span>\r\n <span *ngIf=\"selectedCount > 0\" class=\"gcc__badge gcc__badge--primary\">{{ selectedCount }}</span>\r\n </div>\r\n\r\n <div *ngIf=\"orderedSelection.length > 0\" class=\"gcc__sel-legend\">\r\n <span class=\"gcc__sel-legend__drag\"></span>\r\n <span class=\"gcc__sel-legend__pos\">#</span>\r\n <span class=\"gcc__sel-legend__code\">Colonne</span>\r\n <span class=\"gcc__sel-legend__label\">Étiquette</span>\r\n <ng-container *ngIf=\"isPerimeter\">\r\n <span class=\"gcc__sel-legend__flag\">Aut.</span>\r\n </ng-container>\r\n <span class=\"gcc__sel-legend__flag\">Ver.</span>\r\n <span class=\"gcc__sel-legend__remove\"></span>\r\n </div>\r\n\r\n <div *ngIf=\"orderedSelection.length === 0\" class=\"gcc__sel-empty\">\r\n <span class=\"fa fa-columns gcc__sel-empty__icon\"></span>\r\n <p>Choisissez des colonnes parmi les colonnes disponibles</p>\r\n </div>\r\n\r\n <div *ngIf=\"orderedSelection.length > 0\"\r\n class=\"gcc__sel-list\"\r\n cdkDropList\r\n [cdkDropListData]=\"orderedSelection\"\r\n (cdkDropListDropped)=\"onDrop($event)\">\r\n\r\n <div *ngFor=\"let item of orderedSelection; let i = index\"\r\n class=\"gcc__sel-item\"\r\n cdkDrag [cdkDragDisabled]=\"readonly\"\r\n [cdkDragData]=\"item\">\r\n\r\n <div class=\"gcc__sel-item__placeholder\" *cdkDragPlaceholder></div>\r\n\r\n <span class=\"gcc__sel-item__drag\" cdkDragHandle>\r\n <i class=\"fa fa-bars\"></i>\r\n </span>\r\n\r\n <span class=\"gcc__sel-item__pos\">{{ i + 1 }}</span>\r\n\r\n <span class=\"gcc__sel-item__code\"\r\n [class.gcc__sel-item__code--cf]=\"item.ColumnSourceType === 2\"\r\n [title]=\"item.ColumnKey\">\r\n <span class=\"gcc__sel-item__name\">{{ item.ColumnKey }}</span>\r\n <span *ngIf=\"getCatalogLabel(item) !== item.ColumnKey\" class=\"gcc__sub\">{{ getCatalogLabel(item) }}</span>\r\n </span>\r\n\r\n <input class=\"gcc__sel-item__label\" type=\"text\"\r\n [placeholder]=\"getCatalogLabel(item)\"\r\n [(ngModel)]=\"item.Label\" (ngModelChange)=\"onColumnsChanged()\" [disabled]=\"readonly\"\r\n (click)=\"$event.stopPropagation()\"\r\n title=\"Étiquette personnalisée\">\r\n\r\n <!-- Perimeter scope: allowed flag -->\r\n <ng-container *ngIf=\"isPerimeter\">\r\n <label class=\"gcc__flag\" (click)=\"$event.stopPropagation()\">\r\n <input type=\"checkbox\" [(ngModel)]=\"item.IsAllowed\" (ngModelChange)=\"onColumnsChanged()\" [disabled]=\"readonly\" title=\"Autorisé\">\r\n </label>\r\n </ng-container>\r\n\r\n <!-- Always: locked flag -->\r\n <label class=\"gcc__flag\" (click)=\"$event.stopPropagation()\">\r\n <input type=\"checkbox\" [(ngModel)]=\"item.IsLocked\" (ngModelChange)=\"onColumnsChanged()\" [disabled]=\"readonly\" title=\"Verrouillé\">\r\n </label>\r\n\r\n <button class=\"gcc__sel-item__remove\" type=\"button\"\r\n (click)=\"removeFromSelection(item); $event.stopPropagation()\"\r\n title=\"Retirer\">&#x2715;</button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Pied de la sélection -->\r\n <div class=\"gcc__sel-footer\">\r\n <span class=\"gcc__sel-footer__info\">\r\n <ng-container *ngIf=\"selectedCount > 0\">\r\n {{ selectedCount }} colonne(s) — glissez pour réordonner\r\n </ng-container>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n </div><!-- /.gcc__panels -->\r\n </ng-container>\r\n </div>\r\n </alg-tab>\r\n </alg-tabset>\r\n }\r\n</div>\r\n",
20454
- styles: ["alg-pp-column{display:block;height:100%}.gcc{display:flex;flex-direction:column;height:100%;overflow:hidden;padding:10px;box-sizing:border-box}.gcc__form{flex:1;min-height:0;display:flex;flex-direction:column;background:#fff}.gcc__tabs{display:block;flex:none}.gcc__tabs .tabset-content{display:none}.gcc__tabs .nav-tabs-custom{margin-bottom:0;box-shadow:none}.gcc__content{flex:1;min-height:0;display:flex;flex-direction:column;gap:.75rem;padding:15px;overflow:hidden}.gcc__buttons{flex:none;margin-right:0;padding-bottom:0}.gcc__buttons .btn{margin-left:8px}.gcc__toolbar{display:flex;flex-wrap:wrap;align-items:flex-end;gap:.75rem;flex-shrink:0}.gcc__field{display:flex;flex-direction:column;gap:.25rem}.gcc__field label{font-size:.75rem;font-weight:600;color:#6c757d}.gcc__field input,.gcc__field select{min-width:9rem;padding:.35rem .5rem;border:1px solid #ced4da;border-radius:.25rem;font-size:.85rem}.gcc__message{padding:.5rem .75rem;background:#eef3f8;border-left:3px solid #4465C9;border-radius:.25rem;font-size:.85rem;flex-shrink:0}.gcc__body{flex:1;display:flex;gap:0;overflow:hidden;min-height:0;border:1px solid #e9ecef;border-radius:.25rem;background:#fff}.gcc__panel-hd{display:flex;align-items:center;justify-content:space-between;padding:.4rem .75rem;background:#f8f9fa;border-bottom:1px solid #e9ecef;flex-shrink:0}.gcc__panel-title{font-size:.8rem;font-weight:600;display:flex;align-items:center;gap:6px}.gcc__panel-label{font-size:.75rem;font-weight:600;color:#495057}.gcc__count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:16px;padding:0 5px;background:#4465c91f;color:#4465c9;border-radius:20px;font-size:10px;font-weight:700}.gcc__badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:16px;padding:0 5px;background:#4465c91a;color:#4465c9;border-radius:20px;font-size:10px;font-weight:700}.gcc__badge--primary{background:#4465c9;color:#fff}.gcc__muted{color:#6c757d;font-size:.8rem}.gcc__fw-normal{font-weight:400}.gcc__configs{display:flex;flex-direction:column;flex:0 0 220px;border-right:1px solid #e9ecef;overflow:hidden}.gcc__list-scroll{flex:1;overflow:auto}.gcc__table{width:100%;border-collapse:collapse}.gcc__table th,.gcc__table td{padding:.35rem .6rem;border-bottom:1px solid #e9ecef;text-align:left;font-size:.78rem}.gcc__table th{font-weight:600;color:#495057;background:#f8f9fa;position:sticky;top:0;z-index:1}.gcc__config-row{cursor:pointer;transition:background .1s}.gcc__config-row:hover{background:#4465c90a}.gcc__config-row--selected{background:#4465c914;border-left:3px solid #4465C9}.gcc__config-row--selected td:first-child{padding-left:calc(.6rem - 3px)}.gcc__key{font-family:monospace;font-weight:600;color:#4465c9;font-size:.78rem}.gcc__sub{font-size:.7rem;font-weight:400;color:#6c757d;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gcc__scope-badge{display:inline-block;padding:1px 5px;border-radius:20px;background:#4465c91a;color:#4465c9;font-size:9px;font-weight:700;text-transform:uppercase}.gcc__actions-cell{text-align:right;width:28px}.gcc__del-btn{background:none;border:none;color:#adb5bd;cursor:pointer;padding:2px 4px;border-radius:3px;font-size:.72rem;transition:color .1s}.gcc__del-btn:hover{color:#dc3545}.gcc__spinner{display:flex;align-items:center;gap:8px;padding:1rem .75rem;color:#6c757d;font-size:.8rem}.gcc__empty{padding:1.25rem .75rem;color:#6c757d;font-style:italic;font-size:.8rem}.gcc__editor{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.gcc__editor-hd{display:flex;align-items:center;padding:.4rem .75rem;background:#f8f9fa;border-bottom:1px solid #e9ecef;flex-shrink:0}.gcc__loading{display:flex;align-items:center;gap:8px;padding:1.5rem 1rem;color:#6c757d;font-size:.85rem;flex-shrink:0}.gcc__spinner-icon{font-size:1rem}.gcc__panels{flex:1;display:flex;overflow:hidden;min-height:0}.gcc__groups{display:flex;flex-direction:column;flex:0 0 160px;border-right:1px solid #e9ecef;overflow:hidden}.gcc__group-list{list-style:none;margin:0;padding:0;flex:1;overflow-y:auto}.gcc__group-item{display:flex;align-items:center;justify-content:space-between;padding:.4rem .6rem;cursor:pointer;font-size:.78rem;border-bottom:1px solid #e9ecef;transition:background .1s}.gcc__group-item:hover{background:#4465c90a}.gcc__group-item--active{background:#4465c914;font-weight:600;color:#4465c9}.gcc__group-item--standard .gcc__group-item__name{color:#4465c9}.gcc__group-item--custom .gcc__group-item__name{color:#6b7fd4}.gcc__group-item__name{flex:1}.gcc__group-meta{display:flex;align-items:center;gap:3px}.gcc__browse{display:flex;flex-direction:column;flex:1;border-right:1px solid #e9ecef;overflow:hidden;min-width:0}.gcc__search{height:26px;padding:0 .5rem;border:1px solid #ced4da;border-radius:.2rem;font-size:.78rem;width:140px}.gcc__table-wrap{flex:1;overflow:auto}.gcc__table-wrap::-webkit-scrollbar{width:5px}.gcc__table-wrap::-webkit-scrollbar-track{background:transparent}.gcc__table-wrap::-webkit-scrollbar-thumb{background:#e9ecef;border-radius:3px}.gcc__browse-table{width:100%;border-collapse:collapse}.gcc__browse-table th,.gcc__browse-table td{padding:.3rem .5rem;border-bottom:1px solid #e9ecef;text-align:left;font-size:.78rem}.gcc__browse-table th{font-weight:600;color:#495057;background:#f8f9fa;position:sticky;top:0;z-index:1}.gcc__browse-row{cursor:pointer;transition:background .1s}.gcc__browse-row:hover{background:#4465c90a}.gcc__browse-row--selected{background:#4465c914}.gcc__browse-row--custom .gcc__col-key{color:#6b7fd4}.gcc__col-check{width:28px;text-align:center}.gcc__col-key{font-family:monospace;font-size:11px;font-weight:600;color:#4465c9}.gcc__browse-empty{padding:1rem .75rem;color:#6c757d;font-style:italic;font-size:.78rem}.gcc__selection{display:flex;flex-direction:column;flex:0 0 380px;overflow:hidden}.gcc__sel-legend{display:flex;align-items:center;padding:3px .5rem;background:#f8f9fa;border-bottom:1px solid #e9ecef;font-size:9px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:#6c757d;flex-shrink:0;gap:0}.gcc__sel-legend__drag{width:20px;flex-shrink:0}.gcc__sel-legend__pos{width:22px;flex-shrink:0;text-align:center}.gcc__sel-legend__code{width:150px;flex-shrink:0;padding-left:2px}.gcc__sel-legend__label{flex:1;min-width:0}.gcc__sel-legend__flag{width:36px;text-align:center;flex-shrink:0}.gcc__sel-legend__width{width:50px;flex-shrink:0;padding-left:2px}.gcc__sel-legend__remove{width:22px;flex-shrink:0}.gcc__sel-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;color:#6c757d;gap:.5rem;font-size:.8rem}.gcc__sel-empty__icon{font-size:2rem;opacity:.3}.gcc__sel-empty p{margin:0}.gcc__sel-list{flex:1;overflow-y:auto}.gcc__sel-list::-webkit-scrollbar{width:4px}.gcc__sel-list::-webkit-scrollbar-track{background:transparent}.gcc__sel-list::-webkit-scrollbar-thumb{background:#e9ecef;border-radius:3px}.gcc__sel-item{display:flex;align-items:center;padding:4px .5rem;border-bottom:1px solid #e9ecef;background:#fff;-webkit-user-select:none;user-select:none;gap:0;transition:background .1s}.gcc__sel-item:hover{background:#4465c908}.gcc__sel-item.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.gcc__sel-item__placeholder{height:32px;background:#4465c90f;border:1px dashed #4465C9;border-radius:2px;flex:1}.gcc__sel-item__drag{width:20px;flex-shrink:0;color:#ced4da;cursor:grab;font-size:11px;display:flex;align-items:center;justify-content:center}.gcc__sel-item__drag:hover{color:#4465c9}.gcc__sel-item__drag:active{cursor:grabbing}.gcc__sel-item__pos{width:22px;flex-shrink:0;font-size:9px;color:#6c757d;text-align:center}.gcc__sel-item__code{width:150px;flex-shrink:0;display:flex;flex-direction:column;overflow:hidden;padding-left:2px}.gcc__sel-item__code--cf .gcc__sel-item__name{color:#6b7fd4}.gcc__sel-item__name{font-family:monospace;font-size:10px;font-weight:600;color:#4465c9;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gcc__sel-item__label{flex:1;min-width:0;height:22px;padding:0 4px;border:1px solid transparent;border-radius:3px;font-size:11px;color:#343a40;background:transparent;outline:none;transition:border-color .1s,background .1s}.gcc__sel-item__label::placeholder{color:#6c757d;font-style:italic}.gcc__sel-item__label:hover{border-color:#d1d8de;background:#f8f9fa}.gcc__sel-item__label:focus{border-color:#4465c9;background:#fff}.gcc__sel-item__remove{width:22px;flex-shrink:0;background:none;border:none;color:#adb5bd;cursor:pointer;font-size:11px;padding:0;text-align:center;transition:color .1s}.gcc__sel-item__remove:hover{color:#dc3545}.gcc__sel-list.cdk-drop-list-dragging .gcc__sel-item:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.gcc__flag{width:36px;flex-shrink:0;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0}.gcc__flag input[type=checkbox]{cursor:pointer}.gcc__item-width{width:46px;flex-shrink:0;padding:1px 3px;border:1px solid #ced4da;border-radius:3px;font-size:10px;text-align:right}.gcc__sel-footer{display:flex;align-items:center;justify-content:space-between;padding:.4rem .75rem;background:#f8f9fa;border-top:1px solid #e9ecef;flex-shrink:0}.gcc__sel-footer__info{font-size:.75rem;color:#6c757d;font-style:italic}.gcc__hint{display:flex;align-items:center;justify-content:center;flex:1;color:#6c757d;font-style:italic;font-size:.85rem}\n", ".home-page{font-family:Open sans,sans-serif;background:#fff;-webkit-font-smoothing:antialiased;height:100%;width:100%;padding:16px}.main-container{margin:0 50px}.main-container-modal{width:calc(100% - 50px);margin:10px 25px 0}.moyen-titre{font-weight:700;font-size:24px;color:#4d5a81;margin:8px 0;border-bottom:solid 1px #DBE4FF}.grand-titre{font-weight:700;font-size:28px;color:#4d5a81;margin:0 0 8px}.petit-titre{font-weight:700;font-size:16px;color:#4d5a81;margin:0 0 8px}.petit-titre.underlined{border-bottom:solid 1px #4D5A81}.paragraph{padding:0 15px}.paragraph-highlight{padding:5px 15px 0 12px;border-left:5px solid #8EA7F8;border-bottom:1px solid #DBE4FF;border-top:1px solid #DBE4FF;border-right:1px solid #DBE4FF;background-color:#f7faff}.highlight{background-color:#f7faff;border:1px solid #DBE4FF;border-radius:5px;padding:15px;color:#3c5dc4;margin:0 0 16px}.highlight p{margin-bottom:0}.highlight:before{position:relative;display:block;float:left;width:24px;height:24px;content:\" \";background-size:24px 24px;-webkit-background-size:24px 24px;background-image:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"53.294\" height=\"50.629\" viewBox=\"0 0 53.294 50.629\">%0D%0A <path id=\"allerg\\e8ne\" d=\"M830.494,25.793l-5.814,6.783.727,8.963-8.721,1.938-4.6,7.752L803.847,47.6l-8.236,3.634-4.6-7.51-8.721-1.938.727-8.963L777.2,26.035l5.814-6.783-.727-8.963,8.721-1.938L795.61.6l8.236,3.634L812.083.6l4.6,7.752,8.721,1.938-.727,8.963Zm-24.467,2.422V13.681h-4.845V28.216Zm0,9.69V33.06h-4.845v4.845Z\" transform=\"translate(-777.2 -0.6)\"/>%0D%0A</svg>%0D%0A');background-repeat:no-repeat;margin:0 8px 24px 0;filter:invert(31%) sepia(51%) saturate(1323%) hue-rotate(199deg) brightness(99%) contrast(94%)}.notification{background-color:#dbe4ff;border:1px solid #C4D0F9;border-radius:5px;color:#4d5a81;margin:16px;padding:5px 15px;text-align:justify}.notification:before{position:relative;display:block;float:left;width:24px;height:24px;content:\" \";background-size:24px 24px;-webkit-background-size:24px 24px;background-image:url('data:image/svg+xml,<svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"fas\" data-icon=\"info-circle\" class=\"svg-inline--fa fa-info-circle fa-w-16\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\"></path></svg>');background-repeat:no-repeat;margin:0 8px 0 0;filter:invert(31%) sepia(8%) saturate(2329%) hue-rotate(188deg) brightness(103%) contrast(85%)}.notification-text{padding:0 15px 0 30px;font-size:16px}.propertyGridform{height:100%;width:100%}.property-grid-tabset{height:100%}.property-grid-tab{height:100%;width:100%;padding:5px}.property-row-center{padding-top:21px}.property-section-content{display:grid;grid-template-columns:repeat(auto-fit,minmax(225px,1fr));align-items:flex-start;align-content:flex-start;gap:10px;margin:0 10px}.property-section-container{display:flex;flex-direction:column;background:#f7faff;border-radius:5px;border:1px solid #C1D0FD;padding-bottom:10px}.property-section-title{display:block;font-size:14px;background:#f7faff;border-bottom:none;padding:2px 0;margin:10px;line-height:24px;font-weight:700;border-bottom:solid 1px #C1D0FD;color:#4d5a81}.property-container{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:10px;padding:5px;height:100%;overflow:auto}.property-row{display:flex;flex-wrap:wrap;align-items:center;flex:25%;gap:10px}.property-label{color:#4465c9}.property-label span{padding-top:5px;display:inline-block;margin-right:5px}.property-label.invalid{color:red}.property-input{flex:2;min-width:200px}.checkbox-container{display:flex;align-items:center;gap:5px}.validation-error{color:red;font-size:.9rem}alg-presentation-profile-editor{display:block;height:100%}.pp-editor{height:100%}.pp-editor alg-tabset{display:block;height:100%}.pp-editor-tab{display:block;height:100%}.pp-editor-properties{height:100%;overflow:auto}.pp-editor-columns.gcc{padding:10px}.pp-editor-columns.gcc .gcc__panels{flex:1;min-height:0;border:1px solid #e9ecef}.pp-editor-columns.gcc{container-type:inline-size}.pp-editor-columns.gcc .gcc__browse,.pp-editor-columns.gcc .gcc__selection{flex:1 1 0;min-width:0;min-height:0}.pp-editor-columns.gcc .gcc__browse-row{cursor:pointer}@container (max-width: 700px){.pp-editor-columns .gcc__panels{flex-direction:column}.pp-editor-columns .gcc__browse{border-right:none;border-bottom:1px solid #e9ecef}}.pp-editor-add{width:28px;text-align:center;color:#999}.pp-editor-add-all{flex:none;margin-left:8px;padding:2px 8px;border:1px solid #ced4da;border-radius:3px;background:#fff;font-size:11px;cursor:pointer}.pp-editor-add-all:disabled{opacity:.5;cursor:default}\n"],
20928
+ template: "<div class=\"pp-editor\">\r\n @if (entity) {\r\n <alg-tabset [showNavs]=\"true\" [pills]=\"false\" (onSelect)=\"activeTab = $event\">\r\n\r\n <!--Propriétés : table, libellé, finalité et portée du profil, avec les composants des formulaires-->\r\n <alg-tab title=\"Propriétés\" [active]=\"activeTab === 0\" [class.pp-editor-tab]=\"activeTab === 0\">\r\n <div class=\"property-container pp-editor-properties\">\r\n @for (section of sections; track section.Name) {\r\n <div class=\"property-section-container\">\r\n <div class=\"property-section-title\">{{ section.Name }}</div>\r\n <div class=\"property-section-content\">\r\n @for (field of section.FieldViewModels; track field.PropertyName) {\r\n <div class=\"property-row\" [hidden]=\"isFieldHidden(field)\">\r\n <alg-field [field]=\"field\" [form]=\"form\" [readonly]=\"isFieldReadonly(field)\"\r\n (propertyChanged)=\"onPropertyChanged($event)\">\r\n </alg-field>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </alg-tab>\r\n\r\n <!--Colonnes : colonnes affichées par la grille, leur ordre et leurs libellés-->\r\n <alg-tab title=\"Colonnes\" [active]=\"activeTab === 1\" [class.pp-editor-tab]=\"activeTab === 1\">\r\n <div class=\"gcc pp-editor-columns\">\r\n <div *ngIf=\"isLoading\" class=\"gcc__loading\">\r\n <span class=\"gcc__spinner-icon fa fa-circle-o-notch fa-spin\"></span>\r\n Chargement des colonnes…\r\n </div>\r\n <div *ngIf=\"!isLoading && allItems.length === 0 && orderedSelection.length === 0\" class=\"gcc__hint\">\r\n Choisissez la table du profil dans l'onglet « Propriétés ».\r\n </div>\r\n <ng-container *ngIf=\"!isLoading && (allItems.length > 0 || orderedSelection.length > 0)\">\r\n <div class=\"gcc__panels\">\r\n\r\n <!-- ── Colonnes disponibles : celles de la table qui ne sont pas affichées ── -->\r\n <div class=\"gcc__browse\">\r\n <div class=\"gcc__panel-hd\">\r\n <span class=\"gcc__panel-label\">Colonnes disponibles</span>\r\n <span class=\"gcc__badge\">{{ filteredItems.length }}</span>\r\n <input class=\"gcc__search\" type=\"text\" placeholder=\"Rechercher…\"\r\n [(ngModel)]=\"searchText\" (ngModelChange)=\"onSearch()\">\r\n <button *ngIf=\"!readonly\" class=\"pp-editor-add-all\" type=\"button\" [disabled]=\"filteredItems.length === 0\"\r\n (click)=\"addAll()\" title=\"Afficher toutes les colonnes listées\">Tout ajouter</button>\r\n </div>\r\n\r\n <div class=\"gcc__table-wrap\">\r\n <table class=\"gcc__browse-table\">\r\n <tbody>\r\n <tr *ngFor=\"let item of filteredItems\"\r\n class=\"gcc__browse-row\"\r\n [class.gcc__browse-row--custom]=\"item.ColumnSourceType === 2\"\r\n title=\"Afficher cette colonne\"\r\n (click)=\"addItem(item)\">\r\n <td class=\"gcc__col-name\">\r\n <div class=\"gcc__col-key\">{{ item.ColumnKey }}</div>\r\n <div *ngIf=\"item.Label && item.Label !== item.ColumnKey\" class=\"gcc__sub\">{{ item.Label }}</div>\r\n </td>\r\n <td class=\"pp-editor-add\"><i *ngIf=\"!readonly\" class=\"fa fa-plus\"></i></td>\r\n </tr>\r\n <tr *ngIf=\"filteredItems.length === 0\">\r\n <td colspan=\"2\" class=\"gcc__browse-empty\">\r\n {{ searchText ? 'Aucune colonne trouvée' : 'Toutes les colonnes sont affichées' }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n <!-- ── Panel 4: Ordered selection with admin flags ────────────── -->\r\n <div class=\"gcc__selection\">\r\n <div class=\"gcc__panel-hd\">\r\n <span class=\"gcc__panel-label\">Colonnes affichées</span>\r\n <span *ngIf=\"selectedCount > 0\" class=\"gcc__badge gcc__badge--primary\">{{ selectedCount }}</span>\r\n </div>\r\n\r\n <div *ngIf=\"orderedSelection.length > 0\" class=\"gcc__sel-legend\">\r\n <span class=\"gcc__sel-legend__drag\"></span>\r\n <span class=\"gcc__sel-legend__pos\">#</span>\r\n <span class=\"gcc__sel-legend__code\">Colonne</span>\r\n <span class=\"gcc__sel-legend__label\">Étiquette</span>\r\n <span class=\"gcc__sel-legend__display\">Affichage</span>\r\n <ng-container *ngIf=\"isPerimeter\">\r\n <span class=\"gcc__sel-legend__flag\">Aut.</span>\r\n </ng-container>\r\n <span class=\"gcc__sel-legend__flag\">Ver.</span>\r\n <span class=\"gcc__sel-legend__remove\"></span>\r\n </div>\r\n\r\n <div *ngIf=\"orderedSelection.length === 0\" class=\"gcc__sel-empty\">\r\n <span class=\"fa fa-columns gcc__sel-empty__icon\"></span>\r\n <p>Choisissez des colonnes parmi les colonnes disponibles</p>\r\n </div>\r\n\r\n <div *ngIf=\"orderedSelection.length > 0\"\r\n class=\"gcc__sel-list\"\r\n cdkDropList\r\n [cdkDropListData]=\"orderedSelection\"\r\n (cdkDropListDropped)=\"onDrop($event)\">\r\n\r\n <div *ngFor=\"let item of orderedSelection; let i = index\"\r\n class=\"gcc__sel-item\"\r\n cdkDrag [cdkDragDisabled]=\"readonly\"\r\n [cdkDragData]=\"item\">\r\n\r\n <div class=\"gcc__sel-item__placeholder\" *cdkDragPlaceholder></div>\r\n\r\n <span class=\"gcc__sel-item__drag\" cdkDragHandle>\r\n <i class=\"fa fa-bars\"></i>\r\n </span>\r\n\r\n <span class=\"gcc__sel-item__pos\">{{ i + 1 }}</span>\r\n\r\n <span class=\"gcc__sel-item__code\"\r\n [class.gcc__sel-item__code--cf]=\"item.ColumnSourceType === 2\"\r\n [title]=\"item.ColumnKey\">\r\n <span class=\"gcc__sel-item__name\">{{ item.ColumnKey }}</span>\r\n <span *ngIf=\"getCatalogLabel(item) !== item.ColumnKey\" class=\"gcc__sub\">{{ getCatalogLabel(item) }}</span>\r\n </span>\r\n\r\n <input class=\"gcc__sel-item__label\" type=\"text\"\r\n [placeholder]=\"getCatalogLabel(item)\"\r\n [(ngModel)]=\"item.Label\" (ngModelChange)=\"onColumnsChanged()\" [disabled]=\"readonly\"\r\n (click)=\"$event.stopPropagation()\"\r\n title=\"Étiquette personnalisée\">\r\n\r\n <!-- Affichage : indicateur du type, ouvre la fenêtre d'édition de la colonne -->\r\n <span class=\"pp-display\" (click)=\"$event.stopPropagation()\">\r\n <button type=\"button\" class=\"pp-display__badge\"\r\n [class.pp-display__badge--default]=\"!getDisplayType(item)\"\r\n [title]=\"describeDisplay(item)\"\r\n (click)=\"openColumn(item)\">\r\n <i class=\"fa fa-{{ getDisplayType(item)?.icon ?? 'magic' }}\"></i>\r\n <span class=\"pp-display__text\">{{ getDisplayType(item)?.short ?? 'Auto' }}</span>\r\n </button>\r\n <button type=\"button\" class=\"pp-display__edit\" title=\"Modifier la colonne (libellé, affichage...)\" (click)=\"openColumn(item)\">\r\n <i class=\"fa fa-sliders\"></i>\r\n </button>\r\n </span>\r\n\r\n <!-- Perimeter scope: allowed flag -->\r\n <ng-container *ngIf=\"isPerimeter\">\r\n <label class=\"gcc__flag\" (click)=\"$event.stopPropagation()\">\r\n <input type=\"checkbox\" [(ngModel)]=\"item.IsAllowed\" (ngModelChange)=\"onColumnsChanged()\" [disabled]=\"readonly\" title=\"Autorisé\">\r\n </label>\r\n </ng-container>\r\n\r\n <!-- Always: locked flag -->\r\n <label class=\"gcc__flag\" (click)=\"$event.stopPropagation()\">\r\n <input type=\"checkbox\" [(ngModel)]=\"item.IsLocked\" (ngModelChange)=\"onColumnsChanged()\" [disabled]=\"readonly\" title=\"Verrouillé\">\r\n </label>\r\n\r\n <button class=\"gcc__sel-item__remove\" type=\"button\"\r\n (click)=\"removeFromSelection(item); $event.stopPropagation()\"\r\n title=\"Retirer\">&#x2715;</button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Pied de la sélection -->\r\n <div class=\"gcc__sel-footer\">\r\n <span class=\"gcc__sel-footer__info\">\r\n <ng-container *ngIf=\"selectedCount > 0\">\r\n {{ selectedCount }} colonne(s) — glissez pour réordonner\r\n </ng-container>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n </div><!-- /.gcc__panels -->\r\n </ng-container>\r\n </div>\r\n </alg-tab>\r\n </alg-tabset>\r\n }\r\n</div>\r\n",
20929
+ styles: ["alg-pp-column{display:block;height:100%}.gcc{display:flex;flex-direction:column;height:100%;overflow:hidden;padding:10px;box-sizing:border-box}.gcc__form{flex:1;min-height:0;display:flex;flex-direction:column;background:#fff}.gcc__tabs{display:block;flex:none}.gcc__tabs .tabset-content{display:none}.gcc__tabs .nav-tabs-custom{margin-bottom:0;box-shadow:none}.gcc__content{flex:1;min-height:0;display:flex;flex-direction:column;gap:.75rem;padding:15px;overflow:hidden}.gcc__buttons{flex:none;margin-right:0;padding-bottom:0}.gcc__buttons .btn{margin-left:8px}.gcc__toolbar{display:flex;flex-wrap:wrap;align-items:flex-end;gap:.75rem;flex-shrink:0}.gcc__field{display:flex;flex-direction:column;gap:.25rem}.gcc__field label{font-size:.75rem;font-weight:600;color:#6c757d}.gcc__field input,.gcc__field select{min-width:9rem;padding:.35rem .5rem;border:1px solid #ced4da;border-radius:.25rem;font-size:.85rem}.gcc__message{padding:.5rem .75rem;background:#eef3f8;border-left:3px solid #4465C9;border-radius:.25rem;font-size:.85rem;flex-shrink:0}.gcc__body{flex:1;display:flex;gap:0;overflow:hidden;min-height:0;border:1px solid #e9ecef;border-radius:.25rem;background:#fff}.gcc__panel-hd{display:flex;align-items:center;justify-content:space-between;padding:.4rem .75rem;background:#f8f9fa;border-bottom:1px solid #e9ecef;flex-shrink:0}.gcc__panel-title{font-size:.8rem;font-weight:600;display:flex;align-items:center;gap:6px}.gcc__panel-label{font-size:.75rem;font-weight:600;color:#495057}.gcc__count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:16px;padding:0 5px;background:#4465c91f;color:#4465c9;border-radius:20px;font-size:10px;font-weight:700}.gcc__badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:16px;padding:0 5px;background:#4465c91a;color:#4465c9;border-radius:20px;font-size:10px;font-weight:700}.gcc__badge--primary{background:#4465c9;color:#fff}.gcc__muted{color:#6c757d;font-size:.8rem}.gcc__fw-normal{font-weight:400}.gcc__configs{display:flex;flex-direction:column;flex:0 0 220px;border-right:1px solid #e9ecef;overflow:hidden}.gcc__list-scroll{flex:1;overflow:auto}.gcc__table{width:100%;border-collapse:collapse}.gcc__table th,.gcc__table td{padding:.35rem .6rem;border-bottom:1px solid #e9ecef;text-align:left;font-size:.78rem}.gcc__table th{font-weight:600;color:#495057;background:#f8f9fa;position:sticky;top:0;z-index:1}.gcc__config-row{cursor:pointer;transition:background .1s}.gcc__config-row:hover{background:#4465c90a}.gcc__config-row--selected{background:#4465c914;border-left:3px solid #4465C9}.gcc__config-row--selected td:first-child{padding-left:calc(.6rem - 3px)}.gcc__key{font-family:monospace;font-weight:600;color:#4465c9;font-size:.78rem}.gcc__sub{font-size:.7rem;font-weight:400;color:#6c757d;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gcc__scope-badge{display:inline-block;padding:1px 5px;border-radius:20px;background:#4465c91a;color:#4465c9;font-size:9px;font-weight:700;text-transform:uppercase}.gcc__actions-cell{text-align:right;width:28px}.gcc__del-btn{background:none;border:none;color:#adb5bd;cursor:pointer;padding:2px 4px;border-radius:3px;font-size:.72rem;transition:color .1s}.gcc__del-btn:hover{color:#dc3545}.gcc__spinner{display:flex;align-items:center;gap:8px;padding:1rem .75rem;color:#6c757d;font-size:.8rem}.gcc__empty{padding:1.25rem .75rem;color:#6c757d;font-style:italic;font-size:.8rem}.gcc__editor{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.gcc__editor-hd{display:flex;align-items:center;padding:.4rem .75rem;background:#f8f9fa;border-bottom:1px solid #e9ecef;flex-shrink:0}.gcc__loading{display:flex;align-items:center;gap:8px;padding:1.5rem 1rem;color:#6c757d;font-size:.85rem;flex-shrink:0}.gcc__spinner-icon{font-size:1rem}.gcc__panels{flex:1;display:flex;overflow:hidden;min-height:0}.gcc__groups{display:flex;flex-direction:column;flex:0 0 160px;border-right:1px solid #e9ecef;overflow:hidden}.gcc__group-list{list-style:none;margin:0;padding:0;flex:1;overflow-y:auto}.gcc__group-item{display:flex;align-items:center;justify-content:space-between;padding:.4rem .6rem;cursor:pointer;font-size:.78rem;border-bottom:1px solid #e9ecef;transition:background .1s}.gcc__group-item:hover{background:#4465c90a}.gcc__group-item--active{background:#4465c914;font-weight:600;color:#4465c9}.gcc__group-item--standard .gcc__group-item__name{color:#4465c9}.gcc__group-item--custom .gcc__group-item__name{color:#6b7fd4}.gcc__group-item__name{flex:1}.gcc__group-meta{display:flex;align-items:center;gap:3px}.gcc__browse{display:flex;flex-direction:column;flex:1;border-right:1px solid #e9ecef;overflow:hidden;min-width:0}.gcc__search{height:26px;padding:0 .5rem;border:1px solid #ced4da;border-radius:.2rem;font-size:.78rem;width:140px}.gcc__table-wrap{flex:1;overflow:auto}.gcc__table-wrap::-webkit-scrollbar{width:5px}.gcc__table-wrap::-webkit-scrollbar-track{background:transparent}.gcc__table-wrap::-webkit-scrollbar-thumb{background:#e9ecef;border-radius:3px}.gcc__browse-table{width:100%;border-collapse:collapse}.gcc__browse-table th,.gcc__browse-table td{padding:.3rem .5rem;border-bottom:1px solid #e9ecef;text-align:left;font-size:.78rem}.gcc__browse-table th{font-weight:600;color:#495057;background:#f8f9fa;position:sticky;top:0;z-index:1}.gcc__browse-row{cursor:pointer;transition:background .1s}.gcc__browse-row:hover{background:#4465c90a}.gcc__browse-row--selected{background:#4465c914}.gcc__browse-row--custom .gcc__col-key{color:#6b7fd4}.gcc__col-check{width:28px;text-align:center}.gcc__col-key{font-family:monospace;font-size:11px;font-weight:600;color:#4465c9}.gcc__browse-empty{padding:1rem .75rem;color:#6c757d;font-style:italic;font-size:.78rem}.gcc__selection{display:flex;flex-direction:column;flex:0 0 380px;overflow:hidden}.gcc__sel-legend{display:flex;align-items:center;padding:3px .5rem;background:#f8f9fa;border-bottom:1px solid #e9ecef;font-size:9px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:#6c757d;flex-shrink:0;gap:0}.gcc__sel-legend__drag{width:20px;flex-shrink:0}.gcc__sel-legend__pos{width:22px;flex-shrink:0;text-align:center}.gcc__sel-legend__code{width:150px;flex-shrink:0;padding-left:2px}.gcc__sel-legend__label{flex:1;min-width:0}.gcc__sel-legend__flag{width:36px;text-align:center;flex-shrink:0}.gcc__sel-legend__width{width:50px;flex-shrink:0;padding-left:2px}.gcc__sel-legend__remove{width:22px;flex-shrink:0}.gcc__sel-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;color:#6c757d;gap:.5rem;font-size:.8rem}.gcc__sel-empty__icon{font-size:2rem;opacity:.3}.gcc__sel-empty p{margin:0}.gcc__sel-list{flex:1;overflow-y:auto}.gcc__sel-list::-webkit-scrollbar{width:4px}.gcc__sel-list::-webkit-scrollbar-track{background:transparent}.gcc__sel-list::-webkit-scrollbar-thumb{background:#e9ecef;border-radius:3px}.gcc__sel-item{display:flex;align-items:center;padding:4px .5rem;border-bottom:1px solid #e9ecef;background:#fff;-webkit-user-select:none;user-select:none;gap:0;transition:background .1s}.gcc__sel-item:hover{background:#4465c908}.gcc__sel-item.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.gcc__sel-item__placeholder{height:32px;background:#4465c90f;border:1px dashed #4465C9;border-radius:2px;flex:1}.gcc__sel-item__drag{width:20px;flex-shrink:0;color:#ced4da;cursor:grab;font-size:11px;display:flex;align-items:center;justify-content:center}.gcc__sel-item__drag:hover{color:#4465c9}.gcc__sel-item__drag:active{cursor:grabbing}.gcc__sel-item__pos{width:22px;flex-shrink:0;font-size:9px;color:#6c757d;text-align:center}.gcc__sel-item__code{width:150px;flex-shrink:0;display:flex;flex-direction:column;overflow:hidden;padding-left:2px}.gcc__sel-item__code--cf .gcc__sel-item__name{color:#6b7fd4}.gcc__sel-item__name{font-family:monospace;font-size:10px;font-weight:600;color:#4465c9;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gcc__sel-item__label{flex:1;min-width:0;height:22px;padding:0 4px;border:1px solid transparent;border-radius:3px;font-size:11px;color:#343a40;background:transparent;outline:none;transition:border-color .1s,background .1s}.gcc__sel-item__label::placeholder{color:#6c757d;font-style:italic}.gcc__sel-item__label:hover{border-color:#d1d8de;background:#f8f9fa}.gcc__sel-item__label:focus{border-color:#4465c9;background:#fff}.gcc__sel-item__remove{width:22px;flex-shrink:0;background:none;border:none;color:#adb5bd;cursor:pointer;font-size:11px;padding:0;text-align:center;transition:color .1s}.gcc__sel-item__remove:hover{color:#dc3545}.gcc__sel-list.cdk-drop-list-dragging .gcc__sel-item:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.gcc__flag{width:36px;flex-shrink:0;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0}.gcc__flag input[type=checkbox]{cursor:pointer}.gcc__item-width{width:46px;flex-shrink:0;padding:1px 3px;border:1px solid #ced4da;border-radius:3px;font-size:10px;text-align:right}.gcc__sel-footer{display:flex;align-items:center;justify-content:space-between;padding:.4rem .75rem;background:#f8f9fa;border-top:1px solid #e9ecef;flex-shrink:0}.gcc__sel-footer__info{font-size:.75rem;color:#6c757d;font-style:italic}.gcc__hint{display:flex;align-items:center;justify-content:center;flex:1;color:#6c757d;font-style:italic;font-size:.85rem}\n", ".home-page{font-family:Open sans,sans-serif;background:#fff;-webkit-font-smoothing:antialiased;height:100%;width:100%;padding:16px}.main-container{margin:0 50px}.main-container-modal{width:calc(100% - 50px);margin:10px 25px 0}.moyen-titre{font-weight:700;font-size:24px;color:#4d5a81;margin:8px 0;border-bottom:solid 1px #DBE4FF}.grand-titre{font-weight:700;font-size:28px;color:#4d5a81;margin:0 0 8px}.petit-titre{font-weight:700;font-size:16px;color:#4d5a81;margin:0 0 8px}.petit-titre.underlined{border-bottom:solid 1px #4D5A81}.paragraph{padding:0 15px}.paragraph-highlight{padding:5px 15px 0 12px;border-left:5px solid #8EA7F8;border-bottom:1px solid #DBE4FF;border-top:1px solid #DBE4FF;border-right:1px solid #DBE4FF;background-color:#f7faff}.highlight{background-color:#f7faff;border:1px solid #DBE4FF;border-radius:5px;padding:15px;color:#3c5dc4;margin:0 0 16px}.highlight p{margin-bottom:0}.highlight:before{position:relative;display:block;float:left;width:24px;height:24px;content:\" \";background-size:24px 24px;-webkit-background-size:24px 24px;background-image:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"53.294\" height=\"50.629\" viewBox=\"0 0 53.294 50.629\">%0D%0A <path id=\"allerg\\e8ne\" d=\"M830.494,25.793l-5.814,6.783.727,8.963-8.721,1.938-4.6,7.752L803.847,47.6l-8.236,3.634-4.6-7.51-8.721-1.938.727-8.963L777.2,26.035l5.814-6.783-.727-8.963,8.721-1.938L795.61.6l8.236,3.634L812.083.6l4.6,7.752,8.721,1.938-.727,8.963Zm-24.467,2.422V13.681h-4.845V28.216Zm0,9.69V33.06h-4.845v4.845Z\" transform=\"translate(-777.2 -0.6)\"/>%0D%0A</svg>%0D%0A');background-repeat:no-repeat;margin:0 8px 24px 0;filter:invert(31%) sepia(51%) saturate(1323%) hue-rotate(199deg) brightness(99%) contrast(94%)}.notification{background-color:#dbe4ff;border:1px solid #C4D0F9;border-radius:5px;color:#4d5a81;margin:16px;padding:5px 15px;text-align:justify}.notification:before{position:relative;display:block;float:left;width:24px;height:24px;content:\" \";background-size:24px 24px;-webkit-background-size:24px 24px;background-image:url('data:image/svg+xml,<svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"fas\" data-icon=\"info-circle\" class=\"svg-inline--fa fa-info-circle fa-w-16\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\"></path></svg>');background-repeat:no-repeat;margin:0 8px 0 0;filter:invert(31%) sepia(8%) saturate(2329%) hue-rotate(188deg) brightness(103%) contrast(85%)}.notification-text{padding:0 15px 0 30px;font-size:16px}.propertyGridform{height:100%;width:100%}.property-grid-tabset{height:100%}.property-grid-tab{height:100%;width:100%;padding:5px}.property-row-center{padding-top:21px}.property-section-content{display:grid;grid-template-columns:repeat(auto-fit,minmax(225px,1fr));align-items:flex-start;align-content:flex-start;gap:10px;margin:0 10px}.property-section-container{display:flex;flex-direction:column;background:#f7faff;border-radius:5px;border:1px solid #C1D0FD;padding-bottom:10px}.property-section-title{display:block;font-size:14px;background:#f7faff;border-bottom:none;padding:2px 0;margin:10px;line-height:24px;font-weight:700;border-bottom:solid 1px #C1D0FD;color:#4d5a81}.property-container{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:10px;padding:5px;height:100%;overflow:auto}.property-row{display:flex;flex-wrap:wrap;align-items:center;flex:25%;gap:10px}.property-label{color:#4465c9}.property-label span{padding-top:5px;display:inline-block;margin-right:5px}.property-label.invalid{color:red}.property-input{flex:2;min-width:200px}.checkbox-container{display:flex;align-items:center;gap:5px}.validation-error{color:red;font-size:.9rem}alg-presentation-profile-editor{display:block;height:100%}.pp-editor{height:100%}.pp-editor alg-tabset{display:block;height:100%}.pp-editor-tab{display:block;height:100%}.pp-editor-properties{height:100%;overflow:auto}.pp-editor-columns.gcc{padding:10px}.pp-editor-columns.gcc .gcc__panels{flex:1;min-height:0;border:1px solid #e9ecef}.pp-editor-columns.gcc{container-type:inline-size}.pp-editor-columns.gcc .gcc__browse,.pp-editor-columns.gcc .gcc__selection{flex:1 1 0;min-width:0;min-height:0}.pp-editor-columns.gcc .gcc__browse-row{cursor:pointer}@container (max-width: 700px){.pp-editor-columns .gcc__panels{flex-direction:column}.pp-editor-columns .gcc__browse{border-right:none;border-bottom:1px solid #e9ecef}}.pp-editor-add{width:28px;text-align:center;color:#999}.pp-editor-add-all{flex:none;margin-left:8px;padding:2px 8px;border:1px solid #ced4da;border-radius:3px;background:#fff;font-size:11px;cursor:pointer}.pp-editor-add-all:disabled{opacity:.5;cursor:default}.gcc__sel-legend__display{flex:none;width:112px;margin:0 4px;text-align:center}.pp-display{flex:none;display:inline-flex;align-items:center;gap:2px;width:112px;margin:0 4px}.pp-display__badge{flex:1;min-width:0;display:inline-flex;align-items:center;gap:4px;padding:1px 6px;border:1px solid #c5d3f0;border-radius:10px;background:#eef3fc;color:#35a;font-size:11px;white-space:nowrap;cursor:pointer}.pp-display__badge .fa{width:12px;text-align:center}.pp-display__badge--default{border-style:dashed;background:transparent;color:#999}.pp-display__text{overflow:hidden;text-overflow:ellipsis}.pp-display__edit{flex:none;width:22px;height:22px;padding:0;border:none;border-radius:3px;background:transparent;color:#777;cursor:pointer}.pp-display__edit:hover{background:#e9ecef;color:#333}\n"],
20455
20930
  dependencies: [
20456
20931
  {
20457
20932
  kind: "directive",
@@ -20623,14 +21098,15 @@ i0.ɵɵngDeclareClassMetadata({
20623
21098
  encapsulation: ViewEncapsulation.None,
20624
21099
  changeDetection: ChangeDetectionStrategy.Eager,
20625
21100
  standalone: false,
20626
- template: "<div class=\"pp-editor\">\r\n @if (entity) {\r\n <alg-tabset [showNavs]=\"true\" [pills]=\"false\" (onSelect)=\"activeTab = $event\">\r\n\r\n <!--Propriétés : table, libellé, finalité et portée du profil, avec les composants des formulaires-->\r\n <alg-tab title=\"Propriétés\" [active]=\"activeTab === 0\" [class.pp-editor-tab]=\"activeTab === 0\">\r\n <div class=\"property-container pp-editor-properties\">\r\n @for (section of sections; track section.Name) {\r\n <div class=\"property-section-container\">\r\n <div class=\"property-section-title\">{{ section.Name }}</div>\r\n <div class=\"property-section-content\">\r\n @for (field of section.FieldViewModels; track field.PropertyName) {\r\n <div class=\"property-row\" [hidden]=\"isFieldHidden(field)\">\r\n <alg-field [field]=\"field\" [form]=\"form\" [readonly]=\"isFieldReadonly(field)\"\r\n (propertyChanged)=\"onPropertyChanged($event)\">\r\n </alg-field>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </alg-tab>\r\n\r\n <!--Colonnes : colonnes affichées par la grille, leur ordre et leurs libellés-->\r\n <alg-tab title=\"Colonnes\" [active]=\"activeTab === 1\" [class.pp-editor-tab]=\"activeTab === 1\">\r\n <div class=\"gcc pp-editor-columns\">\r\n <div *ngIf=\"isLoading\" class=\"gcc__loading\">\r\n <span class=\"gcc__spinner-icon fa fa-circle-o-notch fa-spin\"></span>\r\n Chargement des colonnes…\r\n </div>\r\n <div *ngIf=\"!isLoading && allItems.length === 0 && orderedSelection.length === 0\" class=\"gcc__hint\">\r\n Choisissez la table du profil dans l'onglet « Propriétés ».\r\n </div>\r\n <ng-container *ngIf=\"!isLoading && (allItems.length > 0 || orderedSelection.length > 0)\">\r\n <div class=\"gcc__panels\">\r\n\r\n <!-- ── Colonnes disponibles : celles de la table qui ne sont pas affichées ── -->\r\n <div class=\"gcc__browse\">\r\n <div class=\"gcc__panel-hd\">\r\n <span class=\"gcc__panel-label\">Colonnes disponibles</span>\r\n <span class=\"gcc__badge\">{{ filteredItems.length }}</span>\r\n <input class=\"gcc__search\" type=\"text\" placeholder=\"Rechercher…\"\r\n [(ngModel)]=\"searchText\" (ngModelChange)=\"onSearch()\">\r\n <button *ngIf=\"!readonly\" class=\"pp-editor-add-all\" type=\"button\" [disabled]=\"filteredItems.length === 0\"\r\n (click)=\"addAll()\" title=\"Afficher toutes les colonnes listées\">Tout ajouter</button>\r\n </div>\r\n\r\n <div class=\"gcc__table-wrap\">\r\n <table class=\"gcc__browse-table\">\r\n <tbody>\r\n <tr *ngFor=\"let item of filteredItems\"\r\n class=\"gcc__browse-row\"\r\n [class.gcc__browse-row--custom]=\"item.ColumnSourceType === 2\"\r\n title=\"Afficher cette colonne\"\r\n (click)=\"addItem(item)\">\r\n <td class=\"gcc__col-name\">\r\n <div class=\"gcc__col-key\">{{ item.ColumnKey }}</div>\r\n <div *ngIf=\"item.Label && item.Label !== item.ColumnKey\" class=\"gcc__sub\">{{ item.Label }}</div>\r\n </td>\r\n <td class=\"pp-editor-add\"><i *ngIf=\"!readonly\" class=\"fa fa-plus\"></i></td>\r\n </tr>\r\n <tr *ngIf=\"filteredItems.length === 0\">\r\n <td colspan=\"2\" class=\"gcc__browse-empty\">\r\n {{ searchText ? 'Aucune colonne trouvée' : 'Toutes les colonnes sont affichées' }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n <!-- ── Panel 4: Ordered selection with admin flags ────────────── -->\r\n <div class=\"gcc__selection\">\r\n <div class=\"gcc__panel-hd\">\r\n <span class=\"gcc__panel-label\">Colonnes affichées</span>\r\n <span *ngIf=\"selectedCount > 0\" class=\"gcc__badge gcc__badge--primary\">{{ selectedCount }}</span>\r\n </div>\r\n\r\n <div *ngIf=\"orderedSelection.length > 0\" class=\"gcc__sel-legend\">\r\n <span class=\"gcc__sel-legend__drag\"></span>\r\n <span class=\"gcc__sel-legend__pos\">#</span>\r\n <span class=\"gcc__sel-legend__code\">Colonne</span>\r\n <span class=\"gcc__sel-legend__label\">Étiquette</span>\r\n <ng-container *ngIf=\"isPerimeter\">\r\n <span class=\"gcc__sel-legend__flag\">Aut.</span>\r\n </ng-container>\r\n <span class=\"gcc__sel-legend__flag\">Ver.</span>\r\n <span class=\"gcc__sel-legend__remove\"></span>\r\n </div>\r\n\r\n <div *ngIf=\"orderedSelection.length === 0\" class=\"gcc__sel-empty\">\r\n <span class=\"fa fa-columns gcc__sel-empty__icon\"></span>\r\n <p>Choisissez des colonnes parmi les colonnes disponibles</p>\r\n </div>\r\n\r\n <div *ngIf=\"orderedSelection.length > 0\"\r\n class=\"gcc__sel-list\"\r\n cdkDropList\r\n [cdkDropListData]=\"orderedSelection\"\r\n (cdkDropListDropped)=\"onDrop($event)\">\r\n\r\n <div *ngFor=\"let item of orderedSelection; let i = index\"\r\n class=\"gcc__sel-item\"\r\n cdkDrag [cdkDragDisabled]=\"readonly\"\r\n [cdkDragData]=\"item\">\r\n\r\n <div class=\"gcc__sel-item__placeholder\" *cdkDragPlaceholder></div>\r\n\r\n <span class=\"gcc__sel-item__drag\" cdkDragHandle>\r\n <i class=\"fa fa-bars\"></i>\r\n </span>\r\n\r\n <span class=\"gcc__sel-item__pos\">{{ i + 1 }}</span>\r\n\r\n <span class=\"gcc__sel-item__code\"\r\n [class.gcc__sel-item__code--cf]=\"item.ColumnSourceType === 2\"\r\n [title]=\"item.ColumnKey\">\r\n <span class=\"gcc__sel-item__name\">{{ item.ColumnKey }}</span>\r\n <span *ngIf=\"getCatalogLabel(item) !== item.ColumnKey\" class=\"gcc__sub\">{{ getCatalogLabel(item) }}</span>\r\n </span>\r\n\r\n <input class=\"gcc__sel-item__label\" type=\"text\"\r\n [placeholder]=\"getCatalogLabel(item)\"\r\n [(ngModel)]=\"item.Label\" (ngModelChange)=\"onColumnsChanged()\" [disabled]=\"readonly\"\r\n (click)=\"$event.stopPropagation()\"\r\n title=\"Étiquette personnalisée\">\r\n\r\n <!-- Perimeter scope: allowed flag -->\r\n <ng-container *ngIf=\"isPerimeter\">\r\n <label class=\"gcc__flag\" (click)=\"$event.stopPropagation()\">\r\n <input type=\"checkbox\" [(ngModel)]=\"item.IsAllowed\" (ngModelChange)=\"onColumnsChanged()\" [disabled]=\"readonly\" title=\"Autorisé\">\r\n </label>\r\n </ng-container>\r\n\r\n <!-- Always: locked flag -->\r\n <label class=\"gcc__flag\" (click)=\"$event.stopPropagation()\">\r\n <input type=\"checkbox\" [(ngModel)]=\"item.IsLocked\" (ngModelChange)=\"onColumnsChanged()\" [disabled]=\"readonly\" title=\"Verrouillé\">\r\n </label>\r\n\r\n <button class=\"gcc__sel-item__remove\" type=\"button\"\r\n (click)=\"removeFromSelection(item); $event.stopPropagation()\"\r\n title=\"Retirer\">&#x2715;</button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Pied de la sélection -->\r\n <div class=\"gcc__sel-footer\">\r\n <span class=\"gcc__sel-footer__info\">\r\n <ng-container *ngIf=\"selectedCount > 0\">\r\n {{ selectedCount }} colonne(s) — glissez pour réordonner\r\n </ng-container>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n </div><!-- /.gcc__panels -->\r\n </ng-container>\r\n </div>\r\n </alg-tab>\r\n </alg-tabset>\r\n }\r\n</div>\r\n",
20627
- styles: ["alg-pp-column{display:block;height:100%}.gcc{display:flex;flex-direction:column;height:100%;overflow:hidden;padding:10px;box-sizing:border-box}.gcc__form{flex:1;min-height:0;display:flex;flex-direction:column;background:#fff}.gcc__tabs{display:block;flex:none}.gcc__tabs .tabset-content{display:none}.gcc__tabs .nav-tabs-custom{margin-bottom:0;box-shadow:none}.gcc__content{flex:1;min-height:0;display:flex;flex-direction:column;gap:.75rem;padding:15px;overflow:hidden}.gcc__buttons{flex:none;margin-right:0;padding-bottom:0}.gcc__buttons .btn{margin-left:8px}.gcc__toolbar{display:flex;flex-wrap:wrap;align-items:flex-end;gap:.75rem;flex-shrink:0}.gcc__field{display:flex;flex-direction:column;gap:.25rem}.gcc__field label{font-size:.75rem;font-weight:600;color:#6c757d}.gcc__field input,.gcc__field select{min-width:9rem;padding:.35rem .5rem;border:1px solid #ced4da;border-radius:.25rem;font-size:.85rem}.gcc__message{padding:.5rem .75rem;background:#eef3f8;border-left:3px solid #4465C9;border-radius:.25rem;font-size:.85rem;flex-shrink:0}.gcc__body{flex:1;display:flex;gap:0;overflow:hidden;min-height:0;border:1px solid #e9ecef;border-radius:.25rem;background:#fff}.gcc__panel-hd{display:flex;align-items:center;justify-content:space-between;padding:.4rem .75rem;background:#f8f9fa;border-bottom:1px solid #e9ecef;flex-shrink:0}.gcc__panel-title{font-size:.8rem;font-weight:600;display:flex;align-items:center;gap:6px}.gcc__panel-label{font-size:.75rem;font-weight:600;color:#495057}.gcc__count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:16px;padding:0 5px;background:#4465c91f;color:#4465c9;border-radius:20px;font-size:10px;font-weight:700}.gcc__badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:16px;padding:0 5px;background:#4465c91a;color:#4465c9;border-radius:20px;font-size:10px;font-weight:700}.gcc__badge--primary{background:#4465c9;color:#fff}.gcc__muted{color:#6c757d;font-size:.8rem}.gcc__fw-normal{font-weight:400}.gcc__configs{display:flex;flex-direction:column;flex:0 0 220px;border-right:1px solid #e9ecef;overflow:hidden}.gcc__list-scroll{flex:1;overflow:auto}.gcc__table{width:100%;border-collapse:collapse}.gcc__table th,.gcc__table td{padding:.35rem .6rem;border-bottom:1px solid #e9ecef;text-align:left;font-size:.78rem}.gcc__table th{font-weight:600;color:#495057;background:#f8f9fa;position:sticky;top:0;z-index:1}.gcc__config-row{cursor:pointer;transition:background .1s}.gcc__config-row:hover{background:#4465c90a}.gcc__config-row--selected{background:#4465c914;border-left:3px solid #4465C9}.gcc__config-row--selected td:first-child{padding-left:calc(.6rem - 3px)}.gcc__key{font-family:monospace;font-weight:600;color:#4465c9;font-size:.78rem}.gcc__sub{font-size:.7rem;font-weight:400;color:#6c757d;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gcc__scope-badge{display:inline-block;padding:1px 5px;border-radius:20px;background:#4465c91a;color:#4465c9;font-size:9px;font-weight:700;text-transform:uppercase}.gcc__actions-cell{text-align:right;width:28px}.gcc__del-btn{background:none;border:none;color:#adb5bd;cursor:pointer;padding:2px 4px;border-radius:3px;font-size:.72rem;transition:color .1s}.gcc__del-btn:hover{color:#dc3545}.gcc__spinner{display:flex;align-items:center;gap:8px;padding:1rem .75rem;color:#6c757d;font-size:.8rem}.gcc__empty{padding:1.25rem .75rem;color:#6c757d;font-style:italic;font-size:.8rem}.gcc__editor{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.gcc__editor-hd{display:flex;align-items:center;padding:.4rem .75rem;background:#f8f9fa;border-bottom:1px solid #e9ecef;flex-shrink:0}.gcc__loading{display:flex;align-items:center;gap:8px;padding:1.5rem 1rem;color:#6c757d;font-size:.85rem;flex-shrink:0}.gcc__spinner-icon{font-size:1rem}.gcc__panels{flex:1;display:flex;overflow:hidden;min-height:0}.gcc__groups{display:flex;flex-direction:column;flex:0 0 160px;border-right:1px solid #e9ecef;overflow:hidden}.gcc__group-list{list-style:none;margin:0;padding:0;flex:1;overflow-y:auto}.gcc__group-item{display:flex;align-items:center;justify-content:space-between;padding:.4rem .6rem;cursor:pointer;font-size:.78rem;border-bottom:1px solid #e9ecef;transition:background .1s}.gcc__group-item:hover{background:#4465c90a}.gcc__group-item--active{background:#4465c914;font-weight:600;color:#4465c9}.gcc__group-item--standard .gcc__group-item__name{color:#4465c9}.gcc__group-item--custom .gcc__group-item__name{color:#6b7fd4}.gcc__group-item__name{flex:1}.gcc__group-meta{display:flex;align-items:center;gap:3px}.gcc__browse{display:flex;flex-direction:column;flex:1;border-right:1px solid #e9ecef;overflow:hidden;min-width:0}.gcc__search{height:26px;padding:0 .5rem;border:1px solid #ced4da;border-radius:.2rem;font-size:.78rem;width:140px}.gcc__table-wrap{flex:1;overflow:auto}.gcc__table-wrap::-webkit-scrollbar{width:5px}.gcc__table-wrap::-webkit-scrollbar-track{background:transparent}.gcc__table-wrap::-webkit-scrollbar-thumb{background:#e9ecef;border-radius:3px}.gcc__browse-table{width:100%;border-collapse:collapse}.gcc__browse-table th,.gcc__browse-table td{padding:.3rem .5rem;border-bottom:1px solid #e9ecef;text-align:left;font-size:.78rem}.gcc__browse-table th{font-weight:600;color:#495057;background:#f8f9fa;position:sticky;top:0;z-index:1}.gcc__browse-row{cursor:pointer;transition:background .1s}.gcc__browse-row:hover{background:#4465c90a}.gcc__browse-row--selected{background:#4465c914}.gcc__browse-row--custom .gcc__col-key{color:#6b7fd4}.gcc__col-check{width:28px;text-align:center}.gcc__col-key{font-family:monospace;font-size:11px;font-weight:600;color:#4465c9}.gcc__browse-empty{padding:1rem .75rem;color:#6c757d;font-style:italic;font-size:.78rem}.gcc__selection{display:flex;flex-direction:column;flex:0 0 380px;overflow:hidden}.gcc__sel-legend{display:flex;align-items:center;padding:3px .5rem;background:#f8f9fa;border-bottom:1px solid #e9ecef;font-size:9px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:#6c757d;flex-shrink:0;gap:0}.gcc__sel-legend__drag{width:20px;flex-shrink:0}.gcc__sel-legend__pos{width:22px;flex-shrink:0;text-align:center}.gcc__sel-legend__code{width:150px;flex-shrink:0;padding-left:2px}.gcc__sel-legend__label{flex:1;min-width:0}.gcc__sel-legend__flag{width:36px;text-align:center;flex-shrink:0}.gcc__sel-legend__width{width:50px;flex-shrink:0;padding-left:2px}.gcc__sel-legend__remove{width:22px;flex-shrink:0}.gcc__sel-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;color:#6c757d;gap:.5rem;font-size:.8rem}.gcc__sel-empty__icon{font-size:2rem;opacity:.3}.gcc__sel-empty p{margin:0}.gcc__sel-list{flex:1;overflow-y:auto}.gcc__sel-list::-webkit-scrollbar{width:4px}.gcc__sel-list::-webkit-scrollbar-track{background:transparent}.gcc__sel-list::-webkit-scrollbar-thumb{background:#e9ecef;border-radius:3px}.gcc__sel-item{display:flex;align-items:center;padding:4px .5rem;border-bottom:1px solid #e9ecef;background:#fff;-webkit-user-select:none;user-select:none;gap:0;transition:background .1s}.gcc__sel-item:hover{background:#4465c908}.gcc__sel-item.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.gcc__sel-item__placeholder{height:32px;background:#4465c90f;border:1px dashed #4465C9;border-radius:2px;flex:1}.gcc__sel-item__drag{width:20px;flex-shrink:0;color:#ced4da;cursor:grab;font-size:11px;display:flex;align-items:center;justify-content:center}.gcc__sel-item__drag:hover{color:#4465c9}.gcc__sel-item__drag:active{cursor:grabbing}.gcc__sel-item__pos{width:22px;flex-shrink:0;font-size:9px;color:#6c757d;text-align:center}.gcc__sel-item__code{width:150px;flex-shrink:0;display:flex;flex-direction:column;overflow:hidden;padding-left:2px}.gcc__sel-item__code--cf .gcc__sel-item__name{color:#6b7fd4}.gcc__sel-item__name{font-family:monospace;font-size:10px;font-weight:600;color:#4465c9;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gcc__sel-item__label{flex:1;min-width:0;height:22px;padding:0 4px;border:1px solid transparent;border-radius:3px;font-size:11px;color:#343a40;background:transparent;outline:none;transition:border-color .1s,background .1s}.gcc__sel-item__label::placeholder{color:#6c757d;font-style:italic}.gcc__sel-item__label:hover{border-color:#d1d8de;background:#f8f9fa}.gcc__sel-item__label:focus{border-color:#4465c9;background:#fff}.gcc__sel-item__remove{width:22px;flex-shrink:0;background:none;border:none;color:#adb5bd;cursor:pointer;font-size:11px;padding:0;text-align:center;transition:color .1s}.gcc__sel-item__remove:hover{color:#dc3545}.gcc__sel-list.cdk-drop-list-dragging .gcc__sel-item:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.gcc__flag{width:36px;flex-shrink:0;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0}.gcc__flag input[type=checkbox]{cursor:pointer}.gcc__item-width{width:46px;flex-shrink:0;padding:1px 3px;border:1px solid #ced4da;border-radius:3px;font-size:10px;text-align:right}.gcc__sel-footer{display:flex;align-items:center;justify-content:space-between;padding:.4rem .75rem;background:#f8f9fa;border-top:1px solid #e9ecef;flex-shrink:0}.gcc__sel-footer__info{font-size:.75rem;color:#6c757d;font-style:italic}.gcc__hint{display:flex;align-items:center;justify-content:center;flex:1;color:#6c757d;font-style:italic;font-size:.85rem}\n", ".home-page{font-family:Open sans,sans-serif;background:#fff;-webkit-font-smoothing:antialiased;height:100%;width:100%;padding:16px}.main-container{margin:0 50px}.main-container-modal{width:calc(100% - 50px);margin:10px 25px 0}.moyen-titre{font-weight:700;font-size:24px;color:#4d5a81;margin:8px 0;border-bottom:solid 1px #DBE4FF}.grand-titre{font-weight:700;font-size:28px;color:#4d5a81;margin:0 0 8px}.petit-titre{font-weight:700;font-size:16px;color:#4d5a81;margin:0 0 8px}.petit-titre.underlined{border-bottom:solid 1px #4D5A81}.paragraph{padding:0 15px}.paragraph-highlight{padding:5px 15px 0 12px;border-left:5px solid #8EA7F8;border-bottom:1px solid #DBE4FF;border-top:1px solid #DBE4FF;border-right:1px solid #DBE4FF;background-color:#f7faff}.highlight{background-color:#f7faff;border:1px solid #DBE4FF;border-radius:5px;padding:15px;color:#3c5dc4;margin:0 0 16px}.highlight p{margin-bottom:0}.highlight:before{position:relative;display:block;float:left;width:24px;height:24px;content:\" \";background-size:24px 24px;-webkit-background-size:24px 24px;background-image:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"53.294\" height=\"50.629\" viewBox=\"0 0 53.294 50.629\">%0D%0A <path id=\"allerg\\e8ne\" d=\"M830.494,25.793l-5.814,6.783.727,8.963-8.721,1.938-4.6,7.752L803.847,47.6l-8.236,3.634-4.6-7.51-8.721-1.938.727-8.963L777.2,26.035l5.814-6.783-.727-8.963,8.721-1.938L795.61.6l8.236,3.634L812.083.6l4.6,7.752,8.721,1.938-.727,8.963Zm-24.467,2.422V13.681h-4.845V28.216Zm0,9.69V33.06h-4.845v4.845Z\" transform=\"translate(-777.2 -0.6)\"/>%0D%0A</svg>%0D%0A');background-repeat:no-repeat;margin:0 8px 24px 0;filter:invert(31%) sepia(51%) saturate(1323%) hue-rotate(199deg) brightness(99%) contrast(94%)}.notification{background-color:#dbe4ff;border:1px solid #C4D0F9;border-radius:5px;color:#4d5a81;margin:16px;padding:5px 15px;text-align:justify}.notification:before{position:relative;display:block;float:left;width:24px;height:24px;content:\" \";background-size:24px 24px;-webkit-background-size:24px 24px;background-image:url('data:image/svg+xml,<svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"fas\" data-icon=\"info-circle\" class=\"svg-inline--fa fa-info-circle fa-w-16\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\"></path></svg>');background-repeat:no-repeat;margin:0 8px 0 0;filter:invert(31%) sepia(8%) saturate(2329%) hue-rotate(188deg) brightness(103%) contrast(85%)}.notification-text{padding:0 15px 0 30px;font-size:16px}.propertyGridform{height:100%;width:100%}.property-grid-tabset{height:100%}.property-grid-tab{height:100%;width:100%;padding:5px}.property-row-center{padding-top:21px}.property-section-content{display:grid;grid-template-columns:repeat(auto-fit,minmax(225px,1fr));align-items:flex-start;align-content:flex-start;gap:10px;margin:0 10px}.property-section-container{display:flex;flex-direction:column;background:#f7faff;border-radius:5px;border:1px solid #C1D0FD;padding-bottom:10px}.property-section-title{display:block;font-size:14px;background:#f7faff;border-bottom:none;padding:2px 0;margin:10px;line-height:24px;font-weight:700;border-bottom:solid 1px #C1D0FD;color:#4d5a81}.property-container{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:10px;padding:5px;height:100%;overflow:auto}.property-row{display:flex;flex-wrap:wrap;align-items:center;flex:25%;gap:10px}.property-label{color:#4465c9}.property-label span{padding-top:5px;display:inline-block;margin-right:5px}.property-label.invalid{color:red}.property-input{flex:2;min-width:200px}.checkbox-container{display:flex;align-items:center;gap:5px}.validation-error{color:red;font-size:.9rem}alg-presentation-profile-editor{display:block;height:100%}.pp-editor{height:100%}.pp-editor alg-tabset{display:block;height:100%}.pp-editor-tab{display:block;height:100%}.pp-editor-properties{height:100%;overflow:auto}.pp-editor-columns.gcc{padding:10px}.pp-editor-columns.gcc .gcc__panels{flex:1;min-height:0;border:1px solid #e9ecef}.pp-editor-columns.gcc{container-type:inline-size}.pp-editor-columns.gcc .gcc__browse,.pp-editor-columns.gcc .gcc__selection{flex:1 1 0;min-width:0;min-height:0}.pp-editor-columns.gcc .gcc__browse-row{cursor:pointer}@container (max-width: 700px){.pp-editor-columns .gcc__panels{flex-direction:column}.pp-editor-columns .gcc__browse{border-right:none;border-bottom:1px solid #e9ecef}}.pp-editor-add{width:28px;text-align:center;color:#999}.pp-editor-add-all{flex:none;margin-left:8px;padding:2px 8px;border:1px solid #ced4da;border-radius:3px;background:#fff;font-size:11px;cursor:pointer}.pp-editor-add-all:disabled{opacity:.5;cursor:default}\n"]
21101
+ template: "<div class=\"pp-editor\">\r\n @if (entity) {\r\n <alg-tabset [showNavs]=\"true\" [pills]=\"false\" (onSelect)=\"activeTab = $event\">\r\n\r\n <!--Propriétés : table, libellé, finalité et portée du profil, avec les composants des formulaires-->\r\n <alg-tab title=\"Propriétés\" [active]=\"activeTab === 0\" [class.pp-editor-tab]=\"activeTab === 0\">\r\n <div class=\"property-container pp-editor-properties\">\r\n @for (section of sections; track section.Name) {\r\n <div class=\"property-section-container\">\r\n <div class=\"property-section-title\">{{ section.Name }}</div>\r\n <div class=\"property-section-content\">\r\n @for (field of section.FieldViewModels; track field.PropertyName) {\r\n <div class=\"property-row\" [hidden]=\"isFieldHidden(field)\">\r\n <alg-field [field]=\"field\" [form]=\"form\" [readonly]=\"isFieldReadonly(field)\"\r\n (propertyChanged)=\"onPropertyChanged($event)\">\r\n </alg-field>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </alg-tab>\r\n\r\n <!--Colonnes : colonnes affichées par la grille, leur ordre et leurs libellés-->\r\n <alg-tab title=\"Colonnes\" [active]=\"activeTab === 1\" [class.pp-editor-tab]=\"activeTab === 1\">\r\n <div class=\"gcc pp-editor-columns\">\r\n <div *ngIf=\"isLoading\" class=\"gcc__loading\">\r\n <span class=\"gcc__spinner-icon fa fa-circle-o-notch fa-spin\"></span>\r\n Chargement des colonnes…\r\n </div>\r\n <div *ngIf=\"!isLoading && allItems.length === 0 && orderedSelection.length === 0\" class=\"gcc__hint\">\r\n Choisissez la table du profil dans l'onglet « Propriétés ».\r\n </div>\r\n <ng-container *ngIf=\"!isLoading && (allItems.length > 0 || orderedSelection.length > 0)\">\r\n <div class=\"gcc__panels\">\r\n\r\n <!-- ── Colonnes disponibles : celles de la table qui ne sont pas affichées ── -->\r\n <div class=\"gcc__browse\">\r\n <div class=\"gcc__panel-hd\">\r\n <span class=\"gcc__panel-label\">Colonnes disponibles</span>\r\n <span class=\"gcc__badge\">{{ filteredItems.length }}</span>\r\n <input class=\"gcc__search\" type=\"text\" placeholder=\"Rechercher…\"\r\n [(ngModel)]=\"searchText\" (ngModelChange)=\"onSearch()\">\r\n <button *ngIf=\"!readonly\" class=\"pp-editor-add-all\" type=\"button\" [disabled]=\"filteredItems.length === 0\"\r\n (click)=\"addAll()\" title=\"Afficher toutes les colonnes listées\">Tout ajouter</button>\r\n </div>\r\n\r\n <div class=\"gcc__table-wrap\">\r\n <table class=\"gcc__browse-table\">\r\n <tbody>\r\n <tr *ngFor=\"let item of filteredItems\"\r\n class=\"gcc__browse-row\"\r\n [class.gcc__browse-row--custom]=\"item.ColumnSourceType === 2\"\r\n title=\"Afficher cette colonne\"\r\n (click)=\"addItem(item)\">\r\n <td class=\"gcc__col-name\">\r\n <div class=\"gcc__col-key\">{{ item.ColumnKey }}</div>\r\n <div *ngIf=\"item.Label && item.Label !== item.ColumnKey\" class=\"gcc__sub\">{{ item.Label }}</div>\r\n </td>\r\n <td class=\"pp-editor-add\"><i *ngIf=\"!readonly\" class=\"fa fa-plus\"></i></td>\r\n </tr>\r\n <tr *ngIf=\"filteredItems.length === 0\">\r\n <td colspan=\"2\" class=\"gcc__browse-empty\">\r\n {{ searchText ? 'Aucune colonne trouvée' : 'Toutes les colonnes sont affichées' }}\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n <!-- ── Panel 4: Ordered selection with admin flags ────────────── -->\r\n <div class=\"gcc__selection\">\r\n <div class=\"gcc__panel-hd\">\r\n <span class=\"gcc__panel-label\">Colonnes affichées</span>\r\n <span *ngIf=\"selectedCount > 0\" class=\"gcc__badge gcc__badge--primary\">{{ selectedCount }}</span>\r\n </div>\r\n\r\n <div *ngIf=\"orderedSelection.length > 0\" class=\"gcc__sel-legend\">\r\n <span class=\"gcc__sel-legend__drag\"></span>\r\n <span class=\"gcc__sel-legend__pos\">#</span>\r\n <span class=\"gcc__sel-legend__code\">Colonne</span>\r\n <span class=\"gcc__sel-legend__label\">Étiquette</span>\r\n <span class=\"gcc__sel-legend__display\">Affichage</span>\r\n <ng-container *ngIf=\"isPerimeter\">\r\n <span class=\"gcc__sel-legend__flag\">Aut.</span>\r\n </ng-container>\r\n <span class=\"gcc__sel-legend__flag\">Ver.</span>\r\n <span class=\"gcc__sel-legend__remove\"></span>\r\n </div>\r\n\r\n <div *ngIf=\"orderedSelection.length === 0\" class=\"gcc__sel-empty\">\r\n <span class=\"fa fa-columns gcc__sel-empty__icon\"></span>\r\n <p>Choisissez des colonnes parmi les colonnes disponibles</p>\r\n </div>\r\n\r\n <div *ngIf=\"orderedSelection.length > 0\"\r\n class=\"gcc__sel-list\"\r\n cdkDropList\r\n [cdkDropListData]=\"orderedSelection\"\r\n (cdkDropListDropped)=\"onDrop($event)\">\r\n\r\n <div *ngFor=\"let item of orderedSelection; let i = index\"\r\n class=\"gcc__sel-item\"\r\n cdkDrag [cdkDragDisabled]=\"readonly\"\r\n [cdkDragData]=\"item\">\r\n\r\n <div class=\"gcc__sel-item__placeholder\" *cdkDragPlaceholder></div>\r\n\r\n <span class=\"gcc__sel-item__drag\" cdkDragHandle>\r\n <i class=\"fa fa-bars\"></i>\r\n </span>\r\n\r\n <span class=\"gcc__sel-item__pos\">{{ i + 1 }}</span>\r\n\r\n <span class=\"gcc__sel-item__code\"\r\n [class.gcc__sel-item__code--cf]=\"item.ColumnSourceType === 2\"\r\n [title]=\"item.ColumnKey\">\r\n <span class=\"gcc__sel-item__name\">{{ item.ColumnKey }}</span>\r\n <span *ngIf=\"getCatalogLabel(item) !== item.ColumnKey\" class=\"gcc__sub\">{{ getCatalogLabel(item) }}</span>\r\n </span>\r\n\r\n <input class=\"gcc__sel-item__label\" type=\"text\"\r\n [placeholder]=\"getCatalogLabel(item)\"\r\n [(ngModel)]=\"item.Label\" (ngModelChange)=\"onColumnsChanged()\" [disabled]=\"readonly\"\r\n (click)=\"$event.stopPropagation()\"\r\n title=\"Étiquette personnalisée\">\r\n\r\n <!-- Affichage : indicateur du type, ouvre la fenêtre d'édition de la colonne -->\r\n <span class=\"pp-display\" (click)=\"$event.stopPropagation()\">\r\n <button type=\"button\" class=\"pp-display__badge\"\r\n [class.pp-display__badge--default]=\"!getDisplayType(item)\"\r\n [title]=\"describeDisplay(item)\"\r\n (click)=\"openColumn(item)\">\r\n <i class=\"fa fa-{{ getDisplayType(item)?.icon ?? 'magic' }}\"></i>\r\n <span class=\"pp-display__text\">{{ getDisplayType(item)?.short ?? 'Auto' }}</span>\r\n </button>\r\n <button type=\"button\" class=\"pp-display__edit\" title=\"Modifier la colonne (libellé, affichage...)\" (click)=\"openColumn(item)\">\r\n <i class=\"fa fa-sliders\"></i>\r\n </button>\r\n </span>\r\n\r\n <!-- Perimeter scope: allowed flag -->\r\n <ng-container *ngIf=\"isPerimeter\">\r\n <label class=\"gcc__flag\" (click)=\"$event.stopPropagation()\">\r\n <input type=\"checkbox\" [(ngModel)]=\"item.IsAllowed\" (ngModelChange)=\"onColumnsChanged()\" [disabled]=\"readonly\" title=\"Autorisé\">\r\n </label>\r\n </ng-container>\r\n\r\n <!-- Always: locked flag -->\r\n <label class=\"gcc__flag\" (click)=\"$event.stopPropagation()\">\r\n <input type=\"checkbox\" [(ngModel)]=\"item.IsLocked\" (ngModelChange)=\"onColumnsChanged()\" [disabled]=\"readonly\" title=\"Verrouillé\">\r\n </label>\r\n\r\n <button class=\"gcc__sel-item__remove\" type=\"button\"\r\n (click)=\"removeFromSelection(item); $event.stopPropagation()\"\r\n title=\"Retirer\">&#x2715;</button>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Pied de la sélection -->\r\n <div class=\"gcc__sel-footer\">\r\n <span class=\"gcc__sel-footer__info\">\r\n <ng-container *ngIf=\"selectedCount > 0\">\r\n {{ selectedCount }} colonne(s) — glissez pour réordonner\r\n </ng-container>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n </div><!-- /.gcc__panels -->\r\n </ng-container>\r\n </div>\r\n </alg-tab>\r\n </alg-tabset>\r\n }\r\n</div>\r\n",
21102
+ styles: ["alg-pp-column{display:block;height:100%}.gcc{display:flex;flex-direction:column;height:100%;overflow:hidden;padding:10px;box-sizing:border-box}.gcc__form{flex:1;min-height:0;display:flex;flex-direction:column;background:#fff}.gcc__tabs{display:block;flex:none}.gcc__tabs .tabset-content{display:none}.gcc__tabs .nav-tabs-custom{margin-bottom:0;box-shadow:none}.gcc__content{flex:1;min-height:0;display:flex;flex-direction:column;gap:.75rem;padding:15px;overflow:hidden}.gcc__buttons{flex:none;margin-right:0;padding-bottom:0}.gcc__buttons .btn{margin-left:8px}.gcc__toolbar{display:flex;flex-wrap:wrap;align-items:flex-end;gap:.75rem;flex-shrink:0}.gcc__field{display:flex;flex-direction:column;gap:.25rem}.gcc__field label{font-size:.75rem;font-weight:600;color:#6c757d}.gcc__field input,.gcc__field select{min-width:9rem;padding:.35rem .5rem;border:1px solid #ced4da;border-radius:.25rem;font-size:.85rem}.gcc__message{padding:.5rem .75rem;background:#eef3f8;border-left:3px solid #4465C9;border-radius:.25rem;font-size:.85rem;flex-shrink:0}.gcc__body{flex:1;display:flex;gap:0;overflow:hidden;min-height:0;border:1px solid #e9ecef;border-radius:.25rem;background:#fff}.gcc__panel-hd{display:flex;align-items:center;justify-content:space-between;padding:.4rem .75rem;background:#f8f9fa;border-bottom:1px solid #e9ecef;flex-shrink:0}.gcc__panel-title{font-size:.8rem;font-weight:600;display:flex;align-items:center;gap:6px}.gcc__panel-label{font-size:.75rem;font-weight:600;color:#495057}.gcc__count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:16px;padding:0 5px;background:#4465c91f;color:#4465c9;border-radius:20px;font-size:10px;font-weight:700}.gcc__badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:16px;padding:0 5px;background:#4465c91a;color:#4465c9;border-radius:20px;font-size:10px;font-weight:700}.gcc__badge--primary{background:#4465c9;color:#fff}.gcc__muted{color:#6c757d;font-size:.8rem}.gcc__fw-normal{font-weight:400}.gcc__configs{display:flex;flex-direction:column;flex:0 0 220px;border-right:1px solid #e9ecef;overflow:hidden}.gcc__list-scroll{flex:1;overflow:auto}.gcc__table{width:100%;border-collapse:collapse}.gcc__table th,.gcc__table td{padding:.35rem .6rem;border-bottom:1px solid #e9ecef;text-align:left;font-size:.78rem}.gcc__table th{font-weight:600;color:#495057;background:#f8f9fa;position:sticky;top:0;z-index:1}.gcc__config-row{cursor:pointer;transition:background .1s}.gcc__config-row:hover{background:#4465c90a}.gcc__config-row--selected{background:#4465c914;border-left:3px solid #4465C9}.gcc__config-row--selected td:first-child{padding-left:calc(.6rem - 3px)}.gcc__key{font-family:monospace;font-weight:600;color:#4465c9;font-size:.78rem}.gcc__sub{font-size:.7rem;font-weight:400;color:#6c757d;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gcc__scope-badge{display:inline-block;padding:1px 5px;border-radius:20px;background:#4465c91a;color:#4465c9;font-size:9px;font-weight:700;text-transform:uppercase}.gcc__actions-cell{text-align:right;width:28px}.gcc__del-btn{background:none;border:none;color:#adb5bd;cursor:pointer;padding:2px 4px;border-radius:3px;font-size:.72rem;transition:color .1s}.gcc__del-btn:hover{color:#dc3545}.gcc__spinner{display:flex;align-items:center;gap:8px;padding:1rem .75rem;color:#6c757d;font-size:.8rem}.gcc__empty{padding:1.25rem .75rem;color:#6c757d;font-style:italic;font-size:.8rem}.gcc__editor{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.gcc__editor-hd{display:flex;align-items:center;padding:.4rem .75rem;background:#f8f9fa;border-bottom:1px solid #e9ecef;flex-shrink:0}.gcc__loading{display:flex;align-items:center;gap:8px;padding:1.5rem 1rem;color:#6c757d;font-size:.85rem;flex-shrink:0}.gcc__spinner-icon{font-size:1rem}.gcc__panels{flex:1;display:flex;overflow:hidden;min-height:0}.gcc__groups{display:flex;flex-direction:column;flex:0 0 160px;border-right:1px solid #e9ecef;overflow:hidden}.gcc__group-list{list-style:none;margin:0;padding:0;flex:1;overflow-y:auto}.gcc__group-item{display:flex;align-items:center;justify-content:space-between;padding:.4rem .6rem;cursor:pointer;font-size:.78rem;border-bottom:1px solid #e9ecef;transition:background .1s}.gcc__group-item:hover{background:#4465c90a}.gcc__group-item--active{background:#4465c914;font-weight:600;color:#4465c9}.gcc__group-item--standard .gcc__group-item__name{color:#4465c9}.gcc__group-item--custom .gcc__group-item__name{color:#6b7fd4}.gcc__group-item__name{flex:1}.gcc__group-meta{display:flex;align-items:center;gap:3px}.gcc__browse{display:flex;flex-direction:column;flex:1;border-right:1px solid #e9ecef;overflow:hidden;min-width:0}.gcc__search{height:26px;padding:0 .5rem;border:1px solid #ced4da;border-radius:.2rem;font-size:.78rem;width:140px}.gcc__table-wrap{flex:1;overflow:auto}.gcc__table-wrap::-webkit-scrollbar{width:5px}.gcc__table-wrap::-webkit-scrollbar-track{background:transparent}.gcc__table-wrap::-webkit-scrollbar-thumb{background:#e9ecef;border-radius:3px}.gcc__browse-table{width:100%;border-collapse:collapse}.gcc__browse-table th,.gcc__browse-table td{padding:.3rem .5rem;border-bottom:1px solid #e9ecef;text-align:left;font-size:.78rem}.gcc__browse-table th{font-weight:600;color:#495057;background:#f8f9fa;position:sticky;top:0;z-index:1}.gcc__browse-row{cursor:pointer;transition:background .1s}.gcc__browse-row:hover{background:#4465c90a}.gcc__browse-row--selected{background:#4465c914}.gcc__browse-row--custom .gcc__col-key{color:#6b7fd4}.gcc__col-check{width:28px;text-align:center}.gcc__col-key{font-family:monospace;font-size:11px;font-weight:600;color:#4465c9}.gcc__browse-empty{padding:1rem .75rem;color:#6c757d;font-style:italic;font-size:.78rem}.gcc__selection{display:flex;flex-direction:column;flex:0 0 380px;overflow:hidden}.gcc__sel-legend{display:flex;align-items:center;padding:3px .5rem;background:#f8f9fa;border-bottom:1px solid #e9ecef;font-size:9px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:#6c757d;flex-shrink:0;gap:0}.gcc__sel-legend__drag{width:20px;flex-shrink:0}.gcc__sel-legend__pos{width:22px;flex-shrink:0;text-align:center}.gcc__sel-legend__code{width:150px;flex-shrink:0;padding-left:2px}.gcc__sel-legend__label{flex:1;min-width:0}.gcc__sel-legend__flag{width:36px;text-align:center;flex-shrink:0}.gcc__sel-legend__width{width:50px;flex-shrink:0;padding-left:2px}.gcc__sel-legend__remove{width:22px;flex-shrink:0}.gcc__sel-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;color:#6c757d;gap:.5rem;font-size:.8rem}.gcc__sel-empty__icon{font-size:2rem;opacity:.3}.gcc__sel-empty p{margin:0}.gcc__sel-list{flex:1;overflow-y:auto}.gcc__sel-list::-webkit-scrollbar{width:4px}.gcc__sel-list::-webkit-scrollbar-track{background:transparent}.gcc__sel-list::-webkit-scrollbar-thumb{background:#e9ecef;border-radius:3px}.gcc__sel-item{display:flex;align-items:center;padding:4px .5rem;border-bottom:1px solid #e9ecef;background:#fff;-webkit-user-select:none;user-select:none;gap:0;transition:background .1s}.gcc__sel-item:hover{background:#4465c908}.gcc__sel-item.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.gcc__sel-item__placeholder{height:32px;background:#4465c90f;border:1px dashed #4465C9;border-radius:2px;flex:1}.gcc__sel-item__drag{width:20px;flex-shrink:0;color:#ced4da;cursor:grab;font-size:11px;display:flex;align-items:center;justify-content:center}.gcc__sel-item__drag:hover{color:#4465c9}.gcc__sel-item__drag:active{cursor:grabbing}.gcc__sel-item__pos{width:22px;flex-shrink:0;font-size:9px;color:#6c757d;text-align:center}.gcc__sel-item__code{width:150px;flex-shrink:0;display:flex;flex-direction:column;overflow:hidden;padding-left:2px}.gcc__sel-item__code--cf .gcc__sel-item__name{color:#6b7fd4}.gcc__sel-item__name{font-family:monospace;font-size:10px;font-weight:600;color:#4465c9;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gcc__sel-item__label{flex:1;min-width:0;height:22px;padding:0 4px;border:1px solid transparent;border-radius:3px;font-size:11px;color:#343a40;background:transparent;outline:none;transition:border-color .1s,background .1s}.gcc__sel-item__label::placeholder{color:#6c757d;font-style:italic}.gcc__sel-item__label:hover{border-color:#d1d8de;background:#f8f9fa}.gcc__sel-item__label:focus{border-color:#4465c9;background:#fff}.gcc__sel-item__remove{width:22px;flex-shrink:0;background:none;border:none;color:#adb5bd;cursor:pointer;font-size:11px;padding:0;text-align:center;transition:color .1s}.gcc__sel-item__remove:hover{color:#dc3545}.gcc__sel-list.cdk-drop-list-dragging .gcc__sel-item:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.gcc__flag{width:36px;flex-shrink:0;display:flex;align-items:center;justify-content:center;cursor:pointer;margin:0}.gcc__flag input[type=checkbox]{cursor:pointer}.gcc__item-width{width:46px;flex-shrink:0;padding:1px 3px;border:1px solid #ced4da;border-radius:3px;font-size:10px;text-align:right}.gcc__sel-footer{display:flex;align-items:center;justify-content:space-between;padding:.4rem .75rem;background:#f8f9fa;border-top:1px solid #e9ecef;flex-shrink:0}.gcc__sel-footer__info{font-size:.75rem;color:#6c757d;font-style:italic}.gcc__hint{display:flex;align-items:center;justify-content:center;flex:1;color:#6c757d;font-style:italic;font-size:.85rem}\n", ".home-page{font-family:Open sans,sans-serif;background:#fff;-webkit-font-smoothing:antialiased;height:100%;width:100%;padding:16px}.main-container{margin:0 50px}.main-container-modal{width:calc(100% - 50px);margin:10px 25px 0}.moyen-titre{font-weight:700;font-size:24px;color:#4d5a81;margin:8px 0;border-bottom:solid 1px #DBE4FF}.grand-titre{font-weight:700;font-size:28px;color:#4d5a81;margin:0 0 8px}.petit-titre{font-weight:700;font-size:16px;color:#4d5a81;margin:0 0 8px}.petit-titre.underlined{border-bottom:solid 1px #4D5A81}.paragraph{padding:0 15px}.paragraph-highlight{padding:5px 15px 0 12px;border-left:5px solid #8EA7F8;border-bottom:1px solid #DBE4FF;border-top:1px solid #DBE4FF;border-right:1px solid #DBE4FF;background-color:#f7faff}.highlight{background-color:#f7faff;border:1px solid #DBE4FF;border-radius:5px;padding:15px;color:#3c5dc4;margin:0 0 16px}.highlight p{margin-bottom:0}.highlight:before{position:relative;display:block;float:left;width:24px;height:24px;content:\" \";background-size:24px 24px;-webkit-background-size:24px 24px;background-image:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"53.294\" height=\"50.629\" viewBox=\"0 0 53.294 50.629\">%0D%0A <path id=\"allerg\\e8ne\" d=\"M830.494,25.793l-5.814,6.783.727,8.963-8.721,1.938-4.6,7.752L803.847,47.6l-8.236,3.634-4.6-7.51-8.721-1.938.727-8.963L777.2,26.035l5.814-6.783-.727-8.963,8.721-1.938L795.61.6l8.236,3.634L812.083.6l4.6,7.752,8.721,1.938-.727,8.963Zm-24.467,2.422V13.681h-4.845V28.216Zm0,9.69V33.06h-4.845v4.845Z\" transform=\"translate(-777.2 -0.6)\"/>%0D%0A</svg>%0D%0A');background-repeat:no-repeat;margin:0 8px 24px 0;filter:invert(31%) sepia(51%) saturate(1323%) hue-rotate(199deg) brightness(99%) contrast(94%)}.notification{background-color:#dbe4ff;border:1px solid #C4D0F9;border-radius:5px;color:#4d5a81;margin:16px;padding:5px 15px;text-align:justify}.notification:before{position:relative;display:block;float:left;width:24px;height:24px;content:\" \";background-size:24px 24px;-webkit-background-size:24px 24px;background-image:url('data:image/svg+xml,<svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"fas\" data-icon=\"info-circle\" class=\"svg-inline--fa fa-info-circle fa-w-16\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"currentColor\" d=\"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\"></path></svg>');background-repeat:no-repeat;margin:0 8px 0 0;filter:invert(31%) sepia(8%) saturate(2329%) hue-rotate(188deg) brightness(103%) contrast(85%)}.notification-text{padding:0 15px 0 30px;font-size:16px}.propertyGridform{height:100%;width:100%}.property-grid-tabset{height:100%}.property-grid-tab{height:100%;width:100%;padding:5px}.property-row-center{padding-top:21px}.property-section-content{display:grid;grid-template-columns:repeat(auto-fit,minmax(225px,1fr));align-items:flex-start;align-content:flex-start;gap:10px;margin:0 10px}.property-section-container{display:flex;flex-direction:column;background:#f7faff;border-radius:5px;border:1px solid #C1D0FD;padding-bottom:10px}.property-section-title{display:block;font-size:14px;background:#f7faff;border-bottom:none;padding:2px 0;margin:10px;line-height:24px;font-weight:700;border-bottom:solid 1px #C1D0FD;color:#4d5a81}.property-container{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:10px;padding:5px;height:100%;overflow:auto}.property-row{display:flex;flex-wrap:wrap;align-items:center;flex:25%;gap:10px}.property-label{color:#4465c9}.property-label span{padding-top:5px;display:inline-block;margin-right:5px}.property-label.invalid{color:red}.property-input{flex:2;min-width:200px}.checkbox-container{display:flex;align-items:center;gap:5px}.validation-error{color:red;font-size:.9rem}alg-presentation-profile-editor{display:block;height:100%}.pp-editor{height:100%}.pp-editor alg-tabset{display:block;height:100%}.pp-editor-tab{display:block;height:100%}.pp-editor-properties{height:100%;overflow:auto}.pp-editor-columns.gcc{padding:10px}.pp-editor-columns.gcc .gcc__panels{flex:1;min-height:0;border:1px solid #e9ecef}.pp-editor-columns.gcc{container-type:inline-size}.pp-editor-columns.gcc .gcc__browse,.pp-editor-columns.gcc .gcc__selection{flex:1 1 0;min-width:0;min-height:0}.pp-editor-columns.gcc .gcc__browse-row{cursor:pointer}@container (max-width: 700px){.pp-editor-columns .gcc__panels{flex-direction:column}.pp-editor-columns .gcc__browse{border-right:none;border-bottom:1px solid #e9ecef}}.pp-editor-add{width:28px;text-align:center;color:#999}.pp-editor-add-all{flex:none;margin-left:8px;padding:2px 8px;border:1px solid #ced4da;border-radius:3px;background:#fff;font-size:11px;cursor:pointer}.pp-editor-add-all:disabled{opacity:.5;cursor:default}.gcc__sel-legend__display{flex:none;width:112px;margin:0 4px;text-align:center}.pp-display{flex:none;display:inline-flex;align-items:center;gap:2px;width:112px;margin:0 4px}.pp-display__badge{flex:1;min-width:0;display:inline-flex;align-items:center;gap:4px;padding:1px 6px;border:1px solid #c5d3f0;border-radius:10px;background:#eef3fc;color:#35a;font-size:11px;white-space:nowrap;cursor:pointer}.pp-display__badge .fa{width:12px;text-align:center}.pp-display__badge--default{border-style:dashed;background:transparent;color:#999}.pp-display__text{overflow:hidden;text-overflow:ellipsis}.pp-display__edit{flex:none;width:22px;height:22px;padding:0;border:none;border-radius:3px;background:transparent;color:#777;cursor:pointer}.pp-display__edit:hover{background:#e9ecef;color:#333}\n"]
20628
21103
  }]
20629
21104
  }],
20630
21105
  ctorParameters: () => [
20631
21106
  { type: i4$2.ApplicationService },
20632
21107
  { type: i4$2.ValidationService },
20633
- { type: i1$3.PresentationProfileItemDataService }
21108
+ { type: i1$3.PresentationProfileItemDataService },
21109
+ { type: i1$2.BsModalService }
20634
21110
  ]
20635
21111
  });
20636
21112
  var BasePresentationProfileComponent = class BasePresentationProfileComponent extends BaseComponent {