Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 5 additions & 3 deletions API.md
Original file line number Diff line number Diff line change
Expand Up @@ -486,9 +486,11 @@ an `active` flag plus slider thresholds or selected categories.
> Grammar, for reference only: a property path `section::subGroup::property`
> followed by exactly one condition — `BETWEEN <low> AND <high>`,
> `LOWER THAN <a> OR GREATER THAN <b>` (always two-sided — there is **no**
> standalone `LOWER THAN`), or `IN [value1, value2]` — with clauses combined by
> `AND` / `OR` / `NOT` and grouped in parentheses. There are no `<`, `>`, or `=`
> operators.
> standalone `LOWER THAN`), `IN [value1, value2]`, or the unary `IS MISSING`
> (true when the property is absent/empty or belongs to the other element type;
> emitted automatically by the filter panel's non-strict AND join) — with
> clauses combined by `AND` / `OR` / `NOT` and grouped in parentheses. There are
> no `<`, `>`, or `=` operators.

---

Expand Down
2 changes: 1 addition & 1 deletion ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ Business logic and UI:
- `io.js` — `IOManager`: Excel/JSON loading, export (JSON / PNG / SVG), data
preprocessing, Excel template generation
- `ui.js` — loading overlays, UI enable/disable, notifications
- `query.js` — query DSL with an AST (AND/OR/NOT, BETWEEN, IN, comparisons)
- `query.js` — query DSL with an AST (AND/OR/NOT, BETWEEN, IN, IS MISSING, comparisons)
- `ui_components.js` — filter UI (dropdown checklists, invertible range sliders), tooltips
- `ui_style_div.js` — the styling panel (node/edge styles, badges, edge flow, density heatmap)
- `metrics.js` — `NetworkMetrics`: degree/betweenness/closeness/eigenvector centrality, PageRank
Expand Down
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Changelog

## 1.15.4 — 2026-07-01

Saved graph files load unchanged; older files default the two new per-view settings to the previous behavior (OR, non-strict).

### Features

* **OR / AND filter combination.** The filter panel (under ⚙ Details) can now combine active filters with **AND** as well as the default **OR**. AND counts only the filters you have actually narrowed, so switching modes while everything is at its default leaves the graph unchanged instead of emptying it. A **Complete cases only** option additionally hides elements that are missing any of those filters (evaluated per element type). The join mode and complete-cases flag are saved per workspace view in exported JSON.
* Added an `IS MISSING` query-DSL operator — true when a property is absent/empty or belongs to the other element type — used to express the non-strict AND join. The query-editor help, guided tour, and API grammar reference now document it.

## 1.15.1 — 2026-06-17

Saved graph files load unchanged — this release is bug fixes only.
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "graph-lens-lite",
"version": "1.15.3",
"version": "1.15.4",
"main": "src/package/electron_app.js",
"description": "Visualise and explore property graphs in a lightweight desktop app.",
"homepage": "https://github.com/Delta4AI/GraphLensLite",
Expand Down
2 changes: 1 addition & 1 deletion src/config.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* Defaults for the graph, layouts and UI
*/
const VERSION = "1.15.3";
const VERSION = "1.15.4";

const DEFAULTS = {
NODE: {
Expand Down
4 changes: 4 additions & 0 deletions src/graph/layout.js
Original file line number Diff line number Diff line change
Expand Up @@ -706,6 +706,10 @@ class GraphLayoutManager {
filters: structuredClone(this.cache.data.filterDefaults),
isCustom: true, // All layouts are position-based
query: undefined,
// How active filters combine (see updateQueryTextArea) and whether AND
// requires complete cases. Persisted per view via the workspace JSON.
filterJoinMode: 'OR',
filterStrict: false,
hideDisconnectedNodes: false,
// Per-view styles
nodeStyles: new Map(),
Expand Down
4 changes: 4 additions & 0 deletions src/managers/io.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* global ExcelJS */ // loaded as a global via vendored src/lib/exceljs.min.js script tag
import { DEFAULTS, CFG, VERSION } from '../config.js';

Check warning on line 2 in src/managers/io.js

View workflow job for this annotation

GitHub Actions / Unit tests

'CFG' is defined but never used
import { StaticUtilities } from '../utilities/static.js';
import { buildDataTable } from '../utilities/data_editor.js';

Check warning on line 4 in src/managers/io.js

View workflow job for this annotation

GitHub Actions / Unit tests

'buildDataTable' is defined but never used
import { EXPORT_SCALES } from '../utilities/export_scale.js';
Expand Down Expand Up @@ -1423,7 +1423,7 @@
const filtersMap = new Map(Object.entries(layout.filters));

// Restore Sets within each filter value
for (const [propId, filterValue] of filtersMap.entries()) {

Check warning on line 1426 in src/managers/io.js

View workflow job for this annotation

GitHub Actions / Unit tests

'propId' is assigned a value but never used
if (filterValue.categories && Array.isArray(filterValue.categories)) {
filterValue.categories = new Set(filterValue.categories);
}
Expand Down Expand Up @@ -1467,7 +1467,7 @@
const filterDefaultsMap = new Map(Object.entries(jsonContent.filterDefaults));

// Restore Sets within each filter default value
for (const [propId, filterValue] of filterDefaultsMap.entries()) {

Check warning on line 1470 in src/managers/io.js

View workflow job for this annotation

GitHub Actions / Unit tests

'propId' is assigned a value but never used
if (filterValue.categories && Array.isArray(filterValue.categories)) {
filterValue.categories = new Set(filterValue.categories);
}
Expand Down Expand Up @@ -2417,6 +2417,10 @@
filters: this.parseFiltersAsMap(layout.filters),
isCustom: layout.isCustom || false,
query: layout['query'] || undefined,
// Per-view filter-join settings; default for pre-1.15.4 files that
// predate them (OR / non-strict = the historical behavior).
filterJoinMode: layout.filterJoinMode === 'AND' ? 'AND' : 'OR',
filterStrict: layout.filterStrict === true,
// Per-view styles - check if already Maps
hideDisconnectedNodes: layout.hideDisconnectedNodes || false,
nodeStyles:
Expand Down
Loading
Loading