{"_id":"@digitalnodecom/node-red-contrib-panel","_rev":"9-22c8338dd265bbb1d02fc63d44e3e3a7","name":"@digitalnodecom/node-red-contrib-panel","dist-tags":{"latest":"1.0.8"},"versions":{"1.0.0":{"name":"@digitalnodecom/node-red-contrib-panel","version":"1.0.0","keywords":["node-red","sqlite","database","admin","panel","crud"],"author":{"name":"DigitalNodeCom"},"license":"MIT","_id":"@digitalnodecom/node-red-contrib-panel@1.0.0","maintainers":[{"name":"trajcheee","email":"trajche@kralev.eu"},{"name":"riste","email":"riste@digitalnode.com"},{"name":"bojanataseva","email":"bojana@digitalnode.com"},{"name":"kic10","email":"hristijan@digitalnode.com"}],"homepage":"https://github.com/digitalnodecom/node-red-contrib-panel#readme","bugs":{"url":"https://github.com/digitalnodecom/node-red-contrib-panel/issues"},"dist":{"shasum":"b196896040f8758867607a1416573988d125efac","tarball":"https://registry.npmjs.org/@digitalnodecom/node-red-contrib-panel/-/node-red-contrib-panel-1.0.0.tgz","fileCount":19,"integrity":"sha512-PMM9OndbtiGYdGBnv85MsabNhuORLFSX1DqdEB5FGR1Zk0plBYc2Y31mOsfcQ1APIaejeE+KACg9NvgXPfYNcA==","signatures":[{"sig":"MEUCIQDpo9sIIoUe4nic7xu0+4rs2reORMdpanriBoIfV6AyBAIgG73w7WNem3OquQ6vfI8p/2slRbJpjDtyKM8H+AczRLA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":346975},"main":"lib/panel.js","engines":{"node":">=14.0.0"},"gitHead":"eb40c369894f31ce02e9d0c30285d7445e81c9c5","scripts":{"dev":"npm run dev:admin","test":"mocha test/test-*.js","build":"npm run build:admin","watch":"nodemon --watch . --ignore node_modules --exec \"sh -c 'npm run build && pm2 restart node-red'\"","dev:admin":"cd lib/admin && npm run dev","build:admin":"cd lib/admin && npm run build"},"_npmUser":{"name":"trajcheee","email":"trajche@kralev.eu"},"node-red":{"nodes":{"panel":"lib/panel.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/digitalnodecom/node-red-contrib-panel.git","type":"git"},"_npmVersion":"10.8.2","description":"A Node-RED plugin with PocketBase-like admin panel backed by SQLite","directories":{},"_nodeVersion":"18.20.8","dependencies":{"ws":"^8.16.0","joi":"^17.11.0","cors":"^2.8.5","sqlite":"^5.1.1","express":"^4.18.2","sqlite3":"^5.1.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.10","mocha":"^10.2.0","supertest":"^7.1.4"},"_npmOperationalInternal":{"tmp":"tmp/node-red-contrib-panel_1.0.0_1754425335400_0.30220035983775184","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@digitalnodecom/node-red-contrib-panel","version":"1.0.3","keywords":["node-red","sqlite","database","admin","panel","crud"],"author":{"name":"TJ Kralev"},"license":"MIT","_id":"@digitalnodecom/node-red-contrib-panel@1.0.3","maintainers":[{"name":"trajcheee","email":"trajche@kralev.eu"},{"name":"riste","email":"riste@digitalnode.com"},{"name":"bojanataseva","email":"bojana@digitalnode.com"},{"name":"kic10","email":"hristijan@digitalnode.com"}],"homepage":"https://github.com/digitalnodecom/node-red-contrib-panel#readme","bugs":{"url":"https://github.com/digitalnodecom/node-red-contrib-panel/issues"},"dist":{"shasum":"b2cb896dabcd8bcfbf0c3332aa71a9ed6923720d","tarball":"https://registry.npmjs.org/@digitalnodecom/node-red-contrib-panel/-/node-red-contrib-panel-1.0.3.tgz","fileCount":27,"integrity":"sha512-bLm/waIxSf9ObhDh48sxQqzmz+yxqDm/OHU2bfitrX4tKIg2P7V2R2AI99nSQHcdECETHKC9XnBedVxZUchVog==","signatures":[{"sig":"MEQCIBj3PSDkkMgf/kg3gg0dHIyQaqHUNTKTuYji2npe7TemAiBYuvbVlbSADQ/cDvohBN+CIFuYD5FBoWk+SgP1RWrJzA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":533572},"main":"lib/panel.js","engines":{"node":">=14.0.0"},"gitHead":"c52747d3fd3f7c9e9ce67c9205ef86d13e46eb68","scripts":{"dev":"npm run dev:admin","test":"mocha test/test-*.js","build":"npm run build:admin","watch":"nodemon --watch . --ignore node_modules --exec \"sh -c 'npm run build && pm2 restart node-red'\"","dev:admin":"cd lib/admin && npm run dev","build:admin":"cd lib/admin && npm run build"},"_npmUser":{"name":"trajcheee","email":"trajche@kralev.eu"},"node-red":{"nodes":{"panel":"lib/panel.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/digitalnodecom/node-red-contrib-panel.git","type":"git"},"_npmVersion":"10.8.2","description":"A Node-RED plugin with PocketBase-like admin panel backed by SQLite","directories":{},"_nodeVersion":"18.20.8","dependencies":{"ws":"^8.16.0","joi":"^17.11.0","cors":"^2.8.5","sqlite":"^5.1.1","express":"^4.18.2","sqlite3":"^5.1.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.10","mocha":"^10.2.0","supertest":"^7.1.4"},"_npmOperationalInternal":{"tmp":"tmp/node-red-contrib-panel_1.0.3_1754505830264_0.8606227579585211","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@digitalnodecom/node-red-contrib-panel","version":"1.0.4","keywords":["node-red","sqlite","database","admin","panel","crud"],"author":{"name":"TJ Kralev"},"license":"MIT","_id":"@digitalnodecom/node-red-contrib-panel@1.0.4","maintainers":[{"name":"trajcheee","email":"trajche@kralev.eu"},{"name":"riste","email":"riste@digitalnode.com"},{"name":"bojanataseva","email":"bojana@digitalnode.com"},{"name":"kic10","email":"hristijan@digitalnode.com"}],"homepage":"https://github.com/digitalnodecom/node-red-contrib-panel#readme","bugs":{"url":"https://github.com/digitalnodecom/node-red-contrib-panel/issues"},"dist":{"shasum":"4f4d519ce8dd9cc4b09fa2502ed22bbbfc74dfb9","tarball":"https://registry.npmjs.org/@digitalnodecom/node-red-contrib-panel/-/node-red-contrib-panel-1.0.4.tgz","fileCount":27,"integrity":"sha512-VYaKS8VlrWRp+XQB/3gKfFipRnVjCy/27xuDlilSr4xlvF3GQJO9XClNSIp7A1vX/9xL3jrxGQc2Ifc0v/ke2w==","signatures":[{"sig":"MEUCIBZ1PhRnBacXX9DfGLjgaW0vjFclWhUJ5bYnKXq+swAYAiEAwLYxvd/eNNL+tU1yaUcIb4YqRykFYWm5QC0F2/lOA5U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":532941},"main":"lib/panel.js","engines":{"node":">=14.0.0"},"gitHead":"0f6385b4c0f1b1de5b13f1facac069d4da71211a","scripts":{"dev":"npm run dev:admin","test":"mocha test/test-*.js","build":"npm run build:admin","watch":"nodemon --watch . --ignore node_modules --exec \"sh -c 'npm run build && pm2 restart node-red'\"","dev:admin":"cd lib/admin && npm run dev","build:admin":"cd lib/admin && npm run build"},"_npmUser":{"name":"trajcheee","email":"trajche@kralev.eu"},"node-red":{"nodes":{"panel":"lib/panel.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/digitalnodecom/node-red-contrib-panel.git","type":"git"},"_npmVersion":"10.8.2","description":"A Node-RED plugin with PocketBase-like admin panel backed by SQLite","directories":{},"_nodeVersion":"18.20.8","dependencies":{"ws":"^8.16.0","joi":"^17.11.0","cors":"^2.8.5","sqlite":"^5.1.1","express":"^4.18.2","sqlite3":"^5.1.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.10","mocha":"^10.2.0","supertest":"^7.1.4"},"_npmOperationalInternal":{"tmp":"tmp/node-red-contrib-panel_1.0.4_1754506238605_0.577722075037532","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@digitalnodecom/node-red-contrib-panel","version":"1.0.5","keywords":["node-red","sqlite","database","admin","panel","crud"],"author":{"name":"TJ Kralev"},"license":"MIT","_id":"@digitalnodecom/node-red-contrib-panel@1.0.5","maintainers":[{"name":"trajcheee","email":"trajche@kralev.eu"},{"name":"riste","email":"riste@digitalnode.com"},{"name":"bojanataseva","email":"bojana@digitalnode.com"},{"name":"kic10","email":"hristijan@digitalnode.com"}],"homepage":"https://github.com/digitalnodecom/node-red-contrib-panel#readme","bugs":{"url":"https://github.com/digitalnodecom/node-red-contrib-panel/issues"},"dist":{"shasum":"595bbf69d8ac8b08682b565dad8e443fc2d94c18","tarball":"https://registry.npmjs.org/@digitalnodecom/node-red-contrib-panel/-/node-red-contrib-panel-1.0.5.tgz","fileCount":27,"integrity":"sha512-YnWETwPDDWjvHHIm+KiHrmJLK84BNFseyzpUu8ggYYviqQcFZhgR4et5hwhAg/zVw1PmlvzuOqfy1ItLWiHlrw==","signatures":[{"sig":"MEUCIQC5Ms92T0iJh7vBAjZ6ghZNuHH6EQgbVi/QxOX2Sk1NYQIgd448zW+bBFC2vSoLR0Y6Q38PWIlKIHd4MqvmDS5iuCw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":532931},"main":"lib/panel.js","engines":{"node":">=14.0.0"},"gitHead":"6ab018935c11a4cc3645fa93f3156ed194033d75","scripts":{"dev":"npm run dev:admin","test":"mocha test/test-*.js","build":"npm run build:admin","watch":"nodemon --watch . --ignore node_modules --exec \"sh -c 'npm run build && pm2 restart node-red'\"","dev:admin":"cd lib/admin && npm run dev","build:admin":"cd lib/admin && npm run build"},"_npmUser":{"name":"trajcheee","email":"trajche@kralev.eu"},"node-red":{"nodes":{"panel":"lib/panel.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/digitalnodecom/node-red-contrib-panel.git","type":"git"},"_npmVersion":"10.8.2","description":"A Node-RED plugin with PocketBase-like admin panel backed by SQLite","directories":{},"_nodeVersion":"18.20.8","dependencies":{"ws":"^8.16.0","joi":"^17.11.0","cors":"^2.8.5","sqlite":"^5.1.1","express":"^4.18.2","sqlite3":"^5.1.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.10","mocha":"^10.2.0","supertest":"^7.1.4"},"_npmOperationalInternal":{"tmp":"tmp/node-red-contrib-panel_1.0.5_1754508066065_0.41753072126341806","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@digitalnodecom/node-red-contrib-panel","version":"1.0.6","keywords":["node-red","sqlite","database","admin","panel","crud"],"author":{"name":"TJ Kralev"},"license":"MIT","_id":"@digitalnodecom/node-red-contrib-panel@1.0.6","maintainers":[{"name":"trajcheee","email":"trajche@kralev.eu"},{"name":"riste","email":"riste@digitalnode.com"},{"name":"bojanataseva","email":"bojana@digitalnode.com"},{"name":"kic10","email":"hristijan@digitalnode.com"}],"homepage":"https://github.com/digitalnodecom/node-red-contrib-panel#readme","bugs":{"url":"https://github.com/digitalnodecom/node-red-contrib-panel/issues"},"dist":{"shasum":"a4ad2766ad38a5b5af0f4115f2b994b9297a5286","tarball":"https://registry.npmjs.org/@digitalnodecom/node-red-contrib-panel/-/node-red-contrib-panel-1.0.6.tgz","fileCount":27,"integrity":"sha512-CG4jpXwv60ClCFRXTtLUNVdpJeNpbUxnstFv8bVDzVVCSXfC6H6Ef2C9ZDqTQOamGVkdOs/0cTaYSEgAWhEvRw==","signatures":[{"sig":"MEUCIC1BoK+iifM2y2rJCzS2D7zJE+gO2nrx5fKToNbchfQUAiEA9vXPL4212Bzbt6UNQX2pgCOEajp/Lx3ZHPVZ5rHYzuA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":534992},"main":"lib/panel.js","engines":{"node":">=14.0.0"},"gitHead":"c88c01036622722ec6327109bd6457145f99f001","scripts":{"dev":"npm run dev:admin","test":"mocha test/test-*.js","build":"npm run build:admin","watch":"nodemon --watch . --ignore node_modules --exec \"sh -c 'npm run build && pm2 restart node-red'\"","dev:admin":"cd lib/admin && npm run dev","build:admin":"cd lib/admin && npm run build"},"_npmUser":{"name":"trajcheee","email":"trajche@kralev.eu"},"node-red":{"nodes":{"panel":"lib/panel.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/digitalnodecom/node-red-contrib-panel.git","type":"git"},"_npmVersion":"10.8.2","description":"A Node-RED plugin with PocketBase-like admin panel backed by SQLite","directories":{},"_nodeVersion":"18.20.8","dependencies":{"ws":"^8.16.0","joi":"^17.11.0","cors":"^2.8.5","sqlite":"^5.1.1","express":"^4.18.2","sqlite3":"^5.1.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.10","mocha":"^10.2.0","supertest":"^7.1.4"},"_npmOperationalInternal":{"tmp":"tmp/node-red-contrib-panel_1.0.6_1754602320345_0.6073636233168538","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@digitalnodecom/node-red-contrib-panel","version":"1.0.7","keywords":["node-red","sqlite","database","admin","panel","crud"],"author":{"name":"TJ Kralev"},"license":"MIT","_id":"@digitalnodecom/node-red-contrib-panel@1.0.7","maintainers":[{"name":"trajcheee","email":"trajche@kralev.eu"},{"name":"riste","email":"riste@digitalnode.com"},{"name":"bojanataseva","email":"bojana@digitalnode.com"},{"name":"kic10","email":"hristijan@digitalnode.com"}],"homepage":"https://github.com/digitalnodecom/node-red-contrib-panel#readme","bugs":{"url":"https://github.com/digitalnodecom/node-red-contrib-panel/issues"},"dist":{"shasum":"b9b08281a0ec6dc712615c8921cf06eb12b2fe0f","tarball":"https://registry.npmjs.org/@digitalnodecom/node-red-contrib-panel/-/node-red-contrib-panel-1.0.7.tgz","fileCount":24,"integrity":"sha512-DIVjffAUloVMU9WSlhbtPKnQr1w82I/WREUPrQfxJJlafRnSTbsqDlseEkXEy6oCDyqcVZ6g+q1wOBn1SStAsw==","signatures":[{"sig":"MEUCIAkWSfI/c9NvNjHp3zPhfMKuo+3F0NQBsoiOh80fOtnIAiEAjO1iuxckxrB4HOKCLA6A2MRHqM//zp1OXQZEjF3048M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":493135},"main":"lib/panel.js","engines":{"node":">=14.0.0"},"gitHead":"4189fc5f3f9d607fb3ba121353d57d98b3b600b3","scripts":{"dev":"npm run dev:admin","test":"mocha test/test-*.js","build":"npm run build:admin","watch":"nodemon --watch . --ignore node_modules --exec \"sh -c 'npm run build && pm2 restart node-red'\"","dev:admin":"cd lib/admin && npm run dev","build:admin":"cd lib/admin && npm run build"},"_npmUser":{"name":"trajcheee","email":"trajche@kralev.eu"},"node-red":{"nodes":{"panel":"lib/panel.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/digitalnodecom/node-red-contrib-panel.git","type":"git"},"_npmVersion":"10.8.2","description":"A Node-RED plugin with PocketBase-like admin panel backed by SQLite","directories":{},"_nodeVersion":"18.20.8","dependencies":{"ws":"^8.16.0","joi":"^17.11.0","cors":"^2.8.5","sqlite":"^5.1.1","express":"^4.18.2","sqlite3":"^5.1.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.10","mocha":"^10.2.0","supertest":"^7.1.4"},"_npmOperationalInternal":{"tmp":"tmp/node-red-contrib-panel_1.0.7_1754681028507_0.48593111972465564","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@digitalnodecom/node-red-contrib-panel","version":"1.0.8","keywords":["node-red","sqlite","database","admin","panel","crud"],"author":{"name":"TJ Kralev"},"license":"MIT","_id":"@digitalnodecom/node-red-contrib-panel@1.0.8","maintainers":[{"name":"trajcheee","email":"trajche@kralev.eu"},{"name":"riste","email":"riste@digitalnode.com"},{"name":"bojanataseva","email":"bojana@digitalnode.com"},{"name":"kic10","email":"hristijan@digitalnode.com"}],"homepage":"https://github.com/digitalnodecom/node-red-contrib-panel#readme","bugs":{"url":"https://github.com/digitalnodecom/node-red-contrib-panel/issues"},"dist":{"shasum":"1ae8f6a192fb199aaf56641dc35e4a2699c129f2","tarball":"https://registry.npmjs.org/@digitalnodecom/node-red-contrib-panel/-/node-red-contrib-panel-1.0.8.tgz","fileCount":24,"integrity":"sha512-h9ytUFZB8y4YTdT++DtJAxfbcPI+ilZ2kv0S+bfETkly55vFl9yNugbC8XA8OZK3Mv4EYiz7MI6COXfxmikoIw==","signatures":[{"sig":"MEUCICd5MQ7LVZYQDhoH2UO8cQGT8rvOV0gcBpRD9N4ytvtkAiEA6AnsmVf3tq4kcQncuAl/b3Y55J2GKsSlSoGoZuUapS4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":516647},"main":"lib/panel.js","engines":{"node":">=14.0.0"},"gitHead":"b2c063128f1e87eb57cd10d20aad8a5cd15e7b4e","scripts":{"dev":"npm run dev:admin","test":"mocha test/test-*.js","build":"npm run build:admin","watch":"nodemon --watch . --ignore node_modules --exec \"sh -c 'npm run build && pm2 restart node-red'\"","dev:admin":"cd lib/admin && npm run dev","build:admin":"cd lib/admin && npm run build"},"_npmUser":{"name":"trajcheee","email":"trajche@kralev.eu"},"node-red":{"nodes":{"panel":"lib/panel.js"},"version":">=2.0.0"},"repository":{"url":"git+https://github.com/digitalnodecom/node-red-contrib-panel.git","type":"git"},"_npmVersion":"10.8.2","description":"A Node-RED plugin with PocketBase-like admin panel backed by SQLite","directories":{},"_nodeVersion":"18.20.8","dependencies":{"ws":"^8.16.0","joi":"^17.11.0","cors":"^2.8.5","sqlite":"^5.1.1","express":"^4.18.2","sqlite3":"^5.1.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.10","mocha":"^10.2.0","supertest":"^7.1.4"},"_npmOperationalInternal":{"tmp":"tmp/node-red-contrib-panel_1.0.8_1754848449887_0.3490974446092132","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-08-05T20:22:15.337Z","modified":"2026-01-13T22:17:42.567Z","1.0.0":"2025-08-05T20:22:15.599Z","1.0.3":"2025-08-06T18:43:50.473Z","1.0.4":"2025-08-06T18:50:38.882Z","1.0.5":"2025-08-06T19:21:06.346Z","1.0.6":"2025-08-07T21:32:00.557Z","1.0.7":"2025-08-08T19:23:48.713Z","1.0.8":"2025-08-10T17:54:10.235Z"},"bugs":{"url":"https://github.com/digitalnodecom/node-red-contrib-panel/issues"},"author":{"name":"TJ Kralev"},"license":"MIT","homepage":"https://github.com/digitalnodecom/node-red-contrib-panel#readme","keywords":["node-red","sqlite","database","admin","panel","crud"],"repository":{"url":"git+https://github.com/digitalnodecom/node-red-contrib-panel.git","type":"git"},"description":"A Node-RED plugin with PocketBase-like admin panel backed by SQLite","maintainers":[{"email":"trajche@kralev.eu","name":"trajcheee"},{"email":"simon@digitalnode.com","name":"simonanastasov"}],"readme":"# Node-RED Panel Plugin\n\nA Node-RED plugin that provides a PocketBase-like admin panel backed by SQLite for dynamic table management and CRUD operations.\n\n## Features\n\n### Core Functionality\n- **Dynamic Table Management**: Create and manage SQLite tables through a web interface\n- **Schema Evolution**: Add new fields to existing collections without data loss\n- **Multi-Database Architecture**: Create and manage multiple SQLite databases\n- **Admin Dashboard**: Vue.js-based admin panel accessible at `/panel`\n- **CRUD Operations**: Full Create, Read, Update, Delete functionality\n- **Advanced Upsert Operations**: Insert-or-update with configurable matching fields\n- **REST API**: Complete REST API for all operations\n- **Field Types**: Support for text, number, integer, boolean, date, JSON, email, and URL fields\n- **Field Properties**: Required, unique, and indexable field options for performance\n- **Data Export**: Export collection data as JSON\n- **Live Schema Updates**: Modify table structure while preserving existing data\n\n### Node-RED Integration\n- **6 Custom Nodes**: Query, Insert, Update, Delete, Upsert, and Event Listener nodes\n- **Database Dropdowns**: Dynamic selection of databases and collections in node editors\n- **Message Override**: Use `msg` properties to dynamically override node configuration\n- **Event System**: Real-time database change notifications with SQLite triggers\n- **Panel Button**: Quick access button in Node-RED editor header\n\n### Advanced Features\n- **Audit Logging**: Comprehensive tracking of all system changes with user identification\n- **Database Events**: SQLite trigger-based event system for real-time notifications\n- **Server-Side Pagination**: Efficient data browsing with configurable limits and offsets\n- **Advanced Sorting**: Click-to-sort columns with visual indicators\n- **Column Visibility Controls**: Show/hide columns with localStorage persistence\n- **Inline Editing**: Direct cell editing in data browser\n- **Journal Mode Management**: Per-database SQLite journal mode configuration (DELETE, WAL, MEMORY)\n- **Performance Optimization**: Automatic indexing for unique and indexable fields\n- **Security**: Internal token-based authentication for Node-RED editor endpoints\n\n## Installation\n\n### From NPM (Recommended)\n\n```bash\ncd ~/.node-red\nnpm install @digitalnodecom/node-red-contrib-panel\n```\n\n### From Source\n\n1. Install the plugin in your Node-RED user directory:\n```bash\ncd ~/.node-red\nnpm install /path/to/node-red-panel\n```\n\n2. Build the admin UI (only needed for source installation):\n```bash\ncd node_modules/@digitalnodecom/node-red-contrib-panel/lib/admin\nnpm install\nnpm run build\n```\n\n3. Restart Node-RED\n\n## Usage\n\n### Admin Panel\n\nAfter installation, access the admin panel at: `http://localhost:1880/panel`\n\nThe admin panel provides:\n- **Dashboard**: Real-time audit log and system activity overview\n- **Databases Manager**: Create, manage, and configure multiple SQLite databases\n- **Collections Manager**: Create, edit, and delete collections within any database\n- **Data Browser**: Advanced data browsing with pagination, sorting, and inline editing\n- **API Explorer**: Test API endpoints directly from the browser\n\n### Multi-Database Architecture\n\nThe plugin supports multiple databases:\n- **Master Database**: Contains system metadata, audit logs, and database registry\n- **Custom Databases**: Create unlimited additional databases for different projects/environments\n- **Database Switching**: Seamlessly switch between databases in the admin UI\n- **Isolated Collections**: Each database maintains its own set of collections and data\n\n### Node-RED Nodes\n\nThe plugin provides 6 custom nodes in the \"Panel\" category:\n\n1. **Query Node**: Query data from collections\n   - Operations: find, findOne, count\n   - Database and collection dropdowns\n   - Dynamic query parameters via msg.query\n   - Optional static query configuration\n\n2. **Insert Node**: Insert new records\n   - Database and collection dropdowns\n   - Send record data in msg.payload\n   - Optional static data for testing\n\n3. **Update Node**: Update existing records\n   - Database and collection dropdowns\n   - Send record with id in msg.payload\n   - Optional static data for testing\n\n4. **Delete Node**: Delete records\n   - Database and collection dropdowns\n   - Send record id in msg.payload\n   - Optional static record ID for testing\n\n5. **Upsert Node**: Advanced insert-or-update operations\n   - Configurable match fields for conflict resolution\n   - Three modes: upsert, updateOnly, insertOnly\n   - Visual match field selector with unique/indexed indicators\n   - SQL preview of generated operations\n\n6. **Listener Node**: Real-time database event monitoring\n   - Listen for INSERT, UPDATE, DELETE events\n   - Configurable polling interval and batch size\n   - Auto-acknowledgment of processed events\n   - Only shows event-enabled collections\n\n### Message Override Support\n\nAll nodes support dynamic configuration via message properties when \"Use msg properties\" is enabled:\n- `msg.database` - Override configured database\n- `msg.collection` - Override configured collection\n- Node-specific parameters (query, data, matchFields, etc.)\n\n### API Endpoints\n\n#### Multi-Database Support\n- `GET /panel/api/databases` - List all databases\n- `POST /panel/api/databases` - Create new database\n- `PUT /panel/api/databases/:name` - Update database\n- `DELETE /panel/api/databases/:name` - Delete database\n- `POST /panel/api/databases/:name/set-default` - Set default database\n\n#### Collections (Database Context)\n- `GET /panel/api/:database/collections` - List collections in database\n- `POST /panel/api/:database/collections` - Create collection in database\n- `GET /panel/api/:database/collections/:name` - Get collection details\n- `PUT /panel/api/:database/collections/:name` - Update collection\n- `DELETE /panel/api/:database/collections/:name` - Delete collection\n\n#### Records (Database Context)\n- `GET /panel/api/:database/:collection` - List records with pagination/sorting\n- `POST /panel/api/:database/:collection` - Create record\n- `GET /panel/api/:database/:collection/:id` - Get record\n- `PUT /panel/api/:database/:collection/:id` - Update record\n- `DELETE /panel/api/:database/:collection/:id` - Delete record\n\n#### System & Audit\n- `GET /panel/api/audit` - Get audit log entries\n- `GET /panel/api/audit/stats` - Get audit statistics\n- `GET /panel/api/audit/filters` - Get available filters\n- `POST /panel/api/audit/cleanup` - Clean up old audit entries\n- `GET /panel/api/system` - System health and information\n\n#### Node-RED Integration\n- `GET /panel/node-databases` - Get databases for node dropdowns\n- `GET /panel/node-collections?database=name` - Get collections for node dropdowns\n- `GET /panel/event-collections?database=name` - Get event-enabled collections\n\n## Example Flows\n\n### Basic CRUD Operations\n\n```json\n[\n    {\n        \"id\": \"inject1\",\n        \"type\": \"inject\",\n        \"name\": \"Create User\",\n        \"props\": [{\n            \"p\": \"payload\",\n            \"v\": \"{\\\"name\\\":\\\"John Doe\\\",\\\"email\\\":\\\"john@example.com\\\",\\\"active\\\":true}\",\n            \"vt\": \"json\"\n        }],\n        \"wires\": [[\"insert1\"]]\n    },\n    {\n        \"id\": \"insert1\",\n        \"type\": \"insert\",\n        \"name\": \"Insert User\",\n        \"database\": \"master\",\n        \"collection\": \"users\",\n        \"wires\": [[\"debug1\"]]\n    },\n    {\n        \"id\": \"debug1\",\n        \"type\": \"debug\",\n        \"name\": \"Result\"\n    }\n]\n```\n\n### Advanced Upsert with Event Listening\n\n```json\n[\n    {\n        \"id\": \"upsert1\",\n        \"type\": \"upsert\",\n        \"name\": \"Upsert Product\",\n        \"database\": \"inventory\",\n        \"collection\": \"products\",\n        \"matchFields\": [\"sku\"],\n        \"mode\": \"upsert\",\n        \"wires\": [[\"debug1\"]]\n    },\n    {\n        \"id\": \"listener1\",\n        \"type\": \"listener\",\n        \"name\": \"Product Events\",\n        \"database\": \"inventory\", \n        \"collection\": \"products\",\n        \"eventTypes\": [\"INSERT\", \"UPDATE\"],\n        \"pollingInterval\": 5,\n        \"wires\": [[\"debug2\"]]\n    }\n]\n```\n\n## Database Storage\n\n### Master Database\n- **Location**: `{Node-RED User Directory}/panel.db`\n- **Contains**: System metadata, audit logs, database registry\n\n### Additional Databases\n- **Location**: `{Node-RED User Directory}/panel_databases/{database_name}.db`\n- **Contains**: Collections and data for each custom database\n\n## Development\n\n### Project Structure\n```\n@digitalnodecom/node-red-contrib-panel/\n├── lib/\n│   ├── panel.js              # Main Node-RED integration & Express server\n│   ├── panel.html            # Node editor UI definitions  \n│   ├── api/                  # REST API implementation\n│   │   ├── controllers/      # API route handlers\n│   │   ├── middlewares/      # Validation middleware\n│   │   └── router.js         # API routing\n│   ├── database/             # SQLite database layer\n│   │   ├── db.js             # Database connection & initialization\n│   │   ├── dbManager.js      # Multi-database management\n│   │   ├── audit.js          # Audit logging system\n│   │   ├── schema.js         # Collection management\n│   │   └── triggers.js       # Event system with SQLite triggers\n│   ├── security/             # Authentication & tokens\n│   └── admin/                # Vue.js admin UI\n│       ├── src/              # Vue source code\n│       └── dist/             # Built admin UI\n├── icons/                    # Node icons (node-red-panel.svg)\n├── examples/                 # Example Node-RED flows\n└── package.json\n```\n\n### Building Admin UI\n```bash\ncd lib/admin\nnpm install\nnpm run dev    # Development mode\nnpm run build  # Production build\n```\n\n## Requirements\n\n- Node-RED >= 2.0.0\n- Node.js >= 14.0.0\n\n## License\n\nMIT","readmeFilename":"README.md"}