{"version":3,"file":"spinque-angular-ui-state.mjs","sources":["../../../projects/spinque-angular-ui/state/src/query-encoder.ts","../../../projects/spinque-angular-ui/state/src/observable-faceted-search.ts","../../../projects/spinque-angular-ui/state/src/signal-faceted-search.ts","../../../projects/spinque-angular-ui/state/src/sync-with-router.ts","../../../projects/spinque-angular-ui/state/spinque-angular-ui-state.ts"],"sourcesContent":["import { parseQueries as parseQueriesSQA, stringifyQueries as stringifyQueriesSQA } from '@spinque/query-api';\n\n/**\n * This file used to contain helper functions to encode and decode sets of Query objects.\n * Used when Query's must be stored in the URL of a page.\n * \n * They've now moves to @spinque/query-api but these exports remain to keep existing apps\n * from breaking.\n */\n\n/**\n * Expects a string generated by stringifyQueries and returns an array of Query's\n * \n * @deprecated please use parseQueries from @spinque/query-api\n */\nexport const parseQueries = parseQueriesSQA;\n\n/**\n * Expects an array of Query's and turns them into a string\n * \n * @deprecated please use stringifyQueries from @spinque/query-api\n */\nexport const stringifyQueries = stringifyQueriesSQA;\n","import { FacetedSearch, FacetType, Query, stringToTupleList } from '@spinque/query-api';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { distinctUntilChanged, map } from 'rxjs/operators';\nimport { stringifyQueries } from './query-encoder';\n\n/**\n * Extends the FacetedSearch class from @spinque/query-api.\n * Exposes an observable 'state' property that will emit whenever the state changes.\n */\nexport class ObservableFacetedSearch extends FacetedSearch {\n\n  /**\n   * Observable that emits whenever the state of the FacetedSearch changes\n   */\n  state: Observable<{\n    /**\n     * Query stack to fetch search results (main search endpoint + applied facets)\n     */\n    results: Query[];\n    /**\n     * Query stack to get facet options for each facet.\n     */\n    facets: { [facetOptionsEndpoint: string]: Query[] };\n    /**\n     * Selected options for each facet. Note that FacetType.single facets will also have\n     * their values wrapped in an array.\n     */\n    facetsSelection: { [facetOptionsEndpoint: string]: string[] };\n  }>;\n\n  // Internal BehaviorSubject to trigger an update on `state`\n  private _change$ = new BehaviorSubject<boolean>(true);\n\n  constructor(\n    private options: {\n      /**\n       * The main search query\n       */\n      searchQuery: Query;\n      /**\n       * Query to use when the search query parameter is empty\n       */\n      emptyParameterQuery?: Query;\n      /**\n       * List of facets to add\n       */\n      facets?: {\n        /**\n         * Endpoint of the facet\n         */\n        endpoint: string;\n        /**\n         * The selection type (single, multiple) of the facet\n         */\n        type?: FacetType;\n        /**\n         * Whether the facet should reset when the search query changes.\n         */\n        resetOnQueryChange?: boolean;\n        /**\n         * The postfix to add to `endpoint` to get the filter endpoint.\n         * Defaults to `:FILTER`, as is common practice.\n         */\n        filterEndpointPostfix?: string;\n        /**\n         * Parameter to use for filtering. Defaults to `value`.\n         */\n        filterEndpointParameterName?: string;\n      }[];\n      /**\n       * Modifier queries can change the results but do not have options.\n       * An example is a query to sort results of a previous query.\n       */\n      modifiers?: Query[];\n    },\n  ) {\n    super(options.searchQuery, options.emptyParameterQuery, options.modifiers);\n\n    if (options.facets) {\n      options.facets.forEach((f) =>\n        this.addFacet(f.endpoint, f.type, f.resetOnQueryChange, f.filterEndpointPostfix, f.filterEndpointParameterName),\n      );\n    }\n\n    this.state = this._change$.pipe(\n      map(() => {\n        return {\n          results: this.getResultsQuery(),\n          facets: this.facets.reduce(\n            (acc, cur) => ({\n              ...acc,\n              [cur.optionsEndpoint]: this.getFacetQuery(cur.optionsEndpoint),\n            }),\n            {},\n          ),\n          facetsSelection: this.facets.reduce((acc, cur) => {\n            if (cur.type === FacetType.multiple) {\n              const selection = stringToTupleList(cur.filterParameterValue || '');\n              if (!selection) {\n                return { ...acc, [cur.optionsEndpoint]: [] as (string | number)[] };\n              } else {\n                return { ...acc, [cur.optionsEndpoint]: selection.tuples.map((ts) => `${ts[0]}`) };\n              }\n            } else {\n              // Wrap FacetType.single values in an array too, this keeps the type\n              // of `facetsSelection` homogenous.\n              return {\n                ...acc,\n                [cur.optionsEndpoint]:\n                  cur.filterParameterValue === '' ||\n                  cur.filterParameterValue === null ||\n                  cur.filterParameterValue === undefined\n                    ? []\n                    : [cur.filterParameterValue],\n              };\n            }\n          }, {}),\n        };\n      }),\n      // Only emit when the current value actually differs from the previous value\n      distinctUntilChanged((prev, cur) => JSON.stringify(prev) === JSON.stringify(cur)),\n    );\n  }\n\n  /**\n   * Add a facet to the ObservableFacetedSearch object.\n   */\n  override addFacet(\n    endpoint: string,\n    type?: FacetType,\n    resetOnQueryChange?: boolean,\n    filterEndpointPostfix?: string,\n    filterEndpointParameterName?: string,\n  ): void {\n    super.addFacet(endpoint, type, resetOnQueryChange, filterEndpointPostfix, filterEndpointParameterName);\n    this._change$.next(true);\n  }\n\n  override setModifier(modifier: Query | undefined): void {\n    super.setModifier(modifier);\n    this._change$.next(true);\n  }\n\n  /**\n   * Set a parameter value for the searchQuery\n   */\n  override setParameter(name: string, value: string): void {\n    super.setParameter(name, value);\n    this._change$.next(true);\n  }\n\n  override setSearchQuery(query: Query): void {\n    super.setSearchQuery(query);\n    this._change$.next(true);\n  }\n\n  /**\n   * Clear all searchQuery parameters\n   */\n  override clearParameters(): void {\n    super.clearParameters();\n    this._change$.next(true);\n  }\n\n  /**\n   * Set the selected options for a given facet.\n   */\n  override setFacetSelection(facetEndpoint: string, selection: string | string[]): void {\n    super.setFacetSelection(facetEndpoint, selection);\n    this._change$.next(true);\n  }\n\n  /**\n   * Clear the selection for a given facet.\n   */\n  override clearFacetSelection(facetEndpoint?: string): void {\n    super.clearFacetSelection(facetEndpoint);\n    this._change$.next(true);\n  }\n\n  /**\n   * Set the entire state at once. To be used when getting state from a store, such as the URL query parameters.\n   */\n  setState(results: Query[], allowChangingSearchQuery = true): void {\n    if (!results || results.length === 0) {\n      Object.entries(this.options.searchQuery.parameters || {}).forEach(([k, v]) => this.setParameter(k, v));\n      this.facets.forEach((f) => this.clearFacetSelection(f.optionsEndpoint));\n      return;\n    }\n\n    if (stringifyQueries(results) === stringifyQueries(this.getResultsQuery())) {\n      return;\n    }\n\n    const searchQuery = results.shift() as Query;\n    if (\n      searchQuery.endpoint !== this.options.searchQuery.endpoint &&\n      (!this.options.emptyParameterQuery || searchQuery.endpoint !== this.options.emptyParameterQuery.endpoint)\n    ) {\n      if (allowChangingSearchQuery) {\n        this.options.searchQuery = searchQuery;\n        this.setSearchQuery(searchQuery);\n      } else {\n        throw new Error('State does not match expected endpoint');\n      }\n    }\n\n    // Extract and set parameters for first Query\n    Object.entries(searchQuery.parameters || {}).forEach(([name, value]) => {\n      this.setParameter(name, value);\n    });\n\n    if (\n      results.length > 0 &&\n      this.options &&\n      this.options.modifiers &&\n      this.options.modifiers.find((o) => o.endpoint === results[results.length - 1].endpoint)\n    ) {\n      this.setModifier(results.pop());\n    }\n\n    const facetsTouched: string[] = [];\n\n    results.forEach((q) => {\n      const facet = this.facets.find((f) => f.filterEndpoint === q.endpoint);\n      if (facet) {\n        if (facet.type === 'multiple') {\n          const tupleList = stringToTupleList((q.parameters || {})[facet.filterParameterName]);\n          if (!tupleList || !tupleList.tuples) {\n            throw new Error(`Value for ${q.endpoint} are ill-formatted`);\n          }\n          const selection = tupleList.tuples.map((row) => `${row[0]}`);\n          this.setFacetSelection(facet.optionsEndpoint, selection);\n        } else {\n          const value = (q.parameters || {})[facet.filterParameterName];\n          this.setFacetSelection(facet.optionsEndpoint, value);\n        }\n        facetsTouched.push(facet.optionsEndpoint);\n      }\n    });\n\n    this.facets.forEach((facet) => {\n      if (!facetsTouched.includes(facet.optionsEndpoint)) {\n        this.setFacetSelection(facet.optionsEndpoint, []);\n      }\n    });\n  }\n}\n","import { FacetedSearch, FacetType, Query, stringToTupleList } from '@spinque/query-api';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { distinctUntilChanged, map } from 'rxjs/operators';\nimport { stringifyQueries } from './query-encoder';\nimport { computed, signal, Signal } from '@angular/core';\n\n/**\n * Extends the FacetedSearch class from @spinque/query-api.\n * Exposes a signal 'state' property that holds the latest state.\n */\nexport class SignalFacetedSearch extends FacetedSearch {\n\n  /**\n   * Signal holding the state of the FacetedSearch\n   */\n  state = signal<{\n    /**\n     * Query stack to fetch search results (main search endpoint + applied facets)\n     */\n    results: Query[];\n    /**\n     * Query stack to get facet options for each facet.\n     */\n    facets: { [facetOptionsEndpoint: string]: Query[] };\n    /**\n     * Selected options for each facet. Note that FacetType.single facets will also have\n     * their values wrapped in an array.\n     */\n    facetsSelection: { [facetOptionsEndpoint: string]: string[] };\n  }>({ results: [], facets: {}, facetsSelection: {} });\n\n  constructor(\n    private options: {\n      /**\n       * The main search query\n       */\n      searchQuery: Query;\n      /**\n       * Query to use when the search query parameter is empty\n       */\n      emptyParameterQuery?: Query;\n      /**\n       * List of facets to add\n       */\n      facets?: {\n        /**\n         * Endpoint of the facet\n         */\n        endpoint: string;\n        /**\n         * The selection type (single, multiple) of the facet\n         */\n        type?: FacetType;\n        /**\n         * Whether the facet should reset when the search query changes.\n         */\n        resetOnQueryChange?: boolean;\n        /**\n         * The postfix to add to `endpoint` to get the filter endpoint.\n         * Defaults to `:FILTER`, as is common practice.\n         */\n        filterEndpointPostfix?: string;\n        /**\n         * Parameter to use for filtering. Defaults to `value`.\n         */\n        filterEndpointParameterName?: string;\n      }[];\n      /**\n       * Modifier queries can change the results but do not have options.\n       * An example is a query to sort results of a previous query.\n       */\n      modifiers?: Query[];\n    },\n  ) {\n    super(options.searchQuery, options.emptyParameterQuery, options.modifiers);\n\n    if (options.facets) {\n      options.facets.forEach((f) =>\n        this.addFacet(f.endpoint, f.type, f.resetOnQueryChange, f.filterEndpointPostfix, f.filterEndpointParameterName),\n      );\n    }\n  }\n\n  setNewState() {\n    const state = {\n      results: this.getResultsQuery(),\n      facets: this.facets.reduce(\n        (acc, cur) => ({\n          ...acc,\n          [cur.optionsEndpoint]: this.getFacetQuery(cur.optionsEndpoint),\n        }),\n        {},\n      ),\n      facetsSelection: this.facets.reduce((acc, cur) => {\n        if (cur.type === FacetType.multiple) {\n          const selection = stringToTupleList(cur.filterParameterValue || '');\n          if (!selection) {\n            return { ...acc, [cur.optionsEndpoint]: [] as (string | number)[] };\n          } else {\n            return { ...acc, [cur.optionsEndpoint]: selection.tuples.map((ts) => `${ts[0]}`) };\n          }\n        } else {\n          // Wrap FacetType.single values in an array too, this keeps the type\n          // of `facetsSelection` homogenous.\n          return {\n            ...acc,\n            [cur.optionsEndpoint]:\n              cur.filterParameterValue === '' ||\n              cur.filterParameterValue === null ||\n              cur.filterParameterValue === undefined\n                ? []\n                : [cur.filterParameterValue],\n          };\n        }\n      }, {}),\n    };\n    this.state.set(state);\n  }\n\n  /**\n   * Add a facet to the ObservableFacetedSearch object.\n   */\n  override addFacet(\n    endpoint: string,\n    type?: FacetType,\n    resetOnQueryChange?: boolean,\n    filterEndpointPostfix?: string,\n    filterEndpointParameterName?: string,\n  ): void {\n    super.addFacet(endpoint, type, resetOnQueryChange, filterEndpointPostfix, filterEndpointParameterName);\n    this.setNewState();\n  }\n\n  override setModifier(modifier: Query | undefined): void {\n    super.setModifier(modifier);\n    this.setNewState();\n  }\n\n  /**\n   * Set a parameter value for the searchQuery\n   */\n  override setParameter(name: string, value: string): void {\n    super.setParameter(name, value);\n    this.setNewState();\n  }\n\n  override setSearchQuery(query: Query): void {\n    super.setSearchQuery(query);\n    this.setNewState();\n  }\n\n  /**\n   * Clear all searchQuery parameters\n   */\n  override clearParameters(): void {\n    super.clearParameters();\n    this.setNewState();\n  }\n\n  /**\n   * Set the selected options for a given facet.\n   */\n  override setFacetSelection(facetEndpoint: string, selection: string | string[] | undefined): void {\n    if (selection === undefined) {\n      super.clearFacetSelection(facetEndpoint);\n    } else {\n      super.setFacetSelection(facetEndpoint, selection);\n    }\n    this.setNewState();\n  }\n\n  /**\n   * Clear the selection for a given facet.\n   */\n  override clearFacetSelection(facetEndpoint?: string): void {\n    super.clearFacetSelection(facetEndpoint);\n    this.setNewState();\n  }\n\n  /**\n   * Set the entire state at once. To be used when getting state from a store, such as the URL query parameters.\n   */\n  setState(results: Query[], allowChangingSearchQuery = true): void {\n    if (!results || results.length === 0) {\n      Object.entries(this.options.searchQuery.parameters || {}).forEach(([k, v]) => this.setParameter(k, v));\n      this.facets.forEach((f) => this.clearFacetSelection(f.optionsEndpoint));\n      return;\n    }\n\n    if (stringifyQueries(results) === stringifyQueries(this.getResultsQuery())) {\n      return;\n    }\n\n    const searchQuery = results.shift() as Query;\n    if (\n      searchQuery.endpoint !== this.options.searchQuery.endpoint &&\n      (!this.options.emptyParameterQuery || searchQuery.endpoint !== this.options.emptyParameterQuery.endpoint)\n    ) {\n      if (allowChangingSearchQuery) {\n        this.options.searchQuery = searchQuery;\n        this.setSearchQuery(searchQuery);\n      } else {\n        throw new Error('State does not match expected endpoint');\n      }\n    }\n\n    // Extract and set parameters for first Query\n    Object.entries(searchQuery.parameters || {}).forEach(([name, value]) => {\n      this.setParameter(name, value);\n    });\n\n    if (\n      results.length > 0 &&\n      this.options &&\n      this.options.modifiers &&\n      this.options.modifiers.find((o) => o.endpoint === results[results.length - 1].endpoint)\n    ) {\n      this.setModifier(results.pop());\n    }\n\n    const facetsTouched: string[] = [];\n\n    results.forEach((q) => {\n      const facet = this.facets.find((f) => f.filterEndpoint === q.endpoint);\n      if (facet) {\n        if (facet.type === 'multiple') {\n          const tupleList = stringToTupleList((q.parameters || {})[facet.filterParameterName]);\n          if (!tupleList || !tupleList.tuples) {\n            throw new Error(`Value for ${q.endpoint} are ill-formatted`);\n          }\n          const selection = tupleList.tuples.map((row) => `${row[0]}`);\n          this.setFacetSelection(facet.optionsEndpoint, selection);\n        } else {\n          const value = (q.parameters || {})[facet.filterParameterName];\n          this.setFacetSelection(facet.optionsEndpoint, value);\n        }\n        facetsTouched.push(facet.optionsEndpoint);\n      }\n    });\n\n    this.facets.forEach((facet) => {\n      if (!facetsTouched.includes(facet.optionsEndpoint)) {\n        this.setFacetSelection(facet.optionsEndpoint, []);\n      }\n    });\n  }\n}\n","import { effect } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { FacetedSearch, parseQueries, stringifyQueries } from \"@spinque/query-api\";\nimport { ObservableFacetedSearch } from \"./observable-faceted-search\";\nimport { SignalFacetedSearch } from \"./signal-faceted-search\";\n\nexport const syncWithRouter = (fs: ObservableFacetedSearch | SignalFacetedSearch, router: Router, route: ActivatedRoute): void => {\n  route.queryParams.subscribe(params => {\n    const results = parseQueries(params['state']);\n    fs.setState(results);\n  });\n\n  if (fs instanceof ObservableFacetedSearch) {\n    throw new Error('Not implemented');\n  } else {\n    effect(() => {\n      router.navigate([], { queryParams: { state: stringifyQueries(fs.state().results) } });\n    });\n  }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["parseQueriesSQA","stringifyQueriesSQA","parseQueries","stringifyQueries"],"mappings":"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"}