mirror of
https://github.com/jokob-sk/NetAlertX.git
synced 2025-12-07 09:36:05 -08:00
Notification rework + docs + devDetails
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
## Icons overview
|
## Icons overview
|
||||||
|
|
||||||
Icons are used to visually distinguish devices in the app in most of the device listing tables and the [network tree](/docs/NETWORK_TREE.md). Currently only free [Font Awesome](https://fontawesome.com/search?o=r&m=free) icons (up-to v 6.4.0) are supported (I have an unblockable [sponsorship goal](https://github.com/sponsors/jokob-sk) to add the material design icon pack).
|
Icons are used to visually distinguish devices in the app in most of the device listing tables and the [network tree](/docs/NETWORK_TREE.md). Currently only free [Font Awesome](https://fontawesome.com/search?o=r&m=free) icons (up-to v 6.4.0) are supported.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -8,6 +8,8 @@ Icons are used to visually distinguish devices in the app in most of the device
|
|||||||
|
|
||||||
You can assign icons individually on each device in the Details tab.
|
You can assign icons individually on each device in the Details tab.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
- You can click into the `Icon` field or click the Pencil (2) icon in the above screenshot to enter any text. Only [free Font Awesome](https://fontawesome.com/search?o=r&m=free) icons in the following format will work:
|
- You can click into the `Icon` field or click the Pencil (2) icon in the above screenshot to enter any text. Only [free Font Awesome](https://fontawesome.com/search?o=r&m=free) icons in the following format will work:
|
||||||
|
|||||||
BIN
docs/img/ICONS/device_icons_preview.gif
Executable file
BIN
docs/img/ICONS/device_icons_preview.gif
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 112 KiB |
@@ -718,6 +718,10 @@ input[readonly] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Devices */
|
/* Devices */
|
||||||
|
#txtIconFA {
|
||||||
|
min-width: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
.drp-edit
|
.drp-edit
|
||||||
{
|
{
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|||||||
@@ -146,7 +146,10 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-3 control-label"><?= lang('DevDetail_MainInfo_Name');?></label>
|
<label class="col-sm-3 control-label"><?= lang('DevDetail_MainInfo_Name');?></label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<input class="form-control" id="txtName" type="text" value="--">
|
<div class="input-group">
|
||||||
|
<input class="form-control" id="txtName" type="text" value="--">
|
||||||
|
<span class="input-group-addon"><i class="fa fa-pencil pointer" onclick="editDrp('txtName');"></i></span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -156,6 +159,7 @@
|
|||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input class="form-control" id="txtOwner" type="text" value="--">
|
<input class="form-control" id="txtOwner" type="text" value="--">
|
||||||
|
<span class="input-group-addon"><i class="fa fa-pencil pointer" onclick="editDrp('txtOwner');"></i></span>
|
||||||
<div class="input-group-btn">
|
<div class="input-group-btn">
|
||||||
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
|
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
|
||||||
<span class="fa fa-caret-down "></span></button>
|
<span class="fa fa-caret-down "></span></button>
|
||||||
@@ -172,6 +176,7 @@
|
|||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input class="form-control" id="txtDeviceType" type="text" value="--">
|
<input class="form-control" id="txtDeviceType" type="text" value="--">
|
||||||
|
<span class="input-group-addon"><i class="fa fa-pencil pointer" onclick="editDrp('txtDeviceType');"></i></span>
|
||||||
<div class="input-group-btn">
|
<div class="input-group-btn">
|
||||||
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-expanded="false" >
|
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-expanded="false" >
|
||||||
<span class="fa fa-caret-down"></span></button>
|
<span class="fa fa-caret-down"></span></button>
|
||||||
@@ -227,6 +232,7 @@
|
|||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input class="form-control" id="txtGroup" type="text" value="--">
|
<input class="form-control" id="txtGroup" type="text" value="--">
|
||||||
|
<span class="input-group-addon"><i class="fa fa-pencil pointer" onclick="editDrp('txtGroup');"></i></span>
|
||||||
<div class="input-group-btn">
|
<div class="input-group-btn">
|
||||||
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
|
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
|
||||||
<span class="fa fa-caret-down"></span>
|
<span class="fa fa-caret-down"></span>
|
||||||
@@ -244,6 +250,7 @@
|
|||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input class="form-control" id="txtLocation" type="text" value="--">
|
<input class="form-control" id="txtLocation" type="text" value="--">
|
||||||
|
<span class="input-group-addon"><i class="fa fa-pencil pointer" onclick="editDrp('txtLocation');"></i></span>
|
||||||
<div class="input-group-btn">
|
<div class="input-group-btn">
|
||||||
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
|
<button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
|
||||||
<span class="fa fa-caret-down"></span></button>
|
<span class="fa fa-caret-down"></span></button>
|
||||||
@@ -1818,9 +1825,3 @@ function toggleNetworkConfiguration(disable)
|
|||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
|
||||||
#txtIconFA {
|
|
||||||
min-width: 18px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -36,9 +36,6 @@ def main():
|
|||||||
db = DB() # instance of class DB
|
db = DB() # instance of class DB
|
||||||
db.open()
|
db.open()
|
||||||
|
|
||||||
# parser = argparse.ArgumentParser(description='APPRISE publisher Plugin')
|
|
||||||
# values = parser.parse_args()
|
|
||||||
|
|
||||||
# Initialize the Plugin obj output file
|
# Initialize the Plugin obj output file
|
||||||
plugin_objects = Plugin_Objects(RESULT_FILE)
|
plugin_objects = Plugin_Objects(RESULT_FILE)
|
||||||
|
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ while ($row = $result -> fetchArray (SQLITE3_ASSOC)) {
|
|||||||
const settingGroups = [];
|
const settingGroups = [];
|
||||||
const settingKeyOfLists = [];
|
const settingKeyOfLists = [];
|
||||||
// core groups are the ones not generated by plugins
|
// core groups are the ones not generated by plugins
|
||||||
const settingCoreGroups = ['General', 'Email', 'Webhooks', 'Apprise', 'NTFY', 'PUSHSAFER', 'MQTT', 'DynDNS', 'API'];
|
const settingCoreGroups = ['General'];
|
||||||
|
|
||||||
|
|
||||||
// Loop through the settingsArray and collect unique settingGroups
|
// Loop through the settingsArray and collect unique settingGroups
|
||||||
|
|||||||
@@ -70,12 +70,6 @@ WEBHOOK_PAYLOAD = 'json'
|
|||||||
WEBHOOK_REQUEST_METHOD = 'GET'
|
WEBHOOK_REQUEST_METHOD = 'GET'
|
||||||
WEBHOOK_SECRET = ''
|
WEBHOOK_SECRET = ''
|
||||||
|
|
||||||
# Apprise
|
|
||||||
REPORT_APPRISE = False
|
|
||||||
APPRISE_HOST = ''
|
|
||||||
APPRISE_URL = ''
|
|
||||||
APPRISE_PAYLOAD = 'html'
|
|
||||||
|
|
||||||
# NTFY
|
# NTFY
|
||||||
REPORT_NTFY = False
|
REPORT_NTFY = False
|
||||||
NTFY_HOST = 'https://ntfy.sh'
|
NTFY_HOST = 'https://ntfy.sh'
|
||||||
|
|||||||
@@ -1,58 +0,0 @@
|
|||||||
|
|
||||||
import json
|
|
||||||
import subprocess
|
|
||||||
import conf
|
|
||||||
from helper import noti_obj
|
|
||||||
from logger import logResult, mylog
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
def check_config():
|
|
||||||
if conf.APPRISE_URL == '' or conf.APPRISE_HOST == '':
|
|
||||||
mylog('none', ['[Check Config] Error: Apprise service not set up correctly. Check your pialert.conf APPRISE_* variables.'])
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
return True
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
def send(msg: noti_obj):
|
|
||||||
html = msg.html
|
|
||||||
text = msg.text
|
|
||||||
|
|
||||||
payloadData = ''
|
|
||||||
|
|
||||||
# limit = 1024 * 1024 # 1MB limit (1024 bytes * 1024 bytes = 1MB)
|
|
||||||
limit = conf.APPRISE_SIZE
|
|
||||||
|
|
||||||
# truncate size
|
|
||||||
if conf.APPRISE_PAYLOAD == 'html':
|
|
||||||
if len(msg.html) > limit:
|
|
||||||
payloadData = msg.html[:limit] + " <h1> (text was truncated)</h1>"
|
|
||||||
else:
|
|
||||||
payloadData = msg.html
|
|
||||||
if conf.APPRISE_PAYLOAD == 'text':
|
|
||||||
if len(msg.text) > limit:
|
|
||||||
payloadData = msg.text[:limit] + " (text was truncated)"
|
|
||||||
else:
|
|
||||||
payloadData = msg.text
|
|
||||||
|
|
||||||
# Define Apprise compatible payload (https://github.com/caronc/apprise-api#stateless-solution)
|
|
||||||
|
|
||||||
_json_payload = {
|
|
||||||
"urls": conf.APPRISE_URL,
|
|
||||||
"title": "Pi.Alert Notifications",
|
|
||||||
"format": conf.APPRISE_PAYLOAD,
|
|
||||||
"body": payloadData
|
|
||||||
}
|
|
||||||
|
|
||||||
try:
|
|
||||||
# try runnning a subprocess
|
|
||||||
p = subprocess.Popen(["curl","-i","-X", "POST" ,"-H", "Content-Type:application/json" ,"-d", json.dumps(_json_payload), conf.APPRISE_HOST], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
|
||||||
stdout, stderr = p.communicate()
|
|
||||||
# write stdout and stderr into .log files for debugging if needed
|
|
||||||
logResult (stdout, stderr) # TO-DO should be changed to mylog
|
|
||||||
|
|
||||||
# Log the stdout and stderr
|
|
||||||
mylog('debug', [stdout, stderr]) # TO-DO should be changed to mylog
|
|
||||||
except subprocess.CalledProcessError as e:
|
|
||||||
# An error occurred, handle it
|
|
||||||
mylog('none', [e.output])
|
|
||||||
@@ -28,8 +28,6 @@ from publishers.email import (check_config as email_check_config,
|
|||||||
send as send_email )
|
send as send_email )
|
||||||
from publishers.ntfy import (check_config as ntfy_check_config,
|
from publishers.ntfy import (check_config as ntfy_check_config,
|
||||||
send as send_ntfy )
|
send as send_ntfy )
|
||||||
from publishers.apprise import (check_config as apprise_check_config,
|
|
||||||
send as send_apprise)
|
|
||||||
from publishers.webhook import (check_config as webhook_check_config,
|
from publishers.webhook import (check_config as webhook_check_config,
|
||||||
send as send_webhook)
|
send as send_webhook)
|
||||||
from publishers.pushsafer import (check_config as pushsafer_check_config,
|
from publishers.pushsafer import (check_config as pushsafer_check_config,
|
||||||
@@ -263,9 +261,7 @@ def get_notifications (db):
|
|||||||
write_file (logPath + '/report_output.txt', final_text)
|
write_file (logPath + '/report_output.txt', final_text)
|
||||||
write_file (logPath + '/report_output.html', final_html)
|
write_file (logPath + '/report_output.html', final_html)
|
||||||
|
|
||||||
return noti_obj(final_json, final_text, final_html)
|
return noti_obj(final_json, final_text, final_html)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# mylog('minimal', ['[Notification] Udating API files'])
|
# mylog('minimal', ['[Notification] Udating API files'])
|
||||||
# send_api()
|
# send_api()
|
||||||
@@ -307,28 +303,6 @@ def get_notifications (db):
|
|||||||
# mylog('verbose', ['[Notification] No changes to report'])
|
# mylog('verbose', ['[Notification] No changes to report'])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# #-------------------------------------------------------------------------------
|
|
||||||
# def check_config(service):
|
|
||||||
|
|
||||||
# if service == 'email':
|
|
||||||
# return email_check_config()
|
|
||||||
|
|
||||||
# if service == 'apprise':
|
|
||||||
# return apprise_check_config()
|
|
||||||
|
|
||||||
# if service == 'webhook':
|
|
||||||
# return webhook_check_config()
|
|
||||||
|
|
||||||
# if service == 'ntfy':
|
|
||||||
# return ntfy_check_config ()
|
|
||||||
|
|
||||||
# if service == 'pushsafer':
|
|
||||||
# return pushsafer_check_config()
|
|
||||||
|
|
||||||
# if service == 'mqtt':
|
|
||||||
# return mqtt_check_config()
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------
|
||||||
# Replacing table headers
|
# Replacing table headers
|
||||||
def format_table (html, thValue, props, newThValue = ''):
|
def format_table (html, thValue, props, newThValue = ''):
|
||||||
|
|||||||
Reference in New Issue
Block a user