From 5578d920f3d9c429785eb13fd3dc17a6965eeb12 Mon Sep 17 00:00:00 2001 From: Isaac Hill <71404865+isaachilly@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:44:10 +0100 Subject: [PATCH 1/6] [O2B-1536] Show lastEditedName for EOR reasons Now display the lastEditedName for EOR reasons on `run-detail` page. `formatEorReason` also renders a tooltip above the `lastEditedName` to make clear who it refers to. --- .../views/Runs/Details/RunDetailsModel.js | 4 ++-- lib/public/views/Runs/Details/RunPatch.js | 7 ++++++- .../views/Runs/Details/runDetailsComponent.js | 5 ++++- .../views/Runs/format/editRunEorReasons.js | 15 +++++++++------ .../views/Runs/format/formatEorReason.mjs | 19 +++++++++++++++---- 5 files changed, 36 insertions(+), 14 deletions(-) diff --git a/lib/public/views/Runs/Details/RunDetailsModel.js b/lib/public/views/Runs/Details/RunDetailsModel.js index e175d38d99..2c35735840 100644 --- a/lib/public/views/Runs/Details/RunDetailsModel.js +++ b/lib/public/views/Runs/Details/RunDetailsModel.js @@ -238,7 +238,7 @@ export class RunDetailsModel extends Observable { * @return {void} */ addNewEorReason() { - const { category, title, description } = this.newEorReason; + const { category, title, description, lastEditedName } = this.newEorReason; const reasonType = this._eorReasonTypes.match({ Success: (eorReasonTypes) => eorReasonTypes .find((eorReasonType) => eorReasonType.category === category && eorReasonType.title === title), @@ -246,7 +246,7 @@ export class RunDetailsModel extends Observable { }); if (reasonType) { - this.runPatch.addEorReason({ reasonTypeId: reasonType.id, description }); + this.runPatch.addEorReason({ reasonTypeId: reasonType.id, description, lastEditedName }); } } diff --git a/lib/public/views/Runs/Details/RunPatch.js b/lib/public/views/Runs/Details/RunPatch.js index 3b000b8223..860a97b7e9 100644 --- a/lib/public/views/Runs/Details/RunPatch.js +++ b/lib/public/views/Runs/Details/RunPatch.js @@ -126,7 +126,12 @@ export class RunPatch extends Observable { } = this._run || {}; this._runQuality = runQuality; - this._eorReasons = eorReasons.map(({ id, description, reasonTypeId }) => ({ id, description, reasonTypeId })); + this._eorReasons = eorReasons.map(({ id, description, reasonTypeId, lastEditedName }) => ({ + id, + description, + reasonTypeId, + lastEditedName, + })); this._tags = tags.map(({ text }) => text); this.formData = { diff --git a/lib/public/views/Runs/Details/runDetailsComponent.js b/lib/public/views/Runs/Details/runDetailsComponent.js index ebb7ae4fe7..fd4d63c0c5 100644 --- a/lib/public/views/Runs/Details/runDetailsComponent.js +++ b/lib/public/views/Runs/Details/runDetailsComponent.js @@ -533,7 +533,10 @@ export const runDetailsComponent = (runDetailsModel, router) => runDetailsModel. h('#eor-reasons.flex-row', [ runDetailsModel.isEditModeEnabled ? editRunEorReasons(runDetailsModel) - : h('.flex-column.g2', run.eorReasons.map((eorReason) => h('.eor-reason', formatEorReason(eorReason)))), + : h( + '.flex-column.g2.w-100', + run.eorReasons.map((eorReason) => h('.eor-reason', formatEorReason(eorReason))), + ), ]), ]), ]), diff --git a/lib/public/views/Runs/format/editRunEorReasons.js b/lib/public/views/Runs/format/editRunEorReasons.js index 56c69e6f04..05fcfe7ae7 100644 --- a/lib/public/views/Runs/format/editRunEorReasons.js +++ b/lib/public/views/Runs/format/editRunEorReasons.js @@ -94,20 +94,23 @@ export const editRunEorReasons = (runDetailsModel) => { */ runDetailsModel.runPatch.eorReasons.length > 0 ? runDetailsModel.runPatch.eorReasons.map((eorReason) => { - const { reasonTypeId, description } = eorReason; + const { reasonTypeId, description, lastEditedName } = eorReason; const { category = '-', title } = eorReasonTypes.find((eorReasonType) => eorReasonType.id === reasonTypeId) || {}; const titleString = title ? ` - ${title}` : ''; const descriptionString = description ? ` - ${description}` : ''; return h( - '.flex-row.items-center', + '.flex-row.justify-between', { key: `${category} ${titleString} ${descriptionString}`, }, [ - h('label.remove-eor-reason.danger.ph1.actionable-icon', { - onclick: () => runDetailsModel.runPatch.removeEorReason(eorReason), - }, iconTrash()), - h('.w-wrapped', `${category} ${titleString} ${descriptionString}`), + h('.flex-row.items-center', [ + h('label.remove-eor-reason.danger.ph1.actionable-icon', { + onclick: () => runDetailsModel.runPatch.removeEorReason(eorReason), + }, iconTrash()), + h('.w-wrapped', `${category} ${titleString} ${descriptionString}`), + ]), + h('.w-wrapped', `${lastEditedName}`), ], ); }) diff --git a/lib/public/views/Runs/format/formatEorReason.mjs b/lib/public/views/Runs/format/formatEorReason.mjs index 2cca2ba47a..65a55f1320 100644 --- a/lib/public/views/Runs/format/formatEorReason.mjs +++ b/lib/public/views/Runs/format/formatEorReason.mjs @@ -11,14 +11,25 @@ * or submit itself to any jurisdiction. */ +import { h } from '/js/src/index.js'; +import { tooltip } from '../../../../components/common/popover/tooltip.js'; + /** * Format the given EoR reason to string * - * @param {Partial<{category: string, title: string, description: string}>} eorReason the EoR reason to - * format + * @param {Partial<{ + * category: string, + * title: string, + * description: string, + * lastEditedName: string, + * }>} eorReason the EoR reason to format * @return {string} the result */ export const formatEorReason = (eorReason) => { - const { category, title, description } = eorReason; - return [category, title, description].filter((item) => item).join(' - '); + const { category, title, description, lastEditedName } = eorReason; + const reasonText = [category, title, description].filter((item) => item).join(' - '); + return h('.w-100.flex-row.justify-between', [ + h('', reasonText), + tooltip(h('.w-wrapped', `${lastEditedName}`), 'Last edited by'), + ]); }; From f522ff6b30f3b95e42cc52878f3f534d9afd09a8 Mon Sep 17 00:00:00 2001 From: Isaac Hill <71404865+isaachilly@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:45:29 +0100 Subject: [PATCH 2/6] [O2B-1536] Update tests to expect 'Anonymous' author Adjust expectations to include displayed author 'Anonymous' on a new line. --- test/public/runs/detail.test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/public/runs/detail.test.js b/test/public/runs/detail.test.js index fa94143746..c4d13cffbd 100644 --- a/test/public/runs/detail.test.js +++ b/test/public/runs/detail.test.js @@ -208,10 +208,10 @@ module.exports = () => { expect(eorReasons).to.lengthOf(2); expect(await eorReasons[0].evaluate((element) => element.innerText)) - .to.equal('DETECTORS - TPC - Some Reason other than selected plus one'); + .to.equal('DETECTORS - TPC - Some Reason other than selected plus one\nAnonymous'); expect(await eorReasons[1].evaluate((element) => element.innerText)) - .to.equal('DETECTORS - CPV - A new EOR reason'); + .to.equal('DETECTORS - CPV - A new EOR reason\nAnonymous'); }); it('should successfully revert the update end of run reasons', async () => { @@ -234,10 +234,10 @@ module.exports = () => { expect(eorReasons).to.lengthOf(2); expect(await eorReasons[0].evaluate((element) => element.innerText)) - .to.equal('DETECTORS - TPC - Some Reason other than selected plus one'); + .to.equal('DETECTORS - TPC - Some Reason other than selected plus one\nAnonymous'); expect(await eorReasons[1].evaluate((element) => element.innerText)) - .to.equal('DETECTORS - CPV - A new EOR reason'); + .to.equal('DETECTORS - CPV - A new EOR reason\nAnonymous'); }); it('should successfully update inelasticInteractionRate values of PbPb run', async () => { From dc9949708634a490780adb1b9b988e9eb19c0bd8 Mon Sep 17 00:00:00 2001 From: Isaac Hill <71404865+isaachilly@users.noreply.github.com> Date: Thu, 26 Feb 2026 16:26:01 +0100 Subject: [PATCH 3/6] [O2B-1536] Drop lastEditedName in addNewEorReason --- lib/public/views/Runs/Details/RunDetailsModel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/public/views/Runs/Details/RunDetailsModel.js b/lib/public/views/Runs/Details/RunDetailsModel.js index 2c35735840..e175d38d99 100644 --- a/lib/public/views/Runs/Details/RunDetailsModel.js +++ b/lib/public/views/Runs/Details/RunDetailsModel.js @@ -238,7 +238,7 @@ export class RunDetailsModel extends Observable { * @return {void} */ addNewEorReason() { - const { category, title, description, lastEditedName } = this.newEorReason; + const { category, title, description } = this.newEorReason; const reasonType = this._eorReasonTypes.match({ Success: (eorReasonTypes) => eorReasonTypes .find((eorReasonType) => eorReasonType.category === category && eorReasonType.title === title), @@ -246,7 +246,7 @@ export class RunDetailsModel extends Observable { }); if (reasonType) { - this.runPatch.addEorReason({ reasonTypeId: reasonType.id, description, lastEditedName }); + this.runPatch.addEorReason({ reasonTypeId: reasonType.id, description }); } } From eaa49185963c96f14a3112dbcd3907f4ede8dc63 Mon Sep 17 00:00:00 2001 From: Isaac Hill <71404865+isaachilly@users.noreply.github.com> Date: Thu, 26 Feb 2026 16:58:36 +0100 Subject: [PATCH 4/6] [O2B-1532] Extract eorReasonComponent and revert formatter Add a dedicated eorReasonComponent that renders the EOR reason VDOM. --- .../views/Runs/Details/runDetailsComponent.js | 4 +-- .../views/Runs/format/eorReasonComponent.js | 36 +++++++++++++++++++ .../views/Runs/format/formatEorReason.mjs | 19 +++------- 3 files changed, 42 insertions(+), 17 deletions(-) create mode 100644 lib/public/views/Runs/format/eorReasonComponent.js diff --git a/lib/public/views/Runs/Details/runDetailsComponent.js b/lib/public/views/Runs/Details/runDetailsComponent.js index fd4d63c0c5..a609e0a828 100644 --- a/lib/public/views/Runs/Details/runDetailsComponent.js +++ b/lib/public/views/Runs/Details/runDetailsComponent.js @@ -40,7 +40,7 @@ import { RunDefinition } from '../../../domain/enums/RunDefinition.js'; import { formatFloat } from '../../../utilities/formatting/formatFloat.js'; import { formatEditableNumber } from '../format/formatEditableNumber.js'; import { editRunEorReasons } from '../format/editRunEorReasons.js'; -import { formatEorReason } from '../format/formatEorReason.mjs'; +import { eorReasonComponent } from '../format/eorReasonComponent.js'; import { selectionDropdown } from '../../../components/common/selection/dropdown/selectionDropdown.js'; import { formatRunCalibrationStatus } from '../format/formatRunCalibrationStatus.js'; import { BeamModes } from '../../../domain/enums/BeamModes.js'; @@ -535,7 +535,7 @@ export const runDetailsComponent = (runDetailsModel, router) => runDetailsModel. ? editRunEorReasons(runDetailsModel) : h( '.flex-column.g2.w-100', - run.eorReasons.map((eorReason) => h('.eor-reason', formatEorReason(eorReason))), + run.eorReasons.map((eorReason) => h('.eor-reason', eorReasonComponent(eorReason))), ), ]), ]), diff --git a/lib/public/views/Runs/format/eorReasonComponent.js b/lib/public/views/Runs/format/eorReasonComponent.js new file mode 100644 index 0000000000..f164cf1c3c --- /dev/null +++ b/lib/public/views/Runs/format/eorReasonComponent.js @@ -0,0 +1,36 @@ +/** + * @license + * Copyright CERN and copyright holders of ALICE O2. This software is + * distributed under the terms of the GNU General Public License v3 (GPL + * Version 3), copied verbatim in the file "COPYING". + * + * See http://alice-o2.web.cern.ch/license for full licensing information. + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +import { h } from '/js/src/index.js'; +import { tooltip } from '../../../../components/common/popover/tooltip.js'; +import { formatEorReason } from './formatEorReason.mjs'; + +/** + * Display the given EoR reason as a vdom component with lastEditedName tooltip + * + * @param {Partial<{ + * category: string, + * title: string, + * description: string, + * lastEditedName: string, + * }>} eorReason the EoR reason to display + * @return {Component} the vdom component + */ +export const eorReasonComponent = (eorReason) => { + const { lastEditedName } = eorReason; + const reasonText = formatEorReason(eorReason); + return h('.w-100.flex-row.justify-between', [ + h('', reasonText), + tooltip(h('.w-wrapped', `${lastEditedName}`), 'Last edited by'), + ]); +}; diff --git a/lib/public/views/Runs/format/formatEorReason.mjs b/lib/public/views/Runs/format/formatEorReason.mjs index 65a55f1320..2cca2ba47a 100644 --- a/lib/public/views/Runs/format/formatEorReason.mjs +++ b/lib/public/views/Runs/format/formatEorReason.mjs @@ -11,25 +11,14 @@ * or submit itself to any jurisdiction. */ -import { h } from '/js/src/index.js'; -import { tooltip } from '../../../../components/common/popover/tooltip.js'; - /** * Format the given EoR reason to string * - * @param {Partial<{ - * category: string, - * title: string, - * description: string, - * lastEditedName: string, - * }>} eorReason the EoR reason to format + * @param {Partial<{category: string, title: string, description: string}>} eorReason the EoR reason to + * format * @return {string} the result */ export const formatEorReason = (eorReason) => { - const { category, title, description, lastEditedName } = eorReason; - const reasonText = [category, title, description].filter((item) => item).join(' - '); - return h('.w-100.flex-row.justify-between', [ - h('', reasonText), - tooltip(h('.w-wrapped', `${lastEditedName}`), 'Last edited by'), - ]); + const { category, title, description } = eorReason; + return [category, title, description].filter((item) => item).join(' - '); }; From cfb984b4fe5b639c19dfbfd9cfcebf73218c5cab Mon Sep 17 00:00:00 2001 From: Isaac Hill <71404865+isaachilly@users.noreply.github.com> Date: Thu, 26 Feb 2026 17:50:14 +0100 Subject: [PATCH 5/6] [O2B-1536] Keep EOR lastEditedName out of patch; preserve for UI --- lib/public/views/Runs/Details/RunDetailsModel.js | 11 +++++++++++ lib/public/views/Runs/Details/RunPatch.js | 3 +-- lib/public/views/Runs/format/editRunEorReasons.js | 7 ++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/public/views/Runs/Details/RunDetailsModel.js b/lib/public/views/Runs/Details/RunDetailsModel.js index e175d38d99..267a1699a8 100644 --- a/lib/public/views/Runs/Details/RunDetailsModel.js +++ b/lib/public/views/Runs/Details/RunDetailsModel.js @@ -53,6 +53,7 @@ export class RunDetailsModel extends Observable { this.editionTagPickerModel = new TagSelectionDropdownModel(); this._runPatch = new RunPatch(); this._runPatch.bubbleTo(this); + this._eorReasonLastEditedNames = []; this._tabbedPanelModel = new RunDetailsTabbedPanelModel(); this._tabbedPanelModel.bubbleTo(this); @@ -278,6 +279,14 @@ export class RunDetailsModel extends Observable { return this._runPatch; } + /** + * Returns the list of last edited names for EOR reasons, to be displayed in the edit form so as not to get added to patch + * @return {string[]} the list of last edited names for EOR reasons + */ + get eorReasonLastEditedNames() { + return this._eorReasonLastEditedNames; + } + /** * Returns the model for bottom-page tabs * @@ -301,6 +310,8 @@ export class RunDetailsModel extends Observable { this._runPatch = new RunPatch(run); this._runPatch.bubbleTo(this); + this._eorReasonLastEditedNames = (run.eorReasons || []).map((eorReason) => eorReason.lastEditedName ?? null); + this.editionTagPickerModel = new TagSelectionDropdownModel({ defaultSelection: run.tags.map(tagToOption) }); this._tabbedPanelModel.runNumber = run.runNumber; this._runNumber = run.runNumber; diff --git a/lib/public/views/Runs/Details/RunPatch.js b/lib/public/views/Runs/Details/RunPatch.js index 860a97b7e9..83181224e5 100644 --- a/lib/public/views/Runs/Details/RunPatch.js +++ b/lib/public/views/Runs/Details/RunPatch.js @@ -126,11 +126,10 @@ export class RunPatch extends Observable { } = this._run || {}; this._runQuality = runQuality; - this._eorReasons = eorReasons.map(({ id, description, reasonTypeId, lastEditedName }) => ({ + this._eorReasons = eorReasons.map(({ id, description, reasonTypeId }) => ({ id, description, reasonTypeId, - lastEditedName, })); this._tags = tags.map(({ text }) => text); diff --git a/lib/public/views/Runs/format/editRunEorReasons.js b/lib/public/views/Runs/format/editRunEorReasons.js index 05fcfe7ae7..42677e710e 100644 --- a/lib/public/views/Runs/format/editRunEorReasons.js +++ b/lib/public/views/Runs/format/editRunEorReasons.js @@ -93,8 +93,9 @@ export const editRunEorReasons = (runDetailsModel) => { * added EOR reason is still displayed */ runDetailsModel.runPatch.eorReasons.length > 0 - ? runDetailsModel.runPatch.eorReasons.map((eorReason) => { - const { reasonTypeId, description, lastEditedName } = eorReason; + ? runDetailsModel.runPatch.eorReasons.map((eorReason, index) => { + const { reasonTypeId, description } = eorReason; + const lastEditedName = runDetailsModel.eorReasonLastEditedNames[index]; const { category = '-', title } = eorReasonTypes.find((eorReasonType) => eorReasonType.id === reasonTypeId) || {}; const titleString = title ? ` - ${title}` : ''; const descriptionString = description ? ` - ${description}` : ''; @@ -110,7 +111,7 @@ export const editRunEorReasons = (runDetailsModel) => { }, iconTrash()), h('.w-wrapped', `${category} ${titleString} ${descriptionString}`), ]), - h('.w-wrapped', `${lastEditedName}`), + h('.w-wrapped', `${lastEditedName ? `${lastEditedName}` : ''}`), ], ); }) From 0afb0e01a7469aff9890ea01bf0fd5ee5cbc6cad Mon Sep 17 00:00:00 2001 From: Isaac Hill <71404865+isaachilly@users.noreply.github.com> Date: Thu, 26 Feb 2026 21:43:12 +0100 Subject: [PATCH 6/6] [O2B-1536] Pass EOR lastEditedName through RunPatch Stop keeping a separate `eorReasonLastEditedNames` list on RunDetailsModel and instead include `lastEditedName` on each eorReason within RunPatch. RunPatch `toPojo` then strips that field when building the outbound patch. This removes duplicate state and ensures only allowed fields are sent to the server. --- lib/public/views/Runs/Details/RunDetailsModel.js | 12 ------------ lib/public/views/Runs/Details/RunPatch.js | 7 +++++-- lib/public/views/Runs/format/editRunEorReasons.js | 7 +++---- lib/public/views/Runs/format/eorReasonComponent.js | 2 +- 4 files changed, 9 insertions(+), 19 deletions(-) diff --git a/lib/public/views/Runs/Details/RunDetailsModel.js b/lib/public/views/Runs/Details/RunDetailsModel.js index 267a1699a8..0efc1acc5a 100644 --- a/lib/public/views/Runs/Details/RunDetailsModel.js +++ b/lib/public/views/Runs/Details/RunDetailsModel.js @@ -53,8 +53,6 @@ export class RunDetailsModel extends Observable { this.editionTagPickerModel = new TagSelectionDropdownModel(); this._runPatch = new RunPatch(); this._runPatch.bubbleTo(this); - this._eorReasonLastEditedNames = []; - this._tabbedPanelModel = new RunDetailsTabbedPanelModel(); this._tabbedPanelModel.bubbleTo(this); @@ -279,14 +277,6 @@ export class RunDetailsModel extends Observable { return this._runPatch; } - /** - * Returns the list of last edited names for EOR reasons, to be displayed in the edit form so as not to get added to patch - * @return {string[]} the list of last edited names for EOR reasons - */ - get eorReasonLastEditedNames() { - return this._eorReasonLastEditedNames; - } - /** * Returns the model for bottom-page tabs * @@ -310,8 +300,6 @@ export class RunDetailsModel extends Observable { this._runPatch = new RunPatch(run); this._runPatch.bubbleTo(this); - this._eorReasonLastEditedNames = (run.eorReasons || []).map((eorReason) => eorReason.lastEditedName ?? null); - this.editionTagPickerModel = new TagSelectionDropdownModel({ defaultSelection: run.tags.map(tagToOption) }); this._tabbedPanelModel.runNumber = run.runNumber; this._runNumber = run.runNumber; diff --git a/lib/public/views/Runs/Details/RunPatch.js b/lib/public/views/Runs/Details/RunPatch.js index 83181224e5..54f7e347c6 100644 --- a/lib/public/views/Runs/Details/RunPatch.js +++ b/lib/public/views/Runs/Details/RunPatch.js @@ -9,6 +9,7 @@ import { RunQualities } from '../../../domain/enums/RunQualities.js'; * @property {string} category * @property {string} title * @property {string} description + * @property {string|null} [lastEditedName] */ /** @@ -75,7 +76,8 @@ export class RunPatch extends Observable { } if (this._eorReasons.length !== this._run.eorReasons.length || this._eorReasons.some(({ id }) => id === undefined)) { - ret.eorReasons = this._eorReasons; + // Strip lastEditedName — the server's EorReasonDto only accepts id, reasonTypeId, and description + ret.eorReasons = this._eorReasons.map(({ id, reasonTypeId, description }) => ({ id, reasonTypeId, description })); } if (this._hasRunQualityChange()) { @@ -126,10 +128,11 @@ export class RunPatch extends Observable { } = this._run || {}; this._runQuality = runQuality; - this._eorReasons = eorReasons.map(({ id, description, reasonTypeId }) => ({ + this._eorReasons = eorReasons.map(({ id, description, reasonTypeId, lastEditedName }) => ({ id, description, reasonTypeId, + lastEditedName, })); this._tags = tags.map(({ text }) => text); diff --git a/lib/public/views/Runs/format/editRunEorReasons.js b/lib/public/views/Runs/format/editRunEorReasons.js index 42677e710e..3f6577d316 100644 --- a/lib/public/views/Runs/format/editRunEorReasons.js +++ b/lib/public/views/Runs/format/editRunEorReasons.js @@ -93,9 +93,8 @@ export const editRunEorReasons = (runDetailsModel) => { * added EOR reason is still displayed */ runDetailsModel.runPatch.eorReasons.length > 0 - ? runDetailsModel.runPatch.eorReasons.map((eorReason, index) => { - const { reasonTypeId, description } = eorReason; - const lastEditedName = runDetailsModel.eorReasonLastEditedNames[index]; + ? runDetailsModel.runPatch.eorReasons.map((eorReason) => { + const { reasonTypeId, description, lastEditedName } = eorReason; const { category = '-', title } = eorReasonTypes.find((eorReasonType) => eorReasonType.id === reasonTypeId) || {}; const titleString = title ? ` - ${title}` : ''; const descriptionString = description ? ` - ${description}` : ''; @@ -111,7 +110,7 @@ export const editRunEorReasons = (runDetailsModel) => { }, iconTrash()), h('.w-wrapped', `${category} ${titleString} ${descriptionString}`), ]), - h('.w-wrapped', `${lastEditedName ? `${lastEditedName}` : ''}`), + h('.w-wrapped', lastEditedName || ''), ], ); }) diff --git a/lib/public/views/Runs/format/eorReasonComponent.js b/lib/public/views/Runs/format/eorReasonComponent.js index f164cf1c3c..def2e73354 100644 --- a/lib/public/views/Runs/format/eorReasonComponent.js +++ b/lib/public/views/Runs/format/eorReasonComponent.js @@ -31,6 +31,6 @@ export const eorReasonComponent = (eorReason) => { const reasonText = formatEorReason(eorReason); return h('.w-100.flex-row.justify-between', [ h('', reasonText), - tooltip(h('.w-wrapped', `${lastEditedName}`), 'Last edited by'), + lastEditedName ? tooltip(h('.w-wrapped', lastEditedName), 'Last edited by') : '', ]); };