-
Notifications
You must be signed in to change notification settings - Fork 1
/
common.93f93ce483d60d18.js.map
1 lines (1 loc) · 24.1 KB
/
common.93f93ce483d60d18.js.map
1
{"version":3,"file":"common.93f93ce483d60d18.js","mappings":"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","names":["i0","CirclesComponent","_CirclesComponent","constructor","this","circleGroups","Array","fill","selectors","decls","vars","consts","template","rf","ctx","CirclesComponent__svg_g_1_Template","CirclesModule","_CirclesModule","customElementComponent","CommonModule","SelectionModel","selected","_selected","from","_selection","values","_multiple","initiallySelectedValues","_emitChanges","compareWith","Set","_deselectedToEmit","_selectedToEmit","changed","Subject","length","forEach","value","_markSelected","select","_verifyValueAssignment","_hasQueuedChanges","_emitChangeEvent","deselect","_unmarkSelected","setSelection","oldValues","newSelectedSet","filter","has","_getConcreteValue","toggle","isSelected","clear","flushEvent","_unmarkAll","isEmpty","size","hasValue","sort","predicate","isMultipleSelection","next","source","added","removed","add","push","delete","inputValue","selection","selectedValue","UniqueSelectionDispatcher","_UniqueSelectionDispatcher","_listeners","notify","id","name","listener","listen","registered","ngOnDestroy","ɵfac","t","ɵprov","token","factory","providedIn"],"sourceRoot":"webpack:///","sources":["./src/app/custom-elements/ngrx/circles.component.ts","./src/app/custom-elements/ngrx/circles.module.ts","./node_modules/@angular/cdk/fesm2022/collections.mjs"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'ngrx-circles',\n template: `\n <svg width=\"200px\" height=\"200px\" viewBox=\"0 0 200 200\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <g *ngFor=\"let circleGroup of circleGroups\">\n <circle cx=\"8\" cy=\"8\" r=\"6\"></circle>\n <circle cx=\"8\" cy=\"182\" r=\"6\"></circle>\n </g>\n </svg>\n `,\n})\nexport class CirclesComponent {\n circleGroups = new Array(9).fill(0);\n}\n","import { NgModule, Type } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WithCustomElementComponent } from '../element-registry';\nimport { CirclesComponent } from './circles.component';\n\n@NgModule({\n imports: [CommonModule],\n declarations: [CirclesComponent],\n exports: [CirclesComponent],\n})\nexport class CirclesModule implements WithCustomElementComponent {\n customElementComponent: Type<any> = CirclesComponent;\n}\n","import { ConnectableObservable, isObservable, of, Subject } from 'rxjs';\nimport * as i0 from '@angular/core';\nimport { InjectionToken, Injectable } from '@angular/core';\n\nclass DataSource {\n}\n/** Checks whether an object is a data source. */\nfunction isDataSource(value) {\n // Check if the value is a DataSource by observing if it has a connect function. Cannot\n // be checked as an `instanceof DataSource` since people could create their own sources\n // that match the interface, but don't extend DataSource. We also can't use `isObservable`\n // here, because of some internal apps.\n return value && typeof value.connect === 'function' && !(value instanceof ConnectableObservable);\n}\n\n/** DataSource wrapper for a native array. */\nclass ArrayDataSource extends DataSource {\n constructor(_data) {\n super();\n this._data = _data;\n }\n connect() {\n return isObservable(this._data) ? this._data : of(this._data);\n }\n disconnect() { }\n}\n\n/** Indicates how a view was changed by a {@link _ViewRepeater}. */\nvar _ViewRepeaterOperation;\n(function (_ViewRepeaterOperation) {\n /** The content of an existing view was replaced with another item. */\n _ViewRepeaterOperation[_ViewRepeaterOperation[\"REPLACED\"] = 0] = \"REPLACED\";\n /** A new view was created with `createEmbeddedView`. */\n _ViewRepeaterOperation[_ViewRepeaterOperation[\"INSERTED\"] = 1] = \"INSERTED\";\n /** The position of a view changed, but the content remains the same. */\n _ViewRepeaterOperation[_ViewRepeaterOperation[\"MOVED\"] = 2] = \"MOVED\";\n /** A view was detached from the view container. */\n _ViewRepeaterOperation[_ViewRepeaterOperation[\"REMOVED\"] = 3] = \"REMOVED\";\n})(_ViewRepeaterOperation || (_ViewRepeaterOperation = {}));\n/**\n * Injection token for {@link _ViewRepeater}. This token is for use by Angular Material only.\n * @docs-private\n */\nconst _VIEW_REPEATER_STRATEGY = new InjectionToken('_ViewRepeater');\n\n/**\n * A repeater that destroys views when they are removed from a\n * {@link ViewContainerRef}. When new items are inserted into the container,\n * the repeater will always construct a new embedded view for each item.\n *\n * @template T The type for the embedded view's $implicit property.\n * @template R The type for the item in each IterableDiffer change record.\n * @template C The type for the context passed to each embedded view.\n */\nclass _DisposeViewRepeaterStrategy {\n applyChanges(changes, viewContainerRef, itemContextFactory, itemValueResolver, itemViewChanged) {\n changes.forEachOperation((record, adjustedPreviousIndex, currentIndex) => {\n let view;\n let operation;\n if (record.previousIndex == null) {\n const insertContext = itemContextFactory(record, adjustedPreviousIndex, currentIndex);\n view = viewContainerRef.createEmbeddedView(insertContext.templateRef, insertContext.context, insertContext.index);\n operation = _ViewRepeaterOperation.INSERTED;\n }\n else if (currentIndex == null) {\n viewContainerRef.remove(adjustedPreviousIndex);\n operation = _ViewRepeaterOperation.REMOVED;\n }\n else {\n view = viewContainerRef.get(adjustedPreviousIndex);\n viewContainerRef.move(view, currentIndex);\n operation = _ViewRepeaterOperation.MOVED;\n }\n if (itemViewChanged) {\n itemViewChanged({\n context: view?.context,\n operation,\n record,\n });\n }\n });\n }\n detach() { }\n}\n\n/**\n * A repeater that caches views when they are removed from a\n * {@link ViewContainerRef}. When new items are inserted into the container,\n * the repeater will reuse one of the cached views instead of creating a new\n * embedded view. Recycling cached views reduces the quantity of expensive DOM\n * inserts.\n *\n * @template T The type for the embedded view's $implicit property.\n * @template R The type for the item in each IterableDiffer change record.\n * @template C The type for the context passed to each embedded view.\n */\nclass _RecycleViewRepeaterStrategy {\n constructor() {\n /**\n * The size of the cache used to store unused views.\n * Setting the cache size to `0` will disable caching. Defaults to 20 views.\n */\n this.viewCacheSize = 20;\n /**\n * View cache that stores embedded view instances that have been previously stamped out,\n * but don't are not currently rendered. The view repeater will reuse these views rather than\n * creating brand new ones.\n *\n * TODO(michaeljamesparsons) Investigate whether using a linked list would improve performance.\n */\n this._viewCache = [];\n }\n /** Apply changes to the DOM. */\n applyChanges(changes, viewContainerRef, itemContextFactory, itemValueResolver, itemViewChanged) {\n // Rearrange the views to put them in the right location.\n changes.forEachOperation((record, adjustedPreviousIndex, currentIndex) => {\n let view;\n let operation;\n if (record.previousIndex == null) {\n // Item added.\n const viewArgsFactory = () => itemContextFactory(record, adjustedPreviousIndex, currentIndex);\n view = this._insertView(viewArgsFactory, currentIndex, viewContainerRef, itemValueResolver(record));\n operation = view ? _ViewRepeaterOperation.INSERTED : _ViewRepeaterOperation.REPLACED;\n }\n else if (currentIndex == null) {\n // Item removed.\n this._detachAndCacheView(adjustedPreviousIndex, viewContainerRef);\n operation = _ViewRepeaterOperation.REMOVED;\n }\n else {\n // Item moved.\n view = this._moveView(adjustedPreviousIndex, currentIndex, viewContainerRef, itemValueResolver(record));\n operation = _ViewRepeaterOperation.MOVED;\n }\n if (itemViewChanged) {\n itemViewChanged({\n context: view?.context,\n operation,\n record,\n });\n }\n });\n }\n detach() {\n for (const view of this._viewCache) {\n view.destroy();\n }\n this._viewCache = [];\n }\n /**\n * Inserts a view for a new item, either from the cache or by creating a new\n * one. Returns `undefined` if the item was inserted into a cached view.\n */\n _insertView(viewArgsFactory, currentIndex, viewContainerRef, value) {\n const cachedView = this._insertViewFromCache(currentIndex, viewContainerRef);\n if (cachedView) {\n cachedView.context.$implicit = value;\n return undefined;\n }\n const viewArgs = viewArgsFactory();\n return viewContainerRef.createEmbeddedView(viewArgs.templateRef, viewArgs.context, viewArgs.index);\n }\n /** Detaches the view at the given index and inserts into the view cache. */\n _detachAndCacheView(index, viewContainerRef) {\n const detachedView = viewContainerRef.detach(index);\n this._maybeCacheView(detachedView, viewContainerRef);\n }\n /** Moves view at the previous index to the current index. */\n _moveView(adjustedPreviousIndex, currentIndex, viewContainerRef, value) {\n const view = viewContainerRef.get(adjustedPreviousIndex);\n viewContainerRef.move(view, currentIndex);\n view.context.$implicit = value;\n return view;\n }\n /**\n * Cache the given detached view. If the cache is full, the view will be\n * destroyed.\n */\n _maybeCacheView(view, viewContainerRef) {\n if (this._viewCache.length < this.viewCacheSize) {\n this._viewCache.push(view);\n }\n else {\n const index = viewContainerRef.indexOf(view);\n // The host component could remove views from the container outside of\n // the view repeater. It's unlikely this will occur, but just in case,\n // destroy the view on its own, otherwise destroy it through the\n // container to ensure that all the references are removed.\n if (index === -1) {\n view.destroy();\n }\n else {\n viewContainerRef.remove(index);\n }\n }\n }\n /** Inserts a recycled view from the cache at the given index. */\n _insertViewFromCache(index, viewContainerRef) {\n const cachedView = this._viewCache.pop();\n if (cachedView) {\n viewContainerRef.insert(cachedView, index);\n }\n return cachedView || null;\n }\n}\n\n/**\n * Class to be used to power selecting one or more options from a list.\n */\nclass SelectionModel {\n /** Selected values. */\n get selected() {\n if (!this._selected) {\n this._selected = Array.from(this._selection.values());\n }\n return this._selected;\n }\n constructor(_multiple = false, initiallySelectedValues, _emitChanges = true, compareWith) {\n this._multiple = _multiple;\n this._emitChanges = _emitChanges;\n this.compareWith = compareWith;\n /** Currently-selected values. */\n this._selection = new Set();\n /** Keeps track of the deselected options that haven't been emitted by the change event. */\n this._deselectedToEmit = [];\n /** Keeps track of the selected options that haven't been emitted by the change event. */\n this._selectedToEmit = [];\n /** Event emitted when the value has changed. */\n this.changed = new Subject();\n if (initiallySelectedValues && initiallySelectedValues.length) {\n if (_multiple) {\n initiallySelectedValues.forEach(value => this._markSelected(value));\n }\n else {\n this._markSelected(initiallySelectedValues[0]);\n }\n // Clear the array in order to avoid firing the change event for preselected values.\n this._selectedToEmit.length = 0;\n }\n }\n /**\n * Selects a value or an array of values.\n * @param values The values to select\n * @return Whether the selection changed as a result of this call\n * @breaking-change 16.0.0 make return type boolean\n */\n select(...values) {\n this._verifyValueAssignment(values);\n values.forEach(value => this._markSelected(value));\n const changed = this._hasQueuedChanges();\n this._emitChangeEvent();\n return changed;\n }\n /**\n * Deselects a value or an array of values.\n * @param values The values to deselect\n * @return Whether the selection changed as a result of this call\n * @breaking-change 16.0.0 make return type boolean\n */\n deselect(...values) {\n this._verifyValueAssignment(values);\n values.forEach(value => this._unmarkSelected(value));\n const changed = this._hasQueuedChanges();\n this._emitChangeEvent();\n return changed;\n }\n /**\n * Sets the selected values\n * @param values The new selected values\n * @return Whether the selection changed as a result of this call\n * @breaking-change 16.0.0 make return type boolean\n */\n setSelection(...values) {\n this._verifyValueAssignment(values);\n const oldValues = this.selected;\n const newSelectedSet = new Set(values);\n values.forEach(value => this._markSelected(value));\n oldValues\n .filter(value => !newSelectedSet.has(this._getConcreteValue(value, newSelectedSet)))\n .forEach(value => this._unmarkSelected(value));\n const changed = this._hasQueuedChanges();\n this._emitChangeEvent();\n return changed;\n }\n /**\n * Toggles a value between selected and deselected.\n * @param value The value to toggle\n * @return Whether the selection changed as a result of this call\n * @breaking-change 16.0.0 make return type boolean\n */\n toggle(value) {\n return this.isSelected(value) ? this.deselect(value) : this.select(value);\n }\n /**\n * Clears all of the selected values.\n * @param flushEvent Whether to flush the changes in an event.\n * If false, the changes to the selection will be flushed along with the next event.\n * @return Whether the selection changed as a result of this call\n * @breaking-change 16.0.0 make return type boolean\n */\n clear(flushEvent = true) {\n this._unmarkAll();\n const changed = this._hasQueuedChanges();\n if (flushEvent) {\n this._emitChangeEvent();\n }\n return changed;\n }\n /**\n * Determines whether a value is selected.\n */\n isSelected(value) {\n return this._selection.has(this._getConcreteValue(value));\n }\n /**\n * Determines whether the model does not have a value.\n */\n isEmpty() {\n return this._selection.size === 0;\n }\n /**\n * Determines whether the model has a value.\n */\n hasValue() {\n return !this.isEmpty();\n }\n /**\n * Sorts the selected values based on a predicate function.\n */\n sort(predicate) {\n if (this._multiple && this.selected) {\n this._selected.sort(predicate);\n }\n }\n /**\n * Gets whether multiple values can be selected.\n */\n isMultipleSelection() {\n return this._multiple;\n }\n /** Emits a change event and clears the records of selected and deselected values. */\n _emitChangeEvent() {\n // Clear the selected values so they can be re-cached.\n this._selected = null;\n if (this._selectedToEmit.length || this._deselectedToEmit.length) {\n this.changed.next({\n source: this,\n added: this._selectedToEmit,\n removed: this._deselectedToEmit,\n });\n this._deselectedToEmit = [];\n this._selectedToEmit = [];\n }\n }\n /** Selects a value. */\n _markSelected(value) {\n value = this._getConcreteValue(value);\n if (!this.isSelected(value)) {\n if (!this._multiple) {\n this._unmarkAll();\n }\n if (!this.isSelected(value)) {\n this._selection.add(value);\n }\n if (this._emitChanges) {\n this._selectedToEmit.push(value);\n }\n }\n }\n /** Deselects a value. */\n _unmarkSelected(value) {\n value = this._getConcreteValue(value);\n if (this.isSelected(value)) {\n this._selection.delete(value);\n if (this._emitChanges) {\n this._deselectedToEmit.push(value);\n }\n }\n }\n /** Clears out the selected values. */\n _unmarkAll() {\n if (!this.isEmpty()) {\n this._selection.forEach(value => this._unmarkSelected(value));\n }\n }\n /**\n * Verifies the value assignment and throws an error if the specified value array is\n * including multiple values while the selection model is not supporting multiple values.\n */\n _verifyValueAssignment(values) {\n if (values.length > 1 && !this._multiple && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw getMultipleValuesInSingleSelectionError();\n }\n }\n /** Whether there are queued up change to be emitted. */\n _hasQueuedChanges() {\n return !!(this._deselectedToEmit.length || this._selectedToEmit.length);\n }\n /** Returns a value that is comparable to inputValue by applying compareWith function, returns the same inputValue otherwise. */\n _getConcreteValue(inputValue, selection) {\n if (!this.compareWith) {\n return inputValue;\n }\n else {\n selection = selection ?? this._selection;\n for (let selectedValue of selection) {\n if (this.compareWith(inputValue, selectedValue)) {\n return selectedValue;\n }\n }\n return inputValue;\n }\n }\n}\n/**\n * Returns an error that reports that multiple values are passed into a selection model\n * with a single value.\n * @docs-private\n */\nfunction getMultipleValuesInSingleSelectionError() {\n return Error('Cannot pass multiple values into SelectionModel with single-value mode.');\n}\n\n/**\n * Class to coordinate unique selection based on name.\n * Intended to be consumed as an Angular service.\n * This service is needed because native radio change events are only fired on the item currently\n * being selected, and we still need to uncheck the previous selection.\n *\n * This service does not *store* any IDs and names because they may change at any time, so it is\n * less error-prone if they are simply passed through when the events occur.\n */\nclass UniqueSelectionDispatcher {\n constructor() {\n this._listeners = [];\n }\n /**\n * Notify other items that selection for the given name has been set.\n * @param id ID of the item.\n * @param name Name of the item.\n */\n notify(id, name) {\n for (let listener of this._listeners) {\n listener(id, name);\n }\n }\n /**\n * Listen for future changes to item selection.\n * @return Function used to deregister listener\n */\n listen(listener) {\n this._listeners.push(listener);\n return () => {\n this._listeners = this._listeners.filter((registered) => {\n return listener !== registered;\n });\n };\n }\n ngOnDestroy() {\n this._listeners = [];\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"17.2.0\", ngImport: i0, type: UniqueSelectionDispatcher, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"17.2.0\", ngImport: i0, type: UniqueSelectionDispatcher, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"17.2.0\", ngImport: i0, type: UniqueSelectionDispatcher, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }] });\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { ArrayDataSource, DataSource, SelectionModel, UniqueSelectionDispatcher, _DisposeViewRepeaterStrategy, _RecycleViewRepeaterStrategy, _VIEW_REPEATER_STRATEGY, _ViewRepeaterOperation, getMultipleValuesInSingleSelectionError, isDataSource };\n"],"x_google_ignoreList":[2]}