@mohamedatia/fly-design-system 1.9.1 → 1.9.3

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, signal, computed, Injectable, inject, ErrorHandler, PLATFORM_ID, Pipe, DOCUMENT, ElementRef, input, output, HostListener, ViewChild, ChangeDetectionStrategy, Component, EventEmitter, DestroyRef, Output, Input, viewChild, ViewEncapsulation, model } from '@angular/core';
2
+ import { InjectionToken, signal, computed, Injectable, inject, ErrorHandler, PLATFORM_ID, Pipe, DOCUMENT, ElementRef, input, output, HostListener, ViewChild, ChangeDetectionStrategy, Component, EventEmitter, DestroyRef, Output, Input, viewChild, effect, ViewEncapsulation, model } from '@angular/core';
3
3
  import { isPlatformBrowser, CommonModule } from '@angular/common';
4
4
  import { Router } from '@angular/router';
5
5
  import { of, ReplaySubject } from 'rxjs';
@@ -1021,12 +1021,28 @@ class FlyImageUploadComponent {
1021
1021
  cropImage = viewChild('cropImage', ...(ngDevMode ? [{ debugName: "cropImage" }] : /* istanbul ignore next */ []));
1022
1022
  cropper = null;
1023
1023
  selectedFile = null;
1024
- previewUrl = computed(() => {
1025
- if (this.localBlob())
1026
- return this.localBlob();
1027
- const id = this.currentImageId();
1028
- return id ? `/api/files/${id}/download` : null;
1029
- }, ...(ngDevMode ? [{ debugName: "previewUrl" }] : /* istanbul ignore next */ []));
1024
+ /** Resolved preview URL — uses blob for local uploads, fetches authenticated for existing images */
1025
+ previewUrl = signal(null, ...(ngDevMode ? [{ debugName: "previewUrl" }] : /* istanbul ignore next */ []));
1026
+ constructor() {
1027
+ // React to currentImageId changes — fetch authenticated blob
1028
+ effect((onCleanup) => {
1029
+ const local = this.localBlob();
1030
+ if (local) {
1031
+ this.previewUrl.set(local);
1032
+ return;
1033
+ }
1034
+ const id = this.currentImageId();
1035
+ if (!id) {
1036
+ this.previewUrl.set(null);
1037
+ return;
1038
+ }
1039
+ const sub = this.http.get(`/api/files/${id}/download`, { responseType: 'blob' }).subscribe({
1040
+ next: (blob) => this.previewUrl.set(URL.createObjectURL(blob)),
1041
+ error: () => this.previewUrl.set(null),
1042
+ });
1043
+ onCleanup(() => sub.unsubscribe());
1044
+ });
1045
+ }
1030
1046
  sizeHint = computed(() => {
1031
1047
  const mb = this.maxSizeBytes() / (1024 * 1024);
1032
1048
  return `Max ${mb}MB`;
@@ -1054,6 +1070,7 @@ class FlyImageUploadComponent {
1054
1070
  }
1055
1071
  removeImage() {
1056
1072
  this.localBlob.set(null);
1073
+ this.previewUrl.set(null);
1057
1074
  this.error.set(null);
1058
1075
  this.removed.emit();
1059
1076
  }
@@ -1245,7 +1262,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1245
1262
  }
1246
1263
  </div>
1247
1264
  `, styles: [".cropper-container{-webkit-touch-callout:none;direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;user-select:none}.cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{inset:0;position:absolute}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:#3399ffbf;overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:\" \";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}\n", ".fly-image-upload{display:flex;flex-direction:column;gap:6px}.fly-image-upload__hidden{display:none}.fly-image-upload__dropzone{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:24px;border:2px dashed var(--separator-primary, #e5e7eb);border-radius:12px;background:var(--fill-quaternary, #f9fafb);cursor:pointer;transition:border-color .15s,background .15s;min-height:120px}.fly-image-upload__dropzone:hover{border-color:var(--accent-primary, #0071e3);background:var(--fill-tertiary, #f3f4f6)}.fly-image-upload__icon{font-size:28px;color:var(--label-tertiary, #9ca3af)}.fly-image-upload__label{font-size:13px;color:var(--label-secondary, #6b7280)}.fly-image-upload__hint{font-size:11px;color:var(--label-tertiary, #9ca3af)}.fly-image-upload__preview{position:relative;border-radius:12px;overflow:hidden}.fly-image-upload__img{display:block;width:100%;max-height:280px;object-fit:cover;border-radius:12px}.fly-image-upload__overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;gap:12px;background:#00000059;opacity:0;transition:opacity .15s}.fly-image-upload__preview:hover .fly-image-upload__overlay{opacity:1}.fly-image-upload__action-btn{width:36px;height:36px;border-radius:50%;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;background:#ffffffe6;color:var(--label-primary, #1f2937);font-size:14px;transition:background .15s}.fly-image-upload__action-btn:hover{background:#fff}.fly-image-upload__action-btn--danger:hover{background:#fee2e2;color:#dc2626}.fly-image-upload__error{font-size:12px;color:var(--system-red, #ef4444)}.fly-image-upload__crop-backdrop{position:fixed;inset:0;z-index:10000;display:flex;align-items:center;justify-content:center;background:#0009;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.fly-image-upload__crop-modal{background:var(--bg-primary, #fff);color:var(--label-primary, #1f2937);border-radius:16px;overflow:hidden;max-width:700px;width:90vw;box-shadow:0 20px 60px #0006;border:1px solid var(--separator-primary, rgba(0,0,0,.1))}.fly-image-upload__crop-header{padding:16px 20px;border-bottom:1px solid var(--separator-primary, #e5e7eb);background:var(--fill-quaternary, transparent)}.fly-image-upload__crop-header h3{margin:0;font-size:16px;font-weight:600;color:var(--label-primary, #1f2937)}.fly-image-upload__crop-body{max-height:60vh;overflow:hidden;background:var(--fill-tertiary, #f3f4f6)}.fly-image-upload__crop-body img{display:block;max-width:100%}.fly-image-upload__crop-footer{display:flex;justify-content:flex-end;gap:10px;padding:14px 20px;border-top:1px solid var(--separator-primary, #e5e7eb);background:var(--fill-quaternary, transparent)}html.spatial-theme .fly-image-upload__crop-modal{background:#ffffffa6;backdrop-filter:blur(40px) saturate(1.8);-webkit-backdrop-filter:blur(40px) saturate(1.8);border:1px solid rgba(255,255,255,.4)}html.spatial-theme .fly-image-upload__crop-header,html.spatial-theme .fly-image-upload__crop-footer{background:transparent}html.spatial-theme .fly-image-upload__crop-body{background:#0000000d}html.dark-theme .fly-image-upload__crop-modal{background:var(--bg-primary, #1c1c1e);border:1px solid var(--separator-primary, rgba(255,255,255,.1))}html.dark-theme .fly-image-upload__crop-body{background:var(--fill-tertiary, #2c2c2e)}\n"] }]
1248
- }], propDecorators: { aspectRatio: [{ type: i0.Input, args: [{ isSignal: true, alias: "aspectRatio", required: false }] }], maxSizeBytes: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSizeBytes", required: false }] }], currentImageId: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentImageId", required: false }] }], sourceApp: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceApp", required: false }] }], sourceEntityType: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceEntityType", required: false }] }], sourceEntityId: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceEntityId", required: false }] }], uploaded: [{ type: i0.Output, args: ["uploaded"] }], removed: [{ type: i0.Output, args: ["removed"] }], fileInput: [{ type: i0.ViewChild, args: ['fileInput', { isSignal: true }] }], cropImage: [{ type: i0.ViewChild, args: ['cropImage', { isSignal: true }] }] } });
1265
+ }], ctorParameters: () => [], propDecorators: { aspectRatio: [{ type: i0.Input, args: [{ isSignal: true, alias: "aspectRatio", required: false }] }], maxSizeBytes: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxSizeBytes", required: false }] }], currentImageId: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentImageId", required: false }] }], sourceApp: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceApp", required: false }] }], sourceEntityType: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceEntityType", required: false }] }], sourceEntityId: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceEntityId", required: false }] }], uploaded: [{ type: i0.Output, args: ["uploaded"] }], removed: [{ type: i0.Output, args: ["removed"] }], fileInput: [{ type: i0.ViewChild, args: ['fileInput', { isSignal: true }] }], cropImage: [{ type: i0.ViewChild, args: ['cropImage', { isSignal: true }] }] } });
1249
1266
 
1250
1267
  const FILE_ICONS = {
1251
1268
  'application/pdf': 'pi-file-pdf',
@@ -1295,6 +1312,8 @@ class FlyFileUploadComponent {
1295
1312
  sourceApp = input('unknown', ...(ngDevMode ? [{ debugName: "sourceApp" }] : /* istanbul ignore next */ []));
1296
1313
  sourceEntityType = input(null, ...(ngDevMode ? [{ debugName: "sourceEntityType" }] : /* istanbul ignore next */ []));
1297
1314
  sourceEntityId = input(null, ...(ngDevMode ? [{ debugName: "sourceEntityId" }] : /* istanbul ignore next */ []));
1315
+ /** Optional: provide file IDs to auto-fetch metadata for pre-existing files (edit mode). */
1316
+ existingFileIds = input(null, ...(ngDevMode ? [{ debugName: "existingFileIds" }] : /* istanbul ignore next */ []));
1298
1317
  /** Two-way model for completed file metadata. */
1299
1318
  files = model([], ...(ngDevMode ? [{ debugName: "files" }] : /* istanbul ignore next */ []));
1300
1319
  // ── Outputs ──
@@ -1306,6 +1325,24 @@ class FlyFileUploadComponent {
1306
1325
  /** Pre-existing files loaded from the entity (before any new uploads this session). */
1307
1326
  existingFiles = signal([], ...(ngDevMode ? [{ debugName: "existingFiles" }] : /* istanbul ignore next */ []));
1308
1327
  fileInput = viewChild('fileInput', ...(ngDevMode ? [{ debugName: "fileInput" }] : /* istanbul ignore next */ []));
1328
+ constructor() {
1329
+ // Auto-fetch metadata for existing file IDs (edit mode)
1330
+ effect((onCleanup) => {
1331
+ const ids = this.existingFileIds();
1332
+ if (!ids?.length)
1333
+ return;
1334
+ const subs = ids.map(id => this.http.get(`/api/files/${id}`).subscribe({
1335
+ next: (res) => {
1336
+ const info = res.data ?? res;
1337
+ if (info?.id) {
1338
+ this.existingFiles.update(list => list.some(f => f.id === info.id) ? list : [...list, info]);
1339
+ this.files.update(list => list.some(f => f.id === info.id) ? list : [...list, info]);
1340
+ }
1341
+ },
1342
+ }));
1343
+ onCleanup(() => subs.forEach(s => s.unsubscribe()));
1344
+ });
1345
+ }
1309
1346
  allSlots = computed(() => this.slots(), ...(ngDevMode ? [{ debugName: "allSlots" }] : /* istanbul ignore next */ []));
1310
1347
  canAddMore = computed(() => {
1311
1348
  const current = this.files().length + this.slots().filter(s => s.status === 'uploading').length;
@@ -1414,7 +1451,7 @@ class FlyFileUploadComponent {
1414
1451
  });
1415
1452
  }
1416
1453
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: FlyFileUploadComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1417
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: FlyFileUploadComponent, isStandalone: true, selector: "fly-file-upload", inputs: { maxFiles: { classPropertyName: "maxFiles", publicName: "maxFiles", isSignal: true, isRequired: false, transformFunction: null }, maxFileSizeBytes: { classPropertyName: "maxFileSizeBytes", publicName: "maxFileSizeBytes", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, sourceApp: { classPropertyName: "sourceApp", publicName: "sourceApp", isSignal: true, isRequired: false, transformFunction: null }, sourceEntityType: { classPropertyName: "sourceEntityType", publicName: "sourceEntityType", isSignal: true, isRequired: false, transformFunction: null }, sourceEntityId: { classPropertyName: "sourceEntityId", publicName: "sourceEntityId", isSignal: true, isRequired: false, transformFunction: null }, files: { classPropertyName: "files", publicName: "files", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { files: "filesChange", filesChanged: "filesChanged" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, isSignal: true }], ngImport: i0, template: `
1454
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: FlyFileUploadComponent, isStandalone: true, selector: "fly-file-upload", inputs: { maxFiles: { classPropertyName: "maxFiles", publicName: "maxFiles", isSignal: true, isRequired: false, transformFunction: null }, maxFileSizeBytes: { classPropertyName: "maxFileSizeBytes", publicName: "maxFileSizeBytes", isSignal: true, isRequired: false, transformFunction: null }, accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, sourceApp: { classPropertyName: "sourceApp", publicName: "sourceApp", isSignal: true, isRequired: false, transformFunction: null }, sourceEntityType: { classPropertyName: "sourceEntityType", publicName: "sourceEntityType", isSignal: true, isRequired: false, transformFunction: null }, sourceEntityId: { classPropertyName: "sourceEntityId", publicName: "sourceEntityId", isSignal: true, isRequired: false, transformFunction: null }, existingFileIds: { classPropertyName: "existingFileIds", publicName: "existingFileIds", isSignal: true, isRequired: false, transformFunction: null }, files: { classPropertyName: "files", publicName: "files", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { files: "filesChange", filesChanged: "filesChanged" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, isSignal: true }], ngImport: i0, template: `
1418
1455
  <div class="fly-file-upload">
1419
1456
  @if (canAddMore()) {
1420
1457
  <div class="fly-file-upload__dropzone"
@@ -1557,7 +1594,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImpor
1557
1594
  <input #fileInput type="file" [accept]="accept()" multiple class="fly-file-upload__hidden" (change)="onFilesSelected($event)" />
1558
1595
  </div>
1559
1596
  `, styles: [".fly-file-upload{display:flex;flex-direction:column;gap:8px}.fly-file-upload__hidden{display:none}.fly-file-upload__dropzone{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;padding:20px;border:2px dashed var(--separator-primary, #e5e7eb);border-radius:10px;background:var(--fill-quaternary, #f9fafb);cursor:pointer;transition:border-color .15s,background .15s}.fly-file-upload__dropzone:hover,.fly-file-upload__dropzone--drag{border-color:var(--accent-primary, #0071e3);background:var(--fill-tertiary, #f3f4f6)}.fly-file-upload__icon{font-size:24px;color:var(--label-tertiary, #9ca3af)}.fly-file-upload__label{font-size:13px;color:var(--label-secondary, #6b7280)}.fly-file-upload__hint{font-size:11px;color:var(--label-tertiary, #9ca3af)}.fly-file-upload__error{font-size:12px;color:var(--system-red, #ef4444);padding:4px 0}.fly-file-upload__list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}.fly-file-upload__item{display:flex;align-items:center;gap:10px;padding:8px 12px;border:1px solid var(--separator-primary, #e5e7eb);border-radius:8px;background:var(--fill-quaternary, #f9fafb);font-size:13px}.fly-file-upload__file-icon{font-size:18px;color:var(--label-tertiary, #9ca3af);flex-shrink:0}.fly-file-upload__file-info{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.fly-file-upload__file-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--label-primary, #1f2937)}.fly-file-upload__file-size{font-size:11px;color:var(--label-tertiary, #9ca3af)}.fly-file-upload__progress-track{width:60px;height:4px;border-radius:2px;background:var(--fill-tertiary, #e5e7eb);overflow:hidden}.fly-file-upload__progress-fill{height:100%;background:var(--accent-primary, #0071e3);border-radius:2px;transition:width .2s}.fly-file-upload__file-ok{color:var(--system-green, #22c55e);font-size:14px}.fly-file-upload__file-error{color:var(--system-red, #ef4444);font-size:14px}.fly-file-upload__remove-btn{background:none;border:none;cursor:pointer;color:var(--label-tertiary, #9ca3af);width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:color .15s,background .15s;flex-shrink:0}.fly-file-upload__remove-btn:hover{color:var(--system-red, #ef4444);background:var(--fill-tertiary, #f3f4f6)}\n"] }]
1560
- }], propDecorators: { maxFiles: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFiles", required: false }] }], maxFileSizeBytes: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFileSizeBytes", required: false }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], sourceApp: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceApp", required: false }] }], sourceEntityType: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceEntityType", required: false }] }], sourceEntityId: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceEntityId", required: false }] }], files: [{ type: i0.Input, args: [{ isSignal: true, alias: "files", required: false }] }, { type: i0.Output, args: ["filesChange"] }], filesChanged: [{ type: i0.Output, args: ["filesChanged"] }], fileInput: [{ type: i0.ViewChild, args: ['fileInput', { isSignal: true }] }] } });
1597
+ }], ctorParameters: () => [], propDecorators: { maxFiles: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFiles", required: false }] }], maxFileSizeBytes: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxFileSizeBytes", required: false }] }], accept: [{ type: i0.Input, args: [{ isSignal: true, alias: "accept", required: false }] }], sourceApp: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceApp", required: false }] }], sourceEntityType: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceEntityType", required: false }] }], sourceEntityId: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceEntityId", required: false }] }], existingFileIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "existingFileIds", required: false }] }], files: [{ type: i0.Input, args: [{ isSignal: true, alias: "files", required: false }] }, { type: i0.Output, args: ["filesChange"] }], filesChanged: [{ type: i0.Output, args: ["filesChanged"] }], fileInput: [{ type: i0.ViewChild, args: ['fileInput', { isSignal: true }] }] } });
1561
1598
 
1562
1599
  /*
1563
1600
  * @mohamedatia/fly-design-system — Public API
@@ -1 +1 @@
1
- {"version":3,"file":"mohamedatia-fly-design-system.mjs","sources":["../../../projects/design-system/src/lib/models/window.model.ts","../../../projects/design-system/src/lib/services/auth.service.ts","../../../projects/design-system/src/lib/services/i18n.service.ts","../../../projects/design-system/src/lib/services/fly-theme.service.ts","../../../projects/design-system/src/lib/services/window-manager.service.ts","../../../projects/design-system/src/lib/pipes/translate.pipe.ts","../../../projects/design-system/src/lib/services/auth.service.mock.ts","../../../projects/design-system/src/lib/components/context-menu/context-menu.component.ts","../../../projects/design-system/src/lib/components/context-menu/context-menu.component.html","../../../projects/design-system/src/lib/components/message-box/message-box.service.ts","../../../projects/design-system/src/lib/components/message-box/message-box.component.ts","../../../projects/design-system/src/lib/components/message-box/message-box.component.html","../../../projects/design-system/src/lib/components/share-panel/share-panel.component.ts","../../../projects/design-system/src/lib/components/share-panel/share-panel.component.html","../../../projects/design-system/src/lib/components/block-ui/block-ui.component.ts","../../../projects/design-system/src/lib/components/block-ui/block-ui.component.html","../../../projects/design-system/src/lib/components/image-upload/fly-image-upload.component.ts","../../../projects/design-system/src/lib/components/file-upload/fly-file-upload.component.ts","../../../projects/design-system/src/public-api.ts","../../../projects/design-system/src/mohamedatia-fly-design-system.ts"],"sourcesContent":["import { InjectionToken, Type } from '@angular/core';\r\n\r\nexport type WindowState = 'normal' | 'minimized' | 'maximized';\r\n\r\nexport interface ChildWindowData {\r\n childComponent: Type<unknown>;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface WindowInstance {\r\n id: string;\r\n appId: string;\r\n title: string;\r\n icon: string;\r\n iconBg: string;\r\n state: WindowState;\r\n position: { x: number; y: number };\r\n size: { width: number; height: number };\r\n zIndex: number;\r\n isFocused: boolean;\r\n isClosing?: boolean;\r\n isMinimizing?: boolean;\r\n isRestoring?: boolean;\r\n isMaximizing?: boolean;\r\n isUnmaximizing?: boolean;\r\n parentWindowId?: string;\r\n childData?: ChildWindowData;\r\n /** Populated when remote `loadComponent()` fails (e.g. federation). */\r\n remoteLoadError?: string;\r\n /** When true, the shell draws a block overlay over `.window-content` (see `FlyBlockUiComponent`). */\r\n contentUiBlocked?: boolean;\r\n /** i18n key for block overlay label; shell defaults to `common.loading` when unset. */\r\n contentUiBlockMessageKey?: string;\r\n}\r\n\r\nexport const WINDOW_DATA = new InjectionToken<WindowInstance>('WINDOW_DATA');\r\n","import { Injectable, computed, signal } from '@angular/core';\nimport { User } from '../models/user.model';\n\ninterface AuthSession {\n user: User;\n accessToken: string;\n expiresAt: number;\n}\n\n/**\n * Shared AuthService for Business Apps.\n *\n * This is a **read-only signal store** — Business Apps inject it to read the\n * current user and access token. The FlyOS shell populates it after PKCE login\n * and silent refresh. Business Apps must never call setSession() directly.\n *\n * When running as a Module Federation remote, the shell and the Business App\n * share this singleton via the `@mohamedatia/fly-design-system` shared mapping\n * in federation.config.js — so the shell's populated instance is the same\n * object the Business App reads.\n *\n * When running standalone (without the shell), call initFromToken() with a\n * JWT stored in localStorage to hydrate the user.\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthService {\n private _session = signal<AuthSession | null>(null);\n\n readonly currentUser = computed(() => this._session()?.user ?? null);\n readonly accessToken = computed(() => this._session()?.accessToken ?? null);\n readonly isAuthenticated = computed(() => {\n const s = this._session();\n return s !== null && s.expiresAt > Date.now();\n });\n\n /**\n * No-op when running as a Module Federation remote — the shell has already\n * initialised the session before the remote bootstraps. Business Apps call\n * this in their APP_INITIALIZER so the same code works in both standalone\n * and embedded modes without branching.\n */\n async init(): Promise<void> {}\n\n /**\n * Called by the shell after a successful login or silent refresh.\n * Business Apps should not call this directly.\n */\n setSession(user: User, accessToken: string, expiresAt: number): void {\n this._session.set({ user, accessToken, expiresAt });\n }\n\n /** Clears the in-memory session (called by the shell on logout). */\n clearSession(): void {\n this._session.set(null);\n }\n\n /**\n * Standalone mode: parse a JWT from localStorage and hydrate the user.\n * Pass the storage key your app uses; embedded remotes typically set this in `APP_INITIALIZER`.\n */\n initFromToken(storageKey = 'circles_token'): void {\n const token = localStorage.getItem(storageKey);\n if (!token) return;\n try {\n const base64 = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/');\n const payload = JSON.parse(decodeURIComponent(\n atob(base64).split('').map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join('')\n )) as Record<string, unknown>;\n\n const rawRole = payload['role'];\n const roles = Array.isArray(rawRole) ? rawRole as string[] : rawRole ? [rawRole as string] : [];\n const rawApps = payload['apps'];\n const apps = Array.isArray(rawApps) ? rawApps as string[] : rawApps ? [rawApps as string] : [];\n const name = (payload['name'] as string) ?? '';\n const nameParts = name.split(' ');\n\n const user: User = {\n id: (payload['sub'] as string) ?? '',\n tenantId: (payload['tenant_id'] as string) ?? (payload['tid'] as string) ?? null,\n email: (payload['email'] as string) ?? '',\n fullName: name,\n firstName: nameParts[0] ?? '',\n lastName: nameParts.slice(1).join(' '),\n preferredLocale: (payload['locale'] as string) ?? 'en',\n roles,\n apps,\n ou: payload['ou'] as string | undefined,\n };\n\n const expiresAt = ((payload['exp'] as number) ?? 0) * 1000;\n this.setSession(user, token, expiresAt);\n } catch {\n // Invalid token — stay unauthenticated\n }\n }\n}\n","import { Injectable, computed, signal, inject, ErrorHandler } from '@angular/core';\n\n/** Locales that use RTL layout for `dir` and DS `isRtl` / `direction`. */\nexport const RTL_LOCALE_SET: ReadonlySet<string> = new Set(['ar', 'ur']);\n\nexport function isRtlLocale(lang: string): boolean {\n return RTL_LOCALE_SET.has(lang);\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** Accepts flat or nested JSON objects; nested keys become dot paths. Rejects arrays and non-string leaves. */\nfunction normalizeLocaleJson(raw: unknown): Record<string, string> {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n throw new Error('Locale bundle must be a JSON object');\n }\n const out: Record<string, string> = {};\n const walk = (obj: Record<string, unknown>, prefix: string): void => {\n for (const [k, v] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${k}` : k;\n if (typeof v === 'string') {\n out[path] = v;\n } else if (v !== null && typeof v === 'object' && !Array.isArray(v)) {\n walk(v as Record<string, unknown>, path);\n } else {\n throw new Error(`Locale bundle invalid value at \"${path}\" (expected string or nested object)`);\n }\n }\n };\n walk(raw as Record<string, unknown>, '');\n return out;\n}\n\n/** Options for loading a remote or standalone locale JSON bundle. */\nexport interface LoadBundleOptions {\n /** Stable id (e.g. app id from manifest); later loads replace this bundle only. */\n id: string;\n /** Base URL ending with `/`, e.g. `https://app.example.com/locale/` or `/my-remote/locale/` */\n baseUrl: string;\n lang: string;\n /** When aborted, failures are ignored (e.g. superseded language load). */\n signal?: AbortSignal;\n /**\n * When true, fetch/parse failures are not reported via Angular `ErrorHandler`.\n * Use for optional remote locale bundles (e.g. federated apps that may be offline).\n */\n silent?: boolean;\n}\n\n/**\n * Shared I18nService for the shell and Business Apps.\n *\n * **Merge order** (later keys win): shell layer → remote bundles in registration order.\n *\n * - Shell: `setShellTranslations()` after loading `locale/{lang}.json` and API overrides.\n * - Remotes: `loadBundle()` per manifest `localeBaseUrl`.\n */\n@Injectable({ providedIn: 'root' })\nexport class I18nService {\n private readonly errorHandler = inject(ErrorHandler, { optional: true });\n\n private readonly _shell = signal<Record<string, string>>({});\n private readonly _bundles = signal<Record<string, Record<string, string>>>({});\n private readonly _bundleOrder = signal<string[]>([]);\n private readonly _locale = signal<string>('en');\n private readonly _version = signal(0);\n\n private readonly _merged = computed(() => {\n const shell = this._shell();\n const order = this._bundleOrder();\n const bundles = this._bundles();\n let out: Record<string, string> = { ...shell };\n for (const id of order) {\n const b = bundles[id];\n if (b) out = { ...out, ...b };\n }\n return out;\n });\n\n readonly locale = this._locale.asReadonly();\n readonly version = this._version.asReadonly();\n readonly isRtl = computed(() => isRtlLocale(this._locale()));\n readonly direction = computed(() => (isRtlLocale(this._locale()) ? 'rtl' : 'ltr'));\n\n private bump(): void {\n this._version.update((v) => v + 1);\n }\n\n /** Replace shell strings (desktop `locale/*.json` + `/api/i18n/desktop-shell/{lang}` merged by the shell). */\n setShellTranslations(data: Record<string, string>, lang: string): void {\n this._shell.set(data);\n this._locale.set(lang);\n this.bump();\n }\n\n setLanguage(lang: string): void {\n this._locale.set(lang);\n this.bump();\n }\n\n /**\n * Fetch `{baseUrl}{lang}.json` and store under `id`. New ids are appended to the merge order.\n * @returns whether the bundle was loaded successfully.\n */\n async loadBundle(opts: LoadBundleOptions): Promise<boolean> {\n const { id, baseUrl, lang, signal: abortSignal, silent } = opts;\n try {\n const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;\n const url = `${base}${lang}.json`;\n const resp = await fetch(url, { signal: abortSignal });\n if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n const data = normalizeLocaleJson(await resp.json());\n if (abortSignal?.aborted) return false;\n this._bundles.update((b) => ({ ...b, [id]: data }));\n this._bundleOrder.update((order) => (order.includes(id) ? order : [...order, id]));\n this._locale.set(lang);\n this.bump();\n return true;\n } catch (e) {\n if (abortSignal?.aborted) return false;\n if (!silent) this.errorHandler?.handleError(e);\n return false;\n }\n }\n\n removeBundle(id: string): void {\n this._bundles.update((b) => {\n const next = { ...b };\n delete next[id];\n return next;\n });\n this._bundleOrder.update((order) => order.filter((x) => x !== id));\n this.bump();\n }\n\n clearRemoteBundles(): void {\n this._bundles.set({});\n this._bundleOrder.set([]);\n this.bump();\n }\n\n t(key: string, params?: Record<string, string | number>): string {\n const val = this._merged()[key] ?? key;\n if (!params) return val;\n return Object.entries(params).reduce((result, [k, v]) => {\n const safe = escapeRegExp(k);\n return result.replace(new RegExp(`{{\\\\s*${safe}\\\\s*}}`, 'g'), String(v));\n }, val);\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Injectable, inject, PLATFORM_ID, signal } from '@angular/core';\n\n/** Single source of truth for persisted / API theme strings. */\nexport const FLY_THEME_MODE_IDS = ['light', 'spatial', 'dark'] as const;\n\nexport type FlyThemeMode = (typeof FLY_THEME_MODE_IDS)[number];\n\n/** Factory default: `dark` (opaque dark / `html.dark-theme`); shell i18n `settings.theme.dark`. Keep in sync with `UserSettings` defaults. */\nexport const DEFAULT_FLY_THEME_MODE: FlyThemeMode = 'dark';\n\n/** Coerce unknown values (localStorage, API) to a valid theme mode. */\nexport function normalizeFlyTheme(value: unknown): FlyThemeMode {\n if (typeof value === 'string' && (FLY_THEME_MODE_IDS as readonly string[]).includes(value)) {\n return value as FlyThemeMode;\n }\n return DEFAULT_FLY_THEME_MODE;\n}\n\n/**\n * Applies `html.light-theme` / `html.spatial-theme` / `html.dark-theme` for DS SCSS.\n * Shell and standalone Business Apps use the same service (federation singleton when shared).\n */\n@Injectable({ providedIn: 'root' })\nexport class FlyThemeService {\n private readonly platformId = inject(PLATFORM_ID);\n\n readonly theme = signal<FlyThemeMode>(DEFAULT_FLY_THEME_MODE);\n\n applyTheme(mode: FlyThemeMode): void {\n this.theme.set(mode);\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const html = document.documentElement;\n html.classList.remove('light-theme', 'spatial-theme', 'dark-theme');\n if (mode === 'spatial') {\n html.classList.add('spatial-theme');\n } else if (mode === 'dark') {\n html.classList.add('dark-theme');\n } else {\n html.classList.add('light-theme');\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\n/** Options for opening a child window. */\nexport interface OpenWindowOptions {\n /** Unique identifier for the window instance. */\n windowId: string;\n /** Display title shown in the window chrome. */\n title: string;\n /** Route path or URL to load inside the window. */\n route: string;\n /** Initial width in pixels. Defaults to 900. */\n width?: number;\n /** Initial height in pixels. Defaults to 600. */\n height?: number;\n /** Whether the window can be resized. Defaults to true. */\n resizable?: boolean;\n /** Whether the window can be maximised. Defaults to true. */\n maximizable?: boolean;\n /** Arbitrary data passed to the child window via WINDOW_DATA. */\n data?: unknown;\n}\n\n/**\n * Abstract interface for the WindowManager.\n * The FlyOS shell provides the concrete implementation; Business Apps\n * inject this token to open, close, and focus windows without depending\n * on the shell's internal implementation.\n */\nexport abstract class WindowManagerService {\n abstract openChildWindow(options: OpenWindowOptions): void;\n abstract closeWindow(windowId: string): void;\n abstract focusWindow(windowId: string): void;\n\n /**\n * Shell: increments per-window depth and shows content block UI.\n * Standalone / no host: no-op.\n */\n beginContentUiBlock(_windowId: string, _messageKey?: string): void {}\n\n /** Shell: decrements depth; clears block when depth reaches 0. Standalone: no-op. */\n endContentUiBlock(_windowId: string): void {}\n}\n\n/**\n * No-op fallback implementation used when running a Business App in\n * standalone mode (outside the FlyOS shell). Logs a warning instead of\n * throwing so standalone dev/test flows are not broken.\n */\n@Injectable()\nexport class StandaloneWindowManagerService extends WindowManagerService {\n openChildWindow(options: OpenWindowOptions): void {\n console.warn('[WindowManagerService] openChildWindow called in standalone mode — no shell available.', options);\n }\n\n closeWindow(windowId: string): void {\n console.warn('[WindowManagerService] closeWindow called in standalone mode — no shell available.', windowId);\n }\n\n focusWindow(windowId: string): void {\n console.warn('[WindowManagerService] focusWindow called in standalone mode — no shell available.', windowId);\n }\n}\n\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { I18nService } from '../services/i18n.service';\n\n/**\n * Translates a key using the shared I18nService.\n *\n * @example\n * {{ 'myApp.section.title' | translate }}\n * {{ 'myApp.items_count' | translate:{ n: count() } }}\n */\n@Pipe({\n name: 'translate',\n standalone: true,\n pure: false,\n})\nexport class TranslatePipe implements PipeTransform {\n private readonly i18n = inject(I18nService);\n\n transform(key: string, params?: Record<string, string | number>): string {\n // Read version so template CD re-runs when bundles load (merged translations updated).\n void this.i18n.version();\n return this.i18n.t(key, params);\n }\n}\n","import { Injectable, Signal, computed, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable, of } from 'rxjs';\nimport { User } from '../models/user.model';\n\nexport interface MockAuthConfig {\n user: User;\n token?: string;\n loginRedirect?: string[];\n logoutRedirect?: string[];\n}\n\ninterface MockSession {\n accessToken: string;\n user: User;\n expiresAt: number;\n}\n\n/**\n * Shared mock AuthService base class for Business App developers.\n *\n * Extend this class in your app's `auth.service.mock.ts` and override\n * `getConfig()` to supply app-specific mock user data and navigation paths.\n * The subclass must be decorated with `@Injectable({ providedIn: 'root' })`\n * and exported as `AuthService` so Angular's `fileReplacements` swap works.\n *\n * @example\n * ```typescript\n * // src/app/core/services/auth.service.mock.ts\n * import { Injectable } from '@angular/core';\n * import { MockAuthService, type MockAuthConfig } from '@mohamedatia/fly-design-system';\n *\n * @Injectable({ providedIn: 'root' })\n * export class AuthService extends MockAuthService {\n * protected override getConfig(): MockAuthConfig {\n * return {\n * user: { id: 'dev-001', tenantId: 'dev-tenant', email: 'dev@example.com',\n * firstName: 'Dev', lastName: 'User', fullName: 'Dev User',\n * preferredLocale: 'en', roles: ['admin'], apps: ['my-app'] },\n * token: 'my-mock-token',\n * loginRedirect: ['/app'],\n * };\n * }\n * }\n * ```\n */\n@Injectable()\nexport class MockAuthService {\n private readonly router = inject(Router);\n\n protected readonly _session: ReturnType<typeof signal<MockSession | null>>;\n\n private readonly _config: MockAuthConfig;\n\n readonly isAuthenticated: Signal<boolean>;\n readonly currentUser: Signal<User | null>;\n readonly accessToken: Signal<string | null>;\n /** Always false in mock mode — 2FA is handled entirely by the STS. */\n readonly hasPendingTwoFactor: Signal<boolean>;\n /** Always false in mock mode — auth is pre-populated synchronously. */\n readonly initializing: Signal<boolean>;\n\n /**\n * Shell and guards may read this flag; real auth uses `localStorage` `fly_had_session`.\n * Default false — override in the app’s `auth.service.mock.ts` if needed.\n */\n get hadPriorSession(): boolean {\n return false;\n }\n\n constructor() {\n // All signal/computed calls are inside the constructor body so Angular's\n // injection context and ngDevMode are fully set up before they execute.\n this._config = this.getConfig();\n\n this._session = signal<MockSession | null>({\n accessToken: this._config.token ?? 'mock-token',\n user: this._config.user,\n expiresAt: Date.now() + 24 * 60 * 60 * 1000,\n });\n\n this.isAuthenticated = computed(() => {\n const s = this._session();\n return s !== null && s.expiresAt > Date.now();\n });\n\n this.currentUser = computed(() => this._session()?.user ?? null);\n this.accessToken = computed(() => this._session()?.accessToken ?? null);\n this.hasPendingTwoFactor = computed(() => false);\n this.initializing = signal(false).asReadonly();\n }\n\n /** Override in subclass to supply app-specific mock data. */\n protected getConfig(): MockAuthConfig {\n return {\n user: {\n id: 'mock-user-001',\n tenantId: 'mock-tenant-001',\n email: 'developer@fly.local',\n firstName: 'UI',\n lastName: 'Developer',\n fullName: 'UI Developer',\n preferredLocale: 'en',\n roles: ['admin'],\n apps: [],\n },\n };\n }\n\n async init(): Promise<void> {\n // Mock mode: already authenticated, nothing to initialize.\n }\n\n startLogin(): void {\n this.router.navigate(this._config.loginRedirect ?? ['/']);\n }\n\n handleCallback(_code: string, _state?: string): Observable<User> {\n return of(this._config.user);\n }\n\n async forceRefresh(): Promise<void> {\n // No-op in mock mode — token never expires.\n }\n\n patchSessionPreferredLocale(locale: string): void {\n const session = this._session();\n if (!session?.user) return;\n this._session.set({ ...session, user: { ...session.user, preferredLocale: locale } });\n }\n\n /** Parameter order matches the real AuthService: (user, accessToken, expiresAt). */\n setSession(_user: User, _accessToken: string, _expiresAt: number): void {\n // No-op in mock mode — session is hardcoded.\n }\n\n logout(): void {\n this._session.set(null);\n this.router.navigate(this._config.logoutRedirect ?? ['/']);\n }\n}\n","import {\n Component, input, output, HostListener, ViewChild, ElementRef,\n computed, signal, AfterViewInit, OnDestroy, ChangeDetectionStrategy, inject, DOCUMENT,\n} from '@angular/core';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\n\nexport interface ContextMenuItem {\n id: string;\n label: string;\n icon: string;\n}\n\nexport interface ContextMenuSection {\n label?: string;\n items: ContextMenuItem[];\n}\n\n@Component({\n selector: 'fly-context-menu',\n standalone: true,\n imports: [TranslatePipe],\n templateUrl: './context-menu.component.html',\n styleUrl: './context-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ContextMenuComponent implements AfterViewInit, OnDestroy {\n @ViewChild('contextMenu') private menuEl?: ElementRef<HTMLElement>;\n\n private readonly doc = inject(DOCUMENT);\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n\n x = input.required<number>();\n y = input.required<number>();\n sections = input.required<ContextMenuSection[]>();\n action = output<string>();\n closed = output<void>();\n\n private menuWidth = signal(0);\n private menuHeight = signal(0);\n\n private previouslyFocused: Element | null = null;\n\n // Resolved position: clamp to viewport so the menu never overflows an edge.\n // menuWidth/Height start at 0 so the first render places the menu at (x,y)\n // with no clamping; ngAfterViewInit measures the real size and updates the\n // signals, which re-evaluates this computed and repositions correctly.\n clampedPos = computed(() => {\n const vw = this.doc.defaultView?.innerWidth ?? 0;\n const vh = this.doc.defaultView?.innerHeight ?? 0;\n const w = this.menuWidth();\n const h = this.menuHeight();\n const x = this.x();\n const y = this.y();\n return {\n left: w > 0 ? Math.min(x, vw - w - 8) : x,\n top: h > 0 ? Math.min(y, vh - h - 8) : y,\n };\n });\n\n ngAfterViewInit(): void {\n // Portal: move host to <body> so position:fixed resolves against the true\n // viewport, not against any transformed/backdrop-filtered ancestor window.\n this.doc.body.appendChild(this.hostEl.nativeElement);\n\n // Measure after portal move so offsetWidth/Height are accurate.\n const el = this.menuEl?.nativeElement;\n if (el) {\n this.menuWidth.set(el.offsetWidth);\n this.menuHeight.set(el.offsetHeight);\n }\n\n this.previouslyFocused = document.activeElement;\n this.focusItem(0);\n }\n\n ngOnDestroy(): void {\n const el = this.hostEl.nativeElement;\n if (el.parentNode === this.doc.body) {\n this.doc.body.removeChild(el);\n }\n }\n\n onAction(id: string): void {\n this.action.emit(id);\n this.close();\n }\n\n @HostListener('document:mousedown', ['$event'])\n onClickOutside(event: MouseEvent): void {\n if (!this.menuEl?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n this.close();\n }\n\n @HostListener('document:contextmenu', ['$event'])\n onContextMenu(event: MouseEvent): void {\n if (!this.menuEl?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n const items = this.getMenuItems();\n if (!items.length) return;\n const focused = document.activeElement as HTMLElement;\n const idx = items.indexOf(focused);\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.focusItem(idx < items.length - 1 ? idx + 1 : 0);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.focusItem(idx > 0 ? idx - 1 : items.length - 1);\n } else if (event.key === 'Home') {\n event.preventDefault();\n this.focusItem(0);\n } else if (event.key === 'End') {\n event.preventDefault();\n this.focusItem(items.length - 1);\n }\n }\n\n private close(): void {\n this.restoreFocus();\n this.closed.emit();\n }\n\n private getMenuItems(): HTMLElement[] {\n return Array.from(\n this.menuEl?.nativeElement.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ?? [],\n );\n }\n\n private focusItem(index: number): void {\n const items = this.getMenuItems();\n items[index]?.focus();\n }\n\n private restoreFocus(): void {\n if (this.previouslyFocused instanceof HTMLElement) {\n this.previouslyFocused.focus();\n }\n this.previouslyFocused = null;\n }\n}\n","<div\n #contextMenu\n class=\"context-menu\"\n [style.left.px]=\"clampedPos().left\"\n [style.top.px]=\"clampedPos().top\"\n role=\"menu\"\n [attr.aria-label]=\"'shell.context_menu' | translate\">\n\n @for (section of sections(); track $index) {\n @if ($index > 0) {\n <div class=\"menu-divider\"></div>\n }\n @if (section.label) {\n <div class=\"menu-section-label\">{{ section.label }}</div>\n }\n @for (item of section.items; track item.id) {\n <button\n type=\"button\"\n class=\"vos-btn sm rect menu-item\"\n role=\"menuitem\"\n (click)=\"onAction(item.id)\">\n <i [class]=\"'pi ' + item.icon\" aria-hidden=\"true\"></i>\n <span>{{ item.label }}</span>\n </button>\n }\n }\n</div>\n","import { Injectable, inject, signal } from '@angular/core';\nimport { I18nService } from '../../services/i18n.service';\n\nexport enum MessageBoxButtons {\n OK,\n OKCancel,\n YesNo,\n YesNoCancel,\n RetryCancel,\n AbortRetryIgnore,\n}\n\nexport enum MessageBoxIcon {\n None,\n Information,\n Warning,\n Error,\n Question,\n}\n\nexport enum DialogResult {\n None,\n OK,\n Cancel,\n Yes,\n No,\n Retry,\n Abort,\n Ignore,\n}\n\nexport interface MessageBoxOptions {\n title: string;\n message: string;\n buttons?: MessageBoxButtons;\n icon?: MessageBoxIcon;\n}\n\nexport interface MessageBoxButton {\n label: string;\n result: DialogResult;\n variant?: 'primary' | 'danger' | 'default';\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MessageBoxService {\n private readonly i18n = inject(I18nService);\n\n readonly visible = signal(false);\n readonly title = signal('');\n readonly message = signal('');\n readonly icon = signal<MessageBoxIcon>(MessageBoxIcon.None);\n readonly buttons = signal<MessageBoxButton[]>([]);\n\n private resolver: ((value: DialogResult) => void) | null = null;\n\n show(options: MessageBoxOptions): Promise<DialogResult> {\n // Dismiss any pending dialog so its Promise resolves rather than leaking\n if (this.resolver) {\n this.resolver(DialogResult.None);\n this.resolver = null;\n }\n\n this.title.set(options.title);\n this.message.set(options.message);\n this.icon.set(options.icon ?? MessageBoxIcon.None);\n this.buttons.set(this.resolveButtons(options.buttons ?? MessageBoxButtons.OK));\n this.visible.set(true);\n\n return new Promise<DialogResult>((resolve) => {\n this.resolver = resolve;\n });\n }\n\n resolve(result: DialogResult): void {\n this.visible.set(false);\n if (this.resolver) {\n this.resolver(result);\n this.resolver = null;\n }\n }\n\n private resolveButtons(buttons: MessageBoxButtons): MessageBoxButton[] {\n const t = (key: string) => this.i18n.t(key);\n switch (buttons) {\n case MessageBoxButtons.OK:\n return [{ label: t('common.ok'), result: DialogResult.OK, variant: 'primary' }];\n\n case MessageBoxButtons.OKCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.ok'), result: DialogResult.OK, variant: 'primary' },\n ];\n\n case MessageBoxButtons.YesNo:\n return [\n { label: t('common.no'), result: DialogResult.No, variant: 'default' },\n { label: t('common.yes'), result: DialogResult.Yes, variant: 'primary' },\n ];\n\n case MessageBoxButtons.YesNoCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.no'), result: DialogResult.No, variant: 'default' },\n { label: t('common.yes'), result: DialogResult.Yes, variant: 'primary' },\n ];\n\n case MessageBoxButtons.RetryCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.retry'), result: DialogResult.Retry, variant: 'primary' },\n ];\n\n case MessageBoxButtons.AbortRetryIgnore:\n return [\n { label: t('common.abort'), result: DialogResult.Abort, variant: 'danger' },\n { label: t('common.retry'), result: DialogResult.Retry, variant: 'default' },\n { label: t('common.ignore'), result: DialogResult.Ignore, variant: 'default' },\n ];\n }\n }\n}\n","import {\n Component, inject, ChangeDetectionStrategy,\n HostListener, ElementRef, AfterViewInit,\n} from '@angular/core';\nimport { MessageBoxService, MessageBoxIcon, DialogResult } from './message-box.service';\n\n@Component({\n selector: 'fly-message-box',\n standalone: true,\n templateUrl: './message-box.component.html',\n styleUrl: './message-box.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MessageBoxComponent implements AfterViewInit {\n service = inject(MessageBoxService);\n private elRef = inject(ElementRef);\n\n readonly MessageBoxIcon = MessageBoxIcon;\n readonly DialogResult = DialogResult;\n\n private previouslyFocused: Element | null = null;\n\n ngAfterViewInit(): void {\n // Store focus origin so we can restore it on close\n this.previouslyFocused = document.activeElement;\n this.focusPrimaryButton();\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.service.visible()) {\n this.service.resolve(DialogResult.Cancel);\n this.restoreFocus();\n }\n }\n\n onBackdropClick(): void {\n this.service.resolve(DialogResult.Cancel);\n this.restoreFocus();\n }\n\n onButtonClick(result: DialogResult): void {\n this.service.resolve(result);\n this.restoreFocus();\n }\n\n iconClass(): string {\n switch (this.service.icon()) {\n case MessageBoxIcon.Information: return 'pi pi-info-circle';\n case MessageBoxIcon.Warning: return 'pi pi-exclamation-triangle';\n case MessageBoxIcon.Error: return 'pi pi-times-circle';\n case MessageBoxIcon.Question: return 'pi pi-question-circle';\n default: return '';\n }\n }\n\n private focusPrimaryButton(): void {\n // Focus the primary (last) button, which is the default action\n const buttons = this.elRef.nativeElement.querySelectorAll('.mb-btn') as NodeListOf<HTMLButtonElement>;\n const last = buttons[buttons.length - 1];\n last?.focus();\n }\n\n private restoreFocus(): void {\n if (this.previouslyFocused instanceof HTMLElement) {\n this.previouslyFocused.focus();\n }\n this.previouslyFocused = null;\n }\n}\n","@if (service.visible()) {\n <div\n class=\"mb-backdrop\"\n (click)=\"onBackdropClick()\"\n role=\"presentation\">\n <div\n class=\"mb-dialog\"\n [class.mb-info]=\"service.icon() === MessageBoxIcon.Information\"\n [class.mb-warning]=\"service.icon() === MessageBoxIcon.Warning\"\n [class.mb-danger]=\"service.icon() === MessageBoxIcon.Error\"\n [class.mb-question]=\"service.icon() === MessageBoxIcon.Question\"\n (click)=\"$event.stopPropagation()\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"mb-title\"\n aria-describedby=\"mb-message\">\n\n @if (iconClass()) {\n <div class=\"mb-icon-wrap\">\n <i [class]=\"iconClass() + ' mb-icon'\" aria-hidden=\"true\"></i>\n </div>\n }\n\n <div class=\"mb-title\" id=\"mb-title\">{{ service.title() }}</div>\n <div class=\"mb-message\" id=\"mb-message\">{{ service.message() }}</div>\n\n <div class=\"mb-actions\">\n @for (btn of service.buttons(); track btn.result) {\n <button\n type=\"button\"\n class=\"vos-btn sm mb-btn\"\n [class.mb-btn--primary]=\"btn.variant === 'primary'\"\n [class.mb-btn--danger]=\"btn.variant === 'danger'\"\n (click)=\"onButtonClick(btn.result)\">\n {{ btn.label }}\n </button>\n }\n </div>\n\n </div>\n </div>\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n signal,\n inject,\n OnInit,\n DestroyRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport { I18nService } from '../../services/i18n.service';\nimport type {\n ShareOrgChartOption,\n ShareOuNode,\n SharePanelLevelOption,\n SharePermissionEntry,\n ShareUserResult,\n} from '../../models/share-panel.model';\n\n/** Default permission levels (file-style ACL). Hosts can override via `permissionLevels`. */\nexport const SHARE_PANEL_DEFAULT_FILE_LEVELS: SharePanelLevelOption[] = [\n { value: 'View', labelKey: 'files.share.level_view' },\n { value: 'Download', labelKey: 'files.share.level_download' },\n { value: 'Edit', labelKey: 'files.share.level_edit' },\n { value: 'FullControl', labelKey: 'files.share.level_full' },\n];\n\n@Component({\n selector: 'fly-share-panel',\n standalone: true,\n imports: [CommonModule, FormsModule, TranslatePipe],\n templateUrl: './share-panel.component.html',\n styleUrl: './share-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SharePanelComponent implements OnInit {\n /** Resource title shown in the header */\n @Input() targetName = '';\n\n /** i18n key for panel title */\n @Input() titleKey = 'files.share.title';\n\n /** Load current shares / permissions (host resolves display names when possible). */\n @Input({ required: true }) loadPermissions!: () => Observable<SharePermissionEntry[]>;\n\n @Input({ required: true }) searchUsers!: (query: string) => Observable<ShareUserResult[]>;\n\n /**\n * Load OU hierarchy for sharing. `chartId` is null for the default/official tree;\n * non-null for an alternative chart.\n */\n @Input({ required: true })\n loadOuTree!: (chartId: string | null) => Observable<ShareOuNode[]>;\n\n /** Chart selector options; first entry should be the default chart (`id: null`). */\n @Input({ required: true }) loadChartOptions!: () => Observable<ShareOrgChartOption[]>;\n\n /**\n * Labels from the default (official) OU tree for stable display names on OU grants\n * when the picker shows an alternative chart.\n */\n @Input({ required: true }) loadOuLabelMap!: () => Observable<Record<string, string>>;\n\n @Input({ required: true })\n grantToUser!: (userId: string, level: string, applyToChildren: boolean) => Observable<void>;\n\n @Input({ required: true })\n grantToOu!: (ouId: string, level: string, applyToChildren: boolean) => Observable<void>;\n\n @Input({ required: true }) updatePermission!: (id: string, level: string) => Observable<void>;\n\n @Input({ required: true }) revokePermission!: (id: string) => Observable<void>;\n\n /** When true, show “apply to children” (e.g. folders). */\n @Input() showApplyToChildren = false;\n\n /** Override level dropdown options (e.g. notes: View / Edit only). */\n @Input() permissionLevels?: SharePanelLevelOption[];\n\n /** i18n key for wildcard app grant label */\n @Input() everyoneLabelKey = 'files.share.everyone';\n\n @Output() close = new EventEmitter<void>();\n\n private destroyRef = inject(DestroyRef);\n private i18n = inject(I18nService);\n\n permissions = signal<SharePermissionEntry[]>([]);\n loading = signal(true);\n searchQuery = '';\n newLevel = '';\n applyToChildren = false;\n searchResults = signal<ShareUserResult[]>([]);\n ouTree = signal<ShareOuNode[]>([]);\n showOuPicker = signal(false);\n chartOptions = signal<ShareOrgChartOption[]>([]);\n selectedOrgChartId = signal<string | null>(null);\n /** Default-tree id → display name for permission rows (OU grants). */\n private readonly ouLabelById = signal<Record<string, string>>({});\n\n private searchTimeout: ReturnType<typeof setTimeout> | null = null;\n /** Emits after chart options load; further emissions on user chart changes (no initial null). */\n private readonly selectedChartId$ = new ReplaySubject<string | null>(1);\n\n ngOnInit(): void {\n const levels = this.levelOptions;\n this.newLevel = levels[0]?.value ?? 'View';\n this.refreshPermissions();\n\n this.loadOuLabelMap()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (m) => this.ouLabelById.set(m),\n error: () => this.ouLabelById.set({}),\n });\n\n this.selectedChartId$\n .pipe(\n switchMap((id) => this.loadOuTree(id)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe({\n next: (tree) => this.ouTree.set(tree),\n error: () => this.ouTree.set([]),\n });\n\n this.loadChartOptions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (opts) => {\n this.chartOptions.set(opts);\n const first = opts[0];\n const initial = first ? first.id : null;\n this.selectedOrgChartId.set(initial);\n this.selectedChartId$.next(initial);\n },\n error: () => {\n this.chartOptions.set([]);\n this.selectedOrgChartId.set(null);\n this.selectedChartId$.next(null);\n },\n });\n }\n\n onOrgChartSelectChange(chartId: string | null): void {\n this.selectedOrgChartId.set(chartId);\n this.selectedChartId$.next(chartId);\n }\n\n get levelOptions(): SharePanelLevelOption[] {\n const p = this.permissionLevels;\n return p && p.length > 0 ? p : SHARE_PANEL_DEFAULT_FILE_LEVELS;\n }\n\n refreshPermissions(): void {\n this.loading.set(true);\n this.loadPermissions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (perms) => {\n this.permissions.set(perms);\n this.loading.set(false);\n },\n error: () => {\n this.permissions.set([]);\n this.loading.set(false);\n },\n });\n }\n\n onSearchInput(): void {\n if (this.searchTimeout) clearTimeout(this.searchTimeout);\n const query = this.searchQuery.trim();\n if (query.length < 2) {\n this.searchResults.set([]);\n return;\n }\n\n this.searchTimeout = setTimeout(() => {\n this.searchUsers(query)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (items) => this.searchResults.set(items),\n error: () => this.searchResults.set([]),\n });\n }, 300);\n }\n\n onGrantToUser(user: ShareUserResult): void {\n this.searchResults.set([]);\n this.searchQuery = '';\n this.grantToUser(user.id, this.newLevel, this.applyToChildren)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n onGrantToOu(ou: ShareOuNode): void {\n this.grantToOu(ou.id, this.newLevel, this.applyToChildren)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n onUpdateLevel(perm: SharePermissionEntry, level: string): void {\n this.updatePermission(perm.id, level)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n onRevokePermission(perm: SharePermissionEntry): void {\n this.revokePermission(perm.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n getPermIcon(perm: SharePermissionEntry): string {\n if (perm.grantedToUserId) return 'pi pi-user';\n if (perm.grantedToOuId) return 'pi pi-sitemap';\n if (perm.grantedToAppId) return 'pi pi-globe';\n return 'pi pi-question';\n }\n\n /** Logical start padding for OU hierarchy (roots align with section padding). */\n ouIndentStartPx(ou: ShareOuNode): number {\n const d = ou.depth ?? 0;\n return 12 + d * 18;\n }\n\n getPermLabel(perm: SharePermissionEntry): string {\n if (perm.displayName?.trim()) return perm.displayName.trim();\n if (perm.grantedToUserId) {\n return `${perm.grantedToUserId.substring(0, 8)}…`;\n }\n if (perm.grantedToOuId) {\n const id = perm.grantedToOuId;\n const fromDefault = this.ouLabelById()[id];\n if (fromDefault) return fromDefault;\n const ou = this.ouTree().find((o) => o.id === id);\n if (ou) return ou.displayName;\n return `${id.substring(0, 8)}…`;\n }\n if (perm.grantedToAppId === '*') return this.i18n.t(this.everyoneLabelKey);\n return perm.grantedToAppId ?? '';\n }\n\n}\n","<div class=\"fac-overlay\" (click)=\"close.emit()\">\n <div class=\"fac-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"fac-header\">\n <h3>{{ titleKey | translate }}</h3>\n <span class=\"fac-target-name\">{{ targetName }}</span>\n <button type=\"button\" class=\"fac-close\" (click)=\"close.emit()\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <div class=\"fac-add-section\">\n <div class=\"fac-search-row\">\n <input\n type=\"text\"\n class=\"fac-input\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n [placeholder]=\"'files.share.search_placeholder' | translate\"\n />\n <select class=\"fac-select\" [(ngModel)]=\"newLevel\">\n @for (opt of levelOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.labelKey | translate }}</option>\n }\n </select>\n </div>\n\n @if (searchResults().length > 0) {\n <div class=\"fac-search-results\">\n @for (result of searchResults(); track result.id) {\n <div class=\"fac-search-item\" (click)=\"onGrantToUser(result)\">\n <i class=\"pi pi-user\" aria-hidden=\"true\"></i>\n <span>{{ result.firstName }} {{ result.lastName }}</span>\n <span class=\"fac-email\">{{ result.email }}</span>\n </div>\n }\n </div>\n }\n\n @if (chartOptions().length > 0) {\n <div class=\"fac-chart-row\">\n <label for=\"fac-org-chart-select\" class=\"fac-section-label\">{{\n 'files.share.org_chart' | translate\n }}</label>\n <select\n id=\"fac-org-chart-select\"\n class=\"fac-select\"\n [ngModel]=\"selectedOrgChartId()\"\n (ngModelChange)=\"onOrgChartSelectChange($event)\">\n @for (opt of chartOptions(); track $index) {\n <option [ngValue]=\"opt.id\">{{ opt.name }}</option>\n }\n </select>\n </div>\n }\n\n @if (showOuPicker()) {\n <div class=\"fac-ou-section\">\n <div class=\"fac-section-label\">{{ 'files.share.share_with_ou' | translate }}</div>\n @for (ou of ouTree(); track ou.id) {\n <div\n class=\"fac-ou-item\"\n [style.padding-inline-start.px]=\"ouIndentStartPx(ou)\"\n (click)=\"onGrantToOu(ou)\"\n >\n <i class=\"pi pi-sitemap\" aria-hidden=\"true\"></i>\n <span>{{ ou.displayName }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"fac-toggle-row\">\n <button type=\"button\" class=\"fac-link\" (click)=\"showOuPicker.set(!showOuPicker())\">\n {{ showOuPicker() ? ('files.share.hide_ous' | translate) : ('files.share.show_ous' | translate) }}\n </button>\n @if (showApplyToChildren) {\n <label class=\"fac-checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"applyToChildren\" />\n {{ 'files.share.apply_children' | translate }}\n </label>\n }\n </div>\n </div>\n\n <div class=\"fac-perms-section\">\n <div class=\"fac-section-label\">{{ 'files.share.current_permissions' | translate }}</div>\n @if (loading()) {\n <div class=\"fac-loading\"><i class=\"pi pi-spin pi-spinner\" aria-hidden=\"true\"></i></div>\n } @else if (permissions().length === 0) {\n <div class=\"fac-empty\">{{ 'files.share.no_permissions' | translate }}</div>\n } @else {\n @for (perm of permissions(); track perm.id) {\n <div class=\"fac-perm-row\">\n <div class=\"fac-perm-info\">\n <i [class]=\"getPermIcon(perm)\" aria-hidden=\"true\"></i>\n <span class=\"fac-perm-name\">{{ getPermLabel(perm) }}</span>\n @if (perm.isInherited) {\n <span class=\"fac-badge inherited\">{{ 'files.share.inherited' | translate }}</span>\n }\n </div>\n <div class=\"fac-perm-actions\">\n <select\n class=\"fac-select sm\"\n [ngModel]=\"perm.level\"\n (ngModelChange)=\"onUpdateLevel(perm, $event)\"\n [disabled]=\"perm.isInherited === true\"\n >\n @for (opt of levelOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.labelKey | translate }}</option>\n }\n </select>\n <button\n type=\"button\"\n class=\"fac-icon-btn danger\"\n (click)=\"onRevokePermission(perm)\"\n [disabled]=\"perm.isInherited === true\"\n [title]=\"'files.share.revoke' | translate\"\n >\n <i class=\"pi pi-trash\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n</div>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\n\n/** Full-bleed loading overlay for window content (shell) or embedded hosts. */\n@Component({\n selector: 'fly-block-ui',\n standalone: true,\n imports: [TranslatePipe],\n templateUrl: './block-ui.component.html',\n styleUrl: './block-ui.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FlyBlockUiComponent {\n /** When false, the overlay is not rendered (host may use @if instead). */\n active = input.required<boolean>();\n\n /** i18n key for status text; empty uses `common.loading`. */\n messageKey = input('');\n\n readonly resolvedMessageKey = computed(() => {\n const k = this.messageKey()?.trim();\n return k && k.length > 0 ? k : 'common.loading';\n });\n}\n","@if (active()) {\n <div\n class=\"fly-block-ui\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n [attr.aria-label]=\"resolvedMessageKey() | translate\">\n <div class=\"fly-block-ui__card\">\n <i class=\"pi pi-spin pi-spinner fly-block-ui__spinner\" aria-hidden=\"true\"></i>\n <span class=\"fly-block-ui__text\">{{ resolvedMessageKey() | translate }}</span>\n </div>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport type { FlyFileInfo } from '../../models/file.model';\nimport Cropper from 'cropperjs';\n\n/**\n * Image upload component with built-in cropperjs cropping modal.\n *\n * Usage:\n * ```html\n * <fly-image-upload\n * [aspectRatio]=\"16/9\"\n * [currentImageId]=\"trend.coverImageId\"\n * sourceApp=\"circles\"\n * sourceEntityType=\"trend\"\n * (uploaded)=\"onImageUploaded($event)\"\n * (removed)=\"onImageRemoved()\"\n * />\n * ```\n */\n@Component({\n selector: 'fly-image-upload',\n standalone: true,\n imports: [TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div class=\"fly-image-upload\">\n @if (previewUrl()) {\n <div class=\"fly-image-upload__preview\">\n <img [src]=\"previewUrl()\" alt=\"\" class=\"fly-image-upload__img\" />\n <div class=\"fly-image-upload__overlay\">\n <button type=\"button\" class=\"fly-image-upload__action-btn\" (click)=\"triggerFileInput()\" [title]=\"'files.imageUpload.change' | translate\">\n <span class=\"pi pi-pencil\" aria-hidden=\"true\"></span>\n </button>\n <button type=\"button\" class=\"fly-image-upload__action-btn fly-image-upload__action-btn--danger\" (click)=\"removeImage()\" [title]=\"'files.imageUpload.remove' | translate\">\n <span class=\"pi pi-trash\" aria-hidden=\"true\"></span>\n </button>\n </div>\n </div>\n } @else {\n <button type=\"button\" class=\"fly-image-upload__dropzone\" (click)=\"triggerFileInput()\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event)\">\n @if (uploading()) {\n <span class=\"pi pi-spin pi-spinner fly-image-upload__icon\" aria-hidden=\"true\"></span>\n <span class=\"fly-image-upload__label\">{{ 'files.imageUpload.uploading' | translate }}</span>\n } @else {\n <span class=\"pi pi-image fly-image-upload__icon\" aria-hidden=\"true\"></span>\n <span class=\"fly-image-upload__label\">{{ 'files.imageUpload.placeholder' | translate }}</span>\n <span class=\"fly-image-upload__hint\">{{ sizeHint() }}</span>\n }\n </button>\n }\n\n @if (error()) {\n <div class=\"fly-image-upload__error\">{{ error() }}</div>\n }\n\n <input #fileInput type=\"file\" accept=\"image/*\" class=\"fly-image-upload__hidden\" (change)=\"onFileSelected($event)\" />\n\n @if (showCropper()) {\n <div class=\"fly-image-upload__crop-backdrop\" (click)=\"cancelCrop()\">\n <div class=\"fly-image-upload__crop-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"fly-image-upload__crop-header\">\n <h3>{{ 'files.imageUpload.crop' | translate }}</h3>\n </div>\n <div class=\"fly-image-upload__crop-body\">\n <img #cropImage [src]=\"rawImageUrl()\" alt=\"\" />\n </div>\n <div class=\"fly-image-upload__crop-footer\">\n <button type=\"button\" class=\"vos-btn sm platter\" (click)=\"cancelCrop()\">{{ 'common.cancel' | translate }}</button>\n <button type=\"button\" class=\"vos-btn sm primary\" (click)=\"applyCrop()\">{{ 'files.imageUpload.apply' | translate }}</button>\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [\n /* cropperjs v1 styles (MIT — Chen Fengyuan) */\n `.cropper-container{-webkit-touch-callout:none;direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;user-select:none}.cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:rgba(51,153,255,.75);overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:\" \";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC\")}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}`,\n `\n .fly-image-upload { display: flex; flex-direction: column; gap: 6px; }\n .fly-image-upload__hidden { display: none; }\n\n .fly-image-upload__dropzone {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 8px; padding: 24px; border: 2px dashed var(--separator-primary, #e5e7eb);\n border-radius: 12px; background: var(--fill-quaternary, #f9fafb); cursor: pointer;\n transition: border-color 0.15s, background 0.15s; min-height: 120px;\n }\n .fly-image-upload__dropzone:hover { border-color: var(--accent-primary, #0071e3); background: var(--fill-tertiary, #f3f4f6); }\n .fly-image-upload__icon { font-size: 28px; color: var(--label-tertiary, #9ca3af); }\n .fly-image-upload__label { font-size: 13px; color: var(--label-secondary, #6b7280); }\n .fly-image-upload__hint { font-size: 11px; color: var(--label-tertiary, #9ca3af); }\n\n .fly-image-upload__preview { position: relative; border-radius: 12px; overflow: hidden; }\n .fly-image-upload__img { display: block; width: 100%; max-height: 280px; object-fit: cover; border-radius: 12px; }\n .fly-image-upload__overlay {\n position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;\n gap: 12px; background: rgba(0,0,0,0.35); opacity: 0; transition: opacity 0.15s;\n }\n .fly-image-upload__preview:hover .fly-image-upload__overlay { opacity: 1; }\n .fly-image-upload__action-btn {\n width: 36px; height: 36px; border-radius: 50%; border: none; cursor: pointer;\n display: flex; align-items: center; justify-content: center;\n background: rgba(255,255,255,0.9); color: var(--label-primary, #1f2937); font-size: 14px;\n transition: background 0.15s;\n }\n .fly-image-upload__action-btn:hover { background: #fff; }\n .fly-image-upload__action-btn--danger:hover { background: #fee2e2; color: #dc2626; }\n\n .fly-image-upload__error { font-size: 12px; color: var(--system-red, #ef4444); }\n\n .fly-image-upload__crop-backdrop {\n position: fixed; inset: 0; z-index: 10000; display: flex; align-items: center; justify-content: center;\n background: rgba(0,0,0,0.6); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);\n }\n .fly-image-upload__crop-modal {\n background: var(--bg-primary, #fff); color: var(--label-primary, #1f2937);\n border-radius: 16px; overflow: hidden;\n max-width: 700px; width: 90vw; box-shadow: 0 20px 60px rgba(0,0,0,0.4);\n border: 1px solid var(--separator-primary, rgba(0,0,0,0.1));\n }\n .fly-image-upload__crop-header {\n padding: 16px 20px; border-bottom: 1px solid var(--separator-primary, #e5e7eb);\n background: var(--fill-quaternary, transparent);\n }\n .fly-image-upload__crop-header h3 {\n margin: 0; font-size: 16px; font-weight: 600; color: var(--label-primary, #1f2937);\n }\n .fly-image-upload__crop-body {\n max-height: 60vh; overflow: hidden; background: var(--fill-tertiary, #f3f4f6);\n }\n .fly-image-upload__crop-body img { display: block; max-width: 100%; }\n .fly-image-upload__crop-footer {\n display: flex; justify-content: flex-end; gap: 10px; padding: 14px 20px;\n border-top: 1px solid var(--separator-primary, #e5e7eb);\n background: var(--fill-quaternary, transparent);\n }\n\n /* Spatial theme: frosted glass modal */\n html.spatial-theme .fly-image-upload__crop-modal {\n background: rgba(255,255,255,0.65); backdrop-filter: blur(40px) saturate(1.8);\n -webkit-backdrop-filter: blur(40px) saturate(1.8);\n border: 1px solid rgba(255,255,255,0.4);\n }\n html.spatial-theme .fly-image-upload__crop-header,\n html.spatial-theme .fly-image-upload__crop-footer { background: transparent; }\n html.spatial-theme .fly-image-upload__crop-body { background: rgba(0,0,0,0.05); }\n\n /* Dark theme */\n html.dark-theme .fly-image-upload__crop-modal {\n background: var(--bg-primary, #1c1c1e);\n border: 1px solid var(--separator-primary, rgba(255,255,255,0.1));\n }\n html.dark-theme .fly-image-upload__crop-body { background: var(--fill-tertiary, #2c2c2e); }\n `],\n})\nexport class FlyImageUploadComponent {\n private http = inject(HttpClient);\n\n // ── Inputs ──\n aspectRatio = input(16 / 9);\n maxSizeBytes = input(5 * 1024 * 1024);\n currentImageId = input<string | null>(null);\n sourceApp = input('unknown');\n sourceEntityType = input<string | null>(null);\n sourceEntityId = input<string | null>(null);\n\n // ── Outputs ──\n uploaded = output<FlyFileInfo>();\n removed = output<void>();\n\n // ── State ──\n uploading = signal(false);\n error = signal<string | null>(null);\n showCropper = signal(false);\n rawImageUrl = signal<string>('');\n localBlob = signal<string | null>(null);\n\n fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n cropImage = viewChild<ElementRef<HTMLImageElement>>('cropImage');\n\n private cropper: Cropper | null = null;\n private selectedFile: File | null = null;\n\n previewUrl = computed(() => {\n if (this.localBlob()) return this.localBlob();\n const id = this.currentImageId();\n return id ? `/api/files/${id}/download` : null;\n });\n\n sizeHint = computed(() => {\n const mb = this.maxSizeBytes() / (1024 * 1024);\n return `Max ${mb}MB`;\n });\n\n triggerFileInput(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n onDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n }\n\n onDrop(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n const file = e.dataTransfer?.files?.[0];\n if (file) this.processFile(file);\n }\n\n onFileSelected(e: Event): void {\n const input = e.target as HTMLInputElement;\n const file = input.files?.[0];\n if (file) this.processFile(file);\n input.value = '';\n }\n\n removeImage(): void {\n this.localBlob.set(null);\n this.error.set(null);\n this.removed.emit();\n }\n\n cancelCrop(): void {\n this.showCropper.set(false);\n this.destroyCropper();\n if (this.rawImageUrl()) URL.revokeObjectURL(this.rawImageUrl());\n this.rawImageUrl.set('');\n }\n\n applyCrop(): void {\n if (!this.cropper) return;\n const canvas = this.cropper.getCroppedCanvas({ maxWidth: 1920, maxHeight: 1080 });\n this.showCropper.set(false);\n this.destroyCropper();\n if (this.rawImageUrl()) URL.revokeObjectURL(this.rawImageUrl());\n this.rawImageUrl.set('');\n\n canvas.toBlob((blob) => {\n if (!blob) return;\n const fileName = this.selectedFile?.name ?? 'cropped-image.jpg';\n const file = new File([blob], fileName, { type: blob.type || 'image/jpeg' });\n this.uploadFile(file);\n }, 'image/jpeg', 0.9);\n }\n\n private processFile(file: File): void {\n this.error.set(null);\n\n if (!file.type.startsWith('image/')) {\n this.error.set('Only image files are allowed');\n return;\n }\n if (file.size > this.maxSizeBytes()) {\n const mb = this.maxSizeBytes() / (1024 * 1024);\n this.error.set(`File exceeds ${mb}MB limit`);\n return;\n }\n\n this.selectedFile = file;\n const url = URL.createObjectURL(file);\n this.rawImageUrl.set(url);\n this.showCropper.set(true);\n\n // Wait for next tick so cropImage element is in DOM\n setTimeout(() => this.initCropper(), 0);\n }\n\n private initCropper(): void {\n this.destroyCropper();\n const imgEl = this.cropImage()?.nativeElement;\n if (!imgEl) return;\n this.cropper = new Cropper(imgEl, {\n aspectRatio: this.aspectRatio(),\n viewMode: 1,\n autoCropArea: 0.9,\n responsive: true,\n background: false,\n });\n }\n\n private destroyCropper(): void {\n this.cropper?.destroy();\n this.cropper = null;\n }\n\n private uploadFile(file: File): void {\n this.uploading.set(true);\n this.error.set(null);\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n formData.append('sourceApp', this.sourceApp());\n if (this.sourceEntityType()) formData.append('sourceEntityType', this.sourceEntityType()!);\n if (this.sourceEntityId()) formData.append('sourceEntityId', this.sourceEntityId()!);\n\n this.http.post<{ data: FlyFileInfo }>('/api/files/upload', formData).subscribe({\n next: (res) => {\n this.uploading.set(false);\n const info = res.data ?? (res as any);\n this.localBlob.set(URL.createObjectURL(file));\n this.uploaded.emit(info);\n },\n error: (err) => {\n this.uploading.set(false);\n this.error.set(err?.error?.message ?? 'Upload failed');\n },\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { HttpClient, HttpEventType } from '@angular/common/http';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport type { FlyFileInfo } from '../../models/file.model';\n\ninterface UploadSlot {\n file: File;\n progress: number; // 0–100\n status: 'uploading' | 'done' | 'error';\n info?: FlyFileInfo;\n error?: string;\n}\n\nconst FILE_ICONS: Record<string, string> = {\n 'application/pdf': 'pi-file-pdf',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'pi-file-word',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'pi-file-excel',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pi-file',\n 'image/': 'pi-image',\n 'video/': 'pi-video',\n 'audio/': 'pi-volume-up',\n};\n\nfunction iconForType(contentType: string): string {\n for (const [prefix, icon] of Object.entries(FILE_ICONS)) {\n if (contentType.startsWith(prefix)) return icon;\n }\n return 'pi-file';\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Multi-file upload with drag-drop, progress, and validation.\n *\n * Usage:\n * ```html\n * <fly-file-upload\n * [maxFiles]=\"5\"\n * [maxFileSizeBytes]=\"5242880\"\n * accept=\".pdf,.docx,.xlsx\"\n * [(files)]=\"trend.attachments\"\n * sourceApp=\"circles\"\n * sourceEntityType=\"trend\"\n * (filesChanged)=\"onAttachmentsChanged($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'fly-file-upload',\n standalone: true,\n imports: [TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"fly-file-upload\">\n @if (canAddMore()) {\n <div class=\"fly-file-upload__dropzone\"\n [class.fly-file-upload__dropzone--drag]=\"dragging()\"\n (click)=\"triggerFileInput()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <span class=\"pi pi-cloud-upload fly-file-upload__icon\" aria-hidden=\"true\"></span>\n <span class=\"fly-file-upload__label\">{{ 'files.fileUpload.dropOrClick' | translate }}</span>\n <span class=\"fly-file-upload__hint\">{{ limitHint() }}</span>\n </div>\n }\n\n @if (error()) {\n <div class=\"fly-file-upload__error\">{{ error() }}</div>\n }\n\n @if (allSlots().length) {\n <ul class=\"fly-file-upload__list\">\n @for (slot of allSlots(); track slot.file.name + slot.file.size) {\n <li class=\"fly-file-upload__item\">\n <span class=\"pi {{ iconFor(slot) }} fly-file-upload__file-icon\" aria-hidden=\"true\"></span>\n <div class=\"fly-file-upload__file-info\">\n <span class=\"fly-file-upload__file-name\">{{ slot.file.name }}</span>\n <span class=\"fly-file-upload__file-size\">{{ formatFileSize(slot.file.size) }}</span>\n </div>\n @if (slot.status === 'uploading') {\n <div class=\"fly-file-upload__progress-track\">\n <div class=\"fly-file-upload__progress-fill\" [style.width.%]=\"slot.progress\"></div>\n </div>\n }\n @if (slot.status === 'error') {\n <span class=\"fly-file-upload__file-error\" [title]=\"slot.error ?? ''\">\n <span class=\"pi pi-exclamation-triangle\" aria-hidden=\"true\"></span>\n </span>\n }\n @if (slot.status === 'done') {\n <span class=\"pi pi-check-circle fly-file-upload__file-ok\" aria-hidden=\"true\"></span>\n }\n <button type=\"button\" class=\"fly-file-upload__remove-btn\" (click)=\"removeSlot(slot)\" [title]=\"'common.remove' | translate\">\n <span class=\"pi pi-times\" aria-hidden=\"true\"></span>\n </button>\n </li>\n }\n </ul>\n }\n\n @if (existingFiles().length && !allSlots().length) {\n <ul class=\"fly-file-upload__list\">\n @for (f of existingFiles(); track f.id) {\n <li class=\"fly-file-upload__item\">\n <span class=\"pi {{ iconForInfo(f) }} fly-file-upload__file-icon\" aria-hidden=\"true\"></span>\n <div class=\"fly-file-upload__file-info\">\n <span class=\"fly-file-upload__file-name\">{{ f.fileName }}</span>\n <span class=\"fly-file-upload__file-size\">{{ formatFileSize(f.sizeBytes) }}</span>\n </div>\n <span class=\"pi pi-check-circle fly-file-upload__file-ok\" aria-hidden=\"true\"></span>\n <button type=\"button\" class=\"fly-file-upload__remove-btn\" (click)=\"removeExisting(f)\" [title]=\"'common.remove' | translate\">\n <span class=\"pi pi-times\" aria-hidden=\"true\"></span>\n </button>\n </li>\n }\n </ul>\n }\n\n <input #fileInput type=\"file\" [accept]=\"accept()\" multiple class=\"fly-file-upload__hidden\" (change)=\"onFilesSelected($event)\" />\n </div>\n `,\n styles: [`\n .fly-file-upload { display: flex; flex-direction: column; gap: 8px; }\n .fly-file-upload__hidden { display: none; }\n\n .fly-file-upload__dropzone {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 6px; padding: 20px; border: 2px dashed var(--separator-primary, #e5e7eb);\n border-radius: 10px; background: var(--fill-quaternary, #f9fafb); cursor: pointer;\n transition: border-color 0.15s, background 0.15s;\n }\n .fly-file-upload__dropzone:hover,\n .fly-file-upload__dropzone--drag { border-color: var(--accent-primary, #0071e3); background: var(--fill-tertiary, #f3f4f6); }\n .fly-file-upload__icon { font-size: 24px; color: var(--label-tertiary, #9ca3af); }\n .fly-file-upload__label { font-size: 13px; color: var(--label-secondary, #6b7280); }\n .fly-file-upload__hint { font-size: 11px; color: var(--label-tertiary, #9ca3af); }\n\n .fly-file-upload__error { font-size: 12px; color: var(--system-red, #ef4444); padding: 4px 0; }\n\n .fly-file-upload__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }\n .fly-file-upload__item {\n display: flex; align-items: center; gap: 10px; padding: 8px 12px;\n border: 1px solid var(--separator-primary, #e5e7eb); border-radius: 8px;\n background: var(--fill-quaternary, #f9fafb); font-size: 13px;\n }\n .fly-file-upload__file-icon { font-size: 18px; color: var(--label-tertiary, #9ca3af); flex-shrink: 0; }\n .fly-file-upload__file-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }\n .fly-file-upload__file-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--label-primary, #1f2937); }\n .fly-file-upload__file-size { font-size: 11px; color: var(--label-tertiary, #9ca3af); }\n\n .fly-file-upload__progress-track { width: 60px; height: 4px; border-radius: 2px; background: var(--fill-tertiary, #e5e7eb); overflow: hidden; }\n .fly-file-upload__progress-fill { height: 100%; background: var(--accent-primary, #0071e3); border-radius: 2px; transition: width 0.2s; }\n\n .fly-file-upload__file-ok { color: var(--system-green, #22c55e); font-size: 14px; }\n .fly-file-upload__file-error { color: var(--system-red, #ef4444); font-size: 14px; }\n\n .fly-file-upload__remove-btn {\n background: none; border: none; cursor: pointer; color: var(--label-tertiary, #9ca3af);\n width: 24px; height: 24px; display: flex; align-items: center; justify-content: center;\n border-radius: 4px; transition: color 0.15s, background 0.15s; flex-shrink: 0;\n }\n .fly-file-upload__remove-btn:hover { color: var(--system-red, #ef4444); background: var(--fill-tertiary, #f3f4f6); }\n `],\n})\nexport class FlyFileUploadComponent {\n private http = inject(HttpClient);\n\n // ── Inputs ──\n maxFiles = input(5);\n maxFileSizeBytes = input(5 * 1024 * 1024);\n accept = input('');\n sourceApp = input('unknown');\n sourceEntityType = input<string | null>(null);\n sourceEntityId = input<string | null>(null);\n\n /** Two-way model for completed file metadata. */\n files = model<FlyFileInfo[]>([]);\n\n // ── Outputs ──\n filesChanged = output<FlyFileInfo[]>();\n\n // ── State ──\n error = signal<string | null>(null);\n dragging = signal(false);\n slots = signal<UploadSlot[]>([]);\n\n /** Pre-existing files loaded from the entity (before any new uploads this session). */\n existingFiles = signal<FlyFileInfo[]>([]);\n\n fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n\n allSlots = computed(() => this.slots());\n\n canAddMore = computed(() => {\n const current = this.files().length + this.slots().filter(s => s.status === 'uploading').length;\n return current < this.maxFiles();\n });\n\n limitHint = computed(() => {\n const mb = this.maxFileSizeBytes() / (1024 * 1024);\n return `Max ${this.maxFiles()} files, ${mb}MB each`;\n });\n\n triggerFileInput(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n onDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.dragging.set(true);\n }\n\n onDragLeave(e: DragEvent): void {\n e.preventDefault();\n this.dragging.set(false);\n }\n\n onDrop(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.dragging.set(false);\n const fileList = e.dataTransfer?.files;\n if (fileList) this.processFiles(Array.from(fileList));\n }\n\n onFilesSelected(e: Event): void {\n const input = e.target as HTMLInputElement;\n if (input.files) this.processFiles(Array.from(input.files));\n input.value = '';\n }\n\n removeSlot(slot: UploadSlot): void {\n this.slots.update(s => s.filter(x => x !== slot));\n if (slot.info) {\n this.files.update(f => f.filter(x => x.id !== slot.info!.id));\n this.filesChanged.emit(this.files());\n }\n }\n\n removeExisting(f: FlyFileInfo): void {\n this.existingFiles.update(list => list.filter(x => x.id !== f.id));\n this.files.update(list => list.filter(x => x.id !== f.id));\n this.filesChanged.emit(this.files());\n }\n\n iconFor(slot: UploadSlot): string { return iconForType(slot.file.type); }\n iconForInfo(f: FlyFileInfo): string { return iconForType(f.contentType); }\n formatFileSize(bytes: number): string { return formatSize(bytes); }\n\n private processFiles(newFiles: File[]): void {\n this.error.set(null);\n const currentCount = this.files().length + this.slots().filter(s => s.status === 'uploading').length;\n const remaining = this.maxFiles() - currentCount;\n\n if (remaining <= 0) {\n this.error.set(`Maximum ${this.maxFiles()} files allowed`);\n return;\n }\n\n const toUpload = newFiles.slice(0, remaining);\n if (newFiles.length > remaining) {\n this.error.set(`Only ${remaining} more file(s) can be added`);\n }\n\n for (const file of toUpload) {\n if (file.size > this.maxFileSizeBytes()) {\n const mb = this.maxFileSizeBytes() / (1024 * 1024);\n this.error.set(`\"${file.name}\" exceeds ${mb}MB limit`);\n continue;\n }\n this.uploadFile(file);\n }\n }\n\n private uploadFile(file: File): void {\n const slot: UploadSlot = { file, progress: 0, status: 'uploading' };\n this.slots.update(s => [...s, slot]);\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n formData.append('sourceApp', this.sourceApp());\n if (this.sourceEntityType()) formData.append('sourceEntityType', this.sourceEntityType()!);\n if (this.sourceEntityId()) formData.append('sourceEntityId', this.sourceEntityId()!);\n\n this.http.post<{ data: FlyFileInfo }>('/api/files/upload', formData, {\n reportProgress: true,\n observe: 'events',\n }).subscribe({\n next: (event) => {\n if (event.type === HttpEventType.UploadProgress && event.total) {\n slot.progress = Math.round((event.loaded / event.total) * 100);\n this.slots.update(s => [...s]); // trigger signal change\n } else if (event.type === HttpEventType.Response) {\n const info = (event.body as any)?.data ?? event.body;\n slot.status = 'done';\n slot.progress = 100;\n slot.info = info;\n this.slots.update(s => [...s]);\n this.files.update(f => [...f, info]);\n this.filesChanged.emit(this.files());\n }\n },\n error: (err) => {\n slot.status = 'error';\n slot.error = err?.error?.message ?? 'Upload failed';\n this.slots.update(s => [...s]);\n },\n });\n }\n}\n","/*\r\n * @mohamedatia/fly-design-system — Public API\r\n * https://www.npmjs.com/package/@mohamedatia/fly-design-system\r\n *\r\n * This is the single entry point for Business / Supporting App developers.\r\n * Import everything from '@mohamedatia/fly-design-system' — never from relative shell paths.\r\n *\r\n * NOTE: This package is published under @mohamedatia/fly-design-system until the @fly\r\n * npm org is created. It will be republished as @fly/design-system once available.\r\n *\r\n * v1.3.0: FlyThemeService (html theme classes), hardened I18nService (AbortSignal, ErrorHandler, RTL helpers).\r\n * v1.3.1: loadBundle normalizes locale JSON (flat or nested objects; rejects invalid leaves).\r\n * v1.3.2: loadBundle returns boolean; LoadBundleOptions.silent skips ErrorHandler on failure.\r\n * v1.3.7: MockAuthService base class + MockAuthConfig for Business App mock auth via fileReplacements.\r\n * User model extended with optional avatar, source, twoFactorEnabled, createdAt fields.\r\n * v1.3.8: AuthService.init() no-op added so Business Apps can call init() in APP_INITIALIZER\r\n * without branching between standalone and embedded modes.\r\n * v1.3.9: MockAuthService field initializers moved into constructor to fix ngDevMode ReferenceError\r\n * when the package is loaded in a production-mode bundle (no ngDevMode global defined).\r\n * v1.4.0: ContextMenuComponent (positioned menu, keyboard nav, focus management) moved from desktop\r\n * shell to design system. MessageBoxService + MessageBoxComponent added (Windows Forms-style\r\n * modal dialogs with localized button labels, focus management, and Escape key support).\r\n * MessageBoxButtons, MessageBoxIcon, DialogResult, MessageBoxOptions, MessageBoxButton exported.\r\n * v1.5.0: SharePanelComponent — generic share/ACL overlay; host supplies API callbacks and optional\r\n * permission level options (file ACL vs note-style View/Edit).\r\n * v1.6.0: SharePanelComponent — `loadOuTree(chartId: string | null)`; optional `loadChartOptions` for\r\n * default vs alternative org charts (OU grants still use real OU ids). `ShareOrgChartOption` exported.\r\n * v1.7.0: SharePanelComponent — `loadChartOptions` and `loadOuLabelMap` are required; chart tree loads after\r\n * options resolve (no spurious null fetch). `loadOuLabelMap` supplies default-tree labels for OU rows.\r\n * v1.8.0: `WindowInstance` optional `contentUiBlocked` / `contentUiBlockMessageKey`; `WindowManagerService`\r\n * `beginContentUiBlock` / `endContentUiBlock` default no-ops; `FlyBlockUiComponent` for shell window overlay.\r\n * See docs/ExternalAppsGuide/03-frontend-app.md.\r\n */\r\n\r\n// ─── Models ──────────────────────────────────────────────────────────────────\r\nexport type { DesktopApp, DesktopAppKind } from './lib/models/app.model';\r\nexport type {\r\n WindowInstance,\r\n WindowState,\r\n ChildWindowData,\r\n} from './lib/models/window.model';\r\nexport { WINDOW_DATA } from './lib/models/window.model';\r\nexport type { User } from './lib/models/user.model';\r\n\r\nexport type {\r\n SharePermissionEntry,\r\n ShareUserResult,\r\n ShareOuNode,\r\n ShareOrgChartOption,\r\n SharePanelLevelOption,\r\n} from './lib/models/share-panel.model';\r\n\r\n// ─── Remote App Registration ─────────────────────────────────────────────────\r\nexport type { RemoteAppDef } from './lib/models/remote-app.model';\r\n\r\n// ─── Services ────────────────────────────────────────────────────────────────\r\nexport { AuthService } from './lib/services/auth.service';\r\nexport type { LoadBundleOptions } from './lib/services/i18n.service';\r\nexport { I18nService, RTL_LOCALE_SET, isRtlLocale } from './lib/services/i18n.service';\r\nexport {\r\n FlyThemeService,\r\n type FlyThemeMode,\r\n DEFAULT_FLY_THEME_MODE,\r\n FLY_THEME_MODE_IDS,\r\n normalizeFlyTheme,\r\n} from './lib/services/fly-theme.service';\r\nexport {\r\n WindowManagerService,\r\n StandaloneWindowManagerService,\r\n type OpenWindowOptions,\r\n} from './lib/services/window-manager.service';\r\n\r\n// ─── Pipes ───────────────────────────────────────────────────────────────────\r\nexport { TranslatePipe } from './lib/pipes/translate.pipe';\r\n\r\n// ─── Mock Auth (for fileReplacements in dev/mock builds) ─────────────────────\r\nexport { MockAuthService, type MockAuthConfig } from './lib/services/auth.service.mock';\r\n\r\n// ─── Components ──────────────────────────────────────────────────────────────\r\nexport {\r\n ContextMenuComponent,\r\n type ContextMenuItem,\r\n type ContextMenuSection,\r\n} from './lib/components/context-menu/context-menu.component';\r\n\r\nexport {\r\n MessageBoxComponent,\r\n} from './lib/components/message-box/message-box.component';\r\n\r\nexport {\r\n MessageBoxService,\r\n MessageBoxButtons,\r\n MessageBoxIcon,\r\n DialogResult,\r\n type MessageBoxOptions,\r\n type MessageBoxButton,\r\n} from './lib/components/message-box/message-box.service';\r\n\r\nexport {\r\n SharePanelComponent,\r\n SHARE_PANEL_DEFAULT_FILE_LEVELS,\r\n} from './lib/components/share-panel/share-panel.component';\r\n\r\nexport { FlyBlockUiComponent } from './lib/components/block-ui/block-ui.component';\r\n\r\n// ─── File Upload Components ─────────────────────────────────────────────────\r\nexport type { FlyFileInfo } from './lib/models/file.model';\r\n\r\nexport { FlyImageUploadComponent } from './lib/components/image-upload/fly-image-upload.component';\r\n\r\nexport { FlyFileUploadComponent } from './lib/components/file-upload/fly-file-upload.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mohamedatia-fly-design-system.mjs","sources":["../../../projects/design-system/src/lib/models/window.model.ts","../../../projects/design-system/src/lib/services/auth.service.ts","../../../projects/design-system/src/lib/services/i18n.service.ts","../../../projects/design-system/src/lib/services/fly-theme.service.ts","../../../projects/design-system/src/lib/services/window-manager.service.ts","../../../projects/design-system/src/lib/pipes/translate.pipe.ts","../../../projects/design-system/src/lib/services/auth.service.mock.ts","../../../projects/design-system/src/lib/components/context-menu/context-menu.component.ts","../../../projects/design-system/src/lib/components/context-menu/context-menu.component.html","../../../projects/design-system/src/lib/components/message-box/message-box.service.ts","../../../projects/design-system/src/lib/components/message-box/message-box.component.ts","../../../projects/design-system/src/lib/components/message-box/message-box.component.html","../../../projects/design-system/src/lib/components/share-panel/share-panel.component.ts","../../../projects/design-system/src/lib/components/share-panel/share-panel.component.html","../../../projects/design-system/src/lib/components/block-ui/block-ui.component.ts","../../../projects/design-system/src/lib/components/block-ui/block-ui.component.html","../../../projects/design-system/src/lib/components/image-upload/fly-image-upload.component.ts","../../../projects/design-system/src/lib/components/file-upload/fly-file-upload.component.ts","../../../projects/design-system/src/public-api.ts","../../../projects/design-system/src/mohamedatia-fly-design-system.ts"],"sourcesContent":["import { InjectionToken, Type } from '@angular/core';\r\n\r\nexport type WindowState = 'normal' | 'minimized' | 'maximized';\r\n\r\nexport interface ChildWindowData {\r\n childComponent: Type<unknown>;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface WindowInstance {\r\n id: string;\r\n appId: string;\r\n title: string;\r\n icon: string;\r\n iconBg: string;\r\n state: WindowState;\r\n position: { x: number; y: number };\r\n size: { width: number; height: number };\r\n zIndex: number;\r\n isFocused: boolean;\r\n isClosing?: boolean;\r\n isMinimizing?: boolean;\r\n isRestoring?: boolean;\r\n isMaximizing?: boolean;\r\n isUnmaximizing?: boolean;\r\n parentWindowId?: string;\r\n childData?: ChildWindowData;\r\n /** Populated when remote `loadComponent()` fails (e.g. federation). */\r\n remoteLoadError?: string;\r\n /** When true, the shell draws a block overlay over `.window-content` (see `FlyBlockUiComponent`). */\r\n contentUiBlocked?: boolean;\r\n /** i18n key for block overlay label; shell defaults to `common.loading` when unset. */\r\n contentUiBlockMessageKey?: string;\r\n}\r\n\r\nexport const WINDOW_DATA = new InjectionToken<WindowInstance>('WINDOW_DATA');\r\n","import { Injectable, computed, signal } from '@angular/core';\nimport { User } from '../models/user.model';\n\ninterface AuthSession {\n user: User;\n accessToken: string;\n expiresAt: number;\n}\n\n/**\n * Shared AuthService for Business Apps.\n *\n * This is a **read-only signal store** — Business Apps inject it to read the\n * current user and access token. The FlyOS shell populates it after PKCE login\n * and silent refresh. Business Apps must never call setSession() directly.\n *\n * When running as a Module Federation remote, the shell and the Business App\n * share this singleton via the `@mohamedatia/fly-design-system` shared mapping\n * in federation.config.js — so the shell's populated instance is the same\n * object the Business App reads.\n *\n * When running standalone (without the shell), call initFromToken() with a\n * JWT stored in localStorage to hydrate the user.\n */\n@Injectable({ providedIn: 'root' })\nexport class AuthService {\n private _session = signal<AuthSession | null>(null);\n\n readonly currentUser = computed(() => this._session()?.user ?? null);\n readonly accessToken = computed(() => this._session()?.accessToken ?? null);\n readonly isAuthenticated = computed(() => {\n const s = this._session();\n return s !== null && s.expiresAt > Date.now();\n });\n\n /**\n * No-op when running as a Module Federation remote — the shell has already\n * initialised the session before the remote bootstraps. Business Apps call\n * this in their APP_INITIALIZER so the same code works in both standalone\n * and embedded modes without branching.\n */\n async init(): Promise<void> {}\n\n /**\n * Called by the shell after a successful login or silent refresh.\n * Business Apps should not call this directly.\n */\n setSession(user: User, accessToken: string, expiresAt: number): void {\n this._session.set({ user, accessToken, expiresAt });\n }\n\n /** Clears the in-memory session (called by the shell on logout). */\n clearSession(): void {\n this._session.set(null);\n }\n\n /**\n * Standalone mode: parse a JWT from localStorage and hydrate the user.\n * Pass the storage key your app uses; embedded remotes typically set this in `APP_INITIALIZER`.\n */\n initFromToken(storageKey = 'circles_token'): void {\n const token = localStorage.getItem(storageKey);\n if (!token) return;\n try {\n const base64 = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/');\n const payload = JSON.parse(decodeURIComponent(\n atob(base64).split('').map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join('')\n )) as Record<string, unknown>;\n\n const rawRole = payload['role'];\n const roles = Array.isArray(rawRole) ? rawRole as string[] : rawRole ? [rawRole as string] : [];\n const rawApps = payload['apps'];\n const apps = Array.isArray(rawApps) ? rawApps as string[] : rawApps ? [rawApps as string] : [];\n const name = (payload['name'] as string) ?? '';\n const nameParts = name.split(' ');\n\n const user: User = {\n id: (payload['sub'] as string) ?? '',\n tenantId: (payload['tenant_id'] as string) ?? (payload['tid'] as string) ?? null,\n email: (payload['email'] as string) ?? '',\n fullName: name,\n firstName: nameParts[0] ?? '',\n lastName: nameParts.slice(1).join(' '),\n preferredLocale: (payload['locale'] as string) ?? 'en',\n roles,\n apps,\n ou: payload['ou'] as string | undefined,\n };\n\n const expiresAt = ((payload['exp'] as number) ?? 0) * 1000;\n this.setSession(user, token, expiresAt);\n } catch {\n // Invalid token — stay unauthenticated\n }\n }\n}\n","import { Injectable, computed, signal, inject, ErrorHandler } from '@angular/core';\n\n/** Locales that use RTL layout for `dir` and DS `isRtl` / `direction`. */\nexport const RTL_LOCALE_SET: ReadonlySet<string> = new Set(['ar', 'ur']);\n\nexport function isRtlLocale(lang: string): boolean {\n return RTL_LOCALE_SET.has(lang);\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** Accepts flat or nested JSON objects; nested keys become dot paths. Rejects arrays and non-string leaves. */\nfunction normalizeLocaleJson(raw: unknown): Record<string, string> {\n if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {\n throw new Error('Locale bundle must be a JSON object');\n }\n const out: Record<string, string> = {};\n const walk = (obj: Record<string, unknown>, prefix: string): void => {\n for (const [k, v] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${k}` : k;\n if (typeof v === 'string') {\n out[path] = v;\n } else if (v !== null && typeof v === 'object' && !Array.isArray(v)) {\n walk(v as Record<string, unknown>, path);\n } else {\n throw new Error(`Locale bundle invalid value at \"${path}\" (expected string or nested object)`);\n }\n }\n };\n walk(raw as Record<string, unknown>, '');\n return out;\n}\n\n/** Options for loading a remote or standalone locale JSON bundle. */\nexport interface LoadBundleOptions {\n /** Stable id (e.g. app id from manifest); later loads replace this bundle only. */\n id: string;\n /** Base URL ending with `/`, e.g. `https://app.example.com/locale/` or `/my-remote/locale/` */\n baseUrl: string;\n lang: string;\n /** When aborted, failures are ignored (e.g. superseded language load). */\n signal?: AbortSignal;\n /**\n * When true, fetch/parse failures are not reported via Angular `ErrorHandler`.\n * Use for optional remote locale bundles (e.g. federated apps that may be offline).\n */\n silent?: boolean;\n}\n\n/**\n * Shared I18nService for the shell and Business Apps.\n *\n * **Merge order** (later keys win): shell layer → remote bundles in registration order.\n *\n * - Shell: `setShellTranslations()` after loading `locale/{lang}.json` and API overrides.\n * - Remotes: `loadBundle()` per manifest `localeBaseUrl`.\n */\n@Injectable({ providedIn: 'root' })\nexport class I18nService {\n private readonly errorHandler = inject(ErrorHandler, { optional: true });\n\n private readonly _shell = signal<Record<string, string>>({});\n private readonly _bundles = signal<Record<string, Record<string, string>>>({});\n private readonly _bundleOrder = signal<string[]>([]);\n private readonly _locale = signal<string>('en');\n private readonly _version = signal(0);\n\n private readonly _merged = computed(() => {\n const shell = this._shell();\n const order = this._bundleOrder();\n const bundles = this._bundles();\n let out: Record<string, string> = { ...shell };\n for (const id of order) {\n const b = bundles[id];\n if (b) out = { ...out, ...b };\n }\n return out;\n });\n\n readonly locale = this._locale.asReadonly();\n readonly version = this._version.asReadonly();\n readonly isRtl = computed(() => isRtlLocale(this._locale()));\n readonly direction = computed(() => (isRtlLocale(this._locale()) ? 'rtl' : 'ltr'));\n\n private bump(): void {\n this._version.update((v) => v + 1);\n }\n\n /** Replace shell strings (desktop `locale/*.json` + `/api/i18n/desktop-shell/{lang}` merged by the shell). */\n setShellTranslations(data: Record<string, string>, lang: string): void {\n this._shell.set(data);\n this._locale.set(lang);\n this.bump();\n }\n\n setLanguage(lang: string): void {\n this._locale.set(lang);\n this.bump();\n }\n\n /**\n * Fetch `{baseUrl}{lang}.json` and store under `id`. New ids are appended to the merge order.\n * @returns whether the bundle was loaded successfully.\n */\n async loadBundle(opts: LoadBundleOptions): Promise<boolean> {\n const { id, baseUrl, lang, signal: abortSignal, silent } = opts;\n try {\n const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;\n const url = `${base}${lang}.json`;\n const resp = await fetch(url, { signal: abortSignal });\n if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n const data = normalizeLocaleJson(await resp.json());\n if (abortSignal?.aborted) return false;\n this._bundles.update((b) => ({ ...b, [id]: data }));\n this._bundleOrder.update((order) => (order.includes(id) ? order : [...order, id]));\n this._locale.set(lang);\n this.bump();\n return true;\n } catch (e) {\n if (abortSignal?.aborted) return false;\n if (!silent) this.errorHandler?.handleError(e);\n return false;\n }\n }\n\n removeBundle(id: string): void {\n this._bundles.update((b) => {\n const next = { ...b };\n delete next[id];\n return next;\n });\n this._bundleOrder.update((order) => order.filter((x) => x !== id));\n this.bump();\n }\n\n clearRemoteBundles(): void {\n this._bundles.set({});\n this._bundleOrder.set([]);\n this.bump();\n }\n\n t(key: string, params?: Record<string, string | number>): string {\n const val = this._merged()[key] ?? key;\n if (!params) return val;\n return Object.entries(params).reduce((result, [k, v]) => {\n const safe = escapeRegExp(k);\n return result.replace(new RegExp(`{{\\\\s*${safe}\\\\s*}}`, 'g'), String(v));\n }, val);\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Injectable, inject, PLATFORM_ID, signal } from '@angular/core';\n\n/** Single source of truth for persisted / API theme strings. */\nexport const FLY_THEME_MODE_IDS = ['light', 'spatial', 'dark'] as const;\n\nexport type FlyThemeMode = (typeof FLY_THEME_MODE_IDS)[number];\n\n/** Factory default: `dark` (opaque dark / `html.dark-theme`); shell i18n `settings.theme.dark`. Keep in sync with `UserSettings` defaults. */\nexport const DEFAULT_FLY_THEME_MODE: FlyThemeMode = 'dark';\n\n/** Coerce unknown values (localStorage, API) to a valid theme mode. */\nexport function normalizeFlyTheme(value: unknown): FlyThemeMode {\n if (typeof value === 'string' && (FLY_THEME_MODE_IDS as readonly string[]).includes(value)) {\n return value as FlyThemeMode;\n }\n return DEFAULT_FLY_THEME_MODE;\n}\n\n/**\n * Applies `html.light-theme` / `html.spatial-theme` / `html.dark-theme` for DS SCSS.\n * Shell and standalone Business Apps use the same service (federation singleton when shared).\n */\n@Injectable({ providedIn: 'root' })\nexport class FlyThemeService {\n private readonly platformId = inject(PLATFORM_ID);\n\n readonly theme = signal<FlyThemeMode>(DEFAULT_FLY_THEME_MODE);\n\n applyTheme(mode: FlyThemeMode): void {\n this.theme.set(mode);\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const html = document.documentElement;\n html.classList.remove('light-theme', 'spatial-theme', 'dark-theme');\n if (mode === 'spatial') {\n html.classList.add('spatial-theme');\n } else if (mode === 'dark') {\n html.classList.add('dark-theme');\n } else {\n html.classList.add('light-theme');\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\n/** Options for opening a child window. */\nexport interface OpenWindowOptions {\n /** Unique identifier for the window instance. */\n windowId: string;\n /** Display title shown in the window chrome. */\n title: string;\n /** Route path or URL to load inside the window. */\n route: string;\n /** Initial width in pixels. Defaults to 900. */\n width?: number;\n /** Initial height in pixels. Defaults to 600. */\n height?: number;\n /** Whether the window can be resized. Defaults to true. */\n resizable?: boolean;\n /** Whether the window can be maximised. Defaults to true. */\n maximizable?: boolean;\n /** Arbitrary data passed to the child window via WINDOW_DATA. */\n data?: unknown;\n}\n\n/**\n * Abstract interface for the WindowManager.\n * The FlyOS shell provides the concrete implementation; Business Apps\n * inject this token to open, close, and focus windows without depending\n * on the shell's internal implementation.\n */\nexport abstract class WindowManagerService {\n abstract openChildWindow(options: OpenWindowOptions): void;\n abstract closeWindow(windowId: string): void;\n abstract focusWindow(windowId: string): void;\n\n /**\n * Shell: increments per-window depth and shows content block UI.\n * Standalone / no host: no-op.\n */\n beginContentUiBlock(_windowId: string, _messageKey?: string): void {}\n\n /** Shell: decrements depth; clears block when depth reaches 0. Standalone: no-op. */\n endContentUiBlock(_windowId: string): void {}\n}\n\n/**\n * No-op fallback implementation used when running a Business App in\n * standalone mode (outside the FlyOS shell). Logs a warning instead of\n * throwing so standalone dev/test flows are not broken.\n */\n@Injectable()\nexport class StandaloneWindowManagerService extends WindowManagerService {\n openChildWindow(options: OpenWindowOptions): void {\n console.warn('[WindowManagerService] openChildWindow called in standalone mode — no shell available.', options);\n }\n\n closeWindow(windowId: string): void {\n console.warn('[WindowManagerService] closeWindow called in standalone mode — no shell available.', windowId);\n }\n\n focusWindow(windowId: string): void {\n console.warn('[WindowManagerService] focusWindow called in standalone mode — no shell available.', windowId);\n }\n}\n\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { I18nService } from '../services/i18n.service';\n\n/**\n * Translates a key using the shared I18nService.\n *\n * @example\n * {{ 'myApp.section.title' | translate }}\n * {{ 'myApp.items_count' | translate:{ n: count() } }}\n */\n@Pipe({\n name: 'translate',\n standalone: true,\n pure: false,\n})\nexport class TranslatePipe implements PipeTransform {\n private readonly i18n = inject(I18nService);\n\n transform(key: string, params?: Record<string, string | number>): string {\n // Read version so template CD re-runs when bundles load (merged translations updated).\n void this.i18n.version();\n return this.i18n.t(key, params);\n }\n}\n","import { Injectable, Signal, computed, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable, of } from 'rxjs';\nimport { User } from '../models/user.model';\n\nexport interface MockAuthConfig {\n user: User;\n token?: string;\n loginRedirect?: string[];\n logoutRedirect?: string[];\n}\n\ninterface MockSession {\n accessToken: string;\n user: User;\n expiresAt: number;\n}\n\n/**\n * Shared mock AuthService base class for Business App developers.\n *\n * Extend this class in your app's `auth.service.mock.ts` and override\n * `getConfig()` to supply app-specific mock user data and navigation paths.\n * The subclass must be decorated with `@Injectable({ providedIn: 'root' })`\n * and exported as `AuthService` so Angular's `fileReplacements` swap works.\n *\n * @example\n * ```typescript\n * // src/app/core/services/auth.service.mock.ts\n * import { Injectable } from '@angular/core';\n * import { MockAuthService, type MockAuthConfig } from '@mohamedatia/fly-design-system';\n *\n * @Injectable({ providedIn: 'root' })\n * export class AuthService extends MockAuthService {\n * protected override getConfig(): MockAuthConfig {\n * return {\n * user: { id: 'dev-001', tenantId: 'dev-tenant', email: 'dev@example.com',\n * firstName: 'Dev', lastName: 'User', fullName: 'Dev User',\n * preferredLocale: 'en', roles: ['admin'], apps: ['my-app'] },\n * token: 'my-mock-token',\n * loginRedirect: ['/app'],\n * };\n * }\n * }\n * ```\n */\n@Injectable()\nexport class MockAuthService {\n private readonly router = inject(Router);\n\n protected readonly _session: ReturnType<typeof signal<MockSession | null>>;\n\n private readonly _config: MockAuthConfig;\n\n readonly isAuthenticated: Signal<boolean>;\n readonly currentUser: Signal<User | null>;\n readonly accessToken: Signal<string | null>;\n /** Always false in mock mode — 2FA is handled entirely by the STS. */\n readonly hasPendingTwoFactor: Signal<boolean>;\n /** Always false in mock mode — auth is pre-populated synchronously. */\n readonly initializing: Signal<boolean>;\n\n /**\n * Shell and guards may read this flag; real auth uses `localStorage` `fly_had_session`.\n * Default false — override in the app’s `auth.service.mock.ts` if needed.\n */\n get hadPriorSession(): boolean {\n return false;\n }\n\n constructor() {\n // All signal/computed calls are inside the constructor body so Angular's\n // injection context and ngDevMode are fully set up before they execute.\n this._config = this.getConfig();\n\n this._session = signal<MockSession | null>({\n accessToken: this._config.token ?? 'mock-token',\n user: this._config.user,\n expiresAt: Date.now() + 24 * 60 * 60 * 1000,\n });\n\n this.isAuthenticated = computed(() => {\n const s = this._session();\n return s !== null && s.expiresAt > Date.now();\n });\n\n this.currentUser = computed(() => this._session()?.user ?? null);\n this.accessToken = computed(() => this._session()?.accessToken ?? null);\n this.hasPendingTwoFactor = computed(() => false);\n this.initializing = signal(false).asReadonly();\n }\n\n /** Override in subclass to supply app-specific mock data. */\n protected getConfig(): MockAuthConfig {\n return {\n user: {\n id: 'mock-user-001',\n tenantId: 'mock-tenant-001',\n email: 'developer@fly.local',\n firstName: 'UI',\n lastName: 'Developer',\n fullName: 'UI Developer',\n preferredLocale: 'en',\n roles: ['admin'],\n apps: [],\n },\n };\n }\n\n async init(): Promise<void> {\n // Mock mode: already authenticated, nothing to initialize.\n }\n\n startLogin(): void {\n this.router.navigate(this._config.loginRedirect ?? ['/']);\n }\n\n handleCallback(_code: string, _state?: string): Observable<User> {\n return of(this._config.user);\n }\n\n async forceRefresh(): Promise<void> {\n // No-op in mock mode — token never expires.\n }\n\n patchSessionPreferredLocale(locale: string): void {\n const session = this._session();\n if (!session?.user) return;\n this._session.set({ ...session, user: { ...session.user, preferredLocale: locale } });\n }\n\n /** Parameter order matches the real AuthService: (user, accessToken, expiresAt). */\n setSession(_user: User, _accessToken: string, _expiresAt: number): void {\n // No-op in mock mode — session is hardcoded.\n }\n\n logout(): void {\n this._session.set(null);\n this.router.navigate(this._config.logoutRedirect ?? ['/']);\n }\n}\n","import {\n Component, input, output, HostListener, ViewChild, ElementRef,\n computed, signal, AfterViewInit, OnDestroy, ChangeDetectionStrategy, inject, DOCUMENT,\n} from '@angular/core';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\n\nexport interface ContextMenuItem {\n id: string;\n label: string;\n icon: string;\n}\n\nexport interface ContextMenuSection {\n label?: string;\n items: ContextMenuItem[];\n}\n\n@Component({\n selector: 'fly-context-menu',\n standalone: true,\n imports: [TranslatePipe],\n templateUrl: './context-menu.component.html',\n styleUrl: './context-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ContextMenuComponent implements AfterViewInit, OnDestroy {\n @ViewChild('contextMenu') private menuEl?: ElementRef<HTMLElement>;\n\n private readonly doc = inject(DOCUMENT);\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n\n x = input.required<number>();\n y = input.required<number>();\n sections = input.required<ContextMenuSection[]>();\n action = output<string>();\n closed = output<void>();\n\n private menuWidth = signal(0);\n private menuHeight = signal(0);\n\n private previouslyFocused: Element | null = null;\n\n // Resolved position: clamp to viewport so the menu never overflows an edge.\n // menuWidth/Height start at 0 so the first render places the menu at (x,y)\n // with no clamping; ngAfterViewInit measures the real size and updates the\n // signals, which re-evaluates this computed and repositions correctly.\n clampedPos = computed(() => {\n const vw = this.doc.defaultView?.innerWidth ?? 0;\n const vh = this.doc.defaultView?.innerHeight ?? 0;\n const w = this.menuWidth();\n const h = this.menuHeight();\n const x = this.x();\n const y = this.y();\n return {\n left: w > 0 ? Math.min(x, vw - w - 8) : x,\n top: h > 0 ? Math.min(y, vh - h - 8) : y,\n };\n });\n\n ngAfterViewInit(): void {\n // Portal: move host to <body> so position:fixed resolves against the true\n // viewport, not against any transformed/backdrop-filtered ancestor window.\n this.doc.body.appendChild(this.hostEl.nativeElement);\n\n // Measure after portal move so offsetWidth/Height are accurate.\n const el = this.menuEl?.nativeElement;\n if (el) {\n this.menuWidth.set(el.offsetWidth);\n this.menuHeight.set(el.offsetHeight);\n }\n\n this.previouslyFocused = document.activeElement;\n this.focusItem(0);\n }\n\n ngOnDestroy(): void {\n const el = this.hostEl.nativeElement;\n if (el.parentNode === this.doc.body) {\n this.doc.body.removeChild(el);\n }\n }\n\n onAction(id: string): void {\n this.action.emit(id);\n this.close();\n }\n\n @HostListener('document:mousedown', ['$event'])\n onClickOutside(event: MouseEvent): void {\n if (!this.menuEl?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n this.close();\n }\n\n @HostListener('document:contextmenu', ['$event'])\n onContextMenu(event: MouseEvent): void {\n if (!this.menuEl?.nativeElement.contains(event.target as Node)) {\n this.close();\n }\n }\n\n @HostListener('keydown', ['$event'])\n onKeydown(event: KeyboardEvent): void {\n const items = this.getMenuItems();\n if (!items.length) return;\n const focused = document.activeElement as HTMLElement;\n const idx = items.indexOf(focused);\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n this.focusItem(idx < items.length - 1 ? idx + 1 : 0);\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n this.focusItem(idx > 0 ? idx - 1 : items.length - 1);\n } else if (event.key === 'Home') {\n event.preventDefault();\n this.focusItem(0);\n } else if (event.key === 'End') {\n event.preventDefault();\n this.focusItem(items.length - 1);\n }\n }\n\n private close(): void {\n this.restoreFocus();\n this.closed.emit();\n }\n\n private getMenuItems(): HTMLElement[] {\n return Array.from(\n this.menuEl?.nativeElement.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ?? [],\n );\n }\n\n private focusItem(index: number): void {\n const items = this.getMenuItems();\n items[index]?.focus();\n }\n\n private restoreFocus(): void {\n if (this.previouslyFocused instanceof HTMLElement) {\n this.previouslyFocused.focus();\n }\n this.previouslyFocused = null;\n }\n}\n","<div\n #contextMenu\n class=\"context-menu\"\n [style.left.px]=\"clampedPos().left\"\n [style.top.px]=\"clampedPos().top\"\n role=\"menu\"\n [attr.aria-label]=\"'shell.context_menu' | translate\">\n\n @for (section of sections(); track $index) {\n @if ($index > 0) {\n <div class=\"menu-divider\"></div>\n }\n @if (section.label) {\n <div class=\"menu-section-label\">{{ section.label }}</div>\n }\n @for (item of section.items; track item.id) {\n <button\n type=\"button\"\n class=\"vos-btn sm rect menu-item\"\n role=\"menuitem\"\n (click)=\"onAction(item.id)\">\n <i [class]=\"'pi ' + item.icon\" aria-hidden=\"true\"></i>\n <span>{{ item.label }}</span>\n </button>\n }\n }\n</div>\n","import { Injectable, inject, signal } from '@angular/core';\nimport { I18nService } from '../../services/i18n.service';\n\nexport enum MessageBoxButtons {\n OK,\n OKCancel,\n YesNo,\n YesNoCancel,\n RetryCancel,\n AbortRetryIgnore,\n}\n\nexport enum MessageBoxIcon {\n None,\n Information,\n Warning,\n Error,\n Question,\n}\n\nexport enum DialogResult {\n None,\n OK,\n Cancel,\n Yes,\n No,\n Retry,\n Abort,\n Ignore,\n}\n\nexport interface MessageBoxOptions {\n title: string;\n message: string;\n buttons?: MessageBoxButtons;\n icon?: MessageBoxIcon;\n}\n\nexport interface MessageBoxButton {\n label: string;\n result: DialogResult;\n variant?: 'primary' | 'danger' | 'default';\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MessageBoxService {\n private readonly i18n = inject(I18nService);\n\n readonly visible = signal(false);\n readonly title = signal('');\n readonly message = signal('');\n readonly icon = signal<MessageBoxIcon>(MessageBoxIcon.None);\n readonly buttons = signal<MessageBoxButton[]>([]);\n\n private resolver: ((value: DialogResult) => void) | null = null;\n\n show(options: MessageBoxOptions): Promise<DialogResult> {\n // Dismiss any pending dialog so its Promise resolves rather than leaking\n if (this.resolver) {\n this.resolver(DialogResult.None);\n this.resolver = null;\n }\n\n this.title.set(options.title);\n this.message.set(options.message);\n this.icon.set(options.icon ?? MessageBoxIcon.None);\n this.buttons.set(this.resolveButtons(options.buttons ?? MessageBoxButtons.OK));\n this.visible.set(true);\n\n return new Promise<DialogResult>((resolve) => {\n this.resolver = resolve;\n });\n }\n\n resolve(result: DialogResult): void {\n this.visible.set(false);\n if (this.resolver) {\n this.resolver(result);\n this.resolver = null;\n }\n }\n\n private resolveButtons(buttons: MessageBoxButtons): MessageBoxButton[] {\n const t = (key: string) => this.i18n.t(key);\n switch (buttons) {\n case MessageBoxButtons.OK:\n return [{ label: t('common.ok'), result: DialogResult.OK, variant: 'primary' }];\n\n case MessageBoxButtons.OKCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.ok'), result: DialogResult.OK, variant: 'primary' },\n ];\n\n case MessageBoxButtons.YesNo:\n return [\n { label: t('common.no'), result: DialogResult.No, variant: 'default' },\n { label: t('common.yes'), result: DialogResult.Yes, variant: 'primary' },\n ];\n\n case MessageBoxButtons.YesNoCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.no'), result: DialogResult.No, variant: 'default' },\n { label: t('common.yes'), result: DialogResult.Yes, variant: 'primary' },\n ];\n\n case MessageBoxButtons.RetryCancel:\n return [\n { label: t('common.cancel'), result: DialogResult.Cancel, variant: 'default' },\n { label: t('common.retry'), result: DialogResult.Retry, variant: 'primary' },\n ];\n\n case MessageBoxButtons.AbortRetryIgnore:\n return [\n { label: t('common.abort'), result: DialogResult.Abort, variant: 'danger' },\n { label: t('common.retry'), result: DialogResult.Retry, variant: 'default' },\n { label: t('common.ignore'), result: DialogResult.Ignore, variant: 'default' },\n ];\n }\n }\n}\n","import {\n Component, inject, ChangeDetectionStrategy,\n HostListener, ElementRef, AfterViewInit,\n} from '@angular/core';\nimport { MessageBoxService, MessageBoxIcon, DialogResult } from './message-box.service';\n\n@Component({\n selector: 'fly-message-box',\n standalone: true,\n templateUrl: './message-box.component.html',\n styleUrl: './message-box.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MessageBoxComponent implements AfterViewInit {\n service = inject(MessageBoxService);\n private elRef = inject(ElementRef);\n\n readonly MessageBoxIcon = MessageBoxIcon;\n readonly DialogResult = DialogResult;\n\n private previouslyFocused: Element | null = null;\n\n ngAfterViewInit(): void {\n // Store focus origin so we can restore it on close\n this.previouslyFocused = document.activeElement;\n this.focusPrimaryButton();\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n if (this.service.visible()) {\n this.service.resolve(DialogResult.Cancel);\n this.restoreFocus();\n }\n }\n\n onBackdropClick(): void {\n this.service.resolve(DialogResult.Cancel);\n this.restoreFocus();\n }\n\n onButtonClick(result: DialogResult): void {\n this.service.resolve(result);\n this.restoreFocus();\n }\n\n iconClass(): string {\n switch (this.service.icon()) {\n case MessageBoxIcon.Information: return 'pi pi-info-circle';\n case MessageBoxIcon.Warning: return 'pi pi-exclamation-triangle';\n case MessageBoxIcon.Error: return 'pi pi-times-circle';\n case MessageBoxIcon.Question: return 'pi pi-question-circle';\n default: return '';\n }\n }\n\n private focusPrimaryButton(): void {\n // Focus the primary (last) button, which is the default action\n const buttons = this.elRef.nativeElement.querySelectorAll('.mb-btn') as NodeListOf<HTMLButtonElement>;\n const last = buttons[buttons.length - 1];\n last?.focus();\n }\n\n private restoreFocus(): void {\n if (this.previouslyFocused instanceof HTMLElement) {\n this.previouslyFocused.focus();\n }\n this.previouslyFocused = null;\n }\n}\n","@if (service.visible()) {\n <div\n class=\"mb-backdrop\"\n (click)=\"onBackdropClick()\"\n role=\"presentation\">\n <div\n class=\"mb-dialog\"\n [class.mb-info]=\"service.icon() === MessageBoxIcon.Information\"\n [class.mb-warning]=\"service.icon() === MessageBoxIcon.Warning\"\n [class.mb-danger]=\"service.icon() === MessageBoxIcon.Error\"\n [class.mb-question]=\"service.icon() === MessageBoxIcon.Question\"\n (click)=\"$event.stopPropagation()\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"mb-title\"\n aria-describedby=\"mb-message\">\n\n @if (iconClass()) {\n <div class=\"mb-icon-wrap\">\n <i [class]=\"iconClass() + ' mb-icon'\" aria-hidden=\"true\"></i>\n </div>\n }\n\n <div class=\"mb-title\" id=\"mb-title\">{{ service.title() }}</div>\n <div class=\"mb-message\" id=\"mb-message\">{{ service.message() }}</div>\n\n <div class=\"mb-actions\">\n @for (btn of service.buttons(); track btn.result) {\n <button\n type=\"button\"\n class=\"vos-btn sm mb-btn\"\n [class.mb-btn--primary]=\"btn.variant === 'primary'\"\n [class.mb-btn--danger]=\"btn.variant === 'danger'\"\n (click)=\"onButtonClick(btn.result)\">\n {{ btn.label }}\n </button>\n }\n </div>\n\n </div>\n </div>\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n signal,\n inject,\n OnInit,\n DestroyRef,\n ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Observable, ReplaySubject } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport { I18nService } from '../../services/i18n.service';\nimport type {\n ShareOrgChartOption,\n ShareOuNode,\n SharePanelLevelOption,\n SharePermissionEntry,\n ShareUserResult,\n} from '../../models/share-panel.model';\n\n/** Default permission levels (file-style ACL). Hosts can override via `permissionLevels`. */\nexport const SHARE_PANEL_DEFAULT_FILE_LEVELS: SharePanelLevelOption[] = [\n { value: 'View', labelKey: 'files.share.level_view' },\n { value: 'Download', labelKey: 'files.share.level_download' },\n { value: 'Edit', labelKey: 'files.share.level_edit' },\n { value: 'FullControl', labelKey: 'files.share.level_full' },\n];\n\n@Component({\n selector: 'fly-share-panel',\n standalone: true,\n imports: [CommonModule, FormsModule, TranslatePipe],\n templateUrl: './share-panel.component.html',\n styleUrl: './share-panel.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SharePanelComponent implements OnInit {\n /** Resource title shown in the header */\n @Input() targetName = '';\n\n /** i18n key for panel title */\n @Input() titleKey = 'files.share.title';\n\n /** Load current shares / permissions (host resolves display names when possible). */\n @Input({ required: true }) loadPermissions!: () => Observable<SharePermissionEntry[]>;\n\n @Input({ required: true }) searchUsers!: (query: string) => Observable<ShareUserResult[]>;\n\n /**\n * Load OU hierarchy for sharing. `chartId` is null for the default/official tree;\n * non-null for an alternative chart.\n */\n @Input({ required: true })\n loadOuTree!: (chartId: string | null) => Observable<ShareOuNode[]>;\n\n /** Chart selector options; first entry should be the default chart (`id: null`). */\n @Input({ required: true }) loadChartOptions!: () => Observable<ShareOrgChartOption[]>;\n\n /**\n * Labels from the default (official) OU tree for stable display names on OU grants\n * when the picker shows an alternative chart.\n */\n @Input({ required: true }) loadOuLabelMap!: () => Observable<Record<string, string>>;\n\n @Input({ required: true })\n grantToUser!: (userId: string, level: string, applyToChildren: boolean) => Observable<void>;\n\n @Input({ required: true })\n grantToOu!: (ouId: string, level: string, applyToChildren: boolean) => Observable<void>;\n\n @Input({ required: true }) updatePermission!: (id: string, level: string) => Observable<void>;\n\n @Input({ required: true }) revokePermission!: (id: string) => Observable<void>;\n\n /** When true, show “apply to children” (e.g. folders). */\n @Input() showApplyToChildren = false;\n\n /** Override level dropdown options (e.g. notes: View / Edit only). */\n @Input() permissionLevels?: SharePanelLevelOption[];\n\n /** i18n key for wildcard app grant label */\n @Input() everyoneLabelKey = 'files.share.everyone';\n\n @Output() close = new EventEmitter<void>();\n\n private destroyRef = inject(DestroyRef);\n private i18n = inject(I18nService);\n\n permissions = signal<SharePermissionEntry[]>([]);\n loading = signal(true);\n searchQuery = '';\n newLevel = '';\n applyToChildren = false;\n searchResults = signal<ShareUserResult[]>([]);\n ouTree = signal<ShareOuNode[]>([]);\n showOuPicker = signal(false);\n chartOptions = signal<ShareOrgChartOption[]>([]);\n selectedOrgChartId = signal<string | null>(null);\n /** Default-tree id → display name for permission rows (OU grants). */\n private readonly ouLabelById = signal<Record<string, string>>({});\n\n private searchTimeout: ReturnType<typeof setTimeout> | null = null;\n /** Emits after chart options load; further emissions on user chart changes (no initial null). */\n private readonly selectedChartId$ = new ReplaySubject<string | null>(1);\n\n ngOnInit(): void {\n const levels = this.levelOptions;\n this.newLevel = levels[0]?.value ?? 'View';\n this.refreshPermissions();\n\n this.loadOuLabelMap()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (m) => this.ouLabelById.set(m),\n error: () => this.ouLabelById.set({}),\n });\n\n this.selectedChartId$\n .pipe(\n switchMap((id) => this.loadOuTree(id)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe({\n next: (tree) => this.ouTree.set(tree),\n error: () => this.ouTree.set([]),\n });\n\n this.loadChartOptions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (opts) => {\n this.chartOptions.set(opts);\n const first = opts[0];\n const initial = first ? first.id : null;\n this.selectedOrgChartId.set(initial);\n this.selectedChartId$.next(initial);\n },\n error: () => {\n this.chartOptions.set([]);\n this.selectedOrgChartId.set(null);\n this.selectedChartId$.next(null);\n },\n });\n }\n\n onOrgChartSelectChange(chartId: string | null): void {\n this.selectedOrgChartId.set(chartId);\n this.selectedChartId$.next(chartId);\n }\n\n get levelOptions(): SharePanelLevelOption[] {\n const p = this.permissionLevels;\n return p && p.length > 0 ? p : SHARE_PANEL_DEFAULT_FILE_LEVELS;\n }\n\n refreshPermissions(): void {\n this.loading.set(true);\n this.loadPermissions()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (perms) => {\n this.permissions.set(perms);\n this.loading.set(false);\n },\n error: () => {\n this.permissions.set([]);\n this.loading.set(false);\n },\n });\n }\n\n onSearchInput(): void {\n if (this.searchTimeout) clearTimeout(this.searchTimeout);\n const query = this.searchQuery.trim();\n if (query.length < 2) {\n this.searchResults.set([]);\n return;\n }\n\n this.searchTimeout = setTimeout(() => {\n this.searchUsers(query)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (items) => this.searchResults.set(items),\n error: () => this.searchResults.set([]),\n });\n }, 300);\n }\n\n onGrantToUser(user: ShareUserResult): void {\n this.searchResults.set([]);\n this.searchQuery = '';\n this.grantToUser(user.id, this.newLevel, this.applyToChildren)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n onGrantToOu(ou: ShareOuNode): void {\n this.grantToOu(ou.id, this.newLevel, this.applyToChildren)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n onUpdateLevel(perm: SharePermissionEntry, level: string): void {\n this.updatePermission(perm.id, level)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n onRevokePermission(perm: SharePermissionEntry): void {\n this.revokePermission(perm.id)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({ next: () => this.refreshPermissions() });\n }\n\n getPermIcon(perm: SharePermissionEntry): string {\n if (perm.grantedToUserId) return 'pi pi-user';\n if (perm.grantedToOuId) return 'pi pi-sitemap';\n if (perm.grantedToAppId) return 'pi pi-globe';\n return 'pi pi-question';\n }\n\n /** Logical start padding for OU hierarchy (roots align with section padding). */\n ouIndentStartPx(ou: ShareOuNode): number {\n const d = ou.depth ?? 0;\n return 12 + d * 18;\n }\n\n getPermLabel(perm: SharePermissionEntry): string {\n if (perm.displayName?.trim()) return perm.displayName.trim();\n if (perm.grantedToUserId) {\n return `${perm.grantedToUserId.substring(0, 8)}…`;\n }\n if (perm.grantedToOuId) {\n const id = perm.grantedToOuId;\n const fromDefault = this.ouLabelById()[id];\n if (fromDefault) return fromDefault;\n const ou = this.ouTree().find((o) => o.id === id);\n if (ou) return ou.displayName;\n return `${id.substring(0, 8)}…`;\n }\n if (perm.grantedToAppId === '*') return this.i18n.t(this.everyoneLabelKey);\n return perm.grantedToAppId ?? '';\n }\n\n}\n","<div class=\"fac-overlay\" (click)=\"close.emit()\">\n <div class=\"fac-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"fac-header\">\n <h3>{{ titleKey | translate }}</h3>\n <span class=\"fac-target-name\">{{ targetName }}</span>\n <button type=\"button\" class=\"fac-close\" (click)=\"close.emit()\">\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <div class=\"fac-add-section\">\n <div class=\"fac-search-row\">\n <input\n type=\"text\"\n class=\"fac-input\"\n [(ngModel)]=\"searchQuery\"\n (input)=\"onSearchInput()\"\n [placeholder]=\"'files.share.search_placeholder' | translate\"\n />\n <select class=\"fac-select\" [(ngModel)]=\"newLevel\">\n @for (opt of levelOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.labelKey | translate }}</option>\n }\n </select>\n </div>\n\n @if (searchResults().length > 0) {\n <div class=\"fac-search-results\">\n @for (result of searchResults(); track result.id) {\n <div class=\"fac-search-item\" (click)=\"onGrantToUser(result)\">\n <i class=\"pi pi-user\" aria-hidden=\"true\"></i>\n <span>{{ result.firstName }} {{ result.lastName }}</span>\n <span class=\"fac-email\">{{ result.email }}</span>\n </div>\n }\n </div>\n }\n\n @if (chartOptions().length > 0) {\n <div class=\"fac-chart-row\">\n <label for=\"fac-org-chart-select\" class=\"fac-section-label\">{{\n 'files.share.org_chart' | translate\n }}</label>\n <select\n id=\"fac-org-chart-select\"\n class=\"fac-select\"\n [ngModel]=\"selectedOrgChartId()\"\n (ngModelChange)=\"onOrgChartSelectChange($event)\">\n @for (opt of chartOptions(); track $index) {\n <option [ngValue]=\"opt.id\">{{ opt.name }}</option>\n }\n </select>\n </div>\n }\n\n @if (showOuPicker()) {\n <div class=\"fac-ou-section\">\n <div class=\"fac-section-label\">{{ 'files.share.share_with_ou' | translate }}</div>\n @for (ou of ouTree(); track ou.id) {\n <div\n class=\"fac-ou-item\"\n [style.padding-inline-start.px]=\"ouIndentStartPx(ou)\"\n (click)=\"onGrantToOu(ou)\"\n >\n <i class=\"pi pi-sitemap\" aria-hidden=\"true\"></i>\n <span>{{ ou.displayName }}</span>\n </div>\n }\n </div>\n }\n\n <div class=\"fac-toggle-row\">\n <button type=\"button\" class=\"fac-link\" (click)=\"showOuPicker.set(!showOuPicker())\">\n {{ showOuPicker() ? ('files.share.hide_ous' | translate) : ('files.share.show_ous' | translate) }}\n </button>\n @if (showApplyToChildren) {\n <label class=\"fac-checkbox-label\">\n <input type=\"checkbox\" [(ngModel)]=\"applyToChildren\" />\n {{ 'files.share.apply_children' | translate }}\n </label>\n }\n </div>\n </div>\n\n <div class=\"fac-perms-section\">\n <div class=\"fac-section-label\">{{ 'files.share.current_permissions' | translate }}</div>\n @if (loading()) {\n <div class=\"fac-loading\"><i class=\"pi pi-spin pi-spinner\" aria-hidden=\"true\"></i></div>\n } @else if (permissions().length === 0) {\n <div class=\"fac-empty\">{{ 'files.share.no_permissions' | translate }}</div>\n } @else {\n @for (perm of permissions(); track perm.id) {\n <div class=\"fac-perm-row\">\n <div class=\"fac-perm-info\">\n <i [class]=\"getPermIcon(perm)\" aria-hidden=\"true\"></i>\n <span class=\"fac-perm-name\">{{ getPermLabel(perm) }}</span>\n @if (perm.isInherited) {\n <span class=\"fac-badge inherited\">{{ 'files.share.inherited' | translate }}</span>\n }\n </div>\n <div class=\"fac-perm-actions\">\n <select\n class=\"fac-select sm\"\n [ngModel]=\"perm.level\"\n (ngModelChange)=\"onUpdateLevel(perm, $event)\"\n [disabled]=\"perm.isInherited === true\"\n >\n @for (opt of levelOptions; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.labelKey | translate }}</option>\n }\n </select>\n <button\n type=\"button\"\n class=\"fac-icon-btn danger\"\n (click)=\"onRevokePermission(perm)\"\n [disabled]=\"perm.isInherited === true\"\n [title]=\"'files.share.revoke' | translate\"\n >\n <i class=\"pi pi-trash\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n }\n </div>\n </div>\n</div>\n","import { Component, ChangeDetectionStrategy, computed, input } from '@angular/core';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\n\n/** Full-bleed loading overlay for window content (shell) or embedded hosts. */\n@Component({\n selector: 'fly-block-ui',\n standalone: true,\n imports: [TranslatePipe],\n templateUrl: './block-ui.component.html',\n styleUrl: './block-ui.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FlyBlockUiComponent {\n /** When false, the overlay is not rendered (host may use @if instead). */\n active = input.required<boolean>();\n\n /** i18n key for status text; empty uses `common.loading`. */\n messageKey = input('');\n\n readonly resolvedMessageKey = computed(() => {\n const k = this.messageKey()?.trim();\n return k && k.length > 0 ? k : 'common.loading';\n });\n}\n","@if (active()) {\n <div\n class=\"fly-block-ui\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n [attr.aria-label]=\"resolvedMessageKey() | translate\">\n <div class=\"fly-block-ui__card\">\n <i class=\"pi pi-spin pi-spinner fly-block-ui__spinner\" aria-hidden=\"true\"></i>\n <span class=\"fly-block-ui__text\">{{ resolvedMessageKey() | translate }}</span>\n </div>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport type { FlyFileInfo } from '../../models/file.model';\nimport Cropper from 'cropperjs';\n\n/**\n * Image upload component with built-in cropperjs cropping modal.\n *\n * Usage:\n * ```html\n * <fly-image-upload\n * [aspectRatio]=\"16/9\"\n * [currentImageId]=\"trend.coverImageId\"\n * sourceApp=\"circles\"\n * sourceEntityType=\"trend\"\n * (uploaded)=\"onImageUploaded($event)\"\n * (removed)=\"onImageRemoved()\"\n * />\n * ```\n */\n@Component({\n selector: 'fly-image-upload',\n standalone: true,\n imports: [TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n <div class=\"fly-image-upload\">\n @if (previewUrl()) {\n <div class=\"fly-image-upload__preview\">\n <img [src]=\"previewUrl()\" alt=\"\" class=\"fly-image-upload__img\" />\n <div class=\"fly-image-upload__overlay\">\n <button type=\"button\" class=\"fly-image-upload__action-btn\" (click)=\"triggerFileInput()\" [title]=\"'files.imageUpload.change' | translate\">\n <span class=\"pi pi-pencil\" aria-hidden=\"true\"></span>\n </button>\n <button type=\"button\" class=\"fly-image-upload__action-btn fly-image-upload__action-btn--danger\" (click)=\"removeImage()\" [title]=\"'files.imageUpload.remove' | translate\">\n <span class=\"pi pi-trash\" aria-hidden=\"true\"></span>\n </button>\n </div>\n </div>\n } @else {\n <button type=\"button\" class=\"fly-image-upload__dropzone\" (click)=\"triggerFileInput()\" (dragover)=\"onDragOver($event)\" (drop)=\"onDrop($event)\">\n @if (uploading()) {\n <span class=\"pi pi-spin pi-spinner fly-image-upload__icon\" aria-hidden=\"true\"></span>\n <span class=\"fly-image-upload__label\">{{ 'files.imageUpload.uploading' | translate }}</span>\n } @else {\n <span class=\"pi pi-image fly-image-upload__icon\" aria-hidden=\"true\"></span>\n <span class=\"fly-image-upload__label\">{{ 'files.imageUpload.placeholder' | translate }}</span>\n <span class=\"fly-image-upload__hint\">{{ sizeHint() }}</span>\n }\n </button>\n }\n\n @if (error()) {\n <div class=\"fly-image-upload__error\">{{ error() }}</div>\n }\n\n <input #fileInput type=\"file\" accept=\"image/*\" class=\"fly-image-upload__hidden\" (change)=\"onFileSelected($event)\" />\n\n @if (showCropper()) {\n <div class=\"fly-image-upload__crop-backdrop\" (click)=\"cancelCrop()\">\n <div class=\"fly-image-upload__crop-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"fly-image-upload__crop-header\">\n <h3>{{ 'files.imageUpload.crop' | translate }}</h3>\n </div>\n <div class=\"fly-image-upload__crop-body\">\n <img #cropImage [src]=\"rawImageUrl()\" alt=\"\" />\n </div>\n <div class=\"fly-image-upload__crop-footer\">\n <button type=\"button\" class=\"vos-btn sm platter\" (click)=\"cancelCrop()\">{{ 'common.cancel' | translate }}</button>\n <button type=\"button\" class=\"vos-btn sm primary\" (click)=\"applyCrop()\">{{ 'files.imageUpload.apply' | translate }}</button>\n </div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [\n /* cropperjs v1 styles (MIT — Chen Fengyuan) */\n `.cropper-container{-webkit-touch-callout:none;direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;user-select:none}.cropper-container img{backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:rgba(51,153,255,.75);overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:\" \";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC\")}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}`,\n `\n .fly-image-upload { display: flex; flex-direction: column; gap: 6px; }\n .fly-image-upload__hidden { display: none; }\n\n .fly-image-upload__dropzone {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 8px; padding: 24px; border: 2px dashed var(--separator-primary, #e5e7eb);\n border-radius: 12px; background: var(--fill-quaternary, #f9fafb); cursor: pointer;\n transition: border-color 0.15s, background 0.15s; min-height: 120px;\n }\n .fly-image-upload__dropzone:hover { border-color: var(--accent-primary, #0071e3); background: var(--fill-tertiary, #f3f4f6); }\n .fly-image-upload__icon { font-size: 28px; color: var(--label-tertiary, #9ca3af); }\n .fly-image-upload__label { font-size: 13px; color: var(--label-secondary, #6b7280); }\n .fly-image-upload__hint { font-size: 11px; color: var(--label-tertiary, #9ca3af); }\n\n .fly-image-upload__preview { position: relative; border-radius: 12px; overflow: hidden; }\n .fly-image-upload__img { display: block; width: 100%; max-height: 280px; object-fit: cover; border-radius: 12px; }\n .fly-image-upload__overlay {\n position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;\n gap: 12px; background: rgba(0,0,0,0.35); opacity: 0; transition: opacity 0.15s;\n }\n .fly-image-upload__preview:hover .fly-image-upload__overlay { opacity: 1; }\n .fly-image-upload__action-btn {\n width: 36px; height: 36px; border-radius: 50%; border: none; cursor: pointer;\n display: flex; align-items: center; justify-content: center;\n background: rgba(255,255,255,0.9); color: var(--label-primary, #1f2937); font-size: 14px;\n transition: background 0.15s;\n }\n .fly-image-upload__action-btn:hover { background: #fff; }\n .fly-image-upload__action-btn--danger:hover { background: #fee2e2; color: #dc2626; }\n\n .fly-image-upload__error { font-size: 12px; color: var(--system-red, #ef4444); }\n\n .fly-image-upload__crop-backdrop {\n position: fixed; inset: 0; z-index: 10000; display: flex; align-items: center; justify-content: center;\n background: rgba(0,0,0,0.6); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);\n }\n .fly-image-upload__crop-modal {\n background: var(--bg-primary, #fff); color: var(--label-primary, #1f2937);\n border-radius: 16px; overflow: hidden;\n max-width: 700px; width: 90vw; box-shadow: 0 20px 60px rgba(0,0,0,0.4);\n border: 1px solid var(--separator-primary, rgba(0,0,0,0.1));\n }\n .fly-image-upload__crop-header {\n padding: 16px 20px; border-bottom: 1px solid var(--separator-primary, #e5e7eb);\n background: var(--fill-quaternary, transparent);\n }\n .fly-image-upload__crop-header h3 {\n margin: 0; font-size: 16px; font-weight: 600; color: var(--label-primary, #1f2937);\n }\n .fly-image-upload__crop-body {\n max-height: 60vh; overflow: hidden; background: var(--fill-tertiary, #f3f4f6);\n }\n .fly-image-upload__crop-body img { display: block; max-width: 100%; }\n .fly-image-upload__crop-footer {\n display: flex; justify-content: flex-end; gap: 10px; padding: 14px 20px;\n border-top: 1px solid var(--separator-primary, #e5e7eb);\n background: var(--fill-quaternary, transparent);\n }\n\n /* Spatial theme: frosted glass modal */\n html.spatial-theme .fly-image-upload__crop-modal {\n background: rgba(255,255,255,0.65); backdrop-filter: blur(40px) saturate(1.8);\n -webkit-backdrop-filter: blur(40px) saturate(1.8);\n border: 1px solid rgba(255,255,255,0.4);\n }\n html.spatial-theme .fly-image-upload__crop-header,\n html.spatial-theme .fly-image-upload__crop-footer { background: transparent; }\n html.spatial-theme .fly-image-upload__crop-body { background: rgba(0,0,0,0.05); }\n\n /* Dark theme */\n html.dark-theme .fly-image-upload__crop-modal {\n background: var(--bg-primary, #1c1c1e);\n border: 1px solid var(--separator-primary, rgba(255,255,255,0.1));\n }\n html.dark-theme .fly-image-upload__crop-body { background: var(--fill-tertiary, #2c2c2e); }\n `],\n})\nexport class FlyImageUploadComponent {\n private http = inject(HttpClient);\n\n // ── Inputs ──\n aspectRatio = input(16 / 9);\n maxSizeBytes = input(5 * 1024 * 1024);\n currentImageId = input<string | null>(null);\n sourceApp = input('unknown');\n sourceEntityType = input<string | null>(null);\n sourceEntityId = input<string | null>(null);\n\n // ── Outputs ──\n uploaded = output<FlyFileInfo>();\n removed = output<void>();\n\n // ── State ──\n uploading = signal(false);\n error = signal<string | null>(null);\n showCropper = signal(false);\n rawImageUrl = signal<string>('');\n localBlob = signal<string | null>(null);\n\n fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n cropImage = viewChild<ElementRef<HTMLImageElement>>('cropImage');\n\n private cropper: Cropper | null = null;\n private selectedFile: File | null = null;\n\n /** Resolved preview URL — uses blob for local uploads, fetches authenticated for existing images */\n previewUrl = signal<string | null>(null);\n\n constructor() {\n // React to currentImageId changes — fetch authenticated blob\n effect((onCleanup) => {\n const local = this.localBlob();\n if (local) { this.previewUrl.set(local); return; }\n\n const id = this.currentImageId();\n if (!id) { this.previewUrl.set(null); return; }\n\n const sub = this.http.get(`/api/files/${id}/download`, { responseType: 'blob' }).subscribe({\n next: (blob) => this.previewUrl.set(URL.createObjectURL(blob)),\n error: () => this.previewUrl.set(null),\n });\n onCleanup(() => sub.unsubscribe());\n });\n }\n\n sizeHint = computed(() => {\n const mb = this.maxSizeBytes() / (1024 * 1024);\n return `Max ${mb}MB`;\n });\n\n triggerFileInput(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n onDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n }\n\n onDrop(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n const file = e.dataTransfer?.files?.[0];\n if (file) this.processFile(file);\n }\n\n onFileSelected(e: Event): void {\n const input = e.target as HTMLInputElement;\n const file = input.files?.[0];\n if (file) this.processFile(file);\n input.value = '';\n }\n\n removeImage(): void {\n this.localBlob.set(null);\n this.previewUrl.set(null);\n this.error.set(null);\n this.removed.emit();\n }\n\n cancelCrop(): void {\n this.showCropper.set(false);\n this.destroyCropper();\n if (this.rawImageUrl()) URL.revokeObjectURL(this.rawImageUrl());\n this.rawImageUrl.set('');\n }\n\n applyCrop(): void {\n if (!this.cropper) return;\n const canvas = this.cropper.getCroppedCanvas({ maxWidth: 1920, maxHeight: 1080 });\n this.showCropper.set(false);\n this.destroyCropper();\n if (this.rawImageUrl()) URL.revokeObjectURL(this.rawImageUrl());\n this.rawImageUrl.set('');\n\n canvas.toBlob((blob) => {\n if (!blob) return;\n const fileName = this.selectedFile?.name ?? 'cropped-image.jpg';\n const file = new File([blob], fileName, { type: blob.type || 'image/jpeg' });\n this.uploadFile(file);\n }, 'image/jpeg', 0.9);\n }\n\n private processFile(file: File): void {\n this.error.set(null);\n\n if (!file.type.startsWith('image/')) {\n this.error.set('Only image files are allowed');\n return;\n }\n if (file.size > this.maxSizeBytes()) {\n const mb = this.maxSizeBytes() / (1024 * 1024);\n this.error.set(`File exceeds ${mb}MB limit`);\n return;\n }\n\n this.selectedFile = file;\n const url = URL.createObjectURL(file);\n this.rawImageUrl.set(url);\n this.showCropper.set(true);\n\n // Wait for next tick so cropImage element is in DOM\n setTimeout(() => this.initCropper(), 0);\n }\n\n private initCropper(): void {\n this.destroyCropper();\n const imgEl = this.cropImage()?.nativeElement;\n if (!imgEl) return;\n this.cropper = new Cropper(imgEl, {\n aspectRatio: this.aspectRatio(),\n viewMode: 1,\n autoCropArea: 0.9,\n responsive: true,\n background: false,\n });\n }\n\n private destroyCropper(): void {\n this.cropper?.destroy();\n this.cropper = null;\n }\n\n private uploadFile(file: File): void {\n this.uploading.set(true);\n this.error.set(null);\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n formData.append('sourceApp', this.sourceApp());\n if (this.sourceEntityType()) formData.append('sourceEntityType', this.sourceEntityType()!);\n if (this.sourceEntityId()) formData.append('sourceEntityId', this.sourceEntityId()!);\n\n this.http.post<{ data: FlyFileInfo }>('/api/files/upload', formData).subscribe({\n next: (res) => {\n this.uploading.set(false);\n const info = res.data ?? (res as any);\n this.localBlob.set(URL.createObjectURL(file));\n this.uploaded.emit(info);\n },\n error: (err) => {\n this.uploading.set(false);\n this.error.set(err?.error?.message ?? 'Upload failed');\n },\n });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { HttpClient, HttpEventType } from '@angular/common/http';\nimport { TranslatePipe } from '../../pipes/translate.pipe';\nimport type { FlyFileInfo } from '../../models/file.model';\n\ninterface UploadSlot {\n file: File;\n progress: number; // 0–100\n status: 'uploading' | 'done' | 'error';\n info?: FlyFileInfo;\n error?: string;\n}\n\nconst FILE_ICONS: Record<string, string> = {\n 'application/pdf': 'pi-file-pdf',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'pi-file-word',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'pi-file-excel',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pi-file',\n 'image/': 'pi-image',\n 'video/': 'pi-video',\n 'audio/': 'pi-volume-up',\n};\n\nfunction iconForType(contentType: string): string {\n for (const [prefix, icon] of Object.entries(FILE_ICONS)) {\n if (contentType.startsWith(prefix)) return icon;\n }\n return 'pi-file';\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Multi-file upload with drag-drop, progress, and validation.\n *\n * Usage:\n * ```html\n * <fly-file-upload\n * [maxFiles]=\"5\"\n * [maxFileSizeBytes]=\"5242880\"\n * accept=\".pdf,.docx,.xlsx\"\n * [(files)]=\"trend.attachments\"\n * sourceApp=\"circles\"\n * sourceEntityType=\"trend\"\n * (filesChanged)=\"onAttachmentsChanged($event)\"\n * />\n * ```\n */\n@Component({\n selector: 'fly-file-upload',\n standalone: true,\n imports: [TranslatePipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"fly-file-upload\">\n @if (canAddMore()) {\n <div class=\"fly-file-upload__dropzone\"\n [class.fly-file-upload__dropzone--drag]=\"dragging()\"\n (click)=\"triggerFileInput()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <span class=\"pi pi-cloud-upload fly-file-upload__icon\" aria-hidden=\"true\"></span>\n <span class=\"fly-file-upload__label\">{{ 'files.fileUpload.dropOrClick' | translate }}</span>\n <span class=\"fly-file-upload__hint\">{{ limitHint() }}</span>\n </div>\n }\n\n @if (error()) {\n <div class=\"fly-file-upload__error\">{{ error() }}</div>\n }\n\n @if (allSlots().length) {\n <ul class=\"fly-file-upload__list\">\n @for (slot of allSlots(); track slot.file.name + slot.file.size) {\n <li class=\"fly-file-upload__item\">\n <span class=\"pi {{ iconFor(slot) }} fly-file-upload__file-icon\" aria-hidden=\"true\"></span>\n <div class=\"fly-file-upload__file-info\">\n <span class=\"fly-file-upload__file-name\">{{ slot.file.name }}</span>\n <span class=\"fly-file-upload__file-size\">{{ formatFileSize(slot.file.size) }}</span>\n </div>\n @if (slot.status === 'uploading') {\n <div class=\"fly-file-upload__progress-track\">\n <div class=\"fly-file-upload__progress-fill\" [style.width.%]=\"slot.progress\"></div>\n </div>\n }\n @if (slot.status === 'error') {\n <span class=\"fly-file-upload__file-error\" [title]=\"slot.error ?? ''\">\n <span class=\"pi pi-exclamation-triangle\" aria-hidden=\"true\"></span>\n </span>\n }\n @if (slot.status === 'done') {\n <span class=\"pi pi-check-circle fly-file-upload__file-ok\" aria-hidden=\"true\"></span>\n }\n <button type=\"button\" class=\"fly-file-upload__remove-btn\" (click)=\"removeSlot(slot)\" [title]=\"'common.remove' | translate\">\n <span class=\"pi pi-times\" aria-hidden=\"true\"></span>\n </button>\n </li>\n }\n </ul>\n }\n\n @if (existingFiles().length && !allSlots().length) {\n <ul class=\"fly-file-upload__list\">\n @for (f of existingFiles(); track f.id) {\n <li class=\"fly-file-upload__item\">\n <span class=\"pi {{ iconForInfo(f) }} fly-file-upload__file-icon\" aria-hidden=\"true\"></span>\n <div class=\"fly-file-upload__file-info\">\n <span class=\"fly-file-upload__file-name\">{{ f.fileName }}</span>\n <span class=\"fly-file-upload__file-size\">{{ formatFileSize(f.sizeBytes) }}</span>\n </div>\n <span class=\"pi pi-check-circle fly-file-upload__file-ok\" aria-hidden=\"true\"></span>\n <button type=\"button\" class=\"fly-file-upload__remove-btn\" (click)=\"removeExisting(f)\" [title]=\"'common.remove' | translate\">\n <span class=\"pi pi-times\" aria-hidden=\"true\"></span>\n </button>\n </li>\n }\n </ul>\n }\n\n <input #fileInput type=\"file\" [accept]=\"accept()\" multiple class=\"fly-file-upload__hidden\" (change)=\"onFilesSelected($event)\" />\n </div>\n `,\n styles: [`\n .fly-file-upload { display: flex; flex-direction: column; gap: 8px; }\n .fly-file-upload__hidden { display: none; }\n\n .fly-file-upload__dropzone {\n display: flex; flex-direction: column; align-items: center; justify-content: center;\n gap: 6px; padding: 20px; border: 2px dashed var(--separator-primary, #e5e7eb);\n border-radius: 10px; background: var(--fill-quaternary, #f9fafb); cursor: pointer;\n transition: border-color 0.15s, background 0.15s;\n }\n .fly-file-upload__dropzone:hover,\n .fly-file-upload__dropzone--drag { border-color: var(--accent-primary, #0071e3); background: var(--fill-tertiary, #f3f4f6); }\n .fly-file-upload__icon { font-size: 24px; color: var(--label-tertiary, #9ca3af); }\n .fly-file-upload__label { font-size: 13px; color: var(--label-secondary, #6b7280); }\n .fly-file-upload__hint { font-size: 11px; color: var(--label-tertiary, #9ca3af); }\n\n .fly-file-upload__error { font-size: 12px; color: var(--system-red, #ef4444); padding: 4px 0; }\n\n .fly-file-upload__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }\n .fly-file-upload__item {\n display: flex; align-items: center; gap: 10px; padding: 8px 12px;\n border: 1px solid var(--separator-primary, #e5e7eb); border-radius: 8px;\n background: var(--fill-quaternary, #f9fafb); font-size: 13px;\n }\n .fly-file-upload__file-icon { font-size: 18px; color: var(--label-tertiary, #9ca3af); flex-shrink: 0; }\n .fly-file-upload__file-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }\n .fly-file-upload__file-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--label-primary, #1f2937); }\n .fly-file-upload__file-size { font-size: 11px; color: var(--label-tertiary, #9ca3af); }\n\n .fly-file-upload__progress-track { width: 60px; height: 4px; border-radius: 2px; background: var(--fill-tertiary, #e5e7eb); overflow: hidden; }\n .fly-file-upload__progress-fill { height: 100%; background: var(--accent-primary, #0071e3); border-radius: 2px; transition: width 0.2s; }\n\n .fly-file-upload__file-ok { color: var(--system-green, #22c55e); font-size: 14px; }\n .fly-file-upload__file-error { color: var(--system-red, #ef4444); font-size: 14px; }\n\n .fly-file-upload__remove-btn {\n background: none; border: none; cursor: pointer; color: var(--label-tertiary, #9ca3af);\n width: 24px; height: 24px; display: flex; align-items: center; justify-content: center;\n border-radius: 4px; transition: color 0.15s, background 0.15s; flex-shrink: 0;\n }\n .fly-file-upload__remove-btn:hover { color: var(--system-red, #ef4444); background: var(--fill-tertiary, #f3f4f6); }\n `],\n})\nexport class FlyFileUploadComponent {\n private http = inject(HttpClient);\n\n // ── Inputs ──\n maxFiles = input(5);\n maxFileSizeBytes = input(5 * 1024 * 1024);\n accept = input('');\n sourceApp = input('unknown');\n sourceEntityType = input<string | null>(null);\n sourceEntityId = input<string | null>(null);\n\n /** Optional: provide file IDs to auto-fetch metadata for pre-existing files (edit mode). */\n existingFileIds = input<string[] | null>(null);\n\n /** Two-way model for completed file metadata. */\n files = model<FlyFileInfo[]>([]);\n\n // ── Outputs ──\n filesChanged = output<FlyFileInfo[]>();\n\n // ── State ──\n error = signal<string | null>(null);\n dragging = signal(false);\n slots = signal<UploadSlot[]>([]);\n\n /** Pre-existing files loaded from the entity (before any new uploads this session). */\n existingFiles = signal<FlyFileInfo[]>([]);\n\n fileInput = viewChild<ElementRef<HTMLInputElement>>('fileInput');\n\n constructor() {\n // Auto-fetch metadata for existing file IDs (edit mode)\n effect((onCleanup) => {\n const ids = this.existingFileIds();\n if (!ids?.length) return;\n\n const subs = ids.map(id =>\n this.http.get<{ data: FlyFileInfo }>(`/api/files/${id}`).subscribe({\n next: (res) => {\n const info = res.data ?? (res as any);\n if (info?.id) {\n this.existingFiles.update(list =>\n list.some(f => f.id === info.id) ? list : [...list, info]\n );\n this.files.update(list =>\n list.some(f => f.id === info.id) ? list : [...list, info]\n );\n }\n },\n })\n );\n onCleanup(() => subs.forEach(s => s.unsubscribe()));\n });\n }\n\n allSlots = computed(() => this.slots());\n\n canAddMore = computed(() => {\n const current = this.files().length + this.slots().filter(s => s.status === 'uploading').length;\n return current < this.maxFiles();\n });\n\n limitHint = computed(() => {\n const mb = this.maxFileSizeBytes() / (1024 * 1024);\n return `Max ${this.maxFiles()} files, ${mb}MB each`;\n });\n\n triggerFileInput(): void {\n this.fileInput()?.nativeElement.click();\n }\n\n onDragOver(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.dragging.set(true);\n }\n\n onDragLeave(e: DragEvent): void {\n e.preventDefault();\n this.dragging.set(false);\n }\n\n onDrop(e: DragEvent): void {\n e.preventDefault();\n e.stopPropagation();\n this.dragging.set(false);\n const fileList = e.dataTransfer?.files;\n if (fileList) this.processFiles(Array.from(fileList));\n }\n\n onFilesSelected(e: Event): void {\n const input = e.target as HTMLInputElement;\n if (input.files) this.processFiles(Array.from(input.files));\n input.value = '';\n }\n\n removeSlot(slot: UploadSlot): void {\n this.slots.update(s => s.filter(x => x !== slot));\n if (slot.info) {\n this.files.update(f => f.filter(x => x.id !== slot.info!.id));\n this.filesChanged.emit(this.files());\n }\n }\n\n removeExisting(f: FlyFileInfo): void {\n this.existingFiles.update(list => list.filter(x => x.id !== f.id));\n this.files.update(list => list.filter(x => x.id !== f.id));\n this.filesChanged.emit(this.files());\n }\n\n iconFor(slot: UploadSlot): string { return iconForType(slot.file.type); }\n iconForInfo(f: FlyFileInfo): string { return iconForType(f.contentType); }\n formatFileSize(bytes: number): string { return formatSize(bytes); }\n\n private processFiles(newFiles: File[]): void {\n this.error.set(null);\n const currentCount = this.files().length + this.slots().filter(s => s.status === 'uploading').length;\n const remaining = this.maxFiles() - currentCount;\n\n if (remaining <= 0) {\n this.error.set(`Maximum ${this.maxFiles()} files allowed`);\n return;\n }\n\n const toUpload = newFiles.slice(0, remaining);\n if (newFiles.length > remaining) {\n this.error.set(`Only ${remaining} more file(s) can be added`);\n }\n\n for (const file of toUpload) {\n if (file.size > this.maxFileSizeBytes()) {\n const mb = this.maxFileSizeBytes() / (1024 * 1024);\n this.error.set(`\"${file.name}\" exceeds ${mb}MB limit`);\n continue;\n }\n this.uploadFile(file);\n }\n }\n\n private uploadFile(file: File): void {\n const slot: UploadSlot = { file, progress: 0, status: 'uploading' };\n this.slots.update(s => [...s, slot]);\n\n const formData = new FormData();\n formData.append('file', file, file.name);\n formData.append('sourceApp', this.sourceApp());\n if (this.sourceEntityType()) formData.append('sourceEntityType', this.sourceEntityType()!);\n if (this.sourceEntityId()) formData.append('sourceEntityId', this.sourceEntityId()!);\n\n this.http.post<{ data: FlyFileInfo }>('/api/files/upload', formData, {\n reportProgress: true,\n observe: 'events',\n }).subscribe({\n next: (event) => {\n if (event.type === HttpEventType.UploadProgress && event.total) {\n slot.progress = Math.round((event.loaded / event.total) * 100);\n this.slots.update(s => [...s]); // trigger signal change\n } else if (event.type === HttpEventType.Response) {\n const info = (event.body as any)?.data ?? event.body;\n slot.status = 'done';\n slot.progress = 100;\n slot.info = info;\n this.slots.update(s => [...s]);\n this.files.update(f => [...f, info]);\n this.filesChanged.emit(this.files());\n }\n },\n error: (err) => {\n slot.status = 'error';\n slot.error = err?.error?.message ?? 'Upload failed';\n this.slots.update(s => [...s]);\n },\n });\n }\n}\n","/*\r\n * @mohamedatia/fly-design-system — Public API\r\n * https://www.npmjs.com/package/@mohamedatia/fly-design-system\r\n *\r\n * This is the single entry point for Business / Supporting App developers.\r\n * Import everything from '@mohamedatia/fly-design-system' — never from relative shell paths.\r\n *\r\n * NOTE: This package is published under @mohamedatia/fly-design-system until the @fly\r\n * npm org is created. It will be republished as @fly/design-system once available.\r\n *\r\n * v1.3.0: FlyThemeService (html theme classes), hardened I18nService (AbortSignal, ErrorHandler, RTL helpers).\r\n * v1.3.1: loadBundle normalizes locale JSON (flat or nested objects; rejects invalid leaves).\r\n * v1.3.2: loadBundle returns boolean; LoadBundleOptions.silent skips ErrorHandler on failure.\r\n * v1.3.7: MockAuthService base class + MockAuthConfig for Business App mock auth via fileReplacements.\r\n * User model extended with optional avatar, source, twoFactorEnabled, createdAt fields.\r\n * v1.3.8: AuthService.init() no-op added so Business Apps can call init() in APP_INITIALIZER\r\n * without branching between standalone and embedded modes.\r\n * v1.3.9: MockAuthService field initializers moved into constructor to fix ngDevMode ReferenceError\r\n * when the package is loaded in a production-mode bundle (no ngDevMode global defined).\r\n * v1.4.0: ContextMenuComponent (positioned menu, keyboard nav, focus management) moved from desktop\r\n * shell to design system. MessageBoxService + MessageBoxComponent added (Windows Forms-style\r\n * modal dialogs with localized button labels, focus management, and Escape key support).\r\n * MessageBoxButtons, MessageBoxIcon, DialogResult, MessageBoxOptions, MessageBoxButton exported.\r\n * v1.5.0: SharePanelComponent — generic share/ACL overlay; host supplies API callbacks and optional\r\n * permission level options (file ACL vs note-style View/Edit).\r\n * v1.6.0: SharePanelComponent — `loadOuTree(chartId: string | null)`; optional `loadChartOptions` for\r\n * default vs alternative org charts (OU grants still use real OU ids). `ShareOrgChartOption` exported.\r\n * v1.7.0: SharePanelComponent — `loadChartOptions` and `loadOuLabelMap` are required; chart tree loads after\r\n * options resolve (no spurious null fetch). `loadOuLabelMap` supplies default-tree labels for OU rows.\r\n * v1.8.0: `WindowInstance` optional `contentUiBlocked` / `contentUiBlockMessageKey`; `WindowManagerService`\r\n * `beginContentUiBlock` / `endContentUiBlock` default no-ops; `FlyBlockUiComponent` for shell window overlay.\r\n * See docs/ExternalAppsGuide/03-frontend-app.md.\r\n */\r\n\r\n// ─── Models ──────────────────────────────────────────────────────────────────\r\nexport type { DesktopApp, DesktopAppKind } from './lib/models/app.model';\r\nexport type {\r\n WindowInstance,\r\n WindowState,\r\n ChildWindowData,\r\n} from './lib/models/window.model';\r\nexport { WINDOW_DATA } from './lib/models/window.model';\r\nexport type { User } from './lib/models/user.model';\r\n\r\nexport type {\r\n SharePermissionEntry,\r\n ShareUserResult,\r\n ShareOuNode,\r\n ShareOrgChartOption,\r\n SharePanelLevelOption,\r\n} from './lib/models/share-panel.model';\r\n\r\n// ─── Remote App Registration ─────────────────────────────────────────────────\r\nexport type { RemoteAppDef } from './lib/models/remote-app.model';\r\n\r\n// ─── Services ────────────────────────────────────────────────────────────────\r\nexport { AuthService } from './lib/services/auth.service';\r\nexport type { LoadBundleOptions } from './lib/services/i18n.service';\r\nexport { I18nService, RTL_LOCALE_SET, isRtlLocale } from './lib/services/i18n.service';\r\nexport {\r\n FlyThemeService,\r\n type FlyThemeMode,\r\n DEFAULT_FLY_THEME_MODE,\r\n FLY_THEME_MODE_IDS,\r\n normalizeFlyTheme,\r\n} from './lib/services/fly-theme.service';\r\nexport {\r\n WindowManagerService,\r\n StandaloneWindowManagerService,\r\n type OpenWindowOptions,\r\n} from './lib/services/window-manager.service';\r\n\r\n// ─── Pipes ───────────────────────────────────────────────────────────────────\r\nexport { TranslatePipe } from './lib/pipes/translate.pipe';\r\n\r\n// ─── Mock Auth (for fileReplacements in dev/mock builds) ─────────────────────\r\nexport { MockAuthService, type MockAuthConfig } from './lib/services/auth.service.mock';\r\n\r\n// ─── Components ──────────────────────────────────────────────────────────────\r\nexport {\r\n ContextMenuComponent,\r\n type ContextMenuItem,\r\n type ContextMenuSection,\r\n} from './lib/components/context-menu/context-menu.component';\r\n\r\nexport {\r\n MessageBoxComponent,\r\n} from './lib/components/message-box/message-box.component';\r\n\r\nexport {\r\n MessageBoxService,\r\n MessageBoxButtons,\r\n MessageBoxIcon,\r\n DialogResult,\r\n type MessageBoxOptions,\r\n type MessageBoxButton,\r\n} from './lib/components/message-box/message-box.service';\r\n\r\nexport {\r\n SharePanelComponent,\r\n SHARE_PANEL_DEFAULT_FILE_LEVELS,\r\n} from './lib/components/share-panel/share-panel.component';\r\n\r\nexport { FlyBlockUiComponent } from './lib/components/block-ui/block-ui.component';\r\n\r\n// ─── File Upload Components ─────────────────────────────────────────────────\r\nexport type { FlyFileInfo } from './lib/models/file.model';\r\n\r\nexport { FlyImageUploadComponent } from './lib/components/image-upload/fly-image-upload.component';\r\n\r\nexport { FlyFileUploadComponent } from './lib/components/file-upload/fly-file-upload.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mohamedatia/fly-design-system",
3
- "version": "1.9.1",
3
+ "version": "1.9.3",
4
4
  "description": "FlyOS design system — shared components, directives, pipes, services, and models for Business App developers.",
5
5
  "keywords": [
6
6
  "flyos",
@@ -645,7 +645,9 @@ declare class FlyImageUploadComponent {
645
645
  cropImage: _angular_core.Signal<ElementRef<HTMLImageElement> | undefined>;
646
646
  private cropper;
647
647
  private selectedFile;
648
- previewUrl: _angular_core.Signal<string | null>;
648
+ /** Resolved preview URL — uses blob for local uploads, fetches authenticated for existing images */
649
+ previewUrl: _angular_core.WritableSignal<string | null>;
650
+ constructor();
649
651
  sizeHint: _angular_core.Signal<string>;
650
652
  triggerFileInput(): void;
651
653
  onDragOver(e: DragEvent): void;
@@ -693,6 +695,8 @@ declare class FlyFileUploadComponent {
693
695
  sourceApp: _angular_core.InputSignal<string>;
694
696
  sourceEntityType: _angular_core.InputSignal<string | null>;
695
697
  sourceEntityId: _angular_core.InputSignal<string | null>;
698
+ /** Optional: provide file IDs to auto-fetch metadata for pre-existing files (edit mode). */
699
+ existingFileIds: _angular_core.InputSignal<string[] | null>;
696
700
  /** Two-way model for completed file metadata. */
697
701
  files: _angular_core.ModelSignal<FlyFileInfo[]>;
698
702
  filesChanged: _angular_core.OutputEmitterRef<FlyFileInfo[]>;
@@ -702,6 +706,7 @@ declare class FlyFileUploadComponent {
702
706
  /** Pre-existing files loaded from the entity (before any new uploads this session). */
703
707
  existingFiles: _angular_core.WritableSignal<FlyFileInfo[]>;
704
708
  fileInput: _angular_core.Signal<ElementRef<HTMLInputElement> | undefined>;
709
+ constructor();
705
710
  allSlots: _angular_core.Signal<UploadSlot[]>;
706
711
  canAddMore: _angular_core.Signal<boolean>;
707
712
  limitHint: _angular_core.Signal<string>;
@@ -718,7 +723,7 @@ declare class FlyFileUploadComponent {
718
723
  private processFiles;
719
724
  private uploadFile;
720
725
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FlyFileUploadComponent, never>;
721
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyFileUploadComponent, "fly-file-upload", never, { "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "maxFileSizeBytes": { "alias": "maxFileSizeBytes"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "sourceApp": { "alias": "sourceApp"; "required": false; "isSignal": true; }; "sourceEntityType": { "alias": "sourceEntityType"; "required": false; "isSignal": true; }; "sourceEntityId": { "alias": "sourceEntityId"; "required": false; "isSignal": true; }; "files": { "alias": "files"; "required": false; "isSignal": true; }; }, { "files": "filesChange"; "filesChanged": "filesChanged"; }, never, never, true, never>;
726
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FlyFileUploadComponent, "fly-file-upload", never, { "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "maxFileSizeBytes": { "alias": "maxFileSizeBytes"; "required": false; "isSignal": true; }; "accept": { "alias": "accept"; "required": false; "isSignal": true; }; "sourceApp": { "alias": "sourceApp"; "required": false; "isSignal": true; }; "sourceEntityType": { "alias": "sourceEntityType"; "required": false; "isSignal": true; }; "sourceEntityId": { "alias": "sourceEntityId"; "required": false; "isSignal": true; }; "existingFileIds": { "alias": "existingFileIds"; "required": false; "isSignal": true; }; "files": { "alias": "files"; "required": false; "isSignal": true; }; }, { "files": "filesChange"; "filesChanged": "filesChanged"; }, never, never, true, never>;
722
727
  }
723
728
 
724
729
  export { AuthService, ContextMenuComponent, DEFAULT_FLY_THEME_MODE, DialogResult, FLY_THEME_MODE_IDS, FlyBlockUiComponent, FlyFileUploadComponent, FlyImageUploadComponent, FlyThemeService, I18nService, MessageBoxButtons, MessageBoxComponent, MessageBoxIcon, MessageBoxService, MockAuthService, RTL_LOCALE_SET, SHARE_PANEL_DEFAULT_FILE_LEVELS, SharePanelComponent, StandaloneWindowManagerService, TranslatePipe, WINDOW_DATA, WindowManagerService, isRtlLocale, normalizeFlyTheme };
@@ -1 +1 @@
1
- {"version":3,"file":"mohamedatia-fly-design-system.d.ts","sources":["../../../projects/design-system/src/lib/models/app.model.ts","../../../projects/design-system/src/lib/models/window.model.ts","../../../projects/design-system/src/lib/models/user.model.ts","../../../projects/design-system/src/lib/models/share-panel.model.ts","../../../projects/design-system/src/lib/models/remote-app.model.ts","../../../projects/design-system/src/lib/services/auth.service.ts","../../../projects/design-system/src/lib/services/i18n.service.ts","../../../projects/design-system/src/lib/services/fly-theme.service.ts","../../../projects/design-system/src/lib/services/window-manager.service.ts","../../../projects/design-system/src/lib/pipes/translate.pipe.ts","../../../projects/design-system/src/lib/services/auth.service.mock.ts","../../../projects/design-system/src/lib/components/context-menu/context-menu.component.ts","../../../projects/design-system/src/lib/components/message-box/message-box.service.ts","../../../projects/design-system/src/lib/components/message-box/message-box.component.ts","../../../projects/design-system/src/lib/components/share-panel/share-panel.component.ts","../../../projects/design-system/src/lib/components/block-ui/block-ui.component.ts","../../../projects/design-system/src/lib/models/file.model.ts","../../../projects/design-system/src/lib/components/image-upload/fly-image-upload.component.ts","../../../projects/design-system/src/lib/components/file-upload/fly-file-upload.component.ts"],"mappings":"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","names":[]}
1
+ {"version":3,"file":"mohamedatia-fly-design-system.d.ts","sources":["../../../projects/design-system/src/lib/models/app.model.ts","../../../projects/design-system/src/lib/models/window.model.ts","../../../projects/design-system/src/lib/models/user.model.ts","../../../projects/design-system/src/lib/models/share-panel.model.ts","../../../projects/design-system/src/lib/models/remote-app.model.ts","../../../projects/design-system/src/lib/services/auth.service.ts","../../../projects/design-system/src/lib/services/i18n.service.ts","../../../projects/design-system/src/lib/services/fly-theme.service.ts","../../../projects/design-system/src/lib/services/window-manager.service.ts","../../../projects/design-system/src/lib/pipes/translate.pipe.ts","../../../projects/design-system/src/lib/services/auth.service.mock.ts","../../../projects/design-system/src/lib/components/context-menu/context-menu.component.ts","../../../projects/design-system/src/lib/components/message-box/message-box.service.ts","../../../projects/design-system/src/lib/components/message-box/message-box.component.ts","../../../projects/design-system/src/lib/components/share-panel/share-panel.component.ts","../../../projects/design-system/src/lib/components/block-ui/block-ui.component.ts","../../../projects/design-system/src/lib/models/file.model.ts","../../../projects/design-system/src/lib/components/image-upload/fly-image-upload.component.ts","../../../projects/design-system/src/lib/components/file-upload/fly-file-upload.component.ts"],"mappings":"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","names":[]}