diff --git a/containers/libreportal/frontend/components/apps/core/js/apps-grid.js b/containers/libreportal/frontend/components/apps/core/js/apps-grid.js index 88c3cd0..d0d063a 100644 --- a/containers/libreportal/frontend/components/apps/core/js/apps-grid.js +++ b/containers/libreportal/frontend/components/apps/core/js/apps-grid.js @@ -378,11 +378,23 @@ Object.assign(AppsManager.prototype, { + `(${shown}${unprefixed.length > 4 ? `, +${unprefixed.length - 4} more` : ''}) ` + `— those names cannot be made unique per instance`); } - const short = bits.length ? 'Not available' : 'Not enabled'; + // Three states, not two. An app with a blocker cannot be instanced; an app + // with the flag explicitly false was reviewed and deliberately left off + // (a singleton by role — the resolver clients point at, the auth provider + // every router points at, the scanner the updater resolves by a fixed + // container name); an app with no flag at all has simply never been + // looked at. Collapsing the middle case into the last one reports a + // decision as an oversight. + const decided = typeCfg[`CFG_${U(type)}_MULTI_INSTANCE`] !== undefined; + const short = bits.length ? 'Not available' : (decided ? 'Not offered' : 'Not enabled'); const tip = bits.length ? `${typeTitleEarly} ${bits.join('; and ')}.` - : `${typeTitleEarly} has no technical blocker — it simply has not been opted in. ` - + `Set CFG_${U(type)}_MULTI_INSTANCE=true on a reviewed app to allow it.`; + : decided + ? `${typeTitleEarly} could run as multiple instances, but is deliberately kept to one — ` + + `it is infrastructure the rest of the box points at. See the note above ` + + `CFG_${U(type)}_MULTI_INSTANCE in its config for the specific reason.` + : `${typeTitleEarly} has no technical blocker — it simply has not been opted in. ` + + `Set CFG_${U(type)}_MULTI_INSTANCE=true on a reviewed app to allow it.`; return `