2021-01-29 09:49:05 +00:00
{% extends 'base.html' %}
{% block content %}
2022-04-09 10:15:34 +00:00
{% from '_helpers.jinja' import render_field, render_checkbox_field, render_button %}
2021-12-04 14:23:23 +00:00
{% from '_common_fields.jinja' import render_common_settings_form %}
2021-08-12 10:05:59 +00:00
< script type = "text/javascript" src = "{{url_for('static_content', group='js', filename='tabs.js')}}" defer > < / script >
2022-04-05 16:04:26 +00:00
< script >
2022-04-07 16:18:23 +00:00
const notification_base_url="{{url_for('ajax_callback_send_notification_test')}}";
2022-05-23 21:44:51 +00:00
const watch_visual_selector_data_url="{{url_for('static_content', group='visual_selector_data', filename=uuid)}}";
const screenshot_url="{{url_for('static_content', group='screenshot', filename=uuid)}}";
2022-04-07 16:18:23 +00:00
{% if emailprefix %}
const email_notification_prefix=JSON.parse('{{ emailprefix|tojson }}');
{% endif %}
2022-05-23 21:44:51 +00:00
2022-04-05 16:04:26 +00:00
< / script >
2022-05-06 21:40:32 +00:00
< script type = "text/javascript" src = "{{url_for('static_content', group='js', filename='watch-settings.js')}}" defer > < / script >
2022-04-07 16:18:23 +00:00
< script type = "text/javascript" src = "{{url_for('static_content', group='js', filename='notifications.js')}}" defer > < / script >
2022-05-23 21:44:51 +00:00
< script type = "text/javascript" src = "{{url_for('static_content', group='js', filename='visual-selector.js')}}" defer > < / script >
< script type = "text/javascript" src = "{{url_for('static_content', group='js', filename='limit.js')}}" defer > < / script >
2021-08-12 10:05:59 +00:00
2021-06-21 06:21:05 +00:00
< div class = "edit-form monospaced-textarea" >
2021-08-12 10:05:59 +00:00
2022-04-02 12:49:32 +00:00
< div class = "tabs collapsable" >
2021-08-12 10:05:59 +00:00
< ul >
< li class = "tab" id = "default-tab" > < a href = "#general" > General< / a > < / li >
2021-12-29 22:18:29 +00:00
< li class = "tab" > < a href = "#request" > Request< / a > < / li >
2022-05-23 21:44:51 +00:00
< li class = "tab" > < a id = "visualselector-tab" href = "#visualselector" > Visual Selector< / a > < / li >
2021-12-29 22:37:04 +00:00
< li class = "tab" > < a href = "#filters-and-triggers" > Filters & Triggers< / a > < / li >
2021-08-12 10:05:59 +00:00
< li class = "tab" > < a href = "#notifications" > Notifications< / a > < / li >
< / ul >
< / div >
< div class = "box-wrap inner" >
< form class = "pure-form pure-form-stacked"
action="{{ url_for('edit_page', uuid=uuid, next = request.args.get('next') ) }}" method="POST">
2022-03-21 21:54:27 +00:00
< input type = "hidden" name = "csrf_token" value = "{{ csrf_token() }}" / >
2021-08-12 10:05:59 +00:00
< div class = "tab-pane-inner" id = "general" >
< fieldset >
< div class = "pure-control-group" >
{{ render_field(form.url, placeholder="https://...", required=true, class="m-d") }}
2022-01-12 17:18:40 +00:00
< span class = "pure-form-message-inline" > Some sites use JavaScript to create the content, for this you should < a href = "https://github.com/dgtlmoon/changedetection.io/wiki/Fetching-pages-with-WebDriver" > use the Chrome/WebDriver Fetcher< / a > < / span >
2021-08-12 10:05:59 +00:00
< / div >
< div class = "pure-control-group" >
{{ render_field(form.title, class="m-d") }}
< / div >
< div class = "pure-control-group" >
{{ render_field(form.tag) }}
2021-08-15 20:16:18 +00:00
< span class = "pure-form-message-inline" > Organisational tag/group name used in the main listing page< / span >
2021-08-12 10:05:59 +00:00
< / div >
< div class = "pure-control-group" >
2022-04-24 14:56:32 +00:00
{{ render_field(form.time_between_check, class="time-check-widget") }}
2022-04-19 19:43:07 +00:00
{% if has_empty_checktime %}
2021-08-12 10:05:59 +00:00
< span class = "pure-form-message-inline" > Currently using the < a
href="{{ url_for('settings_page', uuid=uuid) }}">default global settings< / a > , change to another value if you want to be specific.< / span >
{% else %}
< span class = "pure-form-message-inline" > Set to blank to use the < a
href="{{ url_for('settings_page', uuid=uuid) }}">default global settings< / a > .< / span >
{% endif %}
< / div >
2021-12-29 22:31:53 +00:00
< div class = "pure-control-group" >
2022-04-09 10:15:34 +00:00
{{ render_checkbox_field(form.extract_title_as_title) }}
2021-12-29 22:31:53 +00:00
< / div >
< / fieldset >
< / div >
< div class = "tab-pane-inner" id = "request" >
2022-05-08 18:35:36 +00:00
< div class = "pure-control-group inline-radio" >
2022-04-24 12:40:53 +00:00
{{ render_field(form.fetch_backend, class="fetch-backend") }}
2021-08-12 10:51:43 +00:00
< span class = "pure-form-message-inline" >
2021-12-29 22:37:04 +00:00
< p > Use the < strong > Basic< / strong > method (default) where your watched site doesn't need Javascript to render.< / p >
2021-10-06 07:27:41 +00:00
< p > The < strong > Chrome/Javascript< / strong > method requires a network connection to a running WebDriver+Chrome server, set by the ENV var 'WEBDRIVER_URL'. < / p >
2021-08-12 10:51:43 +00:00
< / span >
< / div >
2022-05-08 18:35:36 +00:00
{% if form.proxy %}
< div class = "pure-control-group inline-radio" >
{{ render_field(form.proxy, class="fetch-backend-proxy") }}
< span class = "pure-form-message-inline" >
Choose a proxy for this watch
< / span >
< / div >
{% endif %}
2022-05-18 12:09:39 +00:00
< fieldset id = "webdriver-override-options" >
2022-05-17 16:35:33 +00:00
< div class = "pure-form-message-inline" >
< strong > If you're having trouble waiting for the page to be fully rendered (text missing etc), try increasing the 'wait' time here.< / strong >
< br / >
This will wait < i > n< / i > seconds before extracting the text.
< / div >
< div class = "pure-control-group" >
{{ render_field(form.webdriver_delay) }}
< / div >
{% if using_global_webdriver_wait %}
< div class = "pure-form-message-inline" >
< strong > Using the current global default settings< / strong >
< / div >
{% endif %}
< / fieldset >
2022-05-06 21:40:32 +00:00
< fieldset class = "pure-group" id = "requests-override-options" >
< div class = "pure-form-message-inline" >
2022-03-06 16:23:21 +00:00
< strong > Request override is currently only used by the < i > Basic fast Plaintext/HTTP Client< / i > method.< / strong >
2022-05-06 21:40:32 +00:00
< / div >
2022-03-06 16:23:21 +00:00
< div class = "pure-control-group" >
{{ render_field(form.method) }}
< / div >
< div class = "pure-control-group" >
{{ render_field(form.headers, rows=5, placeholder="Example
2021-12-29 22:18:29 +00:00
Cookie: foobar
User-Agent: wonderbra 1.0") }}
2022-03-06 16:23:21 +00:00
< / div >
< div class = "pure-control-group" >
{{ render_field(form.body, rows=5, placeholder="Example
2021-12-29 22:18:29 +00:00
{
\"name\":\"John\",
\"age\":30,
\"car\":null
}") }}
2022-03-06 16:23:21 +00:00
< / div >
2022-03-21 22:03:54 +00:00
< div >
2022-04-09 10:15:34 +00:00
{{ render_checkbox_field(form.ignore_status_codes) }}
2022-03-21 22:03:54 +00:00
< / div >
2022-03-06 16:23:21 +00:00
< / fieldset >
< br / >
2021-12-29 22:18:29 +00:00
< / div >
2021-09-17 16:37:26 +00:00
< div class = "tab-pane-inner" id = "notifications" >
2022-01-10 16:38:04 +00:00
< strong > Note: < i > These settings override the global settings for this watch.< / i > < / strong >
2021-10-05 16:15:36 +00:00
< fieldset >
< div class = "field-group" >
2022-04-07 16:18:23 +00:00
{{ render_common_settings_form(form, current_base_url, emailprefix) }}
2021-10-05 16:15:36 +00:00
< / div >
< / fieldset >
2021-05-27 13:55:05 +00:00
< / div >
2021-09-17 16:37:26 +00:00
2021-12-29 22:37:04 +00:00
< div class = "tab-pane-inner" id = "filters-and-triggers" >
2022-05-18 12:09:39 +00:00
< div class = "pure-control-group" >
2022-02-23 09:49:25 +00:00
< strong > Pro-tips:< / strong > < br / >
< ul >
< li >
Use the preview page to see your filters and triggers highlighted.
< / li >
< li >
Some sites use JavaScript to create the content, for this you should < a href = "https://github.com/dgtlmoon/changedetection.io/wiki/Fetching-pages-with-WebDriver" > use the Chrome/WebDriver Fetcher< / a >
< / li >
< / ul >
< / div >
2021-08-12 10:05:59 +00:00
< div class = "pure-control-group" >
{{ render_field(form.css_filter, placeholder=".class-name or #some-id, or other CSS selector rule.",
class="m-d") }}
< span class = "pure-form-message-inline" >
2021-07-11 12:07:39 +00:00
< ul >
< li > CSS - Limit text to this CSS rule, only text matching this CSS rule is included.< / li >
2022-03-13 11:00:45 +00:00
< li > JSON - Limit text to this JSON rule, using < a href = "https://pypi.org/project/jsonpath-ng/" > JSONPath< / a > , prefix with < code > "json:"< / code > , use < code > json:$< / code > to force re-formatting if required, < a
2021-08-12 10:05:59 +00:00
href="https://jsonpath.com/" target="new">test your JSONPath here< / a > < / li >
2022-05-10 15:15:41 +00:00
< li > XPath - Limit text to this XPath rule, simply start with a forward-slash, example < code > //*[contains(@class, 'sametext')]< / code > or < code > xpath://*[contains(@class, 'sametext')]< / code > , < a
2022-01-05 16:58:07 +00:00
href="http://xpather.com/" target="new">test your XPath here< / a > < / li >
2021-07-11 12:07:39 +00:00
< / ul >
2022-01-05 16:58:07 +00:00
Please be sure that you thoroughly understand how to write CSS or JSONPath, XPath selector rules before filing an issue on GitHub! < a
2021-08-12 10:05:59 +00:00
href="https://github.com/dgtlmoon/changedetection.io/wiki/CSS-Selector-help">here for more CSS selector help< / a > .< br / >
2021-06-15 04:13:01 +00:00
< / span >
2021-08-12 10:05:59 +00:00
< / div >
2022-05-18 11:59:17 +00:00
< div class = "pure-control-group" >
2022-03-12 12:29:30 +00:00
{{ render_field(form.subtractive_selectors, rows=5, placeholder="header
footer
nav
.stockticker") }}
< span class = "pure-form-message-inline" >
< ul >
< li > Remove HTML element(s) by CSS selector before text conversion. < / li >
< li > Add multiple elements or CSS selectors per line to ignore multiple parts of the HTML. < / li >
< / ul >
< / span >
2022-05-18 11:59:17 +00:00
< / div >
2021-08-12 10:05:59 +00:00
< fieldset class = "pure-group" >
{{ render_field(form.ignore_text, rows=5, placeholder="Some text to ignore in a line
/some.regex\d{2}/ for case-INsensitive regex
") }}
< span class = "pure-form-message-inline" >
2022-01-05 19:42:45 +00:00
< ul >
< li > Each line processed separately, any line matching will be ignored (removed before creating the checksum)< / li >
2022-03-13 11:00:45 +00:00
< li > Regular Expression support, wrap the line in forward slash < code > /regex/< / code > < / li >
2022-01-05 19:42:45 +00:00
< li > Changing this will affect the comparison checksum which may trigger an alert< / li >
2022-02-23 09:49:25 +00:00
< li > Use the preview/show current tab to see ignores< / li >
2022-01-05 19:42:45 +00:00
< / ul >
2021-06-21 07:17:22 +00:00
< / span >
2021-02-26 19:07:26 +00:00
< / fieldset >
2021-08-16 11:13:17 +00:00
< fieldset >
< div class = "pure-control-group" >
{{ render_field(form.trigger_text, rows=5, placeholder="Some text to wait for in a line
/some.regex\d{2}/ for case-INsensitive regex
2022-01-09 13:36:07 +00:00
") }}
< span class = "pure-form-message-inline" >
< ul >
< li > Text to wait for before triggering a change/notification, all text and regex are tested < i > case-insensitive< / i > .< / li >
< li > Trigger text is processed from the result-text that comes out of any CSS/JSON Filters for this watch< / li >
2022-03-23 19:55:46 +00:00
< li > Each line is processed separately (think of each line as "OR")< / li >
2022-03-13 11:00:45 +00:00
< li > Note: Wrap in forward slash / to use regex example: < code > /foo\d/< / code > < / li >
2022-01-09 13:36:07 +00:00
< / ul >
< / span >
2021-08-16 11:13:17 +00:00
< / div >
< / fieldset >
2022-06-06 14:57:50 +00:00
< fieldset >
< div class = "pure-control-group" >
2022-06-15 20:56:43 +00:00
{{ render_field(form.text_should_not_be_present, rows=5, placeholder="For example: Out of stock
Sold out
Not in stock
Unavailable") }}
< span class = "pure-form-message-inline" >
< ul >
< li > Block change-detection while this text is on the page, all text and regex are tested < i > case-insensitive< / i > , good for waiting for when a product is available again< / li >
< li > Block text is processed from the result-text that comes out of any CSS/JSON Filters for this watch< / li >
< li > All lines here must not exist (think of each line as "OR")< / li >
< li > Note: Wrap in forward slash / to use regex example: < code > /foo\d/< / code > < / li >
< / ul >
< / span >
< / div >
< / fieldset >
< fieldset >
< div class = "pure-control-group" >
2022-06-06 16:26:47 +00:00
{{ render_field(form.extract_text, rows=5, placeholder="\d+ online") }}
2022-06-06 14:57:50 +00:00
< span class = "pure-form-message-inline" >
< ul >
< li > Extracts text in the final output after other filters using regular expressions, for example < code > \d+ online< / code > < / li >
< li > One line per regular-expression.< / li >
< / ul >
< / span >
< / div >
< / fieldset >
2021-06-21 06:21:05 +00:00
< / div >
2021-12-29 22:37:04 +00:00
2022-05-23 21:44:51 +00:00
< div class = "tab-pane-inner visual-selector-ui" id = "visualselector" >
< img id = "beta-logo" src = "{{url_for('static_content', group='images', filename='beta-logo.png')}}" >
< fieldset >
< div class = "pure-control-group" >
{% if visualselector_enabled %}
{% if visualselector_data_is_ready %}
< div id = "selector-header" >
< a id = "clear-selector" class = "pure-button button-secondary button-xsmall" style = "font-size: 70%" > Clear selection< / a >
< i class = "fetching-update-notice" style = "font-size: 80%;" > One moment, fetching screenshot and element information..< / i >
< / div >
< div id = "selector-wrapper" >
<!-- request the screenshot and get the element offset info ready -->
<!-- use img src ready load to know everything is ready to map out -->
<!-- @todo: maybe something interesting like a field to select 'elements that contain text... and their parents n' -->
< img id = "selector-background" / >
< canvas id = "selector-canvas" > < / canvas >
< / div >
< div id = "selector-current-xpath" style = "overflow-x: hidden" > < strong > Currently:< / strong > < span class = "text" > Loading...< / span > < / div >
< span class = "pure-form-message-inline" >
< p > < span style = "font-weight: bold" > Beta!< / span > The Visual Selector is new and there may be minor bugs, please report pages that dont work, help us to improve this software!< / p >
< / span >
{% else %}
< span class = "pure-form-message-inline" > Screenshot and element data is not available or not yet ready.< / span >
{% endif %}
{% else %}
< span class = "pure-form-message-inline" >
< p > Sorry, this functionality only works with Playwright/Chrome enabled watches.< / p >
< p > Enable the Playwright Chrome fetcher, or alternatively try our < a href = "https://lemonade.changedetection.io/start" > very affordable subscription based service< / a > .< / p >
< p > This is because Selenium/WebDriver can not extract full page screenshots reliably.< / p >
< / span >
{% endif %}
< / div >
< / fieldset >
< / div >
2021-08-12 10:05:59 +00:00
< div id = "actions" >
< div class = "pure-control-group" >
2021-02-26 19:07:26 +00:00
2022-02-23 09:49:25 +00:00
{{ render_button(form.save_button) }} {{ render_button(form.save_and_preview_button) }}
2022-05-20 14:27:51 +00:00
< a href = "{{url_for('form_delete', uuid=uuid)}}"
2021-08-12 10:05:59 +00:00
class="pure-button button-small button-error ">Delete< / a >
2022-06-08 16:32:25 +00:00
< a href = "{{url_for('scrub_watch', uuid=uuid)}}"
class="pure-button button-small button-error ">Scrub< / a >
2022-05-20 14:27:51 +00:00
< a href = "{{url_for('form_clone', uuid=uuid)}}"
2021-08-26 20:10:17 +00:00
class="pure-button button-small ">Create Copy< / a >
2021-08-12 10:05:59 +00:00
< / div >
2021-05-08 01:29:41 +00:00
< / div >
2021-08-12 10:05:59 +00:00
< / form >
< / div >
2021-01-29 09:49:05 +00:00
< / div >
{% endblock %}