Fixed up updating issue data
This commit is contained in:
parent
31819d7723
commit
3f1212a84f
12 changed files with 3705 additions and 27 deletions
3433
API/Data/Migrations/20250415194829_KavitaPlusCBR.Designer.cs
generated
Normal file
3433
API/Data/Migrations/20250415194829_KavitaPlusCBR.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load diff
106
API/Data/Migrations/20250415194829_KavitaPlusCBR.cs
Normal file
106
API/Data/Migrations/20250415194829_KavitaPlusCBR.cs
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace API.Data.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class KavitaPlusCBR : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "EnableChapterCoverImage",
|
||||
table: "MetadataSettings",
|
||||
type: "INTEGER",
|
||||
nullable: false,
|
||||
defaultValue: false);
|
||||
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "EnableChapterPublisher",
|
||||
table: "MetadataSettings",
|
||||
type: "INTEGER",
|
||||
nullable: false,
|
||||
defaultValue: false);
|
||||
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "EnableChapterReleaseDate",
|
||||
table: "MetadataSettings",
|
||||
type: "INTEGER",
|
||||
nullable: false,
|
||||
defaultValue: false);
|
||||
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "EnableChapterSummary",
|
||||
table: "MetadataSettings",
|
||||
type: "INTEGER",
|
||||
nullable: false,
|
||||
defaultValue: false);
|
||||
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "EnableChapterTitle",
|
||||
table: "MetadataSettings",
|
||||
type: "INTEGER",
|
||||
nullable: false,
|
||||
defaultValue: false);
|
||||
|
||||
migrationBuilder.AddColumn<int>(
|
||||
name: "CbrId",
|
||||
table: "ExternalSeriesMetadata",
|
||||
type: "INTEGER",
|
||||
nullable: false,
|
||||
defaultValue: 0);
|
||||
|
||||
migrationBuilder.AddColumn<bool>(
|
||||
name: "KavitaPlusConnection",
|
||||
table: "ChapterPeople",
|
||||
type: "INTEGER",
|
||||
nullable: false,
|
||||
defaultValue: false);
|
||||
|
||||
migrationBuilder.AddColumn<int>(
|
||||
name: "OrderWeight",
|
||||
table: "ChapterPeople",
|
||||
type: "INTEGER",
|
||||
nullable: false,
|
||||
defaultValue: 0);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropColumn(
|
||||
name: "EnableChapterCoverImage",
|
||||
table: "MetadataSettings");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "EnableChapterPublisher",
|
||||
table: "MetadataSettings");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "EnableChapterReleaseDate",
|
||||
table: "MetadataSettings");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "EnableChapterSummary",
|
||||
table: "MetadataSettings");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "EnableChapterTitle",
|
||||
table: "MetadataSettings");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "CbrId",
|
||||
table: "ExternalSeriesMetadata");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "KavitaPlusConnection",
|
||||
table: "ChapterPeople");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "OrderWeight",
|
||||
table: "ChapterPeople");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -15,7 +15,7 @@ namespace API.Data.Migrations
|
|||
protected override void BuildModel(ModelBuilder modelBuilder)
|
||||
{
|
||||
#pragma warning disable 612, 618
|
||||
modelBuilder.HasAnnotation("ProductVersion", "9.0.3");
|
||||
modelBuilder.HasAnnotation("ProductVersion", "9.0.4");
|
||||
|
||||
modelBuilder.Entity("API.Entities.AppRole", b =>
|
||||
{
|
||||
|
|
@ -1429,6 +1429,9 @@ namespace API.Data.Migrations
|
|||
b.Property<int>("AverageExternalRating")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<int>("CbrId")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<string>("GoogleBooksId")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
|
|
@ -1645,6 +1648,21 @@ namespace API.Data.Migrations
|
|||
b.Property<string>("Blacklist")
|
||||
.HasColumnType("TEXT");
|
||||
|
||||
b.Property<bool>("EnableChapterCoverImage")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("EnableChapterPublisher")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("EnableChapterReleaseDate")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("EnableChapterSummary")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("EnableChapterTitle")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("EnableCoverImage")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("INTEGER")
|
||||
|
|
@ -1707,6 +1725,12 @@ namespace API.Data.Migrations
|
|||
b.Property<int>("Role")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<bool>("KavitaPlusConnection")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.Property<int>("OrderWeight")
|
||||
.HasColumnType("INTEGER");
|
||||
|
||||
b.HasKey("ChapterId", "PersonId", "Role");
|
||||
|
||||
b.HasIndex("PersonId");
|
||||
|
|
|
|||
|
|
@ -306,6 +306,8 @@ public class ChapterRepository : IChapterRepository
|
|||
.Where(c => c.Volume.SeriesId == seriesId)
|
||||
.OrderBy(c => c.SortOrder)
|
||||
.Include(c => c.Volume)
|
||||
.Include(c => c.People)
|
||||
.ThenInclude(cp => cp.Person)
|
||||
.ToListAsync();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -234,4 +234,25 @@ public class Chapter : IEntityDate, IHasReadTimeEstimate, IHasCoverImage
|
|||
PrimaryColor = string.Empty;
|
||||
SecondaryColor = string.Empty;
|
||||
}
|
||||
|
||||
public bool IsPersonRoleLocked(PersonRole role)
|
||||
{
|
||||
return role switch
|
||||
{
|
||||
PersonRole.Character => CharacterLocked,
|
||||
PersonRole.Writer => WriterLocked,
|
||||
PersonRole.Penciller => PencillerLocked,
|
||||
PersonRole.Inker => InkerLocked,
|
||||
PersonRole.Colorist => ColoristLocked,
|
||||
PersonRole.Letterer => LettererLocked,
|
||||
PersonRole.CoverArtist => CoverArtistLocked,
|
||||
PersonRole.Editor => EditorLocked,
|
||||
PersonRole.Publisher => PublisherLocked,
|
||||
PersonRole.Translator => TranslatorLocked,
|
||||
PersonRole.Imprint => ImprintLocked,
|
||||
PersonRole.Team => TeamLocked,
|
||||
PersonRole.Location => LocationLocked,
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(role), role, null)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1199,18 +1199,18 @@ public class ExternalMetadataService : IExternalMetadataService
|
|||
|
||||
if (staff?.Count == 0) return false;
|
||||
|
||||
if (chapter.CoverArtistLocked && !settings.HasOverride(MetadataSettingField.People))
|
||||
if (chapter.IsPersonRoleLocked(role) && !settings.HasOverride(MetadataSettingField.People))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!settings.IsPersonAllowed(role))
|
||||
if (!settings.IsPersonAllowed(role) && role != PersonRole.Publisher)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
chapter.People ??= [];
|
||||
var artists = staff
|
||||
var people = staff!
|
||||
.Select(w => new PersonDto()
|
||||
{
|
||||
Name = w,
|
||||
|
|
@ -1227,7 +1227,7 @@ public class ExternalMetadataService : IExternalMetadataService
|
|||
|
||||
foreach (var person in chapter.People.Where(p => p.Role == role))
|
||||
{
|
||||
var meta = artists.FirstOrDefault(c => c.Name == person.Person.Name);
|
||||
var meta = people.FirstOrDefault(c => c.Name == person.Person.Name);
|
||||
person.OrderWeight = 0;
|
||||
|
||||
if (meta != null)
|
||||
|
|
|
|||
|
|
@ -65,6 +65,12 @@ public class SettingsService : ISettingsService
|
|||
existingMetadataSetting.FirstLastPeopleNaming = dto.FirstLastPeopleNaming;
|
||||
existingMetadataSetting.EnableCoverImage = dto.EnableCoverImage;
|
||||
|
||||
existingMetadataSetting.EnableChapterPublisher = dto.EnableChapterPublisher;
|
||||
existingMetadataSetting.EnableChapterSummary = dto.EnableChapterSummary;
|
||||
existingMetadataSetting.EnableChapterTitle = dto.EnableChapterTitle;
|
||||
existingMetadataSetting.EnableChapterReleaseDate = dto.EnableChapterReleaseDate;
|
||||
existingMetadataSetting.EnableChapterCoverImage = dto.EnableChapterCoverImage;
|
||||
|
||||
existingMetadataSetting.AgeRatingMappings = dto.AgeRatingMappings ?? [];
|
||||
|
||||
existingMetadataSetting.Blacklist = (dto.Blacklist ?? []).Where(s => !string.IsNullOrWhiteSpace(s)).DistinctBy(d => d.ToNormalized()).ToList() ?? [];
|
||||
|
|
|
|||
|
|
@ -977,26 +977,26 @@ public class ProcessSeries : IProcessSeries
|
|||
chapter.ReleaseDate = new DateTime(comicInfo.Year, month, day);
|
||||
}
|
||||
|
||||
if (!chapter.ColoristLocked)
|
||||
if (!chapter.IsPersonRoleLocked(PersonRole.Colorist))
|
||||
{
|
||||
var people = TagHelper.GetTagValues(comicInfo.Colorist);
|
||||
await UpdateChapterPeopleAsync(chapter, people, PersonRole.Colorist);
|
||||
}
|
||||
|
||||
if (!chapter.CharacterLocked)
|
||||
if (!chapter.IsPersonRoleLocked(PersonRole.Character))
|
||||
{
|
||||
var people = TagHelper.GetTagValues(comicInfo.Characters);
|
||||
await UpdateChapterPeopleAsync(chapter, people, PersonRole.Character);
|
||||
}
|
||||
|
||||
|
||||
if (!chapter.TranslatorLocked)
|
||||
if (!chapter.IsPersonRoleLocked(PersonRole.Translator))
|
||||
{
|
||||
var people = TagHelper.GetTagValues(comicInfo.Translator);
|
||||
await UpdateChapterPeopleAsync(chapter, people, PersonRole.Translator);
|
||||
}
|
||||
|
||||
if (!chapter.WriterLocked)
|
||||
if (!chapter.IsPersonRoleLocked(PersonRole.Writer))
|
||||
{
|
||||
var personSw = Stopwatch.StartNew();
|
||||
var people = TagHelper.GetTagValues(comicInfo.Writer);
|
||||
|
|
@ -1004,55 +1004,55 @@ public class ProcessSeries : IProcessSeries
|
|||
_logger.LogTrace("[TIME] Kavita took {Time} ms to process writer on Chapter: {File} for {Count} people", personSw.ElapsedMilliseconds, chapter.Files.First().FileName, people.Count);
|
||||
}
|
||||
|
||||
if (!chapter.EditorLocked)
|
||||
if (!chapter.IsPersonRoleLocked(PersonRole.Editor))
|
||||
{
|
||||
var people = TagHelper.GetTagValues(comicInfo.Editor);
|
||||
await UpdateChapterPeopleAsync(chapter, people, PersonRole.Editor);
|
||||
}
|
||||
|
||||
if (!chapter.InkerLocked)
|
||||
if (!chapter.IsPersonRoleLocked(PersonRole.Inker))
|
||||
{
|
||||
var people = TagHelper.GetTagValues(comicInfo.Inker);
|
||||
await UpdateChapterPeopleAsync(chapter, people, PersonRole.Inker);
|
||||
}
|
||||
|
||||
if (!chapter.LettererLocked)
|
||||
if (!chapter.IsPersonRoleLocked(PersonRole.Letterer))
|
||||
{
|
||||
var people = TagHelper.GetTagValues(comicInfo.Letterer);
|
||||
await UpdateChapterPeopleAsync(chapter, people, PersonRole.Letterer);
|
||||
}
|
||||
|
||||
if (!chapter.PencillerLocked)
|
||||
if (!chapter.IsPersonRoleLocked(PersonRole.Penciller))
|
||||
{
|
||||
var people = TagHelper.GetTagValues(comicInfo.Penciller);
|
||||
await UpdateChapterPeopleAsync(chapter, people, PersonRole.Penciller);
|
||||
}
|
||||
|
||||
if (!chapter.CoverArtistLocked)
|
||||
if (!chapter.IsPersonRoleLocked(PersonRole.CoverArtist))
|
||||
{
|
||||
var people = TagHelper.GetTagValues(comicInfo.CoverArtist);
|
||||
await UpdateChapterPeopleAsync(chapter, people, PersonRole.CoverArtist);
|
||||
}
|
||||
|
||||
if (!chapter.PublisherLocked)
|
||||
if (!chapter.IsPersonRoleLocked(PersonRole.Publisher))
|
||||
{
|
||||
var people = TagHelper.GetTagValues(comicInfo.Publisher);
|
||||
await UpdateChapterPeopleAsync(chapter, people, PersonRole.Publisher);
|
||||
}
|
||||
|
||||
if (!chapter.ImprintLocked)
|
||||
if (!chapter.IsPersonRoleLocked(PersonRole.Imprint))
|
||||
{
|
||||
var people = TagHelper.GetTagValues(comicInfo.Imprint);
|
||||
await UpdateChapterPeopleAsync(chapter, people, PersonRole.Imprint);
|
||||
}
|
||||
|
||||
if (!chapter.TeamLocked)
|
||||
if (!chapter.IsPersonRoleLocked(PersonRole.Team))
|
||||
{
|
||||
var people = TagHelper.GetTagValues(comicInfo.Teams);
|
||||
await UpdateChapterPeopleAsync(chapter, people, PersonRole.Team);
|
||||
}
|
||||
|
||||
if (!chapter.LocationLocked)
|
||||
if (!chapter.IsPersonRoleLocked(PersonRole.Location))
|
||||
{
|
||||
var people = TagHelper.GetTagValues(comicInfo.Locations);
|
||||
await UpdateChapterPeopleAsync(chapter, people, PersonRole.Location);
|
||||
|
|
|
|||
|
|
@ -11,15 +11,15 @@ export class MetadataSettingFiledPipe implements PipeTransform {
|
|||
transform(value: MetadataSettingField): string {
|
||||
switch (value) {
|
||||
case MetadataSettingField.ChapterTitle:
|
||||
return translate('metadata-setting-field-pipe.title');
|
||||
return translate('metadata-setting-field-pipe.chapter-title');
|
||||
case MetadataSettingField.ChapterSummary:
|
||||
return translate('metadata-setting-field-pipe.summary');
|
||||
return translate('metadata-setting-field-pipe.chapter-summary');
|
||||
case MetadataSettingField.ChapterReleaseDate:
|
||||
return translate('metadata-setting-field-pipe.release-date');
|
||||
return translate('metadata-setting-field-pipe.chapter-release-date');
|
||||
case MetadataSettingField.ChapterPublisher:
|
||||
return translate('metadata-setting-field-pipe.publisher');
|
||||
return translate('metadata-setting-field-pipe.chapter-publisher');
|
||||
case MetadataSettingField.ChapterCovers:
|
||||
return translate('metadata-setting-field-pipe.covers');
|
||||
return translate('metadata-setting-field-pipe.chapter-covers');
|
||||
case MetadataSettingField.AgeRating:
|
||||
return translate('metadata-setting-field-pipe.age-rating');
|
||||
case MetadataSettingField.People:
|
||||
|
|
|
|||
|
|
@ -89,6 +89,70 @@
|
|||
}
|
||||
</div>
|
||||
|
||||
<div class="setting-section-break"></div>
|
||||
|
||||
<!-- Chapter-based fields -->
|
||||
<h5>{{t('chapter-header')}}</h5>
|
||||
<div class="row g-0 mt-4 mb-4">
|
||||
@if(settingsForm.get('enableChapterTitle'); as formControl) {
|
||||
<app-setting-switch [title]="t('enable-chapter-title-label')" [subtitle]="t('enable-chapter-title-tooltip')">
|
||||
<ng-template #switch>
|
||||
<div class="form-check form-switch float-end">
|
||||
<input id="enable-chapter-title" type="checkbox" class="form-check-input" formControlName="enableChapterTitle">
|
||||
</div>
|
||||
</ng-template>
|
||||
</app-setting-switch>
|
||||
}
|
||||
</div>
|
||||
|
||||
<div class="row g-0 mt-4 mb-4">
|
||||
@if(settingsForm.get('enableChapterSummary'); as formControl) {
|
||||
<app-setting-switch [title]="t('enable-chapter-summary-label')" [subtitle]="t('enable-chapter-summary-tooltip')">
|
||||
<ng-template #switch>
|
||||
<div class="form-check form-switch float-end">
|
||||
<input id="enable-chapter-summary" type="checkbox" class="form-check-input" formControlName="enableChapterSummary">
|
||||
</div>
|
||||
</ng-template>
|
||||
</app-setting-switch>
|
||||
}
|
||||
</div>
|
||||
|
||||
<div class="row g-0 mt-4 mb-4">
|
||||
@if(settingsForm.get('enableChapterReleaseDate'); as formControl) {
|
||||
<app-setting-switch [title]="t('enable-chapter-release-date-label')" [subtitle]="t('enable-chapter-release-date-tooltip')">
|
||||
<ng-template #switch>
|
||||
<div class="form-check form-switch float-end">
|
||||
<input id="enable-chapter-release-date" type="checkbox" class="form-check-input" formControlName="enableChapterReleaseDate">
|
||||
</div>
|
||||
</ng-template>
|
||||
</app-setting-switch>
|
||||
}
|
||||
</div>
|
||||
|
||||
<div class="row g-0 mt-4 mb-4">
|
||||
@if(settingsForm.get('enableChapterPublisher'); as formControl) {
|
||||
<app-setting-switch [title]="t('enable-chapter-publisher-label')" [subtitle]="t('enable-chapter-publisher-tooltip')">
|
||||
<ng-template #switch>
|
||||
<div class="form-check form-switch float-end">
|
||||
<input id="enable-chapter-publisher" type="checkbox" class="form-check-input" formControlName="enableChapterPublisher">
|
||||
</div>
|
||||
</ng-template>
|
||||
</app-setting-switch>
|
||||
}
|
||||
</div>
|
||||
|
||||
<div class="row g-0 mt-4 mb-4">
|
||||
@if(settingsForm.get('enableChapterCoverImage'); as formControl) {
|
||||
<app-setting-switch [title]="t('enable-chapter-cover-label')" [subtitle]="t('enable-chapter-cover-tooltip')">
|
||||
<ng-template #switch>
|
||||
<div class="form-check form-switch float-end">
|
||||
<input id="enable-chapter-cover" type="checkbox" class="form-check-input" formControlName="enableChapterCoverImage">
|
||||
</div>
|
||||
</ng-template>
|
||||
</app-setting-switch>
|
||||
}
|
||||
</div>
|
||||
|
||||
@if(settingsForm.get('enablePeople'); as formControl) {
|
||||
<div class="setting-section-break"></div>
|
||||
|
||||
|
|
@ -133,6 +197,7 @@
|
|||
|
||||
|
||||
|
||||
|
||||
<div class="setting-section-break"></div>
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -79,6 +79,13 @@ export class ManageMetadataSettingsComponent implements OnInit {
|
|||
this.settingsForm.addControl('enableStartDate', new FormControl(settings.enableStartDate, []));
|
||||
this.settingsForm.addControl('enableCoverImage', new FormControl(settings.enableCoverImage, []));
|
||||
|
||||
|
||||
this.settingsForm.addControl('enableChapterTitle', new FormControl(settings.enableChapterTitle, []));
|
||||
this.settingsForm.addControl('enableChapterSummary', new FormControl(settings.enableChapterSummary, []));
|
||||
this.settingsForm.addControl('enableChapterReleaseDate', new FormControl(settings.enableChapterReleaseDate, []));
|
||||
this.settingsForm.addControl('enableChapterPublisher', new FormControl(settings.enableChapterPublisher, []));
|
||||
this.settingsForm.addControl('enableChapterCoverImage', new FormControl(settings.enableChapterCoverImage, []));
|
||||
|
||||
this.settingsForm.addControl('blacklist', new FormControl((settings.blacklist || '').join(','), []));
|
||||
this.settingsForm.addControl('whitelist', new FormControl((settings.whitelist || '').join(','), []));
|
||||
this.settingsForm.addControl('firstLastPeopleNaming', new FormControl((settings.firstLastPeopleNaming), []));
|
||||
|
|
|
|||
|
|
@ -806,6 +806,17 @@
|
|||
"enable-cover-image-tooltip": "Allow Kavita to write the cover image for the Series",
|
||||
"enable-start-date-label": "Start Date",
|
||||
"enable-start-date-tooltip": "Allow Start Date of Series to be written to the Series",
|
||||
|
||||
"enable-chapter-title-label": "Title",
|
||||
"enable-chapter-title-tooltip": "Allow Title of Chapter/Issue to be written",
|
||||
"enable-chapter-summary-label": "{{manage-metadata-settings.summary-label}}",
|
||||
"enable-chapter-summary-tooltip": "{{manage-metadata-settings.summary-tooltip}}",
|
||||
"enable-chapter-release-date-label": "Release Date",
|
||||
"enable-chapter-release-date-tooltip": "Allow Release Date of Chapter/Issue to be written",
|
||||
"enable-chapter-publisher-label": "Publisher",
|
||||
"enable-chapter-publisher-tooltip": "Allow Publisher of Chapter/Issue to be written",
|
||||
"enable-chapter-cover-label": "Chapter Cover",
|
||||
"enable-chapter-cover-tooltip": "Allow Cover of Chapter/Issue to be set",
|
||||
"enable-genres-label": "Genres",
|
||||
"enable-genres-tooltip": "Allow Series Genres to be written.",
|
||||
"enable-tags-label": "Tags",
|
||||
|
|
@ -827,7 +838,8 @@
|
|||
"first-last-name-tooltip": "Ensure People's names are written First then Last",
|
||||
"person-roles-label": "Roles",
|
||||
"overrides-label": "Overrides",
|
||||
"overrides-description": "Allow Kavita to write over locked fields."
|
||||
"overrides-description": "Allow Kavita to write over locked fields.",
|
||||
"chapter-header": "Chapter Fields"
|
||||
},
|
||||
|
||||
"book-line-overlay": {
|
||||
|
|
@ -2686,9 +2698,11 @@
|
|||
"genres": "{{metadata-fields.genres-title}}",
|
||||
"tags": "{{metadata-fields.tags-title}}",
|
||||
"localized-name": "{{edit-series-modal.localized-name-label}}",
|
||||
"release-date": "Release Date",
|
||||
"publisher": "{{person-role-pipe.publisher}}",
|
||||
"title": "Title"
|
||||
"chapter-release-date": "Release Date (Chapter)",
|
||||
"chapter-summary": "Summary (Chapter)",
|
||||
"chapter-covers": "Covers (Chapter)",
|
||||
"chapter-publisher": "{{person-role-pipe.publisher}} (Chapter)",
|
||||
"chapter-title": "Title (Chapter)"
|
||||
},
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue