@algoux/standard-ranklist-renderer-component-angular 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/README.md +48 -0
  2. package/package.json +9 -3
  3. package/dist/README.md +0 -100
  4. package/dist/esm2022/algoux-standard-ranklist-renderer-component-angular.mjs +0 -5
  5. package/dist/esm2022/lib/index.mjs +0 -8
  6. package/dist/esm2022/lib/modal/default-solution-modal.component.mjs +0 -146
  7. package/dist/esm2022/lib/modal/default-user-modal.component.mjs +0 -172
  8. package/dist/esm2022/lib/modal/modal-interactions.mjs +0 -2
  9. package/dist/esm2022/lib/modal/modal.component.mjs +0 -263
  10. package/dist/esm2022/lib/progress/progress-bar.component.mjs +0 -247
  11. package/dist/esm2022/lib/progress/progress-utils.mjs +0 -45
  12. package/dist/esm2022/lib/ranklist/ranklist-utils.mjs +0 -110
  13. package/dist/esm2022/lib/ranklist/ranklist.component.mjs +0 -593
  14. package/dist/esm2022/lib/ranklist/status-cell-template.directive.mjs +0 -18
  15. package/dist/esm2022/lib/ranklist/user-cell-template.directive.mjs +0 -18
  16. package/dist/esm2022/lib/types.mjs +0 -2
  17. package/dist/esm2022/public-api.mjs +0 -2
  18. package/dist/fesm2022/algoux-standard-ranklist-renderer-component-angular.mjs +0 -1585
  19. package/dist/fesm2022/algoux-standard-ranklist-renderer-component-angular.mjs.map +0 -1
  20. package/dist/index.d.ts +0 -5
  21. package/dist/lib/index.d.ts +0 -8
  22. package/dist/lib/modal/default-solution-modal.component.d.ts +0 -30
  23. package/dist/lib/modal/default-user-modal.component.d.ts +0 -34
  24. package/dist/lib/modal/modal-interactions.d.ts +0 -1
  25. package/dist/lib/modal/modal.component.d.ts +0 -49
  26. package/dist/lib/progress/progress-bar.component.d.ts +0 -31
  27. package/dist/lib/progress/progress-utils.d.ts +0 -15
  28. package/dist/lib/ranklist/ranklist-utils.d.ts +0 -22
  29. package/dist/lib/ranklist/ranklist.component.d.ts +0 -57
  30. package/dist/lib/ranklist/status-cell-template.directive.d.ts +0 -23
  31. package/dist/lib/ranklist/user-cell-template.directive.d.ts +0 -20
  32. package/dist/lib/types.d.ts +0 -27
  33. package/dist/public-api.d.ts +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"algoux-standard-ranklist-renderer-component-angular.mjs","sources":["../../src/lib/ranklist/ranklist-utils.ts","../../src/lib/modal/modal.component.ts","../../src/lib/modal/default-solution-modal.component.ts","../../src/lib/modal/default-user-modal.component.ts","../../src/lib/progress/progress-utils.ts","../../src/lib/progress/progress-bar.component.ts","../../src/lib/ranklist/status-cell-template.directive.ts","../../src/lib/ranklist/user-cell-template.directive.ts","../../src/lib/ranklist/ranklist.component.ts","../../src/algoux-standard-ranklist-renderer-component-angular.ts"],"sourcesContent":["import type * as srk from '@algoux/standard-ranklist';\nimport {\n EnumTheme,\n formatTimeDuration,\n numberToAlphabet,\n resolveStyle,\n resolveText,\n secToTimeStr,\n} from '@algoux/standard-ranklist-utils';\nexport { caniuse, srkSupportedVersions } from '@algoux/standard-ranklist-renderer-component-core';\n\nexport const defaultBackgroundColor: Record<EnumTheme, string> = {\n [EnumTheme.light]: '#ffffff',\n [EnumTheme.dark]: '#191919',\n};\n\nexport interface MarkerPresentation {\n className?: string;\n style?: {\n backgroundColor?: string;\n };\n}\n\nexport interface SolutionResultMeta {\n label: string;\n className?: string;\n}\n\nexport function resolveSrkAssetUrl(\n url: string,\n field: string,\n formatter?: (url: string, field: string) => string,\n): string {\n if (typeof formatter === 'function') {\n return formatter(url, field);\n }\n if (url.startsWith('//')) {\n return url;\n }\n const protocolMatch = url.match(/^([a-zA-Z][a-zA-Z0-9+.-]*):/);\n if (protocolMatch) {\n const protocol = protocolMatch[1].toLowerCase();\n if (protocol === 'http' || protocol === 'https' || protocol === 'data') {\n return url;\n }\n console.warn(`unsupported protocol \"${protocol}\" in srk asset url:`, url);\n return '';\n }\n console.warn('unsupported srk asset url:', url);\n return '';\n}\n\nexport function getAcceptedStatusDetails(status: srk.RankProblemStatus): string {\n return `${status.tries}/${status.time ? formatTimeDuration(status.time, 'min', Math.floor) : '-'}`;\n}\n\nexport function getSolutionResultMeta(result: srk.Solution['result']): SolutionResultMeta {\n switch (result) {\n case 'FB':\n return { label: 'First Blood', className: 'srk-preset-result-fb' };\n case 'AC':\n return { label: 'Accepted', className: 'srk-preset-result-ac' };\n case 'RJ':\n return { label: 'Rejected', className: 'srk-preset-result-rj' };\n case '?':\n return { label: 'Frozen', className: 'srk-preset-result-fz' };\n case 'WA':\n return { label: 'Wrong Answer', className: 'srk-preset-result-rj' };\n case 'PE':\n return { label: 'Presentation Error', className: 'srk-preset-result-rj' };\n case 'TLE':\n return { label: 'Time Limit Exceeded', className: 'srk-preset-result-rj' };\n case 'MLE':\n return { label: 'Memory Limit Exceeded', className: 'srk-preset-result-rj' };\n case 'OLE':\n return { label: 'Output Limit Exceeded', className: 'srk-preset-result-rj' };\n case 'RTE':\n return { label: 'Runtime Error', className: 'srk-preset-result-rj' };\n case 'NOUT':\n return { label: 'No Output' };\n case 'CE':\n return { label: 'Compile Error' };\n case 'UKE':\n return { label: 'Unknown Error' };\n case null:\n return { label: '--' };\n default:\n return { label: result };\n }\n}\n\nexport function getSolutionModalTitle(problemIndex: number, user: srk.User): string {\n return `Solutions of ${numberToAlphabet(problemIndex)} (${resolveText(user.name)})`;\n}\n\nexport function formatSolutionTimestamp(solution: srk.Solution): string {\n return secToTimeStr(formatTimeDuration(solution.time, 's'));\n}\n\nexport function getProblemHeaderBackgroundImage(style: srk.Style | undefined, theme: EnumTheme): string {\n const { backgroundColor } = resolveStyle(style || {});\n const resolvedColor = backgroundColor[theme] || defaultBackgroundColor[theme];\n const bgColorAlphaStr = withAlpha(resolvedColor, 0.27);\n return `linear-gradient(180deg, ${resolvedColor} 0%, ${resolvedColor} 10%, ${bgColorAlphaStr} 10%, transparent 100%)`;\n}\n\nexport function getMarkerPresentation(marker: srk.Marker, theme: EnumTheme): MarkerPresentation {\n if (typeof marker.style === 'string') {\n return { className: `srk-preset-marker-${marker.style}` };\n }\n if (marker.style) {\n return {\n style: {\n backgroundColor: resolveStyle(marker.style).backgroundColor[theme],\n },\n };\n }\n return {};\n}\n\nexport function shouldShowTimeColumn(rows: srk.RanklistRow[]): boolean {\n return rows.some((row) => Boolean(row.score?.time));\n}\n\nfunction withAlpha(color: string, alpha: number) {\n const hexMatch = color.match(/^#([0-9a-f]{6})$/i);\n if (hexMatch) {\n const value = hexMatch[1];\n const red = parseInt(value.slice(0, 2), 16);\n const green = parseInt(value.slice(2, 4), 16);\n const blue = parseInt(value.slice(4, 6), 16);\n return `rgba(${red}, ${green}, ${blue}, ${alpha})`;\n }\n\n const rgbMatch = color.match(/^rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/i);\n if (rgbMatch) {\n return `rgba(${rgbMatch[1]}, ${rgbMatch[2]}, ${rgbMatch[3]}, ${alpha})`;\n }\n\n const rgbaMatch = color.match(/^rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*[\\d.]+\\s*\\)$/i);\n if (rgbaMatch) {\n return `rgba(${rgbaMatch[1]}, ${rgbaMatch[2]}, ${rgbaMatch[3]}, ${alpha})`;\n }\n\n return color;\n}\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewChecked,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport {\n MODAL_ANIMATION_DURATION_MS,\n SRK_ANIMATED_MODAL_ROOT_CLASS,\n ensureModalInteractionTracker,\n lockModalBodyScroll,\n registerModalFocusScope,\n resolveModalTransformOrigin,\n unlockModalBodyScroll,\n unregisterModalFocusScope,\n} from './modal-interactions';\n\nexport type ModalCloseReason = 'mask' | 'close-button' | 'escape';\n\n@Component({\n selector: 'srk-modal',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div *ngIf=\"shouldRender()\" class=\"srk-modal-root\" [ngClass]=\"rootClasses()\" [attr.data-srk-modal-state]=\"animationState\">\n <div class=\"srk-modal-mask\"></div>\n <div\n class=\"srk-modal-wrap\"\n [ngClass]=\"wrapClassName\"\n tabindex=\"-1\"\n (mousedown)=\"handleMaskMouseDown($event)\"\n >\n <div\n #dialog\n class=\"srk-modal\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"title || undefined\"\n data-srk-modal-panel=\"true\"\n tabindex=\"-1\"\n [ngStyle]=\"dialogStyle()\"\n >\n <div class=\"srk-modal-content\">\n <button\n aria-label=\"Close\"\n class=\"srk-modal-close\"\n type=\"button\"\n (click)=\"requestClose('close-button')\"\n >\n <span class=\"srk-modal-close-x\"></span>\n </button>\n <div *ngIf=\"title !== undefined\" class=\"srk-modal-header\">\n <div class=\"srk-modal-title\">{{ title }}</div>\n </div>\n <div class=\"srk-modal-body\">\n <ng-content />\n </div>\n </div>\n </div>\n </div>\n </div>\n `,\n})\nexport class ModalComponent implements AfterViewChecked, OnChanges, OnDestroy {\n @Input() open = false;\n @Input() title?: string;\n @Input() width?: number;\n @Input() rootClassName?: string;\n @Input() wrapClassName?: string;\n @Input() destroyOnClose = true;\n @Input() closeOnEsc = true;\n @Input() closeOnMaskClick = true;\n @Input() panelStyle: Record<string, string | number> = {};\n\n @Output() openChange = new EventEmitter<boolean>();\n @Output() close = new EventEmitter<ModalCloseReason>();\n\n @ViewChild('dialog') dialogRef?: ElementRef<HTMLDivElement>;\n\n isMounted = this.open || !this.destroyOnClose;\n animationState: 'pre-open' | 'opening' | 'closing' = this.open ? 'pre-open' : 'closing';\n transformOrigin = { x: 0, y: 0 };\n private closeTimer: number | null = null;\n private openTimer: number | null = null;\n private bodyScrollLocked = false;\n private focusScopeId: number | null = null;\n\n constructor() {\n if (typeof document !== 'undefined') {\n ensureModalInteractionTracker();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['open'] || changes['destroyOnClose']) {\n this.syncOpenState();\n }\n }\n\n ngAfterViewChecked() {\n if (this.open) {\n this.registerFocusScope();\n }\n }\n\n ngOnDestroy() {\n this.clearTimers();\n this.releaseFocusScope();\n if (this.bodyScrollLocked) {\n unlockModalBodyScroll();\n this.bodyScrollLocked = false;\n }\n }\n\n handleEscape(event?: KeyboardEvent) {\n if (this.open && this.closeOnEsc) {\n this.requestClose('escape');\n }\n }\n\n handleMaskMouseDown(event: MouseEvent) {\n if (this.closeOnMaskClick && event.target === event.currentTarget) {\n this.requestClose('mask');\n }\n }\n\n requestClose(reason: ModalCloseReason) {\n this.openChange.emit(false);\n this.close.emit(reason);\n }\n\n shouldRender() {\n return this.isMounted || !this.destroyOnClose;\n }\n\n rootClasses() {\n return [SRK_ANIMATED_MODAL_ROOT_CLASS, this.rootClassName].filter(Boolean);\n }\n\n dialogStyle() {\n return {\n ...this.panelStyle,\n width: this.width ? `${this.width}px` : this.panelStyle?.['width'],\n '--srk-modal-origin-x': `${this.transformOrigin.x}px`,\n '--srk-modal-origin-y': `${this.transformOrigin.y}px`,\n '--srk-modal-max-width': this.width\n ? `${this.width}px`\n : typeof this.panelStyle?.['width'] === 'string'\n ? this.panelStyle['width']\n : undefined,\n };\n }\n\n private clearTimers() {\n if (this.closeTimer !== null) {\n window.clearTimeout(this.closeTimer);\n this.closeTimer = null;\n }\n if (this.openTimer !== null) {\n window.clearTimeout(this.openTimer);\n this.openTimer = null;\n }\n }\n\n private syncOpenState() {\n this.clearTimers();\n\n if (this.open) {\n this.isMounted = true;\n this.transformOrigin = { x: 0, y: 0 };\n this.animationState = 'pre-open';\n if (typeof window !== 'undefined') {\n this.openTimer = window.setTimeout(() => {\n this.registerFocusScope();\n const resolution = resolveModalTransformOrigin(this.dialogRef?.nativeElement || null);\n this.transformOrigin = resolution.origin;\n this.animationState = 'opening';\n this.openTimer = null;\n }, 0);\n }\n } else {\n this.releaseFocusScope();\n this.animationState = 'closing';\n if (!this.destroyOnClose) {\n this.isMounted = true;\n } else if (this.isMounted && typeof window !== 'undefined') {\n this.closeTimer = window.setTimeout(() => {\n this.isMounted = false;\n this.updateBodyScrollLock();\n this.closeTimer = null;\n }, MODAL_ANIMATION_DURATION_MS);\n }\n }\n\n this.updateBodyScrollLock();\n }\n\n private updateBodyScrollLock() {\n const shouldLock = this.open || (this.destroyOnClose && this.isMounted);\n if (shouldLock && !this.bodyScrollLocked) {\n lockModalBodyScroll();\n this.bodyScrollLocked = true;\n return;\n }\n if (!shouldLock && this.bodyScrollLocked) {\n unlockModalBodyScroll();\n this.bodyScrollLocked = false;\n }\n }\n\n private registerFocusScope() {\n const nextFocusScopeId = registerModalFocusScope(this.dialogRef?.nativeElement || null, {\n onEscape: this.closeOnEsc ? (event) => this.handleEscape(event) : undefined,\n });\n if (this.focusScopeId === null) {\n this.focusScopeId = nextFocusScopeId;\n }\n }\n\n private releaseFocusScope() {\n if (this.focusScopeId !== null) {\n unregisterModalFocusScope(this.focusScopeId);\n this.focusScopeId = null;\n }\n }\n}\n","import type * as srk from '@algoux/standard-ranklist';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport {\n formatSolutionTimestamp,\n getSolutionModalTitle,\n getSolutionResultMeta,\n type SolutionResultMeta,\n} from '../ranklist/ranklist-utils';\nimport {\n ModalComponent,\n type ModalCloseReason,\n} from './modal.component';\n\n@Component({\n selector: 'srk-default-solution-modal',\n standalone: true,\n imports: [CommonModule, ModalComponent],\n template: `\n <srk-modal\n *ngIf=\"cachedUser\"\n [open]=\"open\"\n [title]=\"resolvedTitle()\"\n [width]=\"width\"\n [rootClassName]=\"rootClassName\"\n [wrapClassName]=\"wrapClassName\"\n [panelStyle]=\"panelStyle\"\n (close)=\"close.emit($event)\"\n (openChange)=\"openChange.emit($event)\"\n >\n <table class=\"srk-common-table srk-solutions-table\">\n <thead>\n <tr>\n <th class=\"srk--text-left\">Result</th>\n <th class=\"srk--text-right\">Time</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let solution of cachedSolutions; let index = index; trackBy: trackBySolution\">\n <td>\n <span\n class=\"srk-solution-result-text\"\n [ngClass]=\"solutionMeta(solution).className\"\n >\n {{ solutionMeta(solution).label }}\n </span>\n </td>\n <td class=\"srk--text-right\">{{ formatSolutionTimestamp(solution) }}</td>\n </tr>\n </tbody>\n </table>\n </srk-modal>\n `,\n})\nexport class DefaultSolutionModalComponent implements OnChanges {\n @Input() open = false;\n @Input() user?: srk.User | null;\n @Input() problem?: srk.Problem;\n @Input() problemIndex = 0;\n @Input() solutions: srk.Solution[] = [];\n @Input() title?: string;\n @Input() width = 320;\n @Input() rootClassName = 'srk-general-modal-root';\n @Input() wrapClassName = 'srk-solutions-modal';\n @Input() panelStyle: Record<string, string | number> = {};\n\n @Output() openChange = new EventEmitter<boolean>();\n @Output() close = new EventEmitter<ModalCloseReason>();\n\n readonly formatSolutionTimestamp = formatSolutionTimestamp;\n cachedUser: srk.User | null = null;\n cachedProblem?: srk.Problem;\n cachedProblemIndex = 0;\n cachedSolutions: srk.Solution[] = [];\n\n ngOnChanges(_changes: SimpleChanges) {\n if (this.user) {\n this.cachedUser = this.user;\n this.cachedProblem = this.problem;\n this.cachedProblemIndex = this.problemIndex;\n this.cachedSolutions = this.solutions;\n }\n }\n\n resolvedTitle() {\n return this.title || (this.cachedUser ? getSolutionModalTitle(this.cachedProblemIndex, this.cachedUser) : '');\n }\n\n solutionMeta(solution: srk.Solution): SolutionResultMeta {\n return getSolutionResultMeta(solution.result);\n }\n\n trackBySolution(index: number, solution: srk.Solution) {\n return `${solution.result}_${solution.time?.[0]}_${index}`;\n }\n}\n","import type * as srk from '@algoux/standard-ranklist';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport {\n EnumTheme,\n resolveText,\n resolveUserMarkers,\n} from '@algoux/standard-ranklist-utils';\nimport {\n getMarkerPresentation,\n type MarkerPresentation,\n resolveSrkAssetUrl,\n} from '../ranklist/ranklist-utils';\nimport {\n ModalComponent,\n type ModalCloseReason,\n} from './modal.component';\n\ninterface ResolvedMarker {\n marker: srk.Marker;\n presentation: MarkerPresentation;\n}\n\n@Component({\n selector: 'srk-default-user-modal',\n standalone: true,\n imports: [CommonModule, ModalComponent],\n template: `\n <srk-modal\n *ngIf=\"cachedUser as modalUser\"\n [open]=\"open\"\n [title]=\"title\"\n [width]=\"width\"\n [rootClassName]=\"rootClassName\"\n [wrapClassName]=\"wrapClassName\"\n [panelStyle]=\"panelStyle\"\n (close)=\"close.emit($event)\"\n (openChange)=\"openChange.emit($event)\"\n >\n <div class=\"srk-user-modal-info\">\n <h3 class=\"srk-user-modal-info-user-name\">{{ resolveText(modalUser.name) }}</h3>\n <p *ngIf=\"modalUser.organization\" class=\"srk-user-modal-info-user-second-name\">\n {{ resolveText(modalUser.organization) }}\n </p>\n <div class=\"srk-user-modal-info-labels\">\n <span class=\"srk-user-modal-info-labels-label srk-user-modal-info-labels-label-preset-general\">\n {{ modalUser.official === false ? '* 非正式参加者' : '正式参加者' }}\n </span>\n <span\n *ngFor=\"let entry of resolvedMarkers(); trackBy: trackByMarkerId\"\n class=\"srk-user-modal-info-labels-label\"\n [ngClass]=\"entry.presentation.className\"\n [ngStyle]=\"entry.presentation.style\"\n >\n {{ resolveText(entry.marker.label) }}\n </span>\n </div>\n <div *ngIf=\"modalUser.teamMembers?.length\" class=\"srk-user-modal-info-team-members\">\n <ng-container *ngFor=\"let member of modalUser.teamMembers; let index = index; trackBy: trackByMemberName\">\n <span *ngIf=\"index > 0\" class=\"srk-user-modal-info-team-members-slash\"> / </span>\n <span>{{ resolveText(member.name) }}</span>\n </ng-container>\n </div>\n <div *ngIf=\"modalUser.photo\" class=\"srk-user-modal-info-photo\">\n <img\n [src]=\"formatAssetUrl(modalUser.photo, 'user.photo')\"\n alt=\"User portrait\"\n class=\"srk-user-modal-info-photo-img\"\n />\n </div>\n </div>\n </srk-modal>\n `,\n})\nexport class DefaultUserModalComponent implements OnChanges {\n @Input() open = false;\n @Input() user?: srk.User | null;\n @Input() markers: srk.Marker[] = [];\n @Input() theme = EnumTheme.light;\n @Input() title = 'User Info';\n @Input() width = 420;\n @Input() rootClassName = 'srk-general-modal-root';\n @Input() wrapClassName = 'srk-user-modal';\n @Input() panelStyle: Record<string, string | number> = {};\n @Input() formatSrkAssetUrl?: (url: string, field: string) => string;\n\n @Output() openChange = new EventEmitter<boolean>();\n @Output() close = new EventEmitter<ModalCloseReason>();\n\n readonly resolveText = resolveText;\n cachedUser: srk.User | null = null;\n\n ngOnChanges(_changes: SimpleChanges) {\n if (this.user) {\n this.cachedUser = this.user;\n }\n }\n\n resolvedMarkers(): ResolvedMarker[] {\n if (!this.cachedUser) {\n return [];\n }\n return resolveUserMarkers(this.cachedUser, this.markers).map((marker) => ({\n marker,\n presentation: getMarkerPresentation(marker, this.theme),\n }));\n }\n\n formatAssetUrl(url: string, field: string) {\n return resolveSrkAssetUrl(url, field, this.formatSrkAssetUrl);\n }\n\n trackByMarkerId(_index: number, entry: ResolvedMarker) {\n return entry.marker.id;\n }\n\n trackByMemberName(_index: number, member: srk.ExternalUser) {\n return resolveText(member.name);\n }\n}\n","import type * as srk from '@algoux/standard-ranklist';\nimport {\n canRegenerateRanklist,\n formatTimeDuration,\n} from '@algoux/standard-ranklist-utils';\n\nexport interface ProgressMetrics {\n elapsed: number;\n remaining: number;\n frozenBreakpoint: number;\n normalInnerPercent: number;\n frozenInnerPercent: number;\n timeTravelElapsed: number;\n timeTravelRemaining: number;\n supportRegen: boolean;\n}\n\nexport function getProgressDurationMinutes(contest: srk.Contest): number {\n return formatTimeDuration(contest.duration, 'min');\n}\n\nexport function getProgressMaxAvailableMinutes(contest: srk.Contest, localTime: number, td = 0): number {\n const startAt = new Date(contest.startAt).getTime();\n const currentTime = localTime - td;\n return Math.min(Math.max(Math.floor((currentTime - startAt) / 60000), 0), getProgressDurationMinutes(contest));\n}\n\nexport function isProgressEnded(contest: srk.Contest, localTime: number, td = 0): boolean {\n const startAt = new Date(contest.startAt).getTime();\n const endAt = startAt + formatTimeDuration(contest.duration, 'ms');\n const currentTime = localTime - td;\n return currentTime >= endAt;\n}\n\nexport function getProgressMetrics(\n data: srk.Ranklist,\n localTime: number,\n td: number,\n timeTravelCurrentValue: number,\n inTimeMachine: boolean,\n): ProgressMetrics {\n const { contest } = data;\n const startAt = new Date(contest.startAt).getTime();\n const endAt = startAt + formatTimeDuration(contest.duration, 'ms');\n const frozenLength = contest.frozenDuration ? formatTimeDuration(contest.frozenDuration, 'ms') : 0;\n const currentTime = localTime - td;\n const length = endAt - startAt;\n const frozenBreakpoint = length ? 1 - frozenLength / length : 1;\n const elapsed = Math.min(Math.max(currentTime - startAt, 0), length);\n const remaining = length - elapsed;\n const frozenAt = endAt - frozenLength;\n const percent = length ? (elapsed / length) * 100 : 0;\n const normalPercent = length ? (Math.max(Math.min(currentTime, frozenAt) - startAt, 0) / length) * 100 : 0;\n const normalInnerPercent = Math.min(100, frozenBreakpoint ? normalPercent / frozenBreakpoint : 0);\n const frozenPercent = percent - normalPercent;\n const frozenInnerPercent = Math.min(100, 1 - frozenBreakpoint ? frozenPercent / (1 - frozenBreakpoint) : 0);\n const timeTravelElapsed = timeTravelCurrentValue * 60 * 1000;\n const timeTravelRemaining = length - timeTravelElapsed;\n\n return {\n elapsed: inTimeMachine ? timeTravelElapsed : elapsed,\n remaining: inTimeMachine ? timeTravelRemaining : remaining,\n frozenBreakpoint,\n normalInnerPercent,\n frozenInnerPercent,\n timeTravelElapsed,\n timeTravelRemaining,\n supportRegen: canRegenerateRanklist(data),\n };\n}\n","import type * as srk from '@algoux/standard-ranklist';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport { secToTimeStr } from '@algoux/standard-ranklist-utils';\nimport {\n getProgressDurationMinutes,\n getProgressMaxAvailableMinutes,\n getProgressMetrics,\n isProgressEnded,\n} from './progress-utils';\n\n@Component({\n selector: 'srk-progress-bar',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"srk-progress-bar-container\">\n <div class=\"srk-progress-bar\">\n <div class=\"srk-progress-bar-body\">\n <div\n class=\"srk-progress-bar-segment srk-progress-bar-normal\"\n [style.width.%]=\"progressMetrics().frozenBreakpoint * 100\"\n >\n <div class=\"srk-progress-bar-fill\" [style.width.%]=\"progressMetrics().normalInnerPercent\"></div>\n </div>\n <div\n class=\"srk-progress-bar-segment srk-progress-bar-frozen\"\n [style.width.%]=\"(1 - progressMetrics().frozenBreakpoint) * 100\"\n >\n <div class=\"srk-progress-bar-fill\" [style.width.%]=\"progressMetrics().frozenInnerPercent\"></div>\n </div>\n </div>\n <div\n *ngIf=\"enableTimeTravel && progressMetrics().supportRegen\"\n class=\"srk-progress-slider-layer\"\n >\n <div\n *ngIf=\"timeTravelIsChanging\"\n class=\"srk-progress-slider-tooltip\"\n [style.left.%]=\"durationMinutes() ? (timeTravelCurrentValue / durationMinutes()) * 100 : 0\"\n >\n {{ timeLabel(timeTravelCurrentValue) }}\n </div>\n <input\n aria-label=\"Time Travel\"\n class=\"srk-progress-slider\"\n min=\"0\"\n step=\"1\"\n type=\"range\"\n [max]=\"durationMinutes()\"\n [title]=\"timeLabel(timeTravelCurrentValue)\"\n [value]=\"timeTravelCurrentValue\"\n (blur)=\"commitTimeTravel()\"\n (input)=\"updateTimeTravelValue($event)\"\n (keydown)=\"beginTimeTravel()\"\n (keyup)=\"commitTimeTravel()\"\n (mousedown)=\"beginTimeTravel()\"\n (mouseup)=\"commitTimeTravel()\"\n (touchend)=\"commitTimeTravel()\"\n (touchstart)=\"beginTimeTravel()\"\n />\n </div>\n </div>\n <div class=\"srk-progress-secondary-area\">\n <div\n class=\"srk-progress-secondary-area-left\"\n [style.display]=\"live || inTimeMachine ? '' : 'none'\"\n >\n Elapsed: {{ secToTimeStr(progressMetrics().elapsed / 1000) }}\n </div>\n <div class=\"srk-progress-secondary-area-center\">\n <div *ngIf=\"inTimeMachine\" class=\"srk-progress-time-machine-status\">\n <div class=\"srk-progress-time-machine-text\">Time Travel Mode</div>\n </div>\n <div *ngIf=\"!inTimeMachine && live && !isEnded()\" class=\"srk-progress-live-text\">\n Live\n </div>\n <div *ngIf=\"!inTimeMachine && (!live || isEnded())\" style=\"visibility: hidden\">\n SRK\n </div>\n </div>\n <div\n class=\"srk-progress-secondary-area-right\"\n [style.display]=\"live || inTimeMachine ? '' : 'none'\"\n >\n Remaining: {{ secToTimeStr(progressMetrics().remaining / 1000) }}\n </div>\n </div>\n </div>\n `,\n})\nexport class ProgressBarComponent implements OnInit, OnDestroy {\n @Input({ required: true }) data!: srk.Ranklist;\n @Input() enableTimeTravel = false;\n @Input() live = false;\n @Input() td = 0;\n\n @Output() timeTravel = new EventEmitter<number | null>();\n\n localTime = Date.now();\n inTimeMachine = false;\n timeTravelIsChanging = false;\n timeTravelCurrentValue = 0;\n timeTravelValue: number | null = null;\n\n private liveInterval?: number;\n\n ngOnInit() {\n this.timeTravelCurrentValue = this.maxAvailableMinutes();\n if (this.live) {\n this.liveInterval = window.setInterval(() => this.handleProgressTimer(), 1000);\n }\n }\n\n ngOnDestroy() {\n if (this.liveInterval) {\n window.clearInterval(this.liveInterval);\n }\n }\n\n secToTimeStr(seconds: number) {\n return secToTimeStr(Math.round(seconds));\n }\n\n timeLabel(minutes: number) {\n return secToTimeStr(minutes * 60);\n }\n\n durationMinutes() {\n return getProgressDurationMinutes(this.data.contest);\n }\n\n maxAvailableMinutes() {\n return getProgressMaxAvailableMinutes(this.data.contest, this.localTime, this.td);\n }\n\n isEnded() {\n return isProgressEnded(this.data.contest, this.localTime, this.td);\n }\n\n progressMetrics() {\n return getProgressMetrics(\n this.data,\n this.localTime,\n this.td,\n this.timeTravelCurrentValue,\n this.inTimeMachine,\n );\n }\n\n beginTimeTravel() {\n this.timeTravelIsChanging = true;\n this.inTimeMachine = true;\n }\n\n updateTimeTravelValue(event: Event) {\n this.timeTravelCurrentValue = Number((event.target as HTMLInputElement).value);\n }\n\n commitTimeTravel() {\n if (this.timeTravelIsChanging) {\n this.handleTimeTravelChange(this.timeTravelCurrentValue);\n }\n }\n\n private handleProgressTimer() {\n this.localTime = Date.now();\n if (this.isEnded() && this.liveInterval) {\n window.clearInterval(this.liveInterval);\n }\n if (!this.timeTravelIsChanging && this.timeTravelValue === null) {\n this.timeTravelCurrentValue = this.maxAvailableMinutes();\n }\n }\n\n private handleTimeTravelChange(value: number) {\n const exited = value >= this.durationMinutes() || value >= this.maxAvailableMinutes();\n this.timeTravel.emit(exited ? null : value * 60 * 1000);\n this.inTimeMachine = !exited;\n this.timeTravelValue = exited ? null : value * 60 * 1000;\n this.timeTravelIsChanging = false;\n }\n}\n","import type * as srk from '@algoux/standard-ranklist';\nimport { Directive, TemplateRef, inject } from '@angular/core';\nimport type {\n SolutionClickPayload,\n StaticRanklist,\n StaticRanklistRow,\n} from '../types';\n\nexport interface StatusCellTemplateContext {\n $implicit: srk.RankProblemStatus;\n status: srk.RankProblemStatus;\n problem: srk.Problem | undefined;\n problemIndex: number;\n user: srk.User;\n row: StaticRanklistRow;\n rowIndex: number;\n ranklist: StaticRanklist;\n solutions: srk.Solution[];\n onClick: (event?: MouseEvent) => void;\n}\n\n@Directive({\n selector: 'ng-template[srkStatusCell]',\n standalone: true,\n})\nexport class SrkStatusCellTemplateDirective {\n readonly templateRef = inject<TemplateRef<StatusCellTemplateContext>>(TemplateRef);\n\n static ngTemplateContextGuard(\n _directive: SrkStatusCellTemplateDirective,\n context: unknown,\n ): context is StatusCellTemplateContext {\n return true;\n }\n}\n\nexport type { SolutionClickPayload };\n","import type * as srk from '@algoux/standard-ranklist';\nimport { Directive, TemplateRef, inject } from '@angular/core';\nimport type {\n StaticRanklist,\n StaticRanklistRow,\n UserClickPayload,\n} from '../types';\n\nexport interface UserCellTemplateContext {\n $implicit: srk.User;\n user: srk.User;\n row: StaticRanklistRow;\n rowIndex: number;\n ranklist: StaticRanklist;\n markers: srk.Marker[];\n onClick: (event?: MouseEvent) => void;\n}\n\n@Directive({\n selector: 'ng-template[srkUserCell]',\n standalone: true,\n})\nexport class SrkUserCellTemplateDirective {\n readonly templateRef = inject<TemplateRef<UserCellTemplateContext>>(TemplateRef);\n\n static ngTemplateContextGuard(\n _directive: SrkUserCellTemplateDirective,\n context: unknown,\n ): context is UserCellTemplateContext {\n return true;\n }\n}\n\nexport type { UserClickPayload };\n","import type * as srk from '@algoux/standard-ranklist';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n EventEmitter,\n Input,\n Output,\n} from '@angular/core';\nimport {\n EnumTheme,\n formatTimeDuration,\n numberToAlphabet,\n resolveStyle,\n resolveText,\n resolveUserMarkers,\n} from '@algoux/standard-ranklist-utils';\nimport type { ThemeColor } from '@algoux/standard-ranklist-utils';\nimport {\n getAcceptedStatusDetails,\n caniuse,\n getMarkerPresentation,\n getProblemHeaderBackgroundImage,\n resolveSrkAssetUrl,\n shouldShowTimeColumn,\n srkSupportedVersions,\n} from './ranklist-utils';\nimport { captureModalTriggerPointFromMouseEvent } from '../modal/modal-interactions';\nimport type {\n RankValue,\n SolutionClickPayload,\n StaticRanklist,\n StaticRanklistRow,\n UserClickPayload,\n} from '../types';\nimport {\n SrkStatusCellTemplateDirective,\n type StatusCellTemplateContext,\n} from './status-cell-template.directive';\nimport {\n SrkUserCellTemplateDirective,\n type UserCellTemplateContext,\n} from './user-cell-template.directive';\n\n@Component({\n selector: 'srk-ranklist',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule],\n template: `\n <div *ngIf=\"data.type !== 'general'; else versionState\">\n srk type \"{{ data.type }}\" is not supported\n </div>\n\n <ng-template #versionState>\n <div *ngIf=\"!isSupportedVersion(); else ranklistTable\">\n srk version \"{{ data.version }}\" is not supported (current supported: {{ supportedVersions }})\n </div>\n </ng-template>\n\n <ng-template #ranklistTable>\n <div class=\"srk-common-table srk-main\">\n <table\n [class.srk-table-row-bordered]=\"borderedRows\"\n [class.srk-table-row-striped]=\"stripedRows\"\n >\n <thead>\n <tr>\n <th\n *ngFor=\"let seriesItem of data.series\"\n class=\"srk-series-header srk--text-right srk--nowrap\"\n >\n {{ seriesItem.title }}\n </th>\n <th class=\"srk--text-left srk--nowrap\">Name</th>\n <th class=\"srk--nowrap\">Score</th>\n <th *ngIf=\"showTimeColumn()\" class=\"srk--nowrap\">Time</th>\n <th\n *ngFor=\"let problem of data.problems; let problemIndex = index\"\n class=\"srk--nowrap srk-problem-header\"\n [style.background-image]=\"problemHeaderBackgroundImage(problem)\"\n >\n <a\n *ngIf=\"problem.link; else unlinkedProblemHeader\"\n [href]=\"problem.link\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style=\"color: unset\"\n >\n <span class=\"srk--display-block\">{{ problemAlias(problem, problemIndex) }}</span>\n <span\n *ngIf=\"problem.statistics\"\n class=\"srk--display-block srk-problem-stats\"\n [title]=\"problemStatsTitle(problem.statistics)\"\n >\n {{ problem.statistics.accepted }}\n </span>\n </a>\n <ng-template #unlinkedProblemHeader>\n <span class=\"srk--display-block\">{{ problemAlias(problem, problemIndex) }}</span>\n <span\n *ngIf=\"problem.statistics\"\n class=\"srk--display-block srk-problem-stats\"\n [title]=\"problemStatsTitle(problem.statistics)\"\n >\n {{ problem.statistics.accepted }}\n </span>\n </ng-template>\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of data.rows; let rowIndex = index\">\n <td\n *ngFor=\"let rankValue of getRankValues(row); let seriesIndex = index\"\n class=\"srk--text-right srk--nowrap\"\n [ngClass]=\"getSeriesSegmentClass(rankValue, data.series[seriesIndex])\"\n [ngStyle]=\"getSeriesSegmentStyle(rankValue, data.series[seriesIndex])\"\n >\n {{ getRankText(rankValue, row) }}\n </td>\n\n <ng-container *ngIf=\"userCellTemplate; else defaultUserCell\">\n <ng-container\n [ngTemplateOutlet]=\"userCellTemplate.templateRef\"\n [ngTemplateOutletContext]=\"buildUserCellContext(row, rowIndex)\"\n />\n </ng-container>\n <ng-template #defaultUserCell>\n <td\n class=\"srk--text-left srk--nowrap srk-user-cell srk--cursor-pointer\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"emitUserClick($event, row, rowIndex)\"\n (keydown.enter)=\"activateUserCellFromKeyboard($event, row, rowIndex)\"\n (keydown.space)=\"activateUserCellFromKeyboard($event, row, rowIndex)\"\n >\n <div class=\"srk-user-cell-content\">\n <div *ngIf=\"row.user.avatar\" class=\"srk-user-avatar\">\n <img\n [src]=\"formatAssetUrl(row.user.avatar, 'user.avatar')\"\n alt=\"User Avatar\"\n />\n </div>\n <div class=\"srk-user-body\">\n <div class=\"srk-user-name-row\">\n <span\n class=\"srk-user-name-text\"\n [title]=\"resolveDisplayText(row.user.name)\"\n >\n {{ resolveDisplayText(row.user.name) }}\n </span>\n <span class=\"srk-marker-dot-group\">\n <span\n *ngFor=\"let marker of resolvedUserMarkers(row.user)\"\n class=\"srk-marker srk-marker-dot srk--c-tooltip\"\n [ngClass]=\"marker.presentation.className\"\n [ngStyle]=\"marker.presentation.style\"\n [attr.data-tooltip]=\"resolveDisplayText(marker.marker.label)\"\n ></span>\n </span>\n </div>\n <p\n *ngIf=\"row.user.organization\"\n class=\"srk-user-secondary-text srk--text-ellipsis\"\n title=\"\"\n >\n {{ resolveDisplayText(row.user.organization) }}\n </p>\n </div>\n </div>\n </td>\n </ng-template>\n\n <td class=\"srk--text-right srk--nowrap\">{{ row.score.value }}</td>\n <td *ngIf=\"showTimeColumn()\" class=\"srk--text-right srk--nowrap\">\n {{ row.score.time ? formatTime(row.score.time) : '-' }}\n </td>\n\n <ng-container *ngFor=\"let status of row.statuses; let problemIndex = index\">\n <ng-container *ngIf=\"statusCellTemplate; else defaultStatusCell\">\n <ng-container\n [ngTemplateOutlet]=\"statusCellTemplate.templateRef\"\n [ngTemplateOutletContext]=\"buildStatusCellContext(row, rowIndex, status, problemIndex)\"\n />\n </ng-container>\n <ng-template #defaultStatusCell>\n <td\n *ngIf=\"status.result === 'FB' || status.result === 'AC'; else failedOrFrozenStatus\"\n [ngClass]=\"statusCellClass(status)\"\n [attr.role]=\"statusCellRole(status)\"\n [attr.tabindex]=\"statusCellTabIndex(status)\"\n (click)=\"emitSolutionClick($event, row, rowIndex, status, problemIndex)\"\n (keydown.enter)=\"activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)\"\n (keydown.space)=\"activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)\"\n >\n <ng-container *ngIf=\"isNumber(status.score); else acceptedDetails\">\n <span class=\"srk-prest-status-block-score\">{{ status.score }}</span>\n <span class=\"srk-prest-status-block-score-details\">\n {{ acceptedStatusDetails(status) }}\n </span>\n </ng-container>\n <ng-template #acceptedDetails>\n {{ acceptedStatusDetails(status) }}\n </ng-template>\n </td>\n <ng-template #failedOrFrozenStatus>\n <td\n *ngIf=\"status.result === '?' || status.result === 'RJ'; else emptyStatus\"\n [ngClass]=\"statusCellClass(status)\"\n [attr.role]=\"statusCellRole(status)\"\n [attr.tabindex]=\"statusCellTabIndex(status)\"\n (click)=\"emitSolutionClick($event, row, rowIndex, status, problemIndex)\"\n (keydown.enter)=\"activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)\"\n (keydown.space)=\"activateStatusCellFromKeyboard($event, row, rowIndex, status, problemIndex)\"\n >\n {{ status.tries }}\n </td>\n </ng-template>\n <ng-template #emptyStatus>\n <td></td>\n </ng-template>\n </ng-template>\n </ng-container>\n </tr>\n </tbody>\n </table>\n </div>\n </ng-template>\n `,\n})\nexport class RanklistComponent {\n @Input({ required: true }) data!: StaticRanklist;\n @Input() theme: EnumTheme = EnumTheme.light;\n @Input() borderedRows = false;\n @Input() stripedRows = false;\n @Input() formatSrkAssetUrl?: (url: string, field: string) => string;\n\n @Output() userClick = new EventEmitter<UserClickPayload>();\n @Output() solutionClick = new EventEmitter<SolutionClickPayload>();\n\n @ContentChild(SrkStatusCellTemplateDirective)\n statusCellTemplate?: SrkStatusCellTemplateDirective;\n\n @ContentChild(SrkUserCellTemplateDirective)\n userCellTemplate?: SrkUserCellTemplateDirective;\n\n readonly supportedVersions = srkSupportedVersions;\n\n isSupportedVersion() {\n return caniuse(this.data.version);\n }\n\n showTimeColumn() {\n return shouldShowTimeColumn(this.data.rows);\n }\n\n getRankValues(row: StaticRanklistRow): RankValue[] {\n return row.rankValues || this.data.series.map(() => ({ rank: null, segmentIndex: null }));\n }\n\n getRankText(rankValue: RankValue, row: StaticRanklistRow) {\n return rankValue.rank ? rankValue.rank : row.user.official === false ? '*' : '';\n }\n\n resolveDisplayText(text: Parameters<typeof resolveText>[0]) {\n return resolveText(text);\n }\n\n problemAlias(problem: srk.Problem, problemIndex: number) {\n return problem.alias || numberToAlphabet(problemIndex);\n }\n\n problemStatsTitle(statistics: srk.ProblemStatistics) {\n const ratio = statistics.submitted ? ((statistics.accepted / statistics.submitted) * 100).toFixed(1) : 0;\n return `${statistics.accepted} / ${statistics.submitted} (${ratio}%)`;\n }\n\n problemHeaderBackgroundImage(problem: srk.Problem) {\n return getProblemHeaderBackgroundImage(problem.style, this.theme);\n }\n\n resolvedUserMarkers(user: srk.User) {\n return resolveUserMarkers(user, this.data.markers).map((marker) => ({\n marker,\n presentation: getMarkerPresentation(marker, this.theme),\n }));\n }\n\n formatAssetUrl(url: string, field: string) {\n return resolveSrkAssetUrl(url, field, this.formatSrkAssetUrl);\n }\n\n formatTime(time: Parameters<typeof formatTimeDuration>[0]) {\n return formatTimeDuration(time, 'min', Math.floor);\n }\n\n acceptedStatusDetails(status: srk.RankProblemStatus) {\n return getAcceptedStatusDetails(status);\n }\n\n isNumber(value: unknown): value is number {\n return typeof value === 'number';\n }\n\n getStatusSolutions(status: srk.RankProblemStatus) {\n return [...(status.solutions || [])].reverse();\n }\n\n statusCellClass(status: srk.RankProblemStatus) {\n const classNames = ['srk-prest-status-block', 'srk--text-center', 'srk--nowrap'];\n if (this.isStatusClickable(status)) {\n classNames.push('srk--cursor-pointer');\n }\n if (status.result === 'FB') {\n classNames.push('srk-prest-status-block-fb');\n } else if (status.result === 'AC') {\n classNames.push('srk-prest-status-block-accepted');\n } else if (status.result === '?') {\n classNames.push('srk-prest-status-block-frozen');\n } else if (status.result === 'RJ') {\n classNames.push('srk-prest-status-block-failed');\n }\n return classNames.join(' ');\n }\n\n isStatusClickable(status: srk.RankProblemStatus) {\n return this.getStatusSolutions(status).length > 0;\n }\n\n statusCellRole(status: srk.RankProblemStatus) {\n return this.isStatusClickable(status) ? 'button' : null;\n }\n\n statusCellTabIndex(status: srk.RankProblemStatus) {\n return this.isStatusClickable(status) ? 0 : null;\n }\n\n buildUserCellContext(row: StaticRanklistRow, rowIndex: number): UserCellTemplateContext {\n return {\n $implicit: row.user,\n user: row.user,\n row,\n rowIndex,\n ranklist: this.data,\n markers: this.data.markers,\n onClick: (event?: MouseEvent) => this.emitUserClick(event, row, rowIndex),\n };\n }\n\n buildStatusCellContext(\n row: StaticRanklistRow,\n rowIndex: number,\n status: srk.RankProblemStatus,\n problemIndex: number,\n ): StatusCellTemplateContext {\n return {\n $implicit: status,\n status,\n problem: this.data.problems[problemIndex],\n problemIndex,\n user: row.user,\n row,\n rowIndex,\n ranklist: this.data,\n solutions: this.getStatusSolutions(status),\n onClick: (event?: MouseEvent) => this.emitSolutionClick(event, row, rowIndex, status, problemIndex),\n };\n }\n\n activateUserCellFromKeyboard(event: Event, row: StaticRanklistRow, rowIndex: number) {\n event.preventDefault();\n this.emitUserClick(undefined, row, rowIndex);\n }\n\n activateStatusCellFromKeyboard(\n event: Event,\n row: StaticRanklistRow,\n rowIndex: number,\n status: srk.RankProblemStatus,\n problemIndex: number,\n ) {\n event.preventDefault();\n this.emitSolutionClick(undefined, row, rowIndex, status, problemIndex);\n }\n\n emitUserClick(event: MouseEvent | undefined, row: StaticRanklistRow, rowIndex: number) {\n if (event) {\n captureModalTriggerPointFromMouseEvent(event, {\n source: 'user-cell',\n context: {\n rowIndex,\n userId: row.user.id || null,\n userName: this.resolveDisplayText(row.user.name),\n },\n });\n }\n this.userClick.emit({\n user: row.user,\n row,\n rowIndex,\n ranklist: this.data,\n });\n }\n\n emitSolutionClick(\n event: MouseEvent | undefined,\n row: StaticRanklistRow,\n rowIndex: number,\n status: srk.RankProblemStatus,\n problemIndex: number,\n ) {\n const solutions = this.getStatusSolutions(status);\n if (!solutions.length) {\n return;\n }\n if (event) {\n captureModalTriggerPointFromMouseEvent(event, {\n source: 'status-cell',\n context: {\n rowIndex,\n problemIndex,\n problemAlias: this.data.problems[problemIndex]?.alias || null,\n problemTitle: this.data.problems[problemIndex]?.title || null,\n userId: row.user.id || null,\n },\n });\n }\n this.solutionClick.emit({\n user: row.user,\n row,\n rowIndex,\n problemIndex,\n problem: this.data.problems[problemIndex],\n status,\n solutions,\n ranklist: this.data,\n });\n }\n\n private resolveSeriesSegment(rankValue: RankValue, series: srk.RankSeries | undefined) {\n const index = rankValue.segmentIndex || rankValue.segmentIndex === 0 ? rankValue.segmentIndex : -1;\n return (series?.segments || [])[index] || {};\n }\n\n getSeriesSegmentClass(rankValue: RankValue, series: srk.RankSeries | undefined) {\n const segmentStyle = this.resolveSeriesSegment(rankValue, series).style;\n return typeof segmentStyle === 'string' ? `srk-preset-series-segment-${segmentStyle}` : '';\n }\n\n getSeriesSegmentStyle(rankValue: RankValue, series: srk.RankSeries | undefined) {\n const emptyColor: ThemeColor = {\n [EnumTheme.light]: undefined,\n [EnumTheme.dark]: undefined,\n };\n const segmentStyle = this.resolveSeriesSegment(rankValue, series).style;\n if (!segmentStyle || typeof segmentStyle === 'string') {\n return {};\n }\n const style = resolveStyle(segmentStyle);\n const textColor = style.textColor || emptyColor;\n const backgroundColor = style.backgroundColor || emptyColor;\n return {\n color: textColor[this.theme],\n backgroundColor: backgroundColor[this.theme],\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts DELETED
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- /// <amd-module name="@algoux/standard-ranklist-renderer-component-angular" />
5
- export * from './public-api';
@@ -1,8 +0,0 @@
1
- export { DefaultSolutionModalComponent, } from './modal/default-solution-modal.component';
2
- export { DefaultUserModalComponent, } from './modal/default-user-modal.component';
3
- export { ModalComponent, type ModalCloseReason, } from './modal/modal.component';
4
- export { ProgressBarComponent } from './progress/progress-bar.component';
5
- export { RanklistComponent } from './ranklist/ranklist.component';
6
- export { SrkStatusCellTemplateDirective, type StatusCellTemplateContext, } from './ranklist/status-cell-template.directive';
7
- export { SrkUserCellTemplateDirective, type UserCellTemplateContext, } from './ranklist/user-cell-template.directive';
8
- export type { RankValue, SolutionClickPayload, StaticRanklist, UserClickPayload, } from './types';
@@ -1,30 +0,0 @@
1
- import type * as srk from '@algoux/standard-ranklist';
2
- import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
3
- import { formatSolutionTimestamp, type SolutionResultMeta } from '../ranklist/ranklist-utils';
4
- import { type ModalCloseReason } from './modal.component';
5
- import * as i0 from "@angular/core";
6
- export declare class DefaultSolutionModalComponent implements OnChanges {
7
- open: boolean;
8
- user?: srk.User | null;
9
- problem?: srk.Problem;
10
- problemIndex: number;
11
- solutions: srk.Solution[];
12
- title?: string;
13
- width: number;
14
- rootClassName: string;
15
- wrapClassName: string;
16
- panelStyle: Record<string, string | number>;
17
- openChange: EventEmitter<boolean>;
18
- close: EventEmitter<ModalCloseReason>;
19
- readonly formatSolutionTimestamp: typeof formatSolutionTimestamp;
20
- cachedUser: srk.User | null;
21
- cachedProblem?: srk.Problem;
22
- cachedProblemIndex: number;
23
- cachedSolutions: srk.Solution[];
24
- ngOnChanges(_changes: SimpleChanges): void;
25
- resolvedTitle(): string;
26
- solutionMeta(solution: srk.Solution): SolutionResultMeta;
27
- trackBySolution(index: number, solution: srk.Solution): string;
28
- static ɵfac: i0.ɵɵFactoryDeclaration<DefaultSolutionModalComponent, never>;
29
- static ɵcmp: i0.ɵɵComponentDeclaration<DefaultSolutionModalComponent, "srk-default-solution-modal", never, { "open": { "alias": "open"; "required": false; }; "user": { "alias": "user"; "required": false; }; "problem": { "alias": "problem"; "required": false; }; "problemIndex": { "alias": "problemIndex"; "required": false; }; "solutions": { "alias": "solutions"; "required": false; }; "title": { "alias": "title"; "required": false; }; "width": { "alias": "width"; "required": false; }; "rootClassName": { "alias": "rootClassName"; "required": false; }; "wrapClassName": { "alias": "wrapClassName"; "required": false; }; "panelStyle": { "alias": "panelStyle"; "required": false; }; }, { "openChange": "openChange"; "close": "close"; }, never, never, true, never>;
30
- }
@@ -1,34 +0,0 @@
1
- import type * as srk from '@algoux/standard-ranklist';
2
- import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
3
- import { EnumTheme, resolveText } from '@algoux/standard-ranklist-utils';
4
- import { type MarkerPresentation } from '../ranklist/ranklist-utils';
5
- import { type ModalCloseReason } from './modal.component';
6
- import * as i0 from "@angular/core";
7
- interface ResolvedMarker {
8
- marker: srk.Marker;
9
- presentation: MarkerPresentation;
10
- }
11
- export declare class DefaultUserModalComponent implements OnChanges {
12
- open: boolean;
13
- user?: srk.User | null;
14
- markers: srk.Marker[];
15
- theme: EnumTheme;
16
- title: string;
17
- width: number;
18
- rootClassName: string;
19
- wrapClassName: string;
20
- panelStyle: Record<string, string | number>;
21
- formatSrkAssetUrl?: (url: string, field: string) => string;
22
- openChange: EventEmitter<boolean>;
23
- close: EventEmitter<ModalCloseReason>;
24
- readonly resolveText: typeof resolveText;
25
- cachedUser: srk.User | null;
26
- ngOnChanges(_changes: SimpleChanges): void;
27
- resolvedMarkers(): ResolvedMarker[];
28
- formatAssetUrl(url: string, field: string): string;
29
- trackByMarkerId(_index: number, entry: ResolvedMarker): string;
30
- trackByMemberName(_index: number, member: srk.ExternalUser): string;
31
- static ɵfac: i0.ɵɵFactoryDeclaration<DefaultUserModalComponent, never>;
32
- static ɵcmp: i0.ɵɵComponentDeclaration<DefaultUserModalComponent, "srk-default-user-modal", never, { "open": { "alias": "open"; "required": false; }; "user": { "alias": "user"; "required": false; }; "markers": { "alias": "markers"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "title": { "alias": "title"; "required": false; }; "width": { "alias": "width"; "required": false; }; "rootClassName": { "alias": "rootClassName"; "required": false; }; "wrapClassName": { "alias": "wrapClassName"; "required": false; }; "panelStyle": { "alias": "panelStyle"; "required": false; }; "formatSrkAssetUrl": { "alias": "formatSrkAssetUrl"; "required": false; }; }, { "openChange": "openChange"; "close": "close"; }, never, never, true, never>;
33
- }
34
- export {};
@@ -1 +0,0 @@
1
- export { MODAL_ANIMATION_DURATION_MS, SRK_ANIMATED_MODAL_ROOT_CLASS, SRK_SCROLL_LOCK_BODY_CLASS, captureModalTriggerPointFromMouseEvent, ensureModalInteractionTracker, isTopModalFocusScope, lockModalBodyScroll, registerModalFocusScope, resolveModalTransformOrigin, unlockModalBodyScroll, unregisterModalFocusScope, } from '@algoux/standard-ranklist-renderer-component-core';
@@ -1,49 +0,0 @@
1
- import { AfterViewChecked, ElementRef, EventEmitter, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- export type ModalCloseReason = 'mask' | 'close-button' | 'escape';
4
- export declare class ModalComponent implements AfterViewChecked, OnChanges, OnDestroy {
5
- open: boolean;
6
- title?: string;
7
- width?: number;
8
- rootClassName?: string;
9
- wrapClassName?: string;
10
- destroyOnClose: boolean;
11
- closeOnEsc: boolean;
12
- closeOnMaskClick: boolean;
13
- panelStyle: Record<string, string | number>;
14
- openChange: EventEmitter<boolean>;
15
- close: EventEmitter<ModalCloseReason>;
16
- dialogRef?: ElementRef<HTMLDivElement>;
17
- isMounted: boolean;
18
- animationState: 'pre-open' | 'opening' | 'closing';
19
- transformOrigin: {
20
- x: number;
21
- y: number;
22
- };
23
- private closeTimer;
24
- private openTimer;
25
- private bodyScrollLocked;
26
- private focusScopeId;
27
- constructor();
28
- ngOnChanges(changes: SimpleChanges): void;
29
- ngAfterViewChecked(): void;
30
- ngOnDestroy(): void;
31
- handleEscape(event?: KeyboardEvent): void;
32
- handleMaskMouseDown(event: MouseEvent): void;
33
- requestClose(reason: ModalCloseReason): void;
34
- shouldRender(): boolean;
35
- rootClasses(): string[];
36
- dialogStyle(): {
37
- width: string | number;
38
- '--srk-modal-origin-x': string;
39
- '--srk-modal-origin-y': string;
40
- '--srk-modal-max-width': string;
41
- };
42
- private clearTimers;
43
- private syncOpenState;
44
- private updateBodyScrollLock;
45
- private registerFocusScope;
46
- private releaseFocusScope;
47
- static ɵfac: i0.ɵɵFactoryDeclaration<ModalComponent, never>;
48
- static ɵcmp: i0.ɵɵComponentDeclaration<ModalComponent, "srk-modal", never, { "open": { "alias": "open"; "required": false; }; "title": { "alias": "title"; "required": false; }; "width": { "alias": "width"; "required": false; }; "rootClassName": { "alias": "rootClassName"; "required": false; }; "wrapClassName": { "alias": "wrapClassName"; "required": false; }; "destroyOnClose": { "alias": "destroyOnClose"; "required": false; }; "closeOnEsc": { "alias": "closeOnEsc"; "required": false; }; "closeOnMaskClick": { "alias": "closeOnMaskClick"; "required": false; }; "panelStyle": { "alias": "panelStyle"; "required": false; }; }, { "openChange": "openChange"; "close": "close"; }, never, ["*"], true, never>;
49
- }
@@ -1,31 +0,0 @@
1
- import type * as srk from '@algoux/standard-ranklist';
2
- import { EventEmitter, OnDestroy, OnInit } from '@angular/core';
3
- import * as i0 from "@angular/core";
4
- export declare class ProgressBarComponent implements OnInit, OnDestroy {
5
- data: srk.Ranklist;
6
- enableTimeTravel: boolean;
7
- live: boolean;
8
- td: number;
9
- timeTravel: EventEmitter<number>;
10
- localTime: number;
11
- inTimeMachine: boolean;
12
- timeTravelIsChanging: boolean;
13
- timeTravelCurrentValue: number;
14
- timeTravelValue: number | null;
15
- private liveInterval?;
16
- ngOnInit(): void;
17
- ngOnDestroy(): void;
18
- secToTimeStr(seconds: number): string;
19
- timeLabel(minutes: number): string;
20
- durationMinutes(): number;
21
- maxAvailableMinutes(): number;
22
- isEnded(): boolean;
23
- progressMetrics(): import("./progress-utils").ProgressMetrics;
24
- beginTimeTravel(): void;
25
- updateTimeTravelValue(event: Event): void;
26
- commitTimeTravel(): void;
27
- private handleProgressTimer;
28
- private handleTimeTravelChange;
29
- static ɵfac: i0.ɵɵFactoryDeclaration<ProgressBarComponent, never>;
30
- static ɵcmp: i0.ɵɵComponentDeclaration<ProgressBarComponent, "srk-progress-bar", never, { "data": { "alias": "data"; "required": true; }; "enableTimeTravel": { "alias": "enableTimeTravel"; "required": false; }; "live": { "alias": "live"; "required": false; }; "td": { "alias": "td"; "required": false; }; }, { "timeTravel": "timeTravel"; }, never, never, true, never>;
31
- }
@@ -1,15 +0,0 @@
1
- import type * as srk from '@algoux/standard-ranklist';
2
- export interface ProgressMetrics {
3
- elapsed: number;
4
- remaining: number;
5
- frozenBreakpoint: number;
6
- normalInnerPercent: number;
7
- frozenInnerPercent: number;
8
- timeTravelElapsed: number;
9
- timeTravelRemaining: number;
10
- supportRegen: boolean;
11
- }
12
- export declare function getProgressDurationMinutes(contest: srk.Contest): number;
13
- export declare function getProgressMaxAvailableMinutes(contest: srk.Contest, localTime: number, td?: number): number;
14
- export declare function isProgressEnded(contest: srk.Contest, localTime: number, td?: number): boolean;
15
- export declare function getProgressMetrics(data: srk.Ranklist, localTime: number, td: number, timeTravelCurrentValue: number, inTimeMachine: boolean): ProgressMetrics;
@@ -1,22 +0,0 @@
1
- import type * as srk from '@algoux/standard-ranklist';
2
- import { EnumTheme } from '@algoux/standard-ranklist-utils';
3
- export { caniuse, srkSupportedVersions } from '@algoux/standard-ranklist-renderer-component-core';
4
- export declare const defaultBackgroundColor: Record<EnumTheme, string>;
5
- export interface MarkerPresentation {
6
- className?: string;
7
- style?: {
8
- backgroundColor?: string;
9
- };
10
- }
11
- export interface SolutionResultMeta {
12
- label: string;
13
- className?: string;
14
- }
15
- export declare function resolveSrkAssetUrl(url: string, field: string, formatter?: (url: string, field: string) => string): string;
16
- export declare function getAcceptedStatusDetails(status: srk.RankProblemStatus): string;
17
- export declare function getSolutionResultMeta(result: srk.Solution['result']): SolutionResultMeta;
18
- export declare function getSolutionModalTitle(problemIndex: number, user: srk.User): string;
19
- export declare function formatSolutionTimestamp(solution: srk.Solution): string;
20
- export declare function getProblemHeaderBackgroundImage(style: srk.Style | undefined, theme: EnumTheme): string;
21
- export declare function getMarkerPresentation(marker: srk.Marker, theme: EnumTheme): MarkerPresentation;
22
- export declare function shouldShowTimeColumn(rows: srk.RanklistRow[]): boolean;
@@ -1,57 +0,0 @@
1
- import type * as srk from '@algoux/standard-ranklist';
2
- import { EventEmitter } from '@angular/core';
3
- import { EnumTheme, formatTimeDuration, resolveText } from '@algoux/standard-ranklist-utils';
4
- import type { RankValue, SolutionClickPayload, StaticRanklist, StaticRanklistRow, UserClickPayload } from '../types';
5
- import { SrkStatusCellTemplateDirective, type StatusCellTemplateContext } from './status-cell-template.directive';
6
- import { SrkUserCellTemplateDirective, type UserCellTemplateContext } from './user-cell-template.directive';
7
- import * as i0 from "@angular/core";
8
- export declare class RanklistComponent {
9
- data: StaticRanklist;
10
- theme: EnumTheme;
11
- borderedRows: boolean;
12
- stripedRows: boolean;
13
- formatSrkAssetUrl?: (url: string, field: string) => string;
14
- userClick: EventEmitter<UserClickPayload>;
15
- solutionClick: EventEmitter<SolutionClickPayload>;
16
- statusCellTemplate?: SrkStatusCellTemplateDirective;
17
- userCellTemplate?: SrkUserCellTemplateDirective;
18
- readonly supportedVersions: any;
19
- isSupportedVersion(): boolean;
20
- showTimeColumn(): boolean;
21
- getRankValues(row: StaticRanklistRow): RankValue[];
22
- getRankText(rankValue: RankValue, row: StaticRanklistRow): number | "" | "*";
23
- resolveDisplayText(text: Parameters<typeof resolveText>[0]): string;
24
- problemAlias(problem: srk.Problem, problemIndex: number): string;
25
- problemStatsTitle(statistics: srk.ProblemStatistics): string;
26
- problemHeaderBackgroundImage(problem: srk.Problem): string;
27
- resolvedUserMarkers(user: srk.User): {
28
- marker: srk.Marker;
29
- presentation: import("./ranklist-utils").MarkerPresentation;
30
- }[];
31
- formatAssetUrl(url: string, field: string): string;
32
- formatTime(time: Parameters<typeof formatTimeDuration>[0]): number;
33
- acceptedStatusDetails(status: srk.RankProblemStatus): string;
34
- isNumber(value: unknown): value is number;
35
- getStatusSolutions(status: srk.RankProblemStatus): srk.Solution[];
36
- statusCellClass(status: srk.RankProblemStatus): string;
37
- isStatusClickable(status: srk.RankProblemStatus): boolean;
38
- statusCellRole(status: srk.RankProblemStatus): string;
39
- statusCellTabIndex(status: srk.RankProblemStatus): number;
40
- buildUserCellContext(row: StaticRanklistRow, rowIndex: number): UserCellTemplateContext;
41
- buildStatusCellContext(row: StaticRanklistRow, rowIndex: number, status: srk.RankProblemStatus, problemIndex: number): StatusCellTemplateContext;
42
- activateUserCellFromKeyboard(event: Event, row: StaticRanklistRow, rowIndex: number): void;
43
- activateStatusCellFromKeyboard(event: Event, row: StaticRanklistRow, rowIndex: number, status: srk.RankProblemStatus, problemIndex: number): void;
44
- emitUserClick(event: MouseEvent | undefined, row: StaticRanklistRow, rowIndex: number): void;
45
- emitSolutionClick(event: MouseEvent | undefined, row: StaticRanklistRow, rowIndex: number, status: srk.RankProblemStatus, problemIndex: number): void;
46
- private resolveSeriesSegment;
47
- getSeriesSegmentClass(rankValue: RankValue, series: srk.RankSeries | undefined): string;
48
- getSeriesSegmentStyle(rankValue: RankValue, series: srk.RankSeries | undefined): {
49
- color?: undefined;
50
- backgroundColor?: undefined;
51
- } | {
52
- color: string;
53
- backgroundColor: string;
54
- };
55
- static ɵfac: i0.ɵɵFactoryDeclaration<RanklistComponent, never>;
56
- static ɵcmp: i0.ɵɵComponentDeclaration<RanklistComponent, "srk-ranklist", never, { "data": { "alias": "data"; "required": true; }; "theme": { "alias": "theme"; "required": false; }; "borderedRows": { "alias": "borderedRows"; "required": false; }; "stripedRows": { "alias": "stripedRows"; "required": false; }; "formatSrkAssetUrl": { "alias": "formatSrkAssetUrl"; "required": false; }; }, { "userClick": "userClick"; "solutionClick": "solutionClick"; }, ["statusCellTemplate", "userCellTemplate"], never, true, never>;
57
- }
@@ -1,23 +0,0 @@
1
- import type * as srk from '@algoux/standard-ranklist';
2
- import { TemplateRef } from '@angular/core';
3
- import type { SolutionClickPayload, StaticRanklist, StaticRanklistRow } from '../types';
4
- import * as i0 from "@angular/core";
5
- export interface StatusCellTemplateContext {
6
- $implicit: srk.RankProblemStatus;
7
- status: srk.RankProblemStatus;
8
- problem: srk.Problem | undefined;
9
- problemIndex: number;
10
- user: srk.User;
11
- row: StaticRanklistRow;
12
- rowIndex: number;
13
- ranklist: StaticRanklist;
14
- solutions: srk.Solution[];
15
- onClick: (event?: MouseEvent) => void;
16
- }
17
- export declare class SrkStatusCellTemplateDirective {
18
- readonly templateRef: TemplateRef<StatusCellTemplateContext>;
19
- static ngTemplateContextGuard(_directive: SrkStatusCellTemplateDirective, context: unknown): context is StatusCellTemplateContext;
20
- static ɵfac: i0.ɵɵFactoryDeclaration<SrkStatusCellTemplateDirective, never>;
21
- static ɵdir: i0.ɵɵDirectiveDeclaration<SrkStatusCellTemplateDirective, "ng-template[srkStatusCell]", never, {}, {}, never, never, true, never>;
22
- }
23
- export type { SolutionClickPayload };
@@ -1,20 +0,0 @@
1
- import type * as srk from '@algoux/standard-ranklist';
2
- import { TemplateRef } from '@angular/core';
3
- import type { StaticRanklist, StaticRanklistRow, UserClickPayload } from '../types';
4
- import * as i0 from "@angular/core";
5
- export interface UserCellTemplateContext {
6
- $implicit: srk.User;
7
- user: srk.User;
8
- row: StaticRanklistRow;
9
- rowIndex: number;
10
- ranklist: StaticRanklist;
11
- markers: srk.Marker[];
12
- onClick: (event?: MouseEvent) => void;
13
- }
14
- export declare class SrkUserCellTemplateDirective {
15
- readonly templateRef: TemplateRef<UserCellTemplateContext>;
16
- static ngTemplateContextGuard(_directive: SrkUserCellTemplateDirective, context: unknown): context is UserCellTemplateContext;
17
- static ɵfac: i0.ɵɵFactoryDeclaration<SrkUserCellTemplateDirective, never>;
18
- static ɵdir: i0.ɵɵDirectiveDeclaration<SrkUserCellTemplateDirective, "ng-template[srkUserCell]", never, {}, {}, never, never, true, never>;
19
- }
20
- export type { UserClickPayload };
@@ -1,27 +0,0 @@
1
- import type * as srk from '@algoux/standard-ranklist';
2
- export interface RankValue {
3
- rank: number | null;
4
- segmentIndex?: number | null;
5
- }
6
- export type StaticRanklist = Omit<srk.Ranklist, 'rows'> & {
7
- rows: Array<srk.RanklistRow & {
8
- rankValues: RankValue[];
9
- }>;
10
- };
11
- export type StaticRanklistRow = StaticRanklist['rows'][number];
12
- export interface UserClickPayload {
13
- user: srk.User;
14
- row: StaticRanklistRow;
15
- rowIndex: number;
16
- ranklist: StaticRanklist;
17
- }
18
- export interface SolutionClickPayload {
19
- user: srk.User;
20
- row: StaticRanklistRow;
21
- rowIndex: number;
22
- problemIndex: number;
23
- problem: srk.Problem | undefined;
24
- status: srk.RankProblemStatus;
25
- solutions: srk.Solution[];
26
- ranklist: StaticRanklist;
27
- }
@@ -1 +0,0 @@
1
- export * from './lib/index';