2025-06-03 08:17:19 +00:00
{%- extends 'base.html' -%}
{%- block content -%}
{%- from '_helpers.html' import render_simple_field, render_field, render_nolabel_field, sort_by_title -%}
2023-04-30 08:38:50 +00:00
< script src = "{{url_for('static_content', group='js', filename='jquery-3.6.0.min.js')}}" > < / script >
< script src = "{{url_for('static_content', group='js', filename='watch-overview.js')}}" defer > < / script >
2025-03-26 16:06:24 +00:00
< script > let nowtimeserver = { { now _time _server } } ; < / script >
2025-07-09 13:47:30 +00:00
< script > let favicon _baseURL = "{{ url_for('static_content', group='favicon', filename=" PLACEHOLDER ")}}" ; < / script >
2025-06-03 08:17:19 +00:00
< script >
// Initialize Feather icons after the page loads
document.addEventListener('DOMContentLoaded', function() {
feather.replace();
});
< / script >
2025-03-26 16:06:24 +00:00
< style >
.checking-now .last-checked {
background-image: linear-gradient(to bottom, transparent 0%, rgba(0,0,0,0.05) 40%, rgba(0,0,0,0.1) 100%);
background-size: 0 100%;
background-repeat: no-repeat;
transition: background-size 0.9s ease
}
< / style >
2025-06-11 07:43:03 +00:00
< div class = "box" id = "form-quick-watch-add" >
2021-01-27 11:39:46 +00:00
2025-03-18 09:40:22 +00:00
< form class = "pure-form" action = "{{ url_for('ui.ui_views.form_quick_watch_add', tag=active_tag_uuid) }}" method = "POST" id = "new-watch-form" >
2023-04-29 20:29:57 +00:00
< input type = "hidden" name = "csrf_token" value = "{{ csrf_token() }}" >
2021-01-28 17:38:47 +00:00
< fieldset >
2025-06-11 07:43:03 +00:00
< legend > Add a new web page change detection watch< / legend >
2022-07-28 10:13:26 +00:00
< div id = "watch-add-wrapper-zone" >
2023-11-28 17:11:11 +00:00
{{ render_nolabel_field(form.url, placeholder="https://...", required=true) }}
{{ render_nolabel_field(form.watch_submit_button, title="Watch this URL!" ) }}
{{ render_nolabel_field(form.edit_and_watch_submit_button, title="Edit first then Watch") }}
2022-07-28 10:13:26 +00:00
< / div >
2025-06-11 07:43:03 +00:00
< div id = "watch-group-tag" >
{{ render_field(form.tags, value=active_tag.title if active_tag_uuid else '', placeholder="Watch group / tag", class="transparent-field") }}
< / div >
2023-03-18 19:36:26 +00:00
< div id = "quick-watch-processor-type" >
2023-11-29 09:19:49 +00:00
{{ render_simple_field(form.processor) }}
2023-03-18 19:36:26 +00:00
< / div >
2021-01-28 17:38:47 +00:00
< / fieldset >
2023-04-29 20:29:57 +00:00
< span style = "color:#eee; font-size: 80%;" > < img alt = "Create a shareable link" style = "height: 1em;display:inline-block;" src = "{{url_for('static_content', group='images', filename='spread-white.svg')}}" > Tip: You can also add 'shared' watches. < a href = "https://github.com/dgtlmoon/changedetection.io/wiki/Sharing-a-Watch" > More info< / a > < / span >
2021-01-28 17:38:47 +00:00
< / form >
2025-06-11 07:43:03 +00:00
< / div >
< div class = "box" >
2025-03-18 09:40:22 +00:00
< form class = "pure-form" action = "{{ url_for('ui.form_watch_list_checkbox_operations') }}" method = "POST" id = "watch-list-form" >
2023-04-29 20:29:57 +00:00
< input type = "hidden" name = "csrf_token" value = "{{ csrf_token() }}" >
2023-06-19 21:29:13 +00:00
< input type = "hidden" id = "op_extradata" name = "op_extradata" value = "" >
2022-08-18 12:48:21 +00:00
< div id = "checkbox-operations" >
2025-06-03 08:17:19 +00:00
< button class = "pure-button button-secondary button-xsmall" name = "op" value = "pause" > < i data-feather = "pause" style = "width: 14px; height: 14px; stroke: white; margin-right: 4px;" > < / i > Pause< / button >
< button class = "pure-button button-secondary button-xsmall" name = "op" value = "unpause" > < i data-feather = "play" style = "width: 14px; height: 14px; stroke: white; margin-right: 4px;" > < / i > UnPause< / button >
< button class = "pure-button button-secondary button-xsmall" name = "op" value = "mute" > < i data-feather = "volume-x" style = "width: 14px; height: 14px; stroke: white; margin-right: 4px;" > < / i > Mute< / button >
< button class = "pure-button button-secondary button-xsmall" name = "op" value = "unmute" > < i data-feather = "volume-2" style = "width: 14px; height: 14px; stroke: white; margin-right: 4px;" > < / i > UnMute< / button >
< button class = "pure-button button-secondary button-xsmall" name = "op" value = "recheck" > < i data-feather = "refresh-cw" style = "width: 14px; height: 14px; stroke: white; margin-right: 4px;" > < / i > Recheck< / button >
< button class = "pure-button button-secondary button-xsmall" name = "op" value = "assign-tag" id = "checkbox-assign-tag" > < i data-feather = "tag" style = "width: 14px; height: 14px; stroke: white; margin-right: 4px;" > < / i > Tag< / button >
< button class = "pure-button button-secondary button-xsmall" name = "op" value = "mark-viewed" > < i data-feather = "eye" style = "width: 14px; height: 14px; stroke: white; margin-right: 4px;" > < / i > Mark viewed< / button >
< button class = "pure-button button-secondary button-xsmall" name = "op" value = "notification-default" > < i data-feather = "bell" style = "width: 14px; height: 14px; stroke: white; margin-right: 4px;" > < / i > Use default notification< / button >
< button class = "pure-button button-secondary button-xsmall" name = "op" value = "clear-errors" > < i data-feather = "x-circle" style = "width: 14px; height: 14px; stroke: white; margin-right: 4px;" > < / i > Clear errors< / button >
< button class = "pure-button button-secondary button-xsmall" style = "background: #dd4242;" name = "op" value = "clear-history" > < i data-feather = "trash-2" style = "width: 14px; height: 14px; stroke: white; margin-right: 4px;" > < / i > Clear/reset history< / button >
< button class = "pure-button button-secondary button-xsmall" style = "background: #dd4242;" name = "op" value = "delete" > < i data-feather = "trash" style = "width: 14px; height: 14px; stroke: white; margin-right: 4px;" > < / i > Delete< / button >
2022-08-18 12:48:21 +00:00
< / div >
2025-06-03 08:17:19 +00:00
{%- if watches|length >= pagination.per_page -%}
2023-04-29 17:24:13 +00:00
{{ pagination.info }}
2025-06-03 08:17:19 +00:00
{%- endif -%}
{%- if search_q -%}< div id = "search-result-info" > Searching "< strong > < i > {{search_q}}< / i > < / strong > "< / div > {%- endif -%}
2021-01-29 14:51:30 +00:00
< div >
2025-03-25 21:57:15 +00:00
< a href = "{{url_for('watchlist.index')}}" class = "pure-button button-tag {{'active' if not active_tag_uuid }}" > All< / a >
2024-02-21 09:03:09 +00:00
<!-- tag list -->
2025-06-03 08:17:19 +00:00
{%- for uuid, tag in tags -%}
{%- if tag != "" -%}
2025-03-25 21:57:15 +00:00
< a href = "{{url_for('watchlist.index', tag=uuid) }}" class = "pure-button button-tag {{'active' if active_tag_uuid == uuid }}" > {{ tag.title }}< / a >
2025-06-03 08:17:19 +00:00
{%- endif -%}
{%- endfor -%}
2021-01-29 16:50:47 +00:00
< / div >
2021-01-29 14:39:38 +00:00
2025-06-03 08:17:19 +00:00
{%- set sort_order = sort_order or 'asc' -%}
{%- set sort_attribute = sort_attribute or 'last_changed' -%}
{%- set pagination_page = request.args.get('page', 0) -%}
{%- set cols_required = 6 -%}
{%- set any_has_restock_price_processor = datastore.any_watches_have_processor_by_name("restock_diff") -%}
{%- if any_has_restock_price_processor -%}
{%- set cols_required = cols_required + 1 -%}
{%- endif -%}
2025-07-14 16:37:41 +00:00
{%- set ui_settings = datastore.data['settings']['application']['ui'] -%}
2022-08-16 08:45:36 +00:00
2021-01-28 17:38:47 +00:00
< div id = "watch-table-wrapper" >
2025-07-14 16:13:16 +00:00
{%- set table_classes = [
2025-07-14 16:37:41 +00:00
'favicon-enabled' if 'favicons_enabled' not in ui_settings or ui_settings['favicons_enabled'] else 'favicon-not-enabled',
2025-07-14 16:13:16 +00:00
] -%}
< table class = "pure-table pure-table-striped watch-table {{ table_classes | reject('equalto', '') | join(' ') }}" >
2021-01-28 17:38:47 +00:00
< thead >
< tr >
2025-06-03 08:17:19 +00:00
{%- set link_order = "desc" if sort_order == 'asc' else "asc" -%}
{%- set arrow_span = "" -%}
2025-03-25 21:57:15 +00:00
< th > < input style = "vertical-align: middle" type = "checkbox" id = "check-all" > < a class = "{{ 'active '+link_order if sort_attribute == 'date_created' else 'inactive' }}" href = "{{url_for('watchlist.index', sort='date_created', order=link_order, tag=active_tag_uuid)}}" > # < span class = 'arrow {{link_order}}' > < / span > < / a > < / th >
2025-07-04 09:15:04 +00:00
< th >
< a class = "{{ 'active '+link_order if sort_attribute == 'paused' else 'inactive' }}" href = "{{url_for('watchlist.index', sort='paused', order=link_order, tag=active_tag_uuid)}}" > < i data-feather = "pause" style = "vertical-align: bottom; width: 14px; height: 14px; margin-right: 4px;" > < / i > < span class = 'arrow {{link_order}}' > < / span > < / a >
< a class = "{{ 'active '+link_order if sort_attribute == 'notification_muted' else 'inactive' }}" href = "{{url_for('watchlist.index', sort='notification_muted', order=link_order, tag=active_tag_uuid)}}" > < i data-feather = "volume-2" style = "vertical-align: bottom; width: 14px; height: 14px; margin-right: 4px;" > < / i > < span class = 'arrow {{link_order}}' > < / span > < / a >
< / th >
2025-03-25 21:57:15 +00:00
< th > < a class = "{{ 'active '+link_order if sort_attribute == 'label' else 'inactive' }}" href = "{{url_for('watchlist.index', sort='label', order=link_order, tag=active_tag_uuid)}}" > Website < span class = 'arrow {{link_order}}' > < / span > < / a > < / th >
2025-06-03 08:17:19 +00:00
{%- if any_has_restock_price_processor -%}
2024-07-12 15:09:42 +00:00
< th > Restock & Price< / th >
2025-06-03 08:17:19 +00:00
{%- endif -%}
2025-03-25 21:57:15 +00:00
< th > < a class = "{{ 'active '+link_order if sort_attribute == 'last_checked' else 'inactive' }}" href = "{{url_for('watchlist.index', sort='last_checked', order=link_order, tag=active_tag_uuid)}}" > < span class = "hide-on-mobile" > Last< / span > Checked < span class = 'arrow {{link_order}}' > < / span > < / a > < / th >
< th > < a class = "{{ 'active '+link_order if sort_attribute == 'last_changed' else 'inactive' }}" href = "{{url_for('watchlist.index', sort='last_changed', order=link_order, tag=active_tag_uuid)}}" > < span class = "hide-on-mobile" > Last< / span > Changed < span class = 'arrow {{link_order}}' > < / span > < / a > < / th >
2024-07-03 15:13:31 +00:00
< th class = "empty-cell" > < / th >
2021-01-28 17:38:47 +00:00
< / tr >
< / thead >
< tbody >
2025-06-03 08:17:19 +00:00
{%- if not watches|length -%}
2023-05-16 21:01:32 +00:00
< tr >
2025-03-18 09:40:22 +00:00
< td colspan = "{{ cols_required }}" style = "text-wrap: wrap;" > No website watches configured, please add a URL in the box above, or < a href = "{{ url_for('imports.import_page')}}" > import a list< / a > .< / td >
2023-05-16 21:01:32 +00:00
< / tr >
2025-06-03 08:17:19 +00:00
{%- endif -%}
2025-07-09 13:16:22 +00:00
2025-06-03 08:17:19 +00:00
{%- for watch in (watches|sort(attribute=sort_attribute, reverse=sort_order == 'asc'))|pagination_slice(skip=pagination.skip) -%}
{%- set checking_now = is_checking_now(watch) -%}
{%- set history_n = watch.history_n -%}
2025-07-14 16:13:16 +00:00
{%- set favicon = watch.get_favicon_filename() -%}
2025-09-10 12:52:41 +00:00
{%- set system_use_url_watchlist = datastore.data['settings']['application']['ui'].get('use_page_title_in_list') -%}
{# Class settings mirrored in changedetectionio/static/js/realtime.js for the frontend #}
2025-06-03 08:17:19 +00:00
{%- set row_classes = [
loop.cycle('pure-table-odd', 'pure-table-even'),
'processor-' ~ watch['processor'],
'has-error' if watch.compile_error_texts()|length > 2 else '',
'paused' if watch.paused is defined and watch.paused != False else '',
'unviewed' if watch.has_unviewed else '',
'has-restock-info' if watch.has_restock_info else 'no-restock-info',
2025-07-14 16:13:16 +00:00
'has-favicon' if favicon else '',
2025-06-03 08:17:19 +00:00
'in-stock' if watch.has_restock_info and watch['restock']['in_stock'] else '',
'not-in-stock' if watch.has_restock_info and not watch['restock']['in_stock'] else '',
'queued' if watch.uuid in queued_uuids else '',
'checking-now' if checking_now else '',
'notification_muted' if watch.notification_muted else '',
'single-history' if history_n == 1 else '',
2025-09-10 12:52:41 +00:00
'multiple-history' if history_n >= 2 else '',
'use-html-title' if system_use_url_watchlist else 'no-html-title',
2025-06-03 08:17:19 +00:00
] -%}
< tr id = "{{ watch.uuid }}" data-watch-uuid = "{{ watch.uuid }}" class = "{{ row_classes | reject('equalto', '') | join(' ') }}" >
2025-07-09 13:16:22 +00:00
< td class = "inline checkbox-uuid" > < div > < input name = "uuids" type = "checkbox" value = "{{ watch.uuid}} " > < span class = "counter-i" > {{ loop.index+pagination.skip }}< / span > < / div > < / td >
2022-07-29 19:09:55 +00:00
< td class = "inline watch-controls" >
2025-07-09 13:16:22 +00:00
< div >
2025-05-26 18:12:32 +00:00
< a class = "ajax-op state-off pause-toggle" data-op = "pause" href = "{{url_for('watchlist.index', op='pause', uuid=watch.uuid, tag=active_tag_uuid)}}" > < img src = "{{url_for('static_content', group='images', filename='pause.svg')}}" alt = "Pause checks" title = "Pause checks" class = "icon icon-pause" > < / a >
< a class = "ajax-op state-on pause-toggle" data-op = "pause" style = "display: none" href = "{{url_for('watchlist.index', op='pause', uuid=watch.uuid, tag=active_tag_uuid)}}" > < img src = "{{url_for('static_content', group='images', filename='play.svg')}}" alt = "UnPause checks" title = "UnPause checks" class = "icon icon-unpause" > < / a >
< a class = "ajax-op state-off mute-toggle" data-op = "mute" href = "{{url_for('watchlist.index', op='mute', uuid=watch.uuid, tag=active_tag_uuid)}}" > < img src = "{{url_for('static_content', group='images', filename='bell-off.svg')}}" alt = "Mute notification" title = "Mute notification" class = "icon icon-mute" > < / a >
< a class = "ajax-op state-on mute-toggle" data-op = "mute" style = "display: none" href = "{{url_for('watchlist.index', op='mute', uuid=watch.uuid, tag=active_tag_uuid)}}" > < img src = "{{url_for('static_content', group='images', filename='bell-off.svg')}}" alt = "UnMute notification" title = "UnMute notification" class = "icon icon-mute" > < / a >
2025-07-09 13:16:22 +00:00
< / div >
2022-07-29 19:09:55 +00:00
< / td >
2023-01-25 17:07:44 +00:00
2025-07-09 13:16:22 +00:00
< td class = "title-col inline" >
< div class = "flex-wrapper" >
2025-07-14 16:37:41 +00:00
{% if 'favicons_enabled' not in ui_settings or ui_settings['favicons_enabled'] %}
2025-07-09 13:30:58 +00:00
< div > {# A page might have hundreds of these images, set IMG options for lazy loading, don't set SRC if we dont have it so it doesnt fetch the placeholder' #}
2025-07-14 16:13:16 +00:00
< img alt = "Favicon thumbnail" class = "favicon" loading = "lazy" decoding = "async" fetchpriority = "low" { % if favicon % } src = "{{url_for('static_content', group='favicon', filename=watch.uuid)}}" { % else % } src = 'data:image/svg+xml;utf8,%3Csvg xmlns="http://www.w3.org/2000/svg" width="7.087" height="7.087" viewBox="0 0 7.087 7.087"%3E%3Ccircle cx="3.543" cy="3.543" r="3.279" stroke="%23e1e1e1" stroke-width="0.45" fill="none" opacity="0.74"/%3E%3C/svg%3E' { % endif % } / >
2025-07-09 13:16:22 +00:00
< / div >
2025-07-14 16:13:16 +00:00
{% endif %}
2025-07-09 13:16:22 +00:00
< div >
< span class = "watch-title" >
2025-09-10 12:52:41 +00:00
{% if system_use_url_watchlist or watch.get('use_page_title_in_list') %}
2025-09-17 09:52:08 +00:00
{{ watch.label }}
2025-09-10 12:52:41 +00:00
{% else %}
2025-09-17 09:52:08 +00:00
{{ watch.get('title') or watch.link }}
2025-09-10 12:52:41 +00:00
{% endif %}
< a class = "external" target = "_blank" rel = "noopener" href = "{{ watch.link.replace('source:','') }}" > < / a >
2025-07-09 13:16:22 +00:00
< / span >
< div class = "error-text" style = "display:none;" > {{ watch.compile_error_texts(has_proxies=datastore.proxy_list) }}< / div >
{%- if watch['processor'] == 'text_json_diff' -%}
{%- if watch['has_ldjson_price_data'] and not watch['track_ldjson_price_data'] -%}
< div class = "ldjson-price-track-offer" > Switch to Restock & Price watch mode? < a href = "{{url_for('price_data_follower.accept', uuid=watch.uuid)}}" class = "pure-button button-xsmall" > Yes< / a > < a href = "{{url_for('price_data_follower.reject', uuid=watch.uuid)}}" class = "" > No< / a > < / div >
{%- endif -%}
{%- endif -%}
{%- if watch['processor'] == 'restock_diff' -%}
< span class = "tracking-ldjson-price-data" title = "Automatically following embedded price information" > < img src = "{{url_for('static_content', group='images', filename='price-tag-icon.svg')}}" class = "status-icon price-follow-tag-icon" > Price< / span >
{%- endif -%}
{%- for watch_tag_uuid, watch_tag in datastore.get_all_tags_for_watch(watch['uuid']).items() -%}
< span class = "watch-tag-list" > {{ watch_tag.title }}< / span >
{%- endfor -%}
< / div >
< div class = "status-icons" >
< a class = "link-spread" href = "{{url_for('ui.form_share_put_watch', uuid=watch.uuid)}}" > < img src = "{{url_for('static_content', group='images', filename='spread.svg')}}" class = "status-icon icon icon-spread" title = "Create a link to share watch config with others" > < / a >
{%- if watch.get_fetch_backend == "html_webdriver"
or ( watch.get_fetch_backend == "system" and system_default_fetcher == 'html_webdriver' )
or "extra_browser_" in watch.get_fetch_backend
-%}
< img class = "status-icon" src = "{{url_for('static_content', group='images', filename='google-chrome-icon.png')}}" alt = "Using a Chrome browser" title = "Using a Chrome browser" >
{%- endif -%}
{%- if watch.is_pdf -%}< img class = "status-icon" src = "{{url_for('static_content', group='images', filename='pdf-icon.svg')}}" alt = "Converting PDF to text" > {%- endif -%}
{%- if watch.has_browser_steps -%}< img class = "status-icon status-browsersteps" src = "{{url_for('static_content', group='images', filename='steps.svg')}}" alt = "Browser Steps is enabled" > {%- endif -%}
2023-03-18 19:36:26 +00:00
2025-07-09 13:16:22 +00:00
< / div >
< / div >
2024-07-12 15:09:42 +00:00
< / td >
2025-06-03 08:17:19 +00:00
{%- if any_has_restock_price_processor -%}
2024-07-12 15:09:42 +00:00
< td class = "restock-and-price" >
2025-06-03 08:17:19 +00:00
{%- if watch['processor'] == 'restock_diff' -%}
{%- if watch.has_restock_info -%}
2024-07-12 15:09:42 +00:00
< span class = "restock-label {{'in-stock' if watch['restock']['in_stock'] else 'not-in-stock' }}" title = "Detecting restock and price" >
<!-- maybe some object watch['processor'][restock_diff] or.. -->
2025-06-03 08:17:19 +00:00
{%- if watch['restock']['in_stock']-%} In stock {%- else-%} Not in stock {%- endif -%}
2024-07-12 15:09:42 +00:00
< / span >
2025-06-03 08:17:19 +00:00
{%- endif -%}
2023-06-19 21:29:13 +00:00
2025-06-03 08:17:19 +00:00
{%- if watch.get('restock') and watch['restock']['price'] != None -%}
{%- if watch['restock']['price'] != None -%}
2024-07-12 15:09:42 +00:00
< span class = "restock-label price" title = "Price" >
{{ watch['restock']['price']|format_number_locale }} {{ watch['restock']['currency'] }}
< / span >
2025-06-03 08:17:19 +00:00
{%- endif -%}
{%- elif not watch.has_restock_info -%}
2024-07-12 15:09:42 +00:00
< span class = "restock-label error" > No information< / span >
2025-06-03 08:17:19 +00:00
{%- endif -%}
{%- endif -%}
2021-01-28 17:38:47 +00:00
< / td >
2025-06-03 08:17:19 +00:00
{%- endif -%}
2025-03-26 16:06:24 +00:00
{#last_checked becomes fetch-start-time#}
2025-05-26 18:12:32 +00:00
< td class = "last-checked" data-timestamp = "{{ watch.last_checked }}" data-fetchduration = {{ watch . fetch_time } } data-eta_complete = "{{ watch.last_checked+watch.fetch_time }}" >
< div class = "spinner-wrapper" style = "display:none;" >
< span class = "spinner" > < / span > < span > Checking now< / span >
< / div >
< span class = "innertext" > {{watch|format_last_checked_time|safe}}< / span >
< / td >
2025-06-03 08:17:19 +00:00
< td class = "last-changed" data-timestamp = "{{ watch.last_changed }}" > {%- if watch.history_n >=2 and watch.last_changed >0 -%}
2021-02-21 19:14:35 +00:00
{{watch.last_changed|format_timestamp_timeago}}
2025-06-03 08:17:19 +00:00
{%- else -%}
2021-02-21 19:14:35 +00:00
Not yet
2025-06-03 08:17:19 +00:00
{%- endif -%}
2021-02-04 12:15:39 +00:00
< / td >
2025-07-09 13:16:22 +00:00
< td class = "buttons" >
< div >
2025-06-03 08:17:19 +00:00
{%- set target_attr = ' target="' ~ watch.uuid ~ '"' if datastore.data['settings']['application']['ui'].get('open_diff_in_new_tab') else '' -%}
2025-05-26 18:12:32 +00:00
< a href = "" class = "already-in-queue-button recheck pure-button pure-button-primary" style = "display: none;" disabled = "disabled" > Queued< / a >
< a href = "{{ url_for('ui.form_watch_checknow', uuid=watch.uuid, tag=request.args.get('tag')) }}" data-op = 'recheck' class = "ajax-op recheck pure-button pure-button-primary" > Recheck< / a >
2025-03-18 09:40:22 +00:00
< a href = "{{ url_for('ui.ui_edit.edit_page', uuid=watch.uuid, tag=active_tag_uuid)}}#general" class = "pure-button pure-button-primary" > Edit< / a >
2025-06-03 08:17:19 +00:00
< a href = "{{ url_for('ui.ui_views.diff_history_page', uuid=watch.uuid)}}" { { target_attr } } class = "pure-button pure-button-primary history-link" style = "display: none;" > History< / a >
< a href = "{{ url_for('ui.ui_views.preview_page', uuid=watch.uuid)}}" { { target_attr } } class = "pure-button pure-button-primary preview-link" style = "display: none;" > Preview< / a >
2025-07-09 13:16:22 +00:00
< / div >
2021-01-28 17:38:47 +00:00
< / td >
< / tr >
2025-06-03 08:17:19 +00:00
{%- endfor -%}
2021-01-28 17:38:47 +00:00
< / tbody >
< / table >
2021-03-01 10:25:04 +00:00
< ul id = "post-list-buttons" >
2025-06-03 08:17:19 +00:00
< li id = "post-list-with-errors" class = "{%- if errored_count -%}has-error{%- endif -%}" style = "display: none;" >
2025-05-26 18:12:32 +00:00
< a href = "{{url_for('watchlist.index', with_errors=1, tag=request.args.get('tag')) }}" class = "pure-button button-tag button-error" > With errors ({{ errored_count }})< / a >
2023-10-23 10:22:43 +00:00
< / li >
2025-06-03 08:17:19 +00:00
< li id = "post-list-mark-views" class = "{%- if has_unviewed -%}has-unviewed{%- endif -%}" style = "display: none;" >
2025-05-26 18:12:32 +00:00
< a href = "{{url_for('ui.mark_all_viewed',with_errors=request.args.get('with_errors',0)) }}" class = "pure-button button-tag " id = "mark-all-viewed" > Mark all viewed< / a >
2021-03-01 10:25:04 +00:00
< / li >
2025-06-11 11:06:45 +00:00
{%- if active_tag_uuid -%}
< li id = "post-list-mark-views-tag" >
< a href = "{{url_for('ui.mark_all_viewed', tag=active_tag_uuid) }}" class = "pure-button button-tag " id = "mark-all-viewed" > Mark all viewed in '{{active_tag.title}}'< / a >
< / li >
{%- endif -%}
2025-09-06 09:47:57 +00:00
< li id = "post-list-unread" class = "{%- if has_unviewed -%}has-unviewed{%- endif -%}" style = "display: none;" >
< a href = "{{url_for('watchlist.index', unread=1, tag=request.args.get('tag')) }}" class = "pure-button button-tag" > Unread< / a >
< / li >
2021-03-01 10:25:04 +00:00
< li >
2025-05-26 18:12:32 +00:00
< a href = "{{ url_for('ui.form_watch_checknow', tag=active_tag_uuid, with_errors=request.args.get('with_errors',0)) }}" class = "pure-button button-tag" id = "recheck-all" > Recheck
2025-06-11 11:06:45 +00:00
all {% if active_tag_uuid %} in '{{active_tag.title}}'{%endif%}< / a >
2021-03-01 10:25:04 +00:00
< / li >
2021-03-01 10:51:28 +00:00
< li >
2025-04-01 09:51:43 +00:00
< a href = "{{ url_for('rss.feed', tag=active_tag_uuid, token=app_rss_token)}}" > < img alt = "RSS Feed" id = "feed-icon" src = "{{url_for('static_content', group='images', filename='generic_feed-icon.svg')}}" height = "15" > < / a >
2021-03-01 10:51:28 +00:00
< / li >
2021-03-01 10:25:04 +00:00
< / ul >
2023-04-29 17:24:13 +00:00
{{ pagination.links }}
2021-01-28 17:38:47 +00:00
< / div >
2022-08-18 12:48:21 +00:00
< / form >
2021-01-27 11:39:46 +00:00
< / div >
2025-06-03 08:17:19 +00:00
{%- endblock -%}