diff --git a/.gitignore b/.gitignore index cf316300..aeb881d2 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ dist generatedLanguageFiles faces unknownFaces +.idea/ diff --git a/web/assets/js/super.configEditor.js b/web/assets/js/super.configEditor.js index f63bc7b1..6ce3b060 100644 --- a/web/assets/js/super.configEditor.js +++ b/web/assets/js/super.configEditor.js @@ -1,321 +1,376 @@ -$(document).ready(function(){ - var schema = { - "title": "Main Configuration", - "type": "object", - "properties": { - "debugLog": { +$(document).ready(function () { + var schema = { + "title": "Main Configuration", + "type": "object", + "properties": { + "debugLog": { + "title": "Enable Debug Log", + "type": "boolean", + "default": false + }, + "subscriptionId": { + "title": "Fill in subscription ID", + "type": "string", + "default": null + }, + "port": { + "title": "Server port", + "type": "integer", + "default": 8080 + }, + "passwordType": { + "title": "Password type", + "type": "string", + "enum": [ + "sha256", + "sha512", + "md5" + ], + "default": "sha256" + }, + "addStorage": { + "type": "array", + "format": "table", + "title": "Additional Storage", + "description": "Separate storage locations that can be set for different monitors.", + "uniqueItems": true, + "items": { + "type": "object", + "title": "Storage Array", + "properties": { + "name": { + "type": "string", + }, + "path": { + "type": "string", + "default": "__DIR__/videos2" + } + } + }, + "default": [ + { + "name": "second", + "path": "__DIR__/videos2" + } + ] + }, + "plugins": { + "type": "array", + "format": "table", + "title": "Plugins", + "descripton": "Elaborate Plugin connection settings.", + "uniqueItems": true, + "items": { + "type": "object", + "title": "Plugin", + "properties": { + "plug": { + "type": "string", + "default": "pluginName" + }, + "key": { + "type": "string" + }, + "mode": { + "type": "string", + "enum": [ + "host", + "client" + ], + "default": "client" + }, + "https": { + "type": "boolean", + "descripton": "Only for Host mode.", + "default": false + }, + "host": { + "type": "string", + "descripton": "Only for Host mode.", + "default": "localhost" + }, + "port": { + "type": "integer", + "descripton": "Only for Host mode.", + "default": 8082 + }, + "type": { + "type": "string", + "default": "detector" + } + } + } + }, + "pluginKeys": { + "type": "object", + "format": "table", + "title": "Plugin Keys", + "description": "Quick client connection setup for plugins. Just add the plugin key to make it ready for incoming connections.", + "uniqueItems": true, + "items": { + "type": "object", + "title": "Plugin Key", + "properties": {} + } + }, + "db": { + "type": "object", + "format": "table", + "title": "Database Options", + "description": "Credentials to connect to where detailed information is stored.", + "properties": { + "host": { + "title": "Hostname / IP", + "type": "string", + "default": "127.0.0.1" + }, + "user": { + "title": "Username", + "type": "string", + "default": "majesticflame" + }, + "password": { + "title": "Password", + "type": "string", + "default": "" + }, + "database": { + "type": "string", + "default": "ccio" + }, + "port": { + "type": "integer", + "default": 3306 + } + }, + "default": { + "host": "127.0.0.1", + "user": "majesticflame", + "password": "", + "database": "ccio", + "port": 3306 + } + }, + "cron": { + "type": "object", + "format": "table", + "title": "CRON Options", + "properties": { + "key": { + "type": "string", + }, + "deleteOld": { + "type": "boolean", + "description": "cron will delete videos older than Max Number of Days per account.", + "default": true + }, + "deleteNoVideo": { + "type": "boolean", + "description": "cron will delete SQL rows that it thinks have no video files.", + "default": true + }, + "deleteOverMax": { + "type": "boolean", + "description": "cron will delete files that are over the set maximum storage per account.", + "default": true + }, + } + }, + "mail": { + "type": "object", + "format": "table", + "title": "Email Options", + "properties": { + "service": { + "type": "string", + }, + "host": { + "type": "string", + }, + "auth": { + "type": "object", + "properties": { + "user": { + "type": "string", + }, + "pass": { + "type": "string", + }, + }, + }, + "secure": { "type": "boolean", "default": false }, - "subscriptionId": { - "type": "string", + "ignoreTLS": { + "type": "boolean", }, - "port": { - "type": "integer", - "default": 8080 - }, - "passwordType": { - "type": "string", - "enum": [ - "sha256", - "sha512", - "md5" - ], - "default": "sha256" - }, - "addStorage": { - "type": "array", - "format": "table", - "title": "Additional Storage", - "description": "Separate storage locations that can be set for different monitors.", - "uniqueItems": true, - "items": { - "type": "object", - "title": "Storage Array", - "properties": { - "name": { - "type": "string", - }, - "path": { - "type": "string", - "default": "__DIR__/videos2" - } - } + "requireTLS": { + "type": "boolean", }, - "default": [ - { - "name": "second", - "path": "__DIR__/videos2" - } - ] - }, - "plugins": { - "type": "array", - "format": "table", - "title": "Plugins", - "descripton": "Elaborate Plugin connection settings.", - "uniqueItems": true, - "items": { - "type": "object", - "title": "Plugin", - "properties": { - "plug": { - "type": "string", - "default": "pluginName" - }, - "key": { - "type": "string" - }, - "mode": { - "type": "string", - "enum": [ - "host", - "client" - ], - "default": "client" - }, - "https": { - "type": "boolean", - "descripton": "Only for Host mode.", - "default": false - }, - "host": { - "type": "string", - "descripton": "Only for Host mode.", - "default": "localhost" - }, - "port": { - "type": "integer", - "descripton": "Only for Host mode.", - "default": 8082 - }, - "type": { - "type": "string", - "default": "detector" - } - } - }, - "default": [ - { - "name": "second", - "path": "__DIR__/videos2" - } - ] - }, - "pluginKeys": { - "type": "object", - "format": "table", - "title": "Plugin Keys", - "description": "Quick client connection setup for plugins. Just add the plugin key to make it ready for incoming connections.", - "uniqueItems": true, - "items": { - "type": "object", - "title": "Plugin Key", - "properties": {} + "port": { + "type": "integer", } - }, - "db": { - "type": "object", - "format": "table", - "title": "Database Options", - "description": "Credentials to connect to where detailed information is stored.", - "properties": { - "host": { - "type": "string", - "default": "127.0.0.1" - }, - "user": { - "type": "string", - "default": "majesticflame" - }, - "password": { - "type": "string", - "default": "" - }, - "database": { - "type": "string", - "default": "ccio" - }, - "port": { - "type": "integer", - "default": 3306 - } - }, - "default": { - "host": "127.0.0.1", - "user": "majesticflame", - "password": "", - "database": "ccio", - "port":3306 - } - }, - "cron": { - "type": "object", - "format": "table", - "title": "CRON Options", - "properties": { - "key": { - "type": "string", - }, - "deleteOld": { - "type": "boolean", - "description": "cron will delete videos older than Max Number of Days per account.", - "default": true - }, - "deleteNoVideo": { - "type": "boolean", - "description": "cron will delete SQL rows that it thinks have no video files.", - "default": true - }, - "deleteOverMax": { - "type": "boolean", - "description": "cron will delete files that are over the set maximum storage per account.", - "default": true - }, - } - }, - "mail": { - "type": "object", - "format": "table", - "title": "Email Options", - "properties": { - "service": { - "type": "string", - }, - "host": { - "type": "string", - }, - "auth": { - "type": "object", - "properties": { - "user": { - "type": "string", - }, - "pass": { - "type": "string", - }, - }, - }, - "secure": { - "type": "boolean", - "default": false - }, - "ignoreTLS": { - "type": "boolean", - }, - "requireTLS": { - "type": "boolean", - }, - "port": { - "type": "integer", - } - } - }, - "detectorMergePamRegionTriggers": { - "type": "boolean", - "default": true - }, - "doSnapshot": { - "type": "boolean", - "default": true - }, - "discordBot": { - "type": "boolean", - "default": false - }, - "dropInEventServer": { - "type": "boolean", - "default": false - }, - "ftpServer": { - "type": "boolean", - "default": false - }, - "oldPowerVideo": { - "type": "boolean", - "default": false - }, - "wallClockTimestampAsDefault": { - "type": "boolean", - "default": true - }, - "defaultMjpeg": { - "type": "string", - }, - "streamDir": { - "type": "string", - }, - "videosDir": { - "type": "string", - }, - "windowsTempDir": { - "type": "string", } + }, + "detectorMergePamRegionTriggers": { + "type": "boolean", + "default": true + }, + "doSnapshot": { + "type": "boolean", + "default": true + }, + "discordBot": { + "type": "boolean", + "default": false + }, + "dropInEventServer": { + "type": "boolean", + "default": false + }, + "ftpServer": { + "type": "boolean", + "default": false + }, + "oldPowerVideo": { + "type": "boolean", + "default": false + }, + "wallClockTimestampAsDefault": { + "type": "boolean", + "default": true + }, + "defaultMjpeg": { + "type": "string", + }, + "streamDir": { + "type": "string", + }, + "videosDir": { + "type": "string", + }, + "windowsTempDir": { + "type": "string", + }, + "enableFaceManager": { + "type": "boolean", + "default": false, + "title": "Enable Face Manager", + "description": "Enable / Disable face manager for face recognition plugins in the dashboard." } - }; + } + }; - var configurationTab = $('#config') - var configurationForm = configurationTab.find('form') + const configurationTab = $("#config"); + const configurationForm = configurationTab.find("form"); - // Set default options - JSONEditor.defaults.options.theme = 'bootstrap3'; - JSONEditor.defaults.options.iconlib = 'fontawesome4'; + const moduleData = { + endpoint: null, + configurationEditor: null + } - // Initialize the editor - var configurationEditor = new JSONEditor(document.getElementById("configForHumans"),{ - theme: 'bootstrap3', - schema: schema + const handleGetConfigurationData = data => { + const dataConfig = data.config; + const dataConfigKeys = Object.keys(dataConfig); + const schemaItemsKeys = Object.keys(schema.properties); + + const schemaWithoutData = schemaItemsKeys.filter( + (sk) => !dataConfigKeys.includes(sk) + ); + const dataWithoutSchema = dataConfigKeys.filter( + (dk) => !schemaItemsKeys.includes(dk) + ); + + schemaWithoutData.forEach((sk) => { + const schemaItem = schema.properties[sk]; + const defaultConfig = schemaItem.default; + + data.config[sk] = defaultConfig; }); - function loadConfiguationIntoEditor(){ - $.get(superApiPrefix + $user.sessionKey + '/system/configure',function(data){ - configurationEditor.setValue(data.config); - }) + if (dataWithoutSchema.length > 0) { + dataWithoutSchema.forEach((dk) => { + const schemaItem = { + title: dk, + options: { + hidden: true, + }, + }; + + schema.properties[dk] = schemaItem; + }); + + // Set default options + JSONEditor.defaults.options.theme = "bootstrap3"; + JSONEditor.defaults.options.iconlib = "fontawesome4"; } - // configurationEditor.on("change", function() { - // // Do something... - // }); - var submitConfiguration = function(){ - var errors = configurationEditor.validate(); - console.log(errors.length) - console.log(errors) - if(errors.length === 0) { - var newConfiguration = JSON.stringify(configurationEditor.getValue(),null,3) - var html = '

This is a change being applied to the configuration file (conf.json). Are you sure you want to do this? You must restart Shinobi for these changes to take effect. The JSON below is what you are about to save.

' - html += `
${newConfiguration}
` - $.confirm.create({ - title: 'Save Configuration', - body: html, - clickOptions: { - class: 'btn-success', - title: lang.Save, - }, - clickCallback: function(){ - $.post(superApiPrefix + $user.sessionKey + '/system/configure',{ - data: newConfiguration - },function(data){ - // console.log(data) - }) - } - }) - }else{ - new PNotify({text:'Invalid JSON Syntax, Cannot Save.',type:'error'}) - } + + const configurationEditor = new JSONEditor( + document.getElementById("configForHumans"), { + schema: schema, } - configurationTab.find('.submit').click(function(){ - submitConfiguration() - }) - configurationForm.submit(function(e){ - e.preventDefault() - submitConfiguration() - return false; - }) - $.ccio.ws.on('f',function(d){ - switch(d.f){ - case'init_success': - loadConfiguationIntoEditor() - break; + ); + + configurationEditor.setValue(data.config); + + moduleData.configurationEditor = configurationEditor; + window.configurationEditor = configurationEditor; + }; + + const handlePostConfigurationData = data => { + // console.log(data); + } + + function loadConfiguationIntoEditor(d) { + moduleData.endpoint = `${superApiPrefix}${$user.sessionKey}/system/configure`; + + $.get(moduleData.endpoint, handleGetConfigurationData); + } + + var submitConfiguration = function () { + var errors = configurationEditor.validate(); + console.log(errors.length) + console.log(errors) + if (errors.length === 0) { + var newConfiguration = JSON.stringify(configurationEditor.getValue(), null, 3) + var html = '

This is a change being applied to the configuration file (conf.json). Are you sure you want to do this? You must restart Shinobi for these changes to take effect. The JSON below is what you are about to save.

' + html += `
${newConfiguration}
` + $.confirm.create({ + title: 'Save Configuration', + body: html, + clickOptions: { + class: 'btn-success', + title: lang.Save, + }, + clickCallback: function () { + const requestData = { + data: newConfiguration + }; + + $.post(moduleData.endpoint, requestData, handlePostConfigurationData); } - }) - window.configurationEditor = configurationEditor + }) + } else { + new PNotify({ text: 'Invalid JSON Syntax, Cannot Save.', type: 'error' }); + } + }; + + configurationTab.find('.submit').click(function () { + submitConfiguration(); + }); + + configurationForm.submit(function (e) { + e.preventDefault(); + submitConfiguration(); + return false; + }); + + $.ccio.ws.on("f", d => { + if (d.f === "init_success") { + loadConfiguationIntoEditor(); + } + }); + + window.configurationEditor = configurationEditor; })