Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
2e8b20c
Tree stores expanded state of nodes in local storage
hehoon Dec 13, 2025
f19578d
Add a quick (and hacky) workaround for local storage reset due to non…
hehoon Dec 13, 2025
3f38aaa
Add a test to make sure the local storage is updated upon clicking a …
hehoon Dec 13, 2025
8a0a5a8
Refactor tests
hehoon Dec 15, 2025
c10f0ed
Remove unused imports
hehoon Dec 15, 2025
d370eab
Add keyboard arrow navigation for object tree
crashdance Jan 5, 2026
21e4964
fix: keyboard navigation in object tree
crashdance Jan 5, 2026
ba3675d
chore: remove unused storage key
crashdance Jan 5, 2026
2081fe2
tests: add arrow key navigation tests for object tree
crashdance Jan 6, 2026
f53400e
Merge branch 'dev' into feature/QCG/OGUI-561/browse-object-tree-with-…
crashdance Jan 7, 2026
d087737
fix: merge conflicts objects tree class
crashdance Jan 7, 2026
00a8782
Merge branch 'dev' into feature/QCG/OGUI-561/browse-object-tree-with-…
crashdance Jan 8, 2026
b3b8a90
refactor object tree navigation and cleanup unused code
crashdance Jan 8, 2026
d6f788b
fix: ensure object selection only occurs if focused node is present
crashdance Jan 8, 2026
1fc2232
refactor: remove unused addOneChild method from ObjectTree class
crashdance Jan 8, 2026
4cd1979
tests: add arrow left key navigation test and refactor object tree tests
crashdance Jan 8, 2026
6c52974
refactor: simplify comments for object tree key navigation tests
crashdance Jan 8, 2026
897c29e
feat: keyboard navigation for virtual table when search input is active
crashdance Jan 9, 2026
06aeabf
tests: add tests key navigation object tree page when search is active
crashdance Jan 9, 2026
82302a9
feat: enhance keyboard navigation in search results and move focus to…
crashdance Jan 10, 2026
307137e
tests: refine object tree keyboard navigation tests and added tests f…
crashdance Jan 10, 2026
0875a1b
refactor: simplify search result handling in keyboard navigation
crashdance Jan 11, 2026
fea2a9a
Merge branch 'dev' into feature/QCG/OGUI-561/browse-object-tree-with-…
crashdance Jan 12, 2026
977909b
feat: add indexation to object tree for key navigation and focus-by-p…
crashdance Jan 14, 2026
ddb8c53
feat: implement key codes enumeration
crashdance Jan 14, 2026
a4e8127
feat: scroll into view focused node for object tree key navigation
crashdance Jan 14, 2026
6d9bcf7
feat: prevent default behavior for keyboard navigation in object tree
crashdance Jan 14, 2026
0ceb743
feat: scroll into view focused node for key navigation in virtual table
crashdance Jan 14, 2026
998b41c
feat: update scroll into view for key navigation virtual table
crashdance Jan 14, 2026
ba19168
feat: introduce constants for row heights in UI components and improv…
crashdance Jan 14, 2026
534b210
fix: correct parameter type annotation and fix typo in documentation …
crashdance Jan 14, 2026
ee73f89
chore: remove redundant comments
crashdance Jan 14, 2026
6f9c5df
feat: rename storage keys and update related methods for branch state…
crashdance Jan 14, 2026
e0880f2
refactor: move key navigation to model classes
crashdance Jan 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 15 additions & 4 deletions QualityControl/public/Model.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ import { buildQueryParametersString } from './common/buildQueryParametersString.
import AboutViewModel from './pages/aboutView/AboutViewModel.js';
import LayoutListModel from './pages/layoutListView/model/LayoutListModel.js';
import { RequestFields } from './common/RequestFields.enum.js';
import { KeyCodesEnum } from '../common/enums/keyCodes.enum.js';

import FilterModel from './common/filters/model/FilterModel.js';

/**
Expand Down Expand Up @@ -129,16 +131,25 @@ export default class Model extends Observable {
handleKeyboardDown(e) {
// Console.log(`e.keyCode=${e.keyCode}, e.metaKey=${e.metaKey}, e.ctrlKey=${e.ctrlKey}, e.altKey=${e.altKey}`);
const code = e.keyCode;

// Delete key + layout page + object select => delete this object
if (code === 8 &&
if (code === KeyCodesEnum.DELETE &&
this.router.params.page === 'layoutShow' &&
this.layout.editEnabled &&
this.layout.editingTabObject) {
this.layout.deleteTabObject(this.layout.editingTabObject);
} else if (code === 27 && this.isImportVisible) {
} else if (code === KeyCodesEnum.ESC && this.isImportVisible) {
this.layout.resetImport();
}
if (this.router.params.page === 'objectTree') {
const searchActive = Boolean(this.object.searchInput?.trim());
// Search navigation
if (searchActive) {
this.object.handleKeyboardNavigationSearchResults(code);
} else {
// Tree navigation
this.object.tree.handleKeyboardNavigation(code, (selectedObject) => this.object.select(selectedObject));
}
}
}

/**
Expand Down Expand Up @@ -276,7 +287,7 @@ export default class Model extends Observable {

/**
* Clear URL parameters and redirect to a certain page
* @param {*} pageName - name of the page to be redirected to
* @param {string} pageName - name of the page to be redirected to
* @returns {undefined}
*/
clearURL(pageName) {
Expand Down
2 changes: 2 additions & 0 deletions QualityControl/public/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
.object-selectable { cursor: pointer; text-decoration: none; }
.object-selectable:hover { cursor: pointer; background-color: var(--color-gray-dark) !important; color: var(--color-gray-lighter); }

.focused-node>th, .focused-node>td { background-color: var(--color-gray-dark); color: var(--color-white); }

.layout-selectable { border: 0.0em solid var(--color-primary); transition: border 0.1s; }
.layout-selected { border: 0.3em solid var(--color-primary); }
.layout-edit-layer { cursor: move; opacity: 0; }
Expand Down
16 changes: 16 additions & 0 deletions QualityControl/public/common/constants/ui.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/**
* @license
* Copyright 2019-2020 CERN and copyright holders of ALICE O2.
* See http://alice-o2.web.cern.ch/copyright for details of the copyright holders.
* All rights not expressly granted are reserved.
*
* This software is distributed under the terms of the GNU General Public
* License v3 (GPL Version 3), copied verbatim in the file "COPYING".
*
* 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.
*/

export const OBJECT_LIST_ROW_HEIGHT = 33.6;
export const OBJECT_LIST_SIDE_ROW_HEIGHT = 29.4;
28 changes: 28 additions & 0 deletions QualityControl/public/common/enums/keyCodes.enum.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/**
* @license
* Copyright 2019-2020 CERN and copyright holders of ALICE O2.
* See http://alice-o2.web.cern.ch/copyright for details of the copyright holders.
* All rights not expressly granted are reserved.
*
* This software is distributed under the terms of the GNU General Public
* License v3 (GPL Version 3), copied verbatim in the file "COPYING".
*
* 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.
*/

/**
* Key codes enumeration for keyboard events
* @enum {number}
* @readonly
*/
export const KeyCodesEnum = Object.freeze({
UP: 38,
DOWN: 40,
LEFT: 37,
RIGHT: 39,
ENTER: 13,
DELETE: 8,
ESC: 27,
});
2 changes: 1 addition & 1 deletion QualityControl/public/common/enums/storageKeys.enum.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@
export const StorageKeysEnum = Object.freeze({
OBJECT_VIEW_LEFT_PANEL_WIDTH: 'object-view-left-panel-width',
OBJECT_VIEW_INFO_VISIBILITY_SETTING: 'object-view-info-visibility-setting',
OBJECT_TREE_OPEN_NODES: 'object-tree-open-nodes',
OBJECT_TREE_OPEN_BRANCH_STATE: 'object-tree-open-branch-state',
});
Loading
Loading