diff --git a/backend/reminders.py b/backend/reminders.py index 70c0692..97ced51 100644 --- a/backend/reminders.py +++ b/backend/reminders.py @@ -393,3 +393,26 @@ class Reminders: # Return info return self.fetchone(id) + +def test_reminder( + title: str, + notification_service: int, + text: str = '' +) -> None: + """Test send a reminder draft + + Args: + title (str): Title title of the entry + notification_service (int): The id of the notification service to use to send the reminder + text (str, optional): The body of the reminder. Defaults to ''. + """ + a = Apprise() + url = get_db(dict).execute( + "SELECT url FROM notification_services WHERE id = ?", + (notification_service,) + ).fetchone() + if not url: + raise NotificationServiceNotFound + a.add(url[0]) + a.notify(title=title, body=text) + return diff --git a/frontend/api.py b/frontend/api.py index 89bc6fc..c6e9d13 100644 --- a/frontend/api.py +++ b/frontend/api.py @@ -14,7 +14,7 @@ from backend.custom_exceptions import (AccessUnauthorized, InvalidKeyValue, UsernameTaken, UserNotFound) from backend.notification_service import (NotificationService, NotificationServices) -from backend.reminders import Reminders, reminder_handler +from backend.reminders import Reminders, reminder_handler, test_reminder from backend.templates import Template, Templates from backend.users import User, register_user @@ -459,6 +459,18 @@ def api_reminders_query(): result = g.user_data.reminders.search(query) return return_api(result) +@api.route('/reminders/test', methods=['POST']) +@error_handler +@auth +def api_test_reminder(): + data = request.get_json() + title = extract_key(data, 'title') + notification_service = extract_key(data, 'notification_service') + text = extract_key(data, 'text', check_existence=False) + + test_reminder(title, notification_service, text) + return return_api({}, code=201) + @api.route('/reminders/', methods=['GET','PUT','DELETE']) @error_handler @auth diff --git a/frontend/static/css/add_edit.css b/frontend/static/css/add_edit.css index d374b70..2fca5a7 100644 --- a/frontend/static/css/add_edit.css +++ b/frontend/static/css/add_edit.css @@ -112,6 +112,26 @@ div.options > button { color: var(--color-error); } +#test-reminder { + display: flex; + gap: 1rem; + + overflow-x: hidden; +} + +#test-reminder > div { + width: 100%; + flex: 0 0 auto; + + font-size: inherit; + + transition: transform .1s linear; +} + +#test-reminder.show-sent > div { + transform: translateX(calc(-100% - 1rem)); +} + @media (max-width: 460px) { .sub-inputs > input, .sub-inputs > select { diff --git a/frontend/static/js/add.js b/frontend/static/js/add.js index 7fb9e14..da48db9 100644 --- a/frontend/static/js/add.js +++ b/frontend/static/js/add.js @@ -74,6 +74,7 @@ function closeAdd() { inputs.notification_service.value = document.querySelector('#notification-service-input option[selected]').value; toggleNormal(); inputs.text.value = ''; + document.getElementById('test-reminder').classList.remove('show-sent'); }, 500); }; @@ -89,11 +90,45 @@ function toggleNormal() { function toggleRepeated() { type_buttons['normal-button'].dataset.selected = 'false'; type_buttons['repeat-button'].dataset.selected = 'true'; - + type_buttons['repeat-bar'].classList.remove('hidden'); type_buttons['repeat-interval'].setAttribute('required', ''); }; +function testReminder() { + const input = document.getElementById('test-reminder'); + if (inputs.title.value === '') { + input.classList.add('error-input'); + input.title = 'No title set'; + return + } else { + input.classList.remove('error-input'); + input.removeAttribute('title'); + }; + const data = { + 'title': inputs.title.value, + 'notification_service': inputs.notification_service.value, + 'text': inputs.text.value + }; + fetch(`/api/reminders/test?api_key=${api_key}`, { + 'method': 'POST', + 'headers': {'Content-Type': 'application/json'}, + 'body': JSON.stringify(data) + }) + .then(response => { + // catch errors + if (!response.ok) { + return Promise.reject(response.status); + }; + input.classList.add('show-sent'); + }) + .catch(e => { + if (e === 401) { + window.location.href = '/'; + }; + }); +}; + // code run on load document.getElementById('add-form').setAttribute('action', 'javascript:addReminder();'); @@ -101,3 +136,4 @@ document.getElementById('template-selection').addEventListener('change', e => lo document.getElementById('normal-button').addEventListener('click', e => toggleNormal()); document.getElementById('repeat-button').addEventListener('click', e => toggleRepeated()); document.getElementById('close-add').addEventListener('click', e => closeAdd()); +document.getElementById('test-reminder').addEventListener('click', e => testReminder()); diff --git a/frontend/templates/reminders.html b/frontend/templates/reminders.html index f3c0c2b..518f378 100644 --- a/frontend/templates/reminders.html +++ b/frontend/templates/reminders.html @@ -178,6 +178,10 @@
+