mirror of
https://github.com/Tautulli/Tautulli.git
synced 2024-11-21 04:50:36 -08:00
826 lines
51 KiB
HTML
826 lines
51 KiB
HTML
% if newsletter:
|
|
<%!
|
|
import json
|
|
from plexpy import notifiers
|
|
from plexpy.helpers import anon_url, checked
|
|
|
|
all_notifiers = sorted(notifiers.get_notifiers(), key=lambda k: (k['agent_label'].lower(), k['friendly_name'], k['id']))
|
|
email_notifiers = [n for n in all_notifiers if n['agent_name'] == 'email']
|
|
email_notifiers = [{'id': 0, 'agent_label': 'New Email Configuration', 'friendly_name': ''}] + email_notifiers
|
|
other_notifiers = [{'id': 0, 'agent_label': 'Select a Notification Agent', 'friendly_name': ''}] + all_notifiers
|
|
%>
|
|
<div class="modal-dialog" role="document">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fa fa-remove"></i></button>
|
|
<h4 class="modal-title" id="newsletter-config-modal-header">${newsletter['agent_label']} Newsletter Settings <small><span class="newsletter_id">(Newsletter ID: ${newsletter['id']})</span></small></h4>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
<ul class="nav nav-tabs list-unstyled" role="tablist">
|
|
<li role="presentation" class="active"><a href="#tabs-newsletter_config" aria-controls="tabs-newsletter_config" role="tab" data-toggle="tab">Configuration</a></li>
|
|
<li role="presentation"><a href="#tabs-newsletter_saving_sending" aria-controls="tabs-newsletter_saving_sending" role="tab" data-toggle="tab">Saving & Sending</a></li>
|
|
<li role="presentation"><a href="#tabs-newsletter_text" aria-controls="tabs-newsletter_text" role="tab" data-toggle="tab">Newsletter Text</a></li>
|
|
<li role="presentation"><a href="#tabs-test_newsletter" aria-controls="tabs-test_newsletter" role="tab" data-toggle="tab">Test Newsletter</a></li>
|
|
</ul>
|
|
</div>
|
|
<form action="set_newsletter_config" method="post" class="form" id="set_newsletter_config" data-parsley-validate>
|
|
<div class="tab-content">
|
|
<div role="tabpanel" class="tab-pane active" id="tabs-newsletter_config">
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<div class="checkbox" style="margin-bottom: 20px;">
|
|
<label>
|
|
<input type="checkbox" data-id="active_value" class="checkboxes" value="1" ${checked(newsletter['active'])}> Enable the Newsletter
|
|
</label>
|
|
<input type="hidden" id="active_value" name="active" value="${newsletter['active']}">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="custom_cron">Schedule</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<select class="form-control" id="custom_cron" name="newsletter_config_custom_cron">
|
|
<option value="0" ${'selected' if newsletter['config']['custom_cron'] == 0 else ''}>Simple</option>
|
|
<option value="1" ${'selected' if newsletter['config']['custom_cron'] == 1 else ''}>Custom</option>
|
|
</select>
|
|
<input type="text" id="cron_value" name="cron" value="${newsletter['cron']}" />
|
|
<div id="cron-widget"></div>
|
|
</div>
|
|
</div>
|
|
<p class="help-block">
|
|
<span id="simple_cron_message">Set the schedule for the newsletter.</span>
|
|
<span id="custom_cron_message">
|
|
Set the schedule for the newsletter using a <a href="${anon_url('https://crontab.guru')}" target="_blank" rel="noreferrer">custom crontab</a>.
|
|
<a href="${anon_url('https://apscheduler.readthedocs.io/en/3.x/modules/triggers/cron.html#expression-types')}" target="_blank" rel="noreferrer">Click here</a> for a list of supported expressions.
|
|
</span>
|
|
</p>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="time_frame">Time Frame</label>
|
|
<div class="row">
|
|
<div class="col-md-5">
|
|
<div class="input-group newsletter-time_frame">
|
|
<span class="input-group-addon form-control btn-dark inactive">Last</span>
|
|
<input type="number" class="form-control" id="newsletter_config_time_frame" name="newsletter_config_time_frame" value="${newsletter['config']['time_frame']}">
|
|
<select class="form-control" id="newsletter_config_time_frame_units" name="newsletter_config_time_frame_units">
|
|
<option value="months" ${'selected' if newsletter['config']['time_frame_units'] == 'months' else ''}>months</option>
|
|
<option value="days" ${'selected' if newsletter['config']['time_frame_units'] == 'days' else ''}>days</option>
|
|
<option value="hours" ${'selected' if newsletter['config']['time_frame_units'] == 'hours' else ''}>hours</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<p class="help-block">Set the time frame to include in the newsletter.</p>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-12 modal-config-section">
|
|
<input type="hidden" id="newsletter_id" name="newsletter_id" value="${newsletter['id']}" />
|
|
<input type="hidden" id="agent_id" name="agent_id" value="${newsletter['agent_id']}" />
|
|
% for item in newsletter['config_options']:
|
|
% if item['input_type'] == 'help':
|
|
<div class="form-group">
|
|
<label>${item['label']}</label>
|
|
<p class="help-block">${item['description'] | n}</p>
|
|
</div>
|
|
% elif item['input_type'] == 'text' or item['input_type'] == 'password':
|
|
<div class="form-group">
|
|
<label for="${item['name']}">${item['label']}</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<input type="${item['input_type']}" class="form-control" id="${item['name']}" name="${item['name']}" value="${item['value']}" size="30" ${'readonly' if item.get('readonly') else ''}>
|
|
</div>
|
|
</div>
|
|
<p class="help-block">${item['description'] | n}</p>
|
|
</div>
|
|
% elif item['input_type'] == 'number':
|
|
<div class="form-group">
|
|
<label for="${item['name']}">${item['label']}</label>
|
|
<div class="row">
|
|
<div class="col-md-3">
|
|
<input type="${item['input_type']}" class="form-control" id="${item['name']}" name="${item['name']}" value="${item['value']}" size="30">
|
|
</div>
|
|
</div>
|
|
<p class="help-block">${item['description'] | n}</p>
|
|
</div>
|
|
% elif item['input_type'] == 'button':
|
|
<div class="form-group">
|
|
<label for="${item['name']}">${item['label']}</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<input type="button" class="btn btn-bright" id="${item['name']}" name="${item['name']}" value="${item['value']}">
|
|
</div>
|
|
</div>
|
|
<p class="help-block">${item['description'] | n}</p>
|
|
</div>
|
|
% elif item['input_type'] == 'checkbox':
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" data-id="${item['name']}" class="checkboxes" value="1" ${checked(item['value'])}> ${item['label']}
|
|
</label>
|
|
<p class="help-block">${item['description'] | n}</p>
|
|
<input type="hidden" id="${item['name']}" name="${item['name']}" value="${item['value']}">
|
|
</div>
|
|
% elif item['input_type'] == 'select':
|
|
<div class="form-group">
|
|
<label for="${item['name']}">${item['label']}</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<select class="form-control" id="${item['name']}" name="${item['name']}">
|
|
% for key, value in sorted(item['select_options'].items()):
|
|
% if key == item['value']:
|
|
<option value="${key}" selected>${value}</option>
|
|
% else:
|
|
<option value="${key}">${value}</option>
|
|
% endif
|
|
% endfor
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<p class="help-block">${item['description'] | n}</p>
|
|
</div>
|
|
% elif item['input_type'] == 'selectize':
|
|
<div class="form-group">
|
|
<label for="${item['name']}">${item['label']}</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<select class="form-control" id="${item['name']}" name="${item['name']}">
|
|
% if item['select_all']:
|
|
<option value="select-all">Select All</option>
|
|
<option value="remove-all">Remove All</option>
|
|
% endif
|
|
% if isinstance(item['select_options'], dict):
|
|
% for section, options in item['select_options'].items():
|
|
<optgroup label="${section}">
|
|
% for option in sorted(options, key=lambda x: x['text'].lower()):
|
|
<option value="${option['value']}">${option['text']}</option>
|
|
% endfor
|
|
</optgroup>
|
|
% endfor
|
|
% else:
|
|
% if item['select_all']:
|
|
<option value="border-all"></option>
|
|
% endif
|
|
% for option in sorted(item['select_options'], key=lambda x: x['text'].lower()):
|
|
<option value="${option['value']}">${option['text']}</option>
|
|
% endfor
|
|
% endif
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<p class="help-block">${item['description'] | n}</p>
|
|
</div>
|
|
% endif
|
|
% endfor
|
|
</div>
|
|
<div class="col-md-12 modal-config-section">
|
|
<div class="form-group">
|
|
<label for="id_name">Unique ID Name</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<input type="text" class="form-control" id="id_name" name="id_name" value="${newsletter['id_name']}" size="30">
|
|
</div>
|
|
</div>
|
|
<p class="help-block">
|
|
Optional: Enter a unique ID name to create a static URL to the <em>last sent scheduled newsletter</em> at <span class="inline-pre">${http_root}newsletter/id/<id_name></span>.
|
|
Only letters (a-z), numbers (0-9), underscores (_) and hyphens (-) are allowed. Leave blank to disable.<br>
|
|
Note: Test newsletters are not considered scheduled newsletters.
|
|
</p>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="friendly_name">Description</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<input type="text" class="form-control" id="friendly_name" name="friendly_name" value="${newsletter['friendly_name']}" size="30">
|
|
</div>
|
|
</div>
|
|
<p class="help-block">Optional: Enter a description to help identify this newsletter in the newsletters list.</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div role="tabpanel" class="tab-pane" id="tabs-newsletter_saving_sending">
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<label>Saving</label>
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" id="newsletter_config_save_only_checkbox" data-id="newsletter_config_save_only" class="checkboxes" value="1" ${checked(newsletter['config']['save_only'])}> Save HTML File Only
|
|
</label>
|
|
<p class="help-block">Enable to save the newsletter HTML file without sending it to any notification agent.</p>
|
|
<input type="hidden" id="newsletter_config_save_only" name="newsletter_config_save_only" value="${newsletter['config']['save_only']}">
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="newsletter_config_filename">HTML File Name</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<input type="text" class="form-control" id="newsletter_config_filename" name="newsletter_config_filename" value="${newsletter['config']['filename']}" size="30">
|
|
</div>
|
|
</div>
|
|
<p class="help-block">Optional: Enter the file name to use when saving the newsletter (ending with <span class="inline-pre">.html</span>). You may use any of the <a href="#newsletter-text-sub-modal" data-toggle="modal">newsletter text parameters</a>. Leave blank for default.</p>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-12 modal-config-section" id="newsletter_agent_options">
|
|
<label>Sending</label>
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" id="newsletter_config_formatted_checkbox" data-id="newsletter_config_formatted" class="checkboxes" value="1" ${checked(newsletter['config']['formatted'])}> Send Newsletter as an HTML Formatted Email
|
|
</label>
|
|
<p class="help-block">Enable to send the newsletter as an HTML formatted Email. Disable to only send a subject and body message to a different notification agent.</p>
|
|
<input type="hidden" id="newsletter_config_formatted" name="newsletter_config_formatted" value="${newsletter['config']['formatted']}">
|
|
</div>
|
|
<div class="form-group" id="email_notifier_select">
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" id="newsletter_config_threaded_checkbox" data-id="newsletter_config_threaded" class="checkboxes" value="1" ${checked(newsletter['config']['threaded'])}> Enable Grouped Email Thread
|
|
</label>
|
|
<p class="help-block">Enable to group this newsletter together in a single Email thread. Disable to send a new Email for each newsletter.</p>
|
|
<input type="hidden" id="newsletter_config_threaded" name="newsletter_config_threaded" value="${newsletter['config']['threaded']}">
|
|
</div>
|
|
<label for="newsletter_email_notifier_id">Email Notification Agent</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<select class="form-control" id="newsletter_email_notifier_id" name="newsletter_email_notifier_id">
|
|
% for notifier in email_notifiers:
|
|
<% selected = 'selected' if notifier['id'] == newsletter['email_config']['notifier_id'] else '' %>
|
|
% if notifier['friendly_name']:
|
|
<option value="${notifier['id']}" ${selected}>${notifier['agent_label']} (${notifier['id']} - ${notifier['friendly_name']})</option>
|
|
% elif notifier['id']:
|
|
<option value="${notifier['id']}" ${selected}>${notifier['agent_label']} (${notifier['id']})</option>
|
|
% else:
|
|
<option value="${notifier['id']}" ${selected}>${notifier['agent_label']}</option>
|
|
% endif
|
|
% endfor
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<p class="help-block">
|
|
Select an existing Email notification agent or enter a new configuration below.<br>
|
|
Note: Make sure HTML support is enabled for the Email notification agent.
|
|
</p>
|
|
</div>
|
|
<div class="form-group" id="other_notifier_select">
|
|
<label for="newsletter_config_notifier_id">Notification Agent</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<select class="form-control" id="newsletter_config_notifier_id" name="newsletter_config_notifier_id">
|
|
% for notifier in other_notifiers:
|
|
<% selected = 'selected' if notifier['id'] == newsletter['config']['notifier_id'] else '' %>
|
|
% if notifier['friendly_name']:
|
|
<option value="${notifier['id']}" ${selected}>${notifier['agent_label']} (${notifier['id']} - ${notifier['friendly_name']})</option>
|
|
% elif notifier['id']:
|
|
<option value="${notifier['id']}" ${selected}>${notifier['agent_label']} (${notifier['id']})</option>
|
|
% else:
|
|
<option value="${notifier['id']}" ${selected}>${notifier['agent_label']}</option>
|
|
% endif
|
|
% endfor
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<p class="help-block">
|
|
Select an existing notification agent where the subject and body text will be sent.<br>
|
|
Note: Self-hosted newsletters must be enabled under <a data-tab-destination="notifications" data-dismiss="modal" data-target="newsletter_self_hosted">Newsletters</a> to include a link to the newsletter.
|
|
</p>
|
|
</div>
|
|
<div id="newsletter-email-config">
|
|
% for item in newsletter['email_config_options']:
|
|
% if item['input_type'] == 'help':
|
|
<div class="form-group">
|
|
<label>${item['label']}</label>
|
|
<p class="help-block">${item['description'] | n}</p>
|
|
</div>
|
|
% elif item['input_type'] == 'text' or item['input_type'] == 'password':
|
|
<div class="form-group">
|
|
<label for="${item['name']}">${item['label']}</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<input type="${item['input_type']}" class="form-control" id="${item['name']}" name="${item['name']}" value="${item['value']}" size="30" ${'readonly' if item.get('readonly') else ''}>
|
|
</div>
|
|
</div>
|
|
<p class="help-block">${item['description'] | n}</p>
|
|
</div>
|
|
% elif item['input_type'] == 'number':
|
|
<div class="form-group">
|
|
<label for="${item['name']}">${item['label']}</label>
|
|
<div class="row">
|
|
<div class="col-md-3">
|
|
<input type="${item['input_type']}" class="form-control" id="${item['name']}" name="${item['name']}" value="${item['value']}" size="30">
|
|
</div>
|
|
</div>
|
|
<p class="help-block">${item['description'] | n}</p>
|
|
</div>
|
|
% elif item['input_type'] == 'button':
|
|
<div class="form-group">
|
|
<label for="${item['name']}">${item['label']}</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<input type="button" class="btn btn-bright" id="${item['name']}" name="${item['name']}" value="${item['value']}">
|
|
</div>
|
|
</div>
|
|
<p class="help-block">${item['description'] | n}</p>
|
|
</div>
|
|
% elif item['input_type'] == 'checkbox' and item['name'] != 'newsletter_email_html_support':
|
|
<div class="checkbox">
|
|
<label>
|
|
<input type="checkbox" data-id="${item['name']}" class="checkboxes" value="1" ${checked(item['value'])}> ${item['label']}
|
|
</label>
|
|
<p class="help-block">${item['description'] | n}</p>
|
|
<input type="hidden" id="${item['name']}" name="${item['name']}" value="${item['value']}">
|
|
</div>
|
|
% elif item['input_type'] == 'select':
|
|
<div class="form-group">
|
|
<label for="${item['name']}">${item['label']}</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<select class="form-control" id="${item['name']}" name="${item['name']}">
|
|
% for key, value in sorted(item['select_options'].items()):
|
|
% if isinstance(value, list):
|
|
<optgroup label="${key}">
|
|
% for option in sorted(value, key=lambda x: x['text'].lower()):
|
|
<option value="${option['value']}" ${'selected' if option['value'] == item['value'] else ''}>${option['text']}</option>
|
|
% endfor
|
|
</optgroup>
|
|
% else:
|
|
<option value="${key}" ${'selected' if key == item['value'] else ''}>${value}</option>
|
|
% endif
|
|
% endfor
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<p class="help-block">${item['description'] | n}</p>
|
|
</div>
|
|
% elif item['input_type'] == 'selectize':
|
|
<div class="form-group">
|
|
<label for="${item['name']}">${item['label']}</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<select class="form-control" id="${item['name']}" name="${item['name']}">
|
|
<option value="select-all">Select All</option>
|
|
<option value="remove-all">Remove All</option>
|
|
% if isinstance(item['select_options'], dict):
|
|
% for section, options in item['select_options'].items():
|
|
<optgroup label="${section}">
|
|
% for option in sorted(options, key=lambda x: x['text'].lower()):
|
|
<option value="${option['value']}">${option['text']}</option>
|
|
% endfor
|
|
</optgroup>
|
|
% endfor
|
|
% else:
|
|
<option value="border-all"></option>
|
|
% for option in sorted(item['select_options'], key=lambda x: x['text'].lower()):
|
|
<option value="${option['value']}">${option['text']}</option>
|
|
% endfor
|
|
% endif
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<p class="help-block">${item['description'] | n}</p>
|
|
</div>
|
|
% endif
|
|
% endfor
|
|
<input type="hidden" id="newsletter_email_html_support" name="newsletter_email_html_support" value="1">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div role="tabpanel" class="tab-pane" id="tabs-newsletter_text">
|
|
<label>Newsletter Text</label>
|
|
<p class="help-block">
|
|
Set the custom formatted text for each type of notification.
|
|
<a href="#newsletter-text-sub-modal" data-toggle="modal">Click here</a> for a list of available parameters which can be used.
|
|
</p>
|
|
<p class="help-block">
|
|
You can also add text modifiers to change the case or slice parameters with a list of items.
|
|
<a href="#notify-text-modifiers-modal" data-toggle="modal">Click here</a> to view usage information.
|
|
</p>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<div class="form-group">
|
|
<label for="subject">Subject</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<input type="text" class="form-control" id="subject" name="subject" value="${newsletter['subject']}" size="30">
|
|
</div>
|
|
</div>
|
|
<p class="help-block">
|
|
Enter a custom subject line for the newsletter. Leave blank for default.
|
|
</p>
|
|
</div>
|
|
<div class="form-group" id="newsletter_body">
|
|
<label for="body">Body</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<textarea class="form-control" id="body" name="body" data-autoresize>${newsletter['body']}</textarea>
|
|
</div>
|
|
</div>
|
|
<p class="help-block">
|
|
Enter a custom body line for the newsletter notification. Leave blank for default.
|
|
</p>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="message">Message</label>
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<textarea class="form-control" id="message" name="message" data-autoresize>${newsletter['message']}</textarea>
|
|
</div>
|
|
</div>
|
|
<p class="help-block">
|
|
Enter a custom message to include on the newsletter.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div role="tabpanel" class="tab-pane" id="tabs-test_newsletter">
|
|
<label>Preview Newsletter</label>
|
|
<p class="help-block">
|
|
Preview the ${newsletter['agent_label']} newsletter.
|
|
</p>
|
|
<div class="form-group">
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<input type="button" class="btn btn-bright" id="preview_newsletter" name="preview_newsletter" value="Preview ${newsletter['agent_label']} Newsletter">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<label>Test Newsletter</label>
|
|
<p class="help-block">
|
|
Test if the ${newsletter['agent_label']} newsletter is working. Check the <a href="logs">logs</a> for troubleshooting.
|
|
</p>
|
|
<p class="help-block">
|
|
Warning: This will send an actual newsletter to your notification agent!
|
|
</p>
|
|
<div class="form-group">
|
|
<div class="row">
|
|
<div class="col-md-12">
|
|
<input type="button" class="btn btn-bright" id="test_newsletter" name="test_newsletter" value="Test ${newsletter['agent_label']} Newsletter">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<input type="button" id="delete-newsletter-item" class="btn btn-danger btn-edit" style="float:left;" value="Delete">
|
|
<input type="button" id="duplicate-newsletter-item" class="btn btn-dark btn-edit" style="float:left;" value="Duplicate">
|
|
<input type="button" id="save-newsletter-item" class="btn btn-bright" value="Save">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script src="${http_root}js/jquery-cron-min.js"></script>
|
|
<script>
|
|
|
|
$('#newsletter-config-modal').unbind('hidden.bs.modal');
|
|
|
|
var cron_widget = $('#cron-widget').cron({
|
|
initial: '0 0 * * 0',
|
|
classes: 'form-control cron-select',
|
|
onChange: function() {
|
|
$("#cron_value").val($(this).cron('value'));
|
|
}
|
|
});
|
|
|
|
if (${newsletter['config']['custom_cron']}) {
|
|
$('#cron_value').val('${newsletter['cron'] | n}');
|
|
} else {
|
|
try {
|
|
cron_widget.cron('value', '${newsletter['cron']}');
|
|
} catch (e) {}
|
|
}
|
|
|
|
function toggleCustomCron() {
|
|
if ($('#custom_cron').val() === '1'){
|
|
$('#cron-widget').hide();
|
|
$('#cron_value').show();
|
|
$('#simple_cron_message').hide();
|
|
$('#custom_cron_message').show();
|
|
} else {
|
|
$('#cron-widget').show();
|
|
$('#cron_value').hide();
|
|
$('#simple_cron_message').show();
|
|
$('#custom_cron_message').hide();
|
|
}
|
|
}
|
|
toggleCustomCron();
|
|
|
|
$('#custom_cron').change(function () {
|
|
toggleCustomCron();
|
|
});
|
|
|
|
function validateFilename() {
|
|
var filename = $('#newsletter_config_filename').val();
|
|
if (filename !== '' && !(filename.endsWith('.html'))) {
|
|
showMsg('<i class="fa fa-times"></i> Failed to save newsletter. Invalid file name.', false, true, 5000, true);
|
|
return false;
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
function validateIDName() {
|
|
var id_name = $('#id_name').val();
|
|
if (/^[a-zA-Z0-9_-]*$/.test(id_name)) {
|
|
return true;
|
|
} else {
|
|
showMsg('<i class="fa fa-times"></i> Failed to save newsletter. Invalid unique ID name.', false, true, 5000, true);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
var $incl_libraries = $('#newsletter_config_incl_libraries').selectize({
|
|
plugins: ['remove_button'],
|
|
maxItems: null,
|
|
render: {
|
|
option: function(item) {
|
|
if (item.value.endsWith('-all')) {
|
|
return '<div class="' + item.value + '">' + item.text + '</div>'
|
|
}
|
|
return '<div>' + item.text + '</div>';
|
|
}
|
|
},
|
|
onItemAdd: function(value) {
|
|
if (value === 'select-all') {
|
|
var all_keys = $.map(this.options, function(option){
|
|
return option.value.endsWith('-all') ? null : option.value;
|
|
});
|
|
this.setValue(all_keys);
|
|
} else if (value === 'remove-all') {
|
|
this.clear();
|
|
this.refreshOptions();
|
|
this.positionDropdown();
|
|
}
|
|
}
|
|
});
|
|
var incl_libraries = $incl_libraries[0].selectize;
|
|
incl_libraries.setValue(${json.dumps(next((c['value'] for c in newsletter['config_options'] if c['name'] == 'newsletter_config_incl_libraries'), [])) | n});
|
|
|
|
initConfigCheckbox('#newsletter_config_save_only_checkbox', '#newsletter_agent_options', true);
|
|
|
|
function toggleEmailSelect () {
|
|
if ($('#newsletter_config_formatted_checkbox').is(':checked')) {
|
|
$('#newsletter_body').hide();
|
|
$('#email_notifier_select').show();
|
|
$('#other_notifier_select').hide();
|
|
toggleNewEmailConfig();
|
|
} else {
|
|
$('#newsletter_body').show();
|
|
$('#email_notifier_select').hide();
|
|
$('#other_notifier_select').show();
|
|
$('#newsletter-email-config').hide();
|
|
}
|
|
}
|
|
toggleEmailSelect();
|
|
|
|
$('#newsletter_config_formatted_checkbox').change(function () {
|
|
toggleEmailSelect();
|
|
});
|
|
|
|
function toggleNewEmailConfig () {
|
|
if ($('#newsletter_config_formatted_checkbox').is(':checked') && $('#newsletter_email_notifier_id').val() === '0') {
|
|
$('#newsletter-email-config').show();
|
|
} else {
|
|
$('#newsletter-email-config').hide();
|
|
}
|
|
}
|
|
toggleNewEmailConfig();
|
|
|
|
$('#newsletter_email_notifier_id').change(function () {
|
|
toggleNewEmailConfig();
|
|
});
|
|
|
|
var REGEX_EMAIL = '([a-z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+/=?^_`{|}~-]+)*@' +
|
|
'(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)';
|
|
var $email_selectors = $('#newsletter_email_to, #newsletter_email_cc, #newsletter_email_bcc').selectize({
|
|
plugins: ['remove_button'],
|
|
maxItems: null,
|
|
searchField: ['text', 'value'],
|
|
render: {
|
|
item: function(item, escape) {
|
|
return '<div>' +
|
|
(item.text ? '<span class="item-text">' + escape(item.text) + '</span>' : '') +
|
|
(item.value ? '<span class="item-value">' + escape(item.value) + '</span>' : '') +
|
|
'</div>';
|
|
},
|
|
option: function(item, escape) {
|
|
var label = item.text || item.value;
|
|
var caption = item.text ? item.value : null;
|
|
if (item.value.endsWith('-all')) {
|
|
return '<div class="' + item.value + '">' + escape(label) + '</div>'
|
|
}
|
|
return '<div>' +
|
|
escape(label) +
|
|
(caption ? '<span class="caption">' + escape(caption) + '</span>' : '') +
|
|
'</div>';
|
|
}
|
|
},
|
|
onItemAdd: function(value) {
|
|
if (value === 'select-all') {
|
|
var all_keys = $.map(this.options, function(option){
|
|
return option.value.endsWith('-all') ? null : option.value;
|
|
});
|
|
this.setValue(all_keys);
|
|
} else if (value === 'remove-all') {
|
|
this.clear();
|
|
this.refreshOptions();
|
|
this.positionDropdown();
|
|
}
|
|
},
|
|
createFilter: function(input) {
|
|
var match, regex;
|
|
|
|
// email@address.com
|
|
regex = new RegExp('^' + REGEX_EMAIL + '$', 'i');
|
|
match = input.match(regex);
|
|
if (match) return !this.options.hasOwnProperty(match[0]);
|
|
|
|
// user <email@address.com>
|
|
regex = new RegExp('^([^<]*)\<' + REGEX_EMAIL + '\>$', 'i');
|
|
match = input.match(regex);
|
|
if (match) return !this.options.hasOwnProperty(match[2]);
|
|
|
|
return false;
|
|
},
|
|
create: function(input) {
|
|
if ((new RegExp('^' + REGEX_EMAIL + '$', 'i')).test(input)) {
|
|
return {value: input};
|
|
}
|
|
var match = input.match(new RegExp('^([^<]*)\<' + REGEX_EMAIL + '\>$', 'i'));
|
|
if (match) {
|
|
return {
|
|
value : match[2],
|
|
text : $.trim(match[1])
|
|
};
|
|
}
|
|
return false;
|
|
}
|
|
});
|
|
var email_to = $email_selectors[0].selectize;
|
|
var email_cc = $email_selectors[1].selectize;
|
|
var email_bcc = $email_selectors[2].selectize;
|
|
email_to.setValue(${json.dumps(next((c['value'] for c in newsletter['email_config_options'] if c['name'] == 'newsletter_email_to'), [])) | n});
|
|
email_cc.setValue(${json.dumps(next((c['value'] for c in newsletter['email_config_options'] if c['name'] == 'newsletter_email_cc'), [])) | n});
|
|
email_bcc.setValue(${json.dumps(next((c['value'] for c in newsletter['email_config_options'] if c['name'] == 'newsletter_email_bcc'), [])) | n});
|
|
|
|
function reloadModal() {
|
|
$.ajax({
|
|
url: 'get_newsletter_config_modal',
|
|
data: { newsletter_id: '${newsletter["id"]}' },
|
|
cache: false,
|
|
async: true,
|
|
complete: function (xhr, status) {
|
|
$('#newsletter-config-modal').html(xhr.responseText);
|
|
}
|
|
});
|
|
}
|
|
|
|
function saveCallback(jqXHR) {
|
|
if (jqXHR) {
|
|
var result = $.parseJSON(jqXHR.responseText);
|
|
var msg = result.message;
|
|
if (result.result == 'success') {
|
|
showMsg('<i class="fa fa-check"></i> ' + msg, false, true, 5000)
|
|
} else {
|
|
showMsg('<i class="fa fa-times"></i> ' + msg, false, true, 5000, true)
|
|
}
|
|
}
|
|
|
|
getNewslettersTable();
|
|
toggleRevealTokens();
|
|
}
|
|
|
|
function deleteCallback() {
|
|
$('#newsletter-config-modal').modal('hide');
|
|
getNewslettersTable();
|
|
}
|
|
|
|
function duplicateCallback(result) {
|
|
// Set new newsletter id
|
|
$('#newsletter_id').val(result.newsletter_id);
|
|
// Clear friendly name
|
|
$('#friendly_name').val("");
|
|
|
|
saveNewsletter();
|
|
|
|
$('#newsletter-config-modal').on('hidden.bs.modal', function () {
|
|
loadNewsletterConfig(result.newsletter_id);
|
|
});
|
|
$('#newsletter-config-modal').modal('hide');
|
|
}
|
|
|
|
function saveNewsletter() {
|
|
// Trim all text inputs before saving
|
|
$('input[type=text]').val(function(_, value) {
|
|
return $.trim(value);
|
|
});
|
|
// Make sure simple cron value is set
|
|
if ($('#custom_cron').val() === '0'){
|
|
$("#cron_value").val(cron_widget.cron('value'));
|
|
}
|
|
if (validateFilename() && validateIDName()){
|
|
doAjaxCall('set_newsletter_config', $(this), 'tabs', true, true, saveCallback);
|
|
}
|
|
}
|
|
|
|
$('#delete-newsletter-item').click(function () {
|
|
var msg = 'Are you sure you want to delete this <strong>${newsletter["agent_label"]}</strong> newsletter?';
|
|
var url = 'delete_newsletter';
|
|
confirmAjaxCall(url, msg, { newsletter_id: '${newsletter["id"]}' }, null, deleteCallback);
|
|
});
|
|
|
|
$('#duplicate-newsletter-item').click(function() {
|
|
var msg = 'Are you sure you want to duplicate this <strong>${newsletter["agent_label"]}</strong> newsletter?';
|
|
if ($('#set_newsletter_config .form-control[id$=_password]').val()) {
|
|
msg += '<br><br>Note: Saved passwords will not be copied over and must be re-entered.';
|
|
}
|
|
var url = 'add_newsletter_config';
|
|
confirmAjaxCall(url, msg, { agent_id: '${newsletter["agent_id"]}' }, null, duplicateCallback);
|
|
});
|
|
|
|
$('#save-newsletter-item').click(function () {
|
|
saveNewsletter();
|
|
});
|
|
|
|
$('#preview_newsletter').click(function () {
|
|
doAjaxCall('set_newsletter_config', $(this), 'tabs', true, false, previewNewsletter);
|
|
});
|
|
|
|
$('#test_newsletter').click(function () {
|
|
doAjaxCall('set_newsletter_config', $(this), 'tabs', true, false, sendTestNewsletter);
|
|
});
|
|
|
|
function previewNewsletter() {
|
|
showMsg('<i class="fa fa-check"></i> Check pop-up blocker if no response.', false, true, 2000);
|
|
window.open('newsletter_preview?newsletter_id=' + $('#newsletter_id').val());
|
|
}
|
|
|
|
function sendTestNewsletter() {
|
|
showMsg('<i class="fa fa-refresh fa-spin"></i> Sending Newsletter', false);
|
|
$.ajax({
|
|
url: 'send_newsletter',
|
|
data: {
|
|
newsletter_id: $('#newsletter_id').val(),
|
|
notify_action: 'test'
|
|
},
|
|
cache: false,
|
|
async: true,
|
|
success: function (data) {
|
|
if (data.result === 'success') {
|
|
showMsg('<i class="fa fa-check"></i> ' + data.message, false, true, 5000);
|
|
} else {
|
|
showMsg('<i class="fa fa-exclamation-circle"></i> ' + data.message, false, true, 5000, true);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
$("${', '.join(['#' + c['name'] for c in newsletter['config_options'] if c.get('refresh')])}").on('change', function () {
|
|
// Reload modal to update certain fields
|
|
doAjaxCall('set_newsletter_config', $(this), 'tabs', true, false, reloadModal);
|
|
return false;
|
|
});
|
|
|
|
// Never send checkbox values directly, always substitute value in hidden input.
|
|
$('.checkboxes').click(function () {
|
|
var configToggle = $(this).data('id');
|
|
if ($(this).is(':checked')) {
|
|
$('#'+configToggle).val(1);
|
|
} else {
|
|
$('#'+configToggle).val(0);
|
|
}
|
|
});
|
|
|
|
// auto resizing textarea for custom notification message body
|
|
$('textarea[data-autoresize]').each(function () {
|
|
var modal_body = $(this).closest('.modal-body');
|
|
var offset = this.offsetHeight - this.clientHeight;
|
|
var resizeTextarea = function (el) {
|
|
var modal_offset = modal_body.scrollTop();
|
|
$(el).css('height', 'auto').css('height', el.scrollHeight + offset);
|
|
modal_body.scrollTop(modal_offset);
|
|
};
|
|
$(this).on('focus keyup input', function () { resizeTextarea(this); }).removeAttr('data-autoresize');
|
|
});
|
|
|
|
toggleRevealTokens();
|
|
</script>
|
|
% else:
|
|
<div class="modal-dialog" role="document">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><i class="fa fa-remove"></i></button>
|
|
<h4 class="modal-title" id="newsletter-config-modal-header">Error</h4>
|
|
</div>
|
|
<div class="modal-body" style="text-align: center">
|
|
<strong>
|
|
<i class="fa fa-exclamation-circle"></i> Failed to retrieve newsletter configuration. Check the <a href="logs">logs</a> for more info.
|
|
</strong>
|
|
</div>
|
|
<div class="modal-footer">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
% endif
|