{"version":3,"file":"hslayers-ng-common-layman.mjs","sources":["../../../projects/hslayers/common/layman/parse-base64-style.ts","../../../projects/hslayers/common/layman/transliteration-map.ts","../../../projects/hslayers/common/layman/layman-utils.ts","../../../projects/hslayers/common/layman/layman.service.ts","../../../projects/hslayers/common/layman/access-rights/layman-access-rights.component.ts","../../../projects/hslayers/common/layman/access-rights/layman-access-rights.component.html","../../../projects/hslayers/common/layman/layman-current-user.component.ts","../../../projects/hslayers/common/layman/layman-current-user.component.html","../../../projects/hslayers/common/layman/layman-login.component.ts","../../../projects/hslayers/common/layman/layman-login.component.html","../../../projects/hslayers/common/layman/layman-layer.service.ts","../../../projects/hslayers/common/layman/hslayers-ng-common-layman.ts"],"sourcesContent":["/**\n * Parse QML string style and make base64 symbols usable in browser by\n *\n * Look for prop elements with source attribute\n * and prepend its content to v while switching : with ,\n */\nexport function parseBase64Style(styleString: string) {\n  const regex = /<prop([^>]*source=\"(data:[^\"]*)\"[^>]*v=\"base64:([^\"]*)\")/g;\n\n  return styleString.startsWith('<qgis')\n    ? styleString.replace(regex, (match, p1, p2, p3) => {\n        return match.replace(`v=\"base64:${p3}\"`, `v=\"${p2}base64,${p3}\"`);\n      })\n    : styleString;\n}\n","/* eslint-disable prettier/prettier */\n/**\n * ASCII transliterations for a wide range of European characters\n * commonly used in various languages.\n */\nexport const TRANSLITERATION_MAP = {\n  // Latin-1 Supplement\n  'À': 'A','Á': 'A','Â': 'A','Ã': 'A','Ä': 'A','Å': 'A','Æ': 'AE','Ç': 'C','È': 'E','É': 'E','Ê': 'E','Ë': 'E',\n  'Ì': 'I','Í': 'I','Î': 'I','Ï': 'I','Ð': 'D','Ñ': 'N','Ò': 'O','Ó': 'O','Ô': 'O','Õ': 'O','Ö': 'O','×': 'x',\n  'Ø': 'O','Ù': 'U','Ú': 'U','Û': 'U','Ü': 'U','Ý': 'Y','Þ': 'Th','ß': 'ss','à': 'a','á': 'a','â': 'a','ã': 'a',\n  'ä': 'a','å': 'a','æ': 'ae','ç': 'c','è': 'e','é': 'e','ê': 'e','ë': 'e','ì': 'i','í': 'i','î': 'i','ï': 'i',\n  'ð': 'd','ñ': 'n','ò': 'o','ó': 'o','ô': 'o','õ': 'o','ö': 'o','÷': 'x','ø': 'o','ù': 'u','ú': 'u','û': 'u',\n  'ü': 'u','ý': 'y','þ': 'th','ÿ': 'y',\n  \n  // Latin Extended-A\n  'Ā': 'A','ā': 'a','Ă': 'A','ă': 'a','Ą': 'A','ą': 'a','Ć': 'C','ć': 'c','Ĉ': 'C','ĉ': 'c','Ċ': 'C','ċ': 'c',\n  'Č': 'C','č': 'c','Ď': 'D','ď': 'd','Đ': 'D','đ': 'd','Ē': 'E','ē': 'e','Ĕ': 'E','ĕ': 'e','Ė': 'E','ė': 'e',\n  'Ę': 'E','ę': 'e','Ě': 'E','ě': 'e','Ĝ': 'G','ĝ': 'g','Ğ': 'G','ğ': 'g','Ġ': 'G','ġ': 'g','Ģ': 'G','ģ': 'g',\n  'Ĥ': 'H','ĥ': 'h','Ħ': 'H','ħ': 'h','Ĩ': 'I','ĩ': 'i','Ī': 'I','ī': 'i','Ĭ': 'I','ĭ': 'i','Į': 'I','į': 'i',\n  'İ': 'I','ı': 'i','Ĳ': 'IJ','ĳ': 'ij','Ĵ': 'J','ĵ': 'j','Ķ': 'K','ķ': 'k','ĸ': 'k','Ĺ': 'L','ĺ': 'l','Ļ': 'L',\n  'ļ': 'l','Ľ': 'L','ľ': 'l','Ŀ': 'L','ŀ': 'l','Ł': 'L','ł': 'l',\n\n  // Latin Extended-B\n  'Ń': 'N','ń': 'n','Ņ': 'N','ņ': 'n','Ň': 'N','ň': 'n','ŉ': 'n','Ŋ': 'N','ŋ': 'n','Ō': 'O','ō': 'o','Ŏ': 'O',\n  'ŏ': 'o','Ő': 'O','ő': 'o','Œ': 'OE','œ': 'oe','Ŕ': 'R','ŕ': 'r','Ŗ': 'R','ŗ': 'r','Ř': 'R','ř': 'r','Ś': 'S',\n  'ś': 's','Ŝ': 'S','ŝ': 's','Ş': 'S','ş': 's','Š': 'S','š': 's','Ţ': 'T','ţ': 't','Ť': 'T','ť': 't','Ŧ': 'T','ŧ': 't',\n  'Ũ': 'U','ũ': 'u','Ū': 'U','ū': 'u','Ŭ': 'U','ŭ': 'u','Ů': 'U','ů': 'u','Ű': 'U','ű': 'u','Ų': 'U','ų': 'u',\n  'Ŵ': 'W','ŵ': 'w','Ŷ': 'Y','ŷ': 'y','Ÿ': 'Y','Ź': 'Z','ź': 'z','Ż': 'Z','ż': 'z','Ž': 'Z','ž': 'z',\n} as const;\n","import {Layer, Vector as VectorLayer} from 'ol/layer';\nimport {Vector as VectorSource, Source} from 'ol/source';\n\nimport {HsEndpoint, HsLaymanLayerDescriptor} from 'hslayers-ng/types';\nimport {TRANSLITERATION_MAP} from './transliteration-map';\nimport {\n  getDefinition,\n  getHsLaymanSynchronizing,\n  getName,\n  getTitle,\n} from 'hslayers-ng/common/extensions';\nimport {Feature} from 'ol/index';\nimport {HsConfig} from 'hslayers-ng/config';\n\nexport const PREFER_RESUMABLE_SIZE_LIMIT = 2 * 1024 * 1024; // 2 MB\nexport const SUPPORTED_SRS_LIST = [\n  'EPSG:3857',\n  'EPSG:4326',\n  'EPSG:5514',\n  'EPSG:32633',\n  'EPSG:32634',\n  'EPSG:3034',\n  'EPSG:3035',\n  'EPSG:3059',\n  'EPSG:32718',\n  'EPSG:9377',\n];\n\n/**\n * Function to transliterate Czech and Slovak characters\n */\nfunction transliterate(text: string) {\n  return text\n    .split('')\n    .map((char) => TRANSLITERATION_MAP[char] || char)\n    .join('');\n}\n\n/**\n * Get Layman friendly name for layer based on its title by\n * replacing spaces with underscores, converting to lowercase, etc.\n * see https://github.com/jirik/layman/blob/c79edab5d9be51dee0e2bfc5b2f6a380d2657cbd/src/layman/util.py#L30\n * @param title - Title to get Layman-friendly name for\n * @returns New layer name\n */\nexport function getLaymanFriendlyLayerName(title: string): string {\n  title = transliterate(title)\n    .toLowerCase()\n    .replace(/[^\\w\\s\\-\\.]/gm, '') //Remove spaces\n    .trim()\n    .replace(/[\\s\\-\\._]+/gm, '_') //Remove dashes\n    // eslint-disable-next-line no-control-regex\n    .replace(/[^\\x00-\\x7F]/g, ''); //Remove non-ascii letters https://stackoverflow.com/questions/20856197/remove-non-ascii-character-in-string\n  return title;\n}\n\n/**\n * Get layman friendly name of layer based primary on name\n * and secondary on title attributes.\n *\n * @param layer - Layer to get the name for\n */\nexport function getLayerName(layer: Layer<Source>): string {\n  const layerName = getName(layer) || getTitle(layer);\n  if (layerName == undefined) {\n    this.$log.warn('Layer title/name not set for', layer);\n  }\n  return getLaymanFriendlyLayerName(layerName);\n}\n\nexport function wfsNotAvailable(descr: HsLaymanLayerDescriptor) {\n  return descr.wfs?.status == 'NOT_AVAILABLE';\n}\n\nexport function layerParamPendingOrStarting(\n  descr: HsLaymanLayerDescriptor,\n  param: string,\n) {\n  return (\n    descr[param]?.status == 'PENDING' ||\n    descr[param]?.status == 'STARTED' ||\n    descr[param]?.status == 'SUCCESS'\n  );\n}\n\nexport function wfsFailed(descr: HsLaymanLayerDescriptor) {\n  return descr.wfs?.status == 'FAILURE';\n}\n\nexport function getSupportedSrsList(ep: HsEndpoint) {\n  if (isAtLeastVersions(ep, '2.2.0')) {\n    return SUPPORTED_SRS_LIST;\n  }\n  if (isAtLeastVersions(ep, '1.16.0')) {\n    return SUPPORTED_SRS_LIST.slice(0, 8);\n  }\n  return SUPPORTED_SRS_LIST.slice(0, 2);\n}\n\n/**\n * @param ep - Layman endpoint\n * @param version - Version which the endpoint version will be compared with\n */\nexport function isAtLeastVersions(ep: HsEndpoint, version: string): boolean {\n  try {\n    if (!ep.version) {\n      console.warn('Endpoint version not set, returning false');\n      return false;\n    }\n    const epVerParts = ep.version.split('.').map((part) => parseInt(part, 10));\n    const compareVerParts = version\n      .split('.')\n      .map((part) => parseInt(part, 10));\n\n    const maxLength = Math.max(epVerParts.length, compareVerParts.length);\n\n    for (let i = 0; i < maxLength; i++) {\n      const epSegment = epVerParts[i] || 0;\n      const compareSegment = compareVerParts[i] || 0;\n\n      //If epSegment is greater than compareSegment, return true\n      if (epSegment > compareSegment) {\n        return true;\n      }\n      //If epSegment is less than compareSegment, return false\n      if (epSegment < compareSegment) {\n        return false;\n      }\n    }\n\n    return true; // Versions are equal or epVer is longer with trailing zeros\n  } catch (error) {\n    console.warn('Error comparing versions, returning false', error);\n    return false;\n  }\n}\n\n/**\n * Wait until layer synchronization is complete\n * @param layer - OL Layer\n */\nexport async function awaitLayerSync(layer: Layer): Promise<boolean> {\n  while (getHsLaymanSynchronizing(layer)) {\n    await new Promise((r) => setTimeout(r, 200));\n  }\n  return true;\n}\n\n/**\n * Check if the selected layer is synchronize-able\n * @param layer - Layer to check\n * @returns True if the layer can be synchronized, false otherwise\n */\nexport function isLayerSynchronizable(\n  layer: VectorLayer<VectorSource<Feature>>,\n  instOf: (obj: any, klass: any) => boolean,\n): boolean {\n  const definition = getDefinition(layer);\n  return (\n    instOf(layer.getSource(), VectorSource) &&\n    //Test whether format contains 'wfs' AND does not contain 'external'. Case insensitive\n    new RegExp('^(?=.*wfs)(?:(?!external).)*$', 'i').test(\n      definition?.format?.toLowerCase(),\n    )\n  );\n}\n\n/**\n * Check if the URL matches any exception patterns\n * @param url - URL to be checked\n * @returns true if the URL matches an exception pattern\n */\nexport function isLaymanUrlException(\n  url: string,\n  exceptions: HsConfig['laymanUrlExceptions'],\n): boolean {\n  if (!exceptions) {\n    return false;\n  }\n\n  // Check startsWith patterns\n  if (exceptions.startsWith?.length) {\n    for (const pattern of exceptions.startsWith) {\n      if (url.startsWith(pattern)) {\n        return true;\n      }\n    }\n  }\n\n  // Check includes patterns\n  if (exceptions.includes?.length) {\n    for (const pattern of exceptions.includes) {\n      if (url.includes(pattern)) {\n        return true;\n      }\n    }\n  }\n\n  // Check regex patterns\n  if (exceptions.regex?.length) {\n    for (const pattern of exceptions.regex) {\n      try {\n        const regex = new RegExp(pattern);\n        if (regex.test(url)) {\n          return true;\n        }\n      } catch (e) {\n        this.hsLog.warn(\n          `Invalid regex pattern in laymanUrlExceptions: ${pattern}`,\n        );\n      }\n    }\n  }\n\n  return false;\n}\n","import {HttpClient, HttpHeaders} from '@angular/common/http';\nimport {computed, inject, Injectable} from '@angular/core';\nimport {toObservable, toSignal} from '@angular/core/rxjs-interop';\n\nimport {\n  Observable,\n  Subject,\n  catchError,\n  distinctUntilChanged,\n  lastValueFrom,\n  map,\n  merge,\n  of,\n  retry,\n  shareReplay,\n  startWith,\n  switchMap,\n  tap,\n  timer,\n} from 'rxjs';\n\nimport {CurrentUserResponse} from './types/current-user-response.type';\nimport {AboutLayman, HsEndpoint, HsAuthState} from 'hslayers-ng/types';\nimport {HsLanguageService} from 'hslayers-ng/services/language';\nimport {HsLogService} from 'hslayers-ng/services/log';\nimport {HsToastService} from 'hslayers-ng/common/toast';\nimport {HsCommonEndpointsService} from 'hslayers-ng/services/endpoints';\nimport {HsProxyService} from 'hslayers-ng/services/utils';\nimport {parseBase64Style} from './parse-base64-style';\nimport {HsConfig} from 'hslayers-ng/config';\nimport {isLaymanUrlException} from './layman-utils';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class HsCommonLaymanService {\n  endpointService = inject(HsCommonEndpointsService);\n  http = inject(HttpClient);\n  proxyService = inject(HsProxyService);\n  hsToastService = inject(HsToastService);\n  hsLanguageService = inject(HsLanguageService);\n  hsLog = inject(HsLogService);\n  hsConfig = inject(HsConfig);\n\n  private readonly MAX_USER_POLL_ATTEMPTS = 7;\n  private readonly USER_POLL_DELAY = 2500;\n\n  readonly layman$: Observable<HsEndpoint> = toObservable(\n    this.endpointService.endpoints,\n  ).pipe(\n    map((endpoints) => endpoints.find((ep) => ep.type.includes('layman'))),\n    switchMap((endpoint) => {\n      if (!endpoint) {\n        return of(undefined);\n      }\n      // Query version information when endpoint is available\n      return this.http\n        .get<AboutLayman>(endpoint.url + '/rest/about/version')\n        .pipe(\n          map((version) => {\n            if (version) {\n              return {\n                ...endpoint,\n                version: version.about.applications.layman.version,\n              };\n            }\n            return endpoint;\n          }),\n          catchError((error) => {\n            console.warn('There was an error trying to get layman version');\n            return of(endpoint);\n          }),\n        );\n    }),\n    // Register the endpoint with HsProxyService to avoid circular dependency\n    tap((endpoint) => {\n      if (endpoint) {\n        this.proxyService.registerLaymanEndpoints(endpoint.url);\n      }\n    }),\n    shareReplay(1),\n  );\n\n  readonly layman = toSignal(this.layman$);\n\n  readonly version = computed(() => this.layman()?.version);\n\n  // Action streams\n  login$ = new Subject<void>();\n  logout$ = new Subject<void>();\n\n  // Combined auth actions\n  authActions$ = merge(\n    this.login$.pipe(map(() => ({type: 'login'}))),\n    this.logout$.pipe(map(() => ({type: 'logout'}))),\n  );\n\n  authState$: Observable<HsAuthState> = this.layman$.pipe(\n    // Initial check for current user when endpoint is available\n    switchMap((endpoint) => {\n      if (!endpoint) {\n        return of(undefined);\n      }\n      /**\n       * Check for current user. In Wagtail we might receive authentication right of the bat.\n       * The rest is controlled via login and logout triggers.\n       */\n      return this.getCurrentUser(endpoint.url).pipe(\n        // Listen for auth actions after initial check\n        switchMap((currentUser) => {\n          return this.authActions$.pipe(\n            // Start with the initial state\n            startWith(null),\n            // For each auth action, update the state\n            switchMap((action) => {\n              if (!action) {\n                return of({\n                  user: currentUser.username,\n                  authenticated: currentUser.authenticated,\n                }); // Initial state\n              }\n\n              if (action.type === 'login') {\n                // On login poll for user\n                return this.pollForUser().pipe(\n                  map((cu) => {\n                    const authenticated = !!cu?.authenticated;\n                    const username = cu?.username;\n\n                    // Show success toast if authentication was successful\n                    if (authenticated && username) {\n                      this.hsToastService.createToastPopupMessage(\n                        'COMMON.success',\n                        'AUTH.loginSuccessful',\n                        {\n                          type: 'success',\n                          serviceCalledFrom: 'HsCommonLaymanService',\n                        },\n                      );\n                    }\n\n                    return {\n                      user: username,\n                      authenticated,\n                    };\n                  }),\n                  catchError((error) => {\n                    // Handle authentication errors\n                    this.hsToastService.createToastPopupMessage(\n                      'COMMON.error',\n                      'AUTH.loginFailed',\n                      {\n                        type: 'danger',\n                        serviceCalledFrom: 'HsCommonLaymanService',\n                        details: [error.message || 'AUTH.loginFailed'],\n                      },\n                    );\n\n                    // Return endpoint with authentication failed\n                    return of({\n                      user: undefined,\n                      authenticated: false,\n                    });\n                  }),\n                );\n              }\n              if (action.type === 'logout') {\n                if (this.isAuthenticated()) {\n                  this.hsToastService.createToastPopupMessage(\n                    'AUTH.Logout',\n                    'AUTH.logoutSuccessful',\n                    {\n                      type: 'success',\n                    },\n                  );\n                }\n                // On logout action, clear user data\n                return of({\n                  ...endpoint,\n                  user: undefined,\n                  authenticated: false,\n                });\n              }\n            }),\n          );\n        }),\n      );\n    }),\n    shareReplay(1),\n  );\n\n  authState = toSignal(this.authState$);\n\n  // Always return a boolean value, defaulting to false when layman is undefined\n  isAuthenticated = computed(() => !!this.authState()?.authenticated);\n  user = computed(() => this.authState()?.user);\n\n  // Create an observable for the authenticating state\n  isAuthenticating = toSignal(\n    merge(\n      // Set to true when login action is triggered\n      this.login$.pipe(map(() => true)),\n\n      // Set to false when layman$ emits a new value (authentication completed)\n      this.authState$.pipe(map(() => false)),\n    ).pipe(startWith(false), distinctUntilChanged(), shareReplay(1)),\n  );\n\n  /**\n   * Check wether provided url belongs to Layman endpoint\n   * @param url - URL to be checked\n   * @param layman - Layman endpoint\n   */\n  isLaymanUrl(url: string, layman: HsEndpoint): boolean {\n    if (!layman) {\n      return false;\n    }\n\n    /**\n     * If the URL is marked as an exception, return false\n     */\n    if (isLaymanUrlException(url, this.hsConfig.laymanUrlExceptions)) {\n      return false;\n    }\n    /**\n     *If url includes layman-proxy its for sure from layman\n     *additionally it allows loading of vector layers saved on production\n     *using layman-proxy in dev env\n     */\n    if (url.includes('layman-proxy')) {\n      return true;\n    }\n    const laymanUrl = layman.type.includes('wagtail')\n      ? layman.url.split('layman-proxy')[0]\n      : layman.url;\n    return url.includes(laymanUrl);\n  }\n\n  /**\n   * Get current user from layman endpoint\n   * @param endpoint - Layman endpoint\n   */\n  getCurrentUser(endpoint_url: HsEndpoint['url']) {\n    if (!endpoint_url) {\n      return of(undefined);\n    }\n    const url = `${endpoint_url}/rest/current-user`;\n    return this.http\n      .get<CurrentUserResponse>(url, {withCredentials: true})\n      .pipe(\n        catchError((error) => {\n          // Handle errors from getCurrentUser\n          this.hsToastService.createToastPopupMessage(\n            'COMMON.error',\n            'AUTH.userInfoFailed',\n            {\n              type: 'danger',\n              serviceCalledFrom: 'HsCommonLaymanService',\n              details: [error.message || 'AUTH.userInfoFailed'],\n            },\n          );\n          return of({\n            authenticated: false,\n            username: undefined,\n          });\n        }),\n      );\n  }\n\n  /**\n   * Log into existing account by opening a login endpoint in new window\n   * and polling for the results\n   */\n  pollForUser(): Observable<CurrentUserResponse | undefined> {\n    const laymanEndpoint = this.layman();\n    if (!laymanEndpoint) {\n      return of(undefined);\n    }\n\n    return timer(1000).pipe(\n      switchMap(() =>\n        this.getCurrentUser(laymanEndpoint.url).pipe(\n          switchMap((response) => {\n            if (!response || !response.authenticated) {\n              // Handle case where authenticated is false\n              throw new Error('AUTH.notAuthenticated');\n            }\n            return of(response);\n          }),\n        ),\n      ),\n      retry({\n        count: this.MAX_USER_POLL_ATTEMPTS,\n        delay: this.USER_POLL_DELAY,\n      }),\n      catchError((error) => {\n        // Handle error after all retries are exhausted\n        console.error('Error retrieving profile:', error);\n\n        // Show error toast after retries are exhausted\n        this.hsToastService.createToastPopupMessage(\n          'COMMON.error',\n          'AUTH.authenticationFailed',\n          {\n            type: 'danger',\n            serviceCalledFrom: 'HsCommonLaymanService',\n            details: [\n              'AUTH.authenticationFailed',\n              error.message || 'Unknown error occurred',\n            ],\n          },\n        );\n\n        return of(null);\n      }),\n    );\n  }\n\n  async logout(): Promise<void> {\n    const laymanEndpoint = this.layman();\n    if (!laymanEndpoint) {\n      return;\n    }\n\n    const url = `${laymanEndpoint.url}/logout`;\n    try {\n      await lastValueFrom(this.http.get(url, {withCredentials: true}));\n    } catch (ex) {\n      this.hsLog.warn(ex);\n    } finally {\n      /***\n       * TODO: this might go first\n       */\n      this.logout$.next();\n    }\n  }\n\n  displayLaymanError(\n    endpoint: HsEndpoint,\n    errorMsg: string,\n    responseBody: {code?: number; message?: string; detail?: string},\n  ): void {\n    let simplifiedResponse = '';\n    if (responseBody.code === undefined) {\n      simplifiedResponse = 'COMMON.unknownError';\n    }\n    switch (responseBody.code) {\n      case 48:\n        simplifiedResponse = 'mapExtentFilterMissing';\n        break;\n      case 32:\n        simplifiedResponse = 'Authentication failed. Login to the catalogue.';\n        //this.detectAuthChange(endpoint);\n        break;\n      default:\n        simplifiedResponse = responseBody.message;\n        if (responseBody.detail) {\n          simplifiedResponse = simplifiedResponse + ' ' + responseBody.detail;\n        }\n    }\n    //If response is object, it is an error response\n    this.hsToastService.createToastPopupMessage(\n      this.hsLanguageService.getTranslation(errorMsg, undefined),\n      endpoint.title +\n        ': ' +\n        this.hsLanguageService.getTranslationIgnoreNonExisting(\n          'COMMON',\n          simplifiedResponse,\n          undefined,\n        ),\n      {\n        disableLocalization: true,\n        serviceCalledFrom: 'HsCommonLaymanService',\n        type: 'danger',\n      },\n    );\n  }\n\n  async getStyleFromUrl(styleUrl: string): Promise<string> {\n    try {\n      const response = await lastValueFrom(\n        this.http\n          .get(styleUrl, {\n            headers: new HttpHeaders().set('Content-Type', 'text'),\n            responseType: 'text',\n            withCredentials: true,\n          })\n          .pipe(map((response) => parseBase64Style(response))),\n      );\n      return response;\n    } catch (ex) {\n      this.hsLog.error(ex);\n      return undefined;\n    }\n  }\n}\n","import {\n  Component,\n  EventEmitter,\n  Input,\n  OnInit,\n  Output,\n  signal,\n  WritableSignal,\n  inject,\n} from '@angular/core';\nimport {HttpClient} from '@angular/common/http';\nimport {FormsModule} from '@angular/forms';\nimport {NgTemplateOutlet} from '@angular/common';\nimport {Observable, catchError, lastValueFrom, map, of, switchMap} from 'rxjs';\nimport {TranslatePipe} from '@ngx-translate/core';\n\nimport {AccessRightsModel, HsEndpoint} from 'hslayers-ng/types';\nimport {HsCommonLaymanService} from '../layman.service';\nimport {HsLogService} from 'hslayers-ng/services/log';\nimport {LaymanUser} from '../types/layman-user.type';\nimport {FilterPipe} from 'hslayers-ng/common/pipes';\n\nexport enum GrantingOptions {\n  PERUSER = 'perUser',\n  EVERYONE = 'everyone',\n  PERROLE = 'perRole',\n}\n\nexport enum AccessRights {\n  READ = 'access_rights.read',\n  WRITE = 'access_rights.write',\n}\n\ntype AcessRightsActor = GrantingOptions.PERROLE | GrantingOptions.PERUSER;\n\ntype LaymanRole = {\n  name: string;\n  read: boolean;\n  write: boolean;\n};\n\ntype WagtailUser = {\n  username: string;\n  roles: [\n    {\n      id: number;\n      name: string;\n    },\n    {\n      id: number;\n      name: string;\n    },\n  ];\n};\n\nexport type AccessRightsType = 'read' | 'write';\n\n@Component({\n  selector: 'hs-layman-access-rights',\n  templateUrl: './layman-access-rights.component.html',\n  imports: [TranslatePipe, FilterPipe, FormsModule, NgTemplateOutlet],\n})\nexport class HsCommonLaymanAccessRightsComponent implements OnInit {\n  hsCommonLaymanService = inject(HsCommonLaymanService);\n  private $http = inject(HttpClient);\n  private hsLog = inject(HsLogService);\n\n  @Input() access_rights: AccessRightsModel;\n  defaultAccessRights: AccessRightsModel;\n  @Input() collapsed: boolean = false;\n\n  @Output() access_rights_changed = new EventEmitter<AccessRightsModel>();\n\n  grantingOptions: GrantingOptions[] = [\n    GrantingOptions.EVERYONE,\n    GrantingOptions.PERUSER,\n    GrantingOptions.PERROLE,\n  ];\n  currentOption: string = GrantingOptions.EVERYONE;\n  rightsOptions: AccessRightsType[] = ['read', 'write'];\n\n  allUsers: WritableSignal<LaymanUser[]> = signal<LaymanUser[]>(undefined);\n  allRoles: WritableSignal<LaymanRole[]> = signal<LaymanRole[]>(undefined);\n\n  userSearch: string;\n  endpoint: HsEndpoint;\n  async ngOnInit(): Promise<void> {\n    this.endpoint = this.hsCommonLaymanService.layman();\n    this.defaultAccessRights = JSON.parse(JSON.stringify(this.access_rights));\n    this.setUpAccessRights();\n  }\n\n  /**\n   * Sets up access rights based on access_rights input or reset to defaultAccessRights\n   */\n  setUpAccessRights() {\n    this.currentOption = GrantingOptions.EVERYONE;\n    const readAccess = this.access_rights[AccessRights.READ].split(',');\n    const writeAccess = this.access_rights[AccessRights.WRITE].split(',');\n    /** Bigger than 1 because of current user + others/role */\n    if (readAccess.length > 1 || writeAccess.length > 1) {\n      //Uppercase entry = role permissions\n      this.currentOption = [...readAccess, ...writeAccess].find(\n        (item) => item === item.toUpperCase() && item !== 'EVERYONE',\n      )\n        ? GrantingOptions.PERROLE\n        : GrantingOptions.PERUSER;\n      if (this.currentOption === GrantingOptions.PERUSER) {\n        this.getAllUsers();\n      } else {\n        this.getRoles();\n      }\n    }\n  }\n\n  /**\n   * Toggles access rights for all users\n   * @param users - Username list that have access rights\n   * @param type - Access right type (read or write)\n   */\n  toggleRightsForAllUsers(type: AccessRightsType): void {\n    /**\n     * Value to be set.\n     * Negative of value of bigger part of the users\n     */\n    const allUsers = this.allUsers();\n    const value = allUsers.length / 2 >= allUsers.filter((u) => u[type]).length;\n\n    allUsers.forEach((user) => {\n      const isCurrentUser = user.name === this.hsCommonLaymanService.user();\n      //Value for current user won't be changed\n      user[type] = isCurrentUser ? user[type] : value;\n      //In case write permission is being added make sure read is granted as well\n      //when read permission is being taken away, make sure write is taken as well\n      if ((type === 'write' && value) || (type === 'read' && !value)) {\n        const t = type === 'write' ? 'read' : 'write';\n        user[t] = isCurrentUser ? user[t] : value;\n        this.access_rights[`access_rights.${t}`] = value\n          ? 'EVERYONE'\n          : 'private';\n      }\n    });\n    //Update access_rights model\n    this.access_rights[`access_rights.${type}`] = value\n      ? 'EVERYONE'\n      : 'private';\n    this.access_rights_changed.emit(this.access_rights);\n  }\n\n  /**\n   * Change access rights for everyone\n   * @param type - Access rights type (access_rights.read or access_rights.write)\n   * @param value - Access rights value (private, EVERYONE, users name or user role)\n   * @param event - Checkbox change event\n   */\n  accessRightsChanged(\n    type: AccessRightsType,\n    value: string,\n    event?: any,\n  ): void {\n    if (this.currentOption == GrantingOptions.PERUSER) {\n      this.rightsChangedPerActor(type, value, GrantingOptions.PERUSER, event);\n    } else if (this.currentOption == GrantingOptions.PERROLE) {\n      this.rightsChangedPerActor(type, value, GrantingOptions.PERROLE, event);\n    } else {\n      this.access_rights[`access_rights.${type}`] = value;\n      if (\n        this.access_rights[AccessRights.READ] == 'private' &&\n        this.access_rights[AccessRights.WRITE] != 'private'\n      ) {\n        this.access_rights[AccessRights.WRITE] = 'private';\n      }\n    }\n    /**\n     * Notify parent component that value has changed so it can update reactiveForm\n     * model (hacky but quicker)\n     */\n    this.access_rights_changed.emit(this.access_rights);\n  }\n\n  /**\n   * Change each user access rights individually\n   * @param type - Access rights type (access_rights.read or access_rights.write)\n   * @param value - Access rights value (username for user)\n   * @param event - Checkbox change event\n   */\n  rightsChangedPerActor(\n    type: AccessRightsType,\n    name: LaymanUser['name'] | LaymanRole['name'],\n    actor: AcessRightsActor,\n    event?: any,\n  ): void {\n    const value = event.target.checked;\n    const user = this.findLaymanActor(name, actor);\n    if ((type === 'write' && value) || (type === 'read' && !value)) {\n      const t = type === 'write' ? 'read' : 'write';\n      user[t] = value;\n      this.setAcessRightsFromActor(t, actor);\n    }\n    this.setAcessRightsFromActor(type, actor);\n  }\n\n  /**\n   * Based on [type] property of users/roles update access_rights value\n   */\n  setAcessRightsFromActor(\n    type: AccessRightsType,\n    actor: AcessRightsActor,\n  ): void {\n    const source =\n      actor === GrantingOptions.PERUSER\n        ? this.allUsers()\n        : [\n            ...this.allRoles(),\n            //Add current user as he has got to retain both read and write rights\n            {name: this.hsCommonLaymanService.user(), read: true, write: true},\n          ];\n    //If all users/roles have access rights, set to EVERYONE\n    const everyone = source.every((u) => u[type]);\n    this.access_rights[`access_rights.${type}`] = everyone\n      ? 'EVERYONE'\n      : source\n          .reduce((acc, curr) => {\n            if (curr[type]) {\n              acc.push(curr['name']);\n            }\n            return acc;\n          }, [] as string[])\n          .join(',');\n    this.access_rights_changed.emit(this.access_rights);\n  }\n\n  /**\n   * Find user by name from all Layman users\n   * @param name - User name provided\n   */\n  findLaymanActor<T extends GrantingOptions>(\n    name: string,\n    actor: T,\n  ): T extends GrantingOptions.PERUSER ? LaymanUser : LaymanRole {\n    const source =\n      actor === GrantingOptions.PERUSER ? this.allUsers() : this.allRoles();\n    return source.find(\n      (u: any) => u.name === name,\n    ) as T extends GrantingOptions.PERUSER ? LaymanUser : LaymanRole;\n  }\n\n  /**\n   * Change access granting options (everyone or perUser)\n   * @param option - Access granting option\n   */\n  async changeGrantingOptions(option: GrantingOptions): Promise<void> {\n    this.currentOption = option;\n    if (option == GrantingOptions.PERUSER) {\n      await this.getAllUsers();\n    } else if (option == GrantingOptions.PERROLE) {\n      await this.getRoles();\n    } else {\n      //In case some users/roles has access rights use EVERYONE, private otherwise\n      //READ\n      const actor =\n        this.currentOption == GrantingOptions.PERROLE\n          ? this.allRoles()\n          : this.allUsers();\n      const rights = actor.reduce(\n        (acc, curr) => {\n          acc.read += curr['read'] ? 1 : 0;\n          acc.write += curr['write'] ? 1 : 0;\n          return acc;\n        },\n        {read: 0, write: 0},\n      );\n      this.access_rights[AccessRights.READ] =\n        rights.read > 1 ? 'EVERYONE' : 'private';\n\n      this.access_rights[AccessRights.WRITE] =\n        rights.write > 1 ? 'EVERYONE' : 'private';\n    }\n  }\n\n  /**\n   * Determine whether the role has an access or not\n   * Inaccurate for USER to ROLE as roles might overlap\n   */\n  roleHasAccess(\n    role: string,\n    rights: string[],\n    type: AccessRightsType,\n  ): boolean {\n    //Switching from users table\n    if (this.currentOption === GrantingOptions.PERUSER) {\n      //Users with the role\n      const usersWithRole = this.allUsers().filter((u) =>\n        u.role.includes(role),\n      );\n      //Users of that role with access\n      const usersWithRoleAndAccess = usersWithRole.filter((u) => u[type]);\n      return (\n        //True in case more than half of the users from the role has access\n        (usersWithRoleAndAccess.length !== 0 &&\n          usersWithRoleAndAccess.length >= usersWithRole.length / 2) ||\n        //Or all users has access\n        this.allUsers().filter((u) => u[type]).length === this.allUsers().length\n      );\n    }\n    //Switching from 'everyone' tab or opening role tab first\n    return rights.includes(role) || rights.includes('EVERYONE');\n  }\n\n  /**\n   * Get user roles\n   */\n  async getRoles(access_rights?: AccessRightsModel): Promise<void> {\n    if (this.hsCommonLaymanService.isAuthenticated()) {\n      const url = `${this.endpoint.url}/rest/roles`;\n\n      access_rights ??= this.access_rights;\n      const read = access_rights[AccessRights.READ].split(',');\n      const write = access_rights[AccessRights.WRITE].split(',');\n\n      try {\n        const roles = await lastValueFrom(\n          of(this.allRoles()).pipe(\n            switchMap((roles) =>\n              !roles || roles.length === 0\n                ? this.$http.get<string[]>(url, {withCredentials: true})\n                : of(roles.map((r) => r.name)),\n            ),\n            map((roles: string[]) => {\n              return roles\n                .filter((r) => r !== 'EVERYONE')\n                .map((r) => {\n                  return {\n                    name: r,\n                    read: this.roleHasAccess(r, read, 'read'),\n                    write: this.roleHasAccess(r, write, 'write'),\n                  };\n                });\n            }),\n          ),\n        );\n        this.allRoles.set(roles);\n        this.setAcessRightsFromActor('read', GrantingOptions.PERROLE);\n        this.setAcessRightsFromActor('write', GrantingOptions.PERROLE);\n      } catch (error) {\n        console.warn('Could not get roles list', error);\n        this.allRoles.set([]);\n      }\n    }\n  }\n\n  /**\n   * Check whether user list includes Wagtail user list\n   */\n  private isWagtailUserArray(\n    users: LaymanUser[] | WagtailUser[],\n  ): users is WagtailUser[] {\n    return users.length > 0 && 'roles' in users[0];\n  }\n\n  /**\n   * Get users from Layman or Wagtail depending on the endpoint type.\n   * Main difference is that Wagtail response includes user roles\n   */\n  fetchUsers(): Observable<LaymanUser[]> {\n    const url = this.endpoint.type.includes('wagtail')\n      ? '/users'\n      : `${this.endpoint.url}/rest/users`;\n    return this.$http\n      .get<LaymanUser[] | WagtailUser[]>(url, {withCredentials: true})\n      .pipe(\n        map((users) => {\n          if (this.isWagtailUserArray(users)) {\n            return users.map((u) => ({\n              username: u.username,\n              screen_name: u.username,\n              given_name: u.username,\n              family_name: u.username,\n              middle_name: u.username,\n              name: u.username,\n              role: u.roles.map((r) => r.name.toUpperCase()),\n            }));\n          }\n          return users; // Already LaymanUser[], so no transformation needed\n        }),\n        catchError((error) => {\n          console.warn('Could not get users list', error);\n          return of([]);\n        }),\n      );\n  }\n\n  /**\n   * Check whether user has access rights.\n   */\n  userHasAccess(\n    user: LaymanUser,\n    rights: string[],\n    type: AccessRightsType,\n  ): boolean {\n    if (this.currentOption === GrantingOptions.PERROLE) {\n      return (\n        this.allRoles().every((r) => r[type]) ||\n        user.role?.some((r) => rights.includes(r))\n      );\n    }\n    return rights.includes(user.name) || rights.includes('EVERYONE');\n  }\n\n  /**\n   * Get all registered users from Layman's endpoint service\n   */\n  async getAllUsers(access_rights?: AccessRightsModel): Promise<void> {\n    if (this.hsCommonLaymanService.isAuthenticated()) {\n      access_rights ??= this.access_rights;\n      const read = access_rights[AccessRights.READ].split(',');\n      const write = access_rights[AccessRights.WRITE].split(',');\n\n      try {\n        const users = await lastValueFrom(\n          of(this.allUsers()).pipe(\n            switchMap((users) =>\n              !users || users.length === 0 ? this.fetchUsers() : of(users),\n            ),\n            map((res: LaymanUser[]) => {\n              return res.map((user) => {\n                const isCurrentUser =\n                  user.username === this.hsCommonLaymanService.user();\n                const laymanUser: LaymanUser = {\n                  ...user,\n                  name: user.username,\n                  role: user.role || [],\n                };\n                //Assign rights after obj initiation to have access to roles\n                laymanUser.read =\n                  isCurrentUser || this.userHasAccess(laymanUser, read, 'read');\n                laymanUser.write =\n                  isCurrentUser ||\n                  this.userHasAccess(laymanUser, write, 'write');\n                laymanUser.hslDisplayName ??= this.getDisplayName(laymanUser);\n                return laymanUser;\n              });\n            }),\n          ),\n        );\n        this.allUsers.set(users);\n        this.setAcessRightsFromActor('read', GrantingOptions.PERUSER);\n        this.setAcessRightsFromActor('write', GrantingOptions.PERUSER);\n      } catch (e) {\n        this.hsLog.error(e);\n        this.allUsers.set([]);\n      }\n    }\n  }\n\n  /**\n   * Filter users by name\n   * This function is passed as filter pipe function\n   */\n  userFilter = (item: LaymanUser): boolean => {\n    const r = new RegExp(this.userSearch, 'i');\n    return (\n      r.test(item.given_name) ||\n      r.test(item.family_name) ||\n      r.test(item.screen_name)\n    );\n  };\n\n  /**\n   * Refresh user list, when searching for specific user\n   */\n  refreshList(): void {\n    this.allUsers.set(Array.from(this.allUsers()));\n  }\n\n  /**\n   * Reset to the state before user manipulation\n   */\n  async resetToDefault(): Promise<void> {\n    //Reassing default access rights\n    this.access_rights[AccessRights.READ] =\n      this.defaultAccessRights[AccessRights.READ];\n    this.access_rights[AccessRights.WRITE] =\n      this.defaultAccessRights[AccessRights.WRITE];\n\n    this.setUpAccessRights();\n  }\n\n  /**\n   * Refresh user list, when searching for specific user\n   * @param user - Provided Layman's service user\n   */\n  getDisplayName(user: any): string {\n    if (user.given_name && user.family_name) {\n      return user.given_name + ' ' + user.family_name;\n    }\n    if (user.screen_name) {\n      return user.screen_name;\n    }\n    return user.username;\n  }\n}\n","<!-- Access rights template -->\n<ng-template\n  #accessRightsTpl\n  let-accessRights=\"access_rights\"\n  let-right=\"right\"\n  let-grantedTo=\"grantedTo\"\n>\n  <div class=\"form-group d-flex justify-content-between\">\n    <label class=\"pt-2\" style=\"margin-bottom: 0\">\n      {{ \"SAVECOMPOSITION.\" + right + \"AccessRights\" | translate }}\n    </label>\n    <div class=\"btn-group\">\n      <button\n        type=\"button\"\n        class=\"btn btn-light hs-toolbar-button btn-outline-secondary\"\n        [disabled]=\"\n          right !== 'read' && access_rights['access_rights.read'] === 'private'\n        \"\n        (click)=\"accessRightsChanged(right, grantedTo)\"\n        [class.active]=\"access_rights['access_rights.' + right] === grantedTo\"\n      >\n        {{ \"SAVECOMPOSITION.public\" | translate }}\n      </button>\n      <button\n        type=\"button\"\n        class=\"btn btn-light hs-toolbar-button btn-outline-secondary\"\n        (click)=\"accessRightsChanged(right, 'private')\"\n        [class.active]=\"access_rights['access_rights.' + right] === 'private'\"\n      >\n        {{ \"SAVECOMPOSITION.private\" | translate }}\n      </button>\n    </div>\n  </div>\n</ng-template>\n<ul class=\"nav nav-tabs justify-content-end my-2 mb-3\">\n  <button\n    (click)=\"resetToDefault()\"\n    class=\"btn btn-light btn-sm position-absolute text-secondary\"\n    type=\"button\"\n    style=\"left: 0; transform: translateX(50%)\"\n    [title]=\"'COMMON.resetToDefault' | translate\"\n  >\n    <i class=\"fa-solid fa-rotate-right\"></i>\n  </button>\n  @for (option of grantingOptions; track $index) {\n    <li class=\"nav-item\" (click)=\"changeGrantingOptions(option)\">\n      <a\n        [class.active]=\"currentOption === option\"\n        class=\"nav-link\"\n        aria-current=\"page\"\n        >{{ \"SAVECOMPOSITION.\" + option | translate }}</a\n      >\n    </li>\n  }\n</ul>\n@if (currentOption === \"everyone\") {\n  @for (type of rightsOptions; track type) {\n    <ng-container\n      *ngTemplateOutlet=\"\n        accessRightsTpl;\n        context: {\n          accessRights: access_rights,\n          right: type,\n          grantedTo: 'EVERYONE',\n        }\n      \"\n    >\n    </ng-container>\n  }\n} @else if (currentOption === \"perUser\") {\n  @if (allUsers()) {\n    <section class=\"d-flex\">\n      <div>\n        <input\n          type=\"search\"\n          class=\"form-control hs-save-map-filter\"\n          [placeholder]=\"'COMMON.filter' | translate\"\n          [(ngModel)]=\"userSearch\"\n          name=\"rights-per-user-filter\"\n          (input)=\"refreshList()\"\n        />\n      </div>\n      <div class=\"d-flex justify-content-end gap-5 w-50 align-self-end\">\n        @for (type of rightsOptions; track type) {\n          <button\n            type=\"button\"\n            class=\"btn btn-primary btn-sm\"\n            style=\"white-space: nowrap\"\n            (click)=\"toggleRightsForAllUsers(type)\"\n          >\n            {{ \"SAVECOMPOSITION.form.toggleAll\" | translate }}\n          </button>\n        }\n      </div>\n    </section>\n    <div class=\"hs-save-map-users-list p-1 my-1\" [class.collapsed]=\"collapsed\">\n      @for (user of allUsers() | filter: userFilter; track user) {\n        <div\n          class=\"d-flex flex-row justify-content-between align-items-start p-1\"\n          [class.bg-primary-subtle]=\"\n            user.username === hsCommonLaymanService.user()\n          \"\n        >\n          <span class=\"w-50\">{{ user.hslDisplayName }}</span>\n          @for (type of rightsOptions; track type) {\n            <label style=\"cursor: pointer\"\n              ><input\n                class=\"me-2\"\n                type=\"checkbox\"\n                [name]=\"'rightTo' + type\"\n                [disabled]=\"user.username === hsCommonLaymanService.user()\"\n                [(ngModel)]=\"user[type]\"\n                (change)=\"accessRightsChanged(type, user.username, $event)\"\n              />{{ \"SAVECOMPOSITION.form.\" + type | translate }}</label\n            >\n          }\n        </div>\n      }\n    </div>\n  } @else {\n    <div class=\"w-100 d-flex justify-content-center p-5\">\n      <span class=\"hs-loader hs-loader-dark fs-2\"></span>\n    </div>\n  }\n} @else {\n  <div class=\"hs-save-map-users-list p-1 my-1\" [class.collapsed]=\"collapsed\">\n    @if (allRoles()) {\n      @if (allRoles().length > 0) {\n        @for (role of allRoles(); track role) {\n          <div\n            class=\"d-flex flex-row justify-content-between align-items-start p-1\"\n          >\n            <span class=\"w-50\">{{ role.name }}</span>\n            @for (type of rightsOptions; track type) {\n              <label style=\"cursor: pointer\"\n                ><input\n                  class=\"me-2\"\n                  type=\"checkbox\"\n                  (change)=\"accessRightsChanged(type, role.name, $event)\"\n                  [name]=\"'rightTo' + type\"\n                  [(ngModel)]=\"role[type]\"\n                />{{ \"SAVECOMPOSITION.form.\" + type | translate }}</label\n              >\n            }\n          </div>\n        }\n      } @else {\n        <div class=\"d-flex flex-column align-items-center py-5 px-2\">\n          <i\n            class=\"fa-solid fa-triangle-exclamation text-secondary fs-1 opacity-75\"\n          ></i>\n          <span class=\"text-center fs-2 text-secondary opacity-75\">{{\n            \"SAVECOMPOSITION.form.noRoles\" | translate\n          }}</span>\n        </div>\n      }\n    } @else {\n      <div class=\"w-100 d-flex justify-content-center p-5\">\n        <span class=\"hs-loader hs-loader-dark fs-2\"></span>\n      </div>\n    }\n  </div>\n}\n","import {Component, computed, inject, signal} from '@angular/core';\nimport {AsyncPipe} from '@angular/common';\n\nimport {map} from 'rxjs';\nimport {NgbDropdownModule} from '@ng-bootstrap/ng-bootstrap';\nimport {TranslatePipe} from '@ngx-translate/core';\n\nimport {HsCommonLaymanService} from './layman.service';\nimport {HsDialogContainerService} from 'hslayers-ng/common/dialogs';\nimport {HsConfig} from 'hslayers-ng/config';\nimport {HsToastService} from 'hslayers-ng/common/toast';\n\n@Component({\n  selector: 'hs-layman-current-user',\n  templateUrl: './layman-current-user.component.html',\n  imports: [AsyncPipe, TranslatePipe, NgbDropdownModule],\n  styles: `\n    .user-auth-container {\n      .user-dropdown {\n        .user-avatar {\n          width: 1.75rem;\n          height: 1.75rem;\n          background-color: rgba(255, 255, 255, 0.2);\n          border-radius: 50%;\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          font-size: 0.875rem;\n        }\n\n        .user-dropdown-menu {\n          min-width: 15rem;\n          border-radius: 0.5rem;\n          box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n\n          .user-header {\n            border-radius: 0.5rem 0.5rem 0 0;\n\n            .user-avatar-large {\n              width: 3rem;\n              height: 3rem;\n              background-color: #e9ecef;\n              border-radius: 50%;\n              display: flex;\n              align-items: center;\n              justify-content: center;\n              font-size: 1.25rem;\n            }\n          }\n\n          button.dropdown-item {\n            border-radius: 0.25rem;\n            margin: 0.125rem 0;\n\n            &:hover {\n              background-color: #f8f9fa;\n            }\n\n            &.text-danger:hover {\n              background-color: #fff5f5;\n            }\n          }\n        }\n      }\n    }\n  `,\n})\nexport class HsLaymanCurrentUserComponent {\n  hsCommonLaymanService = inject(HsCommonLaymanService);\n  HsDialogContainerService = inject(HsDialogContainerService);\n  hsConfig = inject(HsConfig);\n  hsToastService = inject(HsToastService);\n\n  dropdownOpen = signal(false);\n\n  sameDomain = computed(() => {\n    const laymanEndpoint = this.hsCommonLaymanService.layman();\n    if (!laymanEndpoint) {\n      return false;\n    }\n    return laymanEndpoint.url.includes(window.location.origin);\n  });\n\n  inAppLogin = this.hsCommonLaymanService.layman$.pipe(\n    map((layman) => layman?.type === 'layman'),\n  );\n\n  /**\n   * Log out the current user\n   */\n  logout(): void {\n    this.hsCommonLaymanService.logout();\n  }\n\n  /**\n   * Open login dialog or redirect to login page\n   */\n  async login(): Promise<void> {\n    this.hsCommonLaymanService.login$.next();\n    const authUrl = this.hsCommonLaymanService.layman()?.url + '/login';\n    if (!this.sameDomain()) {\n      window.open(authUrl, 'AuthWindow');\n      return;\n    }\n\n    // For same-domain logins, open the dialog\n    const {HsLaymanLoginComponent} = await import('./layman-login.component');\n    this.HsDialogContainerService.create(HsLaymanLoginComponent, {\n      url: authUrl,\n    });\n  }\n}\n","@if ((inAppLogin | async) && hsCommonLaymanService.layman()) {\n  <div class=\"user-auth-container ms-3 float-end\">\n    @if (!hsCommonLaymanService.isAuthenticated()) {\n      @if (hsCommonLaymanService.isAuthenticating()) {\n        <button \n          class=\"btn btn-outline-primary d-flex align-items-center\"\n          type=\"button\"\n          disabled>\n          <span class=\"spinner-border spinner-border-sm me-2\" role=\"status\" aria-hidden=\"true\"></span>\n          <span>{{'AUTH.signingIn' | translate }}</span>\n        </button>\n      } @else {\n        <button \n          class=\"btn btn-outline-primary d-flex align-items-center\"\n          (click)=\"login()\"\n          type=\"button\">\n          <i class=\"fa-solid fa-sign-in-alt me-2\"></i>\n          {{'COMPOSITIONS.loginToCatalogue' | translate }}\n        </button>\n      }\n    } @else {\n      <div ngbDropdown placement=\"bottom-end\" class=\"user-dropdown\">\n        <button \n          class=\"btn btn-primary d-flex align-items-center\" \n          ngbDropdownToggle>\n          <div class=\"user-avatar me-2\">\n            <i class=\"fa-solid fa-user\"></i>\n          </div>\n          <span class=\"text-truncate\" style=\"max-width: 8rem;\">{{hsCommonLaymanService.user()}}</span>\n        </button>\n        <div ngbDropdownMenu class=\"user-dropdown-menu p-0\">\n          <div class=\"user-header p-3 bg-light border-bottom\">\n            <div class=\"d-flex align-items-center\">\n              <div class=\"user-avatar-large me-3\">\n                <i class=\"fa-solid fa-user\"></i>\n              </div>\n              <div>\n                <h6 class=\"mb-0\">{{hsCommonLaymanService.user()}}</h6>\n                <small class=\"text-muted\">{{'AUTH.loggedIn' | translate }}</small>\n              </div>\n            </div>\n          </div>\n          <div class=\"p-2\">\n            <button ngbDropdownItem (click)=\"logout()\" class=\"text-danger\">\n              <i class=\"fa-solid fa-sign-out-alt me-2\"></i>\n              {{'AUTH.Logout' | translate }}\n            </button>\n          </div>\n        </div>\n      </div>\n    }\n  </div>\n}\n","import {Component, Input, OnInit, ViewRef, inject} from '@angular/core';\nimport {DomSanitizer, SafeResourceUrl} from '@angular/platform-browser';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {TranslatePipe} from '@ngx-translate/core';\n\nimport {HsCommonLaymanService} from './layman.service';\nimport {\n  HsDialogComponent,\n  HsDialogContainerService,\n} from 'hslayers-ng/common/dialogs';\n\n@Component({\n  selector: 'hs-layman-login',\n  templateUrl: './layman-login.component.html',\n  imports: [TranslatePipe],\n})\nexport class HsLaymanLoginComponent implements HsDialogComponent, OnInit {\n  hsCommonLaymanService = inject(HsCommonLaymanService);\n  hsDialogContainerService = inject(HsDialogContainerService);\n  private sanitizer = inject(DomSanitizer);\n\n  @Input() data: {\n    url: string;\n  };\n  viewRef: ViewRef;\n  url: SafeResourceUrl;\n  constructor() {\n    this.hsCommonLaymanService.layman$\n      .pipe(takeUntilDestroyed())\n      .subscribe(() => {\n        this.close();\n      });\n  }\n\n  ngOnInit(): void {\n    this.url = this.sanitizer.bypassSecurityTrustResourceUrl(this.data.url);\n  }\n  close(): void {\n    this.hsDialogContainerService.destroy(this);\n  }\n}\n","<div class=\"modal in\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n    <div class=\"modal-dialog modal-lg\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h4 class=\"modal-title\">\n                    {{'AUTH.Login' | translate }}\n                </h4>\n                <button type=\"button\" (click)=\"close()\" class=\"btn-close\" data-dismiss=\"modal\"\n                    [attr.aria-label]=\"'COMMON.close' | translate \"></button>\n            </div>\n            <div class=\"modal-body\" style=\"max-height:600px; height: 35em; overflow-y:auto\">\n                <iframe [src]=\"url\" style=\"width:100%; height:100%;border:0\"></iframe>\n            </div>\n        </div>\n    </div>\n</div>","import {inject, Injectable, signal, WritableSignal} from '@angular/core';\nimport {HttpClient} from '@angular/common/http';\nimport {lastValueFrom, of} from 'rxjs';\nimport {catchError} from 'rxjs/operators';\n\nimport {HsCommonLaymanService} from './layman.service';\nimport {HsLaymanGetLayer, HsLaymanLayerDescriptor} from 'hslayers-ng/types';\nimport {\n  getLaymanFriendlyLayerName,\n  isAtLeastVersions,\n  layerParamPendingOrStarting,\n  wfsFailed,\n} from './layman-utils';\nimport {HsLogService} from 'hslayers-ng/services/log';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class HsCommonLaymanLayerService {\n  http = inject(HttpClient);\n  hsCommonLaymanService = inject(HsCommonLaymanService);\n  hsLogService = inject(HsLogService);\n\n  pendingRequests: Map<string, Promise<HsLaymanLayerDescriptor>> = new Map();\n  pendingLayers: WritableSignal<Array<string>> = signal([]);\n  layerDescriptorCache: Map<string, HsLaymanLayerDescriptor> = new Map();\n\n  getLayersCache: Map<string, HsLaymanGetLayer> = new Map();\n\n  /**\n   * Get layer from Layman by UUID\n   * @param uuid - UUID of the layer\n   * @param useCache - Whether to use cached layer description (default: false - always get fresh data)\n   * @returns Promise which returns layer\n   */\n  async getLayerWithUUID(\n    uuid: string,\n    {useCache = false}: {useCache?: boolean} = {},\n  ) {\n    try {\n      if (useCache && this.getLayersCache.has(uuid)) {\n        return this.getLayersCache.get(uuid);\n      }\n\n      const url = `${this.hsCommonLaymanService.layman().url}/rest/layers`;\n      const response = await lastValueFrom(\n        this.http.get<HsLaymanGetLayer[]>(url, {withCredentials: true}).pipe(\n          catchError((error) => {\n            this.hsLogService.error('Error getting layers from Layman:', error);\n            return of([]);\n          }),\n        ),\n      );\n\n      //Cache all returned layers\n      response.forEach((layer) => {\n        this.getLayersCache.set(layer.uuid, layer);\n      });\n      return this.getLayersCache.get(uuid);\n    } catch (error) {\n      this.hsLogService.error('Error in getLayers:', error);\n      return undefined;\n    }\n  }\n\n  /**\n   * Try getting layer's description from Layman. Subsequent request with same parameters\n   * are reused.\n   * @param layerName - Interacted layer's name\n   * @param workspace - Current Layman's workspace\n   * @param ignoreStatus - Whether to ignore layer status\n   * @param useCache - Whether to use cached layer description (default: false - always get fresh data)\n   * @returns Promise which returns layers\n   * description containing name, file, WMS, WFS urls etc.\n   */\n  async describeLayer(\n    layerName: string,\n    workspace: string,\n    options: {\n      ignoreStatus?: boolean;\n      useCache?: boolean;\n    } = {useCache: false},\n  ): Promise<HsLaymanLayerDescriptor> {\n    const requestKey = `${workspace}/${layerName}`;\n    let name = layerName;\n    // Check if there's a cached response and useCache is true\n    if (options.useCache && this.layerDescriptorCache.has(requestKey)) {\n      return this.layerDescriptorCache.get(requestKey);\n    }\n\n    // Check if there's a pending request with the same parameters\n    if (this.pendingRequests.has(requestKey)) {\n      return this.pendingRequests.get(requestKey);\n    }\n    //Try to identify whether name is uuid if thats the case get layer descriptor\n    //to get the proper name\n    if (name.includes('l_') && name.includes('-') && name.length > 36) {\n      const layerDescriptor = await this.getLayerWithUUID(name);\n      if (layerDescriptor) {\n        name = layerDescriptor.name;\n      }\n    }\n\n    const desc = this.makeDescribeLayerRequest(\n      name,\n      workspace,\n      options.ignoreStatus,\n    ).then((response) => {\n      if (\n        !response ||\n        isAtLeastVersions(this.hsCommonLaymanService.layman(), '2.0')\n      ) {\n        return response;\n      }\n      console.log(\n        'Layman version is less than 2.0, returning response',\n        response,\n      );\n      //Fill missing fields\n      response.wfs!.name = response.name;\n      response.wms!.name = response.name;\n      return response;\n    });\n    // Store the promise for the request\n    this.pendingRequests.set(requestKey, desc);\n\n    // Cache the response once resolved\n    desc.then((response) => {\n      if (response) {\n        this.layerDescriptorCache.set(requestKey, response);\n      }\n    });\n\n    return desc;\n  }\n\n  /**\n   * Clear the cache for a specific layer or all layers\n   * @param layerName - Optional layer name to clear specific cache\n   * @param workspace - Optional workspace to clear specific cache\n   */\n  clearLayerDescriptorCache(layerName?: string, workspace?: string): void {\n    if (layerName && workspace) {\n      this.layerDescriptorCache.delete(`${workspace}/${layerName}`);\n    } else {\n      this.layerDescriptorCache.clear();\n    }\n  }\n\n  /**\n   * Try getting layer's description from Layman.\n   */\n  private async makeDescribeLayerRequest(\n    layerName: string,\n    workspace: string,\n    ignoreStatus?: boolean,\n  ): Promise<HsLaymanLayerDescriptor> {\n    const requestKey = `${workspace}/${layerName}`;\n    try {\n      layerName = getLaymanFriendlyLayerName(layerName); //Better safe than sorry\n      const endpoint = this.hsCommonLaymanService.layman();\n      const response: HsLaymanLayerDescriptor = await lastValueFrom(\n        this.http\n          .get(\n            `${\n              endpoint.url\n            }/rest/workspaces/${workspace}/layers/${layerName}?${Math.random()}`,\n            {\n              withCredentials: true,\n            },\n          )\n          .pipe(\n            catchError((e) => {\n              //Layer not found\n              if (e?.error.code == 15) {\n                return of(e?.error);\n              }\n              throw e;\n            }),\n          ),\n      );\n      switch (true) {\n        case response?.code == 15 || wfsFailed(response):\n          this.deletePendingDescribeRequest(requestKey, 0);\n          return null;\n        case response.name && ignoreStatus:\n          this.deletePendingDescribeRequest(requestKey, 1000);\n          return {...response, workspace};\n        case response.wfs &&\n          (layerParamPendingOrStarting(response, 'wfs') ||\n            response.wfs?.url == undefined):\n          if (!this.pendingLayers().includes(layerName)) {\n            this.pendingLayers.update((layers) => [...layers, layerName]);\n          }\n          await new Promise((resolve) => setTimeout(resolve, 310));\n          return this.makeDescribeLayerRequest(layerName, workspace);\n        default:\n          if (response.name) {\n            this.deletePendingDescribeRequest(requestKey, 1000);\n            this.managePendingLayers(layerName);\n            return {...response, workspace};\n          }\n      }\n    } catch (ex) {\n      this.managePendingLayers(layerName);\n      this.hsLogService.error(ex);\n      throw ex;\n    }\n  }\n\n  private deletePendingDescribeRequest(key: string, timeout: number = 0) {\n    setTimeout(() => {\n      this.pendingRequests.delete(key);\n    }, timeout);\n  }\n\n  /**\n   * Keep track of pending layers that are still being loaded\n   * @param layerName - Interacted layer's name\n   */\n  private managePendingLayers(layerName: string): void {\n    if (this.pendingLayers().includes(layerName)) {\n      this.pendingLayers.update((layers) =>\n        layers.filter((layer) => layer != layerName),\n      );\n    }\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["VectorSource","i1","catchError"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;AAKG;AACG,SAAU,gBAAgB,CAAC,WAAmB,EAAA;IAClD,MAAM,KAAK,GAAG,2DAA2D;AAEzE,IAAA,OAAO,WAAW,CAAC,UAAU,CAAC,OAAO;AACnC,UAAE,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAI;AAC/C,YAAA,OAAO,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,CAAA,CAAA,CAAG,EAAE,CAAA,GAAA,EAAM,EAAE,CAAA,OAAA,EAAU,EAAE,CAAA,CAAA,CAAG,CAAC;AACnE,QAAA,CAAC;UACD,WAAW;AACjB;;ACdA;AACA;;;AAGG;AACI,MAAM,mBAAmB,GAAG;;IAEjC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,IAAI,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG;IAC5G,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG;IAC3G,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,IAAI,EAAC,GAAG,EAAE,IAAI,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG;IAC7G,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,IAAI,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG;IAC5G,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG;AAC3G,IAAA,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,IAAI,EAAC,GAAG,EAAE,GAAG;;IAGpC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG;IAC3G,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG;IAC3G,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG;IAC3G,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG;IAC3G,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,IAAI,EAAC,GAAG,EAAE,IAAI,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG;IAC7G,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG;;IAG9D,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG;IAC3G,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,IAAI,EAAC,GAAG,EAAE,IAAI,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG;IAC7G,GAAG,EAAE,GAAG,EAAC,GAAG,EAAE,GAAG,EAAC,GAAG,EAA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"}