hslayers-ng
Version: 
HSLayers-NG mapping library
1 lines • 22.3 kB
Source Map (JSON)
{"version":3,"file":"hslayers-ng-common-remove-multiple.mjs","sources":["../../../projects/hslayers/common/remove-multiple/remove-layer-dialog.service.ts","../../../projects/hslayers/common/remove-multiple/remove-layer-dialog.component.ts","../../../projects/hslayers/common/remove-multiple/remove-layer-dialog.component.html","../../../projects/hslayers/common/remove-multiple/remove-layer-dialog.module.ts","../../../projects/hslayers/common/remove-multiple/hslayers-ng-common-remove-multiple.ts"],"sourcesContent":["import {Injectable, inject} from '@angular/core';\n\nimport {Layer} from 'ol/layer';\nimport {Source} from 'ol/source';\n\nimport {HsCommonLaymanService} from 'hslayers-ng/common/layman';\nimport {HsDialogContainerService} from 'hslayers-ng/common/dialogs';\nimport {HsLanguageService} from 'hslayers-ng/services/language';\nimport {HsLaymanService} from 'hslayers-ng/services/save-map';\nimport {HsMapService} from 'hslayers-ng/services/map';\nimport {\n  HsRmLayerDialogComponent,\n  HsRmLayerDialogDeleteOptions,\n  HsRmLayerDialogResponse,\n} from './remove-layer-dialog.component';\nimport {HsToastService} from 'hslayers-ng/common/toast';\nimport {getDefinition, getName} from 'hslayers-ng/common/extensions';\n\nexport type RemoveLayerWrapper = {\n  layer: Layer<Source> | string;\n  toRemove: boolean;\n  displayTitle: string;\n};\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class HsRemoveLayerDialogService {\n  private hsMapService = inject(HsMapService);\n  private hsToastService = inject(HsToastService);\n  private hsLanguageService = inject(HsLanguageService);\n  private hsLaymanService = inject(HsLaymanService);\n  private hsCommonLaymanService = inject(HsCommonLaymanService);\n  private hsDialogContainerService = inject(HsDialogContainerService);\n\n  /**\n   * Create a remove layer wrapper\n   */\n  wrapLayer(layer: Layer<Source> | string): RemoveLayerWrapper {\n    return {\n      layer,\n      toRemove: false,\n      displayTitle: undefined,\n    };\n  }\n\n  /**\n   * Removes selected drawing layer from both Layermanager and Layman\n   * @param layer - Layer to be deleted - use when trying to delete layer other than hsDrawService.selectedLayer\n   * @param deleteFromOptions - From where the layer should be deleted, defaults to map, map&catalogue\n   */\n  async removeLayer(\n    layer: Layer<Source> | string,\n    deleteFromOptions?: HsRmLayerDialogDeleteOptions[],\n  ): Promise<boolean> {\n    const dialog = this.hsDialogContainerService.create(\n      HsRmLayerDialogComponent,\n      {\n        multiple: false,\n        message: 'DRAW.reallyDeleteThisLayer',\n        note: this.getDeleteNote(),\n        title: 'COMMON.confirmDelete',\n        items: [this.wrapLayer(layer)],\n        deleteFromOptions,\n      },\n    );\n    const confirmed: HsRmLayerDialogResponse = await dialog.waitResult();\n    if (confirmed.value == 'yes') {\n      const mapLayers = confirmed.type.includes('catalogue')\n        ? this.hsMapService.getLayersArray()\n        : undefined;\n      await this.completeLayerRemoval(layer, confirmed.type, mapLayers);\n    }\n    return confirmed.value == 'yes';\n  }\n\n  /**\n   * Overload for when delete options is 'catalogue'\n   * ['catalogue'] delete option is expected\n   */\n  async removeMultipleLayers(\n    layers: string[],\n    deleteFromOptions: ['catalogue'],\n  ): Promise<boolean>;\n\n  // Overload for other delete options with Layer<Source>[] type\n  async removeMultipleLayers(\n    layers: Layer<Source>[],\n    deleteFromOptions:\n      | Exclude<HsRmLayerDialogDeleteOptions, 'catalogue'>[]\n      | ['map'],\n  ): Promise<boolean>;\n\n  /**\n   * Removes multiple selected layers from both Layermanager and Layman\n   * @param layer - Layers to be deleted - use when trying to remove other than drawableLayers\n   * @param deleteFromOptions - From where the layer should be deleted defaults to map, map&catalogue\n   */\n  async removeMultipleLayers(\n    layersToRemove: Layer<Source>[] | string[],\n    deleteFromOptions?: HsRmLayerDialogDeleteOptions[],\n  ): Promise<boolean> {\n    const items = layersToRemove.map((l) => this.wrapLayer(l));\n\n    const dialog = this.hsDialogContainerService.create(\n      HsRmLayerDialogComponent,\n      {\n        multiple: true,\n        message: 'DRAW.pleaseCheckTheLayers',\n        note: this.getDeleteNote(true),\n        title: 'COMMON.selectAndConfirmToDeleteMultiple',\n        items: items,\n        deleteFromOptions,\n      },\n    );\n    const confirmed: HsRmLayerDialogResponse = await dialog.waitResult();\n    if (confirmed.value == 'yes') {\n      this.hsToastService.createToastPopupMessage(\n        'LAYMAN.deleteLayersRequest',\n        'LAYMAN.deletionInProgress',\n        {\n          type: 'info',\n          serviceCalledFrom: 'HsDrawService',\n          customDelay: 600000,\n        },\n      );\n\n      const drawablesToRemove = items.filter((l) => l.toRemove);\n      /**\n       * Remove checked layers, may be either - from layman and/or map\n       */\n      const mapLayers = confirmed.type.includes('catalogue')\n        ? this.hsMapService.getLayersArray()\n        : undefined;\n      for (const l of drawablesToRemove) {\n        await this.completeLayerRemoval(l.layer, confirmed.type, mapLayers);\n      }\n      this.hsToastService.removeByText(\n        this.hsLanguageService.getTranslation(\n          'LAYMAN.deletionInProgress',\n          undefined,\n        ),\n      );\n    }\n    return confirmed.value == 'yes';\n  }\n\n  /**\n   * Remove layer from map and Layman if desirable and possible\n   */\n  private async completeLayerRemoval(\n    layerToRemove: Layer<Source> | string,\n    deleteFrom: HsRmLayerDialogDeleteOptions,\n    mapLayers?: Layer<Source>[],\n  ): Promise<void> {\n    if (deleteFrom !== 'map') {\n      await this.removeFromCatalogue(layerToRemove);\n    }\n    if (deleteFrom.includes('map')) {\n      this.hsMapService.getMap().removeLayer(layerToRemove as Layer<Source>);\n    } else {\n      this.tryRemovingFromMap(layerToRemove as string, mapLayers);\n    }\n  }\n\n  /**\n   * Once layer is removed from catalogue try to find it in the map by name and remove it as well\n   */\n  private tryRemovingFromMap(layer: string, layers: Layer<Source>[]): void {\n    const lyr = layers.find((l) => getName(l) === layer);\n    if (lyr) {\n      this.hsMapService.getMap().removeLayer(lyr);\n    }\n  }\n\n  private async removeFromCatalogue(layerToRemove: Layer<Source> | string) {\n    const isLayer = layerToRemove instanceof Layer;\n    if (isLayer) {\n      const definition = getDefinition(layerToRemove);\n      if (\n        definition?.format?.toLowerCase().includes('wfs') &&\n        definition?.url\n      ) {\n        await this.hsLaymanService.removeLayer(layerToRemove);\n      }\n    } else {\n      //Remove layer which is not in map from catalogue based on name\n      await this.hsLaymanService.removeLayer(layerToRemove);\n    }\n  }\n\n  getDeleteNote(plural?: boolean): string {\n    return this.hsCommonLaymanService.isAuthenticated()\n      ? plural\n        ? 'DRAW.deleteNotePlural'\n        : 'DRAW.deleteNote'\n      : '';\n  }\n}\n","import {Component, OnInit, ViewRef, inject} from '@angular/core';\n\nimport {Layer} from 'ol/layer';\n\nimport {HsCommonLaymanService} from 'hslayers-ng/common/layman';\nimport {\n  HsDialogComponent,\n  HsDialogContainerService,\n  HsDialogItem,\n} from 'hslayers-ng/common/dialogs';\nimport {HsLanguageService} from 'hslayers-ng/services/language';\nimport {\n  HsRemoveLayerDialogService,\n  RemoveLayerWrapper,\n} from './remove-layer-dialog.service';\nimport {getName, getTitle} from 'hslayers-ng/common/extensions';\n\n/**\n * Both catalogue and mapcatalogue will remove layer from  map as well.\n * Difference is with layer 'form' - string vs Layer<Source> (see service removeMultipleLayers overloads)\n * string - Name param from Layman layer descriptor. Not all layers are guaranteed to be in map\n * Layer<Source> - OL layer. Layers already in map\n */\nexport type HsRmLayerDialogDeleteOptions = 'map' | 'catalogue' | 'mapcatalogue';\n\nexport type HsRmLayerDialogResponse = {\n  value: 'yes' | 'no';\n  type?: HsRmLayerDialogDeleteOptions;\n};\n\n@Component({\n  selector: 'hs-rm-layer-dialog',\n  templateUrl: './remove-layer-dialog.component.html',\n  styles: `\n    .modal-title {\n      white-space: nowrap;\n      width: 100%;\n    }\n    .modal-title span {\n      max-width: 18ch;\n    }\n  `,\n  standalone: false,\n})\nexport class HsRmLayerDialogComponent implements HsDialogComponent, OnInit {\n  hsDialogContainerService = inject(HsDialogContainerService);\n  service = inject(HsRemoveLayerDialogService);\n  private hsLanguageService = inject(HsLanguageService);\n  private commonLaymanService = inject(HsCommonLaymanService);\n\n  dialogItem: HsDialogItem;\n  _selectAll = false;\n  isAuthenticated: boolean;\n\n  deleteFrom: (typeof this.data)['deleteFromOptions'][number];\n\n  deleteAllowed = false;\n  viewRef: ViewRef;\n  /**\n   * @param deleteFromOptions - From where the layer should be deleted eg. map, catalogue map&catalogue\n   */\n  data: {\n    multiple: boolean;\n    title: string;\n    deleteFromOptions?: HsRmLayerDialogDeleteOptions[];\n    message: string;\n    note?: string;\n    items?: RemoveLayerWrapper[];\n  };\n\n  ngOnInit(): void {\n    this.isAuthenticated = this.commonLaymanService.isAuthenticated();\n    this.data.deleteFromOptions ??= ['map', 'mapcatalogue'];\n    if (!this.isAuthenticated || this.data.deleteFromOptions.length === 1) {\n      this.deleteFrom = this.data.deleteFromOptions[0];\n      this.deleteAllowed = !this.data.multiple;\n    }\n    if (this.data.items) {\n      for (const item of this.data.items) {\n        item.displayTitle = this.getTitle(item);\n      }\n    }\n  }\n  yes(): void {\n    this.hsDialogContainerService.destroy(this);\n    this.dialogItem.resolve({value: 'yes', type: this.deleteFrom});\n  }\n\n  no(): void {\n    this.hsDialogContainerService.destroy(this);\n    this.dialogItem.resolve({value: 'no'});\n  }\n\n  selectDeleteOption(option) {\n    this.deleteFrom = option;\n    /**\n     * If removing only one layer checkboxes are not available thus we need\n     * to disable delete button\n     */\n    this.deleteAllowed = !this.data.multiple ? true : this.deleteAllowed;\n  }\n\n  checkToRemove(item): void {\n    if (item.toRemove !== undefined) {\n      item.toRemove = !item.toRemove;\n    } else {\n      item.toRemove = true;\n    }\n    this.deleteAllowed = !!this.data.items.find((i) => i.toRemove);\n  }\n\n  toggleAll(): void {\n    this._selectAll = !this._selectAll;\n    for (const item of this.data.items) {\n      item.toRemove = this._selectAll;\n    }\n    this.deleteAllowed = !!this.data.items.find((i) => i.toRemove);\n  }\n\n  getTitle(item: RemoveLayerWrapper): string {\n    let title =\n      item.layer instanceof Layer\n        ? (getTitle(item.layer) ?? getName(item.layer))\n        : item.layer;\n    if (!title) {\n      title = this.hsLanguageService.getTranslation(\n        'COMMON.unknown',\n        undefined,\n      );\n    }\n    return title;\n  }\n}\n","<div class=\"modal in\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n  <div class=\"modal-dialog\">\n    <div class=\"modal-content\">\n      <div class=\"modal-header\">\n        <h4 class=\"modal-title d-flex\">\n          {{data.title | translate }}\n          @if (!data.multiple) {\n          <span class=\"text-truncate d-inline-block\">:\n            {{data.items[0].displayTitle}}</span>\n          }\n        </h4>\n        <button type=\"button\" (click)=\"no()\" class=\"btn-close\" data-dismiss=\"modal\"\n          [attr.aria-label]=\"'COMMON.close' | translate \"></button>\n      </div>\n      <div class=\"modal-body\" style=\"overflow-y:auto\">\n        @if(data.items.length > 0){\n        <div class=\"d-flex flex-column mb-3\"> <!-- pb-3 border-bottom -->\n          <p class=\"fw-bold h6\">{{'LAYERS.removeLayer.deleteFrom' | translate }}: </p>\n          <div class=\"d-flex gap-3 justify-content-center px-5\">\n            @for (option of data.deleteFromOptions; track option) {\n            <button type=\"button\" [attr.data-cy]=\"option\" [hidden]=\"option === 'catalogue' && !this.isAuthenticated\"\n              [ngClass]=\"{'active' : deleteFrom === option, 'w-auto' : option === 'catalogue' }\"\n              (click)=\"selectDeleteOption(option)\" class=\"btn btn-sm btn-outline-primary w-50\">\n              {{'LAYERS.removeLayer.' + option | translate }}\n            </button>\n            }\n          </div>\n        </div>\n        @if (deleteFrom && deleteFrom !== 'map') {\n        <p class=\"h6 small\">{{data.note | translate }}</p>\n        }\n        @if (deleteFrom && data.multiple) {\n        <div>\n          <p class=\"fw-bold h6\">{{data.message | translate }}</p>\n          @if (data.items?.length > 0) {\n          <div style=\"max-height: 65vh;\">\n            <div class=\"d-flex w-100 justify-content-center\">\n              <button type=\"button\" class=\"mt-1 btn btn-primary\"\n                (click)=\"toggleAll()\">{{'SAVECOMPOSITION.form.toggleAll' |\n                translate }}</button>\n            </div>\n            @for (item of data.items; track item) {\n            <div class=\"d-flex align-items-center\" style=\"word-break:break-all\">\n              <button type=\"button\" class=\"btn btn-sm m-0 p-0\" (click)=\"checkToRemove(item);$event.stopPropagation()\"\n                [ngClass]=\"item.toRemove ? 'hs-checkmark' : 'hs-uncheckmark'\"></button>\n              <p class=\"m-0 ps-1\">{{item.displayTitle}}</p>\n            </div>\n            }\n          </div>\n          }\n        </div>\n        }\n        }\n        @else {\n        <p class=\"fw-bold h6 text-center\">{{'LAYERS.removeLayer.noLayersToDelete' | translate }} </p>\n        }\n\n      </div>\n      <div class=\"modal-footer\">\n        <button type=\"button\" [disabled]=\"!deleteAllowed\" class=\"btn\"\n          [ngClass]=\"{'btn-primary': deleteFrom === 'map', 'btn-danger': deleteFrom !== 'map'}\" (click)=\"yes()\"\n          [title]=\"'COMMON.remove' | translate\" data-dismiss=\"modal\">{{'COMMON.remove' |\n          translate}}</button>\n        <button type=\"button\" class=\"btn btn-secondary compositions-btn-cancel\" [title]=\"'COMMON.back' | translate\"\n          (click)=\"no()\" data-dismiss=\"modal\">{{'COMMON.back' | translate}}</button>\n      </div>\n    </div>\n  </div>\n</div>\n","import {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {TranslatePipe} from '@ngx-translate/core';\n\nimport {HsRmLayerDialogComponent} from './remove-layer-dialog.component';\n\n@NgModule({\n  declarations: [HsRmLayerDialogComponent],\n  imports: [CommonModule, TranslatePipe],\n  exports: [HsRmLayerDialogComponent],\n})\nexport class HsRmLayerDialogModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}