Add optional toggle for Relationship Status Fields (v2.1.2)

- Added relationships.enabled toggle in tracker configuration
- Relationship fields and emoji badges can now be disabled/enabled
- UI toggle added in Edit Trackers > Present Characters tab
- Updated prompt generation to respect the toggle
- Maintains backward compatibility with existing configs
- Added i18n translations (en, zh-tw)
This commit is contained in:
Spicy_Marinara
2026-01-03 00:55:29 +01:00
parent d44bb1cff9
commit c6b71ec1aa
8 changed files with 121 additions and 20 deletions
+6 -2
View File
@@ -355,7 +355,11 @@ export function generateTrackerInstructions(includeHtmlPrompt = true, includeCon
if (extensionSettings.showCharacterThoughts) {
const presentCharsConfig = trackerConfig?.presentCharacters;
const enabledFields = presentCharsConfig?.customFields?.filter(f => f && f.enabled && f.name) || [];
const relationshipFields = presentCharsConfig?.relationshipFields || [];
// Check if relationships are enabled
const relationshipsEnabled = presentCharsConfig?.relationships?.enabled !== false; // Default to true
const relationshipFields = relationshipsEnabled ? (presentCharsConfig?.relationshipFields || []) : [];
const thoughtsConfig = presentCharsConfig?.thoughts;
const characterStats = presentCharsConfig?.characterStats;
const enabledCharStats = characterStats?.enabled && characterStats?.customStats?.filter(s => s && s.enabled && s.name) || [];
@@ -390,7 +394,7 @@ export function generateTrackerInstructions(includeHtmlPrompt = true, includeCon
}
// Relationship line (only if relationships are enabled)
if (relationshipPlaceholders) {
if (relationshipsEnabled && relationshipPlaceholders) {
instructions += `Relationship: [(choose one: ${relationshipPlaceholders})]\n`;
}
+8 -4
View File
@@ -325,8 +325,11 @@ export function renderThoughts() {
const enabledFields = config?.customFields?.filter(f => f && f.enabled && f.name) || [];
const characterStatsConfig = config?.characterStats;
const enabledCharStats = characterStatsConfig?.enabled && characterStatsConfig?.customStats?.filter(s => s && s.enabled && s.name) || [];
const relationshipFields = config?.relationshipFields || [];
const hasRelationshipEnabled = relationshipFields.length > 0;
// Check if relationships are enabled (new structure with fallback to legacy)
const relationshipsEnabled = config?.relationships?.enabled !== false; // Default to true if not set
const relationshipFields = relationshipsEnabled ? (config?.relationshipFields || []) : [];
const hasRelationshipEnabled = relationshipFields.length > 0 && relationshipsEnabled;
// Use committedTrackerData as fallback if lastGeneratedData is empty (e.g., after page refresh)
const characterThoughtsData = lastGeneratedData.characterThoughts || committedTrackerData.characterThoughts || '';
@@ -442,7 +445,8 @@ export function renderThoughts() {
}
// Get relationship emojis from config (with fallback defaults)
const relationshipEmojis = config?.relationshipEmojis || {
// Support both new and legacy structure
const relationshipEmojis = config?.relationships?.relationshipEmojis || config?.relationshipEmojis || {
'Enemy': '⚔️',
'Neutral': '⚖️',
'Friend': '⭐',
@@ -876,7 +880,7 @@ export function updateCharacterField(characterName, field, value) {
}
newCharacterLines.push(`Details: ${detailsParts.join(' | ')}`);
if (presentCharsConfig?.relationshipFields?.length > 0) {
if (presentCharsConfig?.relationships?.enabled !== false && presentCharsConfig?.relationshipFields?.length > 0) {
const emojiToRelationship = { '⚔️': 'Enemy', '⚖️': 'Neutral', '⭐': 'Friend', '❤️': 'Lover' };
const relationshipValue = field === 'Relationship' ? (emojiToRelationship[value] || value) : 'Neutral';
newCharacterLines.push(`Relationship: ${relationshipValue}`);
+76 -11
View File
@@ -170,6 +170,16 @@ function resetToDefaults() {
presentCharacters: {
showEmoji: true,
showName: true,
relationships: {
enabled: true,
relationshipEmojis: {
'Lover': '❤️',
'Friend': '⭐',
'Ally': '🤝',
'Enemy': '⚔️',
'Neutral': '⚖️'
}
},
relationshipFields: ['Lover', 'Friend', 'Ally', 'Enemy', 'Neutral'],
relationshipEmojis: {
'Lover': '❤️',
@@ -645,11 +655,19 @@ function renderPresentCharactersTab() {
// Relationship Fields Section
html += `<h4><i class="fa-solid fa-heart"></i> ${i18n.getTranslation('template.trackerEditorModal.presentCharactersTab.relationshipStatusTitle')}</h4>`;
// Toggle for enabling/disabling relationships
const relationshipsEnabled = config.relationships?.enabled !== false; // Default to true if not set
html += '<div class="rpg-editor-toggle-row">';
html += `<input type="checkbox" id="rpg-relationships-enabled" ${relationshipsEnabled ? 'checked' : ''}>`;
html += `<label for="rpg-relationships-enabled">${i18n.getTranslation('template.trackerEditorModal.presentCharactersTab.enableRelationshipStatus')}</label>`;
html += '</div>';
html += `<p class="rpg-editor-hint">${i18n.getTranslation('template.trackerEditorModal.presentCharactersTab.relationshipStatusHint')}</p>`;
html += '<div class="rpg-relationship-mapping-list" id="rpg-relationship-mapping-list">';
// Show existing relationships as field → emoji pairs
const relationshipEmojis = config.relationshipEmojis || {
const relationshipEmojis = config.relationships?.relationshipEmojis || config.relationshipEmojis || {
'Lover': '❤️',
'Friend': '⭐',
'Ally': '🤝',
@@ -746,16 +764,36 @@ function renderPresentCharactersTab() {
* Set up event listeners for Present Characters tab
*/
function setupPresentCharactersListeners() {
// Relationships enabled toggle
$('#rpg-relationships-enabled').off('change').on('change', function() {
if (!extensionSettings.trackerConfig.presentCharacters.relationships) {
extensionSettings.trackerConfig.presentCharacters.relationships = { enabled: true, relationshipEmojis: {} };
}
extensionSettings.trackerConfig.presentCharacters.relationships.enabled = $(this).is(':checked');
});
// Add new relationship
$('#rpg-add-relationship').off('click').on('click', function() {
// Ensure relationships object exists
if (!extensionSettings.trackerConfig.presentCharacters.relationships) {
extensionSettings.trackerConfig.presentCharacters.relationships = { enabled: true, relationshipEmojis: {} };
}
if (!extensionSettings.trackerConfig.presentCharacters.relationships.relationshipEmojis) {
extensionSettings.trackerConfig.presentCharacters.relationships.relationshipEmojis = {};
}
// Add to new structure
extensionSettings.trackerConfig.presentCharacters.relationships.relationshipEmojis['New Relationship'] = '😊';
// Also update legacy fields for backward compatibility
if (!extensionSettings.trackerConfig.presentCharacters.relationshipEmojis) {
extensionSettings.trackerConfig.presentCharacters.relationshipEmojis = {};
}
extensionSettings.trackerConfig.presentCharacters.relationshipEmojis['New Relationship'] = '😊';
// Sync relationshipFields
extensionSettings.trackerConfig.presentCharacters.relationshipFields =
Object.keys(extensionSettings.trackerConfig.presentCharacters.relationshipEmojis);
const emojis = extensionSettings.trackerConfig.presentCharacters.relationships.relationshipEmojis;
extensionSettings.trackerConfig.presentCharacters.relationshipFields = Object.keys(emojis);
renderPresentCharactersTab();
});
@@ -763,13 +801,20 @@ function setupPresentCharactersListeners() {
// Remove relationship
$('.rpg-remove-relationship').off('click').on('click', function() {
const relationship = $(this).data('relationship');
// Remove from new structure
if (extensionSettings.trackerConfig.presentCharacters.relationships?.relationshipEmojis) {
delete extensionSettings.trackerConfig.presentCharacters.relationships.relationshipEmojis[relationship];
}
// Remove from legacy structure
if (extensionSettings.trackerConfig.presentCharacters.relationshipEmojis) {
delete extensionSettings.trackerConfig.presentCharacters.relationshipEmojis[relationship];
}
// Sync relationshipFields
extensionSettings.trackerConfig.presentCharacters.relationshipFields =
Object.keys(extensionSettings.trackerConfig.presentCharacters.relationshipEmojis);
const emojis = extensionSettings.trackerConfig.presentCharacters.relationships?.relationshipEmojis || {};
extensionSettings.trackerConfig.presentCharacters.relationshipFields = Object.keys(emojis);
renderPresentCharactersTab();
});
@@ -780,28 +825,48 @@ function setupPresentCharactersListeners() {
const $item = $(this).closest('.rpg-relationship-item');
const emoji = $item.find('.rpg-relationship-emoji').val();
// Find the old name by matching the emoji
const oldName = Object.keys(extensionSettings.trackerConfig.presentCharacters.relationshipEmojis).find(
key => extensionSettings.trackerConfig.presentCharacters.relationshipEmojis[key] === emoji &&
key !== newName
// Ensure structures exist
if (!extensionSettings.trackerConfig.presentCharacters.relationships) {
extensionSettings.trackerConfig.presentCharacters.relationships = { enabled: true, relationshipEmojis: {} };
}
if (!extensionSettings.trackerConfig.presentCharacters.relationshipEmojis) {
extensionSettings.trackerConfig.presentCharacters.relationshipEmojis = {};
}
// Find the old name by matching the emoji in new structure
const emojis = extensionSettings.trackerConfig.presentCharacters.relationships.relationshipEmojis;
const oldName = Object.keys(emojis).find(
key => emojis[key] === emoji && key !== newName
);
if (oldName && oldName !== newName) {
// Update new structure
delete emojis[oldName];
emojis[newName] = emoji;
// Update legacy structure
delete extensionSettings.trackerConfig.presentCharacters.relationshipEmojis[oldName];
extensionSettings.trackerConfig.presentCharacters.relationshipEmojis[newName] = emoji;
// Sync relationshipFields
extensionSettings.trackerConfig.presentCharacters.relationshipFields =
Object.keys(extensionSettings.trackerConfig.presentCharacters.relationshipEmojis);
extensionSettings.trackerConfig.presentCharacters.relationshipFields = Object.keys(emojis);
}
});
// Update relationship emoji
$('.rpg-relationship-emoji').off('blur').on('blur', function() {
const name = $(this).closest('.rpg-relationship-item').find('.rpg-relationship-name').val();
// Ensure structures exist
if (!extensionSettings.trackerConfig.presentCharacters.relationships) {
extensionSettings.trackerConfig.presentCharacters.relationships = { enabled: true, relationshipEmojis: {} };
}
if (!extensionSettings.trackerConfig.presentCharacters.relationshipEmojis) {
extensionSettings.trackerConfig.presentCharacters.relationshipEmojis = {};
}
// Update both structures
extensionSettings.trackerConfig.presentCharacters.relationships.relationshipEmojis[name] = $(this).val();
extensionSettings.trackerConfig.presentCharacters.relationshipEmojis[name] = $(this).val();
});