@algoux/standard-ranklist-renderer-component-angular 0.6.3 → 0.6.4

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.
@@ -820,6 +820,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
820
820
  type: Output
821
821
  }] } });
822
822
 
823
+ class SrkProblemHeaderCellTemplateDirective {
824
+ templateRef = inject(TemplateRef);
825
+ static ngTemplateContextGuard(_directive, context) {
826
+ return true;
827
+ }
828
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SrkProblemHeaderCellTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
829
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: SrkProblemHeaderCellTemplateDirective, isStandalone: true, selector: "ng-template[srkProblemHeaderCell]", ngImport: i0 });
830
+ }
831
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SrkProblemHeaderCellTemplateDirective, decorators: [{
832
+ type: Directive,
833
+ args: [{
834
+ selector: 'ng-template[srkProblemHeaderCell]',
835
+ standalone: true,
836
+ }]
837
+ }] });
838
+
823
839
  class SrkStatusCellTemplateDirective {
824
840
  templateRef = inject(TemplateRef);
825
841
  static ngTemplateContextGuard(_directive, context) {
@@ -870,7 +886,9 @@ class RanklistComponent {
870
886
  userAvatarPlacement = 'user';
871
887
  languages;
872
888
  userClick = new EventEmitter();
889
+ problemClick = new EventEmitter();
873
890
  solutionClick = new EventEmitter();
891
+ problemHeaderCellTemplate;
874
892
  statusCellTemplate;
875
893
  userCellTemplate;
876
894
  supportedVersions = srkSupportedVersions;
@@ -1027,6 +1045,27 @@ class RanklistComponent {
1027
1045
  statusCellTabIndex(status) {
1028
1046
  return this.isStatusClickable(status) ? 0 : null;
1029
1047
  }
1048
+ hasProblemClickListener() {
1049
+ const emitter = this.problemClick;
1050
+ return emitter.observed === true || Boolean(emitter.observers?.length);
1051
+ }
1052
+ problemHeaderRole() {
1053
+ return this.hasProblemClickListener() ? 'button' : null;
1054
+ }
1055
+ problemHeaderTabIndex() {
1056
+ return this.hasProblemClickListener() ? 0 : null;
1057
+ }
1058
+ buildProblemHeaderCellContext(problem, problemIndex) {
1059
+ return {
1060
+ $implicit: problem,
1061
+ problem,
1062
+ problemIndex,
1063
+ index: problemIndex,
1064
+ ranklist: this.data,
1065
+ languages: this.languages,
1066
+ onClick: (event) => this.emitProblemClick(event, problem, problemIndex),
1067
+ };
1068
+ }
1030
1069
  buildUserCellContext(row, rowIndex) {
1031
1070
  return {
1032
1071
  $implicit: row.user,
@@ -1063,6 +1102,13 @@ class RanklistComponent {
1063
1102
  event.preventDefault();
1064
1103
  this.emitUserClick(undefined, row, rowIndex);
1065
1104
  }
1105
+ activateProblemHeaderFromKeyboard(event, problem, problemIndex) {
1106
+ if (!this.hasProblemClickListener()) {
1107
+ return;
1108
+ }
1109
+ event.preventDefault();
1110
+ this.emitProblemClick(undefined, problem, problemIndex);
1111
+ }
1066
1112
  activateStatusCellFromKeyboard(event, row, rowIndex, status, problemIndex) {
1067
1113
  event.preventDefault();
1068
1114
  this.emitSolutionClick(undefined, row, rowIndex, status, problemIndex);
@@ -1085,6 +1131,27 @@ class RanklistComponent {
1085
1131
  ranklist: this.data,
1086
1132
  });
1087
1133
  }
1134
+ emitProblemClick(event, problem, problemIndex) {
1135
+ if (!this.hasProblemClickListener()) {
1136
+ return;
1137
+ }
1138
+ if (event) {
1139
+ event.preventDefault();
1140
+ captureModalTriggerPointFromMouseEvent(event, {
1141
+ source: 'problem-header',
1142
+ context: {
1143
+ problemIndex,
1144
+ problemAlias: problem.alias || null,
1145
+ problemTitle: this.resolveDisplayText(problem.title) || null,
1146
+ },
1147
+ });
1148
+ }
1149
+ this.problemClick.emit({
1150
+ problem,
1151
+ problemIndex,
1152
+ ranklist: this.data,
1153
+ });
1154
+ }
1088
1155
  emitSolutionClick(event, row, rowIndex, status, problemIndex) {
1089
1156
  const solutions = this.getStatusSolutions(status);
1090
1157
  if (!solutions.length) {
@@ -1174,7 +1241,7 @@ class RanklistComponent {
1174
1241
  }
1175
1242
  }
1176
1243
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RanklistComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1177
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: RanklistComponent, isStandalone: true, selector: "srk-ranklist", inputs: { data: "data", theme: "theme", rowBordered: "rowBordered", columnBordered: "columnBordered", rowStriped: "rowStriped", formatSrkAssetUrl: "formatSrkAssetUrl", splitOrganization: "splitOrganization", columnTitles: "columnTitles", statusCellPreset: "statusCellPreset", statusColorAsText: "statusColorAsText", showProblemStatisticsFooter: "showProblemStatisticsFooter", showDirtColumn: "showDirtColumn", showSEColumn: "showSEColumn", emptyStatusPlaceholder: "emptyStatusPlaceholder", userAvatarPlacement: "userAvatarPlacement", languages: "languages" }, outputs: { userClick: "userClick", solutionClick: "solutionClick" }, queries: [{ propertyName: "statusCellTemplate", first: true, predicate: SrkStatusCellTemplateDirective, descendants: true }, { propertyName: "userCellTemplate", first: true, predicate: SrkUserCellTemplateDirective, descendants: true }], ngImport: i0, template: `
1244
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: RanklistComponent, isStandalone: true, selector: "srk-ranklist", inputs: { data: "data", theme: "theme", rowBordered: "rowBordered", columnBordered: "columnBordered", rowStriped: "rowStriped", formatSrkAssetUrl: "formatSrkAssetUrl", splitOrganization: "splitOrganization", columnTitles: "columnTitles", statusCellPreset: "statusCellPreset", statusColorAsText: "statusColorAsText", showProblemStatisticsFooter: "showProblemStatisticsFooter", showDirtColumn: "showDirtColumn", showSEColumn: "showSEColumn", emptyStatusPlaceholder: "emptyStatusPlaceholder", userAvatarPlacement: "userAvatarPlacement", languages: "languages" }, outputs: { userClick: "userClick", problemClick: "problemClick", solutionClick: "solutionClick" }, queries: [{ propertyName: "problemHeaderCellTemplate", first: true, predicate: SrkProblemHeaderCellTemplateDirective, descendants: true }, { propertyName: "statusCellTemplate", first: true, predicate: SrkStatusCellTemplateDirective, descendants: true }, { propertyName: "userCellTemplate", first: true, predicate: SrkUserCellTemplateDirective, descendants: true }], ngImport: i0, template: `
1178
1245
  <div *ngIf="data.type !== 'general'; else versionState">
1179
1246
  srk type "{{ data.type }}" is not supported
1180
1247
  </div>
@@ -1212,38 +1279,55 @@ class RanklistComponent {
1212
1279
  <th *ngIf="showTimeColumn()" class="srk--text-right srk--nowrap">
1213
1280
  {{ resolveColumnTitle('time', 'Time') }}
1214
1281
  </th>
1215
- <th
1282
+ <ng-container
1216
1283
  *ngFor="let problem of data.problems; let problemIndex = index"
1217
- class="srk--nowrap srk-problem-header"
1218
- [style.background-image]="problemHeaderBackgroundImage(problem)"
1219
1284
  >
1220
- <a
1221
- *ngIf="problem.link; else unlinkedProblemHeader"
1222
- [href]="problem.link"
1223
- target="_blank"
1224
- rel="noopener noreferrer"
1225
- style="color: unset"
1226
- >
1227
- <span class="srk--display-block">{{ problemAlias(problem, problemIndex) }}</span>
1228
- <span
1229
- *ngIf="problem.statistics"
1230
- class="srk--display-block srk-problem-stats"
1231
- [title]="problemStatsTitle(problem.statistics)"
1232
- >
1233
- {{ problem.statistics.accepted }}
1234
- </span>
1235
- </a>
1236
- <ng-template #unlinkedProblemHeader>
1237
- <span class="srk--display-block">{{ problemAlias(problem, problemIndex) }}</span>
1238
- <span
1239
- *ngIf="problem.statistics"
1240
- class="srk--display-block srk-problem-stats"
1241
- [title]="problemStatsTitle(problem.statistics)"
1285
+ <ng-container *ngIf="problemHeaderCellTemplate; else defaultProblemHeader">
1286
+ <ng-container
1287
+ [ngTemplateOutlet]="problemHeaderCellTemplate.templateRef"
1288
+ [ngTemplateOutletContext]="buildProblemHeaderCellContext(problem, problemIndex)"
1289
+ />
1290
+ </ng-container>
1291
+ <ng-template #defaultProblemHeader>
1292
+ <th
1293
+ class="srk--nowrap srk-problem-header"
1294
+ [class.srk--cursor-pointer]="hasProblemClickListener()"
1295
+ [attr.role]="problemHeaderRole()"
1296
+ [attr.tabindex]="problemHeaderTabIndex()"
1297
+ [style.background-image]="problemHeaderBackgroundImage(problem)"
1298
+ (click)="emitProblemClick($event, problem, problemIndex)"
1299
+ (keydown.enter)="activateProblemHeaderFromKeyboard($event, problem, problemIndex)"
1300
+ (keydown.space)="activateProblemHeaderFromKeyboard($event, problem, problemIndex)"
1242
1301
  >
1243
- {{ problem.statistics.accepted }}
1244
- </span>
1302
+ <a
1303
+ *ngIf="problem.link && !hasProblemClickListener(); else unlinkedProblemHeader"
1304
+ [href]="problem.link"
1305
+ target="_blank"
1306
+ rel="noopener noreferrer"
1307
+ style="color: unset"
1308
+ >
1309
+ <span class="srk--display-block">{{ problemAlias(problem, problemIndex) }}</span>
1310
+ <span
1311
+ *ngIf="problem.statistics"
1312
+ class="srk--display-block srk-problem-stats"
1313
+ [title]="problemStatsTitle(problem.statistics)"
1314
+ >
1315
+ {{ problem.statistics.accepted }}
1316
+ </span>
1317
+ </a>
1318
+ <ng-template #unlinkedProblemHeader>
1319
+ <span class="srk--display-block">{{ problemAlias(problem, problemIndex) }}</span>
1320
+ <span
1321
+ *ngIf="problem.statistics"
1322
+ class="srk--display-block srk-problem-stats"
1323
+ [title]="problemStatsTitle(problem.statistics)"
1324
+ >
1325
+ {{ problem.statistics.accepted }}
1326
+ </span>
1327
+ </ng-template>
1328
+ </th>
1245
1329
  </ng-template>
1246
- </th>
1330
+ </ng-container>
1247
1331
  <th *ngIf="showDirtColumn" class="srk-dirt-header srk--text-right srk--nowrap">
1248
1332
  {{ resolveColumnTitle('dirt', 'Dirt') }}
1249
1333
  </th>
@@ -1535,38 +1619,55 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1535
1619
  <th *ngIf="showTimeColumn()" class="srk--text-right srk--nowrap">
1536
1620
  {{ resolveColumnTitle('time', 'Time') }}
1537
1621
  </th>
1538
- <th
1622
+ <ng-container
1539
1623
  *ngFor="let problem of data.problems; let problemIndex = index"
1540
- class="srk--nowrap srk-problem-header"
1541
- [style.background-image]="problemHeaderBackgroundImage(problem)"
1542
1624
  >
1543
- <a
1544
- *ngIf="problem.link; else unlinkedProblemHeader"
1545
- [href]="problem.link"
1546
- target="_blank"
1547
- rel="noopener noreferrer"
1548
- style="color: unset"
1549
- >
1550
- <span class="srk--display-block">{{ problemAlias(problem, problemIndex) }}</span>
1551
- <span
1552
- *ngIf="problem.statistics"
1553
- class="srk--display-block srk-problem-stats"
1554
- [title]="problemStatsTitle(problem.statistics)"
1555
- >
1556
- {{ problem.statistics.accepted }}
1557
- </span>
1558
- </a>
1559
- <ng-template #unlinkedProblemHeader>
1560
- <span class="srk--display-block">{{ problemAlias(problem, problemIndex) }}</span>
1561
- <span
1562
- *ngIf="problem.statistics"
1563
- class="srk--display-block srk-problem-stats"
1564
- [title]="problemStatsTitle(problem.statistics)"
1625
+ <ng-container *ngIf="problemHeaderCellTemplate; else defaultProblemHeader">
1626
+ <ng-container
1627
+ [ngTemplateOutlet]="problemHeaderCellTemplate.templateRef"
1628
+ [ngTemplateOutletContext]="buildProblemHeaderCellContext(problem, problemIndex)"
1629
+ />
1630
+ </ng-container>
1631
+ <ng-template #defaultProblemHeader>
1632
+ <th
1633
+ class="srk--nowrap srk-problem-header"
1634
+ [class.srk--cursor-pointer]="hasProblemClickListener()"
1635
+ [attr.role]="problemHeaderRole()"
1636
+ [attr.tabindex]="problemHeaderTabIndex()"
1637
+ [style.background-image]="problemHeaderBackgroundImage(problem)"
1638
+ (click)="emitProblemClick($event, problem, problemIndex)"
1639
+ (keydown.enter)="activateProblemHeaderFromKeyboard($event, problem, problemIndex)"
1640
+ (keydown.space)="activateProblemHeaderFromKeyboard($event, problem, problemIndex)"
1565
1641
  >
1566
- {{ problem.statistics.accepted }}
1567
- </span>
1642
+ <a
1643
+ *ngIf="problem.link && !hasProblemClickListener(); else unlinkedProblemHeader"
1644
+ [href]="problem.link"
1645
+ target="_blank"
1646
+ rel="noopener noreferrer"
1647
+ style="color: unset"
1648
+ >
1649
+ <span class="srk--display-block">{{ problemAlias(problem, problemIndex) }}</span>
1650
+ <span
1651
+ *ngIf="problem.statistics"
1652
+ class="srk--display-block srk-problem-stats"
1653
+ [title]="problemStatsTitle(problem.statistics)"
1654
+ >
1655
+ {{ problem.statistics.accepted }}
1656
+ </span>
1657
+ </a>
1658
+ <ng-template #unlinkedProblemHeader>
1659
+ <span class="srk--display-block">{{ problemAlias(problem, problemIndex) }}</span>
1660
+ <span
1661
+ *ngIf="problem.statistics"
1662
+ class="srk--display-block srk-problem-stats"
1663
+ [title]="problemStatsTitle(problem.statistics)"
1664
+ >
1665
+ {{ problem.statistics.accepted }}
1666
+ </span>
1667
+ </ng-template>
1668
+ </th>
1568
1669
  </ng-template>
1569
- </th>
1670
+ </ng-container>
1570
1671
  <th *ngIf="showDirtColumn" class="srk-dirt-header srk--text-right srk--nowrap">
1571
1672
  {{ resolveColumnTitle('dirt', 'Dirt') }}
1572
1673
  </th>
@@ -1848,8 +1949,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1848
1949
  type: Input
1849
1950
  }], userClick: [{
1850
1951
  type: Output
1952
+ }], problemClick: [{
1953
+ type: Output
1851
1954
  }], solutionClick: [{
1852
1955
  type: Output
1956
+ }], problemHeaderCellTemplate: [{
1957
+ type: ContentChild,
1958
+ args: [SrkProblemHeaderCellTemplateDirective]
1853
1959
  }], statusCellTemplate: [{
1854
1960
  type: ContentChild,
1855
1961
  args: [SrkStatusCellTemplateDirective]
@@ -1862,5 +1968,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
1862
1968
  * Generated bundle index. Do not edit.
1863
1969
  */
1864
1970
 
1865
- export { DefaultSolutionModalComponent, DefaultUserModalComponent, ModalComponent, ProgressBarComponent, RanklistComponent, SrkStatusCellTemplateDirective, SrkUserCellTemplateDirective };
1971
+ export { DefaultSolutionModalComponent, DefaultUserModalComponent, ModalComponent, ProgressBarComponent, RanklistComponent, SrkProblemHeaderCellTemplateDirective, SrkStatusCellTemplateDirective, SrkUserCellTemplateDirective };
1866
1972
  //# sourceMappingURL=algoux-standard-ranklist-renderer-component-angular.mjs.map