Repository files navigation

mod-notes

Copyright (C) 2017-2026 The Open Library Foundation

License

This software is distributed under the terms of the Apache License, Version 2.0. See the file "LICENSE" for more information.

Significantly different licenses

The runtime ships with some third-party libraries with restrictions significantly different from those of the Apache License, see the following list. Build time libraries (compile only, or test only) are out of scope.

See FOLIO's license policy in the Module Acceptance Criteria.

LibraryLicenseProject URL
jakarta.annotation:jakarta.annotation-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
jakarta.transaction:jakarta.transaction-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
javax.xml.bind:jaxb-apiCDDL 1.1 or GPL2 w/ CPEhttps://github.com/javaee/jaxb-spec
org.aspectj:aspectjweaverEclipse Public License - v 2.0https://eclipse.dev/aspectj/
org.eclipse.sisu:org.eclipse.sisu.plexusEclipse Public License 1.0https://www.eclipse.org/sisu/
org.liquibase:liquibase-coreFSL-1.1-ALv2https://github.com/liquibase/liquibase
org.z3950.zing:cql-javaLGPL-2.1-onlyhttps://www.indexdata.com/resources/software/cql-java/

Introduction

Notes on all types of objects.

The notes module implements a simple CRUD interface where users can post notes, small comment texts that refer to other objects in the system, for example users or items.

API

See API Guide

Permissions

The module declares the usual permission bits for the CRUD operations, but it also makes use of the DesiredPermissions feature, using one wildcard pattern 'notes.domains.*' for all endpoints. The idea is that each UI module that makes use of notes, will have to decide on a name for its domain (for example 'items') and use that on all notes they operate on. They should also define a permission set that includes the 'notes.domains.items' permission in some permission set, and enable that for the users who will have access to the permissions on that domain, together with the CRUD permissions telling what kind of operations the user is allowed to perform.

There is also an overall permission 'notes.domains.all' that grants permission to all possible domains.

The way this is designed, the notes module does not need to know or care about which domains we end up having in the system. Unfortunately it requires mod-permissions to support wildcards in the DesiredPermissions, which it does not quite do yet.

Installing and deployment

Compiling

Compile with

mvn clean install

Running it

Run locally on listening port 8081 (default listening port):

Using Docker to run the local stand-alone instance:

DB_HOST=localhost DB_PORT=5432 DB_DATABASE=okapi_modules DB_USERNAME=folio_admin DB_PASSWORD=folio_admin \
java -Dserver.port=8081 -jar target/mod-notes-*.jar

Docker

Build the docker container with:

docker build -t dev.folio/mod-notes .

ModuleDescriptor

See the built target/ModuleDescriptor.json for the interfaces that this module requires and provides, the permissions, and the additional module metadata.

Environment variables

Use DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD to configure the PostgreSQL database.

Use KAFKA_HOST (default localhost) and KAFKA_PORT (default 9092) to configure the Kafka broker the module publishes domain events to. ENV (default folio) is the environment prefix used when building the tenant-scoped topic name {ENV}.{tenant}.notes.note.

NOTES_TYPES_DEFAULTS_LIMIT defaults to 25.

MAX_RECORDS_COUNT defaults to 1000.

Additional information

Other documentation

Other modules are described, with further FOLIO Developer documentation at dev.folio.org

Issue tracker

See project MODNOTES at the FOLIO issue tracker.

API documentation

This module's API documentation.

Code analysis

SonarQube analysis.

Download and configuration

The built artifacts for this module are available. See configuration for repository access, and the Docker image.

About

Notes on all types of objects

Resources

Contributing

Stars

1 star

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

mod-notes

Copyright (C) 2017-2026 The Open Library Foundation

License

This software is distributed under the terms of the Apache License, Version 2.0. See the file "LICENSE" for more information.

Significantly different licenses

The runtime ships with some third-party libraries with restrictions significantly different from those of the Apache License, see the following list. Build time libraries (compile only, or test only) are out of scope.

See FOLIO's license policy in the Module Acceptance Criteria.

LibraryLicenseProject URL
jakarta.annotation:jakarta.annotation-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
jakarta.transaction:jakarta.transaction-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
javax.xml.bind:jaxb-apiCDDL 1.1 or GPL2 w/ CPEhttps://github.com/javaee/jaxb-spec
org.aspectj:aspectjweaverEclipse Public License - v 2.0https://eclipse.dev/aspectj/
org.eclipse.sisu:org.eclipse.sisu.plexusEclipse Public License 1.0https://www.eclipse.org/sisu/
org.liquibase:liquibase-coreFSL-1.1-ALv2https://github.com/liquibase/liquibase
org.z3950.zing:cql-javaLGPL-2.1-onlyhttps://www.indexdata.com/resources/software/cql-java/

Introduction

Notes on all types of objects.

The notes module implements a simple CRUD interface where users can post notes, small comment texts that refer to other objects in the system, for example users or items.

API

See API Guide

Permissions

The module declares the usual permission bits for the CRUD operations, but it also makes use of the DesiredPermissions feature, using one wildcard pattern 'notes.domains.*' for all endpoints. The idea is that each UI module that makes use of notes, will have to decide on a name for its domain (for example 'items') and use that on all notes they operate on. They should also define a permission set that includes the 'notes.domains.items' permission in some permission set, and enable that for the users who will have access to the permissions on that domain, together with the CRUD permissions telling what kind of operations the user is allowed to perform.

There is also an overall permission 'notes.domains.all' that grants permission to all possible domains.

The way this is designed, the notes module does not need to know or care about which domains we end up having in the system. Unfortunately it requires mod-permissions to support wildcards in the DesiredPermissions, which it does not quite do yet.

Installing and deployment

Compiling

Compile with

mvn clean install

Running it

Run locally on listening port 8081 (default listening port):

Using Docker to run the local stand-alone instance:

DB_HOST=localhost DB_PORT=5432 DB_DATABASE=okapi_modules DB_USERNAME=folio_admin DB_PASSWORD=folio_admin \
java -Dserver.port=8081 -jar target/mod-notes-*.jar

Docker

Build the docker container with:

docker build -t dev.folio/mod-notes .

ModuleDescriptor

See the built target/ModuleDescriptor.json for the interfaces that this module requires and provides, the permissions, and the additional module metadata.

Environment variables

Use DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD to configure the PostgreSQL database.

Use KAFKA_HOST (default localhost) and KAFKA_PORT (default 9092) to configure the Kafka broker the module publishes domain events to. ENV (default folio) is the environment prefix used when building the tenant-scoped topic name {ENV}.{tenant}.notes.note.

NOTES_TYPES_DEFAULTS_LIMIT defaults to 25.

MAX_RECORDS_COUNT defaults to 1000.

Additional information

Other documentation

Other modules are described, with further FOLIO Developer documentation at dev.folio.org

Issue tracker

See project MODNOTES at the FOLIO issue tracker.

API documentation

This module's API documentation.

Code analysis

SonarQube analysis.

Download and configuration

The built artifacts for this module are available. See configuration for repository access, and the Docker image.

About

Notes on all types of objects

Resources

Contributing

Stars

1 star

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

mod-notes

Copyright (C) 2017-2026 The Open Library Foundation

License

This software is distributed under the terms of the Apache License, Version 2.0. See the file "LICENSE" for more information.

Significantly different licenses

The runtime ships with some third-party libraries with restrictions significantly different from those of the Apache License, see the following list. Build time libraries (compile only, or test only) are out of scope.

See FOLIO's license policy in the Module Acceptance Criteria.

LibraryLicenseProject URL
jakarta.annotation:jakarta.annotation-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
jakarta.transaction:jakarta.transaction-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
javax.xml.bind:jaxb-apiCDDL 1.1 or GPL2 w/ CPEhttps://github.com/javaee/jaxb-spec
org.aspectj:aspectjweaverEclipse Public License - v 2.0https://eclipse.dev/aspectj/
org.eclipse.sisu:org.eclipse.sisu.plexusEclipse Public License 1.0https://www.eclipse.org/sisu/
org.liquibase:liquibase-coreFSL-1.1-ALv2https://github.com/liquibase/liquibase
org.z3950.zing:cql-javaLGPL-2.1-onlyhttps://www.indexdata.com/resources/software/cql-java/

Introduction

Notes on all types of objects.

The notes module implements a simple CRUD interface where users can post notes, small comment texts that refer to other objects in the system, for example users or items.

API

See API Guide

Permissions

The module declares the usual permission bits for the CRUD operations, but it also makes use of the DesiredPermissions feature, using one wildcard pattern 'notes.domains.*' for all endpoints. The idea is that each UI module that makes use of notes, will have to decide on a name for its domain (for example 'items') and use that on all notes they operate on. They should also define a permission set that includes the 'notes.domains.items' permission in some permission set, and enable that for the users who will have access to the permissions on that domain, together with the CRUD permissions telling what kind of operations the user is allowed to perform.

There is also an overall permission 'notes.domains.all' that grants permission to all possible domains.

The way this is designed, the notes module does not need to know or care about which domains we end up having in the system. Unfortunately it requires mod-permissions to support wildcards in the DesiredPermissions, which it does not quite do yet.

Installing and deployment

Compiling

Compile with

mvn clean install

Running it

Run locally on listening port 8081 (default listening port):

Using Docker to run the local stand-alone instance:

DB_HOST=localhost DB_PORT=5432 DB_DATABASE=okapi_modules DB_USERNAME=folio_admin DB_PASSWORD=folio_admin \
java -Dserver.port=8081 -jar target/mod-notes-*.jar

Docker

Build the docker container with:

docker build -t dev.folio/mod-notes .

ModuleDescriptor

See the built target/ModuleDescriptor.json for the interfaces that this module requires and provides, the permissions, and the additional module metadata.

Environment variables

Use DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD to configure the PostgreSQL database.

Use KAFKA_HOST (default localhost) and KAFKA_PORT (default 9092) to configure the Kafka broker the module publishes domain events to. ENV (default folio) is the environment prefix used when building the tenant-scoped topic name {ENV}.{tenant}.notes.note.

NOTES_TYPES_DEFAULTS_LIMIT defaults to 25.

MAX_RECORDS_COUNT defaults to 1000.

Additional information

Other documentation

Other modules are described, with further FOLIO Developer documentation at dev.folio.org

Issue tracker

See project MODNOTES at the FOLIO issue tracker.

API documentation

This module's API documentation.

Code analysis

SonarQube analysis.

Download and configuration

The built artifacts for this module are available. See configuration for repository access, and the Docker image.

About

Notes on all types of objects

Resources

Contributing

Stars

1 star

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

mod-notes

Copyright (C) 2017-2026 The Open Library Foundation

License

This software is distributed under the terms of the Apache License, Version 2.0. See the file "LICENSE" for more information.

Significantly different licenses

The runtime ships with some third-party libraries with restrictions significantly different from those of the Apache License, see the following list. Build time libraries (compile only, or test only) are out of scope.

See FOLIO's license policy in the Module Acceptance Criteria.

LibraryLicenseProject URL
jakarta.annotation:jakarta.annotation-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
jakarta.transaction:jakarta.transaction-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
javax.xml.bind:jaxb-apiCDDL 1.1 or GPL2 w/ CPEhttps://github.com/javaee/jaxb-spec
org.aspectj:aspectjweaverEclipse Public License - v 2.0https://eclipse.dev/aspectj/
org.eclipse.sisu:org.eclipse.sisu.plexusEclipse Public License 1.0https://www.eclipse.org/sisu/
org.liquibase:liquibase-coreFSL-1.1-ALv2https://github.com/liquibase/liquibase
org.z3950.zing:cql-javaLGPL-2.1-onlyhttps://www.indexdata.com/resources/software/cql-java/

Introduction

Notes on all types of objects.

The notes module implements a simple CRUD interface where users can post notes, small comment texts that refer to other objects in the system, for example users or items.

API

See API Guide

Permissions

The module declares the usual permission bits for the CRUD operations, but it also makes use of the DesiredPermissions feature, using one wildcard pattern 'notes.domains.*' for all endpoints. The idea is that each UI module that makes use of notes, will have to decide on a name for its domain (for example 'items') and use that on all notes they operate on. They should also define a permission set that includes the 'notes.domains.items' permission in some permission set, and enable that for the users who will have access to the permissions on that domain, together with the CRUD permissions telling what kind of operations the user is allowed to perform.

There is also an overall permission 'notes.domains.all' that grants permission to all possible domains.

The way this is designed, the notes module does not need to know or care about which domains we end up having in the system. Unfortunately it requires mod-permissions to support wildcards in the DesiredPermissions, which it does not quite do yet.

Installing and deployment

Compiling

Compile with

mvn clean install

Running it

Run locally on listening port 8081 (default listening port):

Using Docker to run the local stand-alone instance:

DB_HOST=localhost DB_PORT=5432 DB_DATABASE=okapi_modules DB_USERNAME=folio_admin DB_PASSWORD=folio_admin \
java -Dserver.port=8081 -jar target/mod-notes-*.jar

Docker

Build the docker container with:

docker build -t dev.folio/mod-notes .

ModuleDescriptor

See the built target/ModuleDescriptor.json for the interfaces that this module requires and provides, the permissions, and the additional module metadata.

Environment variables

Use DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD to configure the PostgreSQL database.

Use KAFKA_HOST (default localhost) and KAFKA_PORT (default 9092) to configure the Kafka broker the module publishes domain events to. ENV (default folio) is the environment prefix used when building the tenant-scoped topic name {ENV}.{tenant}.notes.note.

NOTES_TYPES_DEFAULTS_LIMIT defaults to 25.

MAX_RECORDS_COUNT defaults to 1000.

Additional information

Other documentation

Other modules are described, with further FOLIO Developer documentation at dev.folio.org

Issue tracker

See project MODNOTES at the FOLIO issue tracker.

API documentation

This module's API documentation.

Code analysis

SonarQube analysis.

Download and configuration

The built artifacts for this module are available. See configuration for repository access, and the Docker image.

About

Notes on all types of objects

Resources

Contributing

Stars

1 star

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

mod-notes

Copyright (C) 2017-2026 The Open Library Foundation

License

This software is distributed under the terms of the Apache License, Version 2.0. See the file "LICENSE" for more information.

Significantly different licenses

The runtime ships with some third-party libraries with restrictions significantly different from those of the Apache License, see the following list. Build time libraries (compile only, or test only) are out of scope.

See FOLIO's license policy in the Module Acceptance Criteria.

LibraryLicenseProject URL
jakarta.annotation:jakarta.annotation-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
jakarta.transaction:jakarta.transaction-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
javax.xml.bind:jaxb-apiCDDL 1.1 or GPL2 w/ CPEhttps://github.com/javaee/jaxb-spec
org.aspectj:aspectjweaverEclipse Public License - v 2.0https://eclipse.dev/aspectj/
org.eclipse.sisu:org.eclipse.sisu.plexusEclipse Public License 1.0https://www.eclipse.org/sisu/
org.liquibase:liquibase-coreFSL-1.1-ALv2https://github.com/liquibase/liquibase
org.z3950.zing:cql-javaLGPL-2.1-onlyhttps://www.indexdata.com/resources/software/cql-java/

Introduction

Notes on all types of objects.

The notes module implements a simple CRUD interface where users can post notes, small comment texts that refer to other objects in the system, for example users or items.

API

See API Guide

Permissions

The module declares the usual permission bits for the CRUD operations, but it also makes use of the DesiredPermissions feature, using one wildcard pattern 'notes.domains.*' for all endpoints. The idea is that each UI module that makes use of notes, will have to decide on a name for its domain (for example 'items') and use that on all notes they operate on. They should also define a permission set that includes the 'notes.domains.items' permission in some permission set, and enable that for the users who will have access to the permissions on that domain, together with the CRUD permissions telling what kind of operations the user is allowed to perform.

There is also an overall permission 'notes.domains.all' that grants permission to all possible domains.

The way this is designed, the notes module does not need to know or care about which domains we end up having in the system. Unfortunately it requires mod-permissions to support wildcards in the DesiredPermissions, which it does not quite do yet.

Installing and deployment

Compiling

Compile with

mvn clean install

Running it

Run locally on listening port 8081 (default listening port):

Using Docker to run the local stand-alone instance:

DB_HOST=localhost DB_PORT=5432 DB_DATABASE=okapi_modules DB_USERNAME=folio_admin DB_PASSWORD=folio_admin \
java -Dserver.port=8081 -jar target/mod-notes-*.jar

Docker

Build the docker container with:

docker build -t dev.folio/mod-notes .

ModuleDescriptor

See the built target/ModuleDescriptor.json for the interfaces that this module requires and provides, the permissions, and the additional module metadata.

Environment variables

Use DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD to configure the PostgreSQL database.

Use KAFKA_HOST (default localhost) and KAFKA_PORT (default 9092) to configure the Kafka broker the module publishes domain events to. ENV (default folio) is the environment prefix used when building the tenant-scoped topic name {ENV}.{tenant}.notes.note.

NOTES_TYPES_DEFAULTS_LIMIT defaults to 25.

MAX_RECORDS_COUNT defaults to 1000.

Additional information

Other documentation

Other modules are described, with further FOLIO Developer documentation at dev.folio.org

Issue tracker

See project MODNOTES at the FOLIO issue tracker.

API documentation

This module's API documentation.

Code analysis

SonarQube analysis.

Download and configuration

The built artifacts for this module are available. See configuration for repository access, and the Docker image.

About

Notes on all types of objects

Resources

Contributing

Stars

1 star

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

mod-notes

Copyright (C) 2017-2026 The Open Library Foundation

License

This software is distributed under the terms of the Apache License, Version 2.0. See the file "LICENSE" for more information.

Significantly different licenses

The runtime ships with some third-party libraries with restrictions significantly different from those of the Apache License, see the following list. Build time libraries (compile only, or test only) are out of scope.

See FOLIO's license policy in the Module Acceptance Criteria.

LibraryLicenseProject URL
jakarta.annotation:jakarta.annotation-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
jakarta.transaction:jakarta.transaction-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
javax.xml.bind:jaxb-apiCDDL 1.1 or GPL2 w/ CPEhttps://github.com/javaee/jaxb-spec
org.aspectj:aspectjweaverEclipse Public License - v 2.0https://eclipse.dev/aspectj/
org.eclipse.sisu:org.eclipse.sisu.plexusEclipse Public License 1.0https://www.eclipse.org/sisu/
org.liquibase:liquibase-coreFSL-1.1-ALv2https://github.com/liquibase/liquibase
org.z3950.zing:cql-javaLGPL-2.1-onlyhttps://www.indexdata.com/resources/software/cql-java/

Introduction

Notes on all types of objects.

The notes module implements a simple CRUD interface where users can post notes, small comment texts that refer to other objects in the system, for example users or items.

API

See API Guide

Permissions

The module declares the usual permission bits for the CRUD operations, but it also makes use of the DesiredPermissions feature, using one wildcard pattern 'notes.domains.*' for all endpoints. The idea is that each UI module that makes use of notes, will have to decide on a name for its domain (for example 'items') and use that on all notes they operate on. They should also define a permission set that includes the 'notes.domains.items' permission in some permission set, and enable that for the users who will have access to the permissions on that domain, together with the CRUD permissions telling what kind of operations the user is allowed to perform.

There is also an overall permission 'notes.domains.all' that grants permission to all possible domains.

The way this is designed, the notes module does not need to know or care about which domains we end up having in the system. Unfortunately it requires mod-permissions to support wildcards in the DesiredPermissions, which it does not quite do yet.

Installing and deployment

Compiling

Compile with

mvn clean install

Running it

Run locally on listening port 8081 (default listening port):

Using Docker to run the local stand-alone instance:

DB_HOST=localhost DB_PORT=5432 DB_DATABASE=okapi_modules DB_USERNAME=folio_admin DB_PASSWORD=folio_admin \
java -Dserver.port=8081 -jar target/mod-notes-*.jar

Docker

Build the docker container with:

docker build -t dev.folio/mod-notes .

ModuleDescriptor

See the built target/ModuleDescriptor.json for the interfaces that this module requires and provides, the permissions, and the additional module metadata.

Environment variables

Use DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD to configure the PostgreSQL database.

Use KAFKA_HOST (default localhost) and KAFKA_PORT (default 9092) to configure the Kafka broker the module publishes domain events to. ENV (default folio) is the environment prefix used when building the tenant-scoped topic name {ENV}.{tenant}.notes.note.

NOTES_TYPES_DEFAULTS_LIMIT defaults to 25.

MAX_RECORDS_COUNT defaults to 1000.

Additional information

Other documentation

Other modules are described, with further FOLIO Developer documentation at dev.folio.org

Issue tracker

See project MODNOTES at the FOLIO issue tracker.

API documentation

This module's API documentation.

Code analysis

SonarQube analysis.

Download and configuration

The built artifacts for this module are available. See configuration for repository access, and the Docker image.

About

Notes on all types of objects

Resources

Contributing

Stars

1 star

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

mod-notes

Copyright (C) 2017-2026 The Open Library Foundation

License

This software is distributed under the terms of the Apache License, Version 2.0. See the file "LICENSE" for more information.

Significantly different licenses

The runtime ships with some third-party libraries with restrictions significantly different from those of the Apache License, see the following list. Build time libraries (compile only, or test only) are out of scope.

See FOLIO's license policy in the Module Acceptance Criteria.

LibraryLicenseProject URL
jakarta.annotation:jakarta.annotation-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
jakarta.transaction:jakarta.transaction-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
javax.xml.bind:jaxb-apiCDDL 1.1 or GPL2 w/ CPEhttps://github.com/javaee/jaxb-spec
org.aspectj:aspectjweaverEclipse Public License - v 2.0https://eclipse.dev/aspectj/
org.eclipse.sisu:org.eclipse.sisu.plexusEclipse Public License 1.0https://www.eclipse.org/sisu/
org.liquibase:liquibase-coreFSL-1.1-ALv2https://github.com/liquibase/liquibase
org.z3950.zing:cql-javaLGPL-2.1-onlyhttps://www.indexdata.com/resources/software/cql-java/

Introduction

Notes on all types of objects.

The notes module implements a simple CRUD interface where users can post notes, small comment texts that refer to other objects in the system, for example users or items.

API

See API Guide

Permissions

The module declares the usual permission bits for the CRUD operations, but it also makes use of the DesiredPermissions feature, using one wildcard pattern 'notes.domains.*' for all endpoints. The idea is that each UI module that makes use of notes, will have to decide on a name for its domain (for example 'items') and use that on all notes they operate on. They should also define a permission set that includes the 'notes.domains.items' permission in some permission set, and enable that for the users who will have access to the permissions on that domain, together with the CRUD permissions telling what kind of operations the user is allowed to perform.

There is also an overall permission 'notes.domains.all' that grants permission to all possible domains.

The way this is designed, the notes module does not need to know or care about which domains we end up having in the system. Unfortunately it requires mod-permissions to support wildcards in the DesiredPermissions, which it does not quite do yet.

Installing and deployment

Compiling

Compile with

mvn clean install

Running it

Run locally on listening port 8081 (default listening port):

Using Docker to run the local stand-alone instance:

DB_HOST=localhost DB_PORT=5432 DB_DATABASE=okapi_modules DB_USERNAME=folio_admin DB_PASSWORD=folio_admin \
java -Dserver.port=8081 -jar target/mod-notes-*.jar

Docker

Build the docker container with:

docker build -t dev.folio/mod-notes .

ModuleDescriptor

See the built target/ModuleDescriptor.json for the interfaces that this module requires and provides, the permissions, and the additional module metadata.

Environment variables

Use DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD to configure the PostgreSQL database.

Use KAFKA_HOST (default localhost) and KAFKA_PORT (default 9092) to configure the Kafka broker the module publishes domain events to. ENV (default folio) is the environment prefix used when building the tenant-scoped topic name {ENV}.{tenant}.notes.note.

NOTES_TYPES_DEFAULTS_LIMIT defaults to 25.

MAX_RECORDS_COUNT defaults to 1000.

Additional information

Other documentation

Other modules are described, with further FOLIO Developer documentation at dev.folio.org

Issue tracker

See project MODNOTES at the FOLIO issue tracker.

API documentation

This module's API documentation.

Code analysis

SonarQube analysis.

Download and configuration

The built artifacts for this module are available. See configuration for repository access, and the Docker image.

About

Notes on all types of objects

Resources

Contributing

Stars

1 star

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

mod-notes

Copyright (C) 2017-2026 The Open Library Foundation

License

This software is distributed under the terms of the Apache License, Version 2.0. See the file "LICENSE" for more information.

Significantly different licenses

The runtime ships with some third-party libraries with restrictions significantly different from those of the Apache License, see the following list. Build time libraries (compile only, or test only) are out of scope.

See FOLIO's license policy in the Module Acceptance Criteria.

LibraryLicenseProject URL
jakarta.annotation:jakarta.annotation-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
jakarta.transaction:jakarta.transaction-apiEPL 2.0 or GPL2 w/ CPEhttps://projects.eclipse.org/projects/ee4j.ca
javax.xml.bind:jaxb-apiCDDL 1.1 or GPL2 w/ CPEhttps://github.com/javaee/jaxb-spec
org.aspectj:aspectjweaverEclipse Public License - v 2.0https://eclipse.dev/aspectj/
org.eclipse.sisu:org.eclipse.sisu.plexusEclipse Public License 1.0https://www.eclipse.org/sisu/
org.liquibase:liquibase-coreFSL-1.1-ALv2https://github.com/liquibase/liquibase
org.z3950.zing:cql-javaLGPL-2.1-onlyhttps://www.indexdata.com/resources/software/cql-java/

Introduction

Notes on all types of objects.

The notes module implements a simple CRUD interface where users can post notes, small comment texts that refer to other objects in the system, for example users or items.

API

See API Guide

Permissions

The module declares the usual permission bits for the CRUD operations, but it also makes use of the DesiredPermissions feature, using one wildcard pattern 'notes.domains.*' for all endpoints. The idea is that each UI module that makes use of notes, will have to decide on a name for its domain (for example 'items') and use that on all notes they operate on. They should also define a permission set that includes the 'notes.domains.items' permission in some permission set, and enable that for the users who will have access to the permissions on that domain, together with the CRUD permissions telling what kind of operations the user is allowed to perform.

There is also an overall permission 'notes.domains.all' that grants permission to all possible domains.

The way this is designed, the notes module does not need to know or care about which domains we end up having in the system. Unfortunately it requires mod-permissions to support wildcards in the DesiredPermissions, which it does not quite do yet.

Installing and deployment

Compiling

Compile with

mvn clean install

Running it

Run locally on listening port 8081 (default listening port):

Using Docker to run the local stand-alone instance:

DB_HOST=localhost DB_PORT=5432 DB_DATABASE=okapi_modules DB_USERNAME=folio_admin DB_PASSWORD=folio_admin \
java -Dserver.port=8081 -jar target/mod-notes-*.jar

Docker

Build the docker container with:

docker build -t dev.folio/mod-notes .

ModuleDescriptor

See the built target/ModuleDescriptor.json for the interfaces that this module requires and provides, the permissions, and the additional module metadata.

Environment variables

Use DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD to configure the PostgreSQL database.

Use KAFKA_HOST (default localhost) and KAFKA_PORT (default 9092) to configure the Kafka broker the module publishes domain events to. ENV (default folio) is the environment prefix used when building the tenant-scoped topic name {ENV}.{tenant}.notes.note.

NOTES_TYPES_DEFAULTS_LIMIT defaults to 25.

MAX_RECORDS_COUNT defaults to 1000.

Additional information

Other documentation

Other modules are described, with further FOLIO Developer documentation at dev.folio.org

Issue tracker

See project MODNOTES at the FOLIO issue tracker.

API documentation

This module's API documentation.

Code analysis

SonarQube analysis.

Download and configuration

The built artifacts for this module are available. See configuration for repository access, and the Docker image.

About

Notes on all types of objects

Resources

Contributing

Stars

1 star

Watchers

15 watching

Forks

Releases

Packages

Used by

Contributors

Languages