in packages/webhook-triggers-app/src/workflows/workflow-field-changes.js [153:212]
function collectChangedFields(issue) {
const changedFields = [];
// Check built-in properties (summary, description) first
const builtInProperties = ['summary', 'description'];
for (let i = 0; i < builtInProperties.length; i++) {
const propName = builtInProperties[i];
const change = checkBuiltInPropertyChange(issue, propName);
if (change) {
changedFields.push(change);
}
}
// Check custom fields
if (!issue.fields) {
return changedFields;
}
// Get all field names, filtering out methods
const allKeys = Object.keys(issue.fields);
const fieldNames = allKeys.filter(function (key) {
const value = issue.fields[key];
return typeof value !== 'function';
});
// Check each field for changes using YouTrack API
for (let i = 0; i < fieldNames.length; i++) {
const fieldName = fieldNames[i];
const currentValue = issue.fields[fieldName];
try {
// YouTrack API: issue.fields.isChanged(fieldName) where fieldName is a STRING
let fieldWasChanged = false;
if (typeof issue.fields.isChanged === 'function') {
fieldWasChanged = issue.fields.isChanged(fieldName);
}
if (!fieldWasChanged) {
continue;
}
// Get old value using YouTrack API (returns null if the field was previously empty)
const oldValue = issue.fields.oldValue(fieldName);
const oldValueSerialized = serializeFieldValue(oldValue);
const currentValueSerialized = serializeFieldValue(currentValue);
changedFields.push({
name: fieldName,
oldValue: oldValueSerialized,
value: currentValueSerialized
});
} catch {
// Silently skip fields that don't support change tracking
}
}
return changedFields;
}