@dsivd/prestations-ng 14.5.23-beta3 → 14.5.23-beta6

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.
@@ -1448,9 +1448,8 @@ const DEFAULT_DICTIONARY = {
1448
1448
  'foehn-status-progress-bar.step3': 'Confirmation',
1449
1449
  'foehn-status-progress-bar.step3.srOnly': 'Etape 3 sur 3, Confirmation, demande transmise',
1450
1450
  'foehn-multiselect-autocomplete.selected.delete': 'Supprimer {elementLabel}',
1451
- 'foehn-multiselect-autocomplete.selected.screen-reader.default-value': 'Élément sélectionné par défaut non supprimable :',
1452
- 'foehn-multiselect-autocomplete.selected.screen-reader.selected-value': 'Élément sélectionné:',
1453
- 'foehn-multiselect-autocomplete.list-of-selected-items': 'Liste des éléments sélectionnés:',
1451
+ 'foehn-multiselect-autocomplete.sr-announcement.deleted': '{elementLabel} a été supprimé, ',
1452
+ 'foehn-multiselect-autocomplete.sr-announcement.added': '{elementLabel} a été ajouté, ',
1454
1453
  'foehn-multiselect-autocomplete.autocomplete.empty-message': 'Tous les éléments de la liste de proposition ont déjà été ajoutés.',
1455
1454
  'foehn-multiselect-autocomplete.autocomplete.screen-reader.label': 'Sélectionner un élément dans la liste de recherche' +
1456
1455
  ' ci-dessous pour l\'ajouter à votre sélection.'
@@ -7819,7 +7818,8 @@ class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComponent {
7819
7818
  super(ngZone);
7820
7819
  this.dictionaryService = dictionaryService;
7821
7820
  this.showEmptyListMessage = false;
7822
- this.keyboardNavigationAllowed = false;
7821
+ this.srAnnouncements = '';
7822
+ this.SR_ANNOUNCEMENT_CLEAR_TIMEOUT_INTERVAL = 4000;
7823
7823
  }
7824
7824
  set defaultElementValues(items) {
7825
7825
  this.defaultElementValues_ = [...items];
@@ -7833,11 +7833,6 @@ class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComponent {
7833
7833
  set defaultElementValue(item) {
7834
7834
  this.defaultElementValues = [item];
7835
7835
  }
7836
- handleKeyboardDownEvent(event) {
7837
- if (this.keyboardNavigationAllowed) {
7838
- this.onKeyDownSelectedInner(event);
7839
- }
7840
- }
7841
7836
  updateMultiselectAutocomplete() {
7842
7837
  const validValue = this.getValidValue();
7843
7838
  if (typeof validValue !== 'undefined') {
@@ -7861,6 +7856,7 @@ class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComponent {
7861
7856
  this.updateMultiselectAutocomplete();
7862
7857
  this.handleUserInput();
7863
7858
  this.manageSuggestionListAndFocusAfterAddingAnItem();
7859
+ this.manageScreenReaderAnnouncement(item, false);
7864
7860
  }
7865
7861
  }
7866
7862
  }
@@ -7870,6 +7866,7 @@ class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComponent {
7870
7866
  this.model.splice(index, 1);
7871
7867
  this.triggerUserInput(this.model);
7872
7868
  this.manageSuggestionListAndFocusAfterRemovingAnItem();
7869
+ this.manageScreenReaderAnnouncement(item, true);
7873
7870
  }
7874
7871
  }
7875
7872
  trackByFn(index) {
@@ -7880,29 +7877,9 @@ class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComponent {
7880
7877
  const elem = this.findElementByModelItem(value);
7881
7878
  return super.getLabel(elem);
7882
7879
  }
7883
- getSelectedElementTabIndex(index) {
7884
- let firstIndexFocusable = 0;
7885
- if (!!this.defaultElementValues) {
7886
- firstIndexFocusable = this.model.findIndex((selected) => !this.defaultElementValues.includes(selected));
7887
- }
7888
- if (index !== firstIndexFocusable) {
7889
- return -1;
7890
- }
7891
- return 0;
7892
- }
7893
- isSelectedItemFocusable(index) {
7894
- return !this.disabled && !!this.defaultElementValues && this.defaultElementValues.includes(this.model[index]);
7895
- }
7896
7880
  canBeDeleted(index) {
7897
7881
  return !this.defaultElementValues || !this.defaultElementValues.includes(this.model[index]);
7898
7882
  }
7899
- onSelectedItemsFocusin() {
7900
- this.keyboardNavigationAllowed = true;
7901
- this.currentFocusedElem = document.activeElement;
7902
- }
7903
- onSelectedItemsFocusout() {
7904
- this.keyboardNavigationAllowed = false;
7905
- }
7906
7883
  onAutocompleteElementsLoaded(elements) {
7907
7884
  // Need to wait for childView to be loaded
7908
7885
  setTimeout(() => {
@@ -7914,8 +7891,8 @@ class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComponent {
7914
7891
  }
7915
7892
  });
7916
7893
  }
7917
- getSelectedListAriaLabel() {
7918
- return `${this.label}: ${this.dictionaryService.getKeySync('foehn-multiselect-autocomplete.list-of-selected-items')}`;
7894
+ getDeleteButtonAriaLabel(element) {
7895
+ return `${this.dictionaryService.getKeySync('foehn-multiselect-autocomplete.selected.delete', { elementLabel: this.getLabel(element) })}`;
7919
7896
  }
7920
7897
  findElementByModelItem(item) {
7921
7898
  if (!!this.elements && !!this.elements.length) {
@@ -7936,55 +7913,6 @@ class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComponent {
7936
7913
  }
7937
7914
  return this.model;
7938
7915
  }
7939
- getFirstDeleteButtonToFocus() {
7940
- const closeButtonsElemRefArray = [...this.closeButtonsElemRef.toArray()];
7941
- if (!!closeButtonsElemRefArray.length) {
7942
- return closeButtonsElemRefArray[0].nativeElement;
7943
- }
7944
- return null;
7945
- }
7946
- navigateSelectedList(offset) {
7947
- if (!this.disabled) {
7948
- const closeButtonsElemRefArray = this.getDefaultSelectedElements().concat([...this.closeButtonsElemRef.toArray()]);
7949
- if (!!closeButtonsElemRefArray.length) {
7950
- const focusIndex = closeButtonsElemRefArray.findIndex(value => this.currentFocusedElem === value.nativeElement);
7951
- let newIndex = focusIndex + offset;
7952
- if (newIndex >= closeButtonsElemRefArray.length) {
7953
- newIndex = 0;
7954
- }
7955
- if (newIndex < 0) {
7956
- newIndex = closeButtonsElemRefArray.length - 1;
7957
- }
7958
- const elemRef = closeButtonsElemRefArray[newIndex];
7959
- if (!!elemRef) {
7960
- elemRef.nativeElement.focus();
7961
- }
7962
- }
7963
- }
7964
- }
7965
- getDefaultSelectedElements() {
7966
- return [...this.selectedElemRef.toArray()].filter(value => value.nativeElement.getAttribute('is-default') === 'true');
7967
- }
7968
- onKeyDownSelectedInner(keyEvent) {
7969
- // IE doesn't support keyEvent.code, and has different values
7970
- // in keyEvent.key (Down instead of ArrowDown for instance), hence the multi-support.
7971
- const ie11CompatibleCode = keyEvent.code || keyEvent.key;
7972
- switch (ie11CompatibleCode) {
7973
- case 'Right':
7974
- case 'ArrowRight':
7975
- this.navigateSelectedList(1);
7976
- break;
7977
- case 'Left':
7978
- case 'ArrowLeft':
7979
- this.navigateSelectedList(-1);
7980
- break;
7981
- default:
7982
- return true;
7983
- }
7984
- keyEvent.preventDefault();
7985
- keyEvent.stopPropagation();
7986
- return false;
7987
- }
7988
7916
  filterAutocompleteElements(elements) {
7989
7917
  const filteredElements = ObjectHelper.deepCopy(elements);
7990
7918
  if (!!this.model && !!this.model.length) {
@@ -8001,6 +7929,7 @@ class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComponent {
8001
7929
  return filteredElements;
8002
7930
  }
8003
7931
  manageSuggestionListAndFocusAfterAddingAnItem() {
7932
+ // Empty autocomplete input
8004
7933
  this.autocompleteInputValue = null;
8005
7934
  // Remove selected item from autocomplete suggestion list
8006
7935
  this.autocompleteComponent.elements = this.filterAutocompleteElements(this.elements);
@@ -8023,17 +7952,6 @@ class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComponent {
8023
7952
  this.autocompleteComponent.inputElement.nativeElement.hidden = false;
8024
7953
  // Add back selected item to autocomplete suggestion list
8025
7954
  this.autocompleteComponent.elements = this.filterAutocompleteElements(this.elements);
8026
- // When deleting a selected item, check were to set focus back
8027
- this.closeButtonsElemRef.changes.pipe(first()).subscribe(() => {
8028
- const buttonToFocus = this.getFirstDeleteButtonToFocus();
8029
- if (!!buttonToFocus) {
8030
- buttonToFocus.focus();
8031
- }
8032
- else {
8033
- this.autocompleteComponent.setFocusOnInput();
8034
- this.autocompleteComponent.onInputFocus();
8035
- }
8036
- });
8037
7955
  }
8038
7956
  showAlertMessageAndHideAutocomplete() {
8039
7957
  // Show a message to user indicating there is no more suggestions to display
@@ -8042,15 +7960,27 @@ class FoehnMultiselectAutocompleteComponent extends FoehnAutocompleteComponent {
8042
7960
  this.autocompleteInputValue = null;
8043
7961
  this.autocompleteComponent.inputElement.nativeElement.hidden = true;
8044
7962
  }
7963
+ manageScreenReaderAnnouncement(element, isDelete) {
7964
+ clearTimeout(this.srAnnouncementClearTimer);
7965
+ if (isDelete) {
7966
+ this.srAnnouncements += `${this.dictionaryService.getKeySync('foehn-multiselect-autocomplete.sr-announcement.deleted', { elementLabel: this.getLabel(element) })}`;
7967
+ }
7968
+ else {
7969
+ this.srAnnouncements += `${this.dictionaryService.getKeySync('foehn-multiselect-autocomplete.sr-announcement.added', { elementLabel: this.getLabel(element) })}`;
7970
+ }
7971
+ this.srAnnouncementClearTimer = setTimeout(() => {
7972
+ this.srAnnouncements = '';
7973
+ }, this.SR_ANNOUNCEMENT_CLEAR_TIMEOUT_INTERVAL);
7974
+ }
8045
7975
  }
8046
7976
  FoehnMultiselectAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: FoehnMultiselectAutocompleteComponent, deps: [{ token: i0.NgZone }, { token: SdkDictionaryService }], target: i0.ɵɵFactoryTarget.Component });
8047
- FoehnMultiselectAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.4", type: FoehnMultiselectAutocompleteComponent, selector: "foehn-multiselect-autocomplete", inputs: { defaultElementValues: "defaultElementValues", defaultElementValue: "defaultElementValue" }, host: { listeners: { "keydown": "handleKeyboardDownEvent($event)" } }, providers: [
7977
+ FoehnMultiselectAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.4", type: FoehnMultiselectAutocompleteComponent, selector: "foehn-multiselect-autocomplete", inputs: { defaultElementValues: "defaultElementValues", defaultElementValue: "defaultElementValue" }, providers: [
8048
7978
  {
8049
7979
  provide: FoehnInputComponent,
8050
7980
  useExisting: forwardRef(() => FoehnMultiselectAutocompleteComponent),
8051
7981
  multi: true
8052
7982
  }
8053
- ], viewQueries: [{ propertyName: "autocompleteComponent", first: true, predicate: ["autocompleteComponent"], descendants: true }, { propertyName: "alertMessageContainer", first: true, predicate: ["alertMessageContainer"], descendants: true }, { propertyName: "closeButtonsElemRef", predicate: ["closeButtonsElemRef"], descendants: true }, { propertyName: "selectedElemRef", predicate: ["selectedElemRef"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<foehn-autocomplete\n #autocompleteComponent\n [name]=\"name\"\n [label]=\"label\"\n [elements]=\"elements\"\n [elementsUrl]=\"elementsUrl\"\n [elementValue]=\"elementValue\"\n [elementLabel]=\"elementLabel\"\n [elementValueIdentity]=\"elementValueIdentity\"\n [elementDisabled]=\"elementDisabled\"\n [allElementDisabled]=\"allElementDisabled\"\n [elementGroup]=\"elementGroup\"\n [allowCustomValue]=\"false\"\n [searchValueMinCharsCount]=\"searchValueMinCharsCount\"\n [customValueModelGenerator]=\"customValueModelGenerator\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n (userInput)=\"addItem($event)\"\n [(model)]=\"autocompleteInputValue\"\n (elementsLoaded)=\"onAutocompleteElementsLoaded($event)\"\n>\n <div\n [attr.role]=\"!disabled ? 'application' : null\"\n (focusin)=\"onSelectedItemsFocusin()\"\n (focusout)=\"onSelectedItemsFocusout()\"\n [tabindex]=\"(!!model && !!model.length) ? 0 : -1\"\n class=\"selected-list-container\"\n >\n <ul\n [id]=\"buildChildId() + 'SelectedItemsList'\"\n class=\"list-unstyled mb-1 d-flex align-content-stretch flex-wrap\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n aria-orientation=\"horizontal\"\n [attr.aria-label]=\"getSelectedListAriaLabel()\"\n >\n <li\n *ngFor=\"let element of model; let index = index; trackBy: trackByFn\"\n class=\"badge badge-pill badge-secondary mr-1 mb-1 py-2 px-3 d-flex align-items-center\"\n [tabindex]=\"isSelectedItemFocusable(index) ? 0 : -1\"\n [attr.is-default]=\"!canBeDeleted(index)\"\n #selectedElemRef\n >\n <ng-container *ngIf=\"!disabled\">\n <span *ngIf=\"!canBeDeleted(index)\" class=\"sr-only\">{{ 'foehn-multiselect-autocomplete.selected.screen-reader.default-value' | fromDictionary }}</span>\n <span *ngIf=\"canBeDeleted(index)\" class=\"sr-only\">{{ 'foehn-multiselect-autocomplete.selected.screen-reader.selected-value' | fromDictionary }}</span>\n </ng-container>\n\n <span [innerHtml]=\"getLabel(element)\"></span>\n\n <button\n *ngIf=\"!disabled && canBeDeleted(index)\"\n type=\"button\"\n class=\"btn btn-link ml-2\"\n [tabindex]=\"getSelectedElementTabIndex(index)\"\n (click)=\"removeItem(element)\"\n #closeButtonsElemRef\n >\n <foehn-icon-times\n title=\"{{ 'foehn-multiselect-autocomplete.selected.delete' | fromDictionary: {elementLabel: getLabel(element)} }}\"\n ></foehn-icon-times>\n </button>\n </li>\n </ul>\n </div>\n\n <small\n *ngIf=\"!showEmptyListMessage\"\n [attr.id]=\"buildChildId() + 'Help'\"\n class=\"form-text text-secondary\"\n [innerHTML]=\"helpText ? helpText : 'foehn-multiselect-autocomplete.autocomplete.screen-reader.label' | fromDictionary\"\n ></small>\n\n <div\n [id]=\"buildChildId() + 'AlertMessageContainer'\"\n role=\"status\"\n tabindex=\"-1\"\n #alertMessageContainer\n >\n <p\n *ngIf=\"showEmptyListMessage\"\n class=\"alert alert-info\"\n tabindex=\"0\"\n >{{'foehn-multiselect-autocomplete.autocomplete.empty-message' | fromDictionary}}</p>\n </div>\n</foehn-autocomplete>\n", styles: [".selected-list-container button>.btn,.btn-link{line-height:inherit;padding:0}.selected-list-container li:focus{outline:0;box-shadow:inset 0 1px 1px #00000013,0 0 0 .2rem #ffbf47}.selected-list-container:focus{outline:0;box-shadow:inset 0 1px 1px #00000013,0 0 0 .2rem #ffbf47}foehn-autocomplete p.alert:focus{outline:0;box-shadow:inset 0 1px 1px #00000013,0 0 0 .2rem #ffbf47}\n"], components: [{ type: FoehnAutocompleteComponent, selector: "foehn-autocomplete", inputs: ["searchValueMinCharsCount", "allowCustomValue", "customValueModelGenerator"] }, { type: FoehnIconTimesComponent, selector: "foehn-icon-times" }], directives: [{ type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "fromDictionary": SdkDictionaryPipe } });
7983
+ ], viewQueries: [{ propertyName: "autocompleteComponent", first: true, predicate: ["autocompleteComponent"], descendants: true }, { propertyName: "alertMessageContainer", first: true, predicate: ["alertMessageContainer"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<foehn-autocomplete\n #autocompleteComponent\n [name]=\"name\"\n [label]=\"label\"\n [elements]=\"elements\"\n [elementsUrl]=\"elementsUrl\"\n [elementValue]=\"elementValue\"\n [elementLabel]=\"elementLabel\"\n [elementValueIdentity]=\"elementValueIdentity\"\n [elementDisabled]=\"elementDisabled\"\n [allElementDisabled]=\"allElementDisabled\"\n [elementGroup]=\"elementGroup\"\n [allowCustomValue]=\"false\"\n [searchValueMinCharsCount]=\"searchValueMinCharsCount\"\n [customValueModelGenerator]=\"customValueModelGenerator\"\n [required]=\"required\"\n [disabled]=\"disabled\"\n (userInput)=\"addItem($event)\"\n [(model)]=\"autocompleteInputValue\"\n (elementsLoaded)=\"onAutocompleteElementsLoaded($event)\"\n>\n <small\n *ngIf=\"!showEmptyListMessage\"\n [attr.id]=\"buildChildId('Help')\"\n class=\"form-text text-secondary\"\n [innerHTML]=\"helpText ? helpText : 'foehn-multiselect-autocomplete.autocomplete.screen-reader.label' | fromDictionary\"\n ></small>\n\n <div\n [id]=\"buildChildId('AlertMessageContainer')\"\n role=\"status\"\n #alertMessageContainer\n >\n <p\n *ngIf=\"showEmptyListMessage\"\n class=\"alert alert-info\"\n tabindex=\"0\"\n >{{'foehn-multiselect-autocomplete.autocomplete.empty-message' | fromDictionary}}</p>\n </div>\n</foehn-autocomplete>\n\n<p\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n>\n {{srAnnouncements}}\n</p>\n\n<div\n role=\"presentation\"\n class=\"selected-list-container d-flex align-content-stretch flex-wrap\"\n [ngClass]=\"!!model && !!model.length ? 'mb-2' : 'mb-0'\"\n>\n <ng-container *ngFor=\"let element of model; let index = index; trackBy: trackByFn\">\n <span\n *ngIf=\"!canBeDeleted(index)\"\n class=\"badge badge-pill badge-secondary mr-1 mb-1 py-2 px-3 d-flex align-items-center\"\n [tabindex]=\"0\"\n [attr.aria-describedby]=\"buildChildId('Label')\"\n >\n {{getLabel(element)}}\n </span>\n <button\n *ngIf=\"canBeDeleted(index)\"\n class=\"btn btn-secondary badge badge-pill mr-1 mb-1 py-2 px-3 d-flex align-items-center\"\n [tabindex]=\"0\"\n [attr.aria-label]=\"getDeleteButtonAriaLabel(element)\"\n [attr.aria-describedby]=\"buildChildId('Label')\"\n [title]=\"getDeleteButtonAriaLabel(element)\"\n (click)=\"removeItem(element)\"\n >\n {{getLabel(element)}}\n <foehn-icon-times\n aria-hidden=\"true\"\n class=\"ml-2\"\n [title]=\"getDeleteButtonAriaLabel(element)\"\n ></foehn-icon-times>\n </button>\n </ng-container>\n</div>\n", styles: ["foehn-autocomplete p.alert:focus{outline:0;box-shadow:inset 0 1px 1px #00000013,0 0 0 .2rem #ffbf47}.selected-list-container button>.btn,.btn-link{line-height:inherit;padding:0}.selected-list-container .btn{text-transform:none}.selected-list-container span.badge-pill:focus{outline:0;box-shadow:inset 0 1px 1px #00000013,0 0 0 .2rem #ffbf47}\n"], components: [{ type: FoehnAutocompleteComponent, selector: "foehn-autocomplete", inputs: ["searchValueMinCharsCount", "allowCustomValue", "customValueModelGenerator"] }, { type: FoehnIconTimesComponent, selector: "foehn-icon-times" }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "fromDictionary": SdkDictionaryPipe } });
8054
7984
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.4", ngImport: i0, type: FoehnMultiselectAutocompleteComponent, decorators: [{
8055
7985
  type: Component,
8056
7986
  args: [{
@@ -8071,19 +8001,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.4", ngImpor
8071
8001
  }], alertMessageContainer: [{
8072
8002
  type: ViewChild,
8073
8003
  args: ['alertMessageContainer']
8074
- }], closeButtonsElemRef: [{
8075
- type: ViewChildren,
8076
- args: ['closeButtonsElemRef']
8077
- }], selectedElemRef: [{
8078
- type: ViewChildren,
8079
- args: ['selectedElemRef']
8080
8004
  }], defaultElementValues: [{
8081
8005
  type: Input
8082
8006
  }], defaultElementValue: [{
8083
8007
  type: Input
8084
- }], handleKeyboardDownEvent: [{
8085
- type: HostListener,
8086
- args: ['keydown', ['$event']]
8087
8008
  }] } });
8088
8009
 
8089
8010
  class FoehnMultiselectAutocompleteModule {