{"version":3,"file":"myrmidon-cadmus-ui-flags-picker.mjs","sources":["../../../../projects/myrmidon/cadmus-ui-flags-picker/src/lib/flags-picker/flags-picker.component.ts","../../../../projects/myrmidon/cadmus-ui-flags-picker/src/lib/flags-picker/flags-picker.component.html","../../../../projects/myrmidon/cadmus-ui-flags-picker/src/lib/flags-picker/flags-picker-adapter.ts","../../../../projects/myrmidon/cadmus-ui-flags-picker/src/public-api.ts","../../../../projects/myrmidon/cadmus-ui-flags-picker/src/myrmidon-cadmus-ui-flags-picker.ts"],"sourcesContent":["import {\r\n  Component,\r\n  EventEmitter,\r\n  Input,\r\n  OnDestroy,\r\n  OnInit,\r\n  Output,\r\n} from '@angular/core';\r\nimport {\r\n  FormArray,\r\n  FormBuilder,\r\n  FormControl,\r\n  FormGroup,\r\n  FormsModule,\r\n  ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nexport interface Flag {\r\n  id: string;\r\n  label: string;\r\n  user?: boolean;\r\n  checked?: boolean;\r\n}\r\n\r\n/**\r\n * A component allowing users to select 1 or more flags (i.e.\r\n * entries which are either present or absent) from a list.\r\n * Each flag has a string ID and a human-friendly label, plus\r\n * a checked state and a user flag indicating whether it has\r\n * been added by users as a custom flag.\r\n * Usage: <cadmus-ui-flags-picker\r\n *        [flags]=\"flagsArray\"\r\n *        [numbering]=\"false\"\r\n *        [toolbar]=\"true\"\r\n *        [allowUserFlags]=\"true\"\r\n *        (flagsChange)=\"theHandlerGettingFlags\"\r\n *        ></cadmus-ui-flags-picker>\r\n */\r\n@Component({\r\n  selector: 'cadmus-ui-flags-picker',\r\n  templateUrl: './flags-picker.component.html',\r\n  styleUrls: ['./flags-picker.component.css'],\r\n  imports: [\r\n    FormsModule,\r\n    ReactiveFormsModule,\r\n    MatButtonModule,\r\n    MatCheckboxModule,\r\n    MatFormFieldModule,\r\n    MatIconModule,\r\n    MatInputModule,\r\n    MatTooltipModule,\r\n  ],\r\n})\r\nexport class FlagsPickerComponent implements OnInit, OnDestroy {\r\n  private _flags: Flag[];\r\n  private _subs: Subscription[];\r\n  private _changeFrozen?: boolean;\r\n\r\n  @Input()\r\n  public get flags(): Flag[] | undefined | null {\r\n    return this._flags;\r\n  }\r\n  public set flags(value: Flag[] | undefined | null) {\r\n    if (this._flags === value) {\r\n      return;\r\n    }\r\n    this._flags = value || [];\r\n    this.updateForm(this._flags);\r\n  }\r\n\r\n  /**\r\n   * True to show the ordinal number next to each flag.\r\n   */\r\n  @Input()\r\n  public numbering = false;\r\n\r\n  /**\r\n   * True to show a toolbar above the flags.\r\n   */\r\n  @Input()\r\n  public toolbar = true;\r\n\r\n  /**\r\n   * True to allow user-defined flags.\r\n   */\r\n  @Input()\r\n  public allowUserFlags = false;\r\n\r\n  /**\r\n   * True to show a tooltip for each flag with its ID value.\r\n   */\r\n  @Input()\r\n  public flagTips = false;\r\n\r\n  /**\r\n   * Emitted whenever flags change.\r\n   */\r\n  @Output()\r\n  public flagsChange: EventEmitter<Flag[]>;\r\n\r\n  public flagsArr: FormArray;\r\n  public form: FormGroup;\r\n\r\n  public userFlag: FormControl<string | null>;\r\n  public userForm: FormGroup;\r\n\r\n  constructor(private _formBuilder: FormBuilder) {\r\n    this._flags = [];\r\n    this.flagsChange = new EventEmitter<Flag[]>();\r\n    this._subs = [];\r\n    // form\r\n    this.flagsArr = _formBuilder.array([]);\r\n    this.form = _formBuilder.group({\r\n      flagsArr: this.flagsArr,\r\n    });\r\n\r\n    // user\r\n    this.userFlag = _formBuilder.control(null);\r\n    this.userForm = _formBuilder.group({\r\n      userFlag: this.userFlag,\r\n    });\r\n  }\r\n\r\n  ngOnInit(): void {}\r\n\r\n  ngOnDestroy(): void {\r\n    this._subs.forEach((s) => s.unsubscribe());\r\n  }\r\n\r\n  private getFlags(): Flag[] {\r\n    const flags = [...this._flags];\r\n    for (let i = 0; i < this.flagsArr.controls.length; i++) {\r\n      const g = this.flagsArr.at(i) as FormGroup;\r\n      flags[i].checked = g.controls['flag'].value === true;\r\n    }\r\n    return flags;\r\n  }\r\n\r\n  private emitFlagsChange(): void {\r\n    this._flags = this.getFlags();\r\n    this.flagsChange.emit(this._flags);\r\n  }\r\n\r\n  public addUserFlag(): void {\r\n    if (this.userForm.invalid) {\r\n      return;\r\n    }\r\n    const text = this.userFlag.value?.trim();\r\n    if (!text) {\r\n      return;\r\n    }\r\n\r\n    let flag: Flag = {\r\n      id: text,\r\n      label: text,\r\n      user: true,\r\n    };\r\n    flag.checked = true;\r\n\r\n    // do not add if the ID already exists\r\n    const flags = this._flags;\r\n    if (flags.some((f) => f.id === flag.id)) {\r\n      return;\r\n    }\r\n\r\n    // add flag (checked)\r\n    this._flags = [...this._flags, flag];\r\n    this.flagsArr.controls.push(this.getFlagGroup(true));\r\n\r\n    this.userFlag.reset();\r\n    this.userFlag.markAsPristine();\r\n\r\n    this.emitFlagsChange();\r\n  }\r\n\r\n  private getFlagGroup(checked: boolean): FormGroup {\r\n    const g = this._formBuilder.group({\r\n      flag: this._formBuilder.control<boolean>(checked, { nonNullable: true }),\r\n    });\r\n    this._subs.push(\r\n      g.valueChanges\r\n        .pipe(distinctUntilChanged(), debounceTime(200))\r\n        .subscribe((_) => {\r\n          if (!this._changeFrozen) {\r\n            this.emitFlagsChange();\r\n          }\r\n        })\r\n    );\r\n    return g;\r\n  }\r\n\r\n  private updateForm(flags: Flag[]): void {\r\n    this.flagsArr.clear();\r\n    flags.forEach((flag) => {\r\n      this.flagsArr.controls.push(this.getFlagGroup(flag.checked === true));\r\n    });\r\n  }\r\n\r\n  public toggleAll(): void {\r\n    this._changeFrozen = true;\r\n    for (let i = 0; i < this.flagsArr.controls.length; i++) {\r\n      const g = this.flagsArr.at(i) as FormGroup;\r\n      g.controls['flag'].setValue(!g.controls['flag'].value);\r\n    }\r\n    this._changeFrozen = false;\r\n    this.emitFlagsChange();\r\n  }\r\n\r\n  public deselectAll(): void {\r\n    this._changeFrozen = true;\r\n    for (let i = 0; i < this.flagsArr.controls.length; i++) {\r\n      const g = this.flagsArr.at(i) as FormGroup;\r\n      g.controls['flag'].setValue(false);\r\n    }\r\n    this._changeFrozen = false;\r\n    this.emitFlagsChange();\r\n  }\r\n\r\n  public selectAll(): void {\r\n    this._changeFrozen = true;\r\n    for (let i = 0; i < this.flagsArr.controls.length; i++) {\r\n      const g = this.flagsArr.at(i) as FormGroup;\r\n      g.controls['flag'].setValue(true);\r\n    }\r\n    this._changeFrozen = false;\r\n    this.emitFlagsChange();\r\n  }\r\n\r\n  // public removeFlag(index: number): void {\r\n  //   const flags = [...this._flags$.value];\r\n  //   flags.splice(index, 1);\r\n  //   this._flags$.next(flags);\r\n  //   this.emitFlagsChange();\r\n  // }\r\n}\r\n","@if (flags?.length || allowUserFlags) {\n<form [formGroup]=\"form\">\n  <!-- toolbar -->\n  @if (toolbar) {\n  <div>\n    <button\n      type=\"button\"\n      mat-icon-button\n      matTooltip=\"Toggle all\"\n      (click)=\"toggleAll()\"\n    >\n      <mat-icon>published_with_changes</mat-icon>\n    </button>\n    <button\n      type=\"button\"\n      color=\"primary\"\n      mat-icon-button\n      matTooltip=\"Select all\"\n      (click)=\"selectAll()\"\n    >\n      <mat-icon class=\"mat-primary\">done_all</mat-icon>\n    </button>\n    <button\n      type=\"button\"\n      mat-icon-button\n      matTooltip=\"Deselect all\"\n      color=\"warn\"\n      (click)=\"deselectAll()\"\n    >\n      <mat-icon class=\"mat-warn\">remove_done</mat-icon>\n    </button>\n    <!-- user -->\n    @if (allowUserFlags) {\n    <form\n      style=\"display: inline-block\"\n      [formGroup]=\"userForm\"\n      (submit)=\"addUserFlag()\"\n    >\n      <mat-form-field>\n        <mat-label>custom</mat-label>\n        <input matInput [formControl]=\"userFlag\" />\n      </mat-form-field>\n      <button\n        [disabled]=\"userForm.invalid\"\n        type=\"submit\"\n        mat-icon-button\n        color=\"primary\"\n        matTooltip=\"Add a new entry\"\n      >\n        <mat-icon class=\"mat-primary\">add_circle</mat-icon>\n      </button>\n    </form>\n    }\n  </div>\n  }\n  <!-- flags -->\n  <div formArrayName=\"flagsArr\" class=\"cols\">\n    @for (item of flagsArr.controls; track item; let i = $index) {\n    <div>\n      <!-- child form -->\n      <div\n        [formGroupName]=\"i\"\n        style=\"display: flex; align-items: center; gap: 6px\"\n      >\n        @if (numbering) {\n        <span class=\"numbering\" style=\"flex: 0 0 auto\">{{ i + 1 }}.</span>\n        }\n        <mat-checkbox\n          formControlName=\"flag\"\n          [matTooltip]=\"flags![i].id\"\n          [matTooltipDisabled]=\"!flagTips\"\n          >{{ flags![i].label || flags![i].id }}\n          @if (flags![i].user) {\n          <span>&nbsp;&#x270e;</span>\n          }\n        </mat-checkbox>\n      </div>\n    </div>\n    }\n  </div>\n</form>\n}\n","import { BehaviorSubject, Observable } from 'rxjs';\r\nimport { Flag } from './flags-picker.component';\r\n\r\ninterface FlagPickerSlot {\r\n  id: string;\r\n  checkedIds: string[];\r\n  flags: Flag[];\r\n}\r\n\r\n/**\r\n * Adapter for FlagsPickerComponent. This adapts a FlagsPickerComponent\r\n * to a consumer which may provide in unpredictable order either the flags\r\n * or their checks or both. The adapter has any number of slots, each keyed\r\n * with a string ID. Every slot contains the checked IDs and the list of flags.\r\n * When setting either flags or checks, the two values are merged into a\r\n * new list of flags which can be subscribed to.\r\n */\r\nexport class FlagsPickerAdapter {\r\n  private _slots: Map<string, FlagPickerSlot>;\r\n  private _slotSubjects: Map<string, BehaviorSubject<Flag[]>>;\r\n\r\n  constructor() {\r\n    this._slots = new Map<string, FlagPickerSlot>();\r\n    this._slotSubjects = new Map<string, BehaviorSubject<Flag[]>>();\r\n  }\r\n\r\n  /**\r\n   * Check if a slot with the specified ID is present in this adapter.\r\n   *\r\n   * @param slotId The slot ID.\r\n   * @returns True if the slot is present in this adapter.\r\n   */\r\n  public hasSlot(slotId: string): boolean {\r\n    return this._slots.has(slotId);\r\n  }\r\n\r\n  /**\r\n   * Gets the IDs of all the slots in this adapter.\r\n   *\r\n   * @returns The IDs.\r\n   */\r\n  public getSlotIds(): string[] {\r\n    return [...this._slots.keys()];\r\n  }\r\n\r\n  /**\r\n   * Get the current flags in the specified slot.\r\n   *\r\n   * @param slotId The slot ID.\r\n   * @returns The flags in the slot.\r\n   */\r\n  public getFlags(slotId: string): Flag[] {\r\n    const s = this._slotSubjects.get(slotId);\r\n    return s?.value || [];\r\n  }\r\n\r\n  /**\r\n   * Get the IDs of all the checked flags in the specified slot.\r\n   *\r\n   * @param slotId The slot ID.\r\n   * @returns The checked IDs, empty if none.\r\n   */\r\n  public getCheckedFlagIds(slotId: string): string[] {\r\n    return this.getFlags(slotId)\r\n      .filter((f) => f.checked)\r\n      .map((f) => f.id);\r\n  }\r\n\r\n  /**\r\n   * Get the IDs of all the checked flags in the specified slot.\r\n   *\r\n   * @param slotId The slot ID.\r\n   * @returns The checked IDs, undefined if none.\r\n   */\r\n  public getOptionalCheckedFlagIds(slotId: string): string[] | undefined {\r\n    const ids = this.getFlags(slotId)\r\n      .filter((f) => f.checked)\r\n      .map((f) => f.id);\r\n    return ids.length ? ids : undefined;\r\n  }\r\n\r\n  private ensureSlotCreated(slotId: string): void {\r\n    if (this._slots.has(slotId)) {\r\n      return;\r\n    }\r\n    this._slots.set(slotId, {\r\n      id: slotId,\r\n      checkedIds: [],\r\n      flags: [],\r\n    });\r\n    this._slotSubjects.set(slotId, new BehaviorSubject<Flag[]>([]));\r\n  }\r\n\r\n  private ensureSubjectCreated(slotId: string): void {\r\n    if (!this._slotSubjects.has(slotId)) {\r\n      this._slotSubjects.set(slotId, new BehaviorSubject<Flag[]>([]));\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get an observable array of flags for the specified slot.\r\n   *\r\n   * @param slotId The slot ID.\r\n   * @returns Observable with Flag[].\r\n   */\r\n  public selectFlags(slotId: string): Observable<Flag[]> {\r\n    console.debug(`selectFlags: ${slotId}`);\r\n    this.ensureSlotCreated(slotId);\r\n    return this._slotSubjects.get(slotId)!.asObservable();\r\n  }\r\n\r\n  /**\r\n   * Set the flags for the specified slot. The slot receives the new flags,\r\n   * but retains their previous checks, unless it's a new slot or applyChecks\r\n   * is true.\r\n   *\r\n   * @param slotId The slot's ID.\r\n   * @param flags The flags to set.\r\n   * @param applyChecks True to apply the checked values of flags to the slot\r\n   * checks; false to preserve slot's checks. When the slot does not exist,\r\n   * the checked values of flags are always applied.\r\n   * @returns The current flags of the specified slot.\r\n   */\r\n  public setSlotFlags(\r\n    slotId: string,\r\n    flags: Flag[],\r\n    applyChecks = false\r\n  ): Flag[] {\r\n    console.debug(\r\n      `setSlotFlags: ${slotId}: ${flags.length}` + (applyChecks ? 'A' : '')\r\n    );\r\n    let oldSlot: FlagPickerSlot | undefined = this._slots.get(slotId);\r\n    let slot: FlagPickerSlot;\r\n\r\n    if (oldSlot) {\r\n      if (oldSlot.flags === flags) {\r\n        return flags;\r\n      }\r\n      // if the slot exists:\r\n      // - either update flags checks according to existing IDs, or update the\r\n      //   existing IDs according to the received flags;\r\n      // - update slot flags with the received ones.\r\n      if (applyChecks) {\r\n        oldSlot.checkedIds = flags.filter((f) => f.checked).map((f) => f.id);\r\n      } else {\r\n        for (let i = 0; i < flags.length; i++) {\r\n          flags[i].checked = oldSlot.checkedIds.includes(flags[i].id);\r\n        }\r\n      }\r\n      slot = {\r\n        id: slotId,\r\n        // previous/updated checks\r\n        checkedIds: oldSlot.checkedIds,\r\n        // received flags untouched\r\n        flags: flags,\r\n      };\r\n    } else {\r\n      // if the slot does not exist:\r\n      // - create a new slot with flags and checks from the received flags\r\n      slot = {\r\n        id: slotId,\r\n        // received flags IDs\r\n        checkedIds: flags.filter((f) => f.checked).map((f) => f.id),\r\n        // received flags untouched\r\n        flags: flags,\r\n      };\r\n    }\r\n\r\n    this._slots.set(slotId, slot);\r\n    this.ensureSubjectCreated(slotId);\r\n    this._slotSubjects.get(slotId)!.next(slot.flags);\r\n    return slot.flags;\r\n  }\r\n\r\n  /**\r\n   * Set the checks for the specified slot.\r\n   *\r\n   * @param slotId The slot ID.\r\n   * @param ids The IDs of the flags to check.\r\n   * @param supplyFlags True to supply new user-defined flags\r\n   * when the ID is not found.\r\n   * @returns The current flags of the specified slot.\r\n   */\r\n  public setSlotChecks(\r\n    slotId: string,\r\n    ids: string[],\r\n    supplyFlags = false\r\n  ): Flag[] {\r\n    console.debug(`setSlotChecks: ${slotId}=${ids.join(',')}`);\r\n    let oldSlot: FlagPickerSlot | undefined = this._slots.get(slotId);\r\n    let slot: FlagPickerSlot;\r\n\r\n    // if the slot exists:\r\n    // - update its checks;\r\n    // - update the flags to reflect the checks.\r\n    if (oldSlot) {\r\n      slot = {\r\n        id: slotId,\r\n        checkedIds: ids,\r\n        flags: oldSlot.flags.map((f) => {\r\n          return {\r\n            ...f,\r\n            checked: ids.includes(f.id),\r\n          };\r\n        }),\r\n      };\r\n    } else {\r\n      // if the slot does not exist:\r\n      // - create it with the specified checks and empty flags list.\r\n      slot = {\r\n        id: slotId,\r\n        checkedIds: ids,\r\n        flags: [],\r\n      };\r\n    }\r\n\r\n    // supply flags if required\r\n    if (supplyFlags) {\r\n      for (let i = 0; i < ids.length; i++) {\r\n        if (slot.flags.every((f) => f.id !== ids[i])) {\r\n          slot.flags.push({\r\n            id: ids[i],\r\n            label: ids[i],\r\n            user: true,\r\n            checked: true\r\n          });\r\n        }\r\n      }\r\n    }\r\n\r\n    this._slots.set(slotId, slot);\r\n    this.ensureSubjectCreated(slotId);\r\n    this._slotSubjects.get(slotId)!.next(slot.flags);\r\n    return slot.flags;\r\n  }\r\n\r\n  /**\r\n   * Delete the slot with the specified ID from this adapter.\r\n   *\r\n   * @param slotId The slot ID.\r\n   */\r\n  public deleteSlot(slotId: string): void {\r\n    this._slots.delete(slotId);\r\n    this._slotSubjects.get(slotId)!.complete();\r\n    this._slotSubjects.delete(slotId);\r\n  }\r\n\r\n  /**\r\n   * Delete all the slots from this adapter.\r\n   */\r\n  public clear(): void {\r\n    this._slots.clear();\r\n    this._slotSubjects.forEach((s) => s.complete());\r\n    this._slotSubjects.clear();\r\n  }\r\n}\r\n","/*\r\n * Public API Surface of cadmus-ui-flags-picker\r\n */\r\n\r\nexport * from './lib/flags-picker/flags-picker.component';\r\nexport * from './lib/flags-picker/flags-picker-adapter';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}