{"version":3,"file":"668.55c94d91e165b0a0.js","mappings":"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","names":["i0","types","AddNewProjectButtonComponent","_AddNewProjectButtonComponent","constructor","this","isEvent","selectors","inputs","standalone","features","decls","vars","consts","template","rf","ctx","AddNewProjectButtonComponent_div_3_Template","AddNewProjectButtonComponent_ng_template_4_Template","notEvent_r1","IonIcon","IonButton","NgIf","TranslatePipe","styles","AddNewStackButtonComponent","_AddNewStackButtonComponent","FsAddNewItemButtonComponent","_FsAddNewItemButtonComponent","ngOnInit","itemType","className","getComponentName","console","warn","componentRef","slide","createComponent","instance","name","charAt","toUpperCase","toLowerCase","slice","viewQuery","ViewContainerRef","FsAddNewItemButtonComponent_ng_template_0_Template","ctx_r1","role","level","item","title","views","votes","members","length","mission","tmp_7_0","subscriptionBy","undefined","owner","subscriptionStatus","eventDate","$event","_r1","onClicked","ProjectSlideComponent_ng_template_1_div_3_Template","ProjectSlideComponent_ng_template_1_div_4_Template","ProjectSlideComponent_ng_template_1_ng_template_5_Template","ProjectSlideComponent_ng_template_1_div_7_Template","hero","defaultItemTpl_r3","ProjectSlideComponent","_ProjectSlideComponent","router","itemClick","EventEmitter","isModerated","canModerate","canShare","showAvatar","isProjectMember","event","navigate","PROJECT_DETAIL_ROUTE","id","emit","ITEM_TYPE","Projects","Array","isArray","projectMembersMap","_keyBy","filter","member","isActive","hasOwnProperty","currentUsername","SubscriptionStatus","Active","subscriptionLevel","i1","outputs","ProjectSlideComponent_ng_container_0_Template","ProjectSlideComponent_ng_template_1_Template","ProjectSlideComponent_ng_template_3_Template","hasItem_r4","hasNoItem_r5","changeDetection","tmp_6_0","projects","onClick","UserSlideComponent_ng_template_1_div_0_div_8_Template","userId","currentMemberId$","avatarFallback","username","tmp_8_0","showProjects","UserSlideComponent_ng_template_1_div_0_Template","hasNoItem_r3","StackSlideComponent","stack_slide_component","r","UserSlideComponent","_UserSlideComponent","store","select","selectCurrentMemberId","DEFAULT_USER_AVATAR_TERTIARY","user","Users","UserSlideComponent_ng_container_0_Template","UserSlideComponent_ng_template_1_Template","UserSlideComponent_ng_template_3_Template","ImageFadeInDirective","ImageFallbackDirective","AsyncPipe","AvatarUrlPipe","IonAvatar","IonSpinner","FsSlideComponent","_FsSlideComponent","isStackSlide","ngOnChanges","changes","propName","currentValue","firstChange","previousValue","updateInstanceInputs","key","val","ngOnDestroy","destroy","FsSlideComponent_ng_template_0_Template","heading","_r3","addNewItemButtonClick","options","_r4","item_r5","_r6","item_r7","FsCarouselComponent_ng_container_13_fs_slide_1_Template","_c1","CarouselOptions","LayoutOptions","opts","super","Object","entries","value","getOwnPropertyNames","includes","forEach","FsCarouselComponent","_FsCarouselComponent","obj","_options","userService","platform","isLoadingMore","newItemClick","loadMore","scrolledLeft$","Subject","scrolledRight$","itemTypes","loadMoreEmittedForItemAmount","ready","then","showAddNewItemButtonForItemAmount","is","getUsername","ngAfterViewInit","_this","_asyncToGenerator","Promise","resolve","setTimeout","calculateScrolls","_this2","carousel","items","currentItemValue","previousItemValue","currentUsernameValue","previousUsernameValue","scrollLeftWas","nativeElement","scrollLeft","clearTimeout","_timeoutScrollTo","scrollItemIntoView","scrollWidth","clientWidth","next","canLoadMore","direction","left","Math","min","max","scrollTo","top","behavior","trackByFn","_index","projectId","stackId","getStackId","getClipId","origScrollLeft","_scrollTimeout","container","selected","querySelector","offsetLeft","OFFSET_PADDING","environment","production","log","error","i2","FsCarouselComponent_div_6_Template","FsCarouselComponent_fs_add_new_item_button_10_Template","FsCarouselComponent_fs_slide_11_Template","FsCarouselComponent_fs_add_new_item_button_12_Template","FsCarouselComponent_ng_container_13_Template","FsCarouselComponent_ng_container_16_Template","Stacks","Clips","hasNewItemButtonAtEnd","hasAddNewItemButton","NgFor","open","openPopover","canPlay","canCollaborate","popoverOpen$","dteSaved","shares","playlist","isCollaborative","hlsSrc","isApproved","_StackSlideComponent","isMine","canApprove","popoverCtrl","navCtrl","dtePublished","navigateForward","WATCH_ROUTE","EDIT_ROUTE","state","autoOpenCapture","popover","create","component","StackPopoverActionsComponent","componentProps","stack","canAddToStack","canFeature","present","onWillDismiss","StackSlideComponent_ng_container_0_Template","StackSlideComponent_ng_template_1_Template","StackSlideComponent_ng_template_3_Template","hasItem_r3","hasNoItem_r4","ThumbnailPosterComponent","EllipsisButtonComponent","UploaderStatsComponent","ClipPopoverActionsComponent","_ClipPopoverActionsComponent","mystackService","modalCtrl","alertCtrl","clipService","videoService","toaster","route","translate","canEdit","showText","actions","didAddUserActions","onDestroy$","get","pipe","take","subscribe","translated","push","type","text","icon","unshift","clip","userId$","takeUntil","a","userIsGlobalAdmin$","isAdmin","youtube_id","complete","onSelected","setClipIsApproved","returnUrl","url","EDIT_CLIP_ROUTE","queryParams","modal","getTop","dismiss","addClipsToMyStack","instant","ModalReportComponent","reportedItem","confirmDelete","confirmTranscode","cssClass","header","subHeader","message","buttons","handler","deleteClip","catch","_this3","confirmSendClipForHLSTranscode","i3","i4","i5","i6","i7","i8","ActionPopoverComponent","toggleClipInMyStacks","ClipTileComponent_ng_template_1_div_8_ng_container_3_Template","ClipTileComponent_ng_template_1_div_8_ng_container_4_Template","isAddedToMyStack","openModal","ClipTileComponent_ng_template_1_div_8_Template","openActions","currentUserId","created","numStacks","ClipTileComponent","_ClipTileComponent","Utils","tryPreventDefault","tryStopPropagation","removeClipFromMyStack","ClipTileDetailModal","all","__webpack_require__","e","bind","ClipTileComponent_ng_container_0_Template","ClipTileComponent_ng_template_1_Template","ClipTileComponent_ng_template_3_Template","DatePipe","SentenceCasePipe","asStack","item_r1","FsGridComponent_ng_container_3_div_1_Template","asClip","item_r3","myStackClipIds_r4","indexOf","FsGridComponent_ng_container_4_ng_container_1_ng_container_1_Template","FsGridComponent_ng_container_4_ng_container_1_div_2_Template","FsGridComponent_ng_container_4_ng_container_1_ng_container_3_Template","isLoading","FsGridComponent_ng_container_4_ng_container_1_Template","myStackClipIds$","GridOptions","FsGridComponent","_FsGridComponent","selectMyStackClipIds","onClickItem","getId","FsGridComponent_ng_container_3_Template","FsGridComponent_ng_container_4_Template","ctx_r0","duration","actionIcon","ThumbnailPosterComponent_div_3_ion_icon_1_Template","ThumbnailPosterComponent_div_3_ng_template_2_Template","isLockedNoPlay","canPlayIcon_r2","avatarUrl","ThumbnailPosterComponent_div_4_div_1_Template","ThumbnailPosterComponent_div_4_img_2_Template","ThumbnailPosterComponent_div_6_ion_icon_3_Template","_ThumbnailPosterComponent","_item","posterBgImg","poster","posterFallback","_a","isStack","_b","isPlaying","memberService","isCurrent","wasPlayed","showActionIcon","showDuration","hasProvider","DEFAULT_USER_AVATAR","getUserAvatar","isClip","providerId","STACK_DEFAULT_POSTER","selectProject","p","proj","ThumbnailPosterComponent_div_2_Template","ThumbnailPosterComponent_div_3_Template","ThumbnailPosterComponent_div_4_Template","ThumbnailPosterComponent_div_5_Template","ThumbnailPosterComponent_div_6_Template","DurationRenderPipe","UploaderStatsComponent_div_3_div_1_span_3_Template","viewsTitle","moreViews","likes","UploaderStatsComponent_div_3_div_1_Template","UploaderStatsComponent_div_3_div_2_Template","UploaderStatsComponent_div_3_div_3_Template","UploaderStatsComponent_div_3_span_7_Template","UploaderStatsComponent_div_3_div_8_Template","UploaderStatsComponent_div_3_div_9_Template","UploaderStatsComponent_div_3_div_10_Template","UploaderStatsComponent_div_3_div_11_Template","stacksTitle","stacks","moreStacks","indicateNotHls","indicateNeedsApproved","UploaderStatsComponent_div_4_ion_avatar_1_img_1_Template","UploaderStatsComponent_div_4_ion_avatar_1_Template","username$","_UploaderStatsComponent","showStats","showUploader","getPublicUsername","date","UploaderStatsComponent_div_3_Template","UploaderStatsComponent_div_4_Template","_ImageFadeInDirective","opacity","transition","onLoaded","hostVars","hostBindings","_ImageFallbackDirective","fallback","onError","src","load","checkUrlExists","reject","xhr","XMLHttpRequest","onreadystatechange","readyState","HEADERS_RECEIVED","status","abort","onerror","send","_AvatarUrlPipe","transform","args","AVATAR_URL_PREFIX","color","DEFAULT_USER_AVATAR_DARK","pure","_DurationRenderPipe","str","times","split","len","i","isNaN","parseInt","shift","map","time","d","padZero","join","_SentenceCasePipe","substring","ListStackItemsComponent_ng_container_1_ion_item_1_Template","_c0","i_r2","featured","ListStackItemsComponent_ng_container_2_ion_item_1_ion_icon_5_Template","ListStackItemsComponent_ng_container_2_ion_item_1_div_6_Template","$implicit","ctx_r3","toggleFeatured","ListStackItemsComponent_ng_container_2_ion_item_1_ng_container_11_Template","ListStackItemsComponent_ng_container_2_ion_item_1_ng_container_12_Template","ListStackItemsComponent_ng_container_2_ion_item_1_div_13_Template","isDraggable","isNumerable","ListStackItemsComponent_ng_container_2_ion_item_1_Template","ListStackItemsComponent_ng_container_2_div_2_Template","trackByItem","ListStackItemsComponent","_ListStackItemsComponent","stackService","loadingCtrl","index","reorder","customEvent","loading","detail","from","to","thisStack","newFeatured","checkIndex","setStackFeatured","fromIdx","toIdx","ListStackItemsComponent_ng_container_1_Template","ListStackItemsComponent_ng_container_2_Template","DecimalPipe","IonReorderGroup","IonItem","IonSkeletonText","IonReorder","IonButtons","ListOptions","FsListComponent","_FsListComponent","IonList","addNewStackButtonClick","layout","StackListComponent_4_ng_template_0_Template","StackListComponent","_StackListComponent","layoutTypes","LAYOUT_TYPE","searchFields","STACK_SEARCH_FIELDS","newStackClick","navWatchStack","navEditStack","StackListComponent_ng_container_1_Template","StackListComponent_ng_container_2_Template","StackListComponent_ng_container_3_Template","StackListComponent_4_Template","Carousel","Grid","List","NgSwitch","NgSwitchCase","NgSwitchDefault"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/shared/components/fs-carousel/fs-add-new-item-button/add-new-project-button/add-new-project-button.component.html","./src/app/shared/components/fs-carousel/fs-add-new-item-button/fs-add-new-item-button.component.ts","./src/app/shared/components/fs-carousel/fs-add-new-item-button/add-new-project-button/add-new-project-button.component.ts","./src/app/shared/components/fs-carousel/fs-add-new-item-button/add-new-stack-button/add-new-stack-button.component.ts","./src/app/shared/components/fs-carousel/fs-add-new-item-button/add-new-stack-button/add-new-stack-button.component.html","./src/app/shared/components/fs-carousel/fs-slide/project-slide/project-slide.component.html","./src/app/shared/components/fs-carousel/fs-slide/project-slide/project-slide.component.ts","./src/app/shared/components/fs-carousel/fs-slide/user-slide/user-slide.component.html","./src/app/shared/components/fs-carousel/fs-slide/fs-slide.component.ts","./src/app/shared/components/fs-carousel/fs-slide/user-slide/user-slide.component.ts","./src/app/shared/components/fs-carousel/fs-carousel.component.html","./src/app/shared/components/fs-carousel/fs-carousel.component.ts","./src/app/shared/components/fs-carousel/fs-slide/stack-slide/stack-slide.component.html","./src/app/shared/components/fs-carousel/fs-slide/stack-slide/stack-slide.component.ts","./src/app/shared/components/fs-grid/clip-tile/clip-popover-actions/clip-popover-actions.component.ts","./src/app/shared/components/fs-grid/clip-tile/clip-popover-actions/clip-popover-actions.component.html","./src/app/shared/components/fs-grid/clip-tile/clip-tile.component.html","./src/app/shared/components/fs-grid/clip-tile/clip-tile.component.ts","./src/app/shared/components/fs-grid/fs-grid.component.html","./src/app/shared/components/fs-grid/fs-grid.component.ts","./src/app/shared/components/thumbnail-poster/thumbnail-poster.component.html","./src/app/shared/components/thumbnail-poster/thumbnail-poster.component.ts","./src/app/shared/components/ui/upload-stats/uploader-stats.component.html","./src/app/shared/components/ui/upload-stats/uploader-stats.component.ts","./src/app/shared/directives/image-fade-in.directive.ts","./src/app/shared/directives/image-fallback.directive.ts","./src/app/shared/pipes/avatar-url.pipe.ts","./src/app/shared/pipes/duration-render.pipe.ts","./src/app/shared/pipes/sentence-case.pipe.ts","./src/app/shared/components/fs-list/list-stack-items/list-stack-items.component.html","./src/app/shared/components/fs-list/list-stack-items/list-stack-items.component.ts","./src/app/shared/components/fs-list/fs-list.component.ts","./src/app/shared/components/fs-list/fs-list.component.html","./src/app/stacks/shared/components/stack-list/stack-list.component.html","./src/app/stacks/shared/components/stack-list/stack-list.component.ts"],"sourcesContent":["<div class=\"add-project\" [class.active-event]=\"isEvent\">\n <ion-button shape=\"circle\" size=\"large\">\n <ion-icon name=\"add-outline\"></ion-icon>\n </ion-button>\n <div *ngIf=\"isEvent else notEvent\" class=\"add-project__title\">{{\n 'PROJECT.CREATE_EVENT' | translate\n }}</div>\n <ng-template #notEvent>\n <div class=\"add-project__title\">{{'STUDIO.PROJECTS.CREATE' | translate}}</div>\n </ng-template>\n</div>","/** @format */\n\nimport { Component, Input, OnInit, ViewChild, ViewContainerRef } from '@angular/core';\nimport { ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { AddNewProjectButtonComponent } from './add-new-project-button/add-new-project-button.component';\nimport { AddNewStackButtonComponent } from './add-new-stack-button/add-new-stack-button.component';\n\nconst types = {\n AddNewProjectButtonComponent,\n AddNewStackButtonComponent,\n};\n\n@Component({\n selector: 'fs-add-new-item-button',\n template: `<ng-template #slide></ng-template>`,\n styleUrls: ['./fs-add-new-item-button.component.scss'],\n standalone: true,\n})\nexport class FsAddNewItemButtonComponent implements OnInit {\n @Input() itemType: ITEM_TYPE;\n @Input() isEvent: boolean = false;\n\n @ViewChild('slide', { static: true, read: ViewContainerRef })\n private slide: ViewContainerRef;\n\n ngOnInit(): void {\n if (this.itemType) {\n const className = this.getComponentName(this.itemType);\n\n if (!types[className]) {\n console.warn(`[fs-add-new-item-button] Type '${className}' NOT FOUND: `, types);\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const componentRef: any = this.slide.createComponent(types[className]);\n if (className === 'AddNewProjectButtonComponent') {\n // console.log('className', className);\n componentRef.instance.isEvent = this.isEvent;\n }\n }\n }\n\n getComponentName(name: string) {\n return `AddNew${name.charAt(0).toUpperCase()}${name.toLowerCase().slice(1, -1)}ButtonComponent`;\n }\n}\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonButton, IonIcon } from '@ionic/angular/standalone';\n\n@Component({\n selector: 'app-add-new-project-button',\n templateUrl: './add-new-project-button.component.html',\n styleUrls: ['./add-new-project-button.component.scss'],\n standalone: true,\n imports: [IonIcon, IonButton, NgIf, TranslatePipe],\n})\nexport class AddNewProjectButtonComponent {\n @Input() isEvent = false;\n}\n","/** @format */\n\nimport { Component } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonButton, IonIcon } from '@ionic/angular/standalone';\n\n@Component({\n selector: 'app-add-new-stack-button',\n templateUrl: './add-new-stack-button.component.html',\n styleUrls: ['./add-new-stack-button.component.scss'],\n standalone: true,\n imports: [IonIcon, IonButton, TranslatePipe],\n})\nexport class AddNewStackButtonComponent {}\n","<div class=\"add-stack\">\n <ion-button shape=\"circle\" size=\"large\">\n <ion-icon name=\"add-outline\"></ion-icon>\n </ion-button>\n <h3 class=\"add-stack__title\">{{'STUDIO.FILMSTACKS.CREATE' | translate}}</h3>\n</div>","<ng-container *ngIf=\"item; then hasItem; else hasNoItem\"> </ng-container>\n\n<ng-template #hasItem>\n <div class=\"project-slide\" [class.active-event]=\"isEvent\" (click)=\"onClicked($event, item)\">\n <div\n class=\"project-slide__image\"\n [style.background-image]=\"'url(' + item.hero + ')'\"\n ></div>\n <div class=\"project-slide__tint\"></div>\n\n <div *ngIf=\"role\" class=\"project-slide__role\">\n {{ role }}\n </div>\n <div *ngIf=\"level\" class=\"project-slide__level subscription-color subscription-chip light\">\n {{ level }}\n </div>\n\n <ng-template #defaultItemTpl>\n <div class=\"project-slide__title\">\n {{ item.title }}\n </div>\n \n <div class=\"project-slide__content\">\n <div class=\"project-slide__content__stats\">\n <div class=\"project-slide__content__stats__item\">\n <ion-icon name=\"play-sharp\"></ion-icon> {{ item.views }}\n </div>\n <div class=\"project-slide__content__stats__item\">\n <ion-icon name=\"heart-sharp\"></ion-icon> {{ item.votes }}\n </div>\n <div class=\"project-slide__content__stats__item\">\n <ion-icon name=\"film-sharp\"></ion-icon> {{ 0 }}\n </div>\n <div class=\"project-slide__content__stats__item\">\n <ion-icon name=\"people-sharp\"></ion-icon> {{ item.members && item.members.length ? item.members.length : 0 }}\n </div>\n </div>\n <div class=\"project-slide__content__text\">\n {{ item.mission }}\n </div>\n </div>\n </ng-template>\n\n <div *ngIf=\"isEvent else defaultItemTpl\" class=\"project-event\">\n <div class=\"project-slide__title\">\n {{ item.title }}\n </div>\n <!-- \n Owner: Username (not shown if my event on edit studio)\n Status : Active: Expired\n Expires: Renews: \n Event Date\n -->\n <div class=\"project-slide__content ion-text-capitalize\">\n <div class=\"project-slide__content__event\">\n <div>\n <span class=\"italic\">{{ 'COMMON.OWNER' | translate }}: </span><b>{{ item?.subscriptionBy ?? item.owner }}</b>\n </div>\n <div>\n <span class=\"italic\">{{ 'AUTH.STATUS' | translate }}: </span><b>{{ (item.subscriptionStatus === 1 ? 'COMMON.ACTIVE' : 'COMMON.INACTIVE') | translate }}</b>\n </div>\n\n <!-- TODO:\n COMMON.EXPIRES \n COMMON.RENEWS -->\n <!-- <div *ngIf=\"item\">\n <span class=\"italic\">{{ 'COMMON.EXPIRES_OR_RENEWS' | translate }}: </span><b>{{ 'GET DATE' }}</b>\n </div> -->\n <!-- <div>\n <span class=\"italic\">{{ 'AUTH.PLANS.SUBSCRIPTION_LEVEL' | translate }}: </span><b>{{ project.eventConfig?.subscriptionLevel ?? project.subscriptionLevel }}</b>\n </div> -->\n <div>\n <span class=\"italic\">{{ 'COMMON.EVENT_DATE' | translate }}: </span>{{ item.eventDate }}\n </div>\n </div>\n <!-- <div class=\"project-slide__content__text\">\n {{ item.mission }}\n </div> -->\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #hasNoItem>\n <div class=\"project-slide\"></div>\n</ng-template>\n","/** @format */\n\nimport _keyBy from 'lodash/keyBy';\nimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { Router } from '@angular/router';\nimport { IonIcon } from '@ionic/angular/standalone';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { PROJECT_DETAIL_ROUTE } from '@app/app.routes';\nimport { DiscoverCardClick, ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { SubscriptionStatus } from '@app/billing/shared/billing.model';\nimport { Project, PROJECT_MEMBER_ROLE } from '@app/projects/shared/project.model';\n\n@Component({\n selector: 'app-project-slide',\n templateUrl: './project-slide.component.html',\n styleUrls: ['./project-slide.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [NgIf, TranslatePipe, IonIcon],\n})\nexport class ProjectSlideComponent {\n @Input() item: Project;\n @Input() currentUsername: string;\n @Output() itemClick = new EventEmitter<DiscoverCardClick>();\n /** Showing on a Project.isModerated page */\n @Input() isModerated = false;\n @Input() canModerate = false;\n @Input() canShare = true;\n @Input() showAvatar = true;\n @Input() isProjectMember = false;\n @Input() isEvent = false;\n\n constructor(private router: Router) {}\n\n onClicked(event, item: Project) {\n this.router.navigate([`/${PROJECT_DETAIL_ROUTE}`, item.id]);\n this.itemClick.emit({ event, item, itemType: ITEM_TYPE.Projects });\n }\n\n get role(): PROJECT_MEMBER_ROLE {\n if (!this.item || !Array.isArray(this.item.members)) {\n return null;\n }\n const projectMembersMap = _keyBy(\n this.item.members.filter((member) => member.isActive),\n 'username'\n );\n\n return projectMembersMap.hasOwnProperty(this.currentUsername) && projectMembersMap[this.currentUsername].role\n ? projectMembersMap[this.currentUsername].role\n : null;\n }\n\n get level(): string {\n return this.item && this.item.subscriptionStatus === SubscriptionStatus.Active && this.item.subscriptionLevel\n ? this.item.subscriptionLevel\n : '';\n }\n}\n","<ng-container *ngIf=\"item; then hasItem; else hasNoItem\"> </ng-container>\n\n<ng-template #hasItem>\n <div *ngIf=\"item.userId?.length > 0 else hasNoItem\"\n class=\"user-slide community-user\" \n [class.user-slide__selected]=\"item.userId === (currentMemberId$ | async)\"\n (click)=\"onClick($event, item)\">\n <div class=\"user-slide__content\">\n <ion-avatar class=\"user-slide__avatar\" draggable=\"false\">\n <img\n class=\"user-slide__avatar__image\"\n [src]=\"item.userId | avatarUrl:'dark'\"\n [fallback]=\"avatarFallback\"\n imageFadeIn\n [alt]=\"item.username ?? item.userId\"\n [title]=\"item.username ?? item.userId\"\n draggable=\"false\"\n />\n </ion-avatar>\n <div class=\"user-slide__name\">\n {{ item.username || item.userId }}\n </div>\n <div *ngIf=\"showProjects && item.projects?.length > 0\" class=\"user-slide__projects\" title=\"{{ 'COMMON.PROJECTS' | translate }}\">\n <ion-icon name=\"folder-outline\" class=\"no-pointer-events\"></ion-icon>\n <span class=\"project-count\">{{ item.projects?.length ?? 0 }}</span>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #hasNoItem>\n <div class=\"user-slide\">\n <ion-spinner class=\"loading-spinner\"></ion-spinner>\n </div>\n</ng-template>\n","/** @format */\n\nimport {\n Component,\n OnInit,\n Input,\n ViewChild,\n ViewContainerRef,\n OnDestroy,\n OnChanges,\n SimpleChanges,\n Output,\n EventEmitter,\n ComponentRef,\n} from '@angular/core';\nimport { DiscoverCardClick, ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { Clip } from '@app/shared/models/clip.model';\nimport { Stack } from '@app/shared/models/stack.model';\nimport { User } from '@app/shared/models/user.model';\nimport { Project, ProjectMember } from '@app/projects/shared/project.model';\nimport { ProjectSlideComponent } from './project-slide/project-slide.component';\nimport { StackSlideComponent } from './stack-slide/stack-slide.component';\nimport { UserSlideComponent } from './user-slide/user-slide.component';\n\nconst types = {\n ProjectSlideComponent,\n StackSlideComponent,\n UserSlideComponent,\n};\n\n@Component({\n selector: 'fs-slide',\n template: ` <ng-template #slide></ng-template> `,\n styleUrls: ['./fs-slide.component.scss'],\n standalone: true,\n imports: [ProjectSlideComponent, StackSlideComponent, UserSlideComponent],\n})\nexport class FsSlideComponent implements OnInit, OnDestroy, OnChanges {\n @Input() item: Partial<Clip> | Partial<Stack> | Partial<Project> | Partial<ProjectMember> | Partial<User> | null;\n @Input() itemType: ITEM_TYPE;\n @Input() currentUsername: string;\n /** Showing on a Project.isModerated page */\n @Input() isModerated = false;\n @Input() canModerate = false;\n @Input() canShare = true;\n @Input() showAvatar = true;\n @Input() isProjectMember = false;\n @Input() isEvent = false;\n // set canModerate(bool: boolean) {\n // // not getting pciked up fro new slides ?\n // if (this.isStackSlide) { // ProjectSlide does not have/need this Input prop\n // this.updateInstanceInputs('canModerate', bool);\n // }\n // }\n @Output() itemClick = new EventEmitter<DiscoverCardClick>();\n\n @ViewChild('slide', { static: true, read: ViewContainerRef })\n private slide: ViewContainerRef;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private componentRef: ComponentRef<any>;\n private isStackSlide = false;\n\n ngOnChanges(changes: SimpleChanges) {\n for (const propName in changes) {\n if (changes.hasOwnProperty(propName)) {\n const { currentValue, firstChange, previousValue } = changes[propName];\n\n if (firstChange || currentValue !== previousValue) {\n this.updateInstanceInputs(propName, currentValue);\n }\n }\n }\n }\n\n ngOnInit() {\n /**\n * Should have a way to get component type dynamically\n * 2020-07-01 JD Fix Error \"No component factory found for undefined\" (finally applied 2021-04-01 with warn return)\n */\n if (this.itemType) {\n const className = this.getComponentName(this.itemType);\n // console.log(\"Class name: \", className);\n\n if (!types[className]) {\n console.warn(`[fs-slide] Type '${className}' NOT FOUND: `, types);\n return;\n }\n\n this.isStackSlide = className === 'StackSlideComponent';\n\n /**\n * @deprecated note in lint:\n * Angular no longer requires component factories to dynamically create components.\n * Use different signature of the createComponent method, which allows passing Component class directly.\n *\n * Note: since v13, dynamic component creation via ViewContainerRef.createComponent does not require resolving component factory: component class can be used directly\n * @see https://dev.to/railsstudent/dynamically-load-components-in-angular-13-5474\n * @see https://stackoverflow.com/questions/70946038/replace-deprecated-angular-componentfactoryresolver-componentfactory\n *\n * 2026-06-27 jd fixed based on links above\n *\n */\n this.componentRef = this.slide.createComponent(types[className]);\n // const componentFactory = this.componentFactoryResolver.resolveComponentFactory(\n // types[className]\n // );\n // this.componentRef = this.slide.createComponent(componentFactory);\n this.componentRef.instance.item = this.item;\n this.componentRef.instance.currentUsername = this.currentUsername;\n if (this.isStackSlide) {\n // ProjectSlide does not have/need this Input prop\n this.componentRef.instance.isModerated = this.isModerated;\n // how to allow updates after init? in setter?\n this.componentRef.instance.canModerate = this.canModerate;\n this.componentRef.instance.canShare = this.canShare;\n this.componentRef.instance.isProjectMember = this.isProjectMember;\n }\n if (this.isStackSlide || className === 'ClipSlideComponent') {\n this.componentRef.instance.showAvatar = this.showAvatar;\n }\n if (className === 'ProjectSlideComponent') {\n this.componentRef.instance.isEvent = this.isEvent;\n }\n // connect the Outputs too, apparently..\n this.componentRef.instance.itemClick = this.itemClick;\n }\n }\n\n updateInstanceInputs(key, val) {\n // this.componentRef.instance.currentUsername = this.currentUsername;\n // not getting picked up for new slides ?\n if (this.componentRef && this.componentRef.instance) {\n if (key === 'isModerated' || key === 'canModerate') {\n // ProjectSlide does not have/need this Input prop\n if (this.isStackSlide) {\n this.componentRef.instance[key] = val;\n }\n } else {\n this.componentRef.instance[key] = val;\n }\n }\n }\n\n getComponentName(name: string) {\n return name.charAt(0).toUpperCase() + name.toLowerCase().slice(1, -1) + 'SlideComponent';\n }\n\n ngOnDestroy() {\n if (this.componentRef && typeof this.componentRef.destroy === 'function') {\n // hotfix(Sentry-22): Cannot read property 'destroy' of undefined\n this.componentRef.destroy();\n }\n }\n}\n","/** @format */\n\nimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\nimport { NgIf, AsyncPipe } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonAvatar, IonIcon, IonSpinner } from '@ionic/angular/standalone';\nimport { Store } from '@ngrx/store';\nimport { selectCurrentMemberId } from '@store/selectors/members.selectors';\nimport { DiscoverCardClick, ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { User, DEFAULT_USER_AVATAR_TERTIARY } from '@app/shared/models/user.model';\nimport { AvatarUrlPipe } from '@app/shared/pipes/avatar-url.pipe';\nimport { ImageFadeInDirective } from '@app/shared/directives/image-fade-in.directive';\nimport { ImageFallbackDirective } from '@app/shared/directives/image-fallback.directive';\n\n@Component({\n selector: 'app-user-slide',\n templateUrl: './user-slide.component.html',\n styleUrls: ['./user-slide.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n NgIf,\n ImageFadeInDirective,\n ImageFallbackDirective,\n AsyncPipe,\n TranslatePipe,\n AvatarUrlPipe,\n IonAvatar,\n IonIcon,\n IonSpinner,\n ],\n})\nexport class UserSlideComponent {\n @Input() item: User;\n // @Input() currentUsername: string;\n\n @Output() itemClick = new EventEmitter<DiscoverCardClick>();\n\n currentMemberId$ = this.store.select(selectCurrentMemberId);\n\n showProjects = false;\n avatarFallback = DEFAULT_USER_AVATAR_TERTIARY;\n\n constructor(private store: Store) {}\n\n onClick(event, user: User) {\n this.itemClick.emit({ event, item: user, itemType: ITEM_TYPE.Users });\n }\n}\n","<div\n class=\"carousel carousel--with-navigation\"\n [class.carousel--has-vertical-text]=\"heading\"\n>\n <div class=\"navigation\">\n <ion-icon\n class=\"navigation__item navigation__item--left\"\n [class.navigation__item--inactive]=\"\n (scrolledLeft$ | async) || !items || items.length === 0\n \"\n (click)=\"navigate('left')\"\n name=\"chevron-back-outline\"\n ></ion-icon>\n <ion-icon\n class=\"navigation__item navigation__item--right\"\n [class.navigation__item--inactive]=\"\n (scrolledRight$ | async) || !items || items.length === 0\n \"\n (click)=\"navigate('right')\"\n name=\"chevron-forward-outline\"\n ></ion-icon>\n </div>\n <div *ngIf=\"heading\" class=\"carousel__vertical-text\">\n {{ heading }}\n </div>\n <div\n #carousel\n class=\"carousel__container\"\n [class.carousel__container--stacks]=\"itemType === itemTypes.Stacks\"\n [class.carousel__container--projects]=\"itemType === itemTypes.Projects\"\n [class.carousel__container--clips]=\"itemType === itemTypes.Clips\"\n [class.active-event]=\"options.isEvent\"\n [class.carousel__container--users]=\"itemType === itemTypes.Users\"\n (scroll)=\"calculateScrolls()\"\n (window:resize)=\"calculateScrolls()\"\n >\n <div\n class=\"carousel__container__content\"\n [class.carousel__container__content--has-more]=\"canLoadMore\"\n [class.carousel__container__content--loading-more]=\"isLoadingMore\"\n >\n\n <fs-add-new-item-button\n *ngIf=\"!options.hasNewItemButtonAtEnd && options.hasAddNewItemButton && items?.length < showAddNewItemButtonForItemAmount\"\n [itemType]=\"itemType\"\n [isEvent]=\"options.isEvent\"\n (click)=\"addNewItemButtonClick()\"\n ></fs-add-new-item-button>\n\n <fs-slide\n *ngFor=\"let item of items; let i = index; trackBy: trackByFn\"\n [itemType]=\"itemType\"\n [item]=\"item\"\n [currentUsername]=\"currentUsername\"\n [isModerated]=\"isModerated\"\n [canModerate]=\"canModerate\"\n [canShare]=\"canShare\"\n [showAvatar]=\"options.showAvatar\"\n [isProjectMember]=\"isProjectMember\"\n [isEvent]=\"options.isEvent\"\n (itemClick)=\"itemClick.emit($event)\"\n ></fs-slide>\n\n <fs-add-new-item-button\n *ngIf=\"options.hasNewItemButtonAtEnd\"\n [itemType]=\"itemType\"\n [isEvent]=\"options.isEvent\"\n (click)=\"addNewItemButtonClick()\"\n ></fs-add-new-item-button>\n \n\n <!-- undefined: items are still being loaded -->\n <ng-container *ngIf=\"!items\">\n <fs-slide\n *ngFor=\"let item of [null, null, null, null]; let i = index\"\n [itemType]=\"itemType\"\n [item]=\"item\"\n [showAvatar]=\"false\"\n ></fs-slide>\n </ng-container>\n\n <!-- loading more spinner -->\n <div class=\"carousel__container__content__spinner\">\n <ion-spinner slot=\"start\" name=\"crescent\"></ion-spinner>\n </div>\n\n <!-- empty array: items are loaded but there are no actual items -->\n <ng-container *ngIf=\"!options.hasAddNewItemButton && items?.length === 0\">\n <div class=\"carousel__container__empty\">\n {{ 'LISTS.NO_ITEMS' | translate }}\n </div>\n </ng-container>\n </div>\n </div>\n</div>\n","/** @format */\n\nimport {\n Component,\n Input,\n ChangeDetectionStrategy,\n Output,\n EventEmitter,\n ViewChild,\n ElementRef,\n AfterViewInit,\n OnChanges,\n OnInit,\n SimpleChanges,\n} from '@angular/core';\nimport { NgIf, NgFor, AsyncPipe } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonIcon, IonSpinner, Platform } from '@ionic/angular/standalone';\nimport { Subject } from 'rxjs';\nimport { getId as getStackId } from '@store/selectors/stacks.selectors';\nimport { getId as getClipId } from '@store/selectors/clips.selectors';\nimport { UserService } from '@app/core/services/user.service';\nimport { DiscoverCardClick } from '@app/shared/models/layout.model';\nimport { ITEM_TYPE, FlexiblePartialItem, LayoutOptions } from '@app/shared/models/layout.model';\nimport { FsAddNewItemButtonComponent } from './fs-add-new-item-button/fs-add-new-item-button.component';\nimport { FsSlideComponent } from './fs-slide/fs-slide.component';\nimport { environment } from 'src/environments/environment';\n\nexport class CarouselOptions extends LayoutOptions {\n // inherited from LayoutOptions:\n // hasAddNewItemButton = false;\n // hasNewItemButtonAtEnd = false;\n // isEvent = false;\n\n constructor(opts: object) {\n super(opts);\n if (opts != null) {\n Object.entries(opts)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n .filter(([key, value]) => Object.getOwnPropertyNames(this).includes(key))\n .forEach(([key, value]) => (this[key] = value));\n }\n }\n}\n\nconst DEBUG_LOGS = false;\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'fs-carousel',\n templateUrl: './fs-carousel.component.html',\n styleUrls: ['./fs-carousel.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [NgIf, NgFor, AsyncPipe, TranslatePipe, FsAddNewItemButtonComponent, FsSlideComponent, IonIcon, IonSpinner],\n})\nexport class FsCarouselComponent implements AfterViewInit, OnInit, OnChanges {\n @Input() items: FlexiblePartialItem[];\n // we need to know if more items can be loaded after the end has been reached\n @Input() canLoadMore: boolean;\n @Input() isLoadingMore = false;\n @Input() itemType: ITEM_TYPE;\n @Input() heading?: string;\n /** Showing on a Project.isModerated page */\n @Input() isModerated = false;\n @Input() canModerate = false;\n @Input() canShare = true;\n @Input() isProjectMember = false;\n @Input() currentUsername;\n\n /**\n * @Input Setter Getter\n * https://stackoverflow.com/a/40764091/4982169\n */\n @Input()\n set options(obj: object) {\n this._options = new CarouselOptions(obj);\n }\n get options(): CarouselOptions {\n return this._options;\n }\n\n @Output() newItemClick = new EventEmitter<void>();\n @Output() itemClick = new EventEmitter<DiscoverCardClick>();\n @Output() loadMore = new EventEmitter<void>();\n\n scrolledLeft$ = new Subject<boolean>();\n scrolledRight$ = new Subject<boolean>();\n itemTypes = ITEM_TYPE;\n // loadMore will only emit once for if the user has scrolled to the end and items.length !== loadMoreEmittedForItemAmount\n loadMoreEmittedForItemAmount = 0;\n showAddNewItemButtonForItemAmount: number;\n\n @ViewChild('carousel', { static: false }) carousel: ElementRef;\n\n private _options: CarouselOptions;\n private _timeoutScrollTo;\n\n constructor(private userService: UserService, private platform: Platform) {}\n\n ngOnInit(): void {\n this.platform.ready().then(() => {\n /**\n * \"Add New item for desktop when user has less than 3 items in carousel. Show on mobile only when no items.\"\n * https://filmstacker.atlassian.net/browse/MVP-1178\n */\n this.showAddNewItemButtonForItemAmount = this.platform.is('desktop') ? 3 : 1;\n });\n if (!this.currentUsername) {\n this.currentUsername = this.userService.getUsername();\n }\n }\n\n async ngAfterViewInit() {\n // @note setTimeout hack because its children is disconnected from life cycle hook due to componentFactory\n await new Promise((resolve) => setTimeout(resolve));\n this.calculateScrolls();\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n if (this.carousel) {\n // @note setTimeout hack because its children is disconnected from life cycle hook due to componentFactory\n await new Promise((resolve) => setTimeout(resolve));\n this.calculateScrolls();\n\n // scroll to items when length or currentUser changes\n if (this.itemType === this.itemTypes.Users) {\n const {\n items: { currentValue: currentItemValue = [], previousValue: previousItemValue = null } = {},\n currentUsername: {\n currentValue: currentUsernameValue = [],\n previousValue: previousUsernameValue = null,\n } = {},\n } = changes;\n if (\n (currentItemValue?.length > 0 && currentItemValue.length !== previousItemValue?.length) ||\n (currentUsernameValue && currentUsernameValue !== previousUsernameValue)\n ) {\n // console.log({ msg: 'do it', currentUsernameValue, itemType: this.itemType });\n const scrollLeftWas = this.carousel?.nativeElement?.scrollLeft;\n clearTimeout(this._timeoutScrollTo);\n this._timeoutScrollTo = setTimeout(() => {\n this.scrollItemIntoView(scrollLeftWas);\n }, 2000);\n }\n }\n }\n }\n\n addNewItemButtonClick() {\n this.newItemClick.emit();\n }\n\n calculateScrolls() {\n const { scrollLeft, scrollWidth, clientWidth } = this.carousel.nativeElement;\n this.scrolledRight$.next(scrollLeft + clientWidth === scrollWidth);\n this.scrolledLeft$.next(scrollLeft === 0);\n // check if the end of the carousel has been reached and if loadMore needs to be emitted\n const width = scrollWidth - clientWidth;\n if (\n this.items &&\n this.items.length > 0 &&\n this.canLoadMore &&\n scrollLeft === width &&\n this.items.length !== this.loadMoreEmittedForItemAmount\n ) {\n this.loadMoreEmittedForItemAmount = this.items.length;\n this.loadMore.emit();\n }\n }\n\n navigate(direction: 'right' | 'left') {\n const { scrollLeft, scrollWidth, clientWidth } = this.carousel.nativeElement;\n const buffer = 125;\n const left =\n direction === 'right'\n ? Math.min(scrollLeft + clientWidth - buffer, scrollWidth - clientWidth)\n : Math.max(scrollLeft - clientWidth + buffer, 0);\n this.carousel.nativeElement.scrollTo({\n top: 0,\n left,\n behavior: 'smooth',\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackByFn(_index: number, item: any) {\n // NOTE: this.itemType is not defined...\n if (!item) {\n return _index;\n }\n if (item.projectId && item.stackId) {\n return getStackId(item.projectId, item.stackId);\n } else if (item.projectId && item.id) {\n return getClipId(item.projectId, item.id);\n } else if (item.id) {\n return item.id;\n } else if (item.userId) {\n return item.userId;\n } else {\n return _index;\n }\n }\n\n /* eslint-disable @typescript-eslint/member-ordering */\n private _scrollTimeout;\n private _closeTimeout;\n private _itemSelectedTimeout;\n /* eslint-enable @typescript-eslint/member-ordering */\n\n private scrollItemIntoView(origScrollLeft = 0) {\n clearTimeout(this._scrollTimeout);\n this._scrollTimeout = setTimeout(() => {\n try {\n const OFFSET_PADDING = 100;\n if (this.carousel && this.carousel.nativeElement) {\n const container = this.carousel.nativeElement;\n const selected = container.querySelector('.carousel__container__content .user-slide.user-slide__selected');\n if (selected?.offsetLeft > 0) {\n // if the user has moved the scroller, don't animate, plz\n if (container.scrollLeft === origScrollLeft) {\n const offsetLeft = selected.offsetLeft;\n DEBUG_LOGS &&\n console.log(`scrollItemIntoView`, {\n offsetLeft,\n scrollLeft: container.scrollLeft,\n origScrollLeft,\n selected,\n container,\n });\n // container.scrollLeft = selected[0].offsetLeft;\n this.carousel.nativeElement.scrollTo({\n top: 0,\n left: offsetLeft > OFFSET_PADDING ? offsetLeft - OFFSET_PADDING : 0,\n behavior: 'smooth',\n });\n } else {\n DEBUG_LOGS &&\n console.log('Skipping scroll since it was changed...', {\n scrollLeft: container.scrollLeft,\n origScrollLeft,\n selected,\n });\n }\n } else {\n !environment.production && console.log('User carousel selected item not found?', { container, selected });\n }\n }\n } catch (error) {\n console.log(`Caught Error in scrollItemIntoView`, error);\n }\n }, 500); // 500ms animation\n }\n}\n","<ng-container *ngIf=\"item; then hasItem; else hasNoItem\"> </ng-container>\n\n<ng-template #hasItem>\n <div class=\"stack-slide\" [class.is-locked]=\"!canPlay && !canCollaborate\">\n <fs-thumbnail-poster\n [item]=\"item\"\n [isModerated]=\"isModerated\"\n [canModerate]=\"canModerate\"\n [currentUserId]=\"currentUsername\"\n [canCollaborate]=\"canCollaborate\"\n [isProjectMember]=\"isProjectMember\"\n (click)=\"open($event, item)\"\n ></fs-thumbnail-poster>\n <fs-ellipsis-button\n class=\"stack-slide__more\"\n [class.stack-slide__more--active]=\"(popoverOpen$ | async) === true\"\n (click)=\"openPopover($event)\"\n ></fs-ellipsis-button>\n <h3 class=\"stack-slide__title\" (click)=\"open($event, item)\">\n {{ item.title }}\n </h3>\n <!-- tood: [likes]=\"item.likes\" -->\n <fs-uploader-stats\n [date]=\"item.dteSaved\"\n [views]=\"item.views\"\n [shares]=\"item.shares\"\n [likes]=\"-1\"\n [stacks]=\"item.playlist?.length\"\n [stacksTitle]=\"'CLIP.CLIPS_IN_PLAYLIST' | translate\"\n [showAvatar]=\"showAvatar\"\n [userId]=\"item.userId\"\n [isCollaborative]=\"item.isCollaborative\"\n [indicateNotHls]=\"!item.hlsSrc\"\n [indicateNeedsApproved]=\"isModerated && !item.isApproved\"\n >\n </fs-uploader-stats>\n <!-- moved to uploader stats -->\n <!-- <div *ngIf=\"item.isCollaborative\" class=\"indicator-icon\" [title]=\"'STACK.COLLABORATIVE_DRAFT' | translate\">\n <ion-icon name=\"people-outline\" class=\"no-pointer-events\"></ion-icon>\n </div> -->\n\n <!-- <div *ngIf=\"isModerated && !item.isApproved\" class=\"approved-indicator\" [title]=\"'STACK.ACTIONS.REQUIRES_MODERATION' | translate\">\n <ion-button size=\"small\" fill=\"clear\" color=\"medium\" (click)=\"moderate($event)\">\n {{ 'STACK.ACTIONS.NEEDS_REVIEW' | translate }}\n <ion-icon name=\"lock-closed-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </div> -->\n <!-- for dev - to be removed -->\n <!-- <div *ngIf=\"item.hlsSrc\" class=\"hls-indicator\" title=\"Premiere Quality\">\n <ion-icon name=\"aperture-sharp\" class=\"no-pointer-events\"></ion-icon>\n </div>\n <div *ngIf=\"item.isApproved\" class=\"approved-indicator\" title=\"Moderated\">\n <ion-icon name=\"thumbs-up-outline\" class=\"no-pointer-events\"></ion-icon>\n </div> -->\n <!-- end remove -->\n </div>\n</ng-template>\n\n<ng-template #hasNoItem>\n <div class=\"stack-slide\">\n <div class=\"stack-slide__image\"></div>\n <div\n class=\"stack-slide__title\"\n style=\"background: var(--background); width: 40%; height: 20px\"\n ></div>\n <div\n class=\"stack-slide__content\"\n style=\"background: var(--background); width: 80%; height: 20px\"\n ></div>\n </div>\n</ng-template>\n","/** @format */\n\nimport { Component, Input, EventEmitter, Output } from '@angular/core';\nimport { NgIf, AsyncPipe } from '@angular/common';\nimport { PopoverController, NavController } from '@ionic/angular/standalone';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { Subject } from 'rxjs';\nimport { EDIT_ROUTE, WATCH_ROUTE } from '@app/app.routes';\nimport { DiscoverCardClick, ITEM_TYPE } from '@app/shared/models/layout.model';\nimport { Stack } from '@app/shared/models/stack.model';\nimport { EllipsisButtonComponent } from '@app/shared/components/ui/buttons/ellipsis-button/ellipsis-button.component';\nimport { ThumbnailPosterComponent } from '@app/shared/components/thumbnail-poster/thumbnail-poster.component';\nimport { UploaderStatsComponent } from '@app/shared/components/ui/upload-stats/uploader-stats.component';\nimport { StackPopoverActionsComponent } from './stack-popover-actions/stack-popover-actions.component';\n\n@Component({\n selector: 'app-stack-slide',\n templateUrl: './stack-slide.component.html',\n styleUrls: ['./stack-slide.component.scss'],\n standalone: true,\n imports: [NgIf, ThumbnailPosterComponent, EllipsisButtonComponent, UploaderStatsComponent, AsyncPipe, TranslatePipe],\n})\nexport class StackSlideComponent {\n @Input() item: Stack;\n /** should be currentUserId, really */\n @Input() currentUsername: string;\n /** Showing on a Project.isModerated page */\n @Input() isModerated = false;\n /** isProjectAdmin, canFeature too */\n @Input() canModerate = false;\n @Input() canShare = true;\n @Input() showAvatar = true;\n @Input() isProjectMember = false;\n\n @Output() itemClick = new EventEmitter<DiscoverCardClick>();\n\n popoverOpen$ = new Subject<boolean>();\n\n get isMine(): boolean {\n return this.currentUsername === this.item.userId;\n }\n // if i am crew and this is a moderated stack, i can play it\n get canPlay(): boolean {\n return (\n this.isMine ||\n this.isProjectMember ||\n !this.isModerated ||\n this.canModerate ||\n (this.isModerated && this.item.isApproved)\n );\n }\n get canApprove(): boolean {\n return this.isModerated && this.canModerate;\n }\n get canCollaborate(): boolean {\n return this.isProjectMember && this.item && this.item.isCollaborative && this.item.isCollaborative > 0;\n }\n\n constructor(private popoverCtrl: PopoverController, private navCtrl: NavController) {}\n\n open(event, item: Stack) {\n if (!item || !item.projectId || !item.stackId) {\n console.warn(`[StackSlide] open !item or ids?`, item);\n return;\n }\n if (!this.canPlay && !this.canCollaborate) {\n console.log(`Stack must be Moderated first... (${this.isProjectMember})`);\n return;\n }\n if (item.dtePublished) {\n this.navCtrl.navigateForward(`/${WATCH_ROUTE}/${item.projectId}/${item.stackId}`);\n } else {\n /**\n * we are defaulting to an open stack action,\n * if it's a collaborative Draft & i can collaborate -> autoOpenCapture\n */\n this.navCtrl.navigateForward(`/${EDIT_ROUTE}/${item.projectId}/${item.stackId}`, {\n ...(!this.isMine && item.isCollaborative && this.canCollaborate\n ? {\n state: {\n autoOpenCapture: true,\n },\n }\n : {}),\n });\n }\n this.itemClick.emit({ event, item, itemType: ITEM_TYPE.Stacks });\n }\n\n async openPopover(event: MouseEvent) {\n this.popoverOpen$.next(true);\n const popover = await this.popoverCtrl.create({\n component: StackPopoverActionsComponent,\n componentProps: {\n stack: this.item,\n // add the moderation actions\n isModerated: this.isModerated,\n canAddToStack: this.canPlay,\n canShare: this.canShare && this.canPlay,\n canApprove: this.canApprove,\n canFeature: this.canModerate,\n isProjectMember: this.isProjectMember,\n },\n event,\n });\n await popover.present();\n await popover.onWillDismiss();\n this.popoverOpen$.next(false);\n }\n}\n","/** @format */\n\nimport { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { PopoverController, NavController, ModalController, AlertController } from '@ionic/angular/standalone';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Subject } from 'rxjs';\nimport { filter, take, takeUntil } from 'rxjs/operators';\nimport { MyStackService } from '@app/core/services/mystack.service';\nimport { ClipsCoreService } from '@app/core/services/clips.service';\nimport { UserService } from '@app/core/services/user.service';\nimport { VideoService } from '@app/core/services/video.service';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { Clip } from '@app/shared/models/clip.model';\nimport { ModalReportComponent } from '@app/shared/components/modal-report/modal-report.component';\nimport { ActionPopoverComponent, PopoverAction } from '@app/shared/components/action-popover/action-popover.component';\nimport { EDIT_CLIP_ROUTE } from '@app/app.routes';\n\n@Component({\n selector: 'app-clip-popover-actions',\n templateUrl: './clip-popover-actions.component.html',\n styleUrls: ['./clip-popover-actions.component.scss'],\n standalone: true,\n imports: [ActionPopoverComponent],\n})\nexport class ClipPopoverActionsComponent implements OnInit, OnDestroy {\n @Input() clip: Clip;\n @Input() canEdit = false;\n @Input() canAddToStack = true;\n @Input() canApprove = false;\n @Input() showText = true;\n\n actions: PopoverAction[] = [];\n\n private didAddUserActions = false;\n private onDestroy$ = new Subject<void>();\n\n constructor(\n private popoverCtrl: PopoverController,\n private mystackService: MyStackService,\n private navCtrl: NavController,\n private modalCtrl: ModalController,\n private alertCtrl: AlertController,\n private userService: UserService,\n private clipService: ClipsCoreService,\n private videoService: VideoService,\n private toaster: ToasterService,\n private route: ActivatedRoute,\n private router: Router,\n private translate: TranslateService\n ) {}\n\n ngOnInit() {\n this.translate\n .get([\n 'STACK.ACTIONS.REPORT',\n 'STACK.ACTIONS.ADD_TO_STACK',\n 'CLIP.APPROVE',\n 'CLIP.UNAPPROVE',\n 'CLIP.EDIT',\n 'COMMON.DELETE',\n ])\n .pipe(take(1))\n .subscribe((translated) => {\n this.actions.push({ type: 'flag', text: translated['STACK.ACTIONS.REPORT'], icon: 'flag-outline' });\n\n if (this.canAddToStack) {\n this.actions.unshift({\n type: 'add-to-stack',\n text: translated['STACK.ACTIONS.ADD_TO_STACK'],\n icon: 'add-outline',\n });\n }\n if (this.canApprove) {\n if (this.clip.isApproved) {\n // remove-circle-outline\n this.actions.unshift({\n type: 'un-approve',\n text: translated['CLIP.UNAPPROVE'],\n icon: 'lock-closed-outline',\n });\n } else {\n this.actions.unshift({ type: 'approve', text: translated['CLIP.APPROVE'], icon: 'checkmark' });\n }\n }\n this.userService.userId$.pipe(takeUntil(this.onDestroy$)).subscribe((userId) => {\n // console.log(`sub userId '${userId}' clip:`, this.clip);\n if (userId && this.clip && this.clip.userId === userId) {\n // IS the current user's clip\n if (!this.didAddUserActions) {\n this.didAddUserActions = true;\n this.actions.push({\n type: 'edit',\n text: translated['CLIP.EDIT'],\n icon: 'create-outline',\n });\n this.actions.push({\n type: 'delete',\n text: translated['COMMON.DELETE'],\n icon: 'trash-outline',\n });\n }\n } else if (this.canEdit) {\n this.actions.push({\n type: 'edit',\n text: translated['CLIP.EDIT'],\n icon: 'create-outline',\n });\n } else if (this.didAddUserActions) {\n // they might have just logged off\n this.actions = this.actions.filter((a) => a.type !== 'delete' && a.type !== 'edit');\n this.didAddUserActions = false;\n }\n });\n\n /**\n * Check currentUser Cognito Groups for Admin access to platform\n * DEV HLS TRANSCODE MVP-742\n */\n this.userService.userIsGlobalAdmin$\n .pipe(\n takeUntil(this.onDestroy$),\n filter((isAdmin) => !!isAdmin)\n )\n .subscribe(() => {\n if (this.clip && !this.clip.hlsSrc && !this.clip.youtube_id) {\n this.actions.push({ type: 'admin_hls', text: 'Transcode HLS', icon: 'aperture-sharp' }); // aperture-sharp\n }\n });\n });\n }\n\n ngOnDestroy() {\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n\n async onSelected(type: string) {\n // console.log(type);\n switch (type) {\n case 'approve': {\n this.clipService.setClipIsApproved({\n projectId: this.clip.projectId,\n id: this.clip.id,\n userId: this.clip.userId,\n isApproved: true,\n });\n break;\n }\n case 'un-approve': {\n this.clipService.setClipIsApproved({\n projectId: this.clip.projectId,\n id: this.clip.id,\n userId: this.clip.userId,\n isApproved: false,\n });\n break;\n }\n case 'edit': {\n const returnUrl = this.router.url;\n this.navCtrl.navigateForward(`/${EDIT_CLIP_ROUTE}/${this.clip.projectId}/${this.clip.id}`, {\n state: { returnUrl },\n queryParams: { returnUrl },\n });\n // in case the actions are displayed in a modal we want to close the modal\n const modal = await this.modalCtrl.getTop();\n if (modal) {\n modal.dismiss();\n }\n break;\n }\n case 'add-to-stack': {\n if (this.clip && this.clip.id) {\n this.mystackService.addClipsToMyStack([this.clip]);\n } else {\n this.toaster.present(this.translate.instant('CLIP.ERROR_NOT_FOUND'));\n }\n break;\n }\n case 'flag': {\n const modal = await this.modalCtrl.create({\n component: ModalReportComponent,\n componentProps: { reportedItem: this.clip },\n });\n await modal.present();\n break;\n }\n case 'delete': {\n this.confirmDelete();\n break;\n }\n case 'admin_hls': {\n // this.toaster.present(`Transcode to HLS...`);\n this.confirmTranscode();\n break;\n }\n default:\n console.log(`@todo action ${type}`);\n }\n const popover = await this.popoverCtrl.getTop();\n if (popover) {\n popover.dismiss();\n }\n }\n\n async confirmDelete() {\n const alert = await this.alertCtrl.create({\n cssClass: 'alert-confirm-delete',\n header: this.translate.instant('CLIP.CONFIRM_DELETE'),\n subHeader: this.translate.instant('CLIP.ACTION_CONFIRM'),\n message: this.translate.instant('CLIP.CONFIRM_DELETE_MSG', {\n title: this.clip.title\n ? this.translate.instant('CLIP.CONFIRM_DELETE_TITLE', { value: this.clip.title })\n : this.translate.instant('CLIP.CONFIRM_DELETE_NO_TITLE'),\n }),\n buttons: [\n {\n text: this.translate.instant('COMMON.CANCEL'),\n role: 'cancel',\n handler: () => {\n console.log('Confirm Canceled...');\n },\n },\n {\n text: this.translate.instant('COMMON.DELETE'),\n cssClass: 'ion-color-secondary',\n handler: () =>\n this.clipService\n .deleteClip(this.clip)\n .then(() => {\n this.toaster.present(this.translate.instant('CLIP.DELETED'));\n })\n .catch((error) => {\n console.warn(`[ClipPopover] deleteClip caught:`, error);\n this.toaster.present(this.translate.instant('ERRORS.GENERIC_OOPS'));\n }),\n },\n ],\n });\n return await alert.present();\n }\n\n /**\n * DEV HLS TRANSCODE MVP-742\n */\n async confirmTranscode() {\n return await this.videoService.confirmSendClipForHLSTranscode(this.clip);\n }\n}\n","<app-action-popover [actions]=\"actions\" [showText]=\"showText\" (selected)=\"onSelected($event)\">\n</app-action-popover>\n","<ng-container *ngIf=\"item; then hasItem; else hasNoItem\"> </ng-container>\n\n<ng-template #hasItem>\n <div class=\"clip-tile\" [class.clip-tile--added]=\"isAddedToMyStack\" [class.clip-tile--no-click]=\"!canAddToStack\">\n <!-- includesmoderation ui -->\n <fs-thumbnail-poster\n [item]=\"item\"\n [isModerated]=\"isModerated\"\n [canModerate]=\"canModerate\"\n [currentUserId]=\"currentUserId\"\n (click)=\"openModal($event)\"\n class=\"clip-tile__image\"\n ></fs-thumbnail-poster>\n <!-- <div\n class=\"clip-tile__image\"\n [style.background-image]=\"'url(' + item.poster + ')'\"\n (click)=\"openModal($event)\"\n ></div> -->\n <!-- <div class=\"clip-tile__duration\">\n {{ item.duration | duration }}\n </div> -->\n <div class=\"clip-tile__content\">\n <h3 class=\"clip-tile__content__title\" (click)=\"openModal($event)\">\n {{ (item.title || item.id) | sentenceCase }} \n </h3>\n <fs-uploader-stats\n [date]=\"item.created | date\"\n [userId]=\"item.userId\"\n [showAvatar]=\"true\"\n [showStats]=\"true\"\n [stacks]=\"item.numStacks\"\n [indicateNotHls]=\"!(item?.hlsSrc?.length > 0)\"\n [indicateNeedsApproved]=\"isModerated && !item.isApproved\"\n [views]=\"-1\"\n ></fs-uploader-stats>\n \n <div *ngIf=\"canAddToStack\" class=\"clip-tile__content__quick-action\">\n <ion-button\n color=\"medium\"\n style=\"height: 48px; width: 48px\"\n [fill]=\"isAddedToMyStack ? 'solid' : 'outline'\"\n (click)=\"toggleClipInMyStacks(item, $event)\"\n >\n <div style=\"font-size: 30px; display: flex\">\n <ng-container *ngIf=\"isAddedToMyStack\">\n <ion-icon name=\"checkmark-outline\"></ion-icon>\n </ng-container>\n <ng-container *ngIf=\"!isAddedToMyStack\">\n <ion-icon name=\"add-outline\"></ion-icon>\n </ng-container>\n </div>\n </ion-button>\n </div>\n <div class=\"clip-tile__content__action\">\n <fs-ellipsis-button (click)=\"openActions($event)\"></fs-ellipsis-button>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #hasNoItem>\n <div class=\"clip-tile\">{{ 'LISTS.NO_ITEM' | translate }}</div>\n</ng-template>\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgIf, DatePipe } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonButton, ModalController, PopoverController, IonIcon } from '@ionic/angular/standalone';\nimport { MyStackService } from '@app/core/services/mystack.service';\nimport { EllipsisButtonComponent } from '@app/shared/components/ui/buttons/ellipsis-button/ellipsis-button.component';\nimport { SentenceCasePipe } from '@app/shared/pipes/sentence-case.pipe';\nimport { Clip } from '@app/shared/models/clip.model';\nimport { Utils } from '@app/shared/utils';\nimport { ThumbnailPosterComponent } from '@app/shared/components/thumbnail-poster/thumbnail-poster.component';\nimport { UploaderStatsComponent } from '@app/shared/components/ui/upload-stats/uploader-stats.component';\nimport { ClipPopoverActionsComponent } from './clip-popover-actions/clip-popover-actions.component';\n\n@Component({\n selector: 'app-clip-tile',\n templateUrl: './clip-tile.component.html',\n styleUrls: ['./clip-tile.component.scss'],\n standalone: true,\n imports: [\n NgIf,\n TranslatePipe,\n DatePipe,\n SentenceCasePipe,\n ThumbnailPosterComponent,\n UploaderStatsComponent,\n EllipsisButtonComponent,\n IonButton,\n IonIcon,\n ],\n})\nexport class ClipTileComponent {\n @Input() item: Clip;\n @Input() isAddedToMyStack: boolean;\n @Input() canEdit: boolean = false;\n /** Showing on a Project.isModerated page */\n @Input() isModerated = false;\n @Input() canModerate = false;\n @Input() showAvatar = false;\n @Input() currentUserId: string;\n\n get isMine(): boolean {\n return this.currentUserId && this.currentUserId === this.item.userId;\n }\n get canApprove(): boolean {\n return this.isModerated && this.canModerate;\n }\n get canAddToStack(): boolean {\n return this.isMine || !this.isModerated || this.canModerate || (this.isModerated && this.item.isApproved);\n }\n\n constructor(\n private popoverCtrl: PopoverController,\n private modalCtrl: ModalController,\n private mystackService: MyStackService\n ) {}\n\n async openActions(event: MouseEvent) {\n Utils.tryPreventDefault(event);\n Utils.tryStopPropagation(event);\n const popover = await this.popoverCtrl.create({\n component: ClipPopoverActionsComponent,\n componentProps: {\n clip: this.item,\n canEdit: this.canEdit,\n canAddToStack: this.canAddToStack,\n canApprove: this.canApprove,\n },\n event,\n });\n return await popover.present();\n }\n\n async toggleClipInMyStacks(item: Clip, event: MouseEvent) {\n Utils.tryPreventDefault(event); // why is the search form getting selected on ios?!\n Utils.tryStopPropagation(event);\n if (this.isAddedToMyStack) {\n /**\n * FIXED: Property 'removeClipFromMyStack' does not exist on type 'MyStackService'.\n */\n this.mystackService.removeClipFromMyStack(item);\n } else {\n this.mystackService.addClipsToMyStack([item]);\n }\n }\n\n async openModal(event: MouseEvent) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { ClipTileDetailModal } = await import(\n /* webpackPrefetch: true */\n '@app/clips/shared/components/clip-tile-detail/clip-tile-detail.modal'\n );\n Utils.tryPreventDefault(event);\n Utils.tryStopPropagation(event);\n if (!this.canAddToStack) {\n return console.log(`Clip awaiting moderation..`);\n }\n // console.log('item', this.item);\n const modal = await this.modalCtrl.create({\n component: ClipTileDetailModal,\n componentProps: {\n title: this.item.title,\n item: this.item,\n canEdit: this.canEdit,\n },\n cssClass: 'modal-lg',\n });\n return await modal.present();\n }\n}\n","<div class=\"grid\">\n <div class=\"container\">\n <div class=\"row\">\n <!-- STACKS -->\n <ng-container *ngIf=\"itemType === itemTypes.Stacks\">\n <div\n class=\"col-lg-3 col-md-4 col-sm-6 col-12\"\n *ngFor=\"let item of items\"\n >\n <app-stack-slide \n [item]=\"asStack(item)\" \n [showAvatar]=\"options.showAvatar\"\n [isModerated]=\"isModerated\"> </app-stack-slide>\n </div>\n </ng-container>\n\n <!-- CLIPS -->\n <ng-container *ngIf=\"itemType === itemTypes.Clips\">\n <ng-container *ngIf=\"myStackClipIds$ | async as myStackClipIds\">\n <ng-container *ngIf=\"isLoading\">\n <div class=\"grid__container__empty\">\n <ion-spinner></ion-spinner> <span class=\"loading-spinner-text\">Loading...</span>\n </div>\n </ng-container>\n <div\n class=\"col-xl-3 col-lg-4 col-md-6 col-12\"\n *ngFor=\"let item of items\"\n >\n <app-clip-tile\n [item]=\"asClip(item)\"\n [isAddedToMyStack]=\"myStackClipIds.indexOf(getClipId(item)) !== -1\"\n [canEdit]=\"canEdit\"\n [currentUserId]=\"userService.userId$ | async\"\n [isModerated]=\"isModerated\"\n [canModerate]=\"canModerate\"\n [showAvatar]=\"options.showAvatar\"\n >\n </app-clip-tile>\n </div>\n\n <!-- empty array: items are loaded but there are no actual items -->\n <ng-container *ngIf=\"!isLoading && items && items.length === 0\">\n <div class=\"grid__container__empty\">\n {{ 'LISTS.NO_ITEMS' | translate }}\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>\n","/** @format */\n\nimport { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\nimport { NgIf, NgFor, AsyncPipe } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonSpinner } from '@ionic/angular/standalone';\nimport { Observable } from 'rxjs';\nimport { Store } from '@ngrx/store';\nimport { State } from '@store/reducers';\nimport { selectMyStackClipIds } from '@store/selectors/mystack.selectors';\nimport { getId } from '@store/selectors/clips.selectors';\nimport { UserService } from '@app/core/services/user.service';\nimport { Clip } from '@app/shared/models/clip.model';\nimport { Stack } from '@app/shared/models/stack.model';\nimport { ClipTileComponent } from '@app/shared/components/fs-grid/clip-tile/clip-tile.component';\n\nimport { StackSlideComponent } from '@app/shared/components/fs-carousel/fs-slide/stack-slide/stack-slide.component';\nimport { ITEM_TYPE, LayoutOptions, DiscoverCardClick, FlexiblePartialItem } from '@app/shared/models/layout.model';\n\nexport class GridOptions extends LayoutOptions {}\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'fs-grid',\n templateUrl: './fs-grid.component.html',\n styleUrls: ['./fs-grid.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [NgIf, NgFor, AsyncPipe, TranslatePipe, StackSlideComponent, ClipTileComponent, IonSpinner],\n})\nexport class FsGridComponent {\n @Input() items: FlexiblePartialItem[];\n @Input() itemType: ITEM_TYPE;\n @Input() heading?: string;\n @Input() isLoading = false;\n @Input() canEdit: boolean = false;\n /** Showing on a Project.isModerated page */\n @Input() isModerated = false;\n @Input() canModerate = false;\n\n /**\n * @Input Setter Getter\n * https://stackoverflow.com/a/40764091/4982169\n */\n @Input()\n set options(obj: object) {\n this._options = new GridOptions(obj);\n }\n get options(): GridOptions {\n return this._options;\n }\n\n myStackClipIds$: Observable<string[]> = this.store.select(selectMyStackClipIds);\n\n @Output() itemClick = new EventEmitter<DiscoverCardClick>();\n\n itemTypes = ITEM_TYPE;\n\n private _options: GridOptions;\n\n constructor(private store: Store<State>, public userService: UserService) {}\n\n onClickItem(item) {\n this.itemClick.emit(item);\n }\n\n // getClipId = getId;\n public getClipId(item: FlexiblePartialItem): string {\n const { projectId, id } = item as Clip;\n return getId(projectId, id);\n }\n\n public asStack(item: FlexiblePartialItem): Stack {\n return item as Stack;\n }\n\n public asClip(item: FlexiblePartialItem): Clip {\n return item as Clip;\n }\n}\n","<div\n class=\"thumbnail-poster\"\n [class.thumbnail-poster--needs-moderation]=\"isModerated && !item.isApproved\"\n [class.thumbnail-poster--can-moderate]=\"canModerate\"\n [class.thumbnail-poster--is-playing]=\"isPlaying\"\n [class.thumbnail-poster--is-current]=\"isCurrent\"\n [class.thumbnail-poster--is-mine]=\"isMine\"\n [class.thumbnail-poster--is-collab-draft]=\"!isMine && canCollaborate\"\n [class.thumbnail-poster--can-play]=\"canPlay\"\n [class.thumbnail-poster--clip]=\"isClip(item)\"\n [class.thumbnail-poster--stack]=\"isStack(item)\"\n>\n <!-- why is this not updating? <div class=\"thumbnail-poster__image\" data-[style.background-image]=\"'url(' + item.poster + '), url(' + fallbackImg + ')'\"></div> -->\n <div class=\"thumbnail-poster__image\" [style.background-image]=\"posterBgImg\"></div>\n <div *ngIf=\"showDuration\" class=\"thumbnail-poster__duration\">{{ item.duration | duration }}</div>\n <div *ngIf=\"showActionIcon\" class=\"thumbnail-poster__play\">\n <ion-icon *ngIf=\"isLockedNoPlay else canPlayIcon\" name=\"lock-closed\" class=\"smaller-icon\"></ion-icon>\n <ng-template #canPlayIcon>\n <ion-icon\n [name]=\"actionIcon\"\n ></ion-icon>\n </ng-template>\n </div>\n <div *ngIf=\"showAvatar\" class=\"thumbnail-poster__avatar\">\n <!-- placeholder -->\n <div *ngIf=\"!avatarUrl\" class=\"thumbnail-poster__avatar__image\"></div>\n <!-- actual avatar -->\n <img\n class=\"thumbnail-poster__avatar__image\"\n *ngIf=\"avatarUrl\"\n [src]=\"avatarUrl\"\n [fallback]=\"avatarFallback\"\n imageFadeIn\n />\n </div>\n <div *ngIf=\"hasProvider\" class=\"thumbnail-poster__provider\">\n <ion-icon size=\"default\" color=\"medium\" name=\"logo-youtube\"></ion-icon>\n </div>\n <div *ngIf=\"isModerated && !item.isApproved\" class=\"thumbnail-poster__approved-indicator\" [title]=\"'STACK.ACTIONS.REQUIRES_MODERATION' | translate\">\n <ion-button size=\"small\" fill=\"clear\" color=\"primary\" [disabled]=\"!canModerate\">\n <ion-icon *ngIf=\"canModerate\" name=\"lock-closed\" slot=\"start\"></ion-icon>\n {{ 'STACK.ACTIONS.' + (canModerate ? 'REVIEW_APPROVE' : 'NEEDS_REVIEW') | translate }}\n </ion-button>\n </div>\n</div>\n","/** @format */\n\nimport { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonIcon, IonButton } from '@ionic/angular/standalone';\nimport { filter, take } from 'rxjs/operators';\nimport { Store } from '@ngrx/store';\nimport { selectProject } from '@store/selectors/projects.selectors';\nimport { Clip } from '@app/shared/models/clip.model';\nimport { Stack, STACK_DEFAULT_POSTER } from '@app/shared/models/stack.model';\nimport { DEFAULT_USER_AVATAR } from '@app/shared/models/user.model';\nimport { DurationRenderPipe } from '@app/shared/pipes/duration-render.pipe';\nimport { ImageFadeInDirective } from '@app/shared/directives/image-fade-in.directive';\nimport { ImageFallbackDirective } from '@app/shared/directives/image-fallback.directive';\nimport { ProjectMemberService } from '@app/project-members/shared/services/project-member.service';\n\nconst FALLBACK_IMG = '/assets/images/default-stack-poster-sm.png'; // appended to the style.background-image as second url, in case poster 404\n\n@Component({\n selector: 'fs-thumbnail-poster',\n templateUrl: './thumbnail-poster.component.html',\n styleUrls: ['./thumbnail-poster.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [IonButton, IonIcon, NgIf, ImageFadeInDirective, ImageFallbackDirective, TranslatePipe, DurationRenderPipe],\n})\nexport class ThumbnailPosterComponent implements OnInit {\n @Input() isPlaying = false;\n @Input() isCurrent = false;\n @Input() wasPlayed = false; // todo: handle addional actions like add to stack\n /** Showing on a Project.isModerated page */\n @Input() isModerated = false;\n @Input() canModerate = false;\n @Input() currentUserId: string;\n @Input() showAvatar = false;\n @Input() showActionIcon = true;\n @Input() showDuration = true;\n @Input() canCollaborate = false;\n @Input() isProjectMember = false;\n // @Input() posterFallback = FALLBACK_IMG;\n\n @Input() set item(value: Clip | Stack) {\n this._item = value;\n\n this.posterBgImg = value?.poster ? 'url(' + value.poster + ')' : 'url(' + this.posterFallback + ')';\n }\n get item(): Clip | Stack {\n return this._item;\n }\n\n /** If not canPlay, then Locked */\n get canPlay(): boolean {\n return (\n this.isMine ||\n this.isProjectMember ||\n !this.isModerated ||\n this.item?.isApproved ||\n this.canModerate ||\n this.canCollaborate\n );\n }\n get isLockedNoPlay(): boolean {\n return !this.canPlay;\n }\n\n get actionIcon(): string {\n if (this.isStack(this.item)) {\n const isPublished = (this.item as Stack)?.dtePublished?.length > 0;\n if (isPublished) {\n return 'play-circle-outline';\n }\n if (this.isMine) {\n return 'create-outline';\n }\n if (this.canCollaborate) {\n return 'add-circle-outline';\n }\n return 'lock-closed';\n } else {\n // isClip\n return this.isPlaying ? 'pause-circle-outline' : 'play-circle-outline';\n }\n }\n\n posterFallback = FALLBACK_IMG;\n isMine = false;\n hasProvider = false;\n avatarUrl: string;\n avatarFallback = DEFAULT_USER_AVATAR;\n posterBgImg = 'url(' + this.posterFallback + ')'; //'url(' + item.poster + '), url(' + this.fallbackImg + ')';\n\n private _item: Clip | Stack;\n\n constructor(private store: Store, private memberService: ProjectMemberService) {}\n\n ngOnInit() {\n this.isMine = this.currentUserId === this.item.userId;\n if (this.showAvatar && this.item && this.item.userId) {\n this.avatarUrl = this.memberService.getUserAvatar(this.item.userId);\n }\n if (this.isClip(this.item) && (this.item.providerId || this.item.youtube_id)) {\n /**\n * @todo handle Vimeo too\n * Currently, hasProvider => logo-youtube\n */\n this.hasProvider = true;\n }\n if (this.isStack(this.item) && (!this.item.poster || this.item.poster === STACK_DEFAULT_POSTER)) {\n this.store\n .select(selectProject(this.item.projectId))\n .pipe(\n filter((p) => !!p?.id),\n take(1)\n )\n .subscribe((proj) => {\n if (proj.hero) {\n this.posterBgImg = 'url(' + proj.hero + ')';\n }\n });\n }\n }\n\n public isStack(item: Clip | Stack): item is Stack {\n return 'stackId' in item;\n }\n\n /**\n * if it's a youtube/vimeo clip there may not be sources or a source\n */\n public isClip(item: Clip | Stack): item is Clip {\n return 'source' in item || 'sources' in item || 'providerId' in item;\n }\n}\n","<div class=\"uploader-stats__date\">\n {{ date | date: 'mediumDate' }}\n</div>\n<div *ngIf=\"showStats\" class=\"uploader-stats__content\">\n <div *ngIf=\"views > -1\" class=\"uploader-stats__content__stats\" title=\"{{ viewsTitle }}\">\n <ion-icon name=\"play-sharp\" class=\"no-pointer-events\"></ion-icon> {{ views || 0 }}<span *ngIf=\"moreViews\">+</span>\n </div>\n <div *ngIf=\"shares > -1\" class=\"uploader-stats__content__stats\" [title]=\"'COMMON.SHARES' | translate\">\n <ion-icon ios=\"share-outline\" md=\"share-social-outline\" class=\"no-pointer-events\"></ion-icon> {{ shares || 0 }}\n </div>\n <div *ngIf=\"likes > -1\" class=\"uploader-stats__content__stats\" [title]=\"'COMMON.LIKES' | translate\">\n <ion-icon name=\"heart-sharp\" class=\"no-pointer-events\"></ion-icon> {{ likes || 0 }}\n </div>\n <div class=\"uploader-stats__content__stats\" title=\"{{ stacksTitle }}\">\n <ion-icon name=\"film-sharp\" class=\"no-pointer-events\"></ion-icon> {{ stacks || 0 }}<span *ngIf=\"moreStacks\">+</span>\n </div>\n <div *ngIf=\"members !== undefined\" class=\"uploader-stats__content__stats\" [title]=\"'COMMON.MEMBERS' | translate\">\n <ion-icon name=\"person-sharp\" class=\"no-pointer-events\"></ion-icon> {{ members || 0 }}\n </div>\n <div *ngIf=\"isCollaborative\" class=\"uploader-stats__content__stats\" [title]=\"'COMMON.COLLABORATIVE' | translate\">\n <ion-icon name=\"people-outline\" class=\"no-pointer-events\"></ion-icon>\n </div>\n <!-- changed to NOT HLS indicator -->\n <div *ngIf=\"indicateNotHls\" class=\"uploader-stats__content__stats\" [title]=\"'COMMON.NOT_PREMIERE_QUALITY' | translate\">\n <ion-icon name=\"aperture-sharp\" class=\"no-pointer-events\"></ion-icon>\n </div>\n <!-- <div *ngIf=\"indicateApproved\" class=\"uploader-stats__content__stats\" [title]=\"'COMMON.MODERATED' | translate\">\n <ion-icon name=\"thumbs-up-outline\" class=\"no-pointer-events\"></ion-icon>\n </div> -->\n <div\n *ngIf=\"indicateNeedsApproved\"\n class=\"uploader-stats__content__stats\"\n [title]=\"'STACK.ACTIONS.REQUIRES_MODERATION' | translate\"\n >\n <ion-icon name=\"lock-closed\" class=\"no-pointer-events\"></ion-icon>\n </div>\n</div>\n<div *ngIf=\"showUploader\" class=\"uploader-stats__profile\">\n <ion-avatar *ngIf=\"showAvatar\" class=\"uploader-stats__profile__avatar\">\n <img class=\"uploader-stats__profile__avatar__image\" *ngIf=\"avatarUrl\" [src]=\"avatarUrl\" [fallback] imageFadeIn />\n </ion-avatar>\n <div class=\"uploader-stats__profile__name\">{{ username$ | async }}</div>\n</div>\n","/** @format */\n\nimport { Component, OnInit, Input } from '@angular/core';\nimport { NgIf, AsyncPipe, DatePipe } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { IonAvatar, IonIcon } from '@ionic/angular/standalone';\nimport { Observable } from 'rxjs';\nimport { DEFAULT_USER_AVATAR } from '@app/shared/models/user.model';\nimport { ImageFadeInDirective } from '@app/shared/directives/image-fade-in.directive';\nimport { ImageFallbackDirective } from '@app/shared/directives/image-fallback.directive';\nimport { ProjectMemberService } from '@app/project-members/shared/services/project-member.service';\n\n@Component({\n selector: 'fs-uploader-stats',\n templateUrl: './uploader-stats.component.html',\n styleUrls: ['./uploader-stats.component.scss'],\n standalone: true,\n imports: [NgIf, ImageFadeInDirective, ImageFallbackDirective, AsyncPipe, DatePipe, TranslatePipe, IonIcon, IonAvatar],\n})\nexport class UploaderStatsComponent implements OnInit {\n @Input() date: string;\n @Input() views: number;\n @Input() likes: number;\n @Input() shares: number;\n @Input() members: number;\n @Input() stacks: number;\n @Input() userId: string;\n @Input() showStats = true;\n @Input() showUploader = true;\n @Input() showAvatar = false;\n @Input() indicateNotHls = false;\n @Input() indicateNeedsApproved = false;\n @Input() isCollaborative = 0;\n\n @Input() viewsTitle = 'Views';\n @Input() stacksTitle = 'Stacks';\n\n /** handle more items to load (+) */\n @Input() moreViews: boolean = false;\n @Input() moreStacks: boolean = false;\n\n avatarUrl: string;\n username$: Observable<string>;\n avatarFallback = DEFAULT_USER_AVATAR;\n\n constructor(private memberService: ProjectMemberService) {}\n\n async ngOnInit() {\n if (this.userId) {\n this.username$ = this.memberService.getPublicUsername(this.userId);\n\n if (this.showAvatar) {\n this.avatarUrl = this.memberService.getUserAvatar(this.userId);\n }\n }\n }\n}\n","/** @format */\n\nimport { Directive, HostListener, HostBinding } from '@angular/core';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[imageFadeIn]',\n standalone: true,\n})\nexport class ImageFadeInDirective {\n @HostBinding('style.opacity') opacity = '0';\n @HostBinding('style.transition') transition = 'opacity 0.4s ease-in-out';\n @HostListener('load') onLoaded() {\n this.opacity = '1';\n }\n}\n","/**\n * eslint-disable @typescript-eslint/naming-convention\n *\n * @format\n */\n\n/* eslint-disable @angular-eslint/directive-selector, @typescript-eslint/naming-convention */\n/**\n * An image directive based on\n * https://medium.com/@sub.metu/angular-fallback-for-broken-images-5cd05c470f08\n */\nimport { Directive, Input, HostBinding } from '@angular/core';\nimport { DEFAULT_USER_AVATAR } from '@app/shared/models/user.model';\n\n@Directive({\n selector: 'img[fallback]',\n /**\n * @todo refactor to support https://angular.io/styleguide#style-06-03\n * HostBinding & HostListener instead of host metadata\n */\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '(error)': 'onError()',\n '(load)': 'load()',\n '[src]': 'src',\n // '[attr.src]': 'finalImage' //the attribute of the host element we want to update. in this case, <img 'src' />\n },\n standalone: true,\n})\nexport class ImageFallbackDirective {\n @Input() src: string;\n @Input() fallback: string = DEFAULT_USER_AVATAR;\n // @Input() loading: string = '/assets/images/loading-spinner.svg';\n // @Input('img-src') targetSource: string;\n @HostBinding('class') className;\n\n // finalImage: any; //property bound to our host attribute.\n\n // ngAfterViewInit() {\n // console.log(`imgFallback targetSource='${this.src}' fallback='${this.fallback}'`);\n // }\n\n onError() {\n // console.log(`ImgFallback onError ${this.src}`);\n this.src = this.fallback;\n this.className = 'image-fallback';\n }\n load() {\n this.className = 'image-loaded';\n }\n\n /**\n * when getting from S3, we will see a 404 if DNE\n * send an xhr for HEAD of the image\n */\n checkUrlExists(url: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('HEAD', url, true);\n\n xhr.onreadystatechange = () => {\n if (xhr.readyState >= XMLHttpRequest.HEADERS_RECEIVED && xhr.status >= 200 && xhr.status < 400) {\n // console.log(`xhr`, { status: xhr.status, readyState: xhr.readyState, url });\n resolve(url);\n } else if (xhr.readyState >= XMLHttpRequest.HEADERS_RECEIVED && xhr.status >= 400) {\n // console.log(`xhr error`, { status: xhr.status, readyState: xhr.readyState, url });\n reject(xhr.status);\n }\n xhr.abort();\n };\n xhr.onerror = (e) => {\n reject(e);\n };\n xhr.send();\n });\n }\n}\n","/** @format */\n\nimport { Pipe, PipeTransform } from '@angular/core';\nimport { AVATAR_URL_PREFIX } from '@app/app.config';\nimport {\n DEFAULT_USER_AVATAR,\n DEFAULT_USER_AVATAR_DARK,\n DEFAULT_USER_AVATAR_TERTIARY,\n} from '@app/shared/models/user.model';\n\n@Pipe({\n name: 'avatarUrl',\n standalone: true,\n})\nexport class AvatarUrlPipe implements PipeTransform {\n transform(userId: string, ...args: unknown[]): string {\n if (userId) {\n return `${AVATAR_URL_PREFIX}${userId}.jpg`;\n }\n const [color] = args;\n switch (color) {\n case 'dark':\n return DEFAULT_USER_AVATAR_DARK;\n case 'tertiary':\n return DEFAULT_USER_AVATAR_TERTIARY;\n default:\n return DEFAULT_USER_AVATAR;\n }\n // return userId ? `${AVATAR_URL_PREFIX}${userId}.jpg` : defaultAvatar;\n }\n}\n","/** @format */\n\nimport { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Display Durations by hiding hours if none\n */\n@Pipe({\n name: 'duration',\n standalone: true,\n})\nexport class DurationRenderPipe implements PipeTransform {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n transform(value: string, ...args: unknown[]): string {\n const str = value && typeof value === 'string' ? value : '';\n const times = str ? str.split(':') : [];\n // console.log(`DurationRenderPipe times:`, times);\n // if there's only min:sec then it'll be 2, what we want to return\n if (times.length < 3) {\n // console.log(`DurationRenderPipe times < 3 -> return`, times.length);\n return str;\n }\n\n // for each time greater than sec & mins (greater than length minus 2)\n const len = times.length - 2;\n for (let i = 0; i < len; i++) {\n const time = isNaN(parseInt(times[i], 10)) ? 0 : parseInt(times[i], 10);\n if (time <= 0) {\n times.shift();\n }\n }\n\n const padZero = (d) => ('0' + d).slice(-2);\n\n return times.map((time) => padZero(time)).join(':');\n }\n}\n","/** @format */\n\nimport { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'sentenceCase',\n standalone: true,\n})\nexport class SentenceCasePipe implements PipeTransform {\n transform(value: string): string {\n if (!value || typeof value.substring !== 'function') {\n return '';\n }\n const first = value.substring(0, 1).toUpperCase();\n return first + value.substring(1);\n }\n}\n","<ion-reorder-group\n [disabled]=\"!options.isDraggable\"\n (ionItemReorder)=\"reorder($event)\"\n>\n <ng-container *ngIf=\"!items\">\n <ion-item\n *ngFor=\"let item of [1, 2, 3, 4, 5, 6, 7]\"\n lines=\"inset\"\n class=\"list-stack-item ion-no-padding\"\n style=\"--border-color: transparent;\"\n >\n <div slot=\"start\">\n <div class=\"list-stack-item__start\">\n <div class=\"list-stack-item__start__reorder\"></div>\n <ion-skeleton-text\n class=\"list-stack-item__start__poster d-none d-sm-block\"\n ></ion-skeleton-text>\n </div>\n </div>\n <div class=\"list-stack-item__content\">\n <ion-skeleton-text style=\"height: 20px;\"></ion-skeleton-text>\n </div>\n </ion-item>\n </ng-container>\n\n <ng-container *ngIf=\"items\">\n <ion-item\n *ngFor=\"let item of items; index as i; trackBy: trackByItem\"\n lines=\"inset\"\n class=\"list-stack-item ion-no-padding\"\n >\n <div slot=\"start\">\n <div class=\"list-stack-item__start\">\n <ion-reorder>\n <div class=\"list-stack-item__start__reorder\">\n <ion-icon\n *ngIf=\"options.isDraggable\"\n name=\"reorder-two-outline\"\n style=\"font-size: 24px;\"\n ></ion-icon>\n <div *ngIf=\"options.isNumerable\">\n {{ i + 1 | number: '2.0' }}\n </div>\n </div>\n </ion-reorder>\n <ion-reorder>\n <img\n class=\"list-stack-item__start__poster d-none d-sm-block\"\n imageFadeIn\n loading=\"lazy\"\n [src]=\"item.poster\"\n [alt]=\"item.title\"\n />\n </ion-reorder>\n </div>\n </div>\n <ion-buttons\n style=\"flex-direction: row-reverse;\"\n slot=\"end\"\n >\n <!-- width: 150px; -->\n <ion-button class=\"add-remove-text-btn ion-text-wrap\" (click)=\"toggleFeatured(item)\">\n <ng-container *ngIf=\"item.featured\">\n <!-- <ion-icon slot=\"icon-only\" name=\"star\"></ion-icon> -->\n {{ 'STACK.ACTIONS.REMOVE_FROM_FEATURED' | translate }}\n </ng-container>\n <ng-container *ngIf=\"!item.featured\">\n {{ 'STACK.ACTIONS.ADD_TO_FEATURED' | translate }}\n </ng-container>\n </ion-button>\n <div *ngIf=\"options.isDraggable\" class=\"ion-text-center ion-color-medium\">\n <small>\n {{ item.featured }}\n </small>\n </div>\n </ion-buttons>\n\n <div class=\"list-stack-item__content\">\n <div\n class=\"list-stack-item__content__title\"\n style=\"flex-grow: 2;\"\n (click)=\"open(item)\"\n >\n {{ item.title }}\n </div>\n\n <div class=\"list-stack-item__content__user d-none d-lg-block\">\n <img\n class=\"list-stack-item__content__user__image\"\n src=\"/assets/images/default-avatar.png\"\n />\n {{ item.userId }}\n </div>\n\n <div class=\"d-none d-lg-block\">\n {{ item.dtePublished | date: 'mediumDate' }}\n </div>\n\n <div class=\"d-none d-sm-block\">\n {{ item.duration | duration }}\n </div>\n </div>\n </ion-item>\n <div class=\"list-stack-item__empty\" *ngIf=\"items.length === 0\">{{ 'LISTS.NO_ITEMS' | translate }}</div>\n </ng-container>\n</ion-reorder-group>\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { NgIf, NgFor, DecimalPipe, DatePipe } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport {\n ItemReorderCustomEvent,\n LoadingController,\n NavController,\n IonReorderGroup,\n IonItem,\n IonSkeletonText,\n IonIcon,\n IonReorder,\n IonButtons,\n IonButton,\n} from '@ionic/angular/standalone';\nimport { Stack } from '@app/shared/models/stack.model';\nimport { DurationRenderPipe } from '@app/shared/pipes/duration-render.pipe';\nimport { ImageFadeInDirective } from '@app/shared/directives/image-fade-in.directive';\nimport { StackService } from '@app/stacks/shared/services/stack.service';\nimport { DraggableList, ListOptions } from '../fs-list.component';\nimport { WATCH_ROUTE } from '@app/app.routes';\n\nconst DEBUG_LOGS = false;\nconst PAGE = '[ListStackItems]';\n\n@Component({\n selector: 'app-list-stack-items',\n templateUrl: './list-stack-items.component.html',\n styleUrls: ['./list-stack-items.component.scss'],\n standalone: true,\n imports: [\n NgIf,\n NgFor,\n ImageFadeInDirective,\n DecimalPipe,\n DatePipe,\n TranslatePipe,\n DurationRenderPipe,\n IonReorderGroup,\n IonItem,\n IonSkeletonText,\n IonIcon,\n IonReorder,\n IonButtons,\n IonButton,\n ],\n})\nexport class ListStackItemsComponent implements DraggableList {\n @Input() items: Stack[];\n @Input() options: ListOptions;\n\n constructor(\n private stackService: StackService,\n private loadingCtrl: LoadingController,\n private navCtrl: NavController\n ) {}\n\n trackByItem(index: number, item: Stack) {\n return item?.stackId ?? index;\n }\n\n open(item: Stack) {\n this.navCtrl.navigateForward(`/${WATCH_ROUTE}/${item.projectId}/${item.stackId}`);\n }\n\n /**\n * reorder v2 - featured is descending (larger = more featured)\n * if dragging up, make featured 1 more than the next\n * if dragging down, make featured 1 less than the previous\n */\n async reorder(event: Event) {\n const customEvent = event as ItemReorderCustomEvent;\n const loading = await this.loadingCtrl.create({\n message: 'Updating stacks...',\n });\n await loading.present();\n customEvent.detail.complete();\n // eslint-disable-next-line prefer-const\n let { from, to } = customEvent.detail;\n\n // if the item was dragged past the bottom of the list, 'to' will be ==items.length (outside array indexes)\n if (to >= this.items.length) {\n if (from === to - 1) {\n // we just dragged the last one and didn't change the value\n DEBUG_LOGS && console.warn(`${PAGE} moved past the end!`, { to, from, oldLen: this.items.length });\n loading.dismiss();\n return;\n }\n to = this.items.length - 1; // make it the last one in the array\n }\n\n const thisStack = this.items[from];\n\n const items = [...this.items];\n [items[from], items[to]] = [items[to], items[from]];\n\n /**\n * find the featured value of item we dragged past in list,\n * if dragging up, make featured 1 more than the next\n * if dragging down, make featured 1 less than the previous\n * or if last, make it a 1\n */\n let newFeatured = 1;\n if (from > to) {\n // moved up list\n const checkIndex = to + 1;\n newFeatured = items[checkIndex].featured + 1;\n DEBUG_LOGS &&\n console.log(`${PAGE} moved up list`, { to, checkIndex, newFeatured, title: items[checkIndex].title });\n } else {\n // moved down list\n const checkIndex = to - 1;\n DEBUG_LOGS && console.log(`${PAGE} checkIndex`, { checkIndex, len: items.length, items });\n if (checkIndex >= items.length - 1) {\n newFeatured = 1;\n DEBUG_LOGS && console.log(`${PAGE} moved down list to bottom, make 1`);\n } else {\n newFeatured = items[checkIndex].featured - 1;\n DEBUG_LOGS &&\n console.log(`${PAGE} moved down list`, { to, checkIndex, newFeatured, title: items[checkIndex].title });\n }\n }\n if (newFeatured <= 0) {\n newFeatured = 1;\n }\n\n // await this.stacksService.updateStack(thisStack, [\n // { prop: 'featured', value: newFeatured },\n // ]);\n this.stackService.setStackFeatured({\n projectId: thisStack.projectId,\n stackId: thisStack.stackId,\n featured: newFeatured,\n fromIdx: from,\n toIdx: to,\n });\n\n // reload stacks - not needed, since we're subscribed to them from teh store, they will be updated automatically\n loading.dismiss();\n }\n\n async toggleFeatured(item: Stack) {\n // const loading = await this.loadingCtrl.create({\n // message: 'Updating stacks...',\n // });\n // await loading.present();\n // v1: const featuredItemsLength = this.items.filter((i) => i.featured > 0).length; // just make it feature = 1\n // await this.stacksService.updateStack(item, [\n // {\n // prop: 'featured',\n // // if the stack has a number value for featured > 0, make it zero, else 1\n // value: typeof item.featured === 'number' && item.featured > 0 ? 0 : 1,\n // },\n // ]);\n this.stackService.setStackFeatured({\n projectId: item.projectId,\n stackId: item.stackId,\n featured: typeof item.featured === 'number' && item.featured > 0 ? 0 : 1,\n });\n // reload stacks - not needed, since we're subscribed to them from the store, they will be updated automatically\n // loading.dismiss();\n }\n}\n","/** @format */\n\nimport { Component, Input } from '@angular/core';\nimport { IonList, ItemReorderEventDetail } from '@ionic/angular/standalone';\nimport { ITEM_TYPE, LayoutOptions } from '@app/shared/models/layout.model';\nimport { Stack } from '@app/shared/models/stack.model';\nimport { ListStackItemsComponent } from './list-stack-items/list-stack-items.component';\n\nexport class ListOptions extends LayoutOptions {\n isDraggable = false;\n isNumerable = false;\n\n constructor(opts: object) {\n super(opts);\n Object.entries(opts)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n .filter(([key, value]) => Object.getOwnPropertyNames(this).includes(key))\n .forEach(([key, value]) => (this[key] = value));\n }\n}\n\nexport interface DraggableList {\n reorder(event: CustomEvent<ItemReorderEventDetail>);\n toggleFeatured(item: Stack);\n}\n\n@Component({\n selector: 'fs-list',\n templateUrl: './fs-list.component.html',\n styleUrls: ['./fs-list.component.scss'],\n standalone: true,\n imports: [IonList, ListStackItemsComponent],\n})\nexport class FsListComponent {\n @Input() items: Stack[];\n @Input() itemType: ITEM_TYPE;\n /** Showing on a Project.isModerated page */\n @Input() isModerated = false;\n @Input() canModerate = false;\n\n /**\n * @Input Setter Getter\n * https://stackoverflow.com/a/40764091/4982169\n */\n @Input()\n set options(obj: object) {\n this._options = new ListOptions(obj);\n }\n get options(): ListOptions {\n return this._options;\n }\n\n private _options: ListOptions;\n}\n","<ion-list>\n <!-- STACKS -->\n <app-list-stack-items\n [items]=\"items\"\n [options]=\"options\"\n ></app-list-stack-items>\n</ion-list>\n","<!-- @format -->\n\n<section [ngSwitch]=\"layout.type\">\n <ng-container *ngSwitchCase=\"layoutTypes.Carousel\">\n <fs-carousel\n [items]=\"items\"\n [canLoadMore]=\"canLoadMore\"\n [isLoadingMore]=\"isLoading\"\n [itemType]=\"itemTypes.Stacks\"\n [heading]=\"heading\"\n [options]=\"layout.options\"\n [isModerated]=\"isModerated\"\n [canModerate]=\"canModerate\"\n [canShare]=\"canShare\"\n [isProjectMember]=\"isProjectMember\"\n (itemClick)=\"onClickItem($event)\"\n (loadMore)=\"loadMore.emit($event)\"\n (newItemClick)=\"addNewStackButtonClick()\"\n ></fs-carousel>\n </ng-container>\n <ng-container *ngSwitchCase=\"layoutTypes.Grid\">\n <fs-grid\n [items]=\"items\"\n [itemType]=\"itemTypes.Stacks\"\n [options]=\"layout.options\"\n [isModerated]=\"isModerated\"\n [canModerate]=\"canModerate\"\n ></fs-grid>\n </ng-container>\n <ng-container *ngSwitchCase=\"layoutTypes.List\">\n <fs-list\n [items]=\"items\"\n [itemType]=\"itemTypes.Stacks\"\n [options]=\"layout.options\"\n [isModerated]=\"isModerated\"\n [canModerate]=\"canModerate\"\n ></fs-list>\n </ng-container>\n <ng-template *ngSwitchDefault> Unknown Layout... </ng-template>\n</section>\n","/** @format */\n\nimport { Component, Input, Output, ChangeDetectionStrategy, EventEmitter } from '@angular/core';\nimport { NgSwitch, NgSwitchCase, NgSwitchDefault } from '@angular/common';\nimport { NavController } from '@ionic/angular/standalone';\nimport { EDIT_ROUTE, WATCH_ROUTE } from '@app/app.routes';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { DiscoverCardClick, LAYOUT_TYPE, ITEM_TYPE, LAYOUT_SETTINGS } from '@app/shared/models/layout.model';\nimport { STACK_SEARCH_FIELDS, Stack } from '@app/shared/models/stack.model';\nimport { FsCarouselComponent } from '@app/shared/components/fs-carousel/fs-carousel.component';\nimport { FsGridComponent } from '@app/shared/components/fs-grid/fs-grid.component';\nimport { FsListComponent } from '@app/shared/components/fs-list/fs-list.component';\n\n@Component({\n selector: 'app-stack-list',\n templateUrl: './stack-list.component.html',\n styleUrls: ['./stack-list.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [NgSwitch, NgSwitchCase, NgSwitchDefault, FsCarouselComponent, FsGridComponent, FsListComponent],\n})\nexport class StackListComponent {\n public itemTypes = ITEM_TYPE;\n public layoutTypes = LAYOUT_TYPE;\n public searchFields = STACK_SEARCH_FIELDS;\n\n @Input() items: Stack[] | undefined; // undefined => loading state, array => fully loaded\n @Input() canLoadMore = false;\n @Input() isLoading = false;\n @Input() layout: LAYOUT_SETTINGS;\n @Input() heading?: string;\n /** Showing on a Project.isModerated page */\n @Input() isModerated = false;\n @Input() canModerate = false;\n @Input() canShare = true;\n @Input() isProjectMember = false;\n @Output() loadMore = new EventEmitter<void>();\n @Output() newStackClick = new EventEmitter<void>();\n @Output() itemClick = new EventEmitter<DiscoverCardClick>();\n\n constructor(private navCtrl: NavController, private toaster: ToasterService) {}\n\n onClickItem(event: DiscoverCardClick) {\n this.itemClick.emit(event);\n if (event.item && (event.item as Stack).dtePublished) {\n this.navWatchStack(event);\n } else {\n this.navEditStack(event);\n }\n }\n\n addNewStackButtonClick() {\n this.newStackClick.emit();\n }\n\n navWatchStack(event: DiscoverCardClick) {\n const stack: Stack | null = event && event.item ? (event.item as Stack) : null;\n if (stack && stack.projectId && stack.stackId) {\n this.navCtrl.navigateForward(`/${WATCH_ROUTE}/${stack.projectId}/${stack.stackId}`);\n } else {\n this.toaster.present(`Oops! There was an error opening that Stack. Please Try Again.`);\n }\n }\n navEditStack(event: DiscoverCardClick) {\n const stack: Stack | null = event && event.item ? (event.item as Stack) : null;\n if (stack && stack.projectId && stack.stackId) {\n this.navCtrl.navigateForward(`/${EDIT_ROUTE}/${stack.projectId}/${stack.stackId}`);\n } else {\n this.toaster.present(`Oops! There was an error opening that Stack. Please Try Again.`);\n }\n }\n}\n"],"x_google_ignoreList":[]}