{"version":3,"file":"6154.2c89d232b6ecd832.js","mappings":"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","names":["ProjectMemberModalComponent","_ProjectMemberModalComponent","constructor","modalController","this","viewOnly","isStudio","showRecentStacks","dismiss","dismissed","i0","i1","selectors","inputs","userId","projects","standalone","features","decls","vars","consts","template","rf","ctx","BaseModalComponent","ProjectMemberComponent","IonButton","TranslatePipe","projectFormGroup_r4","controls","currentUserMemberRole","value","project","privacy","$event","_r6","i_r7","index","ctx_r1","onActiveChanged","defaultRoleFormValue","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_div_16_ion_select_1_Template","_r5","onRoleChanged","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_div_16_ion_select_option_3_Template","addMember","isActive","role","_r3","$implicit","preventDefault","navProject","id","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_span_13_Template","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_span_14_Template","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_span_15_Template","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_div_16_Template","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_div_17_Template","hero","projectPosterFallback","title","members","length","isPendingUser","canEditProjectMembers","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_ion_item_2_Template","_r1","saveChanges","ProjectMemberProjectsComponent_ng_container_0_ng_container_3_Template","projectsForm","projectsControls","ProjectMemberProjectsComponent_ng_template_1_div_1_Template","ProjectMemberProjectsComponent_ng_template_1_ng_template_2_Template","doneLoading","noResults_r8","PAGE","ProjectMemberProjectsComponent","_ProjectMemberProjectsComponent","member","_member$","next","member$","asObservable","formBuilder","navCtrl","userService","projectService","toaster","projectMemberService","showMyRole","closeModal","EventEmitter","roleChanged","isSaving","memberProjects","DEFAULT_PROJECT_POSTER","BehaviorSubject","onDestroy$","Subject","ngOnInit","myProjects$","getMyProjects","watchMemberUpdates","userId$","pipe","filter","Boolean","take","delay","subscribe","currentUserId","sort","sortProjectTitleAlpha","buildForm","ngOnDestroy","complete","m","loaded","Array","isArray","map","_uniqBy","memberProjectIds","p","projectId","tap","pending","studioProjects$","iif","condition","trueResult","falseResult","defer","of","aFoundProjects","combineLatest","takeUntil","myProjects","switchMap","getProjectsFromStoreByIds","foundProjects","timeout","first","distinctUntilChanged","curr","prev","catchError","err","TimeoutError","console","warn","EMPTY","isViewableByUserId","projectMemberForms","UntypedFormArray","getUserMemberRole","projMembers","userMember","find","item","canEditMembers","isProjectAdmin","projectFormGroup","group","disabled","push","emit","crewMember","username","PROJECT_MEMBER_ROLE","CREW","OWNER","_get","event","prop","detail","val","proj","projectMember","updateProjectMember","presentSavedToast","log","error","present","message","_this","_asyncToGenerator","invalid","pristine","_each","_this2","navigateForward","PROJECT_DETAIL_ROUTE","i2","i3","i4","i5","i6","outputs","ProjectMemberProjectsComponent_ng_container_0_Template","ProjectMemberProjectsComponent_ng_template_1_Template","loadingProjects_r9","NgIf","FormsModule","ReactiveFormsModule","IonList","NgFor","IonItem","IonThumbnail","ImageFallbackDirective","IonLabel","IonIcon","IonSelect","IonSelectOption","IonText","IonSpinner","styles","_r2","ctx_r2","showingBio","user_r4","bio","location","joined","ProjectMemberComponent_div_4_div_1_ion_button_4_Template","ProjectMemberComponent_div_4_div_1_div_5_Template","ProjectMemberComponent_div_4_div_1_div_23_Template","ProjectMemberComponent_div_4_div_1_div_24_Template","avatarUrl","avatarFallback","name","tmp_12_0","recentStacks","items$","stacks","numClipsWatched","list_r6","ngIf","loadMoreStacks","_c2","layoutType","Carousel","_c1","stackList_r7","nextToken","loading","ProjectMemberComponent_div_4_div_2_div_8_app_stack_list_1_Template","list$","ProjectMemberComponent_div_4_div_2_div_8_Template","_c0","ProjectMemberComponent_div_4_div_1_Template","ProjectMemberComponent_div_4_div_2_Template","noUserTpl_r8","tmp_6_0","_ProjectMemberComponent","_userId","selectUserId","listIdMemberStacks","store","translate","enableMessaging","ENABLE_FEATURE_USER_MESSAGING","enableFollow","ENABLE_FEATURE_USER_FOLLOW","selectedUser$","selected$","DEFAULT_USER_AVATAR_TERTIARY","LAYOUT_TYPE","label","_ref","user","createdAt","updatedAt","get","res","Utils","daysAgo","Date","getUserAvatarUrl","select","selectList","selectStackListItems","dispatch","loadFilteredStacks","listId","filters","type","FilterEntityTypes","Recent","_x","apply","arguments","list","loadMoreFilteredStacks","followCrewMember","messageCrewMember","_this3","saveProjectChanges","viewQuery","ProjectMemberComponent_ng_template_0_Template","ProjectMemberComponent_ng_template_2_Template","ProjectMemberComponent_div_4_Template","loadingTpl_r9","ListTitleComponent","StackListComponent","AsyncPipe","module","exports","arrayEach","array","iteratee","identity","require","castFunction","baseEach","forEach","collection","baseIteratee","baseUniq","uniqBy"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/project-members/project-member-modal/project-member-modal.component.ts","./src/app/project-members/project-member-modal/project-member-modal.component.html","./src/app/project-members/project-member-projects/project-member-projects.component.html","./src/app/project-members/project-member-projects/project-member-projects.component.ts","./node_modules/rxjs/dist/esm/internal/observable/iif.js","./src/app/project-members/project-member/project-member.component.html","./src/app/project-members/project-member/project-member.component.ts","./node_modules/lodash/_arrayEach.js","./node_modules/lodash/_castFunction.js","./node_modules/lodash/each.js","./node_modules/lodash/forEach.js","./node_modules/lodash/uniqBy.js"],"sourcesContent":["/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { ModalController, IonButton } from '@ionic/angular/standalone';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { BaseModalComponent } from '@app/shared/components/ui/modal/base-modal.component';\nimport { Project } from '@app/projects/shared/project.model';\nimport { ProjectMemberComponent } from '../project-member/project-member.component';\n\n@Component({\n selector: 'fs-project-member-modal',\n templateUrl: './project-member-modal.component.html',\n styleUrls: ['./project-member-modal.component.scss'],\n standalone: true,\n imports: [BaseModalComponent, ProjectMemberComponent, IonButton, TranslatePipe],\n})\nexport class ProjectMemberModalComponent {\n @Input() userId: string;\n @Input() projects: Project[];\n @Input() viewOnly = true;\n @Input() isStudio = false;\n @Input() showRecentStacks = true;\n\n constructor(private modalController: ModalController) {}\n\n dismiss() {\n this.modalController.dismiss({\n dismissed: true,\n });\n }\n}\n","<fs-base-modal mode=\"light\">\n <div class=\"col\">\n <fs-project-member\n [userId]=\"userId\"\n [projects]=\"projects\"\n [viewOnly]=\"viewOnly\"\n [isStudio]=\"isStudio\"\n [showRecentStacks]=\"showRecentStacks\"\n (dismiss)=\"dismiss()\"\n ></fs-project-member>\n\n <div class=\"col ion-text-center ion-padding ion-margin-top\">\n <ion-button color=\"primary\" fill=\"clear\" size=\"medium\" (click)=\"dismiss()\">\n {{ 'COMMON.DONE' | translate }}\n </ion-button>\n </div>\n </div>\n\n</fs-base-modal>\n","<ng-container\n *ngIf=\"(addMember || memberProjects?.length > 0) && projectsForm; else loadingProjects\"\n>\n <form [formGroup]=\"projectsForm\" (ngSubmit)=\"saveChanges()\">\n <ion-list class=\"list\" lines=\"none\">\n <ng-container\n *ngFor=\"let projectFormGroup of projectsControls; let i = index\"\n >\n <ng-container [formGroup]=\"projectFormGroup\">\n <ion-item\n *ngIf=\"\n projectFormGroup.value.canEditProjectMembers ||\n projectFormGroup.controls.isActive.value\n \"\n >\n <ion-thumbnail slot=\"start\">\n <img src=\"{{ projectFormGroup.value.project.hero }}\" [fallback]=\"projectPosterFallback\" />\n </ion-thumbnail>\n\n <div class=\"list__content\">\n <ion-label>\n <div style=\"display: flex\">\n <a href=\"\" (click)=\"$event.preventDefault(); navProject(projectFormGroup.value.project.id)\" title=\"View Project\">{{\n projectFormGroup.value.project.title\n }}</a>\n </div>\n <div>\n <small>\n <span class=\"margin-right\">\n <ion-icon name=\"person\"></ion-icon>\n {{ projectFormGroup.value.project.members?.length }}\n </span>\n <span\n *ngIf=\"projectFormGroup.controls.currentUserMemberRole.value\"\n class=\"margin-right\"\n >\n {{ 'COMMON.ME' | translate }}: {{ projectFormGroup.controls.currentUserMemberRole.value }}\n </span>\n <span *ngIf=\"projectFormGroup.value.project.privacy !== 'PUBLIC'\" class=\"margin-right\">\n {{ projectFormGroup.value.project.privacy }}\n </span>\n <span *ngIf=\"isPendingUser\">\n [ {{ 'COMMON.PENDING_USER' | translate }} ]\n </span>\n </small>\n </div>\n </ion-label>\n\n <div\n class=\"list__content__actions\"\n *ngIf=\"projectFormGroup.value.canEditProjectMembers\"\n >\n <ion-select *ngIf=\"!addMember && (projectFormGroup.value.isActive || projectFormGroup.value.role !== defaultRoleFormValue)\" \n name=\"isActive\"\n formControlName=\"isActive\"\n interface=\"popover\"\n aria-label=\"Is Active?\"\n (ionChange)=\"onActiveChanged($event, i)\"\n >\n <ion-select-option [value]=\"true\">{{ 'COMMON.ACTIVE' | translate }}</ion-select-option>\n <ion-select-option [value]=\"false\"\n >{{ 'COMMON.INACTIVE' | translate }}</ion-select-option\n >\n </ion-select>\n\n <ion-select\n name=\"role\"\n formControlName=\"role\"\n interface=\"popover\"\n aria-label=\"Role\"\n (ionChange)=\"onRoleChanged($event, i)\"\n >\n <!-- error in ion-select type? aria-label=\"{{ 'COMMON.ROLE' | translate }}\" -->\n <ion-select-option \n *ngIf=\"defaultRoleFormValue !== 'PRODUCER' && defaultRoleFormValue !== 'CREW'\" \n [value]=\"defaultRoleFormValue\">{{ defaultRoleFormValue }}...</ion-select-option>\n <ion-select-option value=\"PRODUCER\">{{ 'COMMON.PRODUCER' | translate }}</ion-select-option>\n <ion-select-option value=\"CREW\">{{ 'COMMON.CREW' | translate }}</ion-select-option>\n </ion-select>\n </div>\n <div\n class=\"list__content__actions\"\n style=\"flex-basis: 0\"\n *ngIf=\"!projectFormGroup.value.canEditProjectMembers\"\n >\n <ion-text slot=\"end\" class=\"\">\n {{ projectFormGroup.controls.role.value }}\n </ion-text>\n </div>\n </div>\n </ion-item>\n </ng-container>\n </ng-container>\n </ion-list>\n </form>\n</ng-container>\n\n<ng-template #loadingProjects>\n <div class=\"ion-padding ion-text-center ion-margin\">\n <div *ngIf=\"!doneLoading; else noResults\" class=\"loading\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n <ng-template #noResults>\n <div>{{ 'COMMON.NO_PROJECTS' | translate }}</div>\n </ng-template>\n </div>\n</ng-template>\n","/** @format */\n\nimport _get from 'lodash/get';\nimport _each from 'lodash/each';\nimport _uniqBy from 'lodash/uniqBy';\nimport { Component, OnInit, Input, OnDestroy, Output, EventEmitter } from '@angular/core';\nimport {\n UntypedFormArray,\n UntypedFormBuilder,\n UntypedFormGroup,\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { NgIf, NgFor } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport {\n NavController,\n IonList,\n IonItem,\n IonThumbnail,\n IonLabel,\n IonIcon,\n IonSelect,\n IonSelectOption,\n IonText,\n IonSpinner,\n} from '@ionic/angular/standalone';\nimport { BehaviorSubject, combineLatest, EMPTY, iif, Observable, of, Subject, TimeoutError } from 'rxjs';\nimport {\n takeUntil,\n filter,\n take,\n catchError,\n map,\n tap,\n switchMap,\n delay,\n distinctUntilChanged,\n timeout,\n} from 'rxjs/operators';\nimport { PROJECT_DETAIL_ROUTE } from '@app/app.routes';\nimport { UserService } from '@app/core/services/user.service';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { User } from '@app/shared/models/user.model';\nimport { ImageFallbackDirective } from '@app/shared/directives/image-fallback.directive';\nimport {\n DEFAULT_PROJECT_POSTER,\n DEFAULT_PROJECT_POSTER_WEDDINGS,\n isViewableByUserId,\n Project,\n sortProjectTitleAlpha,\n} from '@app/projects/shared/project.model';\nimport { ProjectService } from '@app/projects/shared/services/project.service';\nimport { ProjectMember, PROJECT_MEMBER_ROLE } from '@app/project-members/shared/project-member.model';\nimport { ProjectMemberService } from '@app/project-members/shared/services/project-member.service';\n\nconst DEBUG_LOGS = false;\n/* timeout and continue if you have not finished loading projects, in ms */\nconst TIMEOUT_PROJECTS = 3000;\n\nconst PAGE = '[ProjectMemberProjects]';\n\n@Component({\n selector: 'app-project-member-projects',\n templateUrl: './project-member-projects.component.html',\n styleUrls: ['./project-member-projects.component.scss'],\n standalone: true,\n imports: [\n NgIf,\n FormsModule,\n ReactiveFormsModule,\n IonList,\n NgFor,\n IonItem,\n IonThumbnail,\n ImageFallbackDirective,\n IonLabel,\n IonIcon,\n IonSelect,\n IonSelectOption,\n IonText,\n IonSpinner,\n TranslatePipe,\n ],\n})\nexport class ProjectMemberProjectsComponent implements OnInit, OnDestroy {\n @Input() showMyRole = true;\n @Input() isStudio = false; // if my studio, add myProjects\n @Input() addMember = false; // if adding Member\n @Input() projects: Project[]; // if adding crew\n @Input() viewOnly = false;\n @Input()\n set member(value: User) {\n if (value && value.userId) {\n this._member$.next(value);\n }\n }\n // get member(): User {\n // return this._member;\n // }\n\n @Output() closeModal = new EventEmitter<void>();\n @Output() roleChanged = new EventEmitter<{ role: string; project: Project }>();\n\n /**\n * if on studio\n */\n myProjects$: Observable<Project[]>;\n\n defaultRoleFormValue = 'Select';\n\n projectsForm: UntypedFormGroup;\n projectsControls: UntypedFormGroup[];\n\n doneLoading = false;\n isSaving = false;\n /** @see User.model.pending */\n isPendingUser = false;\n\n memberProjects: ProjectMember[] = [];\n /** @todo: how to change based on getProjectDefaultHeroUrl, pass as fn? */\n projectPosterFallback = DEFAULT_PROJECT_POSTER;\n\n /**\n * Improving logic for getStudioCrew with observables 2021-08-08\n */\n get member$(): Observable<User> {\n return this._member$.asObservable();\n }\n private _member$: BehaviorSubject<User> = new BehaviorSubject({ userId: null });\n\n private onDestroy$ = new Subject<void>();\n\n constructor(\n private formBuilder: UntypedFormBuilder,\n private navCtrl: NavController,\n private userService: UserService,\n private projectService: ProjectService,\n private toaster: ToasterService,\n private projectMemberService: ProjectMemberService\n ) {}\n\n ngOnInit() {\n if (this.isStudio) {\n this.defaultRoleFormValue = 'Add as';\n this.myProjects$ = this.projectService.getMyProjects();\n }\n\n this.watchMemberUpdates();\n\n if (this.addMember) {\n // default to crew for the add-member modal\n this.defaultRoleFormValue = 'CREW';\n this.userService.userId$.pipe(filter(Boolean), take(1), delay(300)).subscribe((currentUserId: string) => {\n DEBUG_LOGS && console.log(`${PAGE} addMember ${currentUserId} projects:`, this.projects);\n this.projects = (this.projects || []).sort(sortProjectTitleAlpha);\n this.buildForm({ projects: this.projects, currentUserId });\n });\n }\n }\n\n ngOnDestroy() {\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n\n watchMemberUpdates() {\n DEBUG_LOGS && console.log(`${PAGE} watchMemberUpdates... `, this._member$.getValue());\n // watch member subject for updates, if the keys that affect the form were updated, re-create the form\n const member$ = this.member$.pipe(\n filter((m) => m && m.loaded && Array.isArray(m.memberProjects)),\n // distinctUntilChanged((curr, prev) => curr.length === prev.length),\n // remove duplicates\n map((member) => ({ ...member, memberProjects: _uniqBy(member.memberProjects, 'projectId') })),\n map((member) => ({\n member,\n memberProjectIds: member.memberProjects.filter((p) => p && p.projectId).map((p) => p.projectId),\n })),\n tap(({ member, memberProjectIds }) => {\n // this.member = member; // setting this here causes a \"Maximum call stack size exceeded error\"...\n this.memberProjects = member.memberProjects;\n if (memberProjectIds.length < 1) {\n this.doneLoading = true;\n }\n this.isPendingUser = member?.pending ?? false;\n DEBUG_LOGS && console.log(`${PAGE} watchMemberUpdates tap member$ `, { memberProjectIds });\n }),\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n filter(({ member, memberProjectIds }) => memberProjectIds.length > 0)\n );\n\n const studioProjects$ = iif(() => this.isStudio, this.myProjects$, of([]));\n\n let aFoundProjects = [];\n combineLatest([member$, this.userService.userId$, studioProjects$])\n .pipe(\n takeUntil(this.onDestroy$),\n map(([{ member, memberProjectIds }, currentUserId, myProjects]) => ({\n member,\n memberProjectIds,\n currentUserId,\n myProjects,\n })),\n switchMap(({ member, memberProjectIds, currentUserId, myProjects }) =>\n this.projectService.getProjectsFromStoreByIds(memberProjectIds).pipe(\n map((projects: Project[]) => {\n const foundProjects = (projects || []).filter((p) => p && p.id && p.id.length > 0);\n // save them for the end?\n if (foundProjects.length !== aFoundProjects.length) {\n aFoundProjects = foundProjects;\n }\n return {\n projects,\n foundProjects,\n member,\n memberProjectIds,\n currentUserId,\n myProjects,\n };\n }),\n timeout({\n first: TIMEOUT_PROJECTS,\n // with: (args) => throwError(() => args)\n }),\n distinctUntilChanged(({ foundProjects: curr }, { foundProjects: prev }) => curr.length === prev.length),\n // filter that they are all there ...what if some are private?...\n filter(({ projects, foundProjects }) => projects.length === foundProjects.length),\n catchError((err) => {\n if (err instanceof TimeoutError) {\n DEBUG_LOGS && console.log(\"timed out, let's use the ones we've found\", { aFoundProjects, err });\n return of({\n projects: aFoundProjects,\n member,\n myProjects,\n currentUserId,\n });\n }\n console.warn('sth else happened', err);\n return EMPTY;\n }),\n // eslint-disable-next-line @typescript-eslint/no-shadow\n map(({ projects, member, currentUserId, myProjects }) => {\n DEBUG_LOGS &&\n console.log(\n `watchMemberUpdates combineLatest projectService.getProjectsFromStoreByIds post-filter:`,\n projects\n );\n return {\n member,\n projects: projects.filter((p) => isViewableByUserId(currentUserId, p)).sort(sortProjectTitleAlpha),\n myProjects,\n currentUserId,\n };\n })\n )\n )\n // ,tap((data) => DEBUG_LOGS && console.log(`watchMemberUpdates tap combineLatest post SwitchMap:`, data))\n )\n .subscribe(({ member, projects, currentUserId, myProjects }) => {\n DEBUG_LOGS && console.log('handleMemberUpdates res:', { member, projects, currentUserId, myProjects });\n this.projects = _uniqBy([...myProjects, ...projects], 'id');\n this.buildForm({ member, projects: this.projects, currentUserId });\n });\n }\n\n // /**\n // * @deprecated using observable\n // */\n // memberUpdated() {\n // DEBUG_LOGS && console.log(`${PAGE} member updated`, this.member);\n // // member input was updated, if the keys that affect the form were updated, re-create the form\n // if (Array.isArray(this.member.memberProjects)) {\n // const memberProjectIds = this.member.memberProjects.filter(p => p && p.projectId).map(p => p.projectId);\n // if (memberProjectIds.length < 1) {\n // this.doneLoading = true;\n // return;\n // }\n\n // this.projectService.getProjectsFromStoreByIds(memberProjectIds).pipe(\n // filter(Array.isArray),\n // // filter that they are all there\n // filter((projects: Project[]) => projects.length === projects.filter((p) => p && p.id && p.id.length > 0).length),\n // take(1),\n // ).subscribe((projects: Project[]) => {\n // DEBUG_LOGS && console.warn(`${PAGE} projectsFromStore:`, { projects, memberProjectIds });\n // this.projects = projects.sort(sortProjectTitleAlpha);\n // this.buildForm();\n // });\n // }\n // }\n\n buildForm({\n projects = [],\n member = {},\n currentUserId = '',\n }: {\n projects: Project[];\n member?: Partial<User>;\n currentUserId: string;\n }) {\n if (!Array.isArray(projects)) {\n console.warn(`${PAGE} buildForm - projects !Array:`, projects);\n return;\n }\n\n const projectMemberForms = new UntypedFormArray([]);\n\n const getUserMemberRole = (userId, projMembers = []) => {\n const userMember = projMembers.find((item) => item.userId === userId);\n return userMember && userMember.role ? userMember.role : '';\n };\n\n for (const project of projects) {\n if (!project) {\n // one of the projects is not yet loaded, we need to skip this one for now, or wait longer\n DEBUG_LOGS && console.warn(`${PAGE} buildForm - missing project? (projects:`, projects);\n continue;\n }\n\n const projMembers = Array.isArray(project.members) ? project.members : [];\n\n if (this.addMember) {\n const canEditMembers = this.projectService.isProjectAdmin(project, currentUserId);\n\n const currentUserMemberRole =\n this.showMyRole && currentUserId ? getUserMemberRole(currentUserId, projMembers) : '';\n\n DEBUG_LOGS &&\n console.log(`${PAGE} buildForm addMember...`, {\n projectId: project.id,\n // role: [{value: 'none', disabled: !canEditMembers}],\n canEditProjectMembers: canEditMembers,\n currentUserMemberRole,\n project,\n });\n\n if (canEditMembers) {\n // add-member modal - the projectId is known and i am admin\n this.defaultRoleFormValue = 'CREW';\n const projectFormGroup = this.formBuilder.group({\n projectId: [project.id],\n // userId: [crewMember.userId],\n // username: [crewMember.username || crewMember.userId],\n isActive: [{ value: true, disabled: true }],\n role: [{ value: this.defaultRoleFormValue, disabled: !canEditMembers }],\n canEditProjectMembers: [canEditMembers],\n currentUserMemberRole: [currentUserMemberRole],\n project,\n });\n\n projectMemberForms.push(projectFormGroup);\n\n // notify parent that we selected CREW, update form values\n this.roleChanged.emit({ role: this.defaultRoleFormValue, project });\n }\n } else {\n // !this.addMember\n if (!member || !Array.isArray(member.memberProjects)) {\n console.warn(`${PAGE} No member.memberProjects`, { member, project });\n continue;\n }\n const crewMember = member.memberProjects.find((p) => p && p.projectId && p.projectId === project.id) || {\n // create a temp member as inactive\n userId: member.userId,\n username: member.username,\n isActive: false,\n role: PROJECT_MEMBER_ROLE.CREW,\n };\n\n const canEditProjectMembers =\n this.viewOnly || crewMember.role === PROJECT_MEMBER_ROLE.OWNER\n ? false\n : this.projectService.isProjectAdmin(project, currentUserId);\n\n const currentUserMemberRole =\n this.showMyRole && currentUserId ? getUserMemberRole(currentUserId, projMembers) : '';\n\n // DEBUG_LOGS && console.log(`${PAGE} buildForm:`, { crewMember, canEditProjectMembers, projMembers, project });\n\n const projectFormGroup = this.formBuilder.group({\n projectId: [project.id],\n userId: [crewMember.userId],\n username: [crewMember.username || crewMember.userId],\n isActive: [{ value: crewMember.isActive ? true : false, disabled: !canEditProjectMembers }],\n role: [\n { value: crewMember.role ? crewMember.role : this.defaultRoleFormValue, disabled: !canEditProjectMembers },\n ],\n canEditProjectMembers: [canEditProjectMembers],\n currentUserMemberRole: [currentUserMemberRole],\n project,\n });\n\n projectMemberForms.push(projectFormGroup);\n }\n }\n\n this.projectsForm = this.formBuilder.group({\n projects: projectMemberForms,\n });\n\n this.projectsControls = _get(this.projectsForm.controls.projects, 'controls');\n }\n\n onActiveChanged(event, index) {\n const prop = 'isActive';\n try {\n if (event && event.detail && (event.detail.value || typeof event.detail.value === 'boolean')) {\n const val = event.detail.value;\n const proj = this.projects[index];\n const projectMember = this.memberProjects.find((p) => p && p.projectId && p.projectId === proj.id);\n if (projectMember[prop] !== val) {\n DEBUG_LOGS && console.log(`${PAGE} activeChanged`, { val, projectMember });\n projectMember[prop] = val;\n this.projectMemberService.updateProjectMember(projectMember);\n this.presentSavedToast();\n // .pipe(\n // take(1),\n // catchError((e) => {\n // console.warn(`${PAGE} updateProjectMember caught`, e);\n // this.toaster.present(`Oops! Something went wrong. Please try again.`);\n // return EMPTY;\n // })\n // )\n // .subscribe((res) => {\n // DEBUG_LOGS && console.log(`${PAGE} update res:`, res);\n // this.presentSavedToast();\n // });\n } else {\n DEBUG_LOGS &&\n console.log(`${PAGE} activeChanged but didn't actually change?`, {\n projectMemberIsActive: projectMember[prop],\n formVal: val,\n });\n }\n } else {\n console.log(`${PAGE} activeChanged but no value?`, index, event);\n }\n } catch (error) {\n console.error(`${PAGE} caught`, error);\n this.toaster.present(\n `Oops! Something happened. Please try again. ${error && error.message ? 'Message: ' + error.message : ''}`\n );\n }\n }\n\n onRoleChanged(event, index) {\n const prop = 'role';\n try {\n if (event && event.detail && (event.detail.value || typeof event.detail.value === 'boolean')) {\n const val: string = event.detail.value;\n const proj = this.projects[index];\n DEBUG_LOGS && console.log(`${PAGE} onRoleChanged`, { val, index, projectId: proj && proj.id });\n\n if (!val || val === this.defaultRoleFormValue) {\n DEBUG_LOGS && console.log(`${PAGE} onRoleChanged default role selected..`);\n return;\n }\n\n if (this.addMember) {\n // adding member, emit the change\n this.roleChanged.emit({ role: val, project: proj });\n } else {\n // update immediately\n const projectMember = this.memberProjects.find((p) => p && p.projectId && p.projectId === proj.id);\n if (projectMember[prop] !== val) {\n // DEBUG_LOGS &&\n DEBUG_LOGS && console.log(`${PAGE} activeChanged`, { val, projectMember });\n projectMember[prop] = val as PROJECT_MEMBER_ROLE;\n this.projectMemberService.updateProjectMember(projectMember);\n this.presentSavedToast();\n // .pipe(\n // take(1),\n // catchError((e) => {\n // console.warn(`${PAGE} updateProjectMember caught`, e);\n // this.toaster.present(`Oops! Something went wrong. Please try again.`);\n // return EMPTY;\n // })\n // )\n // .subscribe((res) => {\n // DEBUG_LOGS && console.log(`${PAGE} update res:`, res);\n // this.presentSavedToast();\n // });\n } else {\n DEBUG_LOGS &&\n console.log(`${PAGE} activeChanged but didn't actually change?`, {\n projectMemberRole: projectMember[prop],\n formVal: val,\n });\n }\n }\n } else {\n console.log(`${PAGE} activeChanged but no value?`, index, event);\n }\n } catch (error) {\n console.error(`${PAGE} caught`, error);\n this.toaster.present(\n `Oops! Something happened. Please try again. ${error && error.message ? 'Message: ' + error.message : ''}`\n );\n }\n }\n\n async saveChanges() {\n DEBUG_LOGS && console.log(`${PAGE} saveChanges...`);\n if (this.projectsForm.invalid || this.projectsForm.pristine) {\n DEBUG_LOGS && console.log('invalid');\n return;\n }\n if (this.projectsForm.pristine) {\n return await this.toaster.present(`No changes to save...`);\n }\n // here set loading for button\n this.isSaving = true;\n try {\n _each(this.projectsControls, (group) => {\n if (!group.pristine) {\n const item = group.value;\n if (!item) {\n console.warn(`${PAGE} saveChanges no value?!`, group);\n return;\n }\n const request = {\n projectId: item.projectId,\n userId: item.userId,\n username: item.username,\n role: item.role,\n isActive: item.isActive,\n };\n\n if (DEBUG_LOGS) {\n console.group('---updateProjectCrewMember REQUEST:---');\n console.log(request);\n console.groupEnd();\n }\n\n /**\n * @todo VERIFY this works! - it appears to on 3.2.5\n */\n this.projectMemberService.updateProjectMember(request);\n // this.projectCrewApiService.updateProjectCrewMember(request);\n }\n });\n this.presentSavedToast();\n } catch (error) {\n console.error(error);\n this.toaster.present(`Oops! Something happened. Please try again.`);\n } finally {\n this.isSaving = false;\n }\n }\n\n async presentSavedToast() {\n return await this.toaster.present(`Success. Changes saved.`);\n }\n\n navProject(id) {\n // console.log(`navProject ${id}`);\n this.navCtrl.navigateForward(`/${PROJECT_DETAIL_ROUTE}/${id}`);\n this.closeModal.emit();\n }\n}\n","import { defer } from './defer';\nexport function iif(condition, trueResult, falseResult) {\n return defer(() => (condition() ? trueResult : falseResult));\n}\n","<!-- can be wrapped in project-member-modal -->\n\n<ng-template #loadingTpl>\n <div class=\"col ion-padding\">\n <div class=\"member ion-padding\">\n <ion-spinner></ion-spinner>\n </div>\n </div> \n</ng-template>\n<ng-template #noUserTpl>\n <div class=\"col ion-padding-horizontal\">\n <div class=\"member ion-padding-vertical\">\n {{ 'USER.NOT_FOUND' | translate }}\n </div>\n </div> \n</ng-template>\n<div *ngIf=\"selectedUser$ | async as user; else loadingTpl\" class=\"col ion-padding-horizontal\">\n <div *ngIf=\"user?.userId?.length > 0 else noUserTpl\" class=\"member\">\n <!-- avatar -->\n <div\n class=\"member__avatar\"\n [style.background-image]=\"'url(' + avatarUrl + '), url(' + avatarFallback + ')'\"\n draggable=\"false\"\n ></div>\n <h2 class=\"member__name\">\n {{ user.name || user.userId }}\n\n <ion-button *ngIf=\"user.bio\"\n [title]=\"showingBio ? 'Hide Bio' : 'Show Bio'\"\n fill=\"clear\"\n size=\"small\"\n class=\"member__name__caret-btn\"\n (click)=\"showingBio = !showingBio\"\n >\n <ion-icon\n slot=\"icon-only\"\n class=\"member__name__caret no-pointer-events\"\n name=\"caret-down\"\n [class.member__name__caret--expanded]=\"showingBio\"\n ></ion-icon>\n </ion-button>\n \n </h2>\n\n <div class=\"member__bio\" *ngIf=\"user.bio && showingBio\">\n <div>{{ user.bio }}</div>\n </div>\n\n <div class=\"member__stats\">\n <ul>\n <li title=\"{{ 'COMMON.PROJECTS' | translate }}\">\n <ion-icon name=\"folder\" class=\"no-pointer-events\"></ion-icon>\n {{ user.memberProjects?.length || 0 }}\n </li>\n <li title=\"{{ 'COMMON.STACKS' | translate }}\">\n <ion-icon name=\"layers-outline\" class=\"no-pointer-events\"></ion-icon>\n {{ \n ((recentStacks.items$ | async)?.length > 0) \n ? (recentStacks.items$ | async).length \n : user.stacks?.length || 0 \n }}\n </li>\n <li title=\"{{ 'STUDIO.CLIPS_WATCHED' | translate }}\">\n <ion-icon name=\"play-outline\" class=\"no-pointer-events\"></ion-icon>\n {{ user.numClipsWatched || 0 }}\n </li>\n </ul>\n </div>\n <div class=\"member__description\">\n <div *ngIf=\"user.location\" class=\"member__description__content\">\n <strong>{{ 'STUDIO.SETTINGS.LABEL_LOCATION' | translate }}</strong>\n <span>{{ user.location }}</span>\n </div>\n <div *ngIf=\"joined\" class=\"member__description__content\">\n <strong>{{ 'USER.JOINED' | translate }}</strong>\n <span>{{ joined }}</span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"showRecentStacks && (recentStacks.items$ | async)?.length > 0\" class=\"member__stacks\">\n <fs-list-title icon=\"logo-buffer\" style=\"display:block;margin-right:80px;\">\n <span class=\"ion-hide-sm-up\">{{ 'MEMBERS.RECENT_STACKS' | translate }}</span>\n <span class=\"ion-hide-sm-down\">{{ 'MEMBERS.RECENT_STACK_STORIES' | translate }}</span>\n </fs-list-title>\n \n <div *ngFor=\"let stackList of [recentStacks]\" class=\"list-wrap\">\n <app-stack-list *ngIf=\"(stackList.list$ | async) as list\" \n [layout]=\"{\n type: layoutType.Carousel,\n options: {\n hasAddNewItemButton: false,\n showAvatar: false\n }\n }\" \n [items]=\"stackList.items$ | async\" \n [canLoadMore]=\"!!list.nextToken\" \n [isLoading]=\"list.loading\"\n (loadMore)=\"loadMoreStacks(list)\" \n (itemClick)=\"dismiss.emit()\"\n ></app-stack-list>\n <!-- [heading]=\"stackList.label\" -->\n </div>\n \n </div>\n\n <div class=\"ion-text-left ion-margin-bottom\">\n <fs-list-title class=\"no-top-margin ion-padding-bottom\" icon=\"folder-outline\">{{ 'COMMON.PROJECTS' | translate }}</fs-list-title>\n <app-project-member-projects\n [member]=\"user\"\n [isStudio]=\"isStudio\"\n [viewOnly]=\"viewOnly\"\n (closeModal)=\"dismiss.emit()\"\n ></app-project-member-projects>\n </div>\n \n</div>\n","/** @format */\n\nimport { Component, OnInit, Input, ViewChild, OnDestroy, EventEmitter, Output } from '@angular/core';\nimport { NgIf, NgFor, AsyncPipe } from '@angular/common';\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\nimport { ModalController, IonSpinner, IonButton, IonIcon } from '@ionic/angular/standalone';\nimport { Observable, Subject } from 'rxjs';\nimport { distinctUntilChanged, take, takeUntil } from 'rxjs/operators';\nimport { ENABLE_FEATURE_USER_MESSAGING, ENABLE_FEATURE_USER_FOLLOW } from '@app/app.config';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { UserService } from '@app/core/services/user.service';\nimport { Stack } from '@app/shared/models/stack.model';\nimport { StackList, List } from '@app/shared/models/list.model';\nimport { DEFAULT_USER_AVATAR_TERTIARY } from '@app/shared/models/user.model';\nimport { LAYOUT_TYPE } from '@app/shared/models/layout.model';\nimport { ListTitleComponent } from '@app/shared/components/ui/list-title/list-title.component';\n// import { BaseModalComponent } from '@app/shared/components/ui/modal/base-modal.component';\nimport { Utils } from '@app/shared/utils';\nimport { StackListComponent } from '@app/stacks/shared/components/stack-list/stack-list.component';\nimport { Project } from '@app/projects/shared/project.model';\nimport { ProjectMemberService } from '@app/project-members/shared/services/project-member.service';\nimport { ProjectMemberProjectsComponent } from '@app/project-members/project-member-projects/project-member-projects.component';\n\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport { loadFilteredStacks, loadMoreFilteredStacks } from '@store/actions/stacks.actions';\nimport { selectList, selectStackListItems } from '@store/selectors/lists.selectors';\nimport { FilterEntityTypes } from '@store/selectors/viewstate.selectors';\n\nconst DEBUG_LOGS = false;\nconst PAGE = '[ProjectMember]';\n/**\n * ProjectMemberDetail\n */\n@Component({\n selector: 'fs-project-member',\n templateUrl: './project-member.component.html',\n styleUrls: ['./project-member.component.scss'],\n standalone: true,\n imports: [\n NgIf,\n NgFor,\n ListTitleComponent,\n StackListComponent,\n ProjectMemberProjectsComponent,\n IonButton,\n IonIcon,\n IonSpinner,\n AsyncPipe,\n TranslatePipe,\n ],\n})\nexport class ProjectMemberComponent implements OnInit, OnDestroy {\n @Input()\n set userId(value) {\n if (this._userId !== value && value?.length > 0) {\n // select this ID from the store -> kicks off effect to load UserData\n this.projectMemberService.selectUserId(value);\n }\n this._userId = value;\n }\n get userId(): string {\n return this._userId;\n }\n @Input() projects: Project[];\n @Input() viewOnly = true;\n @Input() isStudio = false;\n @Input() showRecentStacks = true;\n\n @Output() dismiss = new EventEmitter<void>();\n\n @ViewChild(ProjectMemberProjectsComponent) projectMemberProjectsComponent: ProjectMemberProjectsComponent;\n\n // @ViewChild('modal', { static: false, read: BaseModalComponent })\n // modal: BaseModalComponent;\n\n enableMessaging = ENABLE_FEATURE_USER_MESSAGING;\n enableFollow = ENABLE_FEATURE_USER_FOLLOW;\n\n selectedUser$ = this.projectMemberService.selected$;\n avatarUrl = DEFAULT_USER_AVATAR_TERTIARY;\n avatarFallback = DEFAULT_USER_AVATAR_TERTIARY;\n showingBio = false; // toggle the bio display\n\n joined: string;\n\n layoutType = LAYOUT_TYPE;\n recentStacks: StackList = {\n label: 'Recent', // will be translated onInit\n // list$: of(), // this.store.select(selectList(this.listIdProjectStacksRecent)),\n // items$: of(), //this.store.select(selectStackListItems(this.listIdProjectStacksRecent)),\n };\n\n private _userId = '';\n private get listIdMemberStacks() {\n return `stacks_recent_user_${this.userId || 'anon'}`;\n }\n private onDestroy$ = new Subject<void>();\n\n constructor(\n private modalController: ModalController,\n private toaster: ToasterService,\n private userService: UserService,\n private projectMemberService: ProjectMemberService,\n private store: Store<State>,\n private translate: TranslateService\n ) {}\n\n async ngOnInit() {\n this.selectedUser$\n .pipe(\n takeUntil(this.onDestroy$),\n distinctUntilChanged(\n (prev, curr) => curr?.userId && curr.userId === prev?.userId && curr?.bio && curr.bio === prev?.bio\n )\n )\n .subscribe(async (user) => {\n DEBUG_LOGS && console.log(`${PAGE} currentUser$`, user);\n if (!user || !user.userId) return;\n\n const joined = user.createdAt || user.updatedAt;\n if (joined) {\n this.translate\n .get('COMMON.DAYS_AGO')\n .pipe(take(1))\n .subscribe((res) => {\n // todo: consider # COMMON.YEARS # days ago ?\n this.joined = `${Utils.daysAgo(new Date(), new Date(joined))} ${res}`;\n });\n }\n\n this.avatarUrl = this.userService.getUserAvatarUrl(user.userId);\n\n this.showingBio = user.bio?.length > 0;\n\n if (this.showRecentStacks) {\n this.translate\n .get(['COMMON.RECENT']) // 'COMMON.FEATURED'\n .pipe(take(1))\n .subscribe((res) => {\n this.recentStacks.label = res['COMMON.RECENT'];\n // this.featuredStacks.label = res['COMMON.FEATURED'];\n });\n\n this.recentStacks = {\n label: this.recentStacks.label,\n list$: this.store.select(selectList(this.listIdMemberStacks)),\n items$: this.store.select(selectStackListItems(this.listIdMemberStacks)) as Observable<Stack[]>,\n };\n // load RECENT STACKS by project id\n this.store.dispatch(\n loadFilteredStacks({\n listId: this.listIdMemberStacks,\n filters: {\n id: this.listIdMemberStacks,\n userId: this.userId,\n type: FilterEntityTypes.Recent,\n },\n })\n );\n }\n });\n }\n\n ngOnDestroy(): void {\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n\n loadMoreStacks(list: List) {\n this.store.dispatch(\n loadMoreFilteredStacks({\n listId: list.id,\n filters: list.filters,\n nextToken: list.nextToken,\n })\n );\n }\n\n async followCrewMember() {\n console.log('follow btn clicked');\n await this.toaster.present(`Feature in DEV: Follow User`);\n }\n\n async messageCrewMember() {\n console.log('message btn clicked');\n await this.toaster.present(`Feature in DEV: Message User`);\n }\n\n saveProjectChanges() {\n console.log('TODO: saveProjectChanges here or in child component?');\n // this.projectMemberProjectsComponent.saveChanges();\n }\n}\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n","var identity = require('./identity');\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n return typeof value == 'function' ? value : identity;\n}\n\nmodule.exports = castFunction;\n","module.exports = require('./forEach');\n","var arrayEach = require('./_arrayEach'),\n baseEach = require('./_baseEach'),\n castFunction = require('./_castFunction'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, castFunction(iteratee));\n}\n\nmodule.exports = forEach;\n","var baseIteratee = require('./_baseIteratee'),\n baseUniq = require('./_baseUniq');\n\n/**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\nfunction uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];\n}\n\nmodule.exports = uniqBy;\n"],"x_google_ignoreList":[4,7,8,9,10,11]}