Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | 1x 2x 1x 1x 1x 1x 1x 1x 1x 1x 2x 1x 2x 1x 1x 2x 2x 2x 1x 1x 1x 1x 2x 1x 1x 1x 1x 1x 1x | <div class="row">
<form class="form" [formGroup]="adminForm">
<span><!-- Title --></span>
<h2 i18n>Install Mods</h2>
<span><!-- Description --></span>
<p i18n>
Quickly turn on and off mods bundled with this client.
Visit the <a routerLink="../plugin">plugins</a> or
<a routerLink="../template">templates</a> settings page to manage all
plugins and templates.
</p>
<span><!-- Buttons --></span>
<span class="buttons right">
@if (store.view.modUpdates.size) {
<button type="button" (click)="updateAll()" i18n>��️ Update All</button>
}
@if (selectAllToggle) {
<button type="button" (click)="selectAll()" i18n>Select None</button>
} @else {
<button type="button" (click)="selectAll()" i18n>Select All</button>
}
<button type="button" (click)="install()" [disabled]="submitted && !adminForm.valid" i18n>Save</button>
</span>
@if (serverError.length || installMessages.length) {
<span class="mobile-block"><!-- Log --></span>
<div class="log mobile-block">
@for (e of serverError; track e) {
<div class="error">{{ e }}</div>
}
@for (i of installMessages; track $index) {
<div>{{ i }}</div>
}
</div>
}
@for (group of modGroups | keyvalue; track group.key) {
<label [style.text-transform]="'capitalize'" i18n>{{ group.key }}</label>
<div formGroupName="mods" class="bubble">
@for (e of group.value; track e[0]) {
@let key = e[0];
@let c = e[1];
@if (experiments || !c.config?.experimental || installed(c)) {
<div [title]="c.config?.description || ''" class="mod-row nowrap" [class.deleted]="disabled(c)">
<input id="mod-{{ modLabel(e) }}" type="checkbox" [formControlName]="key">
<label for="mod-{{ modLabel(e) }}" [title]="c.config?.description || ''">{{ c.config?.mod || c.name || c.tag || 'root' }}@if (hasCustomChanges(c)) {<span class="modified-indicator">*</span>}</label>
@if (c.config?.experimental) {
<span>��️</span>
}
@if (needsModUpdate(c) || canDiffMod(c)) {
<span class="update">
@if (needsModUpdate(c)) {
<span class="fake-link no-select mod-update-link" (click)="updateMod(c)" i18n>��️ update</span>
}
@if (canDiffMod(c)) {
<span class="fake-link no-select mod-diff-link" (click)="diffMod(c)" i18n>�� diff</span>
}
</span>
}
</div>
}
}
</div>
}
</form>
@if (serverError.length || installMessages.length) {
<span class="log mobile-hide">
@for (e of serverError; track $index) {
<div class="error">{{ e }}</div>
}
@for (i of installMessages; track $index) {
<div>{{ i }}</div>
}
</span>
}
</div>
<ng-template #mergePopup>
<div class="merge-popup">
<div class="merge-popup-header">
<label class="merge-title">{{ mergeState!.mod }}</label>
</div>
@if (mergeState!.conflict) {
<div class="warning merge-warning" i18n>Unable to merge automatically. Review the mod diff or overwrite your local changes.</div>
} @else {
<div class="warning merge-warning" i18n>Review the merged mod before saving or overwrite your local changes.</div>
}
<app-diff #mergeDiff
class="mod-merge-diff"
[original]="mergeState!.diffBase"
[modified]="mergeState!.proposed"
[fullHeight]="true"
[resizable]="false">
</app-diff>
<span><!-- Buttons --></span>
<span class="buttons right merge-buttons">
@if (mergeSaving) {
<app-loading [inline]="true"></app-loading>
}
<button type="button" [disabled]="mergeSaving" (click)="applyMerge(mergeDiff.getModifiedContent())" i18n>save</button>
<button type="button" [disabled]="mergeSaving" (click)="cancelMerge()" i18n>cancel</button>
</span>
</div>
</ng-template>
|