Last Batch before Release (#2899)
This commit is contained in:
parent
8d77b398b2
commit
32bedb4e06
32 changed files with 3302 additions and 124 deletions
|
@ -34,7 +34,7 @@
|
|||
<ng-container *ngIf="seriesMetadata.publicationStatus | publicationStatus as pubStatus">
|
||||
<app-icon-and-title [label]="t('publication-status-title')" [clickable]="true" fontClasses="fa-solid fa-hourglass-{{pubStatus === t('ongoing') ? 'empty' : 'end'}}"
|
||||
(click)="handleGoTo(FilterField.PublicationStatus, seriesMetadata.publicationStatus)"
|
||||
[ngbTooltip]="t('publication-status-tooltip') + ' (' + seriesMetadata.maxCount + ' / ' + seriesMetadata.totalCount + ')'">
|
||||
[ngbTooltip]="t('publication-status-tooltip') + (seriesMetadata.totalCount === 0 ? '' : ' (' + seriesMetadata.maxCount + ' / ' + seriesMetadata.totalCount + ')')">
|
||||
{{pubStatus}}
|
||||
</app-icon-and-title>
|
||||
</ng-container>
|
||||
|
|
|
@ -16,7 +16,8 @@
|
|||
</div>
|
||||
|
||||
<div class="mb-3" style="width:100%">
|
||||
<label for="email" class="form-label">{{t('email-label')}}</label> <i class="fa fa-info-circle" placement="right" [ngbTooltip]="emailTooltip" role="button" tabindex="0"></i>
|
||||
<label for="email" class="form-label">{{t('email-label')}}</label>
|
||||
<i class="fa fa-info-circle ms-1" placement="right" [ngbTooltip]="emailTooltip" role="button" tabindex="0"></i>
|
||||
<ng-template #emailTooltip>{{t('email-tooltip')}}</ng-template>
|
||||
<span class="visually-hidden" id="email-help">
|
||||
<ng-container [ngTemplateOutlet]="emailTooltip"></ng-container>
|
||||
|
@ -34,21 +35,24 @@
|
|||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="password" class="form-label">Password</label> <i class="fa fa-info-circle" placement="right" [ngbTooltip]="passwordTooltip" role="button" tabindex="0"></i>
|
||||
<label for="password" class="form-label">Password</label>
|
||||
<i class="fa fa-info-circle ms-1" placement="right" [ngbTooltip]="passwordTooltip" role="button" tabindex="0"></i>
|
||||
<ng-template #passwordTooltip>
|
||||
{{t('password-validation')}}
|
||||
</ng-template>
|
||||
<span class="visually-hidden" id="password-help"><ng-container [ngTemplateOutlet]="passwordTooltip"></ng-container></span>
|
||||
<input id="password" class="form-control" maxlength="32" minlength="6" pattern="^.{6,32}$" formControlName="password" autocomplete="new-password"
|
||||
type="password" aria-describedby="password-help" [class.is-invalid]="registerForm.get('password')?.invalid && registerForm.get('password')?.touched">
|
||||
<div id="password-validations" class="invalid-feedback" *ngIf="registerForm.dirty || registerForm.touched">
|
||||
<div *ngIf="registerForm.get('password')?.errors?.required">
|
||||
{{t('required-field')}}
|
||||
@if (registerForm.dirty || registerForm.touched) {
|
||||
<div id="password-validations" class="invalid-feedback">
|
||||
@if (registerForm.get('password')?.errors?.required) {
|
||||
<div>{{t('required-field')}}</div>
|
||||
}
|
||||
@if (registerForm.get('password')?.errors?.minlength || registerForm.get('password')?.errors?.maxLength || registerForm.get('password')?.errors?.pattern) {
|
||||
<div>{{t('password-validation')}}</div>
|
||||
}
|
||||
</div>
|
||||
<div *ngIf="registerForm.get('password')?.errors?.minlength || registerForm.get('password')?.errors?.maxLength || registerForm.get('password')?.errors?.pattern">
|
||||
{{t('password-validation')}}
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
<div class="float-end">
|
||||
|
|
|
@ -27,7 +27,8 @@ export class RegisterComponent {
|
|||
registerForm: FormGroup = new FormGroup({
|
||||
email: new FormControl('', [Validators.required]),
|
||||
username: new FormControl('', [Validators.required]),
|
||||
password: new FormControl('', [Validators.required, Validators.maxLength(32), Validators.minLength(6), Validators.pattern("^.{6,32}$")]),
|
||||
password: new FormControl('', [Validators.required, Validators.maxLength(32),
|
||||
Validators.minLength(6), Validators.pattern("^.{6,32}$")]),
|
||||
});
|
||||
|
||||
private readonly navService = inject(NavService);
|
||||
|
|
|
@ -382,6 +382,9 @@ export class SeriesDetailComponent implements OnInit, AfterContentChecked {
|
|||
|
||||
// This is a lone chapter
|
||||
if (vol.length === 0) {
|
||||
if (this.currentlyReadingChapter.minNumber === LooseLeafOrDefaultNumber) {
|
||||
return this.currentlyReadingChapter.titleName;
|
||||
}
|
||||
return 'Ch ' + this.currentlyReadingChapter.minNumber; // TODO: Refactor this to use DisplayTitle (or Range) and Localize it
|
||||
}
|
||||
|
||||
|
@ -748,7 +751,11 @@ export class SeriesDetailComponent implements OnInit, AfterContentChecked {
|
|||
} else {
|
||||
if (this.libraryType == LibraryType.Comic || this.libraryType == LibraryType.ComicVine) {
|
||||
if (this.chapters.length === 0) {
|
||||
this.activeTabId = TabID.Specials;
|
||||
if (this.specials.length > 0) {
|
||||
this.activeTabId = TabID.Specials;
|
||||
} else {
|
||||
this.activeTabId = TabID.Volumes;
|
||||
}
|
||||
} else {
|
||||
this.activeTabId = TabID.Chapters;
|
||||
}
|
||||
|
|
|
@ -64,16 +64,26 @@ export class EditListComponent implements OnInit {
|
|||
}
|
||||
|
||||
remove(index: number) {
|
||||
const tokens = this.combinedItems.split(',');
|
||||
const tokenToRemove = tokens[index];
|
||||
|
||||
this.combinedItems = tokens.filter(t => t != tokenToRemove).join(',');
|
||||
for (const [index, [key, value]] of Object.entries(Object.entries(this.form.controls))) {
|
||||
if (key.startsWith('link') && this.form.get(key)?.value === tokenToRemove) {
|
||||
this.form.removeControl('link' + index, {emitEvent: true});
|
||||
}
|
||||
const initialControls = Object.keys(this.form.controls)
|
||||
.filter(key => key.startsWith('link'));
|
||||
|
||||
if (index == 0 && initialControls.length === 1) {
|
||||
this.form.get(initialControls[0])?.setValue('', {emitEvent: true});
|
||||
this.emit();
|
||||
this.cdRef.markForCheck();
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove the form control explicitly then rebuild the combinedItems
|
||||
this.form.removeControl('link' + index, {emitEvent: true});
|
||||
|
||||
this.combinedItems = Object.keys(this.form.controls)
|
||||
.filter(key => key.startsWith('link'))
|
||||
.map(key => this.form.get(key)?.value)
|
||||
.join(',');
|
||||
|
||||
|
||||
this.emit();
|
||||
this.cdRef.markForCheck();
|
||||
}
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
<div>{{t('no-data')}}</div>
|
||||
} @else {
|
||||
<ngb-progressbar-stacked>
|
||||
<ngb-progressbar type="danger" [showValue]="true" [value]="errorPercent" [ngbTooltip]="t('errored-series-label') + ' ' + breakdown.erroredSeries"></ngb-progressbar>
|
||||
<ngb-progressbar type="success" [showValue]="true" [value]="completedPercent" [ngbTooltip]="t('completed-series-label') + ' ' + breakdown.seriesCompleted"></ngb-progressbar>
|
||||
<ngb-progressbar class="progress-bar-danger" type="danger" [showValue]="true" [value]="20" [ngbTooltip]="t('errored-series-label') + ' ' + breakdown.erroredSeries"></ngb-progressbar>
|
||||
<ngb-progressbar type="success" [showValue]="true" [value]="80" [ngbTooltip]="t('completed-series-label') + ' ' + breakdown.seriesCompleted"></ngb-progressbar>
|
||||
</ngb-progressbar-stacked>
|
||||
@if (breakdown.seriesCompleted >= breakdown.totalSeries) {
|
||||
<p>{{t('complete') }}
|
||||
|
|
|
@ -11,8 +11,12 @@
|
|||
}
|
||||
|
||||
.error {
|
||||
color: red;
|
||||
color: var(--error-color);
|
||||
}
|
||||
.completed {
|
||||
color: var(--color-5);
|
||||
}
|
||||
|
||||
.progress-bar-danger.progress-bar {
|
||||
background-color: var(--error-color);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue