@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.
- package/README.md +11 -0
- package/dist/README.md +11 -0
- package/dist/esm2022/lib/index.mjs +2 -1
- package/dist/esm2022/lib/ranklist/problem-header-cell-template.directive.mjs +18 -0
- package/dist/esm2022/lib/ranklist/ranklist.component.mjs +149 -58
- package/dist/esm2022/lib/types.mjs +1 -1
- package/dist/fesm2022/algoux-standard-ranklist-renderer-component-angular.mjs +164 -58
- package/dist/fesm2022/algoux-standard-ranklist-renderer-component-angular.mjs.map +1 -1
- package/dist/lib/index.d.ts +2 -1
- package/dist/lib/ranklist/problem-header-cell-template.directive.d.ts +20 -0
- package/dist/lib/ranklist/ranklist.component.d.ts +11 -2
- package/dist/lib/types.d.ts +1 -1
- package/package.json +2 -2
|
@@ -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
|
-
<
|
|
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
|
-
<
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
>
|
|
1227
|
-
<
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
[
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
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
|
-
|
|
1244
|
-
|
|
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
|
-
</
|
|
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
|
-
<
|
|
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
|
-
<
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
>
|
|
1550
|
-
<
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
[
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
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
|
-
|
|
1567
|
-
|
|
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
|
-
</
|
|
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
|