%PDF- %PDF-
Direktori : /home/graphicd/public_html/vebto/public/client/ |
Current File : /home/graphicd/public_html/vebto/public/client/752-es2015.8986f6dd05bbedd9c9a0.js.map |
{"version":3,"sources":["webpack:///node_modules/@angular/material/__ivy_ngcc__/fesm2015/radio.js","webpack:///src/common/core/ui/info-popover/info-popover.component.html","webpack:///src/common/core/ui/info-popover/info-popover.component.ts","webpack:///src/common/workspaces/workspace-index/workspace-index.component.html","webpack:///src/common/workspaces/workspace-index/workspace-index.component.ts","webpack:///src/app/drive/workspace-wrapper.module.ts","webpack:///src/common/core/ui/info-popover/info-popover.module.ts","webpack:///src/common/core/ui/overlay-panel/positions/right-position.ts","webpack:///src/common/datatable/columns/user-column/user-column.component.html","webpack:///src/common/datatable/columns/user-column/user-column.component.ts","webpack:///src/common/datatable/datatable-filters/datatable-filters.component.ts","webpack:///src/common/datatable/datatable-filters/datatable-filters.component.html","webpack:///src/common/datatable/datatable-footer/datatable-footer.component.html","webpack:///src/common/datatable/datatable-footer/datatable-footer.component.ts","webpack:///src/common/workspaces/crupdate-workspace-modal/crupdate-workspace-modal.component.html","webpack:///src/common/workspaces/crupdate-workspace-modal/crupdate-workspace-modal.component.ts","webpack:///src/common/workspaces/leave-workspace-confirmation.ts","webpack:///src/common/workspaces/workspace-messages.ts","webpack:///src/common/workspaces/manage-workspace-members-modal/manage-workspace-members-modal.component.html","webpack:///src/common/workspaces/manage-workspace-members-modal/manage-workspace-members-modal.component.ts","webpack:///src/common/workspaces/workspace.module.ts"],"names":["_c0","_c1","enterDuration","_c2","MAT_RADIO_DEFAULT_OPTIONS","InjectionToken","providedIn","factory","color","nextUniqueId","MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","MatRadioGroup","multi","MatRadioChange","constructor","source","value","this","MAT_RADIO_GROUP","_MatRadioGroupBase","_changeDetector","_value","_name","_selected","_isInitialized","_labelPosition","_disabled","_required","_controlValueAccessorChangeFn","onTouched","change","EventEmitter","_updateRadioButtonNames","v","_markRadiosForCheck","newValue","_updateSelectedRadioFromValue","_checkSelectedRadioButton","checked","selected","coerceBooleanProperty","ngAfterContentInit","_touch","_radios","forEach","radio","name","_markForCheck","_emitChangeEvent","emit","writeValue","markForCheck","registerOnChange","fn","registerOnTouched","setDisabledState","isDisabled","disabled","ɵfac","t","ɵngcc0","ɵdir","type","inputs","labelPosition","required","outputs","ɵMatRadioGroup_BaseFactory","selectors","contentQueries","rf","ctx","dirIndex","MatRadioButton","_t","hostAttrs","exportAs","features","MatRadioButtonBase","_elementRef","_MatRadioButtonMixinBase","mixinDisableRipple","mixinTabIndex","_MatRadioButtonBase","radioGroup","elementRef","_focusMonitor","_radioDispatcher","_animationMode","_providerOverride","tabIndex","super","_uniqueId","id","_checked","_removeUniqueSelectionListener","coerceNumberProperty","listen","newCheckedState","notify","_setDisabled","_color","focus","options","origin","focusVia","_inputElement","nativeElement","ngOnInit","ngAfterViewInit","monitor","subscribe","focusOrigin","ngOnDestroy","stopMonitoring","_isRippleDisabled","disableRipple","_onInputClick","event","stopPropagation","_onInputChange","groupValueChanged","ɵngcc1","ɵngcc2","String","undefined","viewQuery","first","ariaLabel","ariaLabelledby","ariaDescribedby","changeDetector","focusMonitor","radioDispatcher","animationMode","providerOverride","ANIMATION_MODULE_TYPE","ɵcmp","hostVars","hostBindings","ngContentSelectors","decls","vars","consts","template","$event","_r0","inputId","directives","ɵngcc3","styles","encapsulation","changeDetection","MatRadioModule","ɵmod","ɵinj","imports","MatRippleModule","MatCommonModule","InfoPopoverComponent","overlay","viewContainerRef","overlayRef","closePopover","offsetY","open","content","infoButton","position","hasBackdrop","scrollStrategy","panelClass","wider","getPanelEl","addEventListener","close","openPopover","e","toElement","relatedTarget","classList","contains","togglePopover","onMouseLeave","WorkspaceIndexComponent","datatable","currentUser","workspaces","toast","router","modal","workspaceConfig","workspaces$","data$","init","uri","staticParams","userId","get","workspace","confirmResourceDeletion","delete","reset","errResponse","message","openCrupdateResourceModal","url","indexOf","afterClosed","confirmed","deleteMember","RoutingModule","path","component","WorkspaceWrapperModule","WorkspaceModule","InfoPopoverModule","RIGHT_POSITION","originX","originY","overlayX","overlayY","offsetX","UserColumnComponent","showEmail","haveUrl","DatatableFiltersComponent","datable","filters","filters$","next","onFilterChange","DatatableFooterComponent","cd","hidePerPage","perPageControl","changeRef","paginator","response$","pipe","r","pagination","totalRecords","total","to","Math","min","per_page","current_page","from","max","havePrevious","canLoadPrevPage","haveNext","canLoadNextPage","setValue","parseInt","emitEvent","valueChanges","perPage","changePerPage","unsubscribe","destroy","previousPage","nextPage","CrupdateWorkspaceModalComponent","dialogRef","data","loading$","errors$","form","patchValue","update","create","response","errors","LEAVE_WORKSPACE_CONFIRMATION","title","body","bodyBold","ok","WorkspaceMessages","LEFT_WORKSPACE","MEMBER_DELETED","INVITES_SENT","INVITE_RESENT","ROLE_ASSIGNED","ManageWorkspaceMembersModalComponent","valueLists","inviting$","BehaviorSubject","deleting$","loadingMembers$","workspaceRoles$","members$","peopleToInvite","canInvite","canEdit","canDelete","workspaceRoles","finalize","invites","members","setCurrentUserPermissions","emails","filter","email","find","m","length","payload","roleId","default","invitePeople","invite","resendInvite","member","role","changeRole","i","findIndex","role_name","role_id","model_type","deleteInvite","splice","show","is_owner","permissions","p","components","crupdateModal","manageMembers"],"mappings":"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","file":"x","sourcesContent":["import { InjectionToken, forwardRef, EventEmitter, Directive, ChangeDetectorRef, Output, Input, ContentChildren, ElementRef, ViewChild, Component, ViewEncapsulation, ChangeDetectionStrategy, Optional, Inject, Attribute, NgModule } from '@angular/core';\nimport { mixinDisableRipple, mixinTabIndex, MatRippleModule, MatCommonModule } from '@angular/material/core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport { UniqueSelectionDispatcher } from '@angular/cdk/collections';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport * as ɵngcc0 from '@angular/core';\nimport * as ɵngcc1 from '@angular/cdk/a11y';\nimport * as ɵngcc2 from '@angular/cdk/collections';\nimport * as ɵngcc3 from '@angular/material/core';\n\nconst _c0 = [\"input\"];\nconst _c1 = function () { return { enterDuration: 150 }; };\nconst _c2 = [\"*\"];\nconst MAT_RADIO_DEFAULT_OPTIONS = new InjectionToken('mat-radio-default-options', {\n providedIn: 'root',\n factory: MAT_RADIO_DEFAULT_OPTIONS_FACTORY\n});\nfunction MAT_RADIO_DEFAULT_OPTIONS_FACTORY() {\n return {\n color: 'accent'\n };\n}\n// Increasing integer for generating unique ids for radio components.\nlet nextUniqueId = 0;\n/**\n * Provider Expression that allows mat-radio-group to register as a ControlValueAccessor. This\n * allows it to support [(ngModel)] and ngControl.\n * @docs-private\n */\nconst MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MatRadioGroup),\n multi: true\n};\n/** Change event object emitted by MatRadio and MatRadioGroup. */\nclass MatRadioChange {\n constructor(\n /** The MatRadioButton that emits the change event. */\n source, \n /** The value of the MatRadioButton. */\n value) {\n this.source = source;\n this.value = value;\n }\n}\n/**\n * Injection token that can be used to inject instances of `MatRadioGroup`. It serves as\n * alternative token to the actual `MatRadioGroup` class which could cause unnecessary\n * retention of the class and its component metadata.\n */\nconst MAT_RADIO_GROUP = new InjectionToken('MatRadioGroup');\n/**\n * Base class with all of the `MatRadioGroup` functionality.\n * @docs-private\n */\nclass _MatRadioGroupBase {\n constructor(_changeDetector) {\n this._changeDetector = _changeDetector;\n /** Selected value for the radio group. */\n this._value = null;\n /** The HTML name attribute applied to radio buttons in this group. */\n this._name = `mat-radio-group-${nextUniqueId++}`;\n /** The currently selected radio button. Should match value. */\n this._selected = null;\n /** Whether the `value` has been set to its initial value. */\n this._isInitialized = false;\n /** Whether the labels should appear after or before the radio-buttons. Defaults to 'after' */\n this._labelPosition = 'after';\n /** Whether the radio group is disabled. */\n this._disabled = false;\n /** Whether the radio group is required. */\n this._required = false;\n /** The method to be called in order to update ngModel */\n this._controlValueAccessorChangeFn = () => { };\n /**\n * onTouch function registered via registerOnTouch (ControlValueAccessor).\n * @docs-private\n */\n this.onTouched = () => { };\n /**\n * Event emitted when the group value changes.\n * Change events are only emitted when the value changes due to user interaction with\n * a radio button (the same behavior as `<input type-\"radio\">`).\n */\n this.change = new EventEmitter();\n }\n /** Name of the radio button group. All radio buttons inside this group will use this name. */\n get name() { return this._name; }\n set name(value) {\n this._name = value;\n this._updateRadioButtonNames();\n }\n /** Whether the labels should appear after or before the radio-buttons. Defaults to 'after' */\n get labelPosition() {\n return this._labelPosition;\n }\n set labelPosition(v) {\n this._labelPosition = v === 'before' ? 'before' : 'after';\n this._markRadiosForCheck();\n }\n /**\n * Value for the radio-group. Should equal the value of the selected radio button if there is\n * a corresponding radio button with a matching value. If there is not such a corresponding\n * radio button, this value persists to be applied in case a new radio button is added with a\n * matching value.\n */\n get value() { return this._value; }\n set value(newValue) {\n if (this._value !== newValue) {\n // Set this before proceeding to ensure no circular loop occurs with selection.\n this._value = newValue;\n this._updateSelectedRadioFromValue();\n this._checkSelectedRadioButton();\n }\n }\n _checkSelectedRadioButton() {\n if (this._selected && !this._selected.checked) {\n this._selected.checked = true;\n }\n }\n /**\n * The currently selected radio button. If set to a new radio button, the radio group value\n * will be updated to match the new selected button.\n */\n get selected() { return this._selected; }\n set selected(selected) {\n this._selected = selected;\n this.value = selected ? selected.value : null;\n this._checkSelectedRadioButton();\n }\n /** Whether the radio group is disabled */\n get disabled() { return this._disabled; }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n this._markRadiosForCheck();\n }\n /** Whether the radio group is required */\n get required() { return this._required; }\n set required(value) {\n this._required = coerceBooleanProperty(value);\n this._markRadiosForCheck();\n }\n /**\n * Initialize properties once content children are available.\n * This allows us to propagate relevant attributes to associated buttons.\n */\n ngAfterContentInit() {\n // Mark this component as initialized in AfterContentInit because the initial value can\n // possibly be set by NgModel on MatRadioGroup, and it is possible that the OnInit of the\n // NgModel occurs *after* the OnInit of the MatRadioGroup.\n this._isInitialized = true;\n }\n /**\n * Mark this group as being \"touched\" (for ngModel). Meant to be called by the contained\n * radio buttons upon their blur.\n */\n _touch() {\n if (this.onTouched) {\n this.onTouched();\n }\n }\n _updateRadioButtonNames() {\n if (this._radios) {\n this._radios.forEach(radio => {\n radio.name = this.name;\n radio._markForCheck();\n });\n }\n }\n /** Updates the `selected` radio button from the internal _value state. */\n _updateSelectedRadioFromValue() {\n // If the value already matches the selected radio, do nothing.\n const isAlreadySelected = this._selected !== null && this._selected.value === this._value;\n if (this._radios && !isAlreadySelected) {\n this._selected = null;\n this._radios.forEach(radio => {\n radio.checked = this.value === radio.value;\n if (radio.checked) {\n this._selected = radio;\n }\n });\n }\n }\n /** Dispatch change event with current selection and group value. */\n _emitChangeEvent() {\n if (this._isInitialized) {\n this.change.emit(new MatRadioChange(this._selected, this._value));\n }\n }\n _markRadiosForCheck() {\n if (this._radios) {\n this._radios.forEach(radio => radio._markForCheck());\n }\n }\n /**\n * Sets the model value. Implemented as part of ControlValueAccessor.\n * @param value\n */\n writeValue(value) {\n this.value = value;\n this._changeDetector.markForCheck();\n }\n /**\n * Registers a callback to be triggered when the model value changes.\n * Implemented as part of ControlValueAccessor.\n * @param fn Callback to be registered.\n */\n registerOnChange(fn) {\n this._controlValueAccessorChangeFn = fn;\n }\n /**\n * Registers a callback to be triggered when the control is touched.\n * Implemented as part of ControlValueAccessor.\n * @param fn Callback to be registered.\n */\n registerOnTouched(fn) {\n this.onTouched = fn;\n }\n /**\n * Sets the disabled state of the control. Implemented as a part of ControlValueAccessor.\n * @param isDisabled Whether the control should be disabled.\n */\n setDisabledState(isDisabled) {\n this.disabled = isDisabled;\n this._changeDetector.markForCheck();\n }\n}\n_MatRadioGroupBase.ɵfac = function _MatRadioGroupBase_Factory(t) { return new (t || _MatRadioGroupBase)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };\n_MatRadioGroupBase.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: _MatRadioGroupBase, inputs: { name: \"name\", labelPosition: \"labelPosition\", value: \"value\", selected: \"selected\", disabled: \"disabled\", required: \"required\", color: \"color\" }, outputs: { change: \"change\" } });\n_MatRadioGroupBase.ctorParameters = () => [\n { type: ChangeDetectorRef }\n];\n_MatRadioGroupBase.propDecorators = {\n change: [{ type: Output }],\n color: [{ type: Input }],\n name: [{ type: Input }],\n labelPosition: [{ type: Input }],\n value: [{ type: Input }],\n selected: [{ type: Input }],\n disabled: [{ type: Input }],\n required: [{ type: Input }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(_MatRadioGroupBase, [{\n type: Directive\n }], function () { return [{ type: ɵngcc0.ChangeDetectorRef }]; }, { change: [{\n type: Output\n }], name: [{\n type: Input\n }], labelPosition: [{\n type: Input\n }], value: [{\n type: Input\n }], selected: [{\n type: Input\n }], disabled: [{\n type: Input\n }], required: [{\n type: Input\n }], color: [{\n type: Input\n }] }); })();\n/**\n * A group of radio buttons. May contain one or more `<mat-radio-button>` elements.\n */\nclass MatRadioGroup extends _MatRadioGroupBase {\n}\nMatRadioGroup.ɵfac = /*@__PURE__*/ function () { let ɵMatRadioGroup_BaseFactory; return function MatRadioGroup_Factory(t) { return (ɵMatRadioGroup_BaseFactory || (ɵMatRadioGroup_BaseFactory = ɵngcc0.ɵɵgetInheritedFactory(MatRadioGroup)))(t || MatRadioGroup); }; }();\nMatRadioGroup.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: MatRadioGroup, selectors: [[\"mat-radio-group\"]], contentQueries: function MatRadioGroup_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {\n ɵngcc0.ɵɵcontentQuery(dirIndex, MatRadioButton, 5);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._radios = _t);\n } }, hostAttrs: [\"role\", \"radiogroup\", 1, \"mat-radio-group\"], exportAs: [\"matRadioGroup\"], features: [ɵngcc0.ɵɵProvidersFeature([\n MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR,\n { provide: MAT_RADIO_GROUP, useExisting: MatRadioGroup },\n ]), ɵngcc0.ɵɵInheritDefinitionFeature] });\nMatRadioGroup.propDecorators = {\n _radios: [{ type: ContentChildren, args: [forwardRef(() => MatRadioButton), { descendants: true },] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatRadioGroup, [{\n type: Directive,\n args: [{\n selector: 'mat-radio-group',\n exportAs: 'matRadioGroup',\n providers: [\n MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR,\n { provide: MAT_RADIO_GROUP, useExisting: MatRadioGroup },\n ],\n host: {\n 'role': 'radiogroup',\n 'class': 'mat-radio-group'\n }\n }]\n }], null, { _radios: [{\n type: ContentChildren,\n args: [forwardRef(() => MatRadioButton), { descendants: true }]\n }] }); })();\n// Boilerplate for applying mixins to MatRadioButton.\n/** @docs-private */\nclass MatRadioButtonBase {\n constructor(_elementRef) {\n this._elementRef = _elementRef;\n }\n}\n// As per Material design specifications the selection control radio should use the accent color\n// palette by default. https://material.io/guidelines/components/selection-controls.html\nconst _MatRadioButtonMixinBase = mixinDisableRipple(mixinTabIndex(MatRadioButtonBase));\n/**\n * Base class with all of the `MatRadioButton` functionality.\n * @docs-private\n */\nclass _MatRadioButtonBase extends _MatRadioButtonMixinBase {\n constructor(radioGroup, elementRef, _changeDetector, _focusMonitor, _radioDispatcher, _animationMode, _providerOverride, tabIndex) {\n super(elementRef);\n this._changeDetector = _changeDetector;\n this._focusMonitor = _focusMonitor;\n this._radioDispatcher = _radioDispatcher;\n this._animationMode = _animationMode;\n this._providerOverride = _providerOverride;\n this._uniqueId = `mat-radio-${++nextUniqueId}`;\n /** The unique ID for the radio button. */\n this.id = this._uniqueId;\n /**\n * Event emitted when the checked state of this radio button changes.\n * Change events are only emitted when the value changes due to user interaction with\n * the radio button (the same behavior as `<input type-\"radio\">`).\n */\n this.change = new EventEmitter();\n /** Whether this radio is checked. */\n this._checked = false;\n /** Value assigned to this radio. */\n this._value = null;\n /** Unregister function for _radioDispatcher */\n this._removeUniqueSelectionListener = () => { };\n // Assertions. Ideally these should be stripped out by the compiler.\n // TODO(jelbourn): Assert that there's no name binding AND a parent radio group.\n this.radioGroup = radioGroup;\n if (tabIndex) {\n this.tabIndex = coerceNumberProperty(tabIndex, 0);\n }\n this._removeUniqueSelectionListener =\n _radioDispatcher.listen((id, name) => {\n if (id !== this.id && name === this.name) {\n this.checked = false;\n }\n });\n }\n /** Whether this radio button is checked. */\n get checked() { return this._checked; }\n set checked(value) {\n const newCheckedState = coerceBooleanProperty(value);\n if (this._checked !== newCheckedState) {\n this._checked = newCheckedState;\n if (newCheckedState && this.radioGroup && this.radioGroup.value !== this.value) {\n this.radioGroup.selected = this;\n }\n else if (!newCheckedState && this.radioGroup && this.radioGroup.value === this.value) {\n // When unchecking the selected radio button, update the selected radio\n // property on the group.\n this.radioGroup.selected = null;\n }\n if (newCheckedState) {\n // Notify all radio buttons with the same name to un-check.\n this._radioDispatcher.notify(this.id, this.name);\n }\n this._changeDetector.markForCheck();\n }\n }\n /** The value of this radio button. */\n get value() { return this._value; }\n set value(value) {\n if (this._value !== value) {\n this._value = value;\n if (this.radioGroup !== null) {\n if (!this.checked) {\n // Update checked when the value changed to match the radio group's value\n this.checked = this.radioGroup.value === value;\n }\n if (this.checked) {\n this.radioGroup.selected = this;\n }\n }\n }\n }\n /** Whether the label should appear after or before the radio button. Defaults to 'after' */\n get labelPosition() {\n return this._labelPosition || (this.radioGroup && this.radioGroup.labelPosition) || 'after';\n }\n set labelPosition(value) {\n this._labelPosition = value;\n }\n /** Whether the radio button is disabled. */\n get disabled() {\n return this._disabled || (this.radioGroup !== null && this.radioGroup.disabled);\n }\n set disabled(value) {\n this._setDisabled(coerceBooleanProperty(value));\n }\n /** Whether the radio button is required. */\n get required() {\n return this._required || (this.radioGroup && this.radioGroup.required);\n }\n set required(value) {\n this._required = coerceBooleanProperty(value);\n }\n /** Theme color of the radio button. */\n get color() {\n return this._color ||\n (this.radioGroup && this.radioGroup.color) ||\n this._providerOverride && this._providerOverride.color || 'accent';\n }\n set color(newValue) { this._color = newValue; }\n /** ID of the native input element inside `<mat-radio-button>` */\n get inputId() { return `${this.id || this._uniqueId}-input`; }\n /** Focuses the radio button. */\n focus(options, origin) {\n if (origin) {\n this._focusMonitor.focusVia(this._inputElement, origin, options);\n }\n else {\n this._inputElement.nativeElement.focus(options);\n }\n }\n /**\n * Marks the radio button as needing checking for change detection.\n * This method is exposed because the parent radio group will directly\n * update bound properties of the radio button.\n */\n _markForCheck() {\n // When group value changes, the button will not be notified. Use `markForCheck` to explicit\n // update radio button's status\n this._changeDetector.markForCheck();\n }\n ngOnInit() {\n if (this.radioGroup) {\n // If the radio is inside a radio group, determine if it should be checked\n this.checked = this.radioGroup.value === this._value;\n if (this.checked) {\n this.radioGroup.selected = this;\n }\n // Copy name from parent radio group\n this.name = this.radioGroup.name;\n }\n }\n ngAfterViewInit() {\n this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe(focusOrigin => {\n if (!focusOrigin && this.radioGroup) {\n this.radioGroup._touch();\n }\n });\n }\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef);\n this._removeUniqueSelectionListener();\n }\n /** Dispatch change event with current value. */\n _emitChangeEvent() {\n this.change.emit(new MatRadioChange(this, this._value));\n }\n _isRippleDisabled() {\n return this.disableRipple || this.disabled;\n }\n _onInputClick(event) {\n // We have to stop propagation for click events on the visual hidden input element.\n // By default, when a user clicks on a label element, a generated click event will be\n // dispatched on the associated input element. Since we are using a label element as our\n // root container, the click event on the `radio-button` will be executed twice.\n // The real click event will bubble up, and the generated click event also tries to bubble up.\n // This will lead to multiple click events.\n // Preventing bubbling for the second event will solve that issue.\n event.stopPropagation();\n }\n /**\n * Triggered when the radio button received a click or the input recognized any change.\n * Clicking on a label element, will trigger a change event on the associated input.\n */\n _onInputChange(event) {\n // We always have to stop propagation on the change event.\n // Otherwise the change event, from the input element, will bubble up and\n // emit its event object to the `change` output.\n event.stopPropagation();\n const groupValueChanged = this.radioGroup && this.value !== this.radioGroup.value;\n this.checked = true;\n this._emitChangeEvent();\n if (this.radioGroup) {\n this.radioGroup._controlValueAccessorChangeFn(this.value);\n if (groupValueChanged) {\n this.radioGroup._emitChangeEvent();\n }\n }\n }\n /** Sets the disabled state and marks for check if a change occurred. */\n _setDisabled(value) {\n if (this._disabled !== value) {\n this._disabled = value;\n this._changeDetector.markForCheck();\n }\n }\n}\n_MatRadioButtonBase.ɵfac = function _MatRadioButtonBase_Factory(t) { return new (t || _MatRadioButtonBase)(ɵngcc0.ɵɵdirectiveInject(_MatRadioGroupBase), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.FocusMonitor), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.UniqueSelectionDispatcher), ɵngcc0.ɵɵdirectiveInject(String), ɵngcc0.ɵɵdirectiveInject(undefined), ɵngcc0.ɵɵdirectiveInject(String)); };\n_MatRadioButtonBase.ɵdir = /*@__PURE__*/ ɵngcc0.ɵɵdefineDirective({ type: _MatRadioButtonBase, viewQuery: function _MatRadioButtonBase_Query(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵviewQuery(_c0, 5);\n } if (rf & 2) {\n let _t;\n ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx._inputElement = _t.first);\n } }, inputs: { id: \"id\", checked: \"checked\", value: \"value\", labelPosition: \"labelPosition\", disabled: \"disabled\", required: \"required\", color: \"color\", name: \"name\", ariaLabel: [\"aria-label\", \"ariaLabel\"], ariaLabelledby: [\"aria-labelledby\", \"ariaLabelledby\"], ariaDescribedby: [\"aria-describedby\", \"ariaDescribedby\"] }, outputs: { change: \"change\" }, features: [ɵngcc0.ɵɵInheritDefinitionFeature] });\n_MatRadioButtonBase.ctorParameters = () => [\n { type: _MatRadioGroupBase },\n { type: ElementRef },\n { type: ChangeDetectorRef },\n { type: FocusMonitor },\n { type: UniqueSelectionDispatcher },\n { type: String },\n { type: undefined },\n { type: String }\n];\n_MatRadioButtonBase.propDecorators = {\n id: [{ type: Input }],\n name: [{ type: Input }],\n ariaLabel: [{ type: Input, args: ['aria-label',] }],\n ariaLabelledby: [{ type: Input, args: ['aria-labelledby',] }],\n ariaDescribedby: [{ type: Input, args: ['aria-describedby',] }],\n checked: [{ type: Input }],\n value: [{ type: Input }],\n labelPosition: [{ type: Input }],\n disabled: [{ type: Input }],\n required: [{ type: Input }],\n color: [{ type: Input }],\n change: [{ type: Output }],\n _inputElement: [{ type: ViewChild, args: ['input',] }]\n};\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(_MatRadioButtonBase, [{\n type: Directive\n }], function () { return [{ type: _MatRadioGroupBase }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc1.FocusMonitor }, { type: ɵngcc2.UniqueSelectionDispatcher }, { type: String }, { type: undefined }, { type: String }]; }, { id: [{\n type: Input\n }], change: [{\n type: Output\n }], checked: [{\n type: Input\n }], value: [{\n type: Input\n }], labelPosition: [{\n type: Input\n }], disabled: [{\n type: Input\n }], required: [{\n type: Input\n }], color: [{\n type: Input\n }], name: [{\n type: Input\n }], ariaLabel: [{\n type: Input,\n args: ['aria-label']\n }], ariaLabelledby: [{\n type: Input,\n args: ['aria-labelledby']\n }], ariaDescribedby: [{\n type: Input,\n args: ['aria-describedby']\n }], _inputElement: [{\n type: ViewChild,\n args: ['input']\n }] }); })();\n/**\n * A Material design radio-button. Typically placed inside of `<mat-radio-group>` elements.\n */\nclass MatRadioButton extends _MatRadioButtonBase {\n constructor(radioGroup, elementRef, changeDetector, focusMonitor, radioDispatcher, animationMode, providerOverride, tabIndex) {\n super(radioGroup, elementRef, changeDetector, focusMonitor, radioDispatcher, animationMode, providerOverride, tabIndex);\n }\n}\nMatRadioButton.ɵfac = function MatRadioButton_Factory(t) { return new (t || MatRadioButton)(ɵngcc0.ɵɵdirectiveInject(MAT_RADIO_GROUP, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.FocusMonitor), ɵngcc0.ɵɵdirectiveInject(ɵngcc2.UniqueSelectionDispatcher), ɵngcc0.ɵɵdirectiveInject(ANIMATION_MODULE_TYPE, 8), ɵngcc0.ɵɵdirectiveInject(MAT_RADIO_DEFAULT_OPTIONS, 8), ɵngcc0.ɵɵinjectAttribute('tabindex')); };\nMatRadioButton.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatRadioButton, selectors: [[\"mat-radio-button\"]], hostAttrs: [1, \"mat-radio-button\"], hostVars: 17, hostBindings: function MatRadioButton_HostBindings(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵlistener(\"focus\", function MatRadioButton_focus_HostBindingHandler() { return ctx._inputElement.nativeElement.focus(); });\n } if (rf & 2) {\n ɵngcc0.ɵɵattribute(\"tabindex\", null)(\"id\", ctx.id)(\"aria-label\", null)(\"aria-labelledby\", null)(\"aria-describedby\", null);\n ɵngcc0.ɵɵclassProp(\"mat-radio-checked\", ctx.checked)(\"mat-radio-disabled\", ctx.disabled)(\"_mat-animation-noopable\", ctx._animationMode === \"NoopAnimations\")(\"mat-primary\", ctx.color === \"primary\")(\"mat-accent\", ctx.color === \"accent\")(\"mat-warn\", ctx.color === \"warn\");\n } }, inputs: { disableRipple: \"disableRipple\", tabIndex: \"tabIndex\" }, exportAs: [\"matRadioButton\"], features: [ɵngcc0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c2, decls: 13, vars: 19, consts: [[1, \"mat-radio-label\"], [\"label\", \"\"], [1, \"mat-radio-container\"], [1, \"mat-radio-outer-circle\"], [1, \"mat-radio-inner-circle\"], [\"type\", \"radio\", 1, \"mat-radio-input\", \"cdk-visually-hidden\", 3, \"id\", \"checked\", \"disabled\", \"tabIndex\", \"required\", \"change\", \"click\"], [\"input\", \"\"], [\"mat-ripple\", \"\", 1, \"mat-radio-ripple\", \"mat-focus-indicator\", 3, \"matRippleTrigger\", \"matRippleDisabled\", \"matRippleCentered\", \"matRippleRadius\", \"matRippleAnimation\"], [1, \"mat-ripple-element\", \"mat-radio-persistent-ripple\"], [1, \"mat-radio-label-content\"], [2, \"display\", \"none\"]], template: function MatRadioButton_Template(rf, ctx) { if (rf & 1) {\n ɵngcc0.ɵɵprojectionDef();\n ɵngcc0.ɵɵelementStart(0, \"label\", 0, 1);\n ɵngcc0.ɵɵelementStart(2, \"span\", 2);\n ɵngcc0.ɵɵelement(3, \"span\", 3);\n ɵngcc0.ɵɵelement(4, \"span\", 4);\n ɵngcc0.ɵɵelementStart(5, \"input\", 5, 6);\n ɵngcc0.ɵɵlistener(\"change\", function MatRadioButton_Template_input_change_5_listener($event) { return ctx._onInputChange($event); })(\"click\", function MatRadioButton_Template_input_click_5_listener($event) { return ctx._onInputClick($event); });\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(7, \"span\", 7);\n ɵngcc0.ɵɵelement(8, \"span\", 8);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementStart(9, \"span\", 9);\n ɵngcc0.ɵɵelementStart(10, \"span\", 10);\n ɵngcc0.ɵɵtext(11, \"\\u00A0\");\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵprojection(12);\n ɵngcc0.ɵɵelementEnd();\n ɵngcc0.ɵɵelementEnd();\n } if (rf & 2) {\n const _r0 = ɵngcc0.ɵɵreference(1);\n ɵngcc0.ɵɵattribute(\"for\", ctx.inputId);\n ɵngcc0.ɵɵadvance(5);\n ɵngcc0.ɵɵproperty(\"id\", ctx.inputId)(\"checked\", ctx.checked)(\"disabled\", ctx.disabled)(\"tabIndex\", ctx.tabIndex)(\"required\", ctx.required);\n ɵngcc0.ɵɵattribute(\"name\", ctx.name)(\"value\", ctx.value)(\"aria-label\", ctx.ariaLabel)(\"aria-labelledby\", ctx.ariaLabelledby)(\"aria-describedby\", ctx.ariaDescribedby);\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵproperty(\"matRippleTrigger\", _r0)(\"matRippleDisabled\", ctx._isRippleDisabled())(\"matRippleCentered\", true)(\"matRippleRadius\", 20)(\"matRippleAnimation\", ɵngcc0.ɵɵpureFunction0(18, _c1));\n ɵngcc0.ɵɵadvance(2);\n ɵngcc0.ɵɵclassProp(\"mat-radio-label-before\", ctx.labelPosition == \"before\");\n } }, directives: [ɵngcc3.MatRipple], styles: [\".mat-radio-button{display:inline-block;-webkit-tap-highlight-color:transparent;outline:0}.mat-radio-label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;display:inline-flex;align-items:center;white-space:nowrap;vertical-align:middle;width:100%}.mat-radio-container{box-sizing:border-box;display:inline-block;position:relative;width:20px;height:20px;flex-shrink:0}.mat-radio-outer-circle{box-sizing:border-box;display:block;height:20px;left:0;position:absolute;top:0;transition:border-color ease 280ms;width:20px;border-width:2px;border-style:solid;border-radius:50%}._mat-animation-noopable .mat-radio-outer-circle{transition:none}.mat-radio-inner-circle{border-radius:50%;box-sizing:border-box;display:block;height:20px;left:0;position:absolute;top:0;transition:transform ease 280ms,background-color ease 280ms;width:20px;transform:scale(0.001);-webkit-print-color-adjust:exact;color-adjust:exact}._mat-animation-noopable .mat-radio-inner-circle{transition:none}.mat-radio-checked .mat-radio-inner-circle{transform:scale(0.5)}.cdk-high-contrast-active .mat-radio-checked .mat-radio-inner-circle{border:solid 10px}.mat-radio-label-content{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto;display:inline-block;order:0;line-height:inherit;padding-left:8px;padding-right:0}[dir=rtl] .mat-radio-label-content{padding-right:8px;padding-left:0}.mat-radio-label-content.mat-radio-label-before{order:-1;padding-left:0;padding-right:8px}[dir=rtl] .mat-radio-label-content.mat-radio-label-before{padding-right:0;padding-left:8px}.mat-radio-disabled,.mat-radio-disabled .mat-radio-label{cursor:default}.mat-radio-button .mat-radio-ripple{position:absolute;left:calc(50% - 20px);top:calc(50% - 20px);height:40px;width:40px;z-index:1;pointer-events:none}.mat-radio-button .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple){opacity:.16}.mat-radio-persistent-ripple{width:100%;height:100%;transform:none;top:0;left:0}.mat-radio-container:hover .mat-radio-persistent-ripple{opacity:.04}.mat-radio-button:not(.mat-radio-disabled).cdk-keyboard-focused .mat-radio-persistent-ripple,.mat-radio-button:not(.mat-radio-disabled).cdk-program-focused .mat-radio-persistent-ripple{opacity:.12}.mat-radio-persistent-ripple,.mat-radio-disabled .mat-radio-container:hover .mat-radio-persistent-ripple{opacity:0}@media(hover: none){.mat-radio-container:hover .mat-radio-persistent-ripple{display:none}}.mat-radio-input{bottom:0;left:50%}.cdk-high-contrast-active .mat-radio-disabled{opacity:.5}\\n\"], encapsulation: 2, changeDetection: 0 });\nMatRadioButton.ctorParameters = () => [\n { type: MatRadioGroup, decorators: [{ type: Optional }, { type: Inject, args: [MAT_RADIO_GROUP,] }] },\n { type: ElementRef },\n { type: ChangeDetectorRef },\n { type: FocusMonitor },\n { type: UniqueSelectionDispatcher },\n { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] },\n { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_RADIO_DEFAULT_OPTIONS,] }] },\n { type: String, decorators: [{ type: Attribute, args: ['tabindex',] }] }\n];\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatRadioButton, [{\n type: Component,\n args: [{\n selector: 'mat-radio-button',\n template: \"<!-- TODO(jelbourn): render the radio on either side of the content -->\\n<!-- TODO(mtlin): Evaluate trade-offs of using native radio vs. cost of additional bindings. -->\\n<label [attr.for]=\\\"inputId\\\" class=\\\"mat-radio-label\\\" #label>\\n <!-- The actual 'radio' part of the control. -->\\n <span class=\\\"mat-radio-container\\\">\\n <span class=\\\"mat-radio-outer-circle\\\"></span>\\n <span class=\\\"mat-radio-inner-circle\\\"></span>\\n <input #input class=\\\"mat-radio-input cdk-visually-hidden\\\" type=\\\"radio\\\"\\n [id]=\\\"inputId\\\"\\n [checked]=\\\"checked\\\"\\n [disabled]=\\\"disabled\\\"\\n [tabIndex]=\\\"tabIndex\\\"\\n [attr.name]=\\\"name\\\"\\n [attr.value]=\\\"value\\\"\\n [required]=\\\"required\\\"\\n [attr.aria-label]=\\\"ariaLabel\\\"\\n [attr.aria-labelledby]=\\\"ariaLabelledby\\\"\\n [attr.aria-describedby]=\\\"ariaDescribedby\\\"\\n (change)=\\\"_onInputChange($event)\\\"\\n (click)=\\\"_onInputClick($event)\\\">\\n\\n <!-- The ripple comes after the input so that we can target it with a CSS\\n sibling selector when the input is focused. -->\\n <span mat-ripple class=\\\"mat-radio-ripple mat-focus-indicator\\\"\\n [matRippleTrigger]=\\\"label\\\"\\n [matRippleDisabled]=\\\"_isRippleDisabled()\\\"\\n [matRippleCentered]=\\\"true\\\"\\n [matRippleRadius]=\\\"20\\\"\\n [matRippleAnimation]=\\\"{enterDuration: 150}\\\">\\n\\n <span class=\\\"mat-ripple-element mat-radio-persistent-ripple\\\"></span>\\n </span>\\n </span>\\n\\n <!-- The label content for radio control. -->\\n <span class=\\\"mat-radio-label-content\\\" [class.mat-radio-label-before]=\\\"labelPosition == 'before'\\\">\\n <!-- Add an invisible span so JAWS can read the label -->\\n <span style=\\\"display:none\\\"> </span>\\n <ng-content></ng-content>\\n </span>\\n</label>\\n\",\n inputs: ['disableRipple', 'tabIndex'],\n encapsulation: ViewEncapsulation.None,\n exportAs: 'matRadioButton',\n host: {\n 'class': 'mat-radio-button',\n '[class.mat-radio-checked]': 'checked',\n '[class.mat-radio-disabled]': 'disabled',\n '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n '[class.mat-primary]': 'color === \"primary\"',\n '[class.mat-accent]': 'color === \"accent\"',\n '[class.mat-warn]': 'color === \"warn\"',\n // Needs to be removed since it causes some a11y issues (see #21266).\n '[attr.tabindex]': 'null',\n '[attr.id]': 'id',\n '[attr.aria-label]': 'null',\n '[attr.aria-labelledby]': 'null',\n '[attr.aria-describedby]': 'null',\n // Note: under normal conditions focus shouldn't land on this element, however it may be\n // programmatically set, for example inside of a focus trap, in this case we want to forward\n // the focus to the native element.\n '(focus)': '_inputElement.nativeElement.focus()'\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: [\".mat-radio-button{display:inline-block;-webkit-tap-highlight-color:transparent;outline:0}.mat-radio-label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;display:inline-flex;align-items:center;white-space:nowrap;vertical-align:middle;width:100%}.mat-radio-container{box-sizing:border-box;display:inline-block;position:relative;width:20px;height:20px;flex-shrink:0}.mat-radio-outer-circle{box-sizing:border-box;display:block;height:20px;left:0;position:absolute;top:0;transition:border-color ease 280ms;width:20px;border-width:2px;border-style:solid;border-radius:50%}._mat-animation-noopable .mat-radio-outer-circle{transition:none}.mat-radio-inner-circle{border-radius:50%;box-sizing:border-box;display:block;height:20px;left:0;position:absolute;top:0;transition:transform ease 280ms,background-color ease 280ms;width:20px;transform:scale(0.001);-webkit-print-color-adjust:exact;color-adjust:exact}._mat-animation-noopable .mat-radio-inner-circle{transition:none}.mat-radio-checked .mat-radio-inner-circle{transform:scale(0.5)}.cdk-high-contrast-active .mat-radio-checked .mat-radio-inner-circle{border:solid 10px}.mat-radio-label-content{-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto;display:inline-block;order:0;line-height:inherit;padding-left:8px;padding-right:0}[dir=rtl] .mat-radio-label-content{padding-right:8px;padding-left:0}.mat-radio-label-content.mat-radio-label-before{order:-1;padding-left:0;padding-right:8px}[dir=rtl] .mat-radio-label-content.mat-radio-label-before{padding-right:0;padding-left:8px}.mat-radio-disabled,.mat-radio-disabled .mat-radio-label{cursor:default}.mat-radio-button .mat-radio-ripple{position:absolute;left:calc(50% - 20px);top:calc(50% - 20px);height:40px;width:40px;z-index:1;pointer-events:none}.mat-radio-button .mat-radio-ripple .mat-ripple-element:not(.mat-radio-persistent-ripple){opacity:.16}.mat-radio-persistent-ripple{width:100%;height:100%;transform:none;top:0;left:0}.mat-radio-container:hover .mat-radio-persistent-ripple{opacity:.04}.mat-radio-button:not(.mat-radio-disabled).cdk-keyboard-focused .mat-radio-persistent-ripple,.mat-radio-button:not(.mat-radio-disabled).cdk-program-focused .mat-radio-persistent-ripple{opacity:.12}.mat-radio-persistent-ripple,.mat-radio-disabled .mat-radio-container:hover .mat-radio-persistent-ripple{opacity:0}@media(hover: none){.mat-radio-container:hover .mat-radio-persistent-ripple{display:none}}.mat-radio-input{bottom:0;left:50%}.cdk-high-contrast-active .mat-radio-disabled{opacity:.5}\\n\"]\n }]\n }], function () { return [{ type: MatRadioGroup, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_RADIO_GROUP]\n }] }, { type: ɵngcc0.ElementRef }, { type: ɵngcc0.ChangeDetectorRef }, { type: ɵngcc1.FocusMonitor }, { type: ɵngcc2.UniqueSelectionDispatcher }, { type: String, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [ANIMATION_MODULE_TYPE]\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_RADIO_DEFAULT_OPTIONS]\n }] }, { type: String, decorators: [{\n type: Attribute,\n args: ['tabindex']\n }] }]; }, null); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nclass MatRadioModule {\n}\nMatRadioModule.ɵfac = function MatRadioModule_Factory(t) { return new (t || MatRadioModule)(); };\nMatRadioModule.ɵmod = /*@__PURE__*/ ɵngcc0.ɵɵdefineNgModule({ type: MatRadioModule });\nMatRadioModule.ɵinj = /*@__PURE__*/ ɵngcc0.ɵɵdefineInjector({ imports: [[MatRippleModule, MatCommonModule], MatCommonModule] });\n(function () { (typeof ngDevMode === \"undefined\" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatRadioModule, [{\n type: NgModule,\n args: [{\n imports: [MatRippleModule, MatCommonModule],\n exports: [MatRadioGroup, MatRadioButton, MatCommonModule],\n declarations: [MatRadioGroup, MatRadioButton]\n }]\n }], null, null); })();\n(function () { (typeof ngJitMode === \"undefined\" || ngJitMode) && ɵngcc0.ɵɵsetNgModuleScope(MatRadioModule, { declarations: function () { return [MatRadioGroup, MatRadioButton]; }, imports: function () { return [MatRippleModule, MatCommonModule]; }, exports: function () { return [MatRadioGroup, MatRadioButton, MatCommonModule]; } }); })();\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { MAT_RADIO_DEFAULT_OPTIONS, MAT_RADIO_DEFAULT_OPTIONS_FACTORY, MAT_RADIO_GROUP, MAT_RADIO_GROUP_CONTROL_VALUE_ACCESSOR, MatRadioButton, MatRadioChange, MatRadioGroup, MatRadioModule, _MatRadioButtonBase, _MatRadioGroupBase };\n\n//# sourceMappingURL=radio.js.map","<button type=\"button\" mat-icon-button (click)=\"togglePopover()\" (mouseenter)=\"openPopover()\" (mouseleave)=\"onMouseLeave($event)\">\n <mat-icon #infoIcon svgIcon=\"info\" class=\"info-icon\"></mat-icon>\n</button>\n\n<ng-template #popoverContent>\n <ng-content></ng-content>\n</ng-template>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef, Input,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation\n} from '@angular/core';\nimport {RIGHT_POSITION} from '@common/core/ui/overlay-panel/positions/right-position';\nimport {OverlayPanelRef} from '@common/core/ui/overlay-panel/overlay-panel-ref';\nimport {OverlayPanel} from '@common/core/ui/overlay-panel/overlay-panel.service';\n\n@Component({\n selector: 'info-popover',\n templateUrl: './info-popover.component.html',\n styleUrls: ['./info-popover.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class InfoPopoverComponent {\n @ViewChild('infoIcon', { read: ElementRef }) infoButton: ElementRef<HTMLElement>;\n @ViewChild('popoverContent') content: TemplateRef<any>;\n @Input() wider: boolean;\n private overlayRef: OverlayPanelRef;\n\n constructor(\n private overlay: OverlayPanel,\n private viewContainerRef: ViewContainerRef,\n ) {}\n\n public openPopover() {\n if (this.overlayRef) {\n this.closePopover();\n }\n const position = {...RIGHT_POSITION};\n position[0].offsetY = -15;\n\n this.overlayRef = this.overlay.open(this.content, {\n origin: this.infoButton,\n position: RIGHT_POSITION,\n hasBackdrop: false,\n scrollStrategy: 'close',\n viewContainerRef: this.viewContainerRef,\n panelClass: ['info-popover-panel', this.wider ? 'wider' : null],\n });\n\n this.overlayRef.getPanelEl().addEventListener('mouseleave', () => {\n this.closePopover();\n });\n }\n\n public closePopover() {\n if (this.overlayRef) {\n this.overlayRef.close();\n this.overlayRef = null;\n }\n }\n\n public togglePopover() {\n if (this.overlayRef) {\n this.closePopover();\n } else {\n this.openPopover();\n }\n }\n\n public onMouseLeave(e: MouseEvent) {\n const toElement = (e['toElement'] || e.relatedTarget) as HTMLElement;\n if ( !toElement || !toElement.classList.contains('info-popover-panel')) {\n this.closePopover();\n }\n }\n}\n","<div class=\"datatable-page-header\">\n <h1 trans>\n <span trans>Workspaces</span>\n <info-popover>\n <strong trans>Workspaces and Teammates</strong>\n <p trans>{{ workspaceConfig.description }}</p>\n </info-popover>\n </h1>\n\n <div class=\"header\">\n <datatable-filters pluralName=\"workspaces\"></datatable-filters>\n <div class=\"action-buttons\">\n <button\n *ngIf=\"currentUser.hasPermission('workspaces.create')\"\n mat-raised-button\n color=\"accent\"\n class=\"button-with-icon\"\n (click)=\"showCrupdateWorkspaceModal()\"\n >\n <mat-icon svgIcon=\"add\"></mat-icon>\n <span trans>Add New Workspace</span>\n </button>\n </div>\n </div>\n</div>\n\n<div class=\"datatable responsive-table\">\n <table class=\"material-table\">\n <thead>\n <tr>\n <th table-sort-header trans>Name</th>\n <th table-sort-header=\"owner_id\" trans>Owner</th>\n <th trans>Your Role</th>\n <th table-sort-header=\"members_count\" trans>Members</th>\n <th trans>Last Updated</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let workspace of workspaces$ | async\">\n <td data-label=\"Name\">{{ workspace.name }}</td>\n <td data-label=\"Owner\">\n <user-column [user]=\"workspace.owner\"></user-column>\n </td>\n <td data-label=\"Your Role\" trans>{{ workspace.currentUser?.role_name || '-' }}</td>\n <td data-label=\"Members\">{{ workspace.members_count || '-' }}</td>\n <td data-label=\"Last Updated\">{{ workspace.updated_at | formattedDate }}</td>\n <td class=\"edit-column\">\n <button\n mat-icon-button\n (click)=\"openWorkspaceMembersModal(workspace)\"\n [matTooltip]=\"'Manage Members' | trans\"\n >\n <mat-icon svgIcon=\"group-add\"></mat-icon>\n </button>\n <ng-container *ngIf=\"workspace.owner_id === this.currentUser.get('id')\">\n <button\n mat-icon-button\n (click)=\"showCrupdateWorkspaceModal(workspace)\"\n [matTooltip]=\"'Edit workspace' | trans\"\n >\n <mat-icon svgIcon=\"edit\"></mat-icon>\n </button>\n <button\n mat-icon-button\n (click)=\"maybeDeleteWorkspace(workspace)\"\n [matTooltip]=\"'Delete workspace' | trans\"\n >\n <mat-icon svgIcon=\"delete\"></mat-icon>\n </button>\n </ng-container>\n <ng-container *ngIf=\"workspace.owner_id !== this.currentUser.get('id')\">\n <button\n mat-icon-button\n (click)=\"maybeLeaveWorkspace(workspace)\"\n [matTooltip]=\"'Leave workspace' | trans\"\n >\n <mat-icon svgIcon=\"exit-to-app\"></mat-icon>\n </button>\n </ng-container>\n </td>\n </tr>\n </tbody>\n </table>\n <no-results-message\n svgImage=\"shared-workspace.svg\"\n *ngIf=\"datatable.paginator.noResults$ | async\"\n >\n <span primary-text trans>No workspaces have been created yet</span>\n </no-results-message>\n <datatable-footer></datatable-footer>\n</div>\n","import { ChangeDetectionStrategy, Component, Inject, OnInit } from '@angular/core';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {Router} from '@angular/router';\nimport {HttpErrors} from '@common/core/http/errors/http-errors.enum';\nimport {WorkspacesService} from '../workspaces.service';\nimport {Workspace} from '../types/workspace';\nimport {CrupdateWorkspaceModalComponent} from '../crupdate-workspace-modal/crupdate-workspace-modal.component';\nimport {DatatableService} from '@common/datatable/datatable.service';\nimport {BackendErrorResponse} from '@common/core/types/backend-error-response';\nimport {ManageWorkspaceMembersModalComponent} from '../manage-workspace-members-modal/manage-workspace-members-modal.component';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {Observable} from 'rxjs';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport {LEAVE_WORKSPACE_CONFIRMATION} from '../leave-workspace-confirmation';\nimport { WORKSPACE_CONFIG, WorkspaceConfig } from '../workspace-config';\n\n@Component({\n selector: 'workspace-index',\n templateUrl: './workspace-index.component.html',\n styleUrls: ['./workspace-index.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [DatatableService],\n})\nexport class WorkspaceIndexComponent implements OnInit {\n public workspaces$ = this.datatable.data$ as Observable<Workspace[]>;\n constructor(\n public datatable: DatatableService<Workspace>,\n public currentUser: CurrentUser,\n private workspaces: WorkspacesService,\n private toast: Toast,\n private router: Router,\n private modal: Modal,\n @Inject(WORKSPACE_CONFIG) public workspaceConfig: WorkspaceConfig,\n ) {}\n\n ngOnInit() {\n this.datatable.init({\n uri: WorkspacesService.BASE_URI,\n staticParams: {\n userId: this.currentUser.get('id'),\n }\n });\n }\n\n public maybeDeleteWorkspace(workspace: Workspace) {\n this.datatable.confirmResourceDeletion('workspace')\n .subscribe(() => {\n this.workspaces.delete([workspace.id]).subscribe(() => {\n this.datatable.reset();\n this.toast.open('Workspace deleted.');\n }, (errResponse: BackendErrorResponse) => {\n this.toast.open(errResponse.message || HttpErrors.Default);\n });\n });\n }\n\n public showCrupdateWorkspaceModal(workspace?: Workspace) {\n this.datatable.openCrupdateResourceModal(CrupdateWorkspaceModalComponent, {workspace})\n .subscribe();\n }\n\n public openWorkspaceMembersModal(workspace: Workspace) {\n this.modal.open(ManageWorkspaceMembersModalComponent, {workspace});\n }\n\n public filterByUser(): boolean {\n return this.router.url.indexOf('admin') === -1;\n }\n\n public maybeLeaveWorkspace(workspace: Workspace) {\n this.modal.open(ConfirmModalComponent, LEAVE_WORKSPACE_CONFIRMATION)\n .afterClosed()\n .subscribe(confirmed => {\n if (confirmed) {\n this.workspaces.deleteMember(workspace.id, this.currentUser.get('id'))\n .subscribe(() => this.datatable.reset());\n }\n });\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WorkspaceModule } from '../../common/workspaces/workspace.module';\nimport { RouterModule } from '@angular/router';\nimport { WorkspaceIndexComponent } from '../../common/workspaces/workspace-index/workspace-index.component';\n\n@NgModule({\n imports: [RouterModule.forChild([\n {path: '', component: WorkspaceIndexComponent}\n ])],\n exports: [RouterModule]\n})\nclass RoutingModule { }\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule,\n WorkspaceModule,\n RoutingModule\n ]\n})\nexport class WorkspaceWrapperModule { }\n","import {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {InfoPopoverComponent} from '@common/core/ui/info-popover/info-popover.component';\nimport {MatIconModule} from '@angular/material/icon';\nimport {MatButtonModule} from '@angular/material/button';\n\n@NgModule({\n declarations: [InfoPopoverComponent],\n imports: [\n CommonModule,\n\n // material\n MatIconModule,\n MatButtonModule,\n ],\n exports: [InfoPopoverComponent],\n})\nexport class InfoPopoverModule {}\n","import { ConnectedPosition } from '@angular/cdk/overlay';\n\nexport const RIGHT_POSITION: ConnectedPosition[] = [\n {originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: 5},\n {originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: 5},\n];\n","<ng-container *ngIf=\"user\">\n <img [src]=\"user.avatar\" alt=\"\">\n <a [routerLink]=\"url.generate(user)\" target=\"_blank\" class=\"link content\" *ngIf=\"haveUrl\">\n <div>{{user.display_name}}</div>\n <div class=\"email secondary\">{{user.email}}</div>\n </a>\n <div class=\"content\" *ngIf=\"!haveUrl\">\n <div>{{user.display_name}}</div>\n <div class=\"email secondary\">{{user.email}}</div>\n </div>\n</ng-container>\n","import {ChangeDetectionStrategy, Component, Input} from '@angular/core';\nimport {User} from '@common/core/types/models/User';\nimport {UrlGeneratorService} from '@common/core/services/url-generator.service';\n\n@Component({\n selector: 'user-column',\n templateUrl: './user-column.component.html',\n styleUrls: ['./user-column.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {class: 'column-with-image'},\n})\nexport class UserColumnComponent {\n @Input() user: User;\n @Input() showEmail = false;\n haveUrl: boolean;\n\n constructor(public url: UrlGeneratorService) {\n this.haveUrl = !!url['user'];\n }\n}\n","import {ChangeDetectionStrategy, Component, Input} from '@angular/core';\nimport {DatatableService} from '@common/datatable/datatable.service';\nimport {Model} from '@common/core/types/models/model';\nimport {DatatableFilter} from './search-input-with-filters/filter-config/datatable-filter';\n\n@Component({\n selector: 'datatable-filters',\n templateUrl: './datatable-filters.component.html',\n styleUrls: ['./datatable-filters.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DatatableFiltersComponent {\n @Input() pluralName: string;\n @Input() filters: DatatableFilter[];\n\n constructor(public datable: DatatableService<Model>) {}\n\n onFilterChange(filters: string) {\n this.datable.filters$.next({\n filters,\n });\n }\n}\n","<search-input-with-filters\n [searchControl]=\"datable.searchControl\"\n [pluralName]=\"pluralName\"\n [filters]=\"filters\"\n (filterChange)=\"onFilterChange($event)\"\n></search-input-with-filters>\n","<div class=\"page-size\" *ngIf=\"!hidePerPage\">\n <div class=\"page-size-label\" trans>Items per page</div>\n <div class=\"input-container\">\n <select class=\"page-size-input\" [formControl]=\"perPageControl\">\n <option [ngValue]=\"10\">10</option>\n <option [ngValue]=\"15\">15</option>\n <option [ngValue]=\"20\">20</option>\n <option [ngValue]=\"50\">50</option>\n <option [ngValue]=\"100\">100</option>\n </select>\n </div>\n</div>\n<div class=\"range-actions\">\n <div class=\"range-label\" *ngIf=\"from && to && totalRecords\">\n {{from}} - {{to}} {{'of' | trans}} {{totalRecords | number}}\n </div>\n <button type=\"button\" [disabled]=\"!havePrevious || (datable.paginator.loading$ | async)\" class=\"range-button\" (click)=\"previousPage()\" mat-icon-button>\n <mat-icon svgIcon=\"chevron-left\"></mat-icon>\n </button>\n <button type=\"button\" [disabled]=\"!haveNext || (datable.paginator.loading$ | async)\" class=\"range-button\" (click)=\"nextPage()\" mat-icon-button>\n <mat-icon svgIcon=\"chevron-right\"></mat-icon>\n </button>\n</div>\n","import {ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit} from '@angular/core';\nimport {FormControl} from '@angular/forms';\nimport {DatatableService} from '../datatable.service';\nimport {Subscription} from 'rxjs';\nimport {filter, map} from 'rxjs/operators';\n\n@Component({\n selector: 'datatable-footer',\n templateUrl: './datatable-footer.component.html',\n styleUrls: ['./datatable-footer.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DatatableFooterComponent implements OnInit, OnDestroy {\n @Input() hidePerPage = false;\n public perPageControl = new FormControl(15);\n public from: number;\n public to: number;\n public totalRecords: number;\n public havePrevious: boolean;\n public haveNext: boolean;\n private changeRef: Subscription;\n\n constructor(\n public datable: DatatableService<any>,\n private cd: ChangeDetectorRef,\n ) {}\n\n ngOnInit() {\n this.changeRef = this.datable.paginator.response$\n .pipe(filter(r => !!r?.pagination), map(r => r.pagination))\n .subscribe(pagination => {\n this.totalRecords = pagination.total;\n this.to = Math.min((pagination.per_page * pagination.current_page), this.totalRecords);\n this.from = Math.max((this.to - pagination.per_page), 1);\n this.havePrevious = this.datable.paginator.canLoadPrevPage();\n this.haveNext = this.datable.paginator.canLoadNextPage();\n this.perPageControl.setValue(parseInt('' + pagination.per_page), {emitEvent: false});\n this.cd.markForCheck();\n });\n\n this.perPageControl.valueChanges\n .subscribe(perPage => {\n this.datable.paginator.changePerPage(perPage);\n });\n }\n\n ngOnDestroy() {\n this.changeRef.unsubscribe();\n this.datable.destroy();\n }\n\n public previousPage() {\n this.datable.paginator.previousPage();\n }\n\n public nextPage() {\n this.datable.paginator.nextPage();\n }\n}\n","<div class=\"modal-header\">\n <h2 mat-dialog-title>\n <span trans *ngIf=\"!data.workspace\">Create Workspace</span>\n <span trans *ngIf=\"data.workspace\">Update Workspace</span>\n </h2>\n <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n</div>\n\n<form (ngSubmit)=\"confirm()\" ngNativeValidate [formGroup]=\"form\" *ngIf=\"errors$ | async as errors\">\n <mat-dialog-content class=\"many-inputs\">\n <div class=\"input-container name-container\">\n <label for=\"crupdate-workspace-name\" trans>Name</label>\n <input type=\"text\" id=\"crupdate-workspace-name\" formControlName=\"name\" required minlength=\"3\">\n <div class=\"error\" *ngIf=\"errors.name\">{{errors.name}}</div>\n </div>\n </mat-dialog-content>\n\n <mat-dialog-actions>\n <button (click)=\"close()\" type=\"button\" mat-button trans>Cancel</button>\n <button type=\"submit\" mat-raised-button color=\"accent\" [disabled]=\"loading$ | async\" trans>{{data.workspace ? 'Update' : 'Create'}}</button>\n </mat-dialog-actions>\n</form>\n","import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { Toast } from '@common/core/ui/toast.service';\nimport { finalize } from 'rxjs/operators';\nimport { BackendErrorResponse } from '@common/core/types/backend-error-response';\nimport { Workspace } from '../types/workspace';\nimport { WorkspacesService } from '../workspaces.service';\n\nexport interface CrupdateWorkspaceModalData {\n workspace?: Workspace;\n}\n\n@Component({\n selector: 'crupdate-workspace-modal',\n templateUrl: './crupdate-workspace-modal.component.html',\n styleUrls: ['./crupdate-workspace-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CrupdateWorkspaceModalComponent {\n public loading$ = new BehaviorSubject(false);\n public errors$ = new BehaviorSubject<{name?: string}>({});\n public form = new FormGroup({\n name: new FormControl(),\n });\n\n constructor(\n private dialogRef: MatDialogRef<CrupdateWorkspaceModalComponent>,\n @Inject(MAT_DIALOG_DATA) public data: CrupdateWorkspaceModalData,\n private workspaces: WorkspacesService,\n private toast: Toast,\n ) {\n if (data.workspace) {\n this.form.patchValue(data.workspace);\n }\n }\n\n public confirm() {\n this.loading$.next(true);\n const request = this.data.workspace ?\n this.workspaces.update(this.data.workspace.id, this.form.value) :\n this.workspaces.create(this.form.value);\n request.pipe(finalize(() => this.loading$.next(false)))\n .subscribe(response => {\n this.toast.open(this.data.workspace ? 'Workspace updated.' : 'Workspace created.');\n this.close(response.workspace);\n }, (errResponse: BackendErrorResponse) => this.errors$.next(errResponse.errors));\n }\n\n public close(workspace?: Workspace) {\n this.dialogRef.close(workspace);\n }\n}\n","import {ConfirmModalData} from '@common/core/ui/confirm-modal/confirm-modal.component';\n\nexport const LEAVE_WORKSPACE_CONFIRMATION: ConfirmModalData = {\n title: `Leave Workspace`,\n body: `Are you sure you want to leave this workspace?`,\n bodyBold: `All resources you've created in the workspace will be transferred to workspace owner.`,\n ok: 'Leave'\n};\n","export enum WorkspaceMessages {\n LEFT_WORKSPACE = 'You have left the workspace.',\n MEMBER_DELETED = 'Member Deleted.',\n INVITES_SENT = 'Invites Sent.',\n INVITE_RESENT = 'Resent invite.',\n ROLE_ASSIGNED = 'Role Assigned.',\n}\n","<div class=\"modal-header\">\n <h2 mat-dialog-title trans>Manage workspace members</h2>\n <button type=\"button\" (click)=\"close()\" class=\"close-button no-style\" tabindex=\"-1\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n</div>\n\n<mat-dialog-content style=\"overflow: hidden\" #container>\n <div class=\"invite-container\" *ngIf=\"canInvite\" @fadeIn>\n <div class=\"input-container\">\n <label for=\"workspace-emails-input\" trans>Invite by email</label>\n <div class=\"input-with-action\">\n <chip-input id=\"workspace-emails-input\" placeholder=\"Email addresses\" [emailsInput]=\"true\" [formControl]=\"peopleToInvite\"></chip-input>\n <button\n type=\"button\"\n class=\"add-tags-button\"\n mat-flat-button\n color=\"accent\"\n (click)=\"invitePeople()\"\n [disabled]=\"(inviting$ | async) || !(peopleToInvite.valueChanges | async)?.length\"\n trans\n >Invite\n </button>\n </div>\n </div>\n <mat-progress-bar mode=\"indeterminate\" color=\"accent\" *ngIf=\"inviting$ | async\"></mat-progress-bar>\n </div>\n\n <div class=\"header\">\n <mat-icon svgIcon=\"people\"></mat-icon>\n <span class=\"text\" [transValues]=\"{workspace: data.workspace.name}\" trans>Members of :workspace</span>\n </div>\n\n <div class=\"animation-container\">\n <ul class=\"member-list unstyled-list\" *ngIf=\"loadingMembers$ | async\" @fadeOut>\n <li class=\"member-list-item\" *ngFor=\"let i of [1, 2, 3]\">\n <skeleton variant=\"avatar\"></skeleton>\n <div class=\"details\">\n <skeleton></skeleton>\n <skeleton></skeleton>\n </div>\n </li>\n </ul>\n\n <ul class=\"member-list unstyled-list\">\n <li *ngFor=\"let member of members$ | async\" class=\"member-list-item\" @fadeIn (@fadeIn.done)=\"container.style.overflow = 'auto'\">\n <img [src]=\"member.avatar\" alt=\"\">\n <div class=\"details\">\n <div class=\"email\">\n <span>{{member.display_name}}</span>\n &ngsp;\n <span class=\"strong\"\n *ngIf=\"currentUser.get('id') === member.id\" trans>(You)</span>\n <span *ngIf=\"member.model_type === 'invite'\">\n ·\n <span trans>Invited</span>\n <ng-container *ngIf=\"canInvite\">\n ·\n <button type=\"button\" class=\"no-style resend-invite-button\"\n [disabled]=\"inviting$ | async\"\n (click)=\"maybeResendInvite(member)\" trans>Resend Invite</button>\n </ng-container>\n </span>\n </div>\n <div class=\"invited_at\">{{member.email}}</div>\n </div>\n <div class=\"actions\">\n <button type=\"button\" mat-stroked-button class=\"role-trigger-button\"\n [class.not-clickable]=\"member.is_owner || !canEdit\"\n [matMenuTriggerFor]=\"selectRoleMenu\"\n [matMenuTriggerData]=\"{member: member}\">\n <span trans>{{member.role_name}}</span>\n <mat-icon svgIcon=\"keyboard-arrow-down\"\n class=\"dropdown-icon\"></mat-icon>\n </button>\n <button type=\"button\" class=\"delete-member-button\"\n (click)=\"maybeDeleteMember(member)\"\n *ngIf=\"member.is_owner || currentUser.get('id') !== member.id\"\n [class.visually-hidden]=\"member.is_owner || !canDelete\"\n mat-icon-button [disabled]=\"deleting$ | async\">\n <mat-icon svgIcon=\"close\"></mat-icon>\n </button>\n <button type=\"button\" class=\"delete-member-button\"\n [matTooltip]=\"'Leave workspace' | trans\"\n (click)=\"maybeLeaveWorkspace(member)\"\n *ngIf=\"!member.is_owner && currentUser.get('id') === member.id\"\n mat-icon-button [disabled]=\"deleting$ | async\">\n <mat-icon svgIcon=\"exit-to-app\"></mat-icon>\n </button>\n </div>\n </li>\n </ul>\n </div>\n</mat-dialog-content>\n\n<mat-menu #selectRoleMenu=\"matMenu\">\n <ng-template matMenuContent let-member=\"member\">\n <div class=\"multiline-mat-menu-item with-icon\"\n [class.active]=\"member.role_id === role.id\" mat-menu-item\n (click)=\"changeRole(member, role)\"\n *ngFor=\"let role of workspaceRoles$ | async\" trans>\n <mat-icon svgIcon=\"check\"\n [class.visually-hidden]=\"member.role_id !== role.id\"></mat-icon>\n <div class=\"menu-item-content\">\n <div class=\"title\" trans>{{role.name}}</div>\n <div class=\"description\" trans>{{role.description}}</div>\n </div>\n </div>\n </ng-template>\n</mat-menu>\n\n\n","import {\n ChangeDetectionStrategy,\n Component,\n Inject,\n OnInit,\n} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\nimport {FormControl} from '@angular/forms';\nimport {Role} from '@common/core/types/models/Role';\nimport {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';\nimport {WorkspacesService} from '../workspaces.service';\nimport {Toast} from '@common/core/ui/toast.service';\nimport {ValueLists} from '@common/core/services/value-lists.service';\nimport {Workspace} from '../types/workspace';\nimport {WorkspaceMember} from '../types/workspace-member';\nimport {WorkspaceInvite} from '../types/workspace-invite';\nimport {finalize} from 'rxjs/operators';\nimport {CurrentUser} from '@common/auth/current-user';\nimport {WorkspaceMessages} from '../workspace-messages';\nimport {ConfirmModalComponent} from '@common/core/ui/confirm-modal/confirm-modal.component';\nimport {Modal} from '@common/core/ui/dialogs/modal.service';\nimport {LEAVE_WORKSPACE_CONFIRMATION} from '../leave-workspace-confirmation';\nimport {SKELETON_ANIMATIONS} from '@common/core/ui/skeleton/skeleton-animations';\n\nexport interface ManageWorkspaceMembersModalData {\n workspace?: Workspace;\n}\n\ntype MemberOrInvite = WorkspaceMember | WorkspaceInvite;\n\n@Component({\n selector: 'manage-workspace-members-modal',\n templateUrl: './manage-workspace-members-modal.component.html',\n styleUrls: ['./manage-workspace-members-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: SKELETON_ANIMATIONS,\n})\nexport class ManageWorkspaceMembersModalComponent implements OnInit {\n public inviting$ = new BehaviorSubject(false);\n public deleting$ = new BehaviorSubject(false);\n public loadingMembers$ = new BehaviorSubject(false);\n public workspaceRoles$ = new BehaviorSubject<Role[]>([]);\n public members$ = new BehaviorSubject<\n (WorkspaceMember | WorkspaceInvite)[]\n >([]);\n public peopleToInvite = new FormControl([]);\n\n public canInvite = false;\n public canEdit = false;\n public canDelete = false;\n\n constructor(\n private dialogRef: MatDialogRef<ManageWorkspaceMembersModalComponent>,\n @Inject(MAT_DIALOG_DATA) public data: ManageWorkspaceMembersModalData,\n private workspaces: WorkspacesService,\n private toast: Toast,\n private valueLists: ValueLists,\n public currentUser: CurrentUser,\n private modal: Modal\n ) {}\n\n ngOnInit() {\n this.loadingMembers$.next(true);\n this.valueLists.get(['workspaceRoles']).subscribe(response => {\n this.workspaceRoles$.next(response.workspaceRoles);\n });\n this.workspaces\n .get(this.data.workspace.id)\n .pipe(finalize(() => this.loadingMembers$.next(false)))\n .subscribe(response => {\n this.members$.next([\n ...response.workspace.invites,\n ...response.workspace.members,\n ]);\n this.setCurrentUserPermissions();\n });\n }\n\n public close(workspace?: Workspace) {\n this.dialogRef.close(workspace);\n }\n\n public invitePeople() {\n const emails = this.peopleToInvite.value.filter(email => {\n return !this.members$.value.find(m => m.email === email);\n });\n if (!emails.length) {\n this.peopleToInvite.reset();\n this.toast.open('All invited people are already members.');\n return;\n }\n const payload = {\n emails,\n roleId: (\n this.workspaceRoles$.value.find(r => r.default) ||\n this.workspaceRoles$.value[0]\n ).id,\n };\n this.inviting$.next(true);\n this.workspaces\n .invitePeople(this.data.workspace.id, payload)\n .pipe(finalize(() => this.inviting$.next(false)))\n .subscribe(response => {\n this.members$.next([\n ...this.members$.value,\n ...response.invites,\n ]);\n this.peopleToInvite.reset();\n this.toast.open(WorkspaceMessages.INVITES_SENT);\n });\n }\n\n public resendInvite(invite: WorkspaceInvite) {\n this.inviting$.next(true);\n this.workspaces\n .resendInvite(this.data.workspace.id, invite.id)\n .pipe(finalize(() => this.inviting$.next(false)))\n .subscribe(() => {\n this.toast.open(WorkspaceMessages.INVITE_RESENT);\n });\n }\n\n public changeRole(member: WorkspaceMember | WorkspaceInvite, role: Role) {\n this.workspaces\n .changeRole(this.data.workspace.id, member, role.id)\n .subscribe(() => {\n this.toast.open(WorkspaceMessages.ROLE_ASSIGNED);\n const members = [...this.members$.value];\n const i = members.findIndex(m => m.id === member.id);\n members[i].role_name = role.name;\n members[i].role_id = role.id;\n this.members$.next(members);\n });\n }\n\n public deleteMember(member: MemberOrInvite) {\n this.deleting$.next(true);\n const request =\n member.model_type === 'member'\n ? this.workspaces.deleteMember(\n this.data.workspace.id,\n member.id\n )\n : this.workspaces.deleteInvite(member.id);\n request\n .pipe(finalize(() => this.deleting$.next(false)))\n .subscribe(() => {\n const value = [...this.members$.value];\n const i = value.findIndex(\n (m: MemberOrInvite) =>\n member.id && m.model_type === member.model_type\n );\n value.splice(i, 1);\n this.members$.next(value);\n if (member.id === this.currentUser.get('id')) {\n this.close();\n this.toast.open(WorkspaceMessages.LEFT_WORKSPACE);\n } else {\n this.toast.open(WorkspaceMessages.MEMBER_DELETED);\n }\n });\n }\n\n public maybeDeleteMember(member: MemberOrInvite) {\n this.modal\n .show(ConfirmModalComponent, {\n title: `Delete Member`,\n body: `Are you sure you want to delete this member?`,\n bodyBold:\n 'All workspace resources created by this member will be transferred to workspace owner.',\n ok: 'Delete',\n })\n .afterClosed()\n .subscribe(confirmed => {\n if (confirmed) {\n this.deleteMember(member);\n }\n });\n }\n\n public maybeResendInvite(invite: WorkspaceInvite) {\n this.modal\n .show(ConfirmModalComponent, {\n title: `Resend Invite`,\n body: `Are you sure you want to send this invite again?`,\n ok: 'Resend',\n })\n .afterClosed()\n .subscribe(confirmed => {\n if (confirmed) {\n this.resendInvite(invite);\n }\n });\n }\n\n public maybeLeaveWorkspace(member: WorkspaceMember) {\n this.modal\n .show(ConfirmModalComponent, LEAVE_WORKSPACE_CONFIRMATION)\n .afterClosed()\n .subscribe(confirmed => {\n if (confirmed) {\n this.deleteMember(member);\n }\n });\n }\n\n private setCurrentUserPermissions() {\n const member = this.members$.value.find(\n m => m.id === this.currentUser.get('id')\n ) as WorkspaceMember;\n this.canInvite =\n member.is_owner ||\n !!member.permissions.find(\n p => p.name === 'workspace_members.invite'\n );\n this.canEdit =\n member.is_owner ||\n !!member.permissions.find(\n p => p.name === 'workspace_members.update'\n );\n this.canDelete =\n member.is_owner ||\n !!member.permissions.find(\n p => p.name === 'workspace_members.delete'\n );\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CrupdateWorkspaceModalComponent } from './crupdate-workspace-modal/crupdate-workspace-modal.component';\nimport { ManageWorkspaceMembersModalComponent } from './manage-workspace-members-modal/manage-workspace-members-modal.component';\nimport { WorkspaceIndexComponent } from './workspace-index/workspace-index.component';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { TranslationsModule } from '../core/translations/translations.module';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { DatatableModule } from '../datatable/datatable.module';\nimport { InfoPopoverModule } from '../core/ui/info-popover/info-popover.module';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { FormatPipesModule } from '../core/ui/format-pipes/format-pipes.module';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { SkeletonModule } from '../core/ui/skeleton/skeleton.module';\nimport { ChipsModule } from '../core/ui/chips/chips.module';\nimport { MatMenuModule } from '@angular/material/menu';\n\n@NgModule({\n declarations: [\n CrupdateWorkspaceModalComponent,\n ManageWorkspaceMembersModalComponent,\n WorkspaceIndexComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n TranslationsModule,\n DatatableModule,\n InfoPopoverModule,\n FormatPipesModule,\n SkeletonModule,\n ChipsModule,\n\n // material\n MatIconModule,\n MatButtonModule,\n MatDialogModule,\n MatRadioModule,\n MatTooltipModule,\n MatProgressBarModule,\n MatMenuModule,\n ],\n exports: [\n CrupdateWorkspaceModalComponent,\n ManageWorkspaceMembersModalComponent,\n WorkspaceIndexComponent,\n ]\n})\nexport class WorkspaceModule {\n static components = {\n crupdateModal: CrupdateWorkspaceModalComponent,\n manageMembers: ManageWorkspaceMembersModalComponent,\n };\n}\n"]}